@planetaexo/design-system 0.2.10 → 0.2.12
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/index.cjs +1145 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +170 -1
- package/dist/index.d.ts +170 -1
- package/dist/index.js +1144 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1902,7 +1902,1152 @@ function Offer({
|
|
|
1902
1902
|
] }) })
|
|
1903
1903
|
] });
|
|
1904
1904
|
}
|
|
1905
|
+
var STATUS_STYLES = {
|
|
1906
|
+
pending: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400",
|
|
1907
|
+
confirmed: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400",
|
|
1908
|
+
cancelled: "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400",
|
|
1909
|
+
completed: "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400"
|
|
1910
|
+
};
|
|
1911
|
+
function StatusBadge({ status }) {
|
|
1912
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1913
|
+
"span",
|
|
1914
|
+
{
|
|
1915
|
+
className: cn(
|
|
1916
|
+
"inline-flex items-center rounded-full px-3 py-1 text-xs font-bold font-heading uppercase tracking-wider",
|
|
1917
|
+
STATUS_STYLES[status]
|
|
1918
|
+
),
|
|
1919
|
+
children: status
|
|
1920
|
+
}
|
|
1921
|
+
);
|
|
1922
|
+
}
|
|
1923
|
+
function totalPeople(adventures) {
|
|
1924
|
+
var _a, _b, _c, _d, _e, _f;
|
|
1925
|
+
let adults = 0;
|
|
1926
|
+
let children = 0;
|
|
1927
|
+
let seniors = 0;
|
|
1928
|
+
for (const a of adventures) {
|
|
1929
|
+
adults += (_b = (_a = a.slots) == null ? void 0 : _a.adults) != null ? _b : 0;
|
|
1930
|
+
children += (_d = (_c = a.slots) == null ? void 0 : _c.children) != null ? _d : 0;
|
|
1931
|
+
seniors += (_f = (_e = a.slots) == null ? void 0 : _e.seniors) != null ? _f : 0;
|
|
1932
|
+
}
|
|
1933
|
+
return { adults, children, seniors, total: adults + children + seniors };
|
|
1934
|
+
}
|
|
1935
|
+
function InfoCard({
|
|
1936
|
+
label,
|
|
1937
|
+
children
|
|
1938
|
+
}) {
|
|
1939
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border bg-card p-4 flex flex-col gap-1 min-w-0", children: [
|
|
1940
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: label }),
|
|
1941
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-sans text-foreground", children })
|
|
1942
|
+
] });
|
|
1943
|
+
}
|
|
1944
|
+
function AdventureSection({
|
|
1945
|
+
adventure,
|
|
1946
|
+
onAddContactAsTraveller,
|
|
1947
|
+
onEditTraveller,
|
|
1948
|
+
onRemoveTraveller,
|
|
1949
|
+
onAddSuggestedTraveller
|
|
1950
|
+
}) {
|
|
1951
|
+
var _a, _b, _c;
|
|
1952
|
+
const [detailsOpen, setDetailsOpen] = React4__namespace.useState(false);
|
|
1953
|
+
const [addModalOpen, setAddModalOpen] = React4__namespace.useState(false);
|
|
1954
|
+
const [newTraveller, setNewTraveller] = React4__namespace.useState({
|
|
1955
|
+
firstName: "",
|
|
1956
|
+
lastName: "",
|
|
1957
|
+
passport: "",
|
|
1958
|
+
type: "adult",
|
|
1959
|
+
email: "",
|
|
1960
|
+
dateOfBirth: "",
|
|
1961
|
+
phone: ""
|
|
1962
|
+
});
|
|
1963
|
+
const setField = (k, v) => setNewTraveller((p) => __spreadProps(__spreadValues({}, p), { [k]: v }));
|
|
1964
|
+
const handleCopyUrl = (url) => {
|
|
1965
|
+
navigator.clipboard.writeText(url);
|
|
1966
|
+
};
|
|
1967
|
+
const people = adventure.slots;
|
|
1968
|
+
[
|
|
1969
|
+
(people == null ? void 0 : people.adults) ? `Adults: ${people.adults}` : null,
|
|
1970
|
+
(people == null ? void 0 : people.children) ? `Children: ${people.children}` : null,
|
|
1971
|
+
(people == null ? void 0 : people.seniors) ? `Seniors: ${people.seniors}` : null
|
|
1972
|
+
].filter(Boolean).join(" \xB7 ");
|
|
1973
|
+
const totalSlots = ((_a = people == null ? void 0 : people.adults) != null ? _a : 0) + ((_b = people == null ? void 0 : people.children) != null ? _b : 0) + ((_c = people == null ? void 0 : people.seniors) != null ? _c : 0);
|
|
1974
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card overflow-hidden", children: [
|
|
1975
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 lg:p-6 flex flex-col gap-2 bg-muted/60", children: [
|
|
1976
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
1977
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-0.5 min-w-0", children: [
|
|
1978
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h3", { className: "text-xl font-bold text-foreground font-heading leading-snug", children: [
|
|
1979
|
+
adventure.title,
|
|
1980
|
+
adventure.reference && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-normal text-muted-foreground/40 ml-1.5", children: [
|
|
1981
|
+
"#",
|
|
1982
|
+
adventure.reference
|
|
1983
|
+
] })
|
|
1984
|
+
] }),
|
|
1985
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 flex-wrap text-sm text-muted-foreground font-sans", children: [
|
|
1986
|
+
adventure.partner && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5", children: [
|
|
1987
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CompassIcon, { className: "w-3.5 h-3.5 shrink-0 text-primary" }),
|
|
1988
|
+
adventure.partner
|
|
1989
|
+
] }),
|
|
1990
|
+
adventure.location && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5", children: [
|
|
1991
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPinIcon, { className: "w-3.5 h-3.5 shrink-0 text-primary" }),
|
|
1992
|
+
adventure.location
|
|
1993
|
+
] })
|
|
1994
|
+
] })
|
|
1995
|
+
] }),
|
|
1996
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1997
|
+
"button",
|
|
1998
|
+
{
|
|
1999
|
+
type: "button",
|
|
2000
|
+
onClick: () => setDetailsOpen((v) => !v),
|
|
2001
|
+
className: cn(
|
|
2002
|
+
"flex items-center gap-1.5 rounded-full border border-border px-3 py-1.5 text-xs font-ui text-muted-foreground shrink-0 transition-colors",
|
|
2003
|
+
"hover:border-primary hover:text-primary",
|
|
2004
|
+
detailsOpen && "border-primary text-primary"
|
|
2005
|
+
),
|
|
2006
|
+
children: [
|
|
2007
|
+
"Details",
|
|
2008
|
+
detailsOpen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUpIcon, { className: "w-3 h-3" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "w-3 h-3" })
|
|
2009
|
+
]
|
|
2010
|
+
}
|
|
2011
|
+
)
|
|
2012
|
+
] }),
|
|
2013
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-4 flex-wrap text-sm text-muted-foreground font-sans", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1.5", children: [
|
|
2014
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "w-3.5 h-3.5 shrink-0 text-primary" }),
|
|
2015
|
+
adventure.dateFrom,
|
|
2016
|
+
" \u2192 ",
|
|
2017
|
+
adventure.dateTo
|
|
2018
|
+
] }) }),
|
|
2019
|
+
adventure.tags && adventure.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5 mt-1", children: adventure.tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2020
|
+
"span",
|
|
2021
|
+
{
|
|
2022
|
+
className: "inline-flex items-center rounded-full bg-primary/10 px-2.5 py-0.5 text-xs font-semibold text-primary font-heading",
|
|
2023
|
+
children: tag
|
|
2024
|
+
},
|
|
2025
|
+
tag
|
|
2026
|
+
)) })
|
|
2027
|
+
] }),
|
|
2028
|
+
detailsOpen && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t border-border px-5 lg:px-6 py-5 flex flex-col gap-5 bg-muted/10", children: [
|
|
2029
|
+
adventure.description && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
2030
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Itinerary" }),
|
|
2031
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground/80 leading-relaxed font-sans", children: adventure.description })
|
|
2032
|
+
] }),
|
|
2033
|
+
adventure.included && adventure.included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
2034
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "O que est\xE1 incluso" }),
|
|
2035
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.included.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2036
|
+
"li",
|
|
2037
|
+
{
|
|
2038
|
+
className: "flex items-start gap-2 text-sm text-foreground/80 font-sans",
|
|
2039
|
+
children: [
|
|
2040
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "w-4 h-4 text-primary shrink-0 mt-1" }),
|
|
2041
|
+
item
|
|
2042
|
+
]
|
|
2043
|
+
},
|
|
2044
|
+
i
|
|
2045
|
+
)) })
|
|
2046
|
+
] }),
|
|
2047
|
+
adventure.notIncluded && adventure.notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
2048
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "O que n\xE3o est\xE1 incluso" }),
|
|
2049
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.notIncluded.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2050
|
+
"li",
|
|
2051
|
+
{
|
|
2052
|
+
className: "flex items-start gap-2 text-sm text-foreground/80 font-sans",
|
|
2053
|
+
children: [
|
|
2054
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { className: "w-4 h-4 text-destructive shrink-0 mt-1" }),
|
|
2055
|
+
item
|
|
2056
|
+
]
|
|
2057
|
+
},
|
|
2058
|
+
i
|
|
2059
|
+
)) })
|
|
2060
|
+
] }),
|
|
2061
|
+
adventure.cancellationPolicy && adventure.cancellationPolicy.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
2062
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Pol\xEDtica de cancelamento" }),
|
|
2063
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.cancellationPolicy.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2064
|
+
"li",
|
|
2065
|
+
{
|
|
2066
|
+
className: "flex items-start gap-2 text-sm text-muted-foreground font-sans",
|
|
2067
|
+
children: [
|
|
2068
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary shrink-0 mt-2.5" }),
|
|
2069
|
+
item
|
|
2070
|
+
]
|
|
2071
|
+
},
|
|
2072
|
+
i
|
|
2073
|
+
)) })
|
|
2074
|
+
] })
|
|
2075
|
+
] }),
|
|
2076
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t border-border px-5 lg:px-6 py-5 flex flex-col gap-4", children: [
|
|
2077
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 flex-wrap", children: [
|
|
2078
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2079
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Travellers" }),
|
|
2080
|
+
adventure.formName && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-semibold text-muted-foreground/50 font-heading tracking-wide", children: [
|
|
2081
|
+
"\xB7 ",
|
|
2082
|
+
adventure.formName
|
|
2083
|
+
] })
|
|
2084
|
+
] }),
|
|
2085
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
2086
|
+
onAddContactAsTraveller && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2087
|
+
"button",
|
|
2088
|
+
{
|
|
2089
|
+
type: "button",
|
|
2090
|
+
onClick: () => onAddContactAsTraveller(adventure.id),
|
|
2091
|
+
className: "flex items-center gap-1.5 rounded-full border border-border px-3 py-1.5 text-xs font-ui text-muted-foreground hover:border-primary hover:text-primary hover:bg-primary/5 transition-colors",
|
|
2092
|
+
children: [
|
|
2093
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserPlusIcon, { className: "w-3 h-3" }),
|
|
2094
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Add contact as traveller" }),
|
|
2095
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sm:hidden", children: "Add contact" })
|
|
2096
|
+
]
|
|
2097
|
+
}
|
|
2098
|
+
),
|
|
2099
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2100
|
+
"button",
|
|
2101
|
+
{
|
|
2102
|
+
type: "button",
|
|
2103
|
+
onClick: () => setAddModalOpen(true),
|
|
2104
|
+
className: "flex items-center gap-1.5 rounded-full border border-border px-3 py-1.5 text-xs font-ui text-primary hover:border-primary hover:bg-primary/5 transition-colors",
|
|
2105
|
+
children: [
|
|
2106
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "w-3 h-3" }),
|
|
2107
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "More travellers" }),
|
|
2108
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sm:hidden", children: "Add" })
|
|
2109
|
+
]
|
|
2110
|
+
}
|
|
2111
|
+
)
|
|
2112
|
+
] })
|
|
2113
|
+
] }),
|
|
2114
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col divide-y divide-border", children: adventure.travellers.map((t) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2115
|
+
"div",
|
|
2116
|
+
{
|
|
2117
|
+
className: "flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-3 py-3 first:pt-0",
|
|
2118
|
+
children: [
|
|
2119
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3 min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-0.5 min-w-0 flex-1", children: [
|
|
2120
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
2121
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm font-semibold text-foreground font-ui truncate", children: [
|
|
2122
|
+
t.firstName,
|
|
2123
|
+
" ",
|
|
2124
|
+
t.lastName
|
|
2125
|
+
] }),
|
|
2126
|
+
t.isChild && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold font-heading rounded-full px-2 py-0.5 bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400 shrink-0", children: "Child" })
|
|
2127
|
+
] }),
|
|
2128
|
+
t.formUrl && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2129
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2130
|
+
"a",
|
|
2131
|
+
{
|
|
2132
|
+
href: t.formUrl,
|
|
2133
|
+
target: "_blank",
|
|
2134
|
+
rel: "noopener noreferrer",
|
|
2135
|
+
className: "flex items-center gap-1 text-xs text-primary hover:text-primary/80 transition-colors font-ui",
|
|
2136
|
+
children: [
|
|
2137
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLinkIcon, { className: "w-3 h-3" }),
|
|
2138
|
+
"Open"
|
|
2139
|
+
]
|
|
2140
|
+
}
|
|
2141
|
+
),
|
|
2142
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2143
|
+
"button",
|
|
2144
|
+
{
|
|
2145
|
+
type: "button",
|
|
2146
|
+
onClick: () => handleCopyUrl(t.formUrl),
|
|
2147
|
+
className: "flex items-center text-xs text-muted-foreground hover:text-primary transition-colors font-ui",
|
|
2148
|
+
"aria-label": "Copy form URL",
|
|
2149
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CopyIcon, { className: "w-3 h-3" })
|
|
2150
|
+
}
|
|
2151
|
+
)
|
|
2152
|
+
] })
|
|
2153
|
+
] }) }),
|
|
2154
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 sm:gap-3 justify-between sm:justify-end", children: [
|
|
2155
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2156
|
+
"span",
|
|
2157
|
+
{
|
|
2158
|
+
className: cn(
|
|
2159
|
+
"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-bold font-heading uppercase tracking-wider shrink-0",
|
|
2160
|
+
t.status === "completed" ? "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400" : "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400"
|
|
2161
|
+
),
|
|
2162
|
+
children: t.status
|
|
2163
|
+
}
|
|
2164
|
+
),
|
|
2165
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [
|
|
2166
|
+
onEditTraveller && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2167
|
+
"button",
|
|
2168
|
+
{
|
|
2169
|
+
type: "button",
|
|
2170
|
+
onClick: () => onEditTraveller(adventure.id, t.id),
|
|
2171
|
+
className: "flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors",
|
|
2172
|
+
"aria-label": `Edit ${t.firstName}`,
|
|
2173
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PencilIcon, { className: "w-3.5 h-3.5" })
|
|
2174
|
+
}
|
|
2175
|
+
),
|
|
2176
|
+
onRemoveTraveller && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2177
|
+
"button",
|
|
2178
|
+
{
|
|
2179
|
+
type: "button",
|
|
2180
|
+
onClick: () => onRemoveTraveller(adventure.id, t.id),
|
|
2181
|
+
className: "flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors",
|
|
2182
|
+
"aria-label": `Delete ${t.firstName}`,
|
|
2183
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2Icon, { className: "w-3.5 h-3.5" })
|
|
2184
|
+
}
|
|
2185
|
+
),
|
|
2186
|
+
onRemoveTraveller && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2187
|
+
"button",
|
|
2188
|
+
{
|
|
2189
|
+
type: "button",
|
|
2190
|
+
onClick: () => onRemoveTraveller(adventure.id, t.id),
|
|
2191
|
+
className: "flex h-8 w-8 sm:h-7 sm:w-7 items-center justify-center rounded-lg text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors",
|
|
2192
|
+
"aria-label": `Remove ${t.firstName} from adventure`,
|
|
2193
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserMinusIcon, { className: "w-3.5 h-3.5" })
|
|
2194
|
+
}
|
|
2195
|
+
)
|
|
2196
|
+
] })
|
|
2197
|
+
] })
|
|
2198
|
+
]
|
|
2199
|
+
},
|
|
2200
|
+
t.id
|
|
2201
|
+
)) }),
|
|
2202
|
+
adventure.suggestedTravellers && adventure.suggestedTravellers.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 pt-2", children: [
|
|
2203
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground font-ui", children: "Add to this adventure" }),
|
|
2204
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: adventure.suggestedTravellers.map((st) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2205
|
+
"button",
|
|
2206
|
+
{
|
|
2207
|
+
type: "button",
|
|
2208
|
+
onClick: () => onAddSuggestedTraveller == null ? void 0 : onAddSuggestedTraveller(adventure.id, st.id),
|
|
2209
|
+
className: "flex items-center gap-1.5 rounded-full border border-border px-3 py-1.5 text-xs font-ui text-foreground hover:border-primary hover:text-primary hover:bg-primary/5 transition-colors",
|
|
2210
|
+
children: [
|
|
2211
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlusIcon, { className: "w-3 h-3" }),
|
|
2212
|
+
st.firstName,
|
|
2213
|
+
" ",
|
|
2214
|
+
st.lastName
|
|
2215
|
+
]
|
|
2216
|
+
},
|
|
2217
|
+
st.id
|
|
2218
|
+
)) })
|
|
2219
|
+
] }),
|
|
2220
|
+
adventure.travellers.length > 0 && totalSlots > 0 && (() => {
|
|
2221
|
+
const completed = adventure.travellers.filter((t) => t.status === "completed").length;
|
|
2222
|
+
const percent = Math.round(completed / totalSlots * 100);
|
|
2223
|
+
const isComplete = completed === totalSlots;
|
|
2224
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mt-1", children: [
|
|
2225
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 h-2 rounded-full bg-muted overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2226
|
+
"div",
|
|
2227
|
+
{
|
|
2228
|
+
className: "h-full rounded-full bg-primary transition-all duration-500",
|
|
2229
|
+
style: { width: `${percent}%` }
|
|
2230
|
+
}
|
|
2231
|
+
) }),
|
|
2232
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn(
|
|
2233
|
+
"text-xs font-semibold font-ui shrink-0 flex items-center gap-1",
|
|
2234
|
+
isComplete ? "text-primary" : "text-destructive"
|
|
2235
|
+
), children: [
|
|
2236
|
+
completed,
|
|
2237
|
+
" of ",
|
|
2238
|
+
totalSlots,
|
|
2239
|
+
" travellers registered",
|
|
2240
|
+
!isComplete && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangleIcon, { className: "w-3 h-3" })
|
|
2241
|
+
] })
|
|
2242
|
+
] });
|
|
2243
|
+
})()
|
|
2244
|
+
] }),
|
|
2245
|
+
/* @__PURE__ */ jsxRuntime.jsx(Dialog, { open: addModalOpen, onOpenChange: setAddModalOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(DialogContent, { className: "sm:max-w-md", children: [
|
|
2246
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: "font-heading text-xl", children: "Add traveller" }) }),
|
|
2247
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 pt-2", children: [
|
|
2248
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2249
|
+
FloatingInput,
|
|
2250
|
+
{
|
|
2251
|
+
label: "First name",
|
|
2252
|
+
required: true,
|
|
2253
|
+
value: newTraveller.firstName,
|
|
2254
|
+
onChange: (e) => setField("firstName", e.target.value)
|
|
2255
|
+
}
|
|
2256
|
+
),
|
|
2257
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2258
|
+
FloatingInput,
|
|
2259
|
+
{
|
|
2260
|
+
label: "Last name",
|
|
2261
|
+
required: true,
|
|
2262
|
+
value: newTraveller.lastName,
|
|
2263
|
+
onChange: (e) => setField("lastName", e.target.value)
|
|
2264
|
+
}
|
|
2265
|
+
),
|
|
2266
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2267
|
+
FloatingInput,
|
|
2268
|
+
{
|
|
2269
|
+
label: "Passport (optional)",
|
|
2270
|
+
value: newTraveller.passport,
|
|
2271
|
+
onChange: (e) => setField("passport", e.target.value)
|
|
2272
|
+
}
|
|
2273
|
+
),
|
|
2274
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2275
|
+
FloatingSelect,
|
|
2276
|
+
{
|
|
2277
|
+
label: "Type (adult/child/senior)",
|
|
2278
|
+
value: newTraveller.type,
|
|
2279
|
+
onChange: (e) => setField("type", e.target.value),
|
|
2280
|
+
children: [
|
|
2281
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "adult", children: "Adult" }),
|
|
2282
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "child", children: "Child" }),
|
|
2283
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "senior", children: "Senior" })
|
|
2284
|
+
]
|
|
2285
|
+
}
|
|
2286
|
+
),
|
|
2287
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2288
|
+
FloatingInput,
|
|
2289
|
+
{
|
|
2290
|
+
label: "Email",
|
|
2291
|
+
type: "email",
|
|
2292
|
+
required: true,
|
|
2293
|
+
value: newTraveller.email,
|
|
2294
|
+
onChange: (e) => setField("email", e.target.value)
|
|
2295
|
+
}
|
|
2296
|
+
),
|
|
2297
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2298
|
+
FloatingInput,
|
|
2299
|
+
{
|
|
2300
|
+
label: "Date of birth",
|
|
2301
|
+
type: "date",
|
|
2302
|
+
value: newTraveller.dateOfBirth,
|
|
2303
|
+
onChange: (e) => setField("dateOfBirth", e.target.value)
|
|
2304
|
+
}
|
|
2305
|
+
),
|
|
2306
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2307
|
+
FloatingInput,
|
|
2308
|
+
{
|
|
2309
|
+
label: "Phone (optional)",
|
|
2310
|
+
type: "tel",
|
|
2311
|
+
value: newTraveller.phone,
|
|
2312
|
+
onChange: (e) => setField("phone", e.target.value)
|
|
2313
|
+
}
|
|
2314
|
+
),
|
|
2315
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-3 pt-2", children: [
|
|
2316
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2317
|
+
"button",
|
|
2318
|
+
{
|
|
2319
|
+
type: "button",
|
|
2320
|
+
onClick: () => setAddModalOpen(false),
|
|
2321
|
+
className: "text-sm font-ui text-muted-foreground hover:text-foreground transition-colors",
|
|
2322
|
+
children: "Cancel"
|
|
2323
|
+
}
|
|
2324
|
+
),
|
|
2325
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2326
|
+
"button",
|
|
2327
|
+
{
|
|
2328
|
+
type: "button",
|
|
2329
|
+
onClick: () => {
|
|
2330
|
+
setAddModalOpen(false);
|
|
2331
|
+
setNewTraveller({
|
|
2332
|
+
firstName: "",
|
|
2333
|
+
lastName: "",
|
|
2334
|
+
passport: "",
|
|
2335
|
+
type: "adult",
|
|
2336
|
+
email: "",
|
|
2337
|
+
dateOfBirth: "",
|
|
2338
|
+
phone: ""
|
|
2339
|
+
});
|
|
2340
|
+
},
|
|
2341
|
+
className: "rounded-full bg-primary px-6 py-2.5 text-sm font-bold text-primary-foreground font-heading hover:bg-primary/90 transition-colors",
|
|
2342
|
+
children: "Add"
|
|
2343
|
+
}
|
|
2344
|
+
)
|
|
2345
|
+
] })
|
|
2346
|
+
] })
|
|
2347
|
+
] }) })
|
|
2348
|
+
] });
|
|
2349
|
+
}
|
|
2350
|
+
function OrderSummary({
|
|
2351
|
+
adventures,
|
|
2352
|
+
summaryLineItems,
|
|
2353
|
+
subtotal,
|
|
2354
|
+
total,
|
|
2355
|
+
depositInfo
|
|
2356
|
+
}) {
|
|
2357
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card p-5 lg:p-6 flex flex-col gap-4", children: [
|
|
2358
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Order Summary" }),
|
|
2359
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
|
|
2360
|
+
adventures.map((adventure, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
2361
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold text-foreground font-heading", children: adventure.title }),
|
|
2362
|
+
adventure.lineItems && adventure.lineItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-1.5 pl-3 border-l-2 border-primary/20 ml-1", children: adventure.lineItems.map((item, j) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2363
|
+
"div",
|
|
2364
|
+
{
|
|
2365
|
+
className: "flex items-start justify-between gap-3",
|
|
2366
|
+
children: [
|
|
2367
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2368
|
+
"span",
|
|
2369
|
+
{
|
|
2370
|
+
className: cn(
|
|
2371
|
+
"text-sm font-sans leading-tight",
|
|
2372
|
+
item.isBold ? "font-semibold text-foreground" : "text-muted-foreground"
|
|
2373
|
+
),
|
|
2374
|
+
children: item.label
|
|
2375
|
+
}
|
|
2376
|
+
),
|
|
2377
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2378
|
+
"span",
|
|
2379
|
+
{
|
|
2380
|
+
className: cn(
|
|
2381
|
+
"text-sm font-sans shrink-0",
|
|
2382
|
+
item.isDiscount ? "text-green-600 dark:text-green-400" : item.isBold ? "font-semibold text-foreground" : "text-foreground"
|
|
2383
|
+
),
|
|
2384
|
+
children: [
|
|
2385
|
+
item.isDiscount ? "\u2212" : "",
|
|
2386
|
+
item.price
|
|
2387
|
+
]
|
|
2388
|
+
}
|
|
2389
|
+
)
|
|
2390
|
+
]
|
|
2391
|
+
},
|
|
2392
|
+
j
|
|
2393
|
+
)) }),
|
|
2394
|
+
adventure.subtotal && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mt-1", children: [
|
|
2395
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground font-sans", children: "Subtotal this adventure" }),
|
|
2396
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-sans", children: adventure.subtotal })
|
|
2397
|
+
] }),
|
|
2398
|
+
i < adventures.length - 1 && /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mt-2" })
|
|
2399
|
+
] }, adventure.id)),
|
|
2400
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
|
|
2401
|
+
summaryLineItems && summaryLineItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2402
|
+
summaryLineItems.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2403
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2404
|
+
"span",
|
|
2405
|
+
{
|
|
2406
|
+
className: cn(
|
|
2407
|
+
"text-sm font-sans",
|
|
2408
|
+
item.isBold ? "font-semibold text-foreground" : "text-muted-foreground"
|
|
2409
|
+
),
|
|
2410
|
+
children: item.label
|
|
2411
|
+
}
|
|
2412
|
+
),
|
|
2413
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2414
|
+
"span",
|
|
2415
|
+
{
|
|
2416
|
+
className: cn(
|
|
2417
|
+
"text-sm font-sans",
|
|
2418
|
+
item.isDiscount ? "text-green-600 dark:text-green-400" : item.isBold ? "font-semibold text-foreground" : "text-foreground"
|
|
2419
|
+
),
|
|
2420
|
+
children: [
|
|
2421
|
+
item.isDiscount ? "\u2212" : "",
|
|
2422
|
+
item.price
|
|
2423
|
+
]
|
|
2424
|
+
}
|
|
2425
|
+
)
|
|
2426
|
+
] }, i)),
|
|
2427
|
+
/* @__PURE__ */ jsxRuntime.jsx(Separator, {})
|
|
2428
|
+
] }),
|
|
2429
|
+
subtotal && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2430
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground font-sans", children: "Subtotal" }),
|
|
2431
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-sans", children: subtotal })
|
|
2432
|
+
] }),
|
|
2433
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between pt-1", children: [
|
|
2434
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base font-bold text-foreground font-heading", children: "Total" }),
|
|
2435
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-2xl font-black text-primary font-heading", children: total })
|
|
2436
|
+
] }),
|
|
2437
|
+
depositInfo && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 rounded-lg bg-muted/50 border border-border p-4", children: [
|
|
2438
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2439
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground font-sans", children: [
|
|
2440
|
+
"Deposit (",
|
|
2441
|
+
depositInfo.depositPercent,
|
|
2442
|
+
"%)"
|
|
2443
|
+
] }),
|
|
2444
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-sans", children: depositInfo.depositAmount })
|
|
2445
|
+
] }),
|
|
2446
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2447
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground font-sans", children: "Remaining balance" }),
|
|
2448
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-sans", children: depositInfo.remainingAmount })
|
|
2449
|
+
] }),
|
|
2450
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2451
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground font-sans", children: "Balance due" }),
|
|
2452
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold text-foreground font-sans", children: depositInfo.balanceDueDate })
|
|
2453
|
+
] })
|
|
2454
|
+
] })
|
|
2455
|
+
] });
|
|
2456
|
+
}
|
|
2457
|
+
function BookingDetails({
|
|
2458
|
+
bookingId,
|
|
2459
|
+
status,
|
|
2460
|
+
createdAt,
|
|
2461
|
+
contact,
|
|
2462
|
+
agentName,
|
|
2463
|
+
agentContactUrl,
|
|
2464
|
+
adventures,
|
|
2465
|
+
summaryLineItems,
|
|
2466
|
+
subtotal,
|
|
2467
|
+
total,
|
|
2468
|
+
depositInfo,
|
|
2469
|
+
onAddContactAsTraveller,
|
|
2470
|
+
onEditTraveller,
|
|
2471
|
+
onRemoveTraveller,
|
|
2472
|
+
onAddSuggestedTraveller,
|
|
2473
|
+
onPayBalance,
|
|
2474
|
+
onCancelRequest,
|
|
2475
|
+
className
|
|
2476
|
+
}) {
|
|
2477
|
+
var _a, _b, _c;
|
|
2478
|
+
const people = totalPeople(adventures);
|
|
2479
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2480
|
+
"div",
|
|
2481
|
+
{
|
|
2482
|
+
className: cn("w-full max-w-5xl mx-auto flex flex-col gap-6 px-4 sm:px-6 lg:px-0", className),
|
|
2483
|
+
children: [
|
|
2484
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 flex-wrap", children: [
|
|
2485
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
2486
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h1", { className: "text-2xl font-black text-foreground font-heading leading-tight", children: [
|
|
2487
|
+
"Booking",
|
|
2488
|
+
" ",
|
|
2489
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-primary", children: [
|
|
2490
|
+
"#",
|
|
2491
|
+
bookingId
|
|
2492
|
+
] })
|
|
2493
|
+
] }),
|
|
2494
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground font-sans", children: [
|
|
2495
|
+
"Created on ",
|
|
2496
|
+
createdAt
|
|
2497
|
+
] })
|
|
2498
|
+
] }),
|
|
2499
|
+
/* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { status })
|
|
2500
|
+
] }),
|
|
2501
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-3", children: [
|
|
2502
|
+
/* @__PURE__ */ jsxRuntime.jsxs(InfoCard, { label: "Contact", children: [
|
|
2503
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-semibold", children: contact.name }),
|
|
2504
|
+
contact.email && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground font-sans truncate", children: contact.email })
|
|
2505
|
+
] }),
|
|
2506
|
+
agentName && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border bg-card p-4 flex items-center gap-3.5 min-w-0", children: [
|
|
2507
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary font-heading font-bold text-sm uppercase", children: agentName.charAt(0) }),
|
|
2508
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-0.5 min-w-0", children: [
|
|
2509
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Your Agent" }),
|
|
2510
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-foreground font-sans", children: agentName })
|
|
2511
|
+
] }),
|
|
2512
|
+
agentContactUrl && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2513
|
+
"a",
|
|
2514
|
+
{
|
|
2515
|
+
href: agentContactUrl,
|
|
2516
|
+
target: "_blank",
|
|
2517
|
+
rel: "noopener noreferrer",
|
|
2518
|
+
className: "ml-auto shrink-0 flex items-center gap-1.5 rounded-full bg-primary/10 px-3.5 py-1.5 text-xs font-semibold text-primary font-ui transition-colors hover:bg-primary/20",
|
|
2519
|
+
children: [
|
|
2520
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageCircleIcon, { className: "w-3.5 h-3.5" }),
|
|
2521
|
+
"Contact"
|
|
2522
|
+
]
|
|
2523
|
+
}
|
|
2524
|
+
)
|
|
2525
|
+
] }),
|
|
2526
|
+
/* @__PURE__ */ jsxRuntime.jsxs(InfoCard, { label: "Total People", children: [
|
|
2527
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2528
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UsersIcon, { className: "w-4 h-4 text-primary shrink-0" }),
|
|
2529
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-semibold", children: [
|
|
2530
|
+
people.total,
|
|
2531
|
+
" person(s)"
|
|
2532
|
+
] })
|
|
2533
|
+
] }),
|
|
2534
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground font-sans", children: [
|
|
2535
|
+
people.adults > 0 ? `Adults: ${people.adults}` : null,
|
|
2536
|
+
people.children > 0 ? `Children: ${people.children}` : null,
|
|
2537
|
+
people.seniors > 0 ? `Seniors: ${people.seniors}` : null
|
|
2538
|
+
].filter(Boolean).join(" \xB7 ") })
|
|
2539
|
+
] })
|
|
2540
|
+
] }),
|
|
2541
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex flex-col gap-4", children: [
|
|
2542
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: [
|
|
2543
|
+
"Adventures (",
|
|
2544
|
+
adventures.length,
|
|
2545
|
+
")"
|
|
2546
|
+
] }),
|
|
2547
|
+
adventures.map((adventure) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2548
|
+
AdventureSection,
|
|
2549
|
+
{
|
|
2550
|
+
adventure,
|
|
2551
|
+
onAddContactAsTraveller,
|
|
2552
|
+
onEditTraveller,
|
|
2553
|
+
onRemoveTraveller,
|
|
2554
|
+
onAddSuggestedTraveller
|
|
2555
|
+
},
|
|
2556
|
+
adventure.id
|
|
2557
|
+
))
|
|
2558
|
+
] }),
|
|
2559
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2560
|
+
OrderSummary,
|
|
2561
|
+
{
|
|
2562
|
+
adventures,
|
|
2563
|
+
summaryLineItems,
|
|
2564
|
+
subtotal,
|
|
2565
|
+
total,
|
|
2566
|
+
depositInfo
|
|
2567
|
+
}
|
|
2568
|
+
),
|
|
2569
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-border bg-card p-5 lg:p-6 flex flex-col gap-4", children: [
|
|
2570
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Responsible Person" }),
|
|
2571
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-3", children: [
|
|
2572
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2573
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground/60 font-heading uppercase tracking-widest mb-0.5", children: "Name" }),
|
|
2574
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-foreground font-sans", children: contact.name })
|
|
2575
|
+
] }),
|
|
2576
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2577
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground/60 font-heading uppercase tracking-widest mb-0.5", children: "Email" }),
|
|
2578
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground font-sans truncate", children: (_a = contact.email) != null ? _a : "\u2014" })
|
|
2579
|
+
] }),
|
|
2580
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2581
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground/60 font-heading uppercase tracking-widest mb-0.5", children: "Phone" }),
|
|
2582
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground font-sans", children: (_b = contact.phone) != null ? _b : "\u2014" })
|
|
2583
|
+
] }),
|
|
2584
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2585
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground/60 font-heading uppercase tracking-widest mb-0.5", children: "Country" }),
|
|
2586
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground font-sans", children: (_c = contact.country) != null ? _c : "\u2014" })
|
|
2587
|
+
] }),
|
|
2588
|
+
contact.passport && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2589
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground/60 font-heading uppercase tracking-widest mb-0.5", children: "Passport / CPF" }),
|
|
2590
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground font-sans", children: contact.passport })
|
|
2591
|
+
] })
|
|
2592
|
+
] })
|
|
2593
|
+
] }),
|
|
2594
|
+
(onPayBalance || onCancelRequest) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4", children: [
|
|
2595
|
+
depositInfo && !depositInfo.isPaidInFull && onPayBalance && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2596
|
+
"button",
|
|
2597
|
+
{
|
|
2598
|
+
type: "button",
|
|
2599
|
+
onClick: onPayBalance,
|
|
2600
|
+
className: cn(
|
|
2601
|
+
"w-full rounded-full bg-primary py-3.5 text-center text-sm font-bold uppercase tracking-wide",
|
|
2602
|
+
"text-primary-foreground font-heading transition-colors hover:bg-primary/90",
|
|
2603
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
2604
|
+
"flex items-center justify-center gap-2"
|
|
2605
|
+
),
|
|
2606
|
+
children: [
|
|
2607
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CreditCardIcon, { className: "w-4 h-4" }),
|
|
2608
|
+
"Pay remaining balance \u2014 ",
|
|
2609
|
+
depositInfo.remainingAmount
|
|
2610
|
+
]
|
|
2611
|
+
}
|
|
2612
|
+
),
|
|
2613
|
+
onCancelRequest && status !== "cancelled" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2614
|
+
"button",
|
|
2615
|
+
{
|
|
2616
|
+
type: "button",
|
|
2617
|
+
onClick: onCancelRequest,
|
|
2618
|
+
className: "flex items-center gap-1.5 text-xs font-ui text-muted-foreground hover:text-destructive transition-colors underline underline-offset-2",
|
|
2619
|
+
children: [
|
|
2620
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircleIcon, { className: "w-3 h-3" }),
|
|
2621
|
+
"Request cancellation"
|
|
2622
|
+
]
|
|
2623
|
+
}
|
|
2624
|
+
)
|
|
2625
|
+
] })
|
|
2626
|
+
]
|
|
2627
|
+
}
|
|
2628
|
+
);
|
|
2629
|
+
}
|
|
2630
|
+
var DEFAULT_LOGO = "/logo-planetaexo.png";
|
|
2631
|
+
function BookingConfirmationEmail({
|
|
2632
|
+
recipientName,
|
|
2633
|
+
addTravellersUrl,
|
|
2634
|
+
logoUrl = DEFAULT_LOGO,
|
|
2635
|
+
bookingNumber,
|
|
2636
|
+
activity,
|
|
2637
|
+
adventure,
|
|
2638
|
+
startingDate,
|
|
2639
|
+
numberOfPeople,
|
|
2640
|
+
host,
|
|
2641
|
+
className
|
|
2642
|
+
}) {
|
|
2643
|
+
const AddTravellersCta = addTravellersUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2644
|
+
"a",
|
|
2645
|
+
{
|
|
2646
|
+
href: addTravellersUrl,
|
|
2647
|
+
className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-bold text-primary-foreground font-heading hover:bg-primary-800 transition-colors no-underline",
|
|
2648
|
+
children: "Add travellers to your booking"
|
|
2649
|
+
}
|
|
2650
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
2651
|
+
"span",
|
|
2652
|
+
{
|
|
2653
|
+
className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-bold text-primary-foreground font-heading",
|
|
2654
|
+
role: "presentation",
|
|
2655
|
+
children: "Add travellers to your booking"
|
|
2656
|
+
}
|
|
2657
|
+
);
|
|
2658
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2659
|
+
"div",
|
|
2660
|
+
{
|
|
2661
|
+
className: cn(
|
|
2662
|
+
"max-w-xl mx-auto bg-white text-foreground font-sans text-base leading-relaxed",
|
|
2663
|
+
className
|
|
2664
|
+
),
|
|
2665
|
+
children: [
|
|
2666
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 mb-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2667
|
+
"img",
|
|
2668
|
+
{
|
|
2669
|
+
src: logoUrl,
|
|
2670
|
+
alt: "PlanetaEXO",
|
|
2671
|
+
className: "h-[70px] w-auto object-contain"
|
|
2672
|
+
}
|
|
2673
|
+
) }),
|
|
2674
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mb-4", children: [
|
|
2675
|
+
"Hi ",
|
|
2676
|
+
recipientName,
|
|
2677
|
+
","
|
|
2678
|
+
] }),
|
|
2679
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "Thank you for booking your adventure with PlanetaEXO \u2014 we're really looking forward to your adventure." }),
|
|
2680
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "To move forward, the first step is to add all travellers included in your booking. Once you do this, each person \u2014 including you \u2014 will receive an email with a link to complete their individual registration." }),
|
|
2681
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-8", children: AddTravellersCta }),
|
|
2682
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mb-8" }),
|
|
2683
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4 font-heading font-bold text-foreground", children: "\u{1F4DD} Here's a quick summary of your booking:" }),
|
|
2684
|
+
/* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full text-sm mb-8", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { className: "divide-y divide-border", children: [
|
|
2685
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2686
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Booking Number:" }),
|
|
2687
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: bookingNumber })
|
|
2688
|
+
] }),
|
|
2689
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2690
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Activity:" }),
|
|
2691
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: activity })
|
|
2692
|
+
] }),
|
|
2693
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2694
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Adventure:" }),
|
|
2695
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: adventure })
|
|
2696
|
+
] }),
|
|
2697
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2698
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Starting Date:" }),
|
|
2699
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: startingDate })
|
|
2700
|
+
] }),
|
|
2701
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2702
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Number of People:" }),
|
|
2703
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: numberOfPeople })
|
|
2704
|
+
] }),
|
|
2705
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2706
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 pr-4 text-muted-foreground font-ui", children: "Host:" }),
|
|
2707
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-1 font-medium text-foreground", children: host })
|
|
2708
|
+
] })
|
|
2709
|
+
] }) }),
|
|
2710
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mb-8" }),
|
|
2711
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4", children: "After adding everyone, you will also receive your own registration email, just like the other travellers. Please make sure everyone completes this step so we can organise everything properly." }),
|
|
2712
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { children: "If you have any questions, just reply to this email \u2014 happy to help." })
|
|
2713
|
+
]
|
|
2714
|
+
}
|
|
2715
|
+
);
|
|
2716
|
+
}
|
|
2717
|
+
var DEFAULT_LOGO2 = "/logo-planetaexo.png";
|
|
2718
|
+
function BookingConfirmation({
|
|
2719
|
+
recipientName,
|
|
2720
|
+
logoUrl = DEFAULT_LOGO2,
|
|
2721
|
+
bookingReference,
|
|
2722
|
+
adventures,
|
|
2723
|
+
summaryLineItems,
|
|
2724
|
+
subtotal,
|
|
2725
|
+
total,
|
|
2726
|
+
depositInfo,
|
|
2727
|
+
agent,
|
|
2728
|
+
viewBookingUrl,
|
|
2729
|
+
className
|
|
2730
|
+
}) {
|
|
2731
|
+
const allTravellers = adventures.flatMap((a) => {
|
|
2732
|
+
var _a;
|
|
2733
|
+
return (_a = a.travellers) != null ? _a : [];
|
|
2734
|
+
});
|
|
2735
|
+
const ViewBookingCta = viewBookingUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2736
|
+
"a",
|
|
2737
|
+
{
|
|
2738
|
+
href: viewBookingUrl,
|
|
2739
|
+
className: "inline-flex items-center justify-center rounded-lg bg-primary px-8 py-3.5 text-sm font-bold text-primary-foreground font-heading hover:bg-primary/90 transition-colors no-underline",
|
|
2740
|
+
children: "View booking details"
|
|
2741
|
+
}
|
|
2742
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
2743
|
+
"span",
|
|
2744
|
+
{
|
|
2745
|
+
className: "inline-flex items-center justify-center rounded-lg bg-primary px-8 py-3.5 text-sm font-bold text-primary-foreground font-heading",
|
|
2746
|
+
role: "presentation",
|
|
2747
|
+
children: "View booking details"
|
|
2748
|
+
}
|
|
2749
|
+
);
|
|
2750
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2751
|
+
"div",
|
|
2752
|
+
{
|
|
2753
|
+
className: cn(
|
|
2754
|
+
"max-w-xl mx-auto bg-white text-foreground font-sans text-base leading-relaxed",
|
|
2755
|
+
className
|
|
2756
|
+
),
|
|
2757
|
+
children: [
|
|
2758
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pt-10 pb-8 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2759
|
+
"img",
|
|
2760
|
+
{
|
|
2761
|
+
src: logoUrl,
|
|
2762
|
+
alt: "PlanetaEXO",
|
|
2763
|
+
className: "h-[70px] w-auto object-contain"
|
|
2764
|
+
}
|
|
2765
|
+
) }),
|
|
2766
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-8", children: [
|
|
2767
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mb-5 text-base", children: [
|
|
2768
|
+
"Hi ",
|
|
2769
|
+
recipientName,
|
|
2770
|
+
","
|
|
2771
|
+
] }),
|
|
2772
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-5 text-base", children: "Great news \u2014 your booking has been confirmed! Everything is set and we're getting ready for your adventure." }),
|
|
2773
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-8 text-base", children: "Below you'll find the full details of your reservation, including the adventures, travellers, and payment summary." }),
|
|
2774
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-10", children: ViewBookingCta })
|
|
2775
|
+
] }),
|
|
2776
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mx-8" }),
|
|
2777
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-8 py-8", children: [
|
|
2778
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-5 font-heading font-bold text-foreground text-lg", children: "\u{1F4CB} Next Steps" }),
|
|
2779
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-border p-5 flex flex-col gap-4", children: [
|
|
2780
|
+
"Each traveller will receive a separate email with a link to complete their individual registration.",
|
|
2781
|
+
"Make sure everyone completes their registration so we can organise everything properly.",
|
|
2782
|
+
"You will receive a final confirmation once all travellers are registered and ready to go."
|
|
2783
|
+
].map((step, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3.5", children: [
|
|
2784
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-xs font-bold text-primary font-heading mt-0.5", children: i + 1 }),
|
|
2785
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground/80 leading-relaxed", children: step })
|
|
2786
|
+
] }, i)) })
|
|
2787
|
+
] }),
|
|
2788
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mx-8" }),
|
|
2789
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-8 py-8", children: [
|
|
2790
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-5 font-heading font-bold text-foreground text-lg", children: "\u{1F4DD} Booking Summary" }),
|
|
2791
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-border overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full text-sm", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
|
|
2792
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
2793
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 text-muted-foreground font-ui bg-muted/30", children: "Booking Number" }),
|
|
2794
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 font-semibold text-primary", children: bookingReference })
|
|
2795
|
+
] }),
|
|
2796
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
2797
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 text-muted-foreground font-ui bg-muted/30", children: "Adventures" }),
|
|
2798
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 font-medium text-foreground", children: adventures.length })
|
|
2799
|
+
] }),
|
|
2800
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
2801
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 text-muted-foreground font-ui bg-muted/30", children: "Total Travellers" }),
|
|
2802
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 font-medium text-foreground", children: allTravellers.length })
|
|
2803
|
+
] }),
|
|
2804
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
2805
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 text-muted-foreground font-ui bg-muted/30", children: "Agent" }),
|
|
2806
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 px-5 font-medium text-foreground", children: agent })
|
|
2807
|
+
] })
|
|
2808
|
+
] }) }) })
|
|
2809
|
+
] }),
|
|
2810
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mx-8" }),
|
|
2811
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-8 py-8 flex flex-col gap-6", children: adventures.map((adventure) => {
|
|
2812
|
+
var _a;
|
|
2813
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2814
|
+
"div",
|
|
2815
|
+
{
|
|
2816
|
+
className: "rounded-2xl border border-border bg-card overflow-hidden",
|
|
2817
|
+
children: [
|
|
2818
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/7] overflow-hidden bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2819
|
+
"img",
|
|
2820
|
+
{
|
|
2821
|
+
src: adventure.image,
|
|
2822
|
+
alt: (_a = adventure.imageAlt) != null ? _a : adventure.title,
|
|
2823
|
+
className: "w-full h-full object-cover"
|
|
2824
|
+
}
|
|
2825
|
+
) }),
|
|
2826
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 flex flex-col gap-2.5", children: [
|
|
2827
|
+
adventure.reference && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-md bg-primary/10 px-2 py-0.5 text-xs font-semibold text-primary font-heading tracking-wide self-start", children: adventure.reference }),
|
|
2828
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-bold text-foreground font-heading leading-snug mt-0.5", children: adventure.title }),
|
|
2829
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-sm text-muted-foreground font-sans leading-none", children: [
|
|
2830
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-3.5 h-3.5 text-primary shrink-0", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2831
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", ry: "2" }),
|
|
2832
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "16", x2: "16", y1: "2", y2: "6" }),
|
|
2833
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", x2: "8", y1: "2", y2: "6" }),
|
|
2834
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", x2: "21", y1: "10", y2: "10" })
|
|
2835
|
+
] }),
|
|
2836
|
+
adventure.dateFrom,
|
|
2837
|
+
" \u2192 ",
|
|
2838
|
+
adventure.dateTo
|
|
2839
|
+
] }),
|
|
2840
|
+
adventure.location && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-sm text-muted-foreground font-sans leading-none", children: [
|
|
2841
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-3.5 h-3.5 text-primary shrink-0", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2842
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z" }),
|
|
2843
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "10", r: "3" })
|
|
2844
|
+
] }),
|
|
2845
|
+
adventure.location
|
|
2846
|
+
] }),
|
|
2847
|
+
adventure.slots && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-sm text-muted-foreground font-sans leading-none", children: [
|
|
2848
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-3.5 h-3.5 text-primary shrink-0", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2849
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
|
|
2850
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "7", r: "4" }),
|
|
2851
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87" }),
|
|
2852
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })
|
|
2853
|
+
] }),
|
|
2854
|
+
[
|
|
2855
|
+
adventure.slots.adults ? `${adventure.slots.adults} adult(s)` : null,
|
|
2856
|
+
adventure.slots.children ? `${adventure.slots.children} child(ren)` : null
|
|
2857
|
+
].filter(Boolean).join(" \xB7 ")
|
|
2858
|
+
] }),
|
|
2859
|
+
adventure.partner && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-sm text-muted-foreground font-sans leading-none", children: [
|
|
2860
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-3.5 h-3.5 text-primary shrink-0", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2861
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
|
|
2862
|
+
/* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76" })
|
|
2863
|
+
] }),
|
|
2864
|
+
adventure.partner
|
|
2865
|
+
] }),
|
|
2866
|
+
adventure.travellers && adventure.travellers.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2867
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border my-1" }),
|
|
2868
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2869
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] font-bold text-muted-foreground font-heading uppercase tracking-widest mb-2", children: "Travellers" }),
|
|
2870
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-1.5", children: adventure.travellers.map((t) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2871
|
+
"div",
|
|
2872
|
+
{
|
|
2873
|
+
className: "flex items-center justify-between",
|
|
2874
|
+
children: [
|
|
2875
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium text-foreground font-sans", children: [
|
|
2876
|
+
t.firstName,
|
|
2877
|
+
" ",
|
|
2878
|
+
t.lastName
|
|
2879
|
+
] }),
|
|
2880
|
+
t.isChild && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-semibold text-muted-foreground bg-muted rounded-full px-2 py-0.5 font-heading uppercase tracking-wide", children: "child" })
|
|
2881
|
+
]
|
|
2882
|
+
},
|
|
2883
|
+
t.id
|
|
2884
|
+
)) })
|
|
2885
|
+
] })
|
|
2886
|
+
] }),
|
|
2887
|
+
adventure.description && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2888
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border my-1" }),
|
|
2889
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2890
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] font-bold text-muted-foreground font-heading uppercase tracking-widest mb-2", children: "Itinerary" }),
|
|
2891
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground/80 leading-relaxed font-sans", children: adventure.description })
|
|
2892
|
+
] })
|
|
2893
|
+
] }),
|
|
2894
|
+
adventure.included && adventure.included.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
|
|
2895
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-bold text-foreground font-heading", children: "O que est\xE1 incluso" }),
|
|
2896
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.included.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2897
|
+
"li",
|
|
2898
|
+
{
|
|
2899
|
+
className: "flex items-start gap-2 text-sm text-foreground/80 font-sans",
|
|
2900
|
+
children: [
|
|
2901
|
+
/* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-4 h-4 text-primary shrink-0 mt-0.5", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) }),
|
|
2902
|
+
item
|
|
2903
|
+
]
|
|
2904
|
+
},
|
|
2905
|
+
i
|
|
2906
|
+
)) })
|
|
2907
|
+
] }),
|
|
2908
|
+
adventure.notIncluded && adventure.notIncluded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2.5 mt-1", children: [
|
|
2909
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-bold text-foreground font-heading", children: "O que n\xE3o est\xE1 incluso" }),
|
|
2910
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-1.5", children: adventure.notIncluded.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2911
|
+
"li",
|
|
2912
|
+
{
|
|
2913
|
+
className: "flex items-start gap-2 text-sm text-foreground/80 font-sans",
|
|
2914
|
+
children: [
|
|
2915
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-4 h-4 text-destructive shrink-0 mt-0.5", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
2916
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 6 6 18" }),
|
|
2917
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "m6 6 12 12" })
|
|
2918
|
+
] }),
|
|
2919
|
+
item
|
|
2920
|
+
]
|
|
2921
|
+
},
|
|
2922
|
+
i
|
|
2923
|
+
)) })
|
|
2924
|
+
] }),
|
|
2925
|
+
adventure.lineItems && adventure.lineItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2926
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border my-1" }),
|
|
2927
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2928
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] font-bold text-muted-foreground font-heading uppercase tracking-widest mb-2", children: "Pricing" }),
|
|
2929
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
2930
|
+
adventure.lineItems.map((item, j) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2931
|
+
"div",
|
|
2932
|
+
{
|
|
2933
|
+
className: "flex items-center justify-between",
|
|
2934
|
+
children: [
|
|
2935
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground font-sans", children: item.label }),
|
|
2936
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2937
|
+
"span",
|
|
2938
|
+
{
|
|
2939
|
+
className: cn(
|
|
2940
|
+
"text-sm font-medium font-sans whitespace-nowrap",
|
|
2941
|
+
item.isDiscount ? "text-green-600" : "text-foreground"
|
|
2942
|
+
),
|
|
2943
|
+
children: [
|
|
2944
|
+
item.isDiscount ? "\u2212" : "",
|
|
2945
|
+
item.price
|
|
2946
|
+
]
|
|
2947
|
+
}
|
|
2948
|
+
)
|
|
2949
|
+
]
|
|
2950
|
+
},
|
|
2951
|
+
j
|
|
2952
|
+
)),
|
|
2953
|
+
adventure.subtotal && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-border", children: [
|
|
2954
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-heading", children: "Subtotal" }),
|
|
2955
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold text-foreground font-heading whitespace-nowrap", children: adventure.subtotal })
|
|
2956
|
+
] })
|
|
2957
|
+
] })
|
|
2958
|
+
] })
|
|
2959
|
+
] })
|
|
2960
|
+
] })
|
|
2961
|
+
]
|
|
2962
|
+
},
|
|
2963
|
+
adventure.id
|
|
2964
|
+
);
|
|
2965
|
+
}) }),
|
|
2966
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mx-8" }),
|
|
2967
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-8 py-8", children: [
|
|
2968
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-5 font-heading font-bold text-foreground text-lg", children: "\u{1F4B0} Payment Summary" }),
|
|
2969
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-border overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full text-sm", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
|
|
2970
|
+
summaryLineItems && summaryLineItems.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
2971
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-muted-foreground", children: item.label }),
|
|
2972
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2973
|
+
"td",
|
|
2974
|
+
{
|
|
2975
|
+
className: cn(
|
|
2976
|
+
"py-2.5 px-4 text-right font-medium whitespace-nowrap",
|
|
2977
|
+
item.isDiscount ? "text-green-600" : "text-foreground"
|
|
2978
|
+
),
|
|
2979
|
+
children: [
|
|
2980
|
+
item.isDiscount ? "\u2212" : "",
|
|
2981
|
+
item.price
|
|
2982
|
+
]
|
|
2983
|
+
}
|
|
2984
|
+
)
|
|
2985
|
+
] }, i)),
|
|
2986
|
+
subtotal && /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
2987
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-muted-foreground font-ui", children: "Subtotal" }),
|
|
2988
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-right font-medium text-foreground whitespace-nowrap", children: subtotal })
|
|
2989
|
+
] }),
|
|
2990
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "bg-muted/30", children: [
|
|
2991
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-4 px-4 font-bold text-foreground font-heading text-base", children: "Total" }),
|
|
2992
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-4 px-4 text-right font-bold text-primary font-heading text-xl whitespace-nowrap", children: total })
|
|
2993
|
+
] })
|
|
2994
|
+
] }) }) }),
|
|
2995
|
+
depositInfo && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-border mt-4 overflow-hidden", children: [
|
|
2996
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-3 bg-muted/30 border-b border-border", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold text-muted-foreground font-heading uppercase tracking-widest", children: "Payment Details" }) }),
|
|
2997
|
+
/* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full text-sm", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
|
|
2998
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
2999
|
+
/* @__PURE__ */ jsxRuntime.jsxs("td", { className: "py-2.5 px-4 text-muted-foreground", children: [
|
|
3000
|
+
"Deposit (",
|
|
3001
|
+
depositInfo.depositPercent,
|
|
3002
|
+
"%)"
|
|
3003
|
+
] }),
|
|
3004
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-right font-medium text-foreground whitespace-nowrap", children: depositInfo.depositAmount })
|
|
3005
|
+
] }),
|
|
3006
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "border-b border-border", children: [
|
|
3007
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-muted-foreground", children: "Remaining balance" }),
|
|
3008
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-right font-medium text-foreground whitespace-nowrap", children: depositInfo.remainingAmount })
|
|
3009
|
+
] }),
|
|
3010
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3011
|
+
"tr",
|
|
3012
|
+
{
|
|
3013
|
+
className: cn(
|
|
3014
|
+
depositInfo.isPaidInFull && "border-b border-border"
|
|
3015
|
+
),
|
|
3016
|
+
children: [
|
|
3017
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-muted-foreground", children: "Balance due" }),
|
|
3018
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-2.5 px-4 text-right font-medium text-foreground whitespace-nowrap", children: depositInfo.balanceDueDate })
|
|
3019
|
+
]
|
|
3020
|
+
}
|
|
3021
|
+
),
|
|
3022
|
+
depositInfo.isPaidInFull && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3023
|
+
"td",
|
|
3024
|
+
{
|
|
3025
|
+
colSpan: 2,
|
|
3026
|
+
className: "py-3 px-4 text-center font-semibold text-green-600 bg-green-50",
|
|
3027
|
+
children: "\u2705 Paid in full"
|
|
3028
|
+
}
|
|
3029
|
+
) })
|
|
3030
|
+
] }) })
|
|
3031
|
+
] })
|
|
3032
|
+
] }),
|
|
3033
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { className: "border-t border-border mx-8" }),
|
|
3034
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-8 py-8 pb-10", children: [
|
|
3035
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-5 text-base", children: "All travellers have been registered for this booking. Each person will receive a separate email with their individual details and any pre-departure information." }),
|
|
3036
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-base", children: [
|
|
3037
|
+
"If you have any questions, just reply to this email or contact",
|
|
3038
|
+
" ",
|
|
3039
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: agent }),
|
|
3040
|
+
" \u2014 happy to help."
|
|
3041
|
+
] })
|
|
3042
|
+
] })
|
|
3043
|
+
]
|
|
3044
|
+
}
|
|
3045
|
+
);
|
|
3046
|
+
}
|
|
1905
3047
|
|
|
3048
|
+
exports.BookingConfirmation = BookingConfirmation;
|
|
3049
|
+
exports.BookingConfirmationEmail = BookingConfirmationEmail;
|
|
3050
|
+
exports.BookingDetails = BookingDetails;
|
|
1906
3051
|
exports.Offer = Offer;
|
|
1907
3052
|
exports.OfferAdventureCard = OfferAdventureCard;
|
|
1908
3053
|
exports.cn = cn;
|