@clubmed/trident-ui 2.0.0-beta.69 → 2.0.0-beta.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/chunks/Birthdate.js +27 -0
  2. package/chunks/Birthdate.js.map +1 -0
  3. package/chunks/CriteriaParticipants.js +415 -0
  4. package/chunks/CriteriaParticipants.js.map +1 -0
  5. package/chunks/Datepicker.js +261 -286
  6. package/chunks/Datepicker.js.map +1 -1
  7. package/chunks/Day.js +48 -1170
  8. package/chunks/Day.js.map +1 -1
  9. package/chunks/addYears.js +18 -0
  10. package/chunks/addYears.js.map +1 -0
  11. package/chunks/endOfMonth.js +17 -0
  12. package/chunks/endOfMonth.js.map +1 -0
  13. package/chunks/format.js +1113 -0
  14. package/chunks/format.js.map +1 -0
  15. package/chunks/isAfter.js +9 -0
  16. package/chunks/isAfter.js.map +1 -0
  17. package/chunks/isBefore.js +15 -0
  18. package/chunks/isBefore.js.map +1 -0
  19. package/chunks/normalizeDates.js +10 -0
  20. package/chunks/normalizeDates.js.map +1 -0
  21. package/chunks/subYears.js +9 -0
  22. package/chunks/subYears.js.map +1 -0
  23. package/examples/criteria-dates-demo.d.ts +1 -0
  24. package/examples/criteria-dates-demo.js +41 -0
  25. package/examples/criteria-dates-demo.js.map +1 -0
  26. package/examples/criteria-participants-demo.d.ts +1 -0
  27. package/examples/criteria-participants-demo.js +77 -0
  28. package/examples/criteria-participants-demo.js.map +1 -0
  29. package/examples/criteria-participants-flow1-demo.d.ts +1 -0
  30. package/examples/criteria-participants-flow1-demo.js +53 -0
  31. package/examples/criteria-participants-flow1-demo.js.map +1 -0
  32. package/examples/criteria-participants-flow2-demo.d.ts +1 -0
  33. package/examples/criteria-participants-flow2-demo.js +61 -0
  34. package/examples/criteria-participants-flow2-demo.js.map +1 -0
  35. package/examples/criteria-participants-flow3-demo.d.ts +1 -0
  36. package/examples/criteria-participants-flow3-demo.js +72 -0
  37. package/examples/criteria-participants-flow3-demo.js.map +1 -0
  38. package/examples/criteria-transport-demo.d.ts +1 -0
  39. package/examples/criteria-transport-demo.js +66 -0
  40. package/examples/criteria-transport-demo.js.map +1 -0
  41. package/examples/datepicker-demo.js +4 -4
  42. package/examples/datepicker-disabled-days-demo.js +4 -4
  43. package/examples/datepicker-duration-tooltip-demo.js +4 -4
  44. package/examples/datepicker-no-prices-demo.js +4 -4
  45. package/examples/datepicker-preselected-demo.js +4 -4
  46. package/examples/toggle-small-demo.d.ts +1 -0
  47. package/examples/toggle-small-demo.js +33 -0
  48. package/examples/toggle-small-demo.js.map +1 -0
  49. package/package.json +1 -1
  50. package/ui/ChatWindow.js +2 -2
  51. package/ui/ChatWindow.js.map +1 -1
  52. package/ui/Datepicker.js +0 -1
  53. package/ui/Toggle.d.ts +1 -0
  54. package/ui/Toggle.js +10 -10
  55. package/ui/Toggle.js.map +1 -1
  56. package/ui/criteria/Birthdate.d.ts +13 -0
  57. package/ui/criteria/Birthdate.js +2 -0
  58. package/ui/criteria/CriteriaDates.d.ts +32 -0
  59. package/ui/criteria/CriteriaDates.js +76 -0
  60. package/ui/criteria/CriteriaDates.js.map +1 -0
  61. package/ui/criteria/CriteriaParticipants.d.ts +106 -0
  62. package/ui/criteria/CriteriaParticipants.js +2 -0
  63. package/ui/criteria/CriteriaSection.d.ts +6 -0
  64. package/ui/criteria/CriteriaSection.js +15 -0
  65. package/ui/criteria/CriteriaSection.js.map +1 -0
  66. package/ui/criteria/CriteriaTransport.d.ts +37 -0
  67. package/ui/criteria/CriteriaTransport.js +116 -0
  68. package/ui/criteria/CriteriaTransport.js.map +1 -0
  69. package/ui/forms/NumberField.d.ts +1 -0
  70. package/ui/forms/NumberField.js +13 -13
  71. package/ui/forms/NumberField.js.map +1 -1
