impact-nova 1.6.2 → 1.6.4

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 (26) hide show
  1. package/dist/components/ui/accordion-nested-list/accordion-nested-list.js +7 -7
  2. package/dist/components/ui/accordion.d.ts +0 -1
  3. package/dist/components/ui/accordion.js +22 -25
  4. package/dist/components/ui/ag-grid-react/index.js +38 -35
  5. package/dist/components/ui/ag-grid-react/process-backend-columndefs.js +10 -10
  6. package/dist/components/ui/ag-grid-react/value-formatters.js +18 -18
  7. package/dist/components/ui/calendar.js +255 -247
  8. package/dist/components/ui/chart/chart.js +103 -94
  9. package/dist/components/ui/data-table/data-table.d.ts +0 -4
  10. package/dist/components/ui/data-table/data-table.js +94 -60
  11. package/dist/components/ui/date-picker/date-picker.js +90 -81
  12. package/dist/components/ui/date-picker/date-range-picker.js +144 -130
  13. package/dist/components/ui/date-picker/week-range-picker.js +157 -143
  14. package/dist/components/ui/filter-strip/filter-summary.js +161 -234
  15. package/dist/components/ui/filter-strip/filter-tag-list.js +97 -124
  16. package/dist/components/ui/horizontal-scroller/horizontal-scroller.js +29 -29
  17. package/dist/components/ui/select/select.js +536 -508
  18. package/dist/components/ui/sheet.js +71 -94
  19. package/dist/components/ui/statistics-card.d.ts +4 -10
  20. package/dist/components/ui/statistics-card.hooks.d.ts +2 -0
  21. package/dist/components/ui/statistics-card.hooks.js +26 -24
  22. package/dist/components/ui/statistics-card.js +103 -102
  23. package/dist/components/ui/types/chart.types.d.ts +1 -0
  24. package/dist/components/ui/types/statistics-card.types.d.ts +1 -1
  25. package/dist/impact-nova.css +1 -1
  26. package/package.json +1 -1
@@ -1,219 +1,233 @@
1
1
  import { jsxs as h, jsx as s } from "react/jsx-runtime";
2
- import * as r from "react";
3
- import { X as De } from "lucide-react";
4
- import { CalendarMonth as ye, Info as Re } from "../../../icons/index.js";
5
- import { format as l, isValid as S, parse as N } from "date-fns";
6
- import { cn as C, padValidDateString as K, maskDate as Q } from "../../../lib/utils.js";
7
- import { Popover as Se, PopoverTrigger as Ne, PopoverContent as Ce } from "../popover.js";
8
- import { Calendar as Ie } from "../calendar.js";
9
- import { Tooltip as U, TooltipTrigger as Z, TooltipContent as $ } from "../tooltip.js";
10
- import { resolveWeekSelection as ve } from "../../../lib/fiscal-calendar.js";
11
- import { getDateFnsLocale as We } from "../../../i18n/getDateFnsLocale.js";
12
- import { useImpactNovaI18n as Pe } from "../../../i18n/ImpactNovaI18nContext.js";
13
- const c = (e) => e?.from ? e.to ? e.to.endDate : e.from.endDate : void 0, Ve = r.forwardRef(
2
+ import * as c from "react";
3
+ import { X as ye } from "lucide-react";
4
+ import { CalendarMonth as Re, Info as ve } from "../../../icons/index.js";
5
+ import { format as l, isValid as P, parse as S } from "date-fns";
6
+ import { cn as N, padValidDateString as U, maskDate as Z } from "../../../lib/utils.js";
7
+ import { Popover as Pe, PopoverTrigger as Se, PopoverContent as Ne } from "../popover.js";
8
+ import { Calendar as Ce } from "../calendar.js";
9
+ import { Tooltip as $, TooltipTrigger as Y, TooltipContent as _ } from "../tooltip.js";
10
+ import { resolveWeekSelection as Ie } from "../../../lib/fiscal-calendar.js";
11
+ import { getDateFnsLocale as Ee } from "../../../i18n/getDateFnsLocale.js";
12
+ import { useImpactNovaI18n as We } from "../../../i18n/ImpactNovaI18nContext.js";
13
+ const a = (t) => t?.from ? t.to ? t.to.endDate : t.from.endDate : void 0, Ve = c.forwardRef(
14
14
  ({
15
- value: e,
16
- onChange: x,
17
- format: t = "MM/dd/yyyy",
18
- placeholder: Y,
19
- minDate: _,
20
- maxDate: F,
21
- startMonth: ee,
22
- endMonth: te,
23
- showFooter: k = !0,
24
- calendarType: E = "calendar",
25
- fiscalMode: T = "basic",
26
- selectionMode: A = "week",
27
- fiscalMonthPattern: L,
15
+ value: t,
16
+ onChange: k,
17
+ format: n = "MM/dd/yyyy",
18
+ placeholder: F,
19
+ minDate: ee,
20
+ maxDate: te,
21
+ startMonth: ne,
22
+ endMonth: oe,
23
+ showFooter: D = !0,
24
+ calendarType: A = "calendar",
25
+ fiscalMode: L = "basic",
26
+ selectionMode: j = "week",
27
+ fiscalMonthPattern: K,
28
28
  fiscalYearStartMonth: M = 1,
29
- weekStartsOn: j = 1,
30
- disabled: D,
31
- className: ne,
32
- isError: I,
33
- size: B,
34
- label: O,
35
- helperText: z,
36
- required: oe,
37
- prefix: Ee,
38
- prefixClick: Te,
39
- ...le
40
- }, se) => {
41
- const { locale: H, t: P } = Pe(), o = r.useMemo(() => We(H), [H]), X = Y ?? P("datePicker.selectWeekRange"), q = r.useRef(null), re = r.useRef(null);
42
- r.useRef(null), r.useRef(null), r.useImperativeHandle(se, () => q.current);
43
- const [a, v] = r.useState(!1), [w, d] = r.useState(e), [y, f] = r.useState(e?.from ? l(e.from.startDate, t, { locale: o }) : ""), [R, p] = r.useState(c(e) ? l(c(e), t, { locale: o }) : ""), [ce, V] = r.useState(e?.from?.startDate || /* @__PURE__ */ new Date());
44
- r.useEffect(() => {
45
- a || (f(e?.from ? l(e.from.startDate, t, { locale: o }) : ""), p(c(e) ? l(c(e), t, { locale: o }) : ""), d(e));
46
- }, [e, t, a, o]), r.useEffect(() => {
47
- a && (d(e), f(e?.from ? l(e.from.startDate, t, { locale: o }) : ""), p(c(e) ? l(c(e), t, { locale: o }) : ""), V(e?.from?.startDate || /* @__PURE__ */ new Date()));
48
- }, [a, e, t, o]);
49
- const ie = (n) => {
50
- d(n), n?.from ? (f(l(n.from.startDate, t, { locale: o })), p(l(c(n), t, { locale: o }))) : (f(""), p("")), !k && n?.from && n?.to && n.from.startDate.getTime() !== n.to.startDate.getTime() && (x?.(n), v(!1));
51
- }, ae = (n) => {
52
- x?.(n !== void 0 ? n : w), v(!1);
53
- }, de = () => {
54
- d(e), f(e?.from ? l(e.from.startDate, t, { locale: o }) : ""), p(c(e) ? l(c(e), t, { locale: o }) : ""), v(!1);
55
- }, G = () => {
56
- d(void 0), f(""), p(""), x?.(void 0), k || v(!1);
57
- }, W = (n) => ve(n, {
58
- calendarType: E,
59
- fiscalMode: T,
60
- selectionMode: A,
61
- fiscalMonthPattern: L,
29
+ weekStartsOn: B = 1,
30
+ disabled: y,
31
+ className: re,
32
+ isError: C,
33
+ size: O,
34
+ label: z,
35
+ helperText: H,
36
+ required: le,
37
+ prefix: Te,
38
+ prefixClick: Ae,
39
+ ...se
40
+ }, ce) => {
41
+ const { locale: X, t: E } = We(), o = c.useMemo(() => Ee(X), [X]), q = F ?? E("datePicker.selectWeekRange"), G = c.useRef(null), ae = c.useRef(null);
42
+ c.useRef(null), c.useRef(null), c.useImperativeHandle(ce, () => G.current);
43
+ const [r, g] = c.useState(!1), I = c.useRef(!1), [w, d] = c.useState(t), [R, f] = c.useState(t?.from ? l(t.from.startDate, n, { locale: o }) : ""), [v, p] = c.useState(a(t) ? l(a(t), n, { locale: o }) : ""), [ie, V] = c.useState(t?.from?.startDate || /* @__PURE__ */ new Date());
44
+ c.useEffect(() => {
45
+ r || (f(t?.from ? l(t.from.startDate, n, { locale: o }) : ""), p(a(t) ? l(a(t), n, { locale: o }) : ""), d(t));
46
+ }, [t, n, r, o]), c.useEffect(() => {
47
+ r && (d(t), f(t?.from ? l(t.from.startDate, n, { locale: o }) : ""), p(a(t) ? l(a(t), n, { locale: o }) : ""), V(t?.from?.startDate || /* @__PURE__ */ new Date()));
48
+ }, [r, t, n, o]);
49
+ const de = (e) => {
50
+ d(e), e?.from ? (f(l(e.from.startDate, n, { locale: o })), p(l(a(e), n, { locale: o }))) : (f(""), p("")), !D && e?.from && e?.to && e.from.startDate.getTime() !== e.to.startDate.getTime() && (k?.(e), g(!1));
51
+ }, fe = (e) => {
52
+ k?.(e !== void 0 ? e : w), g(!1);
53
+ }, T = () => {
54
+ d(t), f(t?.from ? l(t.from.startDate, n, { locale: o }) : ""), p(a(t) ? l(a(t), n, { locale: o }) : ""), g(!1);
55
+ }, J = () => {
56
+ d(void 0), f(""), p(""), k?.(void 0), D || g(!1);
57
+ }, W = (e) => Ie(e, {
58
+ calendarType: A,
59
+ fiscalMode: L,
60
+ selectionMode: j,
61
+ fiscalMonthPattern: K,
62
62
  fiscalYearStartMonth: M,
63
- weekStartsOn: j
64
- }), fe = (n) => {
65
- const g = n.target.value, i = Q(g, t, y);
63
+ weekStartsOn: B
64
+ }), pe = (e) => {
65
+ const x = e.target.value, i = Z(x, n, R);
66
66
  if (f(i), i === "") {
67
67
  const u = { from: void 0, to: w?.to };
68
- d(u), k || x?.(u);
68
+ d(u), D || k?.(u);
69
69
  return;
70
70
  }
71
- const m = N(i, t, /* @__PURE__ */ new Date(), { locale: o });
72
- if (S(m) && i.length === t.length) {
71
+ const m = S(i, n, /* @__PURE__ */ new Date(), { locale: o });
72
+ if (P(m) && i.length === n.length) {
73
73
  const b = { from: W(m), to: w?.to };
74
- d(b), p(l(c(b), t, { locale: o })), k || x?.(b);
74
+ d(b), p(l(a(b), n, { locale: o })), D || k?.(b);
75
75
  }
76
- }, pe = (n) => {
77
- const g = n.target.value, i = Q(g, t, R);
76
+ }, me = (e) => {
77
+ const x = e.target.value, i = Z(x, n, v);
78
78
  if (p(i), i === "") {
79
79
  const u = { from: w?.from, to: void 0 };
80
- d(u), k || x?.(u);
80
+ d(u), D || k?.(u);
81
81
  return;
82
82
  }
83
- const m = N(i, t, /* @__PURE__ */ new Date(), { locale: o });
84
- if (S(m) && i.length === t.length) {
83
+ const m = S(i, n, /* @__PURE__ */ new Date(), { locale: o });
84
+ if (P(m) && i.length === n.length) {
85
85
  const u = W(m), b = { from: w?.from, to: u };
86
- d(b), w?.from && f(l(w.from.startDate, t, { locale: o })), m && V(m), k || x?.(b);
86
+ d(b), w?.from && f(l(w.from.startDate, n, { locale: o })), m && V(m), D || k?.(b);
87
87
  }
88
- }, J = () => {
89
- if (a) return;
90
- const n = K(y, t), g = K(R, t), i = N(n, t, /* @__PURE__ */ new Date(), { locale: o }), m = N(g, t, /* @__PURE__ */ new Date(), { locale: o }), u = S(i) && n.length === t.length, b = S(m) && g.length === t.length;
88
+ }, Q = () => {
89
+ if (r) return;
90
+ const e = U(R, n), x = U(v, n), i = S(e, n, /* @__PURE__ */ new Date(), { locale: o }), m = S(x, n, /* @__PURE__ */ new Date(), { locale: o }), u = P(i) && e.length === n.length, b = P(m) && x.length === n.length;
91
91
  if (!u || !b)
92
- f(e?.from ? l(e.from.startDate, t, { locale: o }) : ""), p(c(e) ? l(c(e), t, { locale: o }) : ""), d(e);
93
- else if (f(n), p(g), !k) {
92
+ f(t?.from ? l(t.from.startDate, n, { locale: o }) : ""), p(a(t) ? l(a(t), n, { locale: o }) : ""), d(t);
93
+ else if (f(e), p(x), !D) {
94
94
  const we = W(i), be = W(m);
95
- x?.({ from: we, to: be });
95
+ k?.({ from: we, to: be });
96
96
  }
97
- }, me = e?.from ? l(e.from.startDate, t, { locale: o }) : "", ue = c(e) ? l(c(e), t, { locale: o }) : "", he = me !== y, ge = ue !== R, xe = y.length === t.length && !S(N(y, t, /* @__PURE__ */ new Date(), { locale: o })), ke = R.length === t.length && !S(N(R, t, /* @__PURE__ */ new Date(), { locale: o }));
98
- return /* @__PURE__ */ h("div", { className: "flex w-full min-w-[240px] flex-col gap-[6px]", "data-component": "week-range-picker", "data-disabled": D || void 0, children: [
97
+ }, ue = t?.from ? l(t.from.startDate, n, { locale: o }) : "", he = a(t) ? l(a(t), n, { locale: o }) : "", ge = ue !== R, xe = he !== v, ke = R.length === n.length && !P(S(R, n, /* @__PURE__ */ new Date(), { locale: o })), De = v.length === n.length && !P(S(v, n, /* @__PURE__ */ new Date(), { locale: o }));
98
+ return /* @__PURE__ */ h("div", { className: "flex w-full min-w-[240px] flex-col gap-[6px]", "data-component": "week-range-picker", "data-disabled": y || void 0, children: [
99
99
  /* @__PURE__ */ h("div", { className: "flex flex-col gap-[6px]", children: [
100
- O && /* @__PURE__ */ h(
100
+ z && /* @__PURE__ */ h(
101
101
  "label",
102
102
  {
103
- className: C(
103
+ className: N(
104
104
  "text-xs font-medium leading-[18px] text-content-tertiary",
105
- D && "opacity-70",
106
- I && "text-destructive"
105
+ y && "opacity-70",
106
+ C && "text-destructive"
107
107
  ),
108
108
  children: [
109
- O,
109
+ z,
110
110
  " ",
111
- oe && /* @__PURE__ */ s("span", { className: "text-destructive", children: "*" })
111
+ le && /* @__PURE__ */ s("span", { className: "text-destructive", children: "*" })
112
112
  ]
113
113
  }
114
114
  ),
115
- /* @__PURE__ */ h(Se, { open: a, onOpenChange: v, children: [
116
- /* @__PURE__ */ s(Ne, { asChild: !0, children: /* @__PURE__ */ h(
115
+ /* @__PURE__ */ h(Pe, { open: r, onOpenChange: g, children: [
116
+ /* @__PURE__ */ s(Se, { asChild: !0, children: /* @__PURE__ */ h(
117
117
  "div",
118
118
  {
119
- "data-state": a ? "open" : "closed",
120
- className: C(
119
+ "data-state": r ? "open" : "closed",
120
+ className: N(
121
121
  "flex w-full items-center justify-between gap-2 rounded-md border bg-canvas-elevated px-3 text-sm shadow-sm transition-colors hover:border-brand disabled:cursor-not-allowed disabled:bg-disabled-surface disabled:text-disabled-foreground disabled:border-stroke",
122
- I ? "border-destructive hover:border-destructive" : "border-field",
123
- B === "sm" ? "h-6" : B === "md" ? "h-[28px]" : "h-8",
124
- D && "pointer-events-none opacity-100 bg-disabled-surface border-stroke text-disabled-foreground hover:border-stroke",
122
+ C ? "border-destructive hover:border-destructive" : "border-field",
123
+ O === "sm" ? "h-6" : O === "md" ? "h-[28px]" : "h-8",
124
+ y && "pointer-events-none opacity-100 bg-disabled-surface border-stroke text-disabled-foreground hover:border-stroke",
125
125
  "cursor-pointer",
126
- ne
126
+ re
127
127
  ),
128
128
  children: [
129
129
  /* @__PURE__ */ h("div", { className: "flex items-center gap-4 flex-1 min-w-0", children: [
130
130
  /* @__PURE__ */ s(
131
131
  "input",
132
132
  {
133
- ref: q,
133
+ ref: G,
134
134
  type: "text",
135
- value: y,
136
- onChange: fe,
137
- onBlur: J,
138
- onClick: (n) => a && n.stopPropagation(),
139
- placeholder: a ? t : X,
140
- disabled: !!D,
135
+ value: R,
136
+ onChange: pe,
137
+ onBlur: Q,
138
+ onClick: (e) => r && e.stopPropagation(),
139
+ onKeyDown: (e) => {
140
+ (e.key === "Enter" || e.key === "ArrowDown") && !r && (e.preventDefault(), I.current = !0, g(!0)), e.key === "Escape" && r && (e.preventDefault(), T());
141
+ },
142
+ placeholder: r ? n : q,
143
+ disabled: !!y,
144
+ "aria-label": "Start Date",
141
145
  "data-field": "start",
142
- className: C(
146
+ className: N(
143
147
  "flex-1 min-w-0 bg-transparent p-0 text-sm font-medium outline-none placeholder:font-medium placeholder:text-content-empty disabled:cursor-not-allowed disabled:opacity-50",
144
- xe ? "text-destructive" : he ? "text-content-muted" : ""
148
+ ke ? "text-destructive" : ge ? "text-content-muted" : ""
145
149
  ),
146
- ...le
150
+ ...se
147
151
  }
148
152
  ),
149
153
  /* @__PURE__ */ s(
150
154
  "input",
151
155
  {
152
- ref: re,
156
+ ref: ae,
153
157
  type: "text",
154
- value: R,
155
- onChange: pe,
156
- onBlur: J,
157
- onClick: (n) => a && n.stopPropagation(),
158
- placeholder: a ? t : X,
159
- disabled: !!D,
158
+ value: v,
159
+ onChange: me,
160
+ onBlur: Q,
161
+ onClick: (e) => r && e.stopPropagation(),
162
+ onKeyDown: (e) => {
163
+ (e.key === "Enter" || e.key === "ArrowDown") && !r && (e.preventDefault(), I.current = !0, g(!0)), e.key === "Escape" && r && (e.preventDefault(), T());
164
+ },
165
+ placeholder: r ? n : q,
166
+ disabled: !!y,
167
+ "aria-label": "End Date",
160
168
  "data-field": "end",
161
- className: C(
169
+ className: N(
162
170
  "flex-1 min-w-0 bg-transparent p-0 text-sm font-medium outline-none placeholder:font-medium placeholder:text-content-empty disabled:cursor-not-allowed disabled:opacity-50",
163
- ke ? "text-destructive" : ge ? "text-content-muted" : ""
171
+ De ? "text-destructive" : xe ? "text-content-muted" : ""
164
172
  )
165
173
  }
166
174
  )
167
175
  ] }),
168
176
  /* @__PURE__ */ h("div", { className: "flex items-center gap-1 shrink-0", children: [
169
- e?.from && !D && /* @__PURE__ */ h(U, { children: [
170
- /* @__PURE__ */ s(Z, { asChild: !0, children: /* @__PURE__ */ s(
171
- De,
177
+ t?.from && !y && /* @__PURE__ */ h($, { children: [
178
+ /* @__PURE__ */ s(Y, { asChild: !0, children: /* @__PURE__ */ s(
179
+ ye,
172
180
  {
173
181
  className: "h-4 w-4 cursor-pointer hover:text-content text-content-muted",
174
- onClick: (n) => {
175
- n.stopPropagation(), G();
182
+ onClick: (e) => {
183
+ e.stopPropagation(), J();
176
184
  }
177
185
  }
178
186
  ) }),
179
- /* @__PURE__ */ s($, { variant: "tertiary", side: "top", children: P("calendar.clear") })
187
+ /* @__PURE__ */ s(_, { variant: "tertiary", side: "top", children: E("calendar.clear") })
180
188
  ] }),
181
- /* @__PURE__ */ h(U, { children: [
182
- /* @__PURE__ */ s(Z, { asChild: !0, children: /* @__PURE__ */ s(ye, { className: "h-4 w-4 text-secondary-foreground" }) }),
183
- /* @__PURE__ */ s($, { variant: "tertiary", side: "top", children: P("datePicker.selectWeekRange") })
189
+ /* @__PURE__ */ h($, { children: [
190
+ /* @__PURE__ */ s(Y, { asChild: !0, children: /* @__PURE__ */ s("button", { type: "button", tabIndex: 0, "aria-label": E("datePicker.selectWeekRange"), onClick: (e) => {
191
+ e.stopPropagation(), g(!r);
192
+ }, onKeyDown: (e) => {
193
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), e.stopPropagation(), I.current = !0, g(!r));
194
+ }, className: "inline-flex items-center justify-center bg-transparent border-none p-0 cursor-pointer", children: /* @__PURE__ */ s(Re, { className: "h-4 w-4 text-secondary-foreground" }) }) }),
195
+ /* @__PURE__ */ s(_, { variant: "tertiary", side: "top", children: E("datePicker.selectWeekRange") })
184
196
  ] })
185
197
  ] })
186
198
  ]
187
199
  }
188
200
  ) }),
189
201
  /* @__PURE__ */ s(
190
- Ce,
202
+ Ne,
191
203
  {
192
204
  className: "w-auto p-0",
193
205
  align: "start",
194
- onOpenAutoFocus: (n) => n.preventDefault(),
206
+ onOpenAutoFocus: (e) => {
207
+ I.current || e.preventDefault(), I.current = !1;
208
+ },
195
209
  children: /* @__PURE__ */ s(
196
- Ie,
210
+ Ce,
197
211
  {
198
212
  pickerType: "week",
199
213
  weekMode: "range",
200
214
  selectedWeeks: w,
201
- onWeekSelect: ie,
202
- month: ce,
215
+ onWeekSelect: de,
216
+ month: ie,
203
217
  onMonthChange: V,
204
- disabled: { before: _, after: F },
205
- startMonth: ee,
206
- endMonth: te,
207
- showFooter: k,
208
- calendarType: E,
209
- fiscalMode: T,
210
- selectionMode: A,
211
- fiscalMonthPattern: L,
218
+ disabled: { before: ee, after: te },
219
+ startMonth: ne,
220
+ endMonth: oe,
221
+ showFooter: D,
222
+ calendarType: A,
223
+ fiscalMode: L,
224
+ selectionMode: j,
225
+ fiscalMonthPattern: K,
212
226
  fiscalYearStartMonth: M,
213
- weekStartsOn: j,
214
- onApply: ae,
215
- onCancel: de,
216
- onClear: G,
227
+ weekStartsOn: B,
228
+ onApply: fe,
229
+ onCancel: T,
230
+ onClear: J,
217
231
  captionLayout: "dropdown"
218
232
  }
219
233
  )
@@ -221,16 +235,16 @@ const c = (e) => e?.from ? e.to ? e.to.endDate : e.from.endDate : void 0, Ve = r
221
235
  )
222
236
  ] })
223
237
  ] }),
224
- z && /* @__PURE__ */ h("div", { className: C("flex items-center gap-[6px]", I && "text-destructive"), children: [
225
- !I && /* @__PURE__ */ s(Re, { size: 10, className: "shrink-0 text-content-muted" }),
238
+ H && /* @__PURE__ */ h("div", { className: N("flex items-center gap-[6px]", C && "text-destructive"), children: [
239
+ !C && /* @__PURE__ */ s(ve, { size: 10, className: "shrink-0 text-content-muted" }),
226
240
  /* @__PURE__ */ s(
227
241
  "p",
228
242
  {
229
- className: C(
243
+ className: N(
230
244
  "text-[10px] leading-4 text-navigation-muted",
231
- I && "text-destructive"
245
+ C && "text-destructive"
232
246
  ),
233
- children: z
247
+ children: H
234
248
  }
235
249
  )
236
250
  ] })