@astryxdesign/lab 0.2.0-canary.fc53ff7 → 0.3.0-canary.2d2dba1

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 (117) hide show
  1. package/README.md +6 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +63 -35
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +271 -75
  5. package/dist/BottomSheet/snapOffsets.d.ts +62 -0
  6. package/dist/BottomSheet/snapOffsets.d.ts.map +1 -0
  7. package/dist/BottomSheet/snapOffsets.js +114 -0
  8. package/dist/BottomSheet/useSheetGestures.d.ts +55 -12
  9. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  10. package/dist/BottomSheet/useSheetGestures.js +383 -40
  11. package/dist/Chart/index.d.ts +1 -1
  12. package/dist/Chart/index.d.ts.map +1 -1
  13. package/dist/Chart/index.js +1 -1
  14. package/dist/ChatReasoning/ChatReasoning.d.ts.map +1 -1
  15. package/dist/ChatReasoning/ChatReasoning.js +10 -1
  16. package/dist/LogStream/LogStream.d.ts +4 -0
  17. package/dist/LogStream/LogStream.d.ts.map +1 -1
  18. package/dist/LogStream/LogStream.js +12 -1
  19. package/dist/RichTextEditor/RichTextEditor.d.ts +18 -2
  20. package/dist/RichTextEditor/RichTextEditor.d.ts.map +1 -1
  21. package/dist/RichTextEditor/RichTextEditor.js +87 -13
  22. package/dist/RichTextEditor/RichTextEditorAutoLinkPlugin.d.ts +85 -0
  23. package/dist/RichTextEditor/RichTextEditorAutoLinkPlugin.d.ts.map +1 -0
  24. package/dist/RichTextEditor/RichTextEditorAutoLinkPlugin.js +95 -0
  25. package/dist/RichTextEditor/RichTextEditorToolbar.d.ts +126 -0
  26. package/dist/RichTextEditor/RichTextEditorToolbar.d.ts.map +1 -0
  27. package/dist/RichTextEditor/RichTextEditorToolbar.js +633 -0
  28. package/dist/RichTextEditor/RichTextView.d.ts.map +1 -1
  29. package/dist/RichTextEditor/RichTextView.js +48 -2
  30. package/dist/RichTextEditor/editorNodes.d.ts +8 -0
  31. package/dist/RichTextEditor/editorNodes.d.ts.map +1 -0
  32. package/dist/RichTextEditor/editorNodes.js +23 -0
  33. package/dist/RichTextEditor/index.d.ts +7 -0
  34. package/dist/RichTextEditor/index.d.ts.map +1 -1
  35. package/dist/RichTextEditor/index.js +5 -1
  36. package/dist/RichTextEditor/linkUtils.d.ts +22 -0
  37. package/dist/RichTextEditor/linkUtils.d.ts.map +1 -0
  38. package/dist/RichTextEditor/linkUtils.js +91 -0
  39. package/dist/RichTextEditor/markdownSerializers.d.ts +40 -0
  40. package/dist/RichTextEditor/markdownSerializers.d.ts.map +1 -0
  41. package/dist/RichTextEditor/markdownSerializers.js +85 -0
  42. package/dist/SVGIcon/SVGIcon.d.ts.map +1 -1
  43. package/dist/SVGIcon/SVGIcon.js +14 -1
  44. package/dist/Stepper/Step.d.ts +6 -1
  45. package/dist/Stepper/Step.d.ts.map +1 -1
  46. package/dist/Stepper/Step.js +34 -7
  47. package/dist/Stepper/Stepper.d.ts +1 -1
  48. package/dist/Stepper/Stepper.js +1 -1
  49. package/dist/index.d.ts +1 -2
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +2 -3
  52. package/dist/lab.css +16 -7
  53. package/package.json +19 -3
  54. package/src/BottomSheet/BottomSheet.doc.mjs +32 -13
  55. package/src/BottomSheet/BottomSheet.test.tsx +174 -4
  56. package/src/BottomSheet/BottomSheet.tsx +404 -97
  57. package/src/BottomSheet/snapOffsets.test.ts +152 -0
  58. package/src/BottomSheet/snapOffsets.ts +139 -0
  59. package/src/BottomSheet/useSheetGestures.doc.mjs +7 -6
  60. package/src/BottomSheet/useSheetGestures.test.ts +316 -65
  61. package/src/BottomSheet/useSheetGestures.ts +515 -55
  62. package/src/Chart/ChartArea.doc.mjs +1 -1
  63. package/src/Chart/ChartBar.doc.mjs +1 -1
  64. package/src/Chart/ChartCandlestick.doc.mjs +1 -1
  65. package/src/Chart/ChartDot.doc.mjs +1 -1
  66. package/src/Chart/ChartDotGL.doc.mjs +1 -1
  67. package/src/Chart/ChartDotGLInteractive.doc.mjs +1 -1
  68. package/src/Chart/ChartHeatmapGL.doc.mjs +1 -1
  69. package/src/Chart/ChartLine.doc.mjs +1 -1
  70. package/src/Chart/ChartStreamGL.doc.mjs +1 -1
  71. package/src/Chart/index.ts +0 -1
  72. package/src/Chat/ChatEmojiPicker.doc.mjs +1 -1
  73. package/src/Chat/ChatReactionBar.doc.mjs +1 -1
  74. package/src/Chat/ChatTypingIndicator.doc.mjs +1 -1
  75. package/src/Chat/ChatUnreadDivider.doc.mjs +1 -1
  76. package/src/ChatReasoning/ChatReasoning.doc.mjs +1 -1
  77. package/src/ChatReasoning/ChatReasoning.test.tsx +25 -0
  78. package/src/ChatReasoning/ChatReasoning.tsx +9 -1
  79. package/src/CircularProgress/CircularProgress.doc.mjs +3 -3
  80. package/src/CodeEditor/CodeEditor.doc.mjs +1 -1
  81. package/src/Drawer/Drawer.doc.mjs +3 -3
  82. package/src/InfoTip/InfoTip.doc.mjs +3 -3
  83. package/src/LogStream/LogStream.doc.mjs +2 -2
  84. package/src/LogStream/LogStream.test.tsx +25 -0
  85. package/src/LogStream/LogStream.tsx +10 -0
  86. package/src/Radial/RadialChart.doc.mjs +1 -1
  87. package/src/RichTextEditor/RichTextEditor.doc.mjs +34 -2
  88. package/src/RichTextEditor/RichTextEditor.test.tsx +761 -22
  89. package/src/RichTextEditor/RichTextEditor.tsx +138 -22
  90. package/src/RichTextEditor/RichTextEditorAutoLinkPlugin.tsx +116 -0
  91. package/src/RichTextEditor/RichTextEditorToolbar.tsx +789 -0
  92. package/src/RichTextEditor/RichTextView.tsx +44 -1
  93. package/src/RichTextEditor/editorNodes.ts +34 -0
  94. package/src/RichTextEditor/index.ts +26 -0
  95. package/src/RichTextEditor/linkUtils.ts +93 -0
  96. package/src/RichTextEditor/markdownSerializers.ts +105 -0
  97. package/src/SVGIcon/SVGIcon.doc.mjs +1 -1
  98. package/src/SVGIcon/SVGIcon.test.tsx +40 -0
  99. package/src/SVGIcon/SVGIcon.tsx +14 -6
  100. package/src/Sankey/SankeyChart.doc.mjs +1 -1
  101. package/src/Schedule/Schedule.doc.mjs +1 -1
  102. package/src/Stat/Stat.doc.mjs +3 -3
  103. package/src/Stepper/Step.doc.mjs +1 -1
  104. package/src/Stepper/Step.tsx +45 -5
  105. package/src/Stepper/Stepper.doc.mjs +3 -3
  106. package/src/Stepper/Stepper.test.tsx +84 -3
  107. package/src/Stepper/Stepper.tsx +1 -1
  108. package/src/ThreeD/3DBar.doc.mjs +1 -1
  109. package/src/ThreeD/3DChart.doc.mjs +1 -1
  110. package/src/ThreeD/3DScatter.doc.mjs +1 -1
  111. package/src/ThreeD/3DScatterGL.doc.mjs +1 -1
  112. package/src/ThreeD/3DSurface.doc.mjs +1 -1
  113. package/src/index.ts +15 -2
  114. package/dist/CodeBlock/index.d.ts +0 -8
  115. package/dist/CodeBlock/index.d.ts.map +0 -1
  116. package/dist/CodeBlock/index.js +0 -9
  117. package/src/CodeBlock/index.ts +0 -10