@@ -0,0 +1,27 @@
1
+ import { n as e } from "./addLeadingZeros.js";
2
+ import { n as t, t as n } from "./isBefore.js";
3
+ import { t as r } from "./DateField.js";
4
+ import { t as i } from "./isAfter.js";
5
+ import { jsx as a } from "react/jsx-runtime";
6
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfToday.js
7
+ function o(e) {
8
+ return t(Date.now(), e);
9
+ }
10
+ //#endregion
11
+ //#region lib/ui/criteria/Birthdate.tsx
12
+ var s = ({ label: t, invalidDateErrorMessage: s, minDateErrorMessage: c, maxDateErrorMessage: l, min: u, max: d, value: f, onChange: p }) => {
13
+ let m = f != null && !e(f), h = f != null && !m && i(f, o()), g = f != null && !m && !h && n(f, u), _ = f != null && !m && !h && i(f, d);
14
+ return /* @__PURE__ */ a(r, {
15
+ label: t,
16
+ value: f,
17
+ min: u,
18
+ max: d,
19
+ validationStatus: g || _ || m || h ? "error" : "default",
20
+ errorMessage: g && l || _ && c || s,
21
+ onChange: p
22
+ });
23
+ };
24
+ //#endregion
25
+ export { o as n, s as t };
26
+
27
+ //# sourceMappingURL=Birthdate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Birthdate.js","names":[],"sources":["../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfToday.js","../../lib/ui/criteria/Birthdate.tsx"],"sourcesContent":["import { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link startOfToday} function options.\n */\n\n/**\n * @name startOfToday\n * @category Day Helpers\n * @summary Return the start of today.\n * @pure false\n *\n * @description\n * Return the start of today.\n *\n * @typeParam ContextDate - The `Date` type of the context function.\n *\n * @param options - An object with options\n *\n * @returns The start of today\n *\n * @example\n * // If today is 6 October 2014:\n * const result = startOfToday()\n * //=> Mon Oct 6 2014 00:00:00\n */\nexport function startOfToday(options) {\n return startOfDay(Date.now(), options);\n}\n\n// Fallback for modularized imports:\nexport default startOfToday;\n","import { isAfter, isBefore, isValid, startOfToday } from 'date-fns';\nimport type { FunctionComponent } from 'react';\n\nimport { DateField } from '../forms/DateField';\n\ninterface BirthdateProps {\n label: string;\n invalidDateErrorMessage: string;\n minDateErrorMessage: string;\n maxDateErrorMessage: string;\n min: Date;\n max: Date;\n value: Date | null | undefined;\n onChange: (event: Event, value: Date | null) => void;\n}\n\nexport const Birthdate: FunctionComponent<BirthdateProps> = ({\n label,\n invalidDateErrorMessage,\n minDateErrorMessage,\n maxDateErrorMessage,\n min,\n max,\n value,\n onChange,\n}) => {\n const isInvalid = value != null && !isValid(value);\n const isInFuture = value != null && !isInvalid && isAfter(value, startOfToday());\n const isBeforeMin = value != null && !isInvalid && !isInFuture && isBefore(value, min);\n const isAfterMax = value != null && !isInvalid && !isInFuture && isAfter(value, max);\n\n // minDateErrorMessage = child too old (birthdate before min); maxDateErrorMessage = child too young (birthdate after max)\n const errorMessage =\n (isBeforeMin && maxDateErrorMessage) ||\n (isAfterMax && minDateErrorMessage) ||\n invalidDateErrorMessage;\n\n const hasError = isBeforeMin || isAfterMax || isInvalid || isInFuture;\n\n return (\n <DateField\n label={label}\n value={value}\n min={min}\n max={max}\n validationStatus={hasError ? 'error' : 'default'}\n errorMessage={errorMessage}\n onChange={onChange}\n />\n );\n};\n"],"x_google_ignoreList":[0],"mappings":";;;;;;AA0BA,SAAgB,EAAa,GAAS;AACpC,QAAO,EAAW,KAAK,KAAK,EAAE,EAAQ;;;;ACXxC,IAAa,KAAgD,EAC3D,UACA,4BACA,wBACA,wBACA,QACA,QACA,UACA,kBACI;CACJ,IAAM,IAAY,KAAS,QAAQ,CAAC,EAAQ,EAAM,EAC5C,IAAa,KAAS,QAAQ,CAAC,KAAa,EAAQ,GAAO,GAAc,CAAC,EAC1E,IAAc,KAAS,QAAQ,CAAC,KAAa,CAAC,KAAc,EAAS,GAAO,EAAI,EAChF,IAAa,KAAS,QAAQ,CAAC,KAAa,CAAC,KAAc,EAAQ,GAAO,EAAI;AAUpF,QACE,kBAAC,GAAD;EACS;EACA;EACF;EACA;EACL,kBARa,KAAe,KAAc,KAAa,IAQ1B,UAAU;EACzB,cAbf,KAAe,KACf,KAAc,KACf;EAYY;EACV,CAAA"}
@@ -0,0 +1,415 @@
1
+ "use client";
2
+ import { t as e } from "./clsx.js";
3
+ import { ElasticHeight as t } from "../ui/ElasticHeight.js";
4
+ import { Button as n } from "../ui/buttons/Button.js";
5
+ import { Prose as r } from "../ui/Prose.js";
6
+ import { Chip as i } from "../ui/Chip.js";
7
+ import { i as a } from "./addLeadingZeros.js";
8
+ import { t as o } from "./normalizeDates.js";
9
+ import { n as s, t as c } from "./endOfMonth.js";
10
+ import { n as l, t as u } from "./Birthdate.js";
11
+ import { Toggle as d } from "../ui/Toggle.js";
12
+ import { NumberField as f } from "../ui/forms/NumberField.js";
13
+ import { Switch as p } from "../ui/forms/Switch.js";
14
+ import { useEffect as m, useRef as h, useState as g } from "react";
15
+ import { Icon as _ } from "@clubmed/trident-icons";
16
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
17
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/compareAsc.js
18
+ function b(e, t) {
19
+ let n = a(e) - +a(t);
20
+ return n < 0 ? -1 : n > 0 ? 1 : n;
21
+ }
22
+ //#endregion
23
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarYears.js
24
+ function x(e, t, n) {
25
+ let [r, i] = o(n?.in, e, t);
26
+ return r.getFullYear() - i.getFullYear();
27
+ }
28
+ //#endregion
29
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfDay.js
30
+ function S(e, t) {
31
+ let n = a(e, t?.in);
32
+ return n.setHours(23, 59, 59, 999), n;
33
+ }
34
+ //#endregion
35
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isLastDayOfMonth.js
36
+ function C(e, t) {
37
+ let n = a(e, t?.in);
38
+ return +S(n, t) == +c(n, t);
39
+ }
40
+ //#endregion
41
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInMonths.js
42
+ function w(e, t, n) {
43
+ let [r, i, a] = o(n?.in, e, e, t), c = b(i, a), l = Math.abs(s(i, a));
44
+ if (l < 1) return 0;
45
+ i.getMonth() === 1 && i.getDate() > 27 && i.setDate(30), i.setMonth(i.getMonth() - c * l);
46
+ let u = b(i, a) === -c;
47
+ C(r) && l === 1 && b(r, a) === 1 && (u = !1);
48
+ let d = c * (l - +u);
49
+ return d === 0 ? 0 : d;
50
+ }
51
+ //#endregion
52
+ //#region ../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInYears.js
53
+ function T(e, t, n) {
54
+ let [r, i] = o(n?.in, e, t), a = b(r, i), s = Math.abs(x(r, i));
55
+ r.setFullYear(1584), i.setFullYear(1584);
56
+ let c = a * (s - +(b(r, i) === -a));
57
+ return c === 0 ? 0 : c;
58
+ }
59
+ //#endregion
60
+ //#region lib/ui/criteria/CriteriaParticipants.tsx
61
+ var E = 6;
62
+ function D(e, t) {
63
+ return e.replace("{n}", String(t));
64
+ }
65
+ function O(e, t, n) {
66
+ if (t != null) {
67
+ let e = t.unit === "year" ? n.ageYear ?? "years" : n.ageMonths ?? "months";
68
+ return /* @__PURE__ */ v("span", {
69
+ className: "text-b5 font-normal",
70
+ children: `${t.value} ${e}`
71
+ });
72
+ }
73
+ if (e != null) {
74
+ let t = l(), r = T(t, e);
75
+ if (r > 0) return `${r} ${n.ageYear ?? "years"}`;
76
+ let i = w(t, e);
77
+ if (i > 0) return `${i} ${n.ageMonths ?? "months"}`;
78
+ }
79
+ return "";
80
+ }
81
+ var k = ({ label: e, description: t, addLabel: n, removeLabel: r, min: i, max: a, value: o, onChange: s }) => /* @__PURE__ */ v(f, {
82
+ controlled: !0,
83
+ description: t ?? void 0,
84
+ label: e,
85
+ labels: {
86
+ decrease: r,
87
+ increase: n,
88
+ input: t ? `${e} (${t})` : e
89
+ },
90
+ max: a,
91
+ min: i,
92
+ onChange: (e, t) => s(t),
93
+ value: o,
94
+ className: "w-full justify-between"
95
+ }), A = /* @__PURE__ */ v(_, {
96
+ "aria-hidden": !0,
97
+ name: "CrossOutlined",
98
+ width: "20px"
99
+ }), j = ({ label: e, ariaLabel: t, onClick: n, type: r, ageLabel: i }) => /* @__PURE__ */ y("button", {
100
+ "aria-label": t,
101
+ className: "rounded-32 border-black flex items-center justify-between gap-4 border px-12 py-6 text-b4 font-semibold",
102
+ onClick: n,
103
+ type: "button",
104
+ children: [/* @__PURE__ */ y("span", {
105
+ className: "flex items-center",
106
+ children: [
107
+ r === "adult" ? /* @__PURE__ */ v(_, {
108
+ name: "PeopleSingle",
109
+ width: "24px"
110
+ }) : /* @__PURE__ */ v(_, {
111
+ name: "PeopleKids",
112
+ width: "24px"
113
+ }),
114
+ e,
115
+ i && /* @__PURE__ */ y("span", {
116
+ className: "ms-4 text-b5 font-normal",
117
+ children: [
118
+ "(",
119
+ i,
120
+ ")"
121
+ ]
122
+ })
123
+ ]
124
+ }), A]
125
+ }), M = ({ onReset: e, onApply: t, resetLabel: r, applyLabel: i, withSpacer: a }) => !e && !t ? null : /* @__PURE__ */ y("div", {
126
+ className: "flex items-center justify-between",
127
+ children: [e && r ? /* @__PURE__ */ v("button", {
128
+ className: "text-b3 cursor-pointer font-semibold underline",
129
+ onClick: e,
130
+ type: "button",
131
+ children: r
132
+ }) : a ? /* @__PURE__ */ v("span", {}) : null, t && i && /* @__PURE__ */ v(n, {
133
+ color: "saffron",
134
+ onClick: t,
135
+ children: i
136
+ })]
137
+ }), N = ({ title: e, description: n, contacts: a, labels: o }) => {
138
+ let [s, c] = g(!1);
139
+ return /* @__PURE__ */ y("div", {
140
+ className: "rounded-16 border-lightGrey space-y-12 border bg-white p-12",
141
+ children: [
142
+ /* @__PURE__ */ y("p", {
143
+ className: "text-b3 flex items-center gap-12 font-semibold",
144
+ children: [/* @__PURE__ */ v(i, {
145
+ color: "sienna",
146
+ icon: "Error",
147
+ size: "size-48",
148
+ theme: "solid"
149
+ }), e]
150
+ }),
151
+ /* @__PURE__ */ v(t, {
152
+ isExpanded: s,
153
+ children: /* @__PURE__ */ y("div", {
154
+ className: "space-y-20 pb-4",
155
+ children: [/* @__PURE__ */ v("p", { children: n }), a.length > 0 && /* @__PURE__ */ v("div", { children: a.map(({ description: e, href: t, icon: n, target: a, title: o }) => /* @__PURE__ */ y("a", {
156
+ className: "mb-20 flex gap-12",
157
+ href: t,
158
+ rel: "noreferrer",
159
+ target: a,
160
+ children: [/* @__PURE__ */ v(i, {
161
+ color: "black",
162
+ icon: n,
163
+ size: "size-48",
164
+ theme: "outline"
165
+ }), /* @__PURE__ */ y("div", {
166
+ className: "space-y-8 font-sans",
167
+ children: [/* @__PURE__ */ v("p", {
168
+ className: "text-b3 font-semibold",
169
+ children: o
170
+ }), e && /* @__PURE__ */ v(r, {
171
+ className: "text-b4",
172
+ text: e
173
+ })]
174
+ })]
175
+ }, o)) })]
176
+ })
177
+ }),
178
+ /* @__PURE__ */ v("button", {
179
+ className: "text-b4 cursor-pointer underline",
180
+ onClick: () => c((e) => !e),
181
+ type: "button",
182
+ children: s ? o.reduce : o.expand
183
+ })
184
+ ]
185
+ });
186
+ }, P = ({ adultsCount: r, maxAdults: i, minAdults: a, birthdates: o, childAges: s, childrenCount: c, className: f, labels: _, maxAuthorizedBirthdate: b, maxChildren: x, maxTotalParticipants: S = E, minAuthorizedBirthdate: C, minChildren: w, onChange: T, onLimitDisplay: A, onReset: P, onApply: F, title: I, variant: L = "card", withChildren: R = !0, childrenFlow: z = "age-or-birthdate-with-apply" }) => {
187
+ let B = L === "card", V = r + c >= S, H = h(V);
188
+ m(() => {
189
+ V && !H.current && A?.(), H.current = V;
190
+ }, [V, A]);
191
+ let [U, W] = g(!1), [G, K] = g("year"), [q, J] = g(() => Array(c).fill("")), [Y, ee] = g(!0);
192
+ m(() => {
193
+ J((e) => c > e.length ? [...e, ...Array(c - e.length).fill("")] : e.slice(0, c));
194
+ }, [c]);
195
+ let te = z !== "birthdate-only", ne = z === "age-or-birthdate-with-apply", X = z === "age-or-birthdate-with-apply", Z = R && te && !!_.enterDateOfBirth, re = R && ne && !!_.participantDetails && (r > 0 || c > 0), Q = /* @__PURE__ */ v(k, {
196
+ addLabel: _.addAdult,
197
+ description: _.adultsDescription,
198
+ label: _.adults,
199
+ max: i,
200
+ min: a,
201
+ onChange: (e) => T({
202
+ type: "adultsCount",
203
+ payload: e
204
+ }),
205
+ removeLabel: _.removeAdult,
206
+ value: r
207
+ }), ie = o.length > 0 && /* @__PURE__ */ v("div", {
208
+ className: B ? "space-y-12" : "grid grid-cols-1 gap-20 md:grid-cols-2 md:gap-x-20",
209
+ children: o.map((e, t) => /* @__PURE__ */ v(u, {
210
+ label: _.childBirthdate.replace("{n}", String(t + 1)),
211
+ value: e,
212
+ min: C ?? l(),
213
+ max: b,
214
+ invalidDateErrorMessage: _.childBirthdateInvalidDateError,
215
+ minDateErrorMessage: _.childBirthdateMinAgeError,
216
+ maxDateErrorMessage: _.childBirthdateMaxAgeError,
217
+ onChange: (e, n) => T({
218
+ type: "birthdate",
219
+ payload: {
220
+ date: n,
221
+ index: t
222
+ }
223
+ })
224
+ }, t))
225
+ }), ae = !U && c > 0 && /* @__PURE__ */ y("div", {
226
+ className: "space-y-12",
227
+ children: [_.ageQuestion && /* @__PURE__ */ v("p", {
228
+ className: "text-b4",
229
+ children: _.ageQuestion
230
+ }), Array.from({ length: c }, (e, t) => /* @__PURE__ */ y("div", {
231
+ className: "space-y-4",
232
+ children: [/* @__PURE__ */ v("p", {
233
+ className: "text-b3 font-semibold px-20",
234
+ children: _.childLabel ? D(_.childLabel, t + 1) : `Child ${t + 1}`
235
+ }), /* @__PURE__ */ y("div", {
236
+ className: "flex items-center gap-12",
237
+ children: [
238
+ /* @__PURE__ */ v("input", {
239
+ "aria-label": _.childLabel ? D(_.childLabel, t + 1) : `Child ${t + 1} age`,
240
+ className: "rounded-pill border-lightGrey h-48 w-80 border px-20 text-b3 font-semibold",
241
+ min: 0,
242
+ onChange: (e) => {
243
+ let n = [...q];
244
+ n[t] = e.target.value, J(n);
245
+ },
246
+ type: "number",
247
+ value: q[t] ?? ""
248
+ }),
249
+ _.ageYear && _.ageMonths && /* @__PURE__ */ v(d, {
250
+ size: "small",
251
+ index: G === "year" ? 0 : 1,
252
+ items: [{
253
+ id: "year",
254
+ color: "saffron",
255
+ label: _.ageYear
256
+ }, {
257
+ id: "month",
258
+ color: "saffron",
259
+ label: _.ageMonths
260
+ }],
261
+ onClick: (e) => K(e === 0 ? "year" : "month")
262
+ }),
263
+ _.ageApply && /* @__PURE__ */ v(n, {
264
+ color: "black",
265
+ size: "tertiary",
266
+ onClick: () => {
267
+ let e = Number(q[t]);
268
+ T({
269
+ type: "childAge",
270
+ payload: {
271
+ index: t,
272
+ value: Number.isFinite(e) && e >= 0 ? e : null,
273
+ unit: G
274
+ }
275
+ });
276
+ },
277
+ children: _.ageApply
278
+ })
279
+ ]
280
+ })]
281
+ }, t))]
282
+ }), oe = re && /* @__PURE__ */ y("div", {
283
+ className: "space-y-8",
284
+ children: [/* @__PURE__ */ y("button", {
285
+ "aria-expanded": Y,
286
+ className: "flex w-full cursor-pointer items-center justify-between border-b border-lightGrey pb-4",
287
+ onClick: () => ee((e) => !e),
288
+ type: "button",
289
+ children: [/* @__PURE__ */ v("span", {
290
+ className: "text-b4",
291
+ children: _.participantDetails
292
+ }), /* @__PURE__ */ v("svg", {
293
+ "aria-hidden": !0,
294
+ className: e("size-20 transition-transform", { "rotate-180": Y }),
295
+ fill: "none",
296
+ stroke: "currentColor",
297
+ strokeWidth: 2,
298
+ viewBox: "0 0 24 24",
299
+ children: /* @__PURE__ */ v("path", {
300
+ d: "M6 9l6 6 6-6",
301
+ strokeLinecap: "round",
302
+ strokeLinejoin: "round"
303
+ })
304
+ })]
305
+ }), /* @__PURE__ */ v(t, {
306
+ isExpanded: Y,
307
+ children: /* @__PURE__ */ y("div", {
308
+ className: "grid grid-cols-2 gap-8",
309
+ children: [Array.from({ length: r }, (e, t) => /* @__PURE__ */ v(j, {
310
+ ariaLabel: _.removeParticipant,
311
+ label: _.adultLabel ? D(_.adultLabel, t + 1) : `Adult ${t + 1}`,
312
+ onClick: () => T({
313
+ type: "adultsCount",
314
+ payload: r - 1
315
+ }),
316
+ type: "adult"
317
+ }, `adult-${t}`)), Array.from({ length: c }, (e, t) => {
318
+ let n = O(o[t], s?.[t], _), r = _.childLabel ? D(_.childLabel, t + 1) : `Child ${t + 1}`;
319
+ return /* @__PURE__ */ v(j, {
320
+ ageLabel: n || void 0,
321
+ ariaLabel: _.removeParticipant,
322
+ label: r,
323
+ onClick: () => T({
324
+ type: "childrenCount",
325
+ payload: c - 1
326
+ }),
327
+ type: "child"
328
+ }, `child-${t}`);
329
+ })]
330
+ })
331
+ })]
332
+ }), $ = R && /* @__PURE__ */ y("div", {
333
+ className: "space-y-8",
334
+ children: [
335
+ /* @__PURE__ */ v(k, {
336
+ addLabel: _.addChild,
337
+ description: _.childrenAgeLimit,
338
+ label: _.children,
339
+ max: x,
340
+ min: w,
341
+ onChange: (e) => T({
342
+ type: "childrenCount",
343
+ payload: e
344
+ }),
345
+ removeLabel: _.removeChild,
346
+ value: c
347
+ }),
348
+ /* @__PURE__ */ v(t, {
349
+ isExpanded: Z && c > 0 || !Z && o.length > 0,
350
+ children: /* @__PURE__ */ y("div", {
351
+ className: "border-lightGrey space-y-12 border-t pt-12",
352
+ children: [Z && /* @__PURE__ */ y("div", {
353
+ className: "flex items-center justify-between",
354
+ children: [/* @__PURE__ */ v("p", {
355
+ className: "text-b3 font-semibold",
356
+ children: _.enterDateOfBirth
357
+ }), /* @__PURE__ */ v(p, {
358
+ checked: U,
359
+ onChange: (e, t) => W(t)
360
+ })]
361
+ }), U || !Z ? ie : ae]
362
+ })
363
+ }),
364
+ oe
365
+ ]
366
+ });
367
+ return B ? /* @__PURE__ */ y("div", {
368
+ className: e("rounded-16 border-lightGrey flex flex-col gap-20 border bg-white p-20", f),
369
+ children: [/* @__PURE__ */ y("div", {
370
+ className: "rounded-16 bg-lightSand space-y-8 p-20",
371
+ children: [
372
+ I && /* @__PURE__ */ v("p", {
373
+ className: "text-b2 font-semibold",
374
+ children: I
375
+ }),
376
+ V && _.limit && /* @__PURE__ */ v(N, { ..._.limit }),
377
+ /* @__PURE__ */ v("div", {
378
+ className: "rounded-16 bg-white p-12",
379
+ children: Q
380
+ }),
381
+ $ && /* @__PURE__ */ v("div", {
382
+ className: "rounded-16 bg-white p-12",
383
+ children: $
384
+ })
385
+ ]
386
+ }), /* @__PURE__ */ v(M, {
387
+ applyLabel: _.apply,
388
+ onApply: X ? F : void 0,
389
+ onReset: P,
390
+ resetLabel: _.reset,
391
+ withSpacer: !0
392
+ })]
393
+ }) : /* @__PURE__ */ y("div", {
394
+ className: e("space-y-20", f),
395
+ children: [
396
+ I && /* @__PURE__ */ v("p", {
397
+ className: "text-b2 font-semibold",
398
+ children: I
399
+ }),
400
+ V && _.limit && /* @__PURE__ */ v(N, { ..._.limit }),
401
+ Q,
402
+ $,
403
+ /* @__PURE__ */ v(M, {
404
+ applyLabel: _.apply,
405
+ onApply: X ? F : void 0,
406
+ onReset: P,
407
+ resetLabel: _.reset
408
+ })
409
+ ]
410
+ });
411
+ };
412
+ //#endregion
413
+ export { P as t };
414
+
415
+ //# sourceMappingURL=CriteriaParticipants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CriteriaParticipants.js","names":[],"sources":["../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/compareAsc.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarYears.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfDay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isLastDayOfMonth.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInMonths.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInYears.js","../../lib/ui/criteria/CriteriaParticipants.tsx"],"sourcesContent":["import { toDate } from \"./toDate.js\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n const diff = +toDate(dateLeft) - +toDate(dateRight);\n\n if (diff < 0) return -1;\n else if (diff > 0) return 1;\n\n // Return 0 if diff is 0; return NaN if diff is NaN\n return diff;\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarYears} function options.\n */\n\n/**\n * @name differenceInCalendarYears\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n\n * @returns The number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInCalendarYears(\n * new Date(2015, 1, 11),\n * new Date(2013, 11, 31)\n * );\n * //=> 2\n */\nexport function differenceInCalendarYears(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return laterDate_.getFullYear() - earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarYears;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfDay} function options.\n */\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { endOfDay } from \"./endOfDay.js\";\nimport { endOfMonth } from \"./endOfMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @param date - The date to check\n * @param options - An object with options\n *\n * @returns The date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * const result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nexport function isLastDayOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n return +endOfDay(_date, options) === +endOfMonth(_date, options);\n}\n\n// Fallback for modularized imports:\nexport default isLastDayOfMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarMonths } from \"./differenceInCalendarMonths.js\";\nimport { isLastDayOfMonth } from \"./isLastDayOfMonth.js\";\n\n/**\n * The {@link differenceInMonths} function options.\n */\n\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\nexport function differenceInMonths(laterDate, earlierDate, options) {\n const [laterDate_, workingLaterDate, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n laterDate,\n earlierDate,\n );\n\n const sign = compareAsc(workingLaterDate, earlierDate_);\n const difference = Math.abs(\n differenceInCalendarMonths(workingLaterDate, earlierDate_),\n );\n\n if (difference < 1) return 0;\n\n if (workingLaterDate.getMonth() === 1 && workingLaterDate.getDate() > 27)\n workingLaterDate.setDate(30);\n\n workingLaterDate.setMonth(workingLaterDate.getMonth() - sign * difference);\n\n let isLastMonthNotFull = compareAsc(workingLaterDate, earlierDate_) === -sign;\n\n if (\n isLastDayOfMonth(laterDate_) &&\n difference === 1 &&\n compareAsc(laterDate_, earlierDate_) === 1\n ) {\n isLastMonthNotFull = false;\n }\n\n const result = sign * (difference - +isLastMonthNotFull);\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInMonths;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarYears } from \"./differenceInCalendarYears.js\";\n\n/**\n * The {@link differenceInYears} function options.\n */\n\n/**\n * @name differenceInYears\n * @category Year Helpers\n * @summary Get the number of full years between the given dates.\n *\n * @description\n * Get the number of full years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full years\n *\n * @example\n * // How many full years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31))\n * //=> 1\n */\nexport function differenceInYears(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n // -1 if the left date is earlier than the right date\n // 2023-12-31 - 2024-01-01 = -1\n const sign = compareAsc(laterDate_, earlierDate_);\n\n // First calculate the difference in calendar years\n // 2024-01-01 - 2023-12-31 = 1 year\n const diff = Math.abs(differenceInCalendarYears(laterDate_, earlierDate_));\n\n // Now we need to calculate if the difference is full. To do that we set\n // both dates to the same year and check if the both date's month and day\n // form a full year.\n laterDate_.setFullYear(1584);\n earlierDate_.setFullYear(1584);\n\n // For it to be true, when the later date is indeed later than the earlier date\n // (2026-02-01 - 2023-12-10 = 3 years), the difference is full if\n // the normalized later date is also later than the normalized earlier date.\n // In our example, 1584-02-01 is earlier than 1584-12-10, so the difference\n // is partial, hence we need to subtract 1 from the difference 3 - 1 = 2.\n const partial = compareAsc(laterDate_, earlierDate_) === -sign;\n\n const result = sign * (diff - +partial);\n\n // Prevent negative zero\n return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInYears;\n","'use client';\nimport clsx from 'clsx';\nimport { differenceInMonths, differenceInYears, startOfToday } from 'date-fns';\nimport {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type Dispatch,\n type FunctionComponent,\n type ReactNode,\n} from 'react';\n\nimport { Icon } from '@clubmed/trident-icons';\nimport { Chip } from '../Chip';\nimport { ElasticHeight } from '../ElasticHeight';\nimport { Prose } from '../Prose';\nimport { Toggle } from '../Toggle';\nimport { Button } from '../buttons/Button';\nimport { NumberField } from '../forms/NumberField';\nimport { Switch } from '../forms/Switch';\nimport { Birthdate } from './Birthdate';\n\nexport interface ParticipantsLimitContact {\n description: string | null;\n href: string;\n icon: string;\n target: string;\n title: string;\n}\n\nexport interface ParticipantsLimitLabels {\n expand: string;\n reduce: string;\n}\n\nexport interface ParticipantsLimit {\n title: string;\n description: string;\n contacts: ParticipantsLimitContact[];\n labels: ParticipantsLimitLabels;\n}\n\nexport interface CriteriaParticipantsLabels {\n addAdult: string;\n addChild: string;\n adults: string;\n adultsDescription?: string | null;\n children: string;\n childrenAgeLimit: string;\n childBirthdate: string;\n childBirthdateInvalidDateError: string;\n childBirthdateMaxAgeError: string;\n childBirthdateMinAgeError: string;\n limit?: ParticipantsLimit;\n removeAdult: string;\n removeChild: string;\n /** Label for the \"Enter date of birth\" toggle. When omitted the age entry section is hidden. */\n enterDateOfBirth?: string;\n /** Question shown above per-child age inputs in year mode */\n ageQuestion?: string;\n /** \"Year\" tab label in the year/months toggle */\n ageYear?: string;\n /** \"Months\" tab label in the year/months toggle */\n ageMonths?: string;\n /** \"Apply\" button label for confirming a child's age */\n ageApply?: string;\n /** \"Participant Details\" section title. When omitted the summary section is hidden. */\n participantDetails?: string;\n /** Template for adult chip labels – use {n} for 1-based index, e.g. \"Adult {n}\" */\n adultLabel?: string;\n /** Template for child chip labels – use {n} for 1-based index, e.g. \"Child {n}\" */\n childLabel?: string;\n /** aria-label for chip remove buttons */\n removeParticipant?: string;\n /** \"Reset\" link label */\n reset?: string;\n /** \"Continue\" button label */\n apply?: string;\n}\n\nexport type CriteriaParticipantsAction =\n | { type: 'adultsCount'; payload: number }\n | { type: 'childrenCount'; payload: number }\n | { type: 'birthdate'; payload: { date: Date | null; index: number } }\n | { type: 'childAge'; payload: { index: number; value: number | null; unit: 'year' | 'month' } };\n\nexport interface CriteriaParticipantsProps {\n labels: CriteriaParticipantsLabels;\n title?: string;\n /** card (default): white outer card with sand inner. flat: no background, fields rendered directly */\n variant?: 'card' | 'flat';\n adultsCount: number;\n minAdults?: number;\n maxAdults?: number;\n withChildren?: boolean;\n childrenCount: number;\n minChildren?: number;\n maxChildren?: number;\n /** Total adults + children at which the limit banner appears (default 6) */\n maxTotalParticipants?: number;\n minAuthorizedBirthdate?: Date;\n maxAuthorizedBirthdate: Date;\n birthdates: Array<Date | null | undefined>;\n /** Applied child ages for year/month mode. One entry per child. */\n childAges?: Array<{ value: number; unit: 'year' | 'month' } | null | undefined>;\n className?: string;\n onChange: Dispatch<CriteriaParticipantsAction>;\n onLimitDisplay?: () => void;\n onReset?: () => void;\n onApply?: () => void;\n /** Controls the children age-entry UX and when onChange fires */\n childrenFlow?: 'birthdate-only' | 'age-or-birthdate' | 'age-or-birthdate-with-apply';\n}\n\nconst DEFAULT_MAX_TOTAL = 6;\n\nfunction interpolate(template: string, n: number): string {\n return template.replace('{n}', String(n));\n}\n\nfunction computeAgeLabel(\n birthdate: Date | null | undefined,\n childAge: { value: number; unit: 'year' | 'month' } | null | undefined,\n labels: CriteriaParticipantsLabels,\n): ReactNode {\n if (childAge != null) {\n const unit =\n childAge.unit === 'year' ? labels.ageYear ?? 'years' : labels.ageMonths ?? 'months';\n return <span className=\"text-b5 font-normal\">{`${childAge.value} ${unit}`}</span>;\n }\n if (birthdate != null) {\n const today = startOfToday();\n const years = differenceInYears(today, birthdate);\n if (years > 0) return `${years} ${labels.ageYear ?? 'years'}`;\n const months = differenceInMonths(today, birthdate);\n if (months > 0) return `${months} ${labels.ageMonths ?? 'months'}`;\n }\n return '';\n}\n\nconst ParticipantNumberField: FunctionComponent<{\n label: string;\n description?: string | null;\n addLabel: string;\n removeLabel: string;\n min?: number;\n max?: number;\n value: number;\n onChange: (value: number) => void;\n}> = ({ label, description, addLabel, removeLabel, min, max, value, onChange }) => (\n <NumberField\n controlled\n description={description ?? undefined}\n label={label}\n labels={{\n decrease: removeLabel,\n increase: addLabel,\n input: description ? `${label} (${description})` : label,\n }}\n max={max}\n min={min}\n onChange={(_, v) => onChange(v)}\n value={value}\n className=\"w-full justify-between\"\n />\n);\n\nconst closeIcon = <Icon aria-hidden name=\"CrossOutlined\" width=\"20px\" />;\n\nconst ParticipantChip: FunctionComponent<{\n label: string;\n ariaLabel?: string;\n onClick: () => void;\n type: 'adult' | 'child';\n ageLabel?: ReactNode;\n}> = ({ label, ariaLabel, onClick, type, ageLabel }) => (\n <button\n aria-label={ariaLabel}\n className=\"rounded-32 border-black flex items-center justify-between gap-4 border px-12 py-6 text-b4 font-semibold\"\n onClick={onClick}\n type=\"button\"\n >\n <span className=\"flex items-center\">\n {type === 'adult' ? (\n <Icon name=\"PeopleSingle\" width=\"24px\" />\n ) : (\n <Icon name=\"PeopleKids\" width=\"24px\" />\n )}\n {label}\n {ageLabel && <span className=\"ms-4 text-b5 font-normal\">({ageLabel})</span>}\n </span>\n {closeIcon}\n </button>\n);\n\nconst Footer: FunctionComponent<{\n onReset?: () => void;\n onApply?: () => void;\n resetLabel?: string;\n applyLabel?: string;\n withSpacer?: boolean;\n}> = ({ onReset, onApply, resetLabel, applyLabel, withSpacer }) => {\n if (!onReset && !onApply) return null;\n return (\n <div className=\"flex items-center justify-between\">\n {onReset && resetLabel ? (\n <button\n className=\"text-b3 cursor-pointer font-semibold underline\"\n onClick={onReset}\n type=\"button\"\n >\n {resetLabel}\n </button>\n ) : withSpacer ? (\n <span />\n ) : null}\n {onApply && applyLabel && (\n <Button color=\"saffron\" onClick={onApply}>\n {applyLabel}\n </Button>\n )}\n </div>\n );\n};\n\nconst LimitInformation: FunctionComponent<ParticipantsLimit> = ({\n title,\n description,\n contacts,\n labels,\n}) => {\n const [expanded, setExpanded] = useState(false);\n return (\n <div className=\"rounded-16 border-lightGrey space-y-12 border bg-white p-12\">\n <p className=\"text-b3 flex items-center gap-12 font-semibold\">\n <Chip color=\"sienna\" icon=\"Error\" size=\"size-48\" theme=\"solid\" />\n {title}\n </p>\n <ElasticHeight isExpanded={expanded}>\n <div className=\"space-y-20 pb-4\">\n <p>{description}</p>\n {contacts.length > 0 && (\n <div>\n {contacts.map(({ description, href, icon, target, title }) => (\n <a\n key={title}\n className=\"mb-20 flex gap-12\"\n href={href}\n rel=\"noreferrer\"\n target={target}\n >\n <Chip color=\"black\" icon={icon as never} size=\"size-48\" theme=\"outline\" />\n <div className=\"space-y-8 font-sans\">\n <p className=\"text-b3 font-semibold\">{title}</p>\n {description && <Prose className=\"text-b4\" text={description} />}\n </div>\n </a>\n ))}\n </div>\n )}\n </div>\n </ElasticHeight>\n <button\n className=\"text-b4 cursor-pointer underline\"\n onClick={() => setExpanded((v) => !v)}\n type=\"button\"\n >\n {expanded ? labels.reduce : labels.expand}\n </button>\n </div>\n );\n};\n\nexport const CriteriaParticipants: FunctionComponent<CriteriaParticipantsProps> = ({\n adultsCount,\n maxAdults,\n minAdults,\n birthdates,\n childAges,\n childrenCount,\n className,\n labels,\n maxAuthorizedBirthdate,\n maxChildren,\n maxTotalParticipants = DEFAULT_MAX_TOTAL,\n minAuthorizedBirthdate,\n minChildren,\n onChange,\n onLimitDisplay,\n onReset,\n onApply,\n title,\n variant = 'card',\n withChildren = true,\n childrenFlow = 'age-or-birthdate-with-apply',\n}) => {\n const isCard = variant === 'card';\n\n // Derived from props — no state needed\n const limitExceeded = adultsCount + childrenCount >= maxTotalParticipants;\n\n // Fire onLimitDisplay only on the first transition to exceeded\n const prevLimitExceeded = useRef(limitExceeded);\n useEffect(() => {\n if (limitExceeded && !prevLimitExceeded.current) {\n onLimitDisplay?.();\n }\n prevLimitExceeded.current = limitExceeded;\n }, [limitExceeded, onLimitDisplay]);\n\n const [useBirthdate, setUseBirthdate] = useState(false);\n const [ageUnit, setAgeUnit] = useState<'year' | 'month'>('year');\n const [draftAges, setDraftAges] = useState<Array<string>>(() => Array(childrenCount).fill(''));\n const [detailsExpanded, setDetailsExpanded] = useState(true);\n\n // Keep draftAges length in sync with childrenCount\n useEffect(() => {\n setDraftAges((prev) =>\n childrenCount > prev.length\n ? [...prev, ...Array(childrenCount - prev.length).fill('')]\n : prev.slice(0, childrenCount),\n );\n }, [childrenCount]);\n\n const showBirthdateToggle = childrenFlow !== 'birthdate-only';\n const showParticipantChips = childrenFlow === 'age-or-birthdate-with-apply';\n const showApplyButton = childrenFlow === 'age-or-birthdate-with-apply';\n\n const hasAgeEntrySection = withChildren && showBirthdateToggle && !!labels.enterDateOfBirth;\n const hasParticipantSummary =\n withChildren &&\n showParticipantChips &&\n !!labels.participantDetails &&\n (adultsCount > 0 || childrenCount > 0);\n\n const adultsField = (\n <ParticipantNumberField\n addLabel={labels.addAdult}\n description={labels.adultsDescription}\n label={labels.adults}\n max={maxAdults}\n min={minAdults}\n onChange={(value) => onChange({ type: 'adultsCount', payload: value })}\n removeLabel={labels.removeAdult}\n value={adultsCount}\n />\n );\n\n const birthdateFields = birthdates.length > 0 && (\n <div className={isCard ? 'space-y-12' : 'grid grid-cols-1 gap-20 md:grid-cols-2 md:gap-x-20'}>\n {birthdates.map((birthdate, index) => (\n <Birthdate\n key={index}\n label={labels.childBirthdate.replace('{n}', String(index + 1))}\n value={birthdate}\n min={minAuthorizedBirthdate ?? startOfToday()}\n max={maxAuthorizedBirthdate}\n invalidDateErrorMessage={labels.childBirthdateInvalidDateError}\n minDateErrorMessage={labels.childBirthdateMinAgeError}\n maxDateErrorMessage={labels.childBirthdateMaxAgeError}\n onChange={(_, value) => onChange({ type: 'birthdate', payload: { date: value, index } })}\n />\n ))}\n </div>\n );\n\n const yearFields = !useBirthdate && childrenCount > 0 && (\n <div className=\"space-y-12\">\n {labels.ageQuestion && <p className=\"text-b4\">{labels.ageQuestion}</p>}\n {Array.from({ length: childrenCount }, (_, index) => (\n <div key={index} className=\"space-y-4\">\n <p className=\"text-b3 font-semibold px-20\">\n {labels.childLabel ? interpolate(labels.childLabel, index + 1) : `Child ${index + 1}`}\n </p>\n <div className=\"flex items-center gap-12\">\n <input\n aria-label={\n labels.childLabel\n ? interpolate(labels.childLabel, index + 1)\n : `Child ${index + 1} age`\n }\n className=\"rounded-pill border-lightGrey h-48 w-80 border px-20 text-b3 font-semibold\"\n min={0}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const next = [...draftAges];\n next[index] = e.target.value;\n setDraftAges(next);\n }}\n type=\"number\"\n value={draftAges[index] ?? ''}\n />\n {labels.ageYear && labels.ageMonths && (\n <Toggle\n size=\"small\"\n index={ageUnit === 'year' ? 0 : 1}\n items={[\n { id: 'year', color: 'saffron', label: labels.ageYear },\n { id: 'month', color: 'saffron', label: labels.ageMonths },\n ]}\n onClick={(i) => setAgeUnit(i === 0 ? 'year' : 'month')}\n />\n )}\n {labels.ageApply && (\n <Button\n color=\"black\"\n size=\"tertiary\"\n onClick={() => {\n const parsed = Number(draftAges[index]);\n onChange({\n type: 'childAge',\n payload: {\n index,\n value: Number.isFinite(parsed) && parsed >= 0 ? parsed : null,\n unit: ageUnit,\n },\n });\n }}\n >\n {labels.ageApply}\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n\n const participantSummary = hasParticipantSummary && (\n <div className=\"space-y-8\">\n <button\n aria-expanded={detailsExpanded}\n className=\"flex w-full cursor-pointer items-center justify-between border-b border-lightGrey pb-4\"\n onClick={() => setDetailsExpanded((v) => !v)}\n type=\"button\"\n >\n <span className=\"text-b4\">{labels.participantDetails}</span>\n <svg\n aria-hidden\n className={clsx('size-20 transition-transform', { 'rotate-180': detailsExpanded })}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M6 9l6 6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <ElasticHeight isExpanded={detailsExpanded}>\n <div className=\"grid grid-cols-2 gap-8\">\n {Array.from({ length: adultsCount }, (_, i) => (\n <ParticipantChip\n key={`adult-${i}`}\n ariaLabel={labels.removeParticipant}\n label={labels.adultLabel ? interpolate(labels.adultLabel, i + 1) : `Adult ${i + 1}`}\n onClick={() => onChange({ type: 'adultsCount', payload: adultsCount - 1 })}\n type=\"adult\"\n />\n ))}\n {Array.from({ length: childrenCount }, (_, i) => {\n const ageLabel = computeAgeLabel(birthdates[i], childAges?.[i], labels);\n const name = labels.childLabel\n ? interpolate(labels.childLabel, i + 1)\n : `Child ${i + 1}`;\n return (\n <ParticipantChip\n key={`child-${i}`}\n ageLabel={ageLabel || undefined}\n ariaLabel={labels.removeParticipant}\n label={name}\n onClick={() => onChange({ type: 'childrenCount', payload: childrenCount - 1 })}\n type=\"child\"\n />\n );\n })}\n </div>\n </ElasticHeight>\n </div>\n );\n\n const childrenSection = withChildren && (\n <div className=\"space-y-8\">\n <ParticipantNumberField\n addLabel={labels.addChild}\n description={labels.childrenAgeLimit}\n label={labels.children}\n max={maxChildren}\n min={minChildren}\n onChange={(value) => onChange({ type: 'childrenCount', payload: value })}\n removeLabel={labels.removeChild}\n value={childrenCount}\n />\n <ElasticHeight\n isExpanded={\n (hasAgeEntrySection && childrenCount > 0) ||\n (!hasAgeEntrySection && birthdates.length > 0)\n }\n >\n <div className=\"border-lightGrey space-y-12 border-t pt-12\">\n {hasAgeEntrySection && (\n <div className=\"flex items-center justify-between\">\n <p className=\"text-b3 font-semibold\">{labels.enterDateOfBirth}</p>\n <Switch checked={useBirthdate} onChange={(_, val) => setUseBirthdate(val)} />\n </div>\n )}\n {useBirthdate || !hasAgeEntrySection ? birthdateFields : yearFields}\n </div>\n </ElasticHeight>\n {participantSummary}\n </div>\n );\n\n if (!isCard) {\n return (\n <div className={clsx('space-y-20', className)}>\n {title && <p className=\"text-b2 font-semibold\">{title}</p>}\n {limitExceeded && labels.limit && <LimitInformation {...labels.limit} />}\n {adultsField}\n {childrenSection}\n <Footer\n applyLabel={labels.apply}\n onApply={showApplyButton ? onApply : undefined}\n onReset={onReset}\n resetLabel={labels.reset}\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(\n 'rounded-16 border-lightGrey flex flex-col gap-20 border bg-white p-20',\n className,\n )}\n >\n <div className=\"rounded-16 bg-lightSand space-y-8 p-20\">\n {title && <p className=\"text-b2 font-semibold\">{title}</p>}\n {limitExceeded && labels.limit && <LimitInformation {...labels.limit} />}\n <div className=\"rounded-16 bg-white p-12\">{adultsField}</div>\n {childrenSection && <div className=\"rounded-16 bg-white p-12\">{childrenSection}</div>}\n </div>\n <Footer\n applyLabel={labels.apply}\n onApply={showApplyButton ? onApply : undefined}\n onReset={onReset}\n resetLabel={labels.reset}\n withSpacer\n />\n </div>\n );\n};\n"],"x_google_ignoreList":[0,1,2,3,4,5],"mappings":"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"}