@deephaven/components 0.43.0 → 0.44.0
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.
- package/dist/AutoCompleteInput.css +35 -0
- package/dist/AutoCompleteInput.css.map +1 -0
- package/dist/AutoCompleteInput.js +496 -0
- package/dist/AutoCompleteInput.js.map +1 -0
- package/dist/AutoResizeTextarea.css +11 -0
- package/dist/AutoResizeTextarea.css.map +1 -0
- package/dist/AutoResizeTextarea.js +128 -0
- package/dist/AutoResizeTextarea.js.map +1 -0
- package/dist/BasicModal.js +112 -0
- package/dist/BasicModal.js.map +1 -0
- package/dist/Button.d.ts +1 -1
- package/dist/Button.js +193 -0
- package/dist/Button.js.map +1 -0
- package/dist/ButtonGroup.js +31 -0
- package/dist/ButtonGroup.js.map +1 -0
- package/dist/ButtonOld.js +41 -0
- package/dist/ButtonOld.js.map +1 -0
- package/dist/CardFlip.css +36 -0
- package/dist/CardFlip.css.map +1 -0
- package/dist/CardFlip.js +61 -0
- package/dist/CardFlip.js.map +1 -0
- package/dist/Checkbox.js +104 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Collapse.js +89 -0
- package/dist/Collapse.js.map +1 -0
- package/dist/ComboBox.css +50 -0
- package/dist/ComboBox.css.map +1 -0
- package/dist/ComboBox.js +487 -0
- package/dist/ComboBox.js.map +1 -0
- package/dist/CopyButton.js +30 -0
- package/dist/CopyButton.js.map +1 -0
- package/dist/CustomTimeSelect.css +65 -0
- package/dist/CustomTimeSelect.css.map +1 -0
- package/dist/CustomTimeSelect.js +516 -0
- package/dist/CustomTimeSelect.js.map +1 -0
- package/dist/DateInput.js +54 -0
- package/dist/DateInput.js.map +1 -0
- package/dist/DateInputUtils.js +33 -0
- package/dist/DateInputUtils.js.map +1 -0
- package/dist/DateTimeInput.js +84 -0
- package/dist/DateTimeInput.js.map +1 -0
- package/dist/DateTimeInputUtils.js +8 -0
- package/dist/DateTimeInputUtils.js.map +1 -0
- package/dist/DebouncedSearchInput.js +79 -0
- package/dist/DebouncedSearchInput.js.map +1 -0
- package/dist/DragUtils.js +68 -0
- package/dist/DragUtils.js.map +1 -0
- package/dist/DraggableItemList.css +118 -0
- package/dist/DraggableItemList.css.map +1 -0
- package/dist/DraggableItemList.js +268 -0
- package/dist/DraggableItemList.js.map +1 -0
- package/dist/EditableItemList.js +105 -0
- package/dist/EditableItemList.js.map +1 -0
- package/dist/HierarchicalCheckboxMenu.css +30 -0
- package/dist/HierarchicalCheckboxMenu.css.map +1 -0
- package/dist/HierarchicalCheckboxMenu.js +218 -0
- package/dist/HierarchicalCheckboxMenu.js.map +1 -0
- package/dist/ItemList.css +13 -0
- package/dist/ItemList.css.map +1 -0
- package/dist/ItemList.js +686 -0
- package/dist/ItemList.js.map +1 -0
- package/dist/ItemListItem.css +48 -0
- package/dist/ItemListItem.css.map +1 -0
- package/dist/ItemListItem.js +214 -0
- package/dist/ItemListItem.js.map +1 -0
- package/dist/LoadingOverlay.css +24 -0
- package/dist/LoadingOverlay.css.map +1 -0
- package/dist/LoadingOverlay.js +48 -0
- package/dist/LoadingOverlay.js.map +1 -0
- package/dist/LoadingSpinner.css +8 -0
- package/dist/LoadingSpinner.css.map +1 -0
- package/dist/LoadingSpinner.js +24 -0
- package/dist/LoadingSpinner.js.map +1 -0
- package/dist/MaskedInput.css +7 -0
- package/dist/MaskedInput.css.map +1 -0
- package/dist/MaskedInput.js +394 -0
- package/dist/MaskedInput.js.map +1 -0
- package/dist/MaskedInputUtils.js +36 -0
- package/dist/MaskedInputUtils.js.map +1 -0
- package/dist/Option.js +16 -0
- package/dist/Option.js.map +1 -0
- package/dist/RadioGroup.js +34 -0
- package/dist/RadioGroup.js.map +1 -0
- package/dist/RadioItem.js +55 -0
- package/dist/RadioItem.js.map +1 -0
- package/dist/RandomAreaPlotAnimation.css +18 -0
- package/dist/RandomAreaPlotAnimation.css.map +1 -0
- package/dist/RandomAreaPlotAnimation.js +290 -0
- package/dist/RandomAreaPlotAnimation.js.map +1 -0
- package/dist/SearchInput.css +43 -0
- package/dist/SearchInput.css.map +1 -0
- package/dist/SearchInput.js +66 -0
- package/dist/SearchInput.js.map +1 -0
- package/dist/Select.js +30 -0
- package/dist/Select.js.map +1 -0
- package/dist/SelectValueList.css +38 -0
- package/dist/SelectValueList.css.map +1 -0
- package/dist/SelectValueList.js +175 -0
- package/dist/SelectValueList.js.map +1 -0
- package/dist/SocketedButton.css +123 -0
- package/dist/SocketedButton.css.map +1 -0
- package/dist/SocketedButton.js +63 -0
- package/dist/SocketedButton.js.map +1 -0
- package/dist/SpectrumThemeDark.module.css +9 -0
- package/dist/SpectrumThemeDark.module.css.map +1 -0
- package/dist/SpectrumThemeLight.module.css +9 -0
- package/dist/SpectrumThemeLight.module.css.map +1 -0
- package/dist/SpectrumUtils.js +59 -0
- package/dist/SpectrumUtils.js.map +1 -0
- package/dist/ThemeExport.js +15 -0
- package/dist/ThemeExport.js.map +1 -0
- package/dist/ThemeExport.module.css +40 -0
- package/dist/ThemeExport.module.css.map +1 -0
- package/dist/TimeInput.js +101 -0
- package/dist/TimeInput.js.map +1 -0
- package/dist/TimeSlider.css +178 -0
- package/dist/TimeSlider.css.map +1 -0
- package/dist/TimeSlider.js +314 -0
- package/dist/TimeSlider.js.map +1 -0
- package/dist/TimeSlider.module.css +185 -0
- package/dist/TimeSlider.module.css.map +1 -0
- package/dist/ToastNotification.css +62 -0
- package/dist/ToastNotification.css.map +1 -0
- package/dist/ToastNotification.js +56 -0
- package/dist/ToastNotification.js.map +1 -0
- package/dist/UISwitch.css +94 -0
- package/dist/UISwitch.css.map +1 -0
- package/dist/UISwitch.js +30 -0
- package/dist/UISwitch.js.map +1 -0
- package/dist/ValidateLabelInput.css +9 -0
- package/dist/ValidateLabelInput.css.map +1 -0
- package/dist/ValidateLabelInput.js +50 -0
- package/dist/ValidateLabelInput.js.map +1 -0
- package/dist/context-actions/ContextActionUtils.js +142 -0
- package/dist/context-actions/ContextActionUtils.js.map +1 -0
- package/dist/context-actions/ContextActions.css +157 -0
- package/dist/context-actions/ContextActions.css.map +1 -0
- package/dist/context-actions/ContextActions.js +182 -0
- package/dist/context-actions/ContextActions.js.map +1 -0
- package/dist/context-actions/ContextMenu.js +559 -0
- package/dist/context-actions/ContextMenu.js.map +1 -0
- package/dist/context-actions/ContextMenuItem.js +139 -0
- package/dist/context-actions/ContextMenuItem.js.map +1 -0
- package/dist/context-actions/ContextMenuRoot.js +135 -0
- package/dist/context-actions/ContextMenuRoot.js.map +1 -0
- package/dist/context-actions/GlobalContextAction.js +53 -0
- package/dist/context-actions/GlobalContextAction.js.map +1 -0
- package/dist/context-actions/GlobalContextActions.js +28 -0
- package/dist/context-actions/GlobalContextActions.js.map +1 -0
- package/dist/context-actions/index.js +5 -0
- package/dist/context-actions/index.js.map +1 -0
- package/dist/declaration.d.js +2 -0
- package/dist/declaration.d.js.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/menu-actions/DropdownMenu.css +39 -0
- package/dist/menu-actions/DropdownMenu.css.map +1 -0
- package/dist/menu-actions/DropdownMenu.js +174 -0
- package/dist/menu-actions/DropdownMenu.js.map +1 -0
- package/dist/menu-actions/Menu.js +244 -0
- package/dist/menu-actions/Menu.js.map +1 -0
- package/dist/menu-actions/index.js +4 -0
- package/dist/menu-actions/index.js.map +1 -0
- package/dist/modal/DebouncedModal.js +26 -0
- package/dist/modal/DebouncedModal.js.map +1 -0
- package/dist/modal/InfoModal.css +24 -0
- package/dist/modal/InfoModal.css.map +1 -0
- package/dist/modal/InfoModal.js +34 -0
- package/dist/modal/InfoModal.js.map +1 -0
- package/dist/modal/Modal.js +122 -0
- package/dist/modal/Modal.js.map +1 -0
- package/dist/modal/ModalBody.js +16 -0
- package/dist/modal/ModalBody.js.map +1 -0
- package/dist/modal/ModalFooter.js +14 -0
- package/dist/modal/ModalFooter.js.map +1 -0
- package/dist/modal/ModalHeader.js +27 -0
- package/dist/modal/ModalHeader.js.map +1 -0
- package/dist/modal/index.js +7 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/navigation/Menu.css +13 -0
- package/dist/navigation/Menu.css.map +1 -0
- package/dist/navigation/Menu.js +25 -0
- package/dist/navigation/Menu.js.map +1 -0
- package/dist/navigation/MenuItem.css +46 -0
- package/dist/navigation/MenuItem.css.map +1 -0
- package/dist/navigation/MenuItem.js +65 -0
- package/dist/navigation/MenuItem.js.map +1 -0
- package/dist/navigation/Page.css +34 -0
- package/dist/navigation/Page.css.map +1 -0
- package/dist/navigation/Page.js +46 -0
- package/dist/navigation/Page.js.map +1 -0
- package/dist/navigation/Stack.css +24 -0
- package/dist/navigation/Stack.css.map +1 -0
- package/dist/navigation/Stack.js +82 -0
- package/dist/navigation/Stack.js.map +1 -0
- package/dist/navigation/index.js +5 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/popper/Popper.css +127 -0
- package/dist/popper/Popper.css.map +1 -0
- package/dist/popper/Popper.js +283 -0
- package/dist/popper/Popper.js.map +1 -0
- package/dist/popper/Tooltip.js +283 -0
- package/dist/popper/Tooltip.js.map +1 -0
- package/dist/popper/index.js +3 -0
- package/dist/popper/index.js.map +1 -0
- package/dist/shortcuts/GlobalShortcuts.js +47 -0
- package/dist/shortcuts/GlobalShortcuts.js.map +1 -0
- package/dist/shortcuts/Shortcut.js +393 -0
- package/dist/shortcuts/Shortcut.js.map +1 -0
- package/dist/shortcuts/ShortcutRegistry.js +78 -0
- package/dist/shortcuts/ShortcutRegistry.js.map +1 -0
- package/dist/shortcuts/index.js +5 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { vsClose, vsChevronLeft } from '@deephaven/icons';
|
|
3
|
+
import "./Page.css";
|
|
4
|
+
import Button from "../Button.js";
|
|
5
|
+
/**
|
|
6
|
+
* A page view with a back button in the bottom left, a title at the top, and a close button in the top right.
|
|
7
|
+
* Back and close buttons will only appear if `onBack` and/or `onClose` callbacks are set.
|
|
8
|
+
*/
|
|
9
|
+
export function Page(_ref) {
|
|
10
|
+
var {
|
|
11
|
+
children,
|
|
12
|
+
onBack,
|
|
13
|
+
onClose,
|
|
14
|
+
title,
|
|
15
|
+
'data-testid': dataTestId
|
|
16
|
+
} = _ref;
|
|
17
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
18
|
+
className: "navigation-page",
|
|
19
|
+
"data-testid": dataTestId
|
|
20
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
21
|
+
className: "navigation-title-bar"
|
|
22
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
23
|
+
className: "navigation-left-buttons"
|
|
24
|
+
}, onBack !== undefined && /*#__PURE__*/React.createElement(Button, {
|
|
25
|
+
kind: "ghost",
|
|
26
|
+
className: "btn-back",
|
|
27
|
+
"data-testid": "btn-page-back",
|
|
28
|
+
onClick: onBack,
|
|
29
|
+
icon: vsChevronLeft
|
|
30
|
+
}, "Back")), /*#__PURE__*/React.createElement("div", {
|
|
31
|
+
className: "navigation-title"
|
|
32
|
+
}, title), /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
className: "navigation-right-buttons"
|
|
34
|
+
}, onClose !== undefined && /*#__PURE__*/React.createElement(Button, {
|
|
35
|
+
kind: "ghost",
|
|
36
|
+
className: "btn-close px-2 m-1",
|
|
37
|
+
"data-testid": "btn-page-close",
|
|
38
|
+
onClick: onClose,
|
|
39
|
+
icon: vsClose,
|
|
40
|
+
tooltip: "Close"
|
|
41
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
42
|
+
className: "navigation-content"
|
|
43
|
+
}, children));
|
|
44
|
+
}
|
|
45
|
+
export default Page;
|
|
46
|
+
//# sourceMappingURL=Page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Page.js","names":["React","vsClose","vsChevronLeft","Button","Page","children","onBack","onClose","title","dataTestId","undefined"],"sources":["../../src/navigation/Page.tsx"],"sourcesContent":["import React from 'react';\nimport { vsClose, vsChevronLeft } from '@deephaven/icons';\nimport './Page.scss';\nimport Button from '../Button';\n\nexport type PageProps = {\n children: React.ReactNode;\n onBack?: () => void;\n onClose?: () => void;\n title: string;\n 'data-testid'?: string;\n};\n\n/**\n * A page view with a back button in the bottom left, a title at the top, and a close button in the top right.\n * Back and close buttons will only appear if `onBack` and/or `onClose` callbacks are set.\n */\nexport function Page({\n children,\n onBack,\n onClose,\n title,\n 'data-testid': dataTestId,\n}: PageProps): JSX.Element {\n return (\n <div className=\"navigation-page\" data-testid={dataTestId}>\n <div className=\"navigation-title-bar\">\n <div className=\"navigation-left-buttons\">\n {onBack !== undefined && (\n <Button\n kind=\"ghost\"\n className=\"btn-back\"\n data-testid=\"btn-page-back\"\n onClick={onBack}\n icon={vsChevronLeft}\n >\n Back\n </Button>\n )}\n </div>\n <div className=\"navigation-title\">{title}</div>\n <div className=\"navigation-right-buttons\">\n {onClose !== undefined && (\n <Button\n kind=\"ghost\"\n className=\"btn-close px-2 m-1\"\n data-testid=\"btn-page-close\"\n onClick={onClose}\n icon={vsClose}\n tooltip=\"Close\"\n />\n )}\n </div>\n </div>\n <div className=\"navigation-content\">{children}</div>\n </div>\n );\n}\n\nexport default Page;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,OAAO,EAAEC,aAAa,QAAQ,kBAAkB;AAAC;AAAA,OAEnDC,MAAM;AAUb;AACA;AACA;AACA;AACA,OAAO,SAASC,IAAI,OAMO;EAAA,IANN;IACnBC,QAAQ;IACRC,MAAM;IACNC,OAAO;IACPC,KAAK;IACL,aAAa,EAAEC;EACN,CAAC;EACV,oBACE;IAAK,SAAS,EAAC,iBAAiB;IAAC,eAAaA;EAAW,gBACvD;IAAK,SAAS,EAAC;EAAsB,gBACnC;IAAK,SAAS,EAAC;EAAyB,GACrCH,MAAM,KAAKI,SAAS,iBACnB,oBAAC,MAAM;IACL,IAAI,EAAC,OAAO;IACZ,SAAS,EAAC,UAAU;IACpB,eAAY,eAAe;IAC3B,OAAO,EAAEJ,MAAO;IAChB,IAAI,EAAEJ;EAAc,GACrB,MAED,CACD,CACG,eACN;IAAK,SAAS,EAAC;EAAkB,GAAEM,KAAK,CAAO,eAC/C;IAAK,SAAS,EAAC;EAA0B,GACtCD,OAAO,KAAKG,SAAS,iBACpB,oBAAC,MAAM;IACL,IAAI,EAAC,OAAO;IACZ,SAAS,EAAC,oBAAoB;IAC9B,eAAY,gBAAgB;IAC5B,OAAO,EAAEH,OAAQ;IACjB,IAAI,EAAEN,OAAQ;IACd,OAAO,EAAC;EAAO,EAElB,CACG,CACF,eACN;IAAK,SAAS,EAAC;EAAoB,GAAEI,QAAQ,CAAO,CAChD;AAEV;AAEA,eAAeD,IAAI"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.navigation-stack {
|
|
3
|
+
position: relative;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: 100%;
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
}
|
|
8
|
+
.navigation-stack .main-view,
|
|
9
|
+
.navigation-stack .popping-view,
|
|
10
|
+
.navigation-stack .pushing-view {
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 100%;
|
|
13
|
+
background: #2d2a2e;
|
|
14
|
+
position: absolute;
|
|
15
|
+
}
|
|
16
|
+
.navigation-stack .pushing-view,
|
|
17
|
+
.navigation-stack .popping-view {
|
|
18
|
+
box-shadow: -4px 0 8px rgba(26, 23, 26, 0.45);
|
|
19
|
+
}
|
|
20
|
+
.navigation-stack .popping-view {
|
|
21
|
+
left: 100%;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*# sourceMappingURL=Stack.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../scss/custom.scss","../../src/navigation/Stack.scss","../../scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;EACA;EACA,YCFY;EDGZ;;AAGF;AAAA;EAEE;;AAGF;EACE","file":"Stack.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '../../scss/custom.scss';\n\n.navigation-stack {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n\n .main-view,\n .popping-view,\n .pushing-view {\n width: 100%;\n height: 100%;\n background: $content-bg;\n position: absolute;\n }\n\n .pushing-view,\n .popping-view {\n box-shadow: -4px 0 8px rgba($black, 0.45);\n }\n\n .popping-view {\n left: 100%;\n }\n}\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React, { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
|
+
import { CSSTransition } from 'react-transition-group';
|
|
3
|
+
import { usePrevious } from '@deephaven/react-hooks';
|
|
4
|
+
import ThemeExport from "../ThemeExport.js";
|
|
5
|
+
import "./Stack.css";
|
|
6
|
+
/**
|
|
7
|
+
* Pass a full navigation stack of children, and then automatically does a sliding animation when the stack changes.
|
|
8
|
+
* Adding items to the stack will do a "push" animation, and removing items from the stack will do a "pop" animation.
|
|
9
|
+
*/
|
|
10
|
+
export function Stack(_ref) {
|
|
11
|
+
var {
|
|
12
|
+
children,
|
|
13
|
+
'data-testid': dataTestId
|
|
14
|
+
} = _ref;
|
|
15
|
+
var childrenArray = useMemo(() => React.Children.toArray(children), [children]);
|
|
16
|
+
var prevChildrenArray = usePrevious(childrenArray);
|
|
17
|
+
var [mainView, setMainView] = useState(childrenArray[childrenArray.length - 1]);
|
|
18
|
+
var [pushingView, setPushingView] = useState(null);
|
|
19
|
+
var [poppingView, setPoppingView] = useState(null);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* To do the animation effect, we just need to set the proper pushing/popping views when the stack changes.
|
|
23
|
+
* `mainView` - The main view of the stack, stationary, filling the container.
|
|
24
|
+
* `pushingView` - A view that's currently being pushed. Slides from off screen right to overtop of `mainView`.
|
|
25
|
+
* `poppingView` - A view that's currently being popped. Slides from overtop of `mainView` to right off screen.
|
|
26
|
+
*
|
|
27
|
+
* When the `pushingView` or `poppingView` is set, that will kick off their animation.
|
|
28
|
+
* Completion of the animation is handled in `pushComplete` or `popComplete`, and then the stack is in an idle state again.
|
|
29
|
+
*/
|
|
30
|
+
useEffect(function initAnimation() {
|
|
31
|
+
if (prevChildrenArray === undefined || childrenArray === prevChildrenArray) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
var topChild = childrenArray[childrenArray.length - 1];
|
|
35
|
+
if (childrenArray.length === prevChildrenArray.length || prevChildrenArray.length === 0 || pushingView !== null || poppingView !== null) {
|
|
36
|
+
// 1) Stack is the same size, we've just mounted, or we're already in an animation - just update the view
|
|
37
|
+
if (pushingView !== null && topChild !== pushingView) {
|
|
38
|
+
// Stack was updated mid animation
|
|
39
|
+
setPushingView(topChild);
|
|
40
|
+
} else if (topChild !== poppingView && topChild !== mainView) {
|
|
41
|
+
// Replace the current view
|
|
42
|
+
setMainView(topChild);
|
|
43
|
+
}
|
|
44
|
+
} else if (childrenArray.length > prevChildrenArray.length) {
|
|
45
|
+
// 2) Stack has grown - start the push animation
|
|
46
|
+
setPushingView(topChild);
|
|
47
|
+
} else if (childrenArray.length < prevChildrenArray.length) {
|
|
48
|
+
// 3) Stack has shrunk - start the pop animation
|
|
49
|
+
setMainView(topChild);
|
|
50
|
+
setPoppingView(prevChildrenArray[prevChildrenArray.length - 1]);
|
|
51
|
+
}
|
|
52
|
+
}, [childrenArray, prevChildrenArray, pushingView, poppingView, mainView]);
|
|
53
|
+
var pushComplete = useCallback(() => {
|
|
54
|
+
setMainView(pushingView);
|
|
55
|
+
setPushingView(null);
|
|
56
|
+
}, [pushingView]);
|
|
57
|
+
var popComplete = useCallback(() => {
|
|
58
|
+
setPoppingView(null);
|
|
59
|
+
}, []);
|
|
60
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
61
|
+
className: "navigation-stack"
|
|
62
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
className: "main-view",
|
|
64
|
+
"data-testid": dataTestId
|
|
65
|
+
}, mainView), /*#__PURE__*/React.createElement(CSSTransition, {
|
|
66
|
+
in: poppingView != null,
|
|
67
|
+
timeout: ThemeExport.transitionMidMs,
|
|
68
|
+
classNames: "slide-right",
|
|
69
|
+
onEntered: popComplete
|
|
70
|
+
}, /*#__PURE__*/React.createElement(React.Fragment, null, poppingView != null && /*#__PURE__*/React.createElement("div", {
|
|
71
|
+
className: "popping-view"
|
|
72
|
+
}, poppingView))), /*#__PURE__*/React.createElement(CSSTransition, {
|
|
73
|
+
in: pushingView != null,
|
|
74
|
+
timeout: ThemeExport.transitionMidMs,
|
|
75
|
+
classNames: "slide-left",
|
|
76
|
+
onEntered: pushComplete
|
|
77
|
+
}, /*#__PURE__*/React.createElement(React.Fragment, null, pushingView != null && /*#__PURE__*/React.createElement("div", {
|
|
78
|
+
className: "pushing-view"
|
|
79
|
+
}, pushingView))));
|
|
80
|
+
}
|
|
81
|
+
export default Stack;
|
|
82
|
+
//# sourceMappingURL=Stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stack.js","names":["React","useState","useEffect","useMemo","useCallback","CSSTransition","usePrevious","ThemeExport","Stack","children","dataTestId","childrenArray","Children","toArray","prevChildrenArray","mainView","setMainView","length","pushingView","setPushingView","poppingView","setPoppingView","initAnimation","undefined","topChild","pushComplete","popComplete","transitionMidMs"],"sources":["../../src/navigation/Stack.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { usePrevious } from '@deephaven/react-hooks';\nimport ThemeExport from '../ThemeExport';\nimport './Stack.scss';\n\nexport type StackProps = {\n children: React.ReactNode | React.ReactNode[];\n 'data-testid'?: string;\n};\n\n/**\n * Pass a full navigation stack of children, and then automatically does a sliding animation when the stack changes.\n * Adding items to the stack will do a \"push\" animation, and removing items from the stack will do a \"pop\" animation.\n */\nexport function Stack({\n children,\n 'data-testid': dataTestId,\n}: StackProps): JSX.Element {\n const childrenArray = useMemo(() => React.Children.toArray(children), [\n children,\n ]);\n const prevChildrenArray = usePrevious(childrenArray);\n const [mainView, setMainView] = useState<React.ReactNode>(\n childrenArray[childrenArray.length - 1]\n );\n\n const [pushingView, setPushingView] = useState<React.ReactNode>(null);\n const [poppingView, setPoppingView] = useState<React.ReactNode>(null);\n\n /**\n * To do the animation effect, we just need to set the proper pushing/popping views when the stack changes.\n * `mainView` - The main view of the stack, stationary, filling the container.\n * `pushingView` - A view that's currently being pushed. Slides from off screen right to overtop of `mainView`.\n * `poppingView` - A view that's currently being popped. Slides from overtop of `mainView` to right off screen.\n *\n * When the `pushingView` or `poppingView` is set, that will kick off their animation.\n * Completion of the animation is handled in `pushComplete` or `popComplete`, and then the stack is in an idle state again.\n */\n useEffect(\n function initAnimation() {\n if (\n prevChildrenArray === undefined ||\n childrenArray === prevChildrenArray\n ) {\n return;\n }\n const topChild = childrenArray[childrenArray.length - 1];\n if (\n childrenArray.length === prevChildrenArray.length ||\n prevChildrenArray.length === 0 ||\n pushingView !== null ||\n poppingView !== null\n ) {\n // 1) Stack is the same size, we've just mounted, or we're already in an animation - just update the view\n if (pushingView !== null && topChild !== pushingView) {\n // Stack was updated mid animation\n setPushingView(topChild);\n } else if (topChild !== poppingView && topChild !== mainView) {\n // Replace the current view\n setMainView(topChild);\n }\n } else if (childrenArray.length > prevChildrenArray.length) {\n // 2) Stack has grown - start the push animation\n setPushingView(topChild);\n } else if (childrenArray.length < prevChildrenArray.length) {\n // 3) Stack has shrunk - start the pop animation\n setMainView(topChild);\n setPoppingView(prevChildrenArray[prevChildrenArray.length - 1]);\n }\n },\n [childrenArray, prevChildrenArray, pushingView, poppingView, mainView]\n );\n\n const pushComplete = useCallback(() => {\n setMainView(pushingView);\n setPushingView(null);\n }, [pushingView]);\n\n const popComplete = useCallback(() => {\n setPoppingView(null);\n }, []);\n\n return (\n <div className=\"navigation-stack\">\n <div className=\"main-view\" data-testid={dataTestId}>\n {mainView}\n </div>\n\n <CSSTransition\n in={poppingView != null}\n timeout={ThemeExport.transitionMidMs}\n classNames=\"slide-right\"\n onEntered={popComplete}\n >\n {/* Without the fragment, the transition doesn't work. Without the conditional render, the stack is blank */}\n {/* eslint-disable-next-line react/jsx-no-useless-fragment */}\n <>\n {poppingView != null && (\n <div className=\"popping-view\">{poppingView}</div>\n )}\n </>\n </CSSTransition>\n <CSSTransition\n in={pushingView != null}\n timeout={ThemeExport.transitionMidMs}\n classNames=\"slide-left\"\n onEntered={pushComplete}\n >\n {/* eslint-disable-next-line react/jsx-no-useless-fragment */}\n <>\n {pushingView != null && (\n <div className=\"pushing-view\">{pushingView}</div>\n )}\n </>\n </CSSTransition>\n </div>\n );\n}\n\nexport default Stack;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,SAAS,EAAEC,OAAO,EAAEC,WAAW,QAAQ,OAAO;AACxE,SAASC,aAAa,QAAQ,wBAAwB;AACtD,SAASC,WAAW,QAAQ,wBAAwB;AAAC,OAC9CC,WAAW;AAAA;AAQlB;AACA;AACA;AACA;AACA,OAAO,SAASC,KAAK,OAGO;EAAA,IAHN;IACpBC,QAAQ;IACR,aAAa,EAAEC;EACL,CAAC;EACX,IAAMC,aAAa,GAAGR,OAAO,CAAC,MAAMH,KAAK,CAACY,QAAQ,CAACC,OAAO,CAACJ,QAAQ,CAAC,EAAE,CACpEA,QAAQ,CACT,CAAC;EACF,IAAMK,iBAAiB,GAAGR,WAAW,CAACK,aAAa,CAAC;EACpD,IAAM,CAACI,QAAQ,EAAEC,WAAW,CAAC,GAAGf,QAAQ,CACtCU,aAAa,CAACA,aAAa,CAACM,MAAM,GAAG,CAAC,CAAC,CACxC;EAED,IAAM,CAACC,WAAW,EAAEC,cAAc,CAAC,GAAGlB,QAAQ,CAAkB,IAAI,CAAC;EACrE,IAAM,CAACmB,WAAW,EAAEC,cAAc,CAAC,GAAGpB,QAAQ,CAAkB,IAAI,CAAC;;EAErE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,SAAS,CACP,SAASoB,aAAa,GAAG;IACvB,IACER,iBAAiB,KAAKS,SAAS,IAC/BZ,aAAa,KAAKG,iBAAiB,EACnC;MACA;IACF;IACA,IAAMU,QAAQ,GAAGb,aAAa,CAACA,aAAa,CAACM,MAAM,GAAG,CAAC,CAAC;IACxD,IACEN,aAAa,CAACM,MAAM,KAAKH,iBAAiB,CAACG,MAAM,IACjDH,iBAAiB,CAACG,MAAM,KAAK,CAAC,IAC9BC,WAAW,KAAK,IAAI,IACpBE,WAAW,KAAK,IAAI,EACpB;MACA;MACA,IAAIF,WAAW,KAAK,IAAI,IAAIM,QAAQ,KAAKN,WAAW,EAAE;QACpD;QACAC,cAAc,CAACK,QAAQ,CAAC;MAC1B,CAAC,MAAM,IAAIA,QAAQ,KAAKJ,WAAW,IAAII,QAAQ,KAAKT,QAAQ,EAAE;QAC5D;QACAC,WAAW,CAACQ,QAAQ,CAAC;MACvB;IACF,CAAC,MAAM,IAAIb,aAAa,CAACM,MAAM,GAAGH,iBAAiB,CAACG,MAAM,EAAE;MAC1D;MACAE,cAAc,CAACK,QAAQ,CAAC;IAC1B,CAAC,MAAM,IAAIb,aAAa,CAACM,MAAM,GAAGH,iBAAiB,CAACG,MAAM,EAAE;MAC1D;MACAD,WAAW,CAACQ,QAAQ,CAAC;MACrBH,cAAc,CAACP,iBAAiB,CAACA,iBAAiB,CAACG,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE;EACF,CAAC,EACD,CAACN,aAAa,EAAEG,iBAAiB,EAAEI,WAAW,EAAEE,WAAW,EAAEL,QAAQ,CAAC,CACvE;EAED,IAAMU,YAAY,GAAGrB,WAAW,CAAC,MAAM;IACrCY,WAAW,CAACE,WAAW,CAAC;IACxBC,cAAc,CAAC,IAAI,CAAC;EACtB,CAAC,EAAE,CAACD,WAAW,CAAC,CAAC;EAEjB,IAAMQ,WAAW,GAAGtB,WAAW,CAAC,MAAM;IACpCiB,cAAc,CAAC,IAAI,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE;IAAK,SAAS,EAAC;EAAkB,gBAC/B;IAAK,SAAS,EAAC,WAAW;IAAC,eAAaX;EAAW,GAChDK,QAAQ,CACL,eAEN,oBAAC,aAAa;IACZ,EAAE,EAAEK,WAAW,IAAI,IAAK;IACxB,OAAO,EAAEb,WAAW,CAACoB,eAAgB;IACrC,UAAU,EAAC,aAAa;IACxB,SAAS,EAAED;EAAY,gBAIvB,0CACGN,WAAW,IAAI,IAAI,iBAClB;IAAK,SAAS,EAAC;EAAc,GAAEA,WAAW,CAC3C,CACA,CACW,eAChB,oBAAC,aAAa;IACZ,EAAE,EAAEF,WAAW,IAAI,IAAK;IACxB,OAAO,EAAEX,WAAW,CAACoB,eAAgB;IACrC,UAAU,EAAC,YAAY;IACvB,SAAS,EAAEF;EAAa,gBAGxB,0CACGP,WAAW,IAAI,IAAI,iBAClB;IAAK,SAAS,EAAC;EAAc,GAAEA,WAAW,CAC3C,CACA,CACW,CACZ;AAEV;AAEA,eAAeV,KAAK"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","Menu","MenuItem","Page","Stack"],"sources":["../../src/navigation/index.ts"],"sourcesContent":["export { default as Menu } from './Menu';\nexport type { MenuProps } from './Menu';\nexport { default as MenuItem } from './MenuItem';\nexport type { SwitchMenuItemDef, MenuItemDef, MenuItemProps } from './MenuItem';\nexport { default as Page } from './Page';\nexport type { PageProps } from './Page';\nexport { default as Stack } from './Stack';\n"],"mappings":"SAASA,OAAO,IAAIC,IAAI;AAAA,SAEfD,OAAO,IAAIE,QAAQ;AAAA,SAEnBF,OAAO,IAAIG,IAAI;AAAA,SAEfH,OAAO,IAAII,KAAK"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.popper-container {
|
|
3
|
+
position: absolute;
|
|
4
|
+
z-index: 5000;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.popper {
|
|
8
|
+
background: #403e41;
|
|
9
|
+
color: #f0f0ee;
|
|
10
|
+
border-radius: 4px;
|
|
11
|
+
transition: visibility 0.15s, opacity 0.15s;
|
|
12
|
+
pointer-events: none;
|
|
13
|
+
outline: 0;
|
|
14
|
+
}
|
|
15
|
+
.popper .popper-content {
|
|
16
|
+
position: relative;
|
|
17
|
+
box-shadow: 0 0.1rem 1.5rem 0.25rem rgba(26, 23, 26, 0.45);
|
|
18
|
+
}
|
|
19
|
+
.popper .popper-content .tooltip-content {
|
|
20
|
+
text-align: center;
|
|
21
|
+
padding: 0.25rem 0.5rem;
|
|
22
|
+
}
|
|
23
|
+
.popper .popper-arrow {
|
|
24
|
+
width: 0;
|
|
25
|
+
height: 0;
|
|
26
|
+
border-style: solid;
|
|
27
|
+
position: absolute;
|
|
28
|
+
margin: 5px;
|
|
29
|
+
border-color: #403e41;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.popper.interactive {
|
|
33
|
+
pointer-events: auto;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.popper-transition-enter {
|
|
37
|
+
opacity: 0;
|
|
38
|
+
transition: none;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.popper-transition-exit {
|
|
42
|
+
opacity: 0;
|
|
43
|
+
transition: all 0.15s;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.popper-container[x-placement^=top] > .popper-transition-enter,
|
|
47
|
+
.popper-container[x-placement^=top] > .popper-transition-exit {
|
|
48
|
+
transform: scale(0.92) translate(0, 10px);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.popper-container[x-placement^=right] > .popper-transition-enter,
|
|
52
|
+
.popper-container[x-placement^=right] > .popper-transition-exit {
|
|
53
|
+
transform: scale(0.92) translate(-10px, 0);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.popper-container[x-placement^=bottom] > .popper-transition-enter,
|
|
57
|
+
.popper-container[x-placement^=bottom] > .popper-transition-exit {
|
|
58
|
+
transform: scale(0.92) translate(0, -10px);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.popper-container[x-placement^=left] > .popper-transition-enter,
|
|
62
|
+
.popper-container[x-placement^=left] > .popper-transition-exit {
|
|
63
|
+
transform: scale(0.92) translate(10px, 0);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.popper-container[x-placement^=top] > .popper-transition-enter-active.popper,
|
|
67
|
+
.popper-container[x-placement^=right] > .popper-transition-enter-active.popper,
|
|
68
|
+
.popper-container[x-placement^=bottom] > .popper-transition-enter-active.popper,
|
|
69
|
+
.popper-container[x-placement^=left] > .popper-transition-enter-active.popper {
|
|
70
|
+
opacity: 1;
|
|
71
|
+
transform: none;
|
|
72
|
+
transition: all 0.15s ease-out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.popper-container[x-placement^=top] > .popper {
|
|
76
|
+
margin-bottom: 5px;
|
|
77
|
+
}
|
|
78
|
+
.popper-container[x-placement^=top] > .popper .popper-arrow {
|
|
79
|
+
border-width: 5px 5px 0 5px;
|
|
80
|
+
border-left-color: transparent;
|
|
81
|
+
border-right-color: transparent;
|
|
82
|
+
border-bottom-color: transparent;
|
|
83
|
+
bottom: -5px;
|
|
84
|
+
margin-top: 0;
|
|
85
|
+
margin-bottom: 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.popper-container[x-placement^=bottom] > .popper {
|
|
89
|
+
margin-top: 5px;
|
|
90
|
+
}
|
|
91
|
+
.popper-container[x-placement^=bottom] > .popper .popper-arrow {
|
|
92
|
+
border-width: 0 5px 5px 5px;
|
|
93
|
+
border-left-color: transparent;
|
|
94
|
+
border-right-color: transparent;
|
|
95
|
+
border-top-color: transparent;
|
|
96
|
+
top: -5px;
|
|
97
|
+
margin-top: 0;
|
|
98
|
+
margin-bottom: 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.popper-container[x-placement^=right] > .popper {
|
|
102
|
+
margin-left: 5px;
|
|
103
|
+
}
|
|
104
|
+
.popper-container[x-placement^=right] > .popper .popper-arrow {
|
|
105
|
+
border-width: 5px 5px 5px 0;
|
|
106
|
+
border-left-color: transparent;
|
|
107
|
+
border-top-color: transparent;
|
|
108
|
+
border-bottom-color: transparent;
|
|
109
|
+
left: -5px;
|
|
110
|
+
margin-left: 0;
|
|
111
|
+
margin-right: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.popper-container[x-placement^=left] > .popper {
|
|
115
|
+
margin-right: 5px;
|
|
116
|
+
}
|
|
117
|
+
.popper-container[x-placement^=left] > .popper .popper-arrow {
|
|
118
|
+
border-width: 5px 0 5px 5px;
|
|
119
|
+
border-top-color: transparent;
|
|
120
|
+
border-right-color: transparent;
|
|
121
|
+
border-bottom-color: transparent;
|
|
122
|
+
right: -5px;
|
|
123
|
+
margin-left: 0;
|
|
124
|
+
margin-right: 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/*# sourceMappingURL=Popper.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../scss/custom.scss","../../src/popper/Popper.scss","../../scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACOA;EACE;EACA;;;AAGF;EACE,YCWS;EDVT,OCDe;EDEf,eC0Gc;EDzGd;EACA;EACA;;AAEA;EACE;EACA,YAnBY;;AAqBZ;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA,QAjCU;EAkCV,cCZO;;;ADgBX;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;;AAGF;EACE,eArFY;;AAuFZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE,YAnGY;;AAqGZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE,aAjHY;;AAmHZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE,cA/HY;;AAiIZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA","file":"Popper.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '../../scss/custom.scss';\n\n$arrow-width: 5px;\n$popper-shadow: 0 0.1rem 1.5rem 0.25rem rgba($black, 0.45);\n$animation-scale: 0.92;\n$animation-offset: 10px;\n\n.popper-container {\n position: absolute;\n z-index: 5000;\n}\n\n.popper {\n background: $tooltip-bg;\n color: $tooltip-color;\n border-radius: $border-radius;\n transition: visibility $transition, opacity $transition;\n pointer-events: none;\n outline: 0;\n\n .popper-content {\n position: relative;\n box-shadow: $popper-shadow;\n\n .tooltip-content {\n text-align: center;\n padding: $tooltip-padding-y $tooltip-padding-x;\n }\n }\n\n .popper-arrow {\n width: 0;\n height: 0;\n border-style: solid;\n position: absolute;\n margin: $arrow-width;\n border-color: $tooltip-bg;\n }\n}\n\n.popper.interactive {\n pointer-events: auto;\n}\n\n.popper-transition-enter {\n opacity: 0;\n transition: none;\n}\n\n.popper-transition-exit {\n opacity: 0;\n transition: all $transition;\n}\n\n.popper-container[x-placement^='top'] > .popper-transition-enter,\n.popper-container[x-placement^='top'] > .popper-transition-exit {\n transform: scale($animation-scale) translate(0, $animation-offset);\n}\n\n.popper-container[x-placement^='right'] > .popper-transition-enter,\n.popper-container[x-placement^='right'] > .popper-transition-exit {\n transform: scale($animation-scale) translate(-$animation-offset, 0);\n}\n\n.popper-container[x-placement^='bottom'] > .popper-transition-enter,\n.popper-container[x-placement^='bottom'] > .popper-transition-exit {\n transform: scale($animation-scale) translate(0, -$animation-offset);\n}\n\n.popper-container[x-placement^='left'] > .popper-transition-enter,\n.popper-container[x-placement^='left'] > .popper-transition-exit {\n transform: scale($animation-scale) translate($animation-offset, 0);\n}\n\n.popper-container[x-placement^='top'] > .popper-transition-enter-active.popper,\n.popper-container[x-placement^='right']\n > .popper-transition-enter-active.popper,\n.popper-container[x-placement^='bottom']\n > .popper-transition-enter-active.popper,\n.popper-container[x-placement^='left']\n > .popper-transition-enter-active.popper {\n opacity: 1;\n transform: none;\n transition: all $transition ease-out;\n}\n\n.popper-container[x-placement^='top'] > .popper {\n margin-bottom: $arrow-width;\n\n .popper-arrow {\n border-width: $arrow-width $arrow-width 0 $arrow-width;\n border-left-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n bottom: -$arrow-width;\n margin-top: 0;\n margin-bottom: 0;\n }\n}\n\n.popper-container[x-placement^='bottom'] > .popper {\n margin-top: $arrow-width;\n\n .popper-arrow {\n border-width: 0 $arrow-width $arrow-width $arrow-width;\n border-left-color: transparent;\n border-right-color: transparent;\n border-top-color: transparent;\n top: -$arrow-width;\n margin-top: 0;\n margin-bottom: 0;\n }\n}\n\n.popper-container[x-placement^='right'] > .popper {\n margin-left: $arrow-width;\n\n .popper-arrow {\n border-width: $arrow-width $arrow-width $arrow-width 0;\n border-left-color: transparent;\n border-top-color: transparent;\n border-bottom-color: transparent;\n left: -$arrow-width;\n margin-left: 0;\n margin-right: 0;\n }\n}\n\n.popper-container[x-placement^='left'] > .popper {\n margin-right: $arrow-width;\n\n .popper-arrow {\n border-width: $arrow-width 0 $arrow-width $arrow-width;\n border-top-color: transparent;\n border-right-color: transparent;\n border-bottom-color: transparent;\n right: -$arrow-width;\n margin-left: 0;\n margin-right: 0;\n }\n}\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
6
|
+
/**
|
|
7
|
+
* A component for creating popover dialogs. Only requires child element.
|
|
8
|
+
*
|
|
9
|
+
* <Popper
|
|
10
|
+
* options={popperOptions}
|
|
11
|
+
* className="whatever"
|
|
12
|
+
* onEntered={this.handleEnter}
|
|
13
|
+
* onExited={this.handleExit}
|
|
14
|
+
* closeOnBlur // if you want dialog to self close, on click outside
|
|
15
|
+
* interactive // if popper contents will be interactable
|
|
16
|
+
* isShown={variable} // controls if its shown or not,
|
|
17
|
+
* ref={this.popper} // or via ref and this.popper.show() or this.popper.hide()
|
|
18
|
+
* >
|
|
19
|
+
* <ChildContent />
|
|
20
|
+
* </Popper>
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import React, { Component } from 'react';
|
|
24
|
+
import ReactDOM from 'react-dom';
|
|
25
|
+
import classNames from 'classnames';
|
|
26
|
+
import { CSSTransition } from 'react-transition-group';
|
|
27
|
+
import PopperJs from 'popper.js';
|
|
28
|
+
import PropTypes from 'prop-types';
|
|
29
|
+
import ThemeExport from "../ThemeExport.js";
|
|
30
|
+
import "./Popper.css";
|
|
31
|
+
class Popper extends Component {
|
|
32
|
+
constructor(props) {
|
|
33
|
+
super(props);
|
|
34
|
+
_defineProperty(this, "element", void 0);
|
|
35
|
+
_defineProperty(this, "container", void 0);
|
|
36
|
+
_defineProperty(this, "rAF", void 0);
|
|
37
|
+
this.handleEnter = this.handleEnter.bind(this);
|
|
38
|
+
this.handleExit = this.handleExit.bind(this);
|
|
39
|
+
this.handleBlur = this.handleBlur.bind(this);
|
|
40
|
+
this.element = document.createElement('div');
|
|
41
|
+
this.element.className = 'popper-container';
|
|
42
|
+
this.container = /*#__PURE__*/React.createRef();
|
|
43
|
+
|
|
44
|
+
// cancelAnimationFrame does nothing if the handle isn't recognized
|
|
45
|
+
// requestAnimationFrame provides a non-zero number, so 0 as a default should be safe
|
|
46
|
+
this.rAF = 0;
|
|
47
|
+
var {
|
|
48
|
+
isShown
|
|
49
|
+
} = this.props;
|
|
50
|
+
this.state = {
|
|
51
|
+
show: isShown,
|
|
52
|
+
popper: null
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
componentDidUpdate(prevProps) {
|
|
56
|
+
var {
|
|
57
|
+
isShown
|
|
58
|
+
} = this.props;
|
|
59
|
+
if (prevProps.isShown !== isShown) {
|
|
60
|
+
if (isShown) {
|
|
61
|
+
cancelAnimationFrame(this.rAF);
|
|
62
|
+
this.rAF = window.requestAnimationFrame(() => {
|
|
63
|
+
this.show();
|
|
64
|
+
});
|
|
65
|
+
} else {
|
|
66
|
+
this.hide();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
componentWillUnmount() {
|
|
71
|
+
this.destroyPopper(false);
|
|
72
|
+
}
|
|
73
|
+
/** Goes through an element and it's parents until the first visible element is found */
|
|
74
|
+
getVisibleElement(element) {
|
|
75
|
+
if (element == null || element.clientHeight > 0 || element.clientWidth > 0) {
|
|
76
|
+
return element;
|
|
77
|
+
}
|
|
78
|
+
return this.getVisibleElement(element.parentElement);
|
|
79
|
+
}
|
|
80
|
+
initPopper() {
|
|
81
|
+
var {
|
|
82
|
+
popper
|
|
83
|
+
} = this.state;
|
|
84
|
+
var {
|
|
85
|
+
closeOnBlur,
|
|
86
|
+
referenceObject
|
|
87
|
+
} = this.props;
|
|
88
|
+
if (popper) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (this.container.current === null) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
var {
|
|
95
|
+
options
|
|
96
|
+
} = this.props;
|
|
97
|
+
options = _objectSpread({
|
|
98
|
+
placement: 'auto',
|
|
99
|
+
modifiers: {
|
|
100
|
+
preventOverflow: {
|
|
101
|
+
boundariesElement: 'viewport'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}, options);
|
|
105
|
+
document.body.appendChild(this.element);
|
|
106
|
+
var parent = this.getVisibleElement(this.container.current);
|
|
107
|
+
if (parent == null) {
|
|
108
|
+
parent = this.container.current;
|
|
109
|
+
}
|
|
110
|
+
popper = new PopperJs(referenceObject || parent, this.element, options);
|
|
111
|
+
popper.scheduleUpdate();
|
|
112
|
+
|
|
113
|
+
// delayed due to scheduleUpdate
|
|
114
|
+
cancelAnimationFrame(this.rAF);
|
|
115
|
+
this.rAF = window.requestAnimationFrame(() => {
|
|
116
|
+
// for blur on close to work, focus needs to be on or within the popper
|
|
117
|
+
if (closeOnBlur && !this.element.contains(document.activeElement)) {
|
|
118
|
+
// only set focus, if a focus isn't already set within
|
|
119
|
+
var elem = this.element.firstElementChild;
|
|
120
|
+
if (elem instanceof HTMLElement) {
|
|
121
|
+
elem.focus(); // first child of the portal element
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
this.setState({
|
|
127
|
+
popper
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
destroyPopper() {
|
|
131
|
+
var updateState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
132
|
+
cancelAnimationFrame(this.rAF);
|
|
133
|
+
var {
|
|
134
|
+
popper
|
|
135
|
+
} = this.state;
|
|
136
|
+
if (!popper) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
popper.destroy();
|
|
140
|
+
|
|
141
|
+
// If component is exiting and unmounted in
|
|
142
|
+
// the same frame, destroy can be called twice.
|
|
143
|
+
// Check to make sure removeChild isn't called twice.
|
|
144
|
+
if (document.body.contains(this.element)) {
|
|
145
|
+
document.body.removeChild(this.element);
|
|
146
|
+
}
|
|
147
|
+
if (updateState) {
|
|
148
|
+
this.setState({
|
|
149
|
+
popper: null
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
show() {
|
|
154
|
+
this.initPopper();
|
|
155
|
+
this.setState({
|
|
156
|
+
show: true
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
hide() {
|
|
160
|
+
this.setState({
|
|
161
|
+
show: false
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
scheduleUpdate() {
|
|
165
|
+
var {
|
|
166
|
+
popper
|
|
167
|
+
} = this.state;
|
|
168
|
+
if (popper) popper.scheduleUpdate();
|
|
169
|
+
}
|
|
170
|
+
handleBlur(e) {
|
|
171
|
+
if (!(e.relatedTarget instanceof HTMLElement)) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (!this.element.contains(e.relatedTarget)) {
|
|
175
|
+
this.hide();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
handleEnter() {
|
|
179
|
+
var {
|
|
180
|
+
onEntered
|
|
181
|
+
} = this.props;
|
|
182
|
+
onEntered(); // trigger any parent component waiting for enter handler
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
handleExit() {
|
|
186
|
+
var {
|
|
187
|
+
onExited
|
|
188
|
+
} = this.props;
|
|
189
|
+
var {
|
|
190
|
+
show
|
|
191
|
+
} = this.state;
|
|
192
|
+
if (!show) {
|
|
193
|
+
this.destroyPopper();
|
|
194
|
+
}
|
|
195
|
+
onExited(); // trigger any parent component waiting for exited handler
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
renderContent() {
|
|
199
|
+
var {
|
|
200
|
+
className,
|
|
201
|
+
children,
|
|
202
|
+
timeout,
|
|
203
|
+
interactive,
|
|
204
|
+
closeOnBlur
|
|
205
|
+
} = this.props;
|
|
206
|
+
var {
|
|
207
|
+
show
|
|
208
|
+
} = this.state;
|
|
209
|
+
return /*#__PURE__*/React.createElement(CSSTransition, {
|
|
210
|
+
in: show,
|
|
211
|
+
timeout: timeout,
|
|
212
|
+
classNames: "popper-transition",
|
|
213
|
+
onEntered: this.handleEnter,
|
|
214
|
+
onExited: this.handleExit
|
|
215
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
216
|
+
onClick: e => {
|
|
217
|
+
// stop click events from escaping popper
|
|
218
|
+
e.stopPropagation();
|
|
219
|
+
},
|
|
220
|
+
onKeyDown: e => {
|
|
221
|
+
if (e.key === 'Escape') this.hide();
|
|
222
|
+
},
|
|
223
|
+
className: classNames('popper', {
|
|
224
|
+
interactive
|
|
225
|
+
}, className),
|
|
226
|
+
onBlur: closeOnBlur ? this.handleBlur : undefined,
|
|
227
|
+
tabIndex: closeOnBlur ? -1 : undefined,
|
|
228
|
+
role: "presentation"
|
|
229
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
230
|
+
className: "popper-content"
|
|
231
|
+
}, children, /*#__PURE__*/React.createElement("div", {
|
|
232
|
+
className: "popper-arrow",
|
|
233
|
+
"x-arrow": ""
|
|
234
|
+
}))));
|
|
235
|
+
}
|
|
236
|
+
render() {
|
|
237
|
+
var {
|
|
238
|
+
popper
|
|
239
|
+
} = this.state;
|
|
240
|
+
var {
|
|
241
|
+
'data-testid': dataTestId
|
|
242
|
+
} = this.props;
|
|
243
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
244
|
+
className: "popper-parent-container",
|
|
245
|
+
ref: this.container,
|
|
246
|
+
style: {
|
|
247
|
+
display: 'none'
|
|
248
|
+
},
|
|
249
|
+
"data-testid": dataTestId
|
|
250
|
+
}, popper && /*#__PURE__*/ReactDOM.createPortal(this.renderContent(), this.element));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
_defineProperty(Popper, "propTypes", {
|
|
254
|
+
children: PropTypes.node.isRequired,
|
|
255
|
+
options: PropTypes.shape({}),
|
|
256
|
+
className: PropTypes.string,
|
|
257
|
+
timeout: PropTypes.number,
|
|
258
|
+
onEntered: PropTypes.func,
|
|
259
|
+
onExited: PropTypes.func,
|
|
260
|
+
isShown: PropTypes.bool,
|
|
261
|
+
closeOnBlur: PropTypes.bool,
|
|
262
|
+
interactive: PropTypes.bool,
|
|
263
|
+
referenceObject: PropTypes.shape({}),
|
|
264
|
+
'data-testid': PropTypes.string
|
|
265
|
+
});
|
|
266
|
+
_defineProperty(Popper, "defaultProps", {
|
|
267
|
+
options: {},
|
|
268
|
+
className: '',
|
|
269
|
+
timeout: ThemeExport.transitionMs,
|
|
270
|
+
onEntered() {
|
|
271
|
+
// no-op
|
|
272
|
+
},
|
|
273
|
+
onExited() {
|
|
274
|
+
// no-op
|
|
275
|
+
},
|
|
276
|
+
isShown: false,
|
|
277
|
+
interactive: false,
|
|
278
|
+
closeOnBlur: false,
|
|
279
|
+
referenceObject: null,
|
|
280
|
+
'data-testid': undefined
|
|
281
|
+
});
|
|
282
|
+
export default Popper;
|
|
283
|
+
//# sourceMappingURL=Popper.js.map
|