flexlayout-react 0.8.6 → 0.8.8

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.
@@ -11,7 +11,6 @@ import { useTabOverflow } from "./TabOverflowHook";
11
11
  import { Orientation } from "../Orientation";
12
12
  import { CLASSES } from "../Types";
13
13
  import { isAuxMouseEvent } from "./Utils";
14
- import { Rect } from "../Rect";
15
14
 
16
15
  /** @internal */
17
16
  export interface IBorderTabSetProps {
@@ -33,10 +32,10 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
33
32
  const icons = layout.getIcons();
34
33
 
35
34
  React.useLayoutEffect(() => {
36
- border.setTabHeaderRect(Rect.getBoundingClientRect(selfRef.current!).relativeTo(layout.getDomRect()!));
35
+ border.setTabHeaderRect(layout.getBoundingClientRect(selfRef.current!));
37
36
  });
38
37
 
39
- const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isTabOverflow } =
38
+ const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs } =
40
39
  useTabOverflow(layout, border, Orientation.flip(border.getOrientation()), tabStripInnerRef, miniScrollRef,
41
40
  layout.getClassName(CLASSES.FLEXLAYOUT__BORDER_BUTTON)
42
41
  );
@@ -133,7 +132,7 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
133
132
  }
134
133
 
135
134
  if (stickyButtons.length > 0) {
136
- if (isTabOverflow) {
135
+ if (isDockStickyButtons) {
137
136
  buttons = [...stickyButtons, ...buttons];
138
137
  } else {
139
138
  tabButtons.push(<div
@@ -148,7 +147,7 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
148
147
  }
149
148
  }
150
149
 
151
- if (hiddenTabs.length > 0) {
150
+ if (isShowHiddenTabs) {
152
151
  const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip);
153
152
  let overflowContent;
154
153
  if (typeof icons.more === "function") {
@@ -158,7 +157,7 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
158
157
  } else {
159
158
  overflowContent = (<>
160
159
  {icons.more}
161
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length}</div>
160
+ <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length>0?hiddenTabs.length: ""}</div>
162
161
  </>);
163
162
  }
164
163
  buttons.splice(Math.min(renderState.overflowPosition, buttons.length), 0,
@@ -1228,7 +1228,7 @@ export class LayoutInternal extends React.Component<ILayoutInternalProps, ILayou
1228
1228
  // *************************** End Drag Drop *************************************
1229
1229
  }
1230
1230
 
1231
- export const FlexLayoutVersion = "0.8.6";
1231
+ export const FlexLayoutVersion = "0.8.8";
1232
1232
 
1233
1233
  export type DragRectRenderCallback = (
1234
1234
  content: React.ReactNode | undefined,
@@ -5,6 +5,7 @@ import { LayoutInternal } from "./Layout";
5
5
  import { TabButtonStamp } from "./TabButtonStamp";
6
6
  import { TabSetNode } from "../model/TabSetNode";
7
7
  import { BorderNode } from "../model/BorderNode";
8
+ import { useEffect, useRef } from "react";
8
9
 
9
10
  /** @internal */
10
11
  export function showPopup(
@@ -86,6 +87,14 @@ interface IPopupMenuProps {
86
87
  /** @internal */
87
88
  const PopupMenu = (props: IPopupMenuProps) => {
88
89
  const { parentNode, items, onHide, onSelect, classNameMapper, layout } = props;
90
+ const divRef = useRef<HTMLDivElement>(null);
91
+
92
+ useEffect(() => {
93
+ // Set focus when the component mounts
94
+ if (divRef.current) {
95
+ divRef.current.focus();
96
+ }
97
+ }, []);
89
98
 
90
99
  const onItemClick = (item: { index: number; node: TabNode }, event: React.MouseEvent<HTMLElement, MouseEvent>) => {
91
100
  onSelect(item);
@@ -106,6 +115,12 @@ const PopupMenu = (props: IPopupMenuProps) => {
106
115
  layout.clearDragMain();
107
116
  };
108
117
 
118
+ const handleKeyDown = (event: React.KeyboardEvent) => {
119
+ if (event.key === "Escape") {
120
+ onHide();
121
+ }
122
+ };
123
+
109
124
  const itemElements = items.map((item, i) => {
110
125
  let classes = classNameMapper(CLASSES.FLEXLAYOUT__POPUP_MENU_ITEM);
111
126
  if (parentNode.getSelected() === item.index) {
@@ -131,6 +146,9 @@ const PopupMenu = (props: IPopupMenuProps) => {
131
146
 
132
147
  return (
133
148
  <div className={classNameMapper(CLASSES.FLEXLAYOUT__POPUP_MENU)}
149
+ ref={divRef}
150
+ tabIndex={0} // Make div focusable
151
+ onKeyDown={handleKeyDown}
134
152
  data-layout-path="/popup-menu"
135
153
  >
136
154
  {itemElements}
@@ -5,6 +5,7 @@ import { Orientation } from "../Orientation";
5
5
  import { LayoutInternal } from "./Layout";
6
6
  import { TabNode } from "../model/TabNode";
7
7
  import { startDrag } from "./Utils";
8
+ import { Rect } from "../Rect";
8
9
 
9
10
  /** @internal */
10
11
  export const useTabOverflow = (
@@ -16,47 +17,66 @@ export const useTabOverflow = (
16
17
  tabClassName: string
17
18
  ) => {
18
19
  const [hiddenTabs, setHiddenTabs] = React.useState<number[]>([]);
19
- const [isTabOverflow, setTabOverflow] = React.useState<boolean>(false);
20
+ const [isShowHiddenTabs, setShowHiddenTabs] = React.useState<boolean>(false);
21
+ const [isDockStickyButtons, setDockStickyButtons] = React.useState<boolean>(false);
20
22
 
21
23
  const selfRef = React.useRef<HTMLDivElement | null>(null);
22
24
  const userControlledPositionRef = React.useRef<boolean>(false);
23
25
  const updateHiddenTabsTimerRef = React.useRef<NodeJS.Timeout | undefined>(undefined);
24
26
  const hiddenTabsRef = React.useRef<number[]>([]);
25
27
  const thumbInternalPos = React.useRef<number>(0);
28
+ const repositioningRef = React.useRef<boolean>(false);
26
29
  hiddenTabsRef.current = hiddenTabs;
27
30
 
28
31
  // if node changes (new model) then reset scroll to 0
29
- React.useEffect(() => {
32
+ React.useLayoutEffect(() => {
30
33
  if (tabStripRef.current) {
31
34
  setScrollPosition(0);
32
35
  }
33
36
  }, [node]);
34
-
37
+
35
38
  // if selected node or tabset/border rectangle change then unset usercontrolled (so selected tab will be kept in view)
36
- React.useEffect(() => {
39
+ React.useLayoutEffect(() => {
37
40
  userControlledPositionRef.current = false;
38
41
  }, [node.getSelectedNode(), node.getRect().width, node.getRect().height]);
39
42
 
40
- React.useEffect(() => {
43
+ React.useLayoutEffect(() => {
41
44
  checkForOverflow(); // if tabs + sticky buttons length > scroll area => move sticky buttons to right buttons
42
45
 
43
- if (!userControlledPositionRef.current) {
44
- const selectedTab = findSelectedTab();
45
- if (selectedTab) {
46
- selectedTab.scrollIntoView();
47
- }
46
+ if (userControlledPositionRef.current === false) {
47
+ scrollIntoView();
48
48
  }
49
49
 
50
- updateHiddenTabs();
51
50
  updateScrollMetrics();
51
+ updateHiddenTabs();
52
52
  });
53
53
 
54
+ function scrollIntoView() {
55
+ const selectedTabNode = node.getSelectedNode() as TabNode;
56
+ if (selectedTabNode && tabStripRef.current) {
57
+ const stripRect = layout.getBoundingClientRect(tabStripRef.current);
58
+ const selectedRect = selectedTabNode.getTabRect()!;
59
+
60
+ let shift = getNear(stripRect) - getNear(selectedRect);
61
+ if (shift > 0 || getSize(selectedRect) > getSize(stripRect)) {
62
+ setScrollPosition(getScrollPosition(tabStripRef.current) - shift);
63
+ repositioningRef.current = true; // prevent onScroll setting userControlledPosition
64
+ } else {
65
+ shift = getFar(selectedRect) - getFar(stripRect);
66
+ if (shift > 0) {
67
+ setScrollPosition(getScrollPosition(tabStripRef.current) + shift);
68
+ repositioningRef.current = true;
69
+ }
70
+ }
71
+ }
72
+ }
73
+
54
74
  const updateScrollMetrics = () => {
55
75
  if (tabStripRef.current && miniScrollRef.current) {
56
76
  const t = tabStripRef.current;
57
77
  const s = miniScrollRef.current;
58
78
 
59
- const size = getSize(t);
79
+ const size = getElementSize(t);
60
80
  const scrollSize = getScrollSize(t);
61
81
  const position = getScrollPosition(t);
62
82
 
@@ -67,7 +87,7 @@ export const useTabOverflow = (
67
87
  adjust = 20 - thumbSize;
68
88
  thumbSize = 20;
69
89
  }
70
- const thumbPos = position * (size - adjust) / scrollSize;
90
+ const thumbPos = position * (size - adjust) / scrollSize;
71
91
  if (orientation === Orientation.HORZ) {
72
92
  s.style.width = thumbSize + "px";
73
93
  s.style.left = thumbPos + "px";
@@ -89,6 +109,13 @@ export const useTabOverflow = (
89
109
  }
90
110
 
91
111
  const updateHiddenTabs = () => {
112
+ const newHiddenTabs = findHiddenTabs();
113
+ const showHidden = newHiddenTabs.length > 0;
114
+
115
+ if (showHidden !== isShowHiddenTabs) {
116
+ setShowHiddenTabs(showHidden);
117
+ }
118
+
92
119
  if (updateHiddenTabsTimerRef.current === undefined) {
93
120
  // throttle updates to prevent Maximum update depth exceeded error
94
121
  updateHiddenTabsTimerRef.current = setTimeout(() => {
@@ -102,25 +129,11 @@ export const useTabOverflow = (
102
129
  }
103
130
  }
104
131
 
105
- const updateTabRects = () => {
106
- if (tabStripRef.current) {
107
- const tabContainer = tabStripRef.current.firstElementChild!;
108
-
109
- const nodeChildren = node.getChildren();
110
- let i = 0;
111
- Array.from(tabContainer.children).forEach((child) => {
112
- if (child.classList.contains(tabClassName)) {
113
- const childNode = nodeChildren[i] as TabNode;
114
- childNode.setTabRect(layout.getBoundingClientRect(child as HTMLElement));
115
- i++;
116
- }
117
- });
118
- }
119
- }
120
-
121
132
  const onScroll = () => {
122
- userControlledPositionRef.current = true;
123
- updateTabRects();
133
+ if (!repositioningRef.current){
134
+ userControlledPositionRef.current=true;
135
+ }
136
+ repositioningRef.current = false;
124
137
  updateScrollMetrics()
125
138
  updateHiddenTabs();
126
139
  };
@@ -134,7 +147,6 @@ export const useTabOverflow = (
134
147
  } else {
135
148
  thumbInternalPos.current = event.clientY - r.y;
136
149
  }
137
- userControlledPositionRef.current = true;
138
150
  startDrag(event.currentTarget.ownerDocument, event, onDragMove, onDragEnd, onDragCancel);
139
151
  }
140
152
 
@@ -142,9 +154,9 @@ export const useTabOverflow = (
142
154
  if (tabStripRef.current && miniScrollRef.current) {
143
155
  const t = tabStripRef.current;
144
156
  const s = miniScrollRef.current;
145
- const size = getSize(t);
157
+ const size = getElementSize(t);
146
158
  const scrollSize = getScrollSize(t);
147
- const thumbSize = getSize(s);
159
+ const thumbSize = getElementSize(s);
148
160
 
149
161
  const r = t.getBoundingClientRect()!;
150
162
  let thumb = 0;
@@ -168,29 +180,15 @@ export const useTabOverflow = (
168
180
  const onDragCancel = () => {
169
181
  }
170
182
 
171
- const findSelectedTab: () => Element | undefined = () => {
172
- let found: Element | undefined = undefined;
173
- if (tabStripRef.current) {
174
- const tabContainer = tabStripRef.current.firstElementChild!;
175
-
176
- Array.from(tabContainer.children).forEach((child) => {
177
- if (child.classList.contains(tabClassName + "--selected")) {
178
- found = child;
179
- }
180
- });
181
- }
182
- return found;
183
- };
184
-
185
183
  const checkForOverflow = () => {
186
184
  if (tabStripRef.current) {
187
185
  const strip = tabStripRef.current;
188
186
  const tabContainer = strip.firstElementChild!;
189
187
 
190
- const offset = isTabOverflow ? 10 : 0; // prevents flashing, after sticky buttons docked set, must be 10 pixels smaller before unsetting
191
- const dock = (getSize(tabContainer) + offset) > getSize(tabStripRef.current);
192
- if (dock !== isTabOverflow) {
193
- setTabOverflow(dock);
188
+ const offset = isDockStickyButtons ? 10 : 0; // prevents flashing, after sticky buttons docked set, must be 10 pixels smaller before unsetting
189
+ const dock = (getElementSize(tabContainer) + offset) > getElementSize(tabStripRef.current);
190
+ if (dock !== isDockStickyButtons) {
191
+ setDockStickyButtons(dock);
194
192
  }
195
193
  }
196
194
  }
@@ -233,12 +231,9 @@ export const useTabOverflow = (
233
231
  delta *= 40;
234
232
  }
235
233
  const newPos = getScrollPosition(tabStripRef.current) - delta;
236
- const maxScroll = getScrollSize(tabStripRef.current) - getSize(tabStripRef.current);
234
+ const maxScroll = getScrollSize(tabStripRef.current) - getElementSize(tabStripRef.current);
237
235
  const p = Math.max(0, Math.min(maxScroll, newPos));
238
236
  setScrollPosition(p);
239
- updateTabRects();
240
- updateHiddenTabs();
241
- userControlledPositionRef.current = true;
242
237
  event.stopPropagation();
243
238
  }
244
239
  }
@@ -246,7 +241,7 @@ export const useTabOverflow = (
246
241
 
247
242
  // orientation helpers:
248
243
 
249
- const getNear = (rect: DOMRect) => {
244
+ const getNear = (rect: DOMRect | Rect) => {
250
245
  if (orientation === Orientation.HORZ) {
251
246
  return rect.x;
252
247
  } else {
@@ -254,7 +249,7 @@ export const useTabOverflow = (
254
249
  }
255
250
  };
256
251
 
257
- const getFar = (rect: DOMRect) => {
252
+ const getFar = (rect: DOMRect | Rect) => {
258
253
  if (orientation === Orientation.HORZ) {
259
254
  return rect.right;
260
255
  } else {
@@ -262,7 +257,7 @@ export const useTabOverflow = (
262
257
  }
263
258
  };
264
259
 
265
- const getSize = (elm: Element) => {
260
+ const getElementSize = (elm: Element) => {
266
261
  if (orientation === Orientation.HORZ) {
267
262
  return elm.clientWidth;
268
263
  } else {
@@ -270,6 +265,14 @@ export const useTabOverflow = (
270
265
  }
271
266
  }
272
267
 
268
+ const getSize = (rect: DOMRect | Rect) => {
269
+ if (orientation === Orientation.HORZ) {
270
+ return rect.width;
271
+ } else {
272
+ return rect.height;
273
+ }
274
+ }
275
+
273
276
  const getScrollSize = (elm: Element) => {
274
277
  if (orientation === Orientation.HORZ) {
275
278
  return elm.scrollWidth;
@@ -294,7 +297,7 @@ export const useTabOverflow = (
294
297
  }
295
298
  }
296
299
 
297
- return { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isTabOverflow };
300
+ return { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs };
298
301
  };
299
302
 
300
303
  function arraysEqual(arr1: number[], arr2: number[]) {
@@ -51,7 +51,7 @@ export const TabSet = (props: ITabSetProps) => {
51
51
  });
52
52
 
53
53
  // this must be after the useEffect, so the node rect is already set (else window popin will not position tabs correctly)
54
- const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isTabOverflow } =
54
+ const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs } =
55
55
  useTabOverflow(layout, node, Orientation.HORZ, tabStripInnerRef, miniScrollRef,
56
56
  layout.getClassName(CLASSES.FLEXLAYOUT__TAB_BUTTON));
57
57
 
@@ -186,7 +186,7 @@ export const TabSet = (props: ITabSetProps) => {
186
186
  }
187
187
 
188
188
  if (stickyButtons.length > 0) {
189
- if (!node.isEnableTabWrap() && (isTabOverflow || isTabStretch)) {
189
+ if (!node.isEnableTabWrap() && (isDockStickyButtons || isTabStretch)) {
190
190
  buttons = [...stickyButtons, ...buttons];
191
191
  } else {
192
192
  tabs.push(<div
@@ -202,7 +202,7 @@ export const TabSet = (props: ITabSetProps) => {
202
202
  }
203
203
 
204
204
  if (!node.isEnableTabWrap()) {
205
- if (hiddenTabs.length > 0) {
205
+ if (isShowHiddenTabs) {
206
206
  const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip);
207
207
  let overflowContent;
208
208
  if (typeof icons.more === "function") {
@@ -211,7 +211,7 @@ export const TabSet = (props: ITabSetProps) => {
211
211
  } else {
212
212
  overflowContent = (<>
213
213
  {icons.more}
214
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length}</div>
214
+ <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length>0?hiddenTabs.length: ""}</div>
215
215
  </>);
216
216
  }
217
217
  buttons.splice(Math.min(renderState.overflowPosition, buttons.length), 0,
package/style/_base.scss CHANGED
@@ -75,6 +75,7 @@
75
75
  background-color: var(--color-splitter-hover);
76
76
  transition: background-color ease-in .1s;
77
77
  transition-delay: 0.05s;
78
+ border-radius: 5px;
78
79
  }
79
80
  }
80
81
 
@@ -559,9 +559,9 @@
559
559
  --color-border-tab-unselected: gray;
560
560
  --color-border-tab-unselected-background: #d3d4e745;
561
561
 
562
- --color-splitter: #{$color_background};
563
- --color-splitter-hover: var(--color-4);
564
- --color-splitter-drag: var(--color-4);
562
+ --color-splitter: var(--color-background);
563
+ --color-splitter-hover: var(--color-2);
564
+ --color-splitter-drag: var(--color-2);
565
565
 
566
566
  --color-drag-rect-border: #ccc;
567
567
  --color-drag-rect-background: var(--color-5);
@@ -642,8 +642,5 @@
642
642
  background-color: var(--color-3);
643
643
  }
644
644
 
645
- &__splitter {
646
- background-color: transparent;
647
- }
648
645
  }
649
646
  }
@@ -267,9 +267,9 @@
267
267
  --color-border-tab-selected-background: var(--color-2);
268
268
  --color-border-tab-unselected: gray;
269
269
  --color-border-tab-unselected-background: #d3d4e745;
270
- --color-splitter: #f2f6fb;
271
- --color-splitter-hover: var(--color-4);
272
- --color-splitter-drag: var(--color-4);
270
+ --color-splitter: var(--color-background);
271
+ --color-splitter-hover: var(--color-2);
272
+ --color-splitter-drag: var(--color-2);
273
273
  --color-drag-rect-border: #ccc;
274
274
  --color-drag-rect-background: var(--color-5);
275
275
  --color-drag-rect: var(--color-text);
@@ -356,6 +356,7 @@
356
356
  background-color: var(--color-splitter-hover);
357
357
  transition: background-color ease-in 0.1s;
358
358
  transition-delay: 0.05s;
359
+ border-radius: 5px;
359
360
  }
360
361
  }
361
362
  .flexlayout__splitter_drag {
@@ -1048,8 +1049,5 @@
1048
1049
  .flexlayout__theme_rounded .flexlayout__border_button_trailing:hover {
1049
1050
  background-color: var(--color-3);
1050
1051
  }
1051
- .flexlayout__theme_rounded .flexlayout__splitter {
1052
- background-color: transparent;
1053
- }
1054
1052
 
1055
1053
  /*# sourceMappingURL=combined.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["_themes.scss","_base.scss","combined.scss"],"names":[],"mappings":"AAqBQ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA+BJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA2DJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AAgEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;;;AAmEJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EAEA;;;ACvjBR;AAAA;AAAA;AAII;EAnBJ;EACA;EACA;EACA;EACA;EAiBQ;EACA;;AAEA;EAxBR;EACA;EACA;EACA;EACA;EAsBY;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EAtCR;EACA;EACA;EACA;EAqCY;EACA;;AAIR;EA7CJ;EACA;EACA;EACA;EA4CQ;;AAGJ;EAlDJ;EACA;EACA;EACA;EAiDQ;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;IACA;;;AAOR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAxJJ;EACA;EACA;EACA;EAuJQ;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAzKR;EACA;EACA;EACA;EAwKY;EACA;EACA;;AAGJ;EACI;;AAGJ;EApLR;EACA;EACA;EACA;EAmLY;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKJ;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EAEI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAMhB;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAKZ;EACI;EACA;;AAGJ;EACI;IACI;;;AAIR;EACI;EACA;;AASJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAQR;EACI;IACI;;;AAIR;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAaZ;EACI;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAKZ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;IAEI;;;AAIR;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAUJ;EACI;IACI;;;AAIR;EACI;;AAIR;EACI;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAYhB;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;IACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKJ;EACI;;AAGJ;EArrBR;EACA;EACA;EACA;EACA;;AAsrBI;EA1rBJ;EACA;EACA;EACA;EACA;EAwrBQ;EACA;;AAGJ;EACI;EACA;;AAOJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;;;;AAMpB;ACvtBA;AFmEA;AAAA;AAAA;;;AE/DA;AFiKA;AAAA;AAAA;;AAIQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AE3LZ;AF2RA;AAAA;AAAA;;AAIQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AEzTZ;AF8ZA;AAAA;AAAA;;AAKQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI;;;AE/bZ;AFkiBA;AAAA;AAAA;;AAIQ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI","file":"combined.css"}
1
+ {"version":3,"sourceRoot":"","sources":["_themes.scss","_base.scss","combined.scss"],"names":[],"mappings":"AAqBQ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA+BJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA2DJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AAgEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;;;AAmEJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EAEA;;;ACvjBR;AAAA;AAAA;AAII;EAnBJ;EACA;EACA;EACA;EACA;EAiBQ;EACA;;AAEA;EAxBR;EACA;EACA;EACA;EACA;EAsBY;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EAtCR;EACA;EACA;EACA;EAqCY;EACA;;AAIR;EA7CJ;EACA;EACA;EACA;EA4CQ;;AAGJ;EAlDJ;EACA;EACA;EACA;EAiDQ;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;IACA;IACA;;;AAOR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAzJJ;EACA;EACA;EACA;EAwJQ;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EA1KR;EACA;EACA;EACA;EAyKY;EACA;EACA;;AAGJ;EACI;;AAGJ;EArLR;EACA;EACA;EACA;EAoLY;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKJ;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EAEI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAMhB;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAKZ;EACI;EACA;;AAGJ;EACI;IACI;;;AAIR;EACI;EACA;;AASJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAQR;EACI;IACI;;;AAIR;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAaZ;EACI;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAKZ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;IAEI;;;AAIR;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAUJ;EACI;IACI;;;AAIR;EACI;;AAIR;EACI;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAYhB;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;IACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKJ;EACI;;AAGJ;EAtrBR;EACA;EACA;EACA;EACA;;AAurBI;EA3rBJ;EACA;EACA;EACA;EACA;EAyrBQ;EACA;;AAGJ;EACI;EACA;;AAOJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;;;;AAMpB;ACxtBA;AFmEA;AAAA;AAAA;;;AE/DA;AFiKA;AAAA;AAAA;;AAIQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AE3LZ;AF2RA;AAAA;AAAA;;AAIQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AEzTZ;AF8ZA;AAAA;AAAA;;AAKQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI;;;AE/bZ;AFkiBA;AAAA;AAAA;;AAIQ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI","file":"combined.css"}