@voxel51/voodo 0.0.30 → 0.0.32

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 (34) hide show
  1. package/dist/components/Checkbox/Checkbox.d.ts +3 -0
  2. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  3. package/dist/components/Drawer/Drawer.d.ts +3 -47
  4. package/dist/components/Drawer/Drawer.d.ts.map +1 -1
  5. package/dist/components/Pill/Pill.d.ts +1 -0
  6. package/dist/components/Pill/Pill.d.ts.map +1 -1
  7. package/dist/components/TreeSelect/TreeSelect.d.ts +33 -0
  8. package/dist/components/TreeSelect/TreeSelect.d.ts.map +1 -0
  9. package/dist/components/TreeSelect/TreeSelectNode.d.ts +21 -0
  10. package/dist/components/TreeSelect/TreeSelectNode.d.ts.map +1 -0
  11. package/dist/components/TreeSelect/TreeSelectPanel.d.ts +21 -0
  12. package/dist/components/TreeSelect/TreeSelectPanel.d.ts.map +1 -0
  13. package/dist/components/TreeSelect/TreeSelectSearchInput.d.ts +16 -0
  14. package/dist/components/TreeSelect/TreeSelectSearchInput.d.ts.map +1 -0
  15. package/dist/components/TreeSelect/TreeSelectTrigger.d.ts +22 -0
  16. package/dist/components/TreeSelect/TreeSelectTrigger.d.ts.map +1 -0
  17. package/dist/components/TreeSelect/index.d.ts +4 -0
  18. package/dist/components/TreeSelect/index.d.ts.map +1 -0
  19. package/dist/components/TreeSelect/tree.d.ts +100 -0
  20. package/dist/components/TreeSelect/tree.d.ts.map +1 -0
  21. package/dist/components/TreeSelect/types.d.ts +163 -0
  22. package/dist/components/TreeSelect/types.d.ts.map +1 -0
  23. package/dist/components/index.d.ts +1 -0
  24. package/dist/components/index.d.ts.map +1 -1
  25. package/dist/index.cjs +6 -6
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.js +7964 -6441
  28. package/dist/index.js.map +1 -1
  29. package/dist/util/useResizableDrawer.d.ts +23 -45
  30. package/dist/util/useResizableDrawer.d.ts.map +1 -1
  31. package/dist/util/useTree.d.ts +126 -0
  32. package/dist/util/useTree.d.ts.map +1 -0
  33. package/dist/voodo.css +1 -1
  34. package/package.json +3 -1
@@ -2,68 +2,46 @@ import { default as React } from 'react';
2
2
  import { UseDisclosureOptions, UseDisclosureReturn } from './useDisclosure';
3
3
  import { DragAxis } from './useDragDelta';
4
4
  export type { DragAxis };
5
- /**
6
- * Options for {@link useResizableDrawer}.
7
- *
8
- * Extends {@link UseDisclosureOptions} so the drawer's open state can be
9
- * controlled or uncontrolled in the same way as {@link useDisclosure}.
10
- */
11
5
  export interface UseResizableDrawerOptions extends UseDisclosureOptions {
12
6
  /** Axis the drawer resizes along. `"horizontal"` for left/right drawers, `"vertical"` for top/bottom. */
13
7
  axis: DragAxis;
14
- /** Initial drawer size in pixels, also used as the restore target after closing. */
15
- defaultSize: number;
16
- /** Minimum drawer size in pixels while open. */
17
- minSize: number;
18
- /** Maximum drawer size in pixels. */
8
+ /**
9
+ * Maximum content-area size in pixels. The header and handle are excluded —
10
+ * `maxSize` caps only the scrollable body region.
11
+ */
19
12
  maxSize: number;
20
- /** Size at which a drag triggers close. Defaults to 0. */
21
- closeThreshold?: number;
22
13
  /** Flip the delta sign — use for right-side and bottom-side handles. */
23
14
  invert?: boolean;
24
- /** Invoked with the new size on every drag-induced resize (not on open/close-only changes). */
15
+ /** Invoked with the new content-area size on every drag-induced resize. */
25
16
  onSizeChange?: (size: number) => void;
26
17
  }
27
- /**
28
- * Return value of {@link useResizableDrawer}. Extends {@link UseDisclosureReturn}
29
- * with size and drag state.
30
- */
31
18
  export interface UseResizableDrawerReturn extends UseDisclosureReturn {
32
- /** Current drawer size in pixels. Reflects the last committed size even while closed. */
19
+ /** Current content-area size in pixels (0 when closed or not yet measured). */
33
20
  size: number;
34
21
  /** `true` while the user is actively dragging the resize handle. */
35
22
  isDragging: boolean;
23
+ /**
24
+ * `true` only when the current size change should be animated — i.e. an
25
+ * open/close toggle. Content-driven resizes and drags are instant (`false`),
26
+ * so the size snaps and doesn't fight the header's un-animated layout change.
27
+ */
28
+ animating: boolean;
36
29
  /** Props to spread onto the drag handle element. */
37
30
  dragHandleProps: {
38
31
  onPointerDown: (e: React.PointerEvent<HTMLElement>) => void;
39
32
  onPointerMove: (e: React.PointerEvent<HTMLElement>) => void;
40
33
  onPointerUp: () => void;
41
34
  };
35
+ /**
36
+ * Attach the size-bearing wrapper's `onTransitionEnd` to this so `animating`
37
+ * clears when the open/close transition completes.
38
+ */
39
+ onTransitionEnd: () => void;
40
+ /**
41
+ * Attach to the content element. The hook observes it via ResizeObserver and
42
+ * keeps the open size equal to `min(contentHeight, maxSize)` automatically.
43
+ */
44
+ contentRef: (el: HTMLElement | null) => void;
42
45
  }
43
- /**
44
- * Hook which models a drawer that can be opened, closed, and resized by
45
- * dragging a handle.
46
- *
47
- * Behavior:
48
- * - Dragging below `closeThreshold` (default `0`) closes the drawer.
49
- * - Dragging above `closeThreshold` while closed reopens the drawer.
50
- * - Sizes are clamped to `[minSize, maxSize]` while open.
51
- * - `toggle()` restores the last dragged size when reopening.
52
- *
53
- * @example
54
- * ```tsx
55
- * const { open, size, toggle, dragHandleProps } = useResizableDrawer({
56
- * axis: "horizontal",
57
- * defaultSize: 320,
58
- * minSize: 200,
59
- * maxSize: 600,
60
- * });
61
- * return (
62
- * <aside style={{ width: open ? size : 0 }}>
63
- * <div {...dragHandleProps} />
64
- * </aside>
65
- * );
66
- * ```
67
- */
68
- export declare function useResizableDrawer({ axis, defaultSize, minSize, maxSize, closeThreshold, invert, onSizeChange, ...disclosureOptions }: UseResizableDrawerOptions): UseResizableDrawerReturn;
46
+ export declare function useResizableDrawer({ axis, maxSize, invert, onSizeChange, ...disclosureOptions }: UseResizableDrawerOptions): UseResizableDrawerReturn;
69
47
  //# sourceMappingURL=useResizableDrawer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useResizableDrawer.d.ts","sourceRoot":"","sources":["../../src/util/useResizableDrawer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAgB,MAAM,gBAAgB,CAAC;AAGxD,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,yGAAyG;IACzG,IAAI,EAAE,QAAQ,CAAC;IACf,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+FAA+F;IAC/F,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,UAAU,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,eAAe,EAAE;QACf,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;QAC5D,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;QAC5D,WAAW,EAAE,MAAM,IAAI,CAAC;KACzB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,WAAW,EACX,OAAO,EACP,OAAO,EACP,cAAkB,EAClB,MAAc,EACd,YAAY,EACZ,GAAG,iBAAiB,EACrB,EAAE,yBAAyB,GAAG,wBAAwB,CA0EtD"}
1
+ {"version":3,"file":"useResizableDrawer.d.ts","sourceRoot":"","sources":["../../src/util/useResizableDrawer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAE9E,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAgB,MAAM,gBAAgB,CAAC;AAIxD,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,yGAAyG;IACzG,IAAI,EAAE,QAAQ,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,eAAe,EAAE;QACf,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;QAC5D,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;QAC5D,WAAW,EAAE,MAAM,IAAI,CAAC;KACzB,CAAC;IACF;;;OAGG;IACH,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B;;;OAGG;IACH,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,MAAc,EACd,YAAY,EACZ,GAAG,iBAAiB,EACrB,EAAE,yBAAyB,GAAG,wBAAwB,CAmHtD"}
@@ -0,0 +1,126 @@
1
+ import { KeyboardEvent } from 'react';
2
+ import { ResolvedNode } from '../components/TreeSelect/types';
3
+ export interface UseTreeOptions {
4
+ /** Pre-resolved (and optionally pre-filtered) tree. */
5
+ tree: ResolvedNode;
6
+ /**
7
+ * Set of currently selected paths, used for `aria-selected` and `isSelected`.
8
+ * For single-select, pass a Set with one element. For multi-select, pass
9
+ * all selected paths. The hook is mode-agnostic.
10
+ */
11
+ selection?: Set<string>;
12
+ /**
13
+ * Paths that must be treated as expanded regardless of user expansion state
14
+ * (e.g. ancestors of a search match).
15
+ */
16
+ forceOpenPaths?: Set<string>;
17
+ /** Optional id prefix override; defaults to a `useId()` value. */
18
+ idPrefix?: string;
19
+ /** Scroll the active row into view on change. @default true */
20
+ scrollActiveIntoView?: boolean;
21
+ /** Fires on selectable row click and Enter on active selectable row. */
22
+ onSelect?: (path: string) => void;
23
+ /** Fires on Escape key. */
24
+ onEscape?: () => void;
25
+ /**
26
+ * Fires when a branch is newly opened by user interaction
27
+ * (`toggleExpand`, `expand`, or ArrowRight). Does **not** fire for paths
28
+ * opened solely via `forceOpenPaths` (search auto-expand), and fires at
29
+ * most once per path transition from closed → open.
30
+ */
31
+ onExpand?: (path: string) => void;
32
+ /**
33
+ * Async load state for lazy branches. Exposed via `getLoadState` so
34
+ * renderers can show spinners / error icons without direct access to the
35
+ * map.
36
+ */
37
+ loadState?: Map<string, "loading" | "error">;
38
+ /**
39
+ * Branches to expand initially. User can still collapse them.
40
+ * `resetExpansion()` restores this set rather than clearing to empty.
41
+ *
42
+ * - `Set<string>` — explicit branch paths.
43
+ * - `true` — expand every branch in `tree`.
44
+ * - `false` / `undefined` — expand nothing.
45
+ */
46
+ defaultExpanded?: Set<string> | boolean;
47
+ }
48
+ export interface TreeItemProps {
49
+ id: string;
50
+ role: "treeitem";
51
+ "aria-selected": boolean | undefined;
52
+ "aria-expanded": boolean | undefined;
53
+ "aria-posinset": number;
54
+ "aria-setsize": number;
55
+ tabIndex: -1;
56
+ "data-active": true | undefined;
57
+ onClick: () => void;
58
+ onMouseDown: (e: {
59
+ preventDefault: () => void;
60
+ }) => void;
61
+ onMouseEnter: () => void;
62
+ }
63
+ export interface TreeChevronProps {
64
+ "aria-expanded": boolean;
65
+ "aria-label": string;
66
+ onClick: (e: {
67
+ stopPropagation: () => void;
68
+ preventDefault: () => void;
69
+ }) => void;
70
+ onPointerDown: (e: {
71
+ stopPropagation: () => void;
72
+ preventDefault: () => void;
73
+ }) => void;
74
+ onPointerUp: (e: {
75
+ stopPropagation: () => void;
76
+ preventDefault: () => void;
77
+ }) => void;
78
+ }
79
+ export interface UseTreeReturn {
80
+ /** Flat list of visible nodes in DOM render order. */
81
+ visibleNodes: ResolvedNode[];
82
+ /** Set of explicitly expanded paths (excludes forceOpenPaths). */
83
+ expandedPaths: Set<string>;
84
+ /** Path of the keyboard-active row, or `null`. */
85
+ activePath: string | null;
86
+ /** DOM id of the active row, for `aria-activedescendant`. */
87
+ activeDescendantId: string | undefined;
88
+ /** Toggle a branch open/closed. */
89
+ toggleExpand: (path: string) => void;
90
+ /** Expand a branch (no-op if already open). */
91
+ expand: (path: string) => void;
92
+ /** Collapse a branch (no-op if already closed). */
93
+ collapse: (path: string) => void;
94
+ /** Clear all user-expanded paths. */
95
+ resetExpansion: () => void;
96
+ /** Set the active (keyboard-highlighted) path. */
97
+ setActivePath: (path: string | null) => void;
98
+ /** Spread onto the outer `<div role="treeitem">` wrapper. */
99
+ getItemProps: (node: ResolvedNode) => TreeItemProps;
100
+ /** Spread onto the chevron `<button>`. */
101
+ getChevronProps: (node: ResolvedNode) => TreeChevronProps;
102
+ /** `onKeyDown` handler for the element that holds virtual focus (e.g. search input). */
103
+ handleKeyDown: (e: KeyboardEvent) => void;
104
+ /** Get the DOM id for a given path. */
105
+ rowId: (path: string) => string;
106
+ /** Whether a path is effectively open (expanded or force-open). */
107
+ isOpen: (path: string) => boolean;
108
+ /** Whether a path is the keyboard-active row. */
109
+ isActive: (path: string) => boolean;
110
+ /** Whether a node is the selected value. */
111
+ isSelected: (node: ResolvedNode) => boolean;
112
+ /** Whether any descendant of a node is in the current selection. */
113
+ hasSelectedDescendant: (node: ResolvedNode) => boolean;
114
+ /** Async load state for a path: `"loading"`, `"error"`, or `undefined`. */
115
+ getLoadState: (path: string) => "loading" | "error" | undefined;
116
+ }
117
+ /**
118
+ * Headless hook that manages tree state: expansion, active (keyboard) path,
119
+ * keyboard navigation per WAI-ARIA treeview semantics, ARIA prop generation,
120
+ * and scroll-into-view. Owns no rendering or styling.
121
+ *
122
+ * Designed to be consumed by `TreeSelect` and `TreeSelectNode` but generic
123
+ * enough for any component that renders a tree of `ResolvedNode`s.
124
+ */
125
+ export declare function useTree(options: UseTreeOptions): UseTreeReturn;
126
+ //# sourceMappingURL=useTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTree.d.ts","sourceRoot":"","sources":["../../src/util/useTree.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAOnB,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,IAAI,EAAE,YAAY,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,CAAC;IACb,aAAa,EAAE,IAAI,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,CAAC,CAAC,EAAE;QACX,eAAe,EAAE,MAAM,IAAI,CAAC;QAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;KAC5B,KAAK,IAAI,CAAC;IACX,aAAa,EAAE,CAAC,CAAC,EAAE;QACjB,eAAe,EAAE,MAAM,IAAI,CAAC;QAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;KAC5B,KAAK,IAAI,CAAC;IACX,WAAW,EAAE,CAAC,CAAC,EAAE;QACf,eAAe,EAAE,MAAM,IAAI,CAAC;QAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;KAC5B,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,YAAY,EAAE,YAAY,EAAE,CAAC;IAE7B,kEAAkE;IAClE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kDAAkD;IAClD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,6DAA6D;IAC7D,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEvC,mCAAmC;IACnC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,+CAA+C;IAC/C,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,mDAAmD;IACnD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,qCAAqC;IACrC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kDAAkD;IAClD,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAE7C,6DAA6D;IAC7D,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,aAAa,CAAC;IACpD,0CAA0C;IAC1C,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,gBAAgB,CAAC;IAE1D,wFAAwF;IACxF,aAAa,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAE1C,uCAAuC;IACvC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,mEAAmE;IACnE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,iDAAiD;IACjD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,4CAA4C;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC;IAC5C,oEAAoE;IACpE,qBAAqB,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC;IACvD,2EAA2E;IAC3E,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CACjE;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAkT9D"}