@@ -0,0 +1,114 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file snapOffsets.ts
5
+ * @input Pure geometry helpers — no React, no DOM.
6
+ * @output Converts snap points to translateY offsets for the sheet surface.
7
+ * @position Internal to BottomSheet; consumed by useSheetGestures, tested by
8
+ * snapOffsets.test.ts.
9
+ *
10
+ * The sheet is rendered at its full (fully-open) height and *translated down*
11
+ * to express shorter detents — translate is GPU-composited, so this is cheaper
12
+ * than animating layout height. A detent is therefore a translateY offset in
13
+ * px from the fully-open position (0 = fully open, larger = more collapsed).
14
+ * These helpers turn snap points into that offset list; they are pure so the
15
+ * geometry can be unit-tested without a DOM.
16
+ */
17
+
18
+ /**
19
+ * Detents whose resting offsets land within this many px of each other are
20
+ * treated as the same stop (the taller one wins). Stops the sheet from having
21
+ * two near-identical rest positions — e.g. when a content-hugging height sits
22
+ * a hair away from a fractional snap point.
23
+ */
24
+ export const DETENT_DEDUP_PX = 48;
25
+
26
+ /** Resolve snap points given as viewport fractions (0, 1] to px heights. */
27
+ export function snapFractionsToHeights(fractions, viewportPx) {
28
+ return fractions.filter(f => f > 0 && f <= 1).map(f => f * viewportPx);
29
+ }
30
+
31
+ /**
32
+ * Given the sheet's full height (px, as rendered fully open) and a set of
33
+ * candidate detent *visible heights* (px), return the resting translateY
34
+ * offsets from fully-open, ascending and de-duplicated.
35
+ *
36
+ * - `0` (fully open) is always the first detent.
37
+ * - Only heights strictly shorter than the sheet become collapsed detents; a
38
+ * height >= the sheet can't be shown by translating down, so it's dropped.
39
+ * - Offsets closer than `dedupPx` collapse to the smaller (taller) offset, so
40
+ * near-identical detents — e.g. a hug height ≈ a snap point — become one stop.
41
+ */
42
+ export function computeDetentOffsets(sheetHeight, detentHeights, dedupPx = DETENT_DEDUP_PX) {
43
+ const collapsed = detentHeights.filter(h => h > 0 && h < sheetHeight).map(h => sheetHeight - h);
44
+ const ascending = [0, ...collapsed].sort((a, b) => a - b);
45
+ const deduped = [];
46
+ for (const offset of ascending) {
47
+ const last = deduped[deduped.length - 1];
48
+ if (last === undefined || offset - last >= dedupPx) {
49
+ deduped.push(offset);
50
+ }
51
+ }
52
+ return deduped;
53
+ }
54
+
55
+ /** Nearest value in `offsets` to `value` (offsets must be non-empty). */
56
+ export function nearestOffset(value, offsets) {
57
+ return offsets.reduce((best, o) => Math.abs(o - value) < Math.abs(best - value) ? o : best, offsets[0]);
58
+ }
59
+
60
+ /**
61
+ * Minimum scrim opacity at the peek detent. The scrim thins to a glance state
62
+ * but never fully vanishes, because a modal sheet keeps the background inert —
63
+ * a fully clear backdrop would read as "interactive" when it isn't. (For a
64
+ * genuinely interactive, undimmed peek, use a non-modal sheet, `hasScrim=false`.)
65
+ */
66
+ export const MIN_PEEK_SCRIM_OPACITY = 0.3;
67
+
68
+ /**
69
+ * Scrim opacity (1 = fully visible) for a drag/settle `offset`.
70
+ * The scrim stays full while the sheet is at or above its second-shortest
71
+ * detent, then fades as it collapses onto the shortest ("peek") detent — a
72
+ * glance state that thins the backdrop to `MIN_PEEK_SCRIM_OPACITY` (not fully
73
+ * gone, since the sheet is still modal) and holds there below it.
74
+ * A single-detent sheet has no peek, so it instead fades all the way to 0
75
+ * across the dismiss overshoot toward `dismissOffset` (the sheet is leaving).
76
+ */
77
+ export function scrimOpacityForOffset(offset, offsets, dismissOffset) {
78
+ const shortest = offsets[offsets.length - 1];
79
+ const hasPeek = offsets.length >= 2;
80
+ const fadeStart = hasPeek ? offsets[offsets.length - 2] : 0;
81
+ const fadeEnd = hasPeek ? shortest : dismissOffset;
82
+ // Peek is a resting state on a still-modal sheet, so keep a floor; the
83
+ // dismiss overshoot is a sheet on its way out, so let it clear completely.
84
+ const floor = hasPeek ? MIN_PEEK_SCRIM_OPACITY : 0;
85
+ if (offset <= fadeStart) {
86
+ return 1;
87
+ }
88
+ if (offset >= fadeEnd) {
89
+ return floor;
90
+ }
91
+ return 1 - (1 - floor) * ((offset - fadeStart) / (fadeEnd - fadeStart));
92
+ }
93
+
94
+ /**
95
+ * Settle target for a released drag. Restricts candidates to the drag
96
+ * direction so a committed drag never snaps *back past* where it started
97
+ * (a down-drag settles at/below the start, an up-drag at/above), then picks
98
+ * the nearest remaining detent. `dir`: 1 = dragged down, -1 = up, 0 = neither.
99
+ */
100
+ export function resolveSettleOffset(value, offsets, dir, baseOffset) {
101
+ let candidates = offsets;
102
+ if (dir > 0) {
103
+ const downward = offsets.filter(o => o >= baseOffset);
104
+ if (downward.length > 0) {
105
+ candidates = downward;
106
+ }
107
+ } else if (dir < 0) {
108
+ const upward = offsets.filter(o => o <= baseOffset);
109
+ if (upward.length > 0) {
110
+ candidates = upward;
111
+ }
112
+ }
113
+ return nearestOffset(value, candidates);
114
+ }
@@ -4,13 +4,14 @@
4
4
  * @output Exports useSheetGestures hook and its option/result types
5
5
  * @position Internal to BottomSheet; not exported from the lab entry point
6
6
  *
7
- * Drag-to-dismiss machinery for the bottom sheet. Tracks a pointer drag
8
- * down the block axis, translates the sliding surface live, and on release
9
- * either dismisses (past a distance or velocity threshold) or springs back
10
- * to fully open. Pointer-events based so one code path covers mouse + touch.
7
+ * Drag + snap machinery for the bottom sheet. Tracks a pointer drag down the
8
+ * block axis, translates the sliding surface live, and on release either
9
+ * settles to the nearest snap detent (a slow drag) or dismisses (a fast flick
10
+ * down). A fast flick up expands to the tallest detent. This is the core
11
+ * behavior split the sheet needs: DRAG places, SWIPE closes.
11
12
  *
12
- * Kept private to BottomSheet: the behavior is sheet-specific (a dismiss
13
- * edge on a bottom-anchored surface). It is not a general primitive and is
13
+ * Kept private to BottomSheet: a dismiss edge + detents on a bottom-anchored
14
+ * surface are inherently sheet concepts. It is not a general primitive and is
14
15
  * intentionally not exported.
15
16
  *
16
17
  * SSR-safe: no window/document access at module scope; all measurement
@@ -25,8 +26,27 @@ import { type CSSProperties, type PointerEvent as ReactPointerEvent } from 'reac
25
26
  export interface UseSheetGesturesOptions {
26
27
  /** Whether the owning sheet is open. Drag state resets when it closes. */
27
28
  isOpen: boolean;
28
- /** Called when a drag crosses the dismiss threshold (distance or flick). */
29
+ /** Called on a swipe-to-close (fast downward flick, or drag past the floor). */
29
30
  onDismiss: () => void;
31
+ /**
32
+ * Resolver for candidate detent heights in px BELOW the full sheet height.
33
+ * Called lazily at the start of each drag so the values stay current (e.g.
34
+ * after a rotation or the virtual keyboard opening) without a persistent
35
+ * resize listener. The measured full height is always the tallest detent,
36
+ * so the effective detent set is `[...snapHeights(), fullHeight]`. Omit for
37
+ * a single-height sheet (a drag then only dismisses or springs back).
38
+ */
39
+ snapHeights?: () => number[];
40
+ /** Notified when the settled detent height (px) changes. */
41
+ onSnap?: (heightPx: number) => void;
42
+ /**
43
+ * Called with the scrim opacity the sheet should show (1 = fully visible,
44
+ * 0 = hidden) as the drag moves and on settle. Full while the sheet is at
45
+ * or above its mid detent, fading to 0 as it collapses onto the shortest
46
+ * "peek" detent — thinning to a faint glance state without fully clearing — and
47
+ * on the dismiss overshoot. Lets the owner mirror it onto the scrim.
48
+ */
49
+ onScrimOpacity?: (opacity: number) => void;
30
50
  }
31
51
  export interface SheetContentProps {
32
52
  style: CSSProperties;
@@ -38,26 +58,49 @@ export interface SheetHandleProps {
38
58
  onPointerUp: (event: ReactPointerEvent) => void;
39
59
  onPointerCancel: (event: ReactPointerEvent) => void;
40
60
  }
61
+ export interface SheetBodyProps {
62
+ ref: (node: HTMLElement | null) => void;
63
+ onPointerDown: (event: ReactPointerEvent) => void;
64
+ onPointerMove: (event: ReactPointerEvent) => void;
65
+ onPointerUp: (event: ReactPointerEvent) => void;
66
+ onPointerCancel: (event: ReactPointerEvent) => void;
67
+ }
41
68
  export interface UseSheetGesturesResult {
69
+ /**
70
+ * Callback ref for the sheet surface. The hook observes it (ResizeObserver)
71
+ * to keep the fully-open height current, so detents stay correct across
72
+ * rotation / viewport changes without re-measuring mid-drag.
73
+ */
74
+ sheetRef: (node: HTMLElement | null) => void;
42
75
  /** Spread on the sliding surface: live translate + touch-action guard. */
43
76
  contentProps: SheetContentProps;
44
77
  /** Spread on the grab-handle element: pointer drag handlers. */
45
78
  handleProps: SheetHandleProps;
46
- /** Current live drag offset in px (positive = dragged toward the edge). */
79
+ /**
80
+ * Spread on the scrollable body. An overscroll-at-top pull-down starts a
81
+ * sheet drag (a larger, more forgiving target when the content isn't itself
82
+ * scrolling); normal scrolling passes through untouched.
83
+ */
84
+ bodyProps: SheetBodyProps;
85
+ /** Current live drag translate in px (0 = fully expanded, larger = collapsed). */
47
86
  dragOffset: number;
87
+ /** Translate of the resting detent in px (0 = tallest detent). */
88
+ settledOffset: number;
48
89
  /** Whether a drag is currently in progress. */
49
90
  isDragging: boolean;
50
91
  }
51
92
  /**
52
- * Drag-to-dismiss machinery for the bottom sheet. Returns props to spread on
53
- * the grab handle and the sliding surface, plus live drag state for callers
54
- * that want to drive their own animation.
93
+ * Drag + snap machinery for the bottom sheet. Returns props to spread on the
94
+ * grab handle and the sliding surface, plus live drag state. A slow drag
95
+ * settles to the nearest detent; a fast downward flick dismisses; a fast
96
+ * upward flick expands to the tallest detent.
55
97
  *
56
98
  * @example
57
99
  * ```
58
100
  * const {contentProps, handleProps} = useSheetGestures({
59
101
  * isOpen,
60
102
  * onDismiss: () => onOpenChange(false),
103
+ * snapHeights: () => [240, 0.5 * (window.visualViewport?.height ?? 0)],
61
104
  * });
62
105
  * <div {...contentProps}>
63
106
  * <div {...handleProps} />
@@ -65,5 +108,5 @@ export interface UseSheetGesturesResult {
65
108
  * </div>
66
109
  * ```
67
110
  */
68
- export declare function useSheetGestures({ isOpen, onDismiss, }: UseSheetGesturesOptions): UseSheetGesturesResult;
111
+ export declare function useSheetGestures({ isOpen, onDismiss, snapHeights, onSnap, onScrimOpacity, }: UseSheetGesturesOptions): UseSheetGesturesResult;
69
112
  //# sourceMappingURL=useSheetGestures.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSheetGestures.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/useSheetGestures.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,OAAO,CAAC;AAQf,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,YAAY,EAAE,iBAAiB,CAAC;IAChC,gEAAgE;IAChE,WAAW,EAAE,gBAAgB,CAAC;IAC9B,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;CACrB;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,SAAS,GACV,EAAE,uBAAuB,GAAG,sBAAsB,CA4HlD"}
1
+ {"version":3,"file":"useSheetGestures.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/useSheetGestures.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,OAAO,CAAC;AAgEf,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,0EAA0E;IAC1E,YAAY,EAAE,iBAAiB,CAAC;IAChC,gEAAgE;IAChE,WAAW,EAAE,gBAAgB,CAAC;IAC9B;;;;OAIG;IACH,SAAS,EAAE,cAAc,CAAC;IAC1B,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;CACrB;AASD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,SAAS,EACT,WAAW,EACX,MAAM,EACN,cAAc,GACf,EAAE,uBAAuB,GAAG,sBAAsB,CAielD"}