@navikt/ds-react 2.8.9 → 2.8.10

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 (86) hide show
  1. package/_docs.json +62 -62
  2. package/cjs/date/DateInput.js +2 -2
  3. package/cjs/date/context/index.js +9 -0
  4. package/cjs/date/context/package.json +6 -0
  5. package/cjs/date/datepicker/DatePicker.js +4 -4
  6. package/cjs/date/datepicker/DatePickerStandalone.js +2 -2
  7. package/cjs/date/datepicker/{Head.js → TableHead.js} +3 -3
  8. package/cjs/date/hooks/index.js +1 -7
  9. package/cjs/date/hooks/useDatepicker.js +12 -42
  10. package/cjs/date/hooks/useEscape.js +18 -0
  11. package/cjs/date/hooks/useMonthPicker.js +12 -42
  12. package/cjs/date/hooks/useOutsideClickHandler.js +26 -0
  13. package/cjs/date/hooks/useRangeDatepicker.js +13 -45
  14. package/cjs/date/monthpicker/MonthButton.js +2 -2
  15. package/cjs/date/monthpicker/MonthCaption.js +2 -2
  16. package/cjs/date/monthpicker/MonthPicker.js +3 -3
  17. package/cjs/date/monthpicker/MonthPickerStandalone.js +2 -2
  18. package/cjs/date/monthpicker/MonthSelector.js +2 -2
  19. package/esm/date/DateInput.js +1 -1
  20. package/esm/date/DateInput.js.map +1 -1
  21. package/esm/date/context/index.d.ts +2 -0
  22. package/esm/date/context/index.js +3 -0
  23. package/esm/date/context/index.js.map +1 -0
  24. package/esm/date/context/useDateInputContext.js.map +1 -0
  25. package/esm/date/context/useSharedMonthContext.js.map +1 -0
  26. package/esm/date/datepicker/DatePicker.js +3 -3
  27. package/esm/date/datepicker/DatePicker.js.map +1 -1
  28. package/esm/date/datepicker/DatePickerStandalone.js +2 -2
  29. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
  30. package/esm/date/datepicker/{Head.d.ts → TableHead.d.ts} +1 -1
  31. package/esm/date/datepicker/{Head.js → TableHead.js} +2 -2
  32. package/esm/date/datepicker/TableHead.js.map +1 -0
  33. package/esm/date/hooks/index.d.ts +0 -2
  34. package/esm/date/hooks/index.js +0 -2
  35. package/esm/date/hooks/index.js.map +1 -1
  36. package/esm/date/hooks/useDatepicker.js +13 -43
  37. package/esm/date/hooks/useDatepicker.js.map +1 -1
  38. package/esm/date/hooks/useEscape.d.ts +2 -0
  39. package/esm/date/hooks/useEscape.js +15 -0
  40. package/esm/date/hooks/useEscape.js.map +1 -0
  41. package/esm/date/hooks/useMonthPicker.js +13 -43
  42. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  43. package/esm/date/hooks/useOutsideClickHandler.d.ts +2 -0
  44. package/esm/date/hooks/useOutsideClickHandler.js +23 -0
  45. package/esm/date/hooks/useOutsideClickHandler.js.map +1 -0
  46. package/esm/date/hooks/useRangeDatepicker.js +14 -46
  47. package/esm/date/hooks/useRangeDatepicker.js.map +1 -1
  48. package/esm/date/monthpicker/MonthButton.js +1 -1
  49. package/esm/date/monthpicker/MonthButton.js.map +1 -1
  50. package/esm/date/monthpicker/MonthCaption.js +1 -1
  51. package/esm/date/monthpicker/MonthCaption.js.map +1 -1
  52. package/esm/date/monthpicker/MonthPicker.js +1 -1
  53. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  54. package/esm/date/monthpicker/MonthPickerStandalone.js +1 -1
  55. package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -1
  56. package/esm/date/monthpicker/MonthSelector.js +1 -1
  57. package/esm/date/monthpicker/MonthSelector.js.map +1 -1
  58. package/package.json +3 -3
  59. package/src/date/DateInput.tsx +1 -1
  60. package/src/date/context/index.ts +5 -0
  61. package/src/date/datepicker/DatePicker.tsx +3 -3
  62. package/src/date/datepicker/DatePickerStandalone.tsx +2 -2
  63. package/src/date/datepicker/{Head.tsx → TableHead.tsx} +1 -1
  64. package/src/date/datepicker/datepicker.stories.tsx +21 -21
  65. package/src/date/hooks/index.ts +0 -5
  66. package/src/date/hooks/useDatepicker.tsx +15 -55
  67. package/src/date/hooks/useEscape.tsx +25 -0
  68. package/src/date/hooks/useMonthPicker.tsx +15 -54
  69. package/src/date/hooks/useOutsideClickHandler.tsx +34 -0
  70. package/src/date/hooks/useRangeDatepicker.tsx +19 -56
  71. package/src/date/monthpicker/MonthButton.tsx +1 -1
  72. package/src/date/monthpicker/MonthCaption.tsx +1 -1
  73. package/src/date/monthpicker/MonthPicker.tsx +1 -1
  74. package/src/date/monthpicker/MonthPickerStandalone.tsx +1 -1
  75. package/src/date/monthpicker/MonthSelector.tsx +1 -1
  76. package/esm/date/datepicker/Head.js.map +0 -1
  77. package/esm/date/hooks/useDateInputContext.js.map +0 -1
  78. package/esm/date/hooks/useSharedMonthContext.js.map +0 -1
  79. /package/cjs/date/{hooks → context}/useDateInputContext.js +0 -0
  80. /package/cjs/date/{hooks → context}/useSharedMonthContext.js +0 -0
  81. /package/esm/date/{hooks → context}/useDateInputContext.d.ts +0 -0
  82. /package/esm/date/{hooks → context}/useDateInputContext.js +0 -0
  83. /package/esm/date/{hooks → context}/useSharedMonthContext.d.ts +0 -0
  84. /package/esm/date/{hooks → context}/useSharedMonthContext.js +0 -0
  85. /package/src/date/{hooks → context}/useDateInputContext.tsx +0 -0
  86. /package/src/date/{hooks → context}/useSharedMonthContext.tsx +0 -0
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useRef, useState } from "react";
1
+ import React, { useRef, useState } from "react";
2
2
  import { DateInputProps } from "../DateInput";
3
3
  import { MonthPickerProps } from "../monthpicker/MonthPicker";
4
4
  import {
@@ -8,6 +8,8 @@ import {
8
8
  isValidDate,
9
9
  parseDate,
10
10
  } from "../utils";
11
+ import { useEscape } from "./useEscape";
12
+ import { useOutsideClickHandler } from "./useOutsideClickHandler";
11
13
 
12
14
  export interface UseMonthPickerOptions
13
15
  extends Pick<
@@ -118,7 +120,7 @@ export const useMonthpicker = (
118
120
  const locale = getLocaleFromString(_locale);
119
121
 
120
122
  const inputRef = useRef<HTMLInputElement>(null);
121
- const monthpickerRef = useRef<HTMLDivElement>(null);
123
+ const [monthpickerRef, setMonthpickerRef] = useState<HTMLDivElement>();
122
124
 
123
125
  // Initialize states
124
126
  const [year, setYear] = useState(defaultSelected ?? defaultYear ?? today);
@@ -131,44 +133,21 @@ export const useMonthpicker = (
131
133
 
132
134
  const [inputValue, setInputValue] = useState(defaultInputValue);
133
135
 
136
+ useOutsideClickHandler(open, setOpen, [
137
+ monthpickerRef,
138
+ inputRef.current,
139
+ inputRef.current?.nextSibling,
140
+ ]);
141
+
142
+ useEscape(open, setOpen, inputRef);
143
+
134
144
  const updateMonth = (date?: Date) => {
135
145
  onMonthChange?.(date);
136
146
  setSelectedMonth(date);
137
147
  };
138
148
 
139
- const updateValidation = (val: Partial<MonthValidationT> = {}) => {
140
- const msg = getValidationMessage(val);
141
- onValidate?.(msg);
142
- };
143
-
144
- const handleFocusIn = useCallback(
145
- (e) => {
146
- /* Workaround for shadow-dom users (open) */
147
- const composed = e.composedPath?.()?.[0];
148
- if (!e?.target || !e?.target?.nodeType || !composed) {
149
- return;
150
- }
151
- ![
152
- monthpickerRef.current,
153
- inputRef.current,
154
- inputRef.current?.nextSibling,
155
- ].some(
156
- (element) => element?.contains(e.target) || element?.contains(composed)
157
- ) &&
158
- open &&
159
- setOpen(false);
160
- },
161
- [open]
162
- );
163
-
164
- useEffect(() => {
165
- window.addEventListener("focusin", handleFocusIn);
166
- window.addEventListener("pointerdown", handleFocusIn);
167
- return () => {
168
- window?.removeEventListener?.("focusin", handleFocusIn);
169
- window?.removeEventListener?.("pointerdown", handleFocusIn);
170
- };
171
- }, [handleFocusIn]);
149
+ const updateValidation = (val: Partial<MonthValidationT> = {}) =>
150
+ onValidate?.(getValidationMessage(val));
172
151
 
173
152
  const reset = () => {
174
153
  updateMonth(defaultSelected);
@@ -294,24 +273,6 @@ export const useMonthpicker = (
294
273
  setYear(month);
295
274
  };
296
275
 
297
- const handleClose = useCallback(() => {
298
- setOpen(false);
299
- inputRef.current && inputRef.current.focus();
300
- }, []);
301
-
302
- const escape = useCallback(
303
- (e) => open && e.key === "Escape" && handleClose(),
304
- [handleClose, open]
305
- );
306
-
307
- useEffect(() => {
308
- window.addEventListener("keydown", escape, false);
309
-
310
- return () => {
311
- window.removeEventListener("keydown", escape, false);
312
- };
313
- }, [escape]);
314
-
315
276
  const monthpickerProps = {
316
277
  year,
317
278
  onYearChange: (y?: Date) => setYear(y ?? today),
@@ -323,7 +284,7 @@ export const useMonthpicker = (
323
284
  open,
324
285
  onOpenToggle: () => setOpen((x) => !x),
325
286
  disabled,
326
- ref: monthpickerRef,
287
+ ref: setMonthpickerRef,
327
288
  };
328
289
 
329
290
  const inputProps = {
@@ -0,0 +1,34 @@
1
+ import React, { useCallback, useEffect } from "react";
2
+
3
+ export const useOutsideClickHandler = (
4
+ open: boolean,
5
+ setOpen: React.Dispatch<React.SetStateAction<boolean>>,
6
+ refs: Array<any>
7
+ ) => {
8
+ const handleFocusIn = useCallback(
9
+ (e) => {
10
+ const composed = e.composedPath?.()?.[0];
11
+ if (!e?.target || !e?.target?.nodeType || !composed) {
12
+ return;
13
+ }
14
+ if (
15
+ !refs.some(
16
+ (element) =>
17
+ element?.contains(e.target) || element?.contains(composed)
18
+ )
19
+ ) {
20
+ open && setOpen(false);
21
+ }
22
+ },
23
+ [open, refs, setOpen]
24
+ );
25
+
26
+ useEffect(() => {
27
+ window.addEventListener("focusin", handleFocusIn);
28
+ window.addEventListener("pointerdown", handleFocusIn);
29
+ return () => {
30
+ window?.removeEventListener?.("focusin", handleFocusIn);
31
+ window?.removeEventListener?.("pointerdown", handleFocusIn);
32
+ };
33
+ }, [handleFocusIn]);
34
+ };
@@ -1,7 +1,7 @@
1
1
  import differenceInCalendarDays from "date-fns/differenceInCalendarDays";
2
2
  import isBefore from "date-fns/isBefore";
3
3
  import isWeekend from "date-fns/isWeekend";
4
- import React, { useCallback, useEffect, useRef, useState } from "react";
4
+ import React, { useRef, useState } from "react";
5
5
  import { DateRange, isMatch } from "react-day-picker";
6
6
  import { DateInputProps } from "../DateInput";
7
7
  import { DatePickerProps } from "../datepicker/DatePicker";
@@ -12,6 +12,8 @@ import {
12
12
  parseDate,
13
13
  } from "../utils";
14
14
  import { DateValidationT, UseDatepickerOptions } from "./useDatepicker";
15
+ import { useEscape } from "./useEscape";
16
+ import { useOutsideClickHandler } from "./useOutsideClickHandler";
15
17
 
16
18
  export type RangeValidationT = {
17
19
  from: DateValidationT;
@@ -211,7 +213,7 @@ export const useRangeDatepicker = (
211
213
 
212
214
  const inputRefTo = useRef<HTMLInputElement>(null);
213
215
  const inputRefFrom = useRef<HTMLInputElement>(null);
214
- const datePickerRef = useRef<HTMLDivElement | null>(null);
216
+ const [daypickerRef, setDaypickerRef] = useState<HTMLDivElement>();
215
217
 
216
218
  const [defaultSelected, setDefaultSelected] = useState(_defaultSelected);
217
219
 
@@ -241,6 +243,20 @@ export const useRangeDatepicker = (
241
243
 
242
244
  const [open, setOpen] = useState(false);
243
245
 
246
+ useOutsideClickHandler(open, setOpen, [
247
+ daypickerRef,
248
+ inputRefTo.current,
249
+ inputRefFrom.current,
250
+ inputRefTo.current?.nextSibling,
251
+ inputRefFrom.current?.nextSibling,
252
+ ]);
253
+
254
+ useEscape(
255
+ open,
256
+ setOpen,
257
+ selectedRange?.from && !selectedRange?.to ? inputRefTo : inputRefFrom
258
+ );
259
+
244
260
  const updateRange = (range?: DateRange) => {
245
261
  onRangeChange?.(range);
246
262
  setSelectedRange(range);
@@ -255,37 +271,6 @@ export const useRangeDatepicker = (
255
271
  onValidate?.(msg);
256
272
  };
257
273
 
258
- const handleFocusIn = useCallback(
259
- (e) => {
260
- /* Workaround for shadow-dom users (open) */
261
- const composed = e.composedPath?.()?.[0];
262
- if (!e?.target || !e?.target?.nodeType || !composed) {
263
- return;
264
- }
265
- ![
266
- datePickerRef.current,
267
- inputRefTo.current,
268
- inputRefFrom.current,
269
- inputRefTo.current?.nextSibling,
270
- inputRefFrom.current?.nextSibling,
271
- ].some(
272
- (element) => element?.contains(e.target) || element?.contains(composed)
273
- ) &&
274
- open &&
275
- setOpen(false);
276
- },
277
- [open]
278
- );
279
-
280
- useEffect(() => {
281
- window.addEventListener("focusin", handleFocusIn);
282
- window.addEventListener("pointerdown", handleFocusIn);
283
- return () => {
284
- window?.removeEventListener?.("focusin", handleFocusIn);
285
- window?.removeEventListener?.("pointerdown", handleFocusIn);
286
- };
287
- }, [handleFocusIn]);
288
-
289
274
  const reset = () => {
290
275
  updateRange(defaultSelected ?? { from: undefined, to: undefined });
291
276
  setMonth(defaultSelected ? defaultSelected?.from : defaultMonth ?? today);
@@ -527,28 +512,6 @@ export const useRangeDatepicker = (
527
512
  : toChange(e.target.value, day, isBefore, isAfter);
528
513
  };
529
514
 
530
- const handleClose = useCallback(() => {
531
- setOpen(false);
532
- if (selectedRange?.from && !selectedRange?.to) {
533
- inputRefTo?.current?.focus();
534
- } else {
535
- inputRefFrom?.current?.focus();
536
- }
537
- }, [selectedRange]);
538
-
539
- const escape = useCallback(
540
- (e) => open && e.key === "Escape" && handleClose(),
541
- [handleClose, open]
542
- );
543
-
544
- useEffect(() => {
545
- window.addEventListener("keydown", escape, false);
546
-
547
- return () => {
548
- window.removeEventListener("keydown", escape, false);
549
- };
550
- }, [escape]);
551
-
552
515
  const datepickerProps = {
553
516
  month: month,
554
517
  onMonthChange: (month) => setMonth(month),
@@ -563,7 +526,7 @@ export const useRangeDatepicker = (
563
526
  onOpenToggle: () => setOpen((x) => !x),
564
527
  disabled,
565
528
  disableWeekends,
566
- ref: datePickerRef,
529
+ ref: setDaypickerRef,
567
530
  };
568
531
 
569
532
  const fromInputProps = {
@@ -6,7 +6,7 @@ import isSameMonth from "date-fns/isSameMonth";
6
6
  import setYear from "date-fns/setYear";
7
7
  import React, { useEffect, useRef } from "react";
8
8
  import { useDayPicker } from "react-day-picker";
9
- import { useSharedMonthContext } from "../hooks";
9
+ import { useSharedMonthContext } from "../context";
10
10
  import { dateIsInCurrentMonth, isMatch, nextEnabled } from "../utils";
11
11
 
12
12
  interface MonthType {
@@ -6,7 +6,7 @@ import startOfYear from "date-fns/startOfYear";
6
6
  import React from "react";
7
7
  import { useDayPicker } from "react-day-picker";
8
8
  import { Button, Select } from "../..";
9
- import { useSharedMonthContext } from "../hooks";
9
+ import { useSharedMonthContext } from "../context";
10
10
  import { hasNextYear, labelNextYear, labelPrevYear } from "../utils";
11
11
 
12
12
  export const MonthCaption = () => {
@@ -3,7 +3,7 @@ import React, { forwardRef, useRef, useState } from "react";
3
3
  import { RootProvider } from "react-day-picker";
4
4
  import { Popover, useId } from "../..";
5
5
  import { DateInputType, MonthPickerInput } from "../DateInput";
6
- import { DateContext, SharedMonthProvider } from "../hooks";
6
+ import { DateContext, SharedMonthProvider } from "../context";
7
7
  import { getLocaleFromString, Matcher } from "../utils";
8
8
  import MonthCaption from "./MonthCaption";
9
9
  import MonthPickerStandalone, {
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useState } from "react";
3
3
  import { RootProvider } from "react-day-picker";
4
- import { SharedMonthProvider } from "../hooks";
4
+ import { SharedMonthProvider } from "../context";
5
5
  import { getLocaleFromString } from "../utils";
6
6
  import MonthCaption from "./MonthCaption";
7
7
  import { MonthPickerProps } from "./MonthPicker";
@@ -4,7 +4,7 @@ import setYear from "date-fns/setYear";
4
4
  import startOfMonth from "date-fns/startOfMonth";
5
5
  import React, { useState } from "react";
6
6
  import { BodyShort } from "../..";
7
- import { useSharedMonthContext } from "../hooks";
7
+ import { useSharedMonthContext } from "../context";
8
8
  import { isMatch } from "../utils";
9
9
  import MonthButton from "./MonthButton";
10
10
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"Head.js","sourceRoot":"","sources":["../../../src/date/datepicker/Head.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEzD,6BAA6B;AAC7B,MAAM,UAAU,IAAI;;IAClB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1D,MAAM,gBAAgB,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,mCAAI,OAAO,CAAC;IACxD,OAAO,CACL,+BAAO,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI;QACnD,oBAAC,gBAAgB,OAAG,CACd,CACT,CAAC;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDateInputContext.js","sourceRoot":"","sources":["../../../src/date/hooks/useDateInputContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAiBlD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAA0B;IAChE,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;IAClB,MAAM,EAAE,SAAS;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;KACnE;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSharedMonthContext.js","sourceRoot":"","sources":["../../../src/date/hooks/useSharedMonthContext.tsx"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAW,MAAM,UAAU,CAAC;AAWnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAyB;IACtE,WAAW,EAAE,KAAK;IAClB,IAAI,EAAE,IAAI,IAAI,EAAE;IAChB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;IAClB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,IAAI,EAAE,KAAK,EACX,YAAY,GACb,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAE/B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAO,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9E,IACE,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,MAAM;QACd,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,MAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAA,EACpC;QACA,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;KAClE;IAED,OAAO,CACL,oBAAC,kBAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;YACL,IAAI,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI;YACnB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;gBACZ,MAAM,CAAC,CAAC,CAAC,CAAC;gBACV,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,CAAC,CAAC,CAAC;YACpB,CAAC;YACD,WAAW;YACX,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,CAAC,CAAQ,EAAE,EAAE,CACrB,CAAC;gBACC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;SAC1B,IAEA,QAAQ,CACmB,CAC/B,CAAC;AACJ,CAAC,CAAC"}