@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 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../scss/custom.scss","../src/RandomAreaPlotAnimation.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE","file":"RandomAreaPlotAnimation.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.random-area-plot-animation-container {\n position: absolute;\n top: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n overflow: hidden;\n\n canvas {\n transition: all $transition;\n display: block;\n\n &.shade {\n filter: grayscale(100%) brightness(90%);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/* eslint-disable react-hooks/exhaustive-deps */
|
|
2
|
+
/* eslint-disable react/display-name */
|
|
3
|
+
|
|
4
|
+
import React, { useEffect, useState, useRef } from 'react';
|
|
5
|
+
import debounce from 'lodash.debounce';
|
|
6
|
+
import { assertNotNull } from '@deephaven/utils';
|
|
7
|
+
import "./RandomAreaPlotAnimation.css";
|
|
8
|
+
import ThemeExport from "./ThemeExport.js";
|
|
9
|
+
var VOLATILITY = 0.025; // how spikey the data gets
|
|
10
|
+
var LOW = 0.9;
|
|
11
|
+
var HIGH = 0.1;
|
|
12
|
+
var START_Y = 0.618;
|
|
13
|
+
var FOREGROUND = ThemeExport['primary-dark'];
|
|
14
|
+
var GRID_SIZE = 80;
|
|
15
|
+
var GRID_COLOR = ThemeExport['gray-800'];
|
|
16
|
+
var BACKGROUND = ThemeExport['gray-900'];
|
|
17
|
+
var PATTERN = {
|
|
18
|
+
SIZE: 8,
|
|
19
|
+
DOT_SIZE: 2,
|
|
20
|
+
FILL_OPACITY: 0.25
|
|
21
|
+
};
|
|
22
|
+
var PX_PER_SECOND = 18;
|
|
23
|
+
var RESIZE_DEBOUNCE = 250;
|
|
24
|
+
var INTERACTION_TIMEOUT = 60 * 1000;
|
|
25
|
+
|
|
26
|
+
// Draw a background canvas, paint it with a fun chart looking animation
|
|
27
|
+
var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
28
|
+
var canvas = useRef(null);
|
|
29
|
+
var container = useRef(null);
|
|
30
|
+
var [shade, setShade] = useState(false);
|
|
31
|
+
var scale = window.devicePixelRatio;
|
|
32
|
+
var ctx;
|
|
33
|
+
var pattern;
|
|
34
|
+
var width;
|
|
35
|
+
var height;
|
|
36
|
+
var rAF;
|
|
37
|
+
var lastTimestamp = null;
|
|
38
|
+
var data = [];
|
|
39
|
+
function setCanvasSize() {
|
|
40
|
+
var _ctx;
|
|
41
|
+
// Set canvas size to fill screen
|
|
42
|
+
if (container.current != null) {
|
|
43
|
+
width = container.current.offsetWidth;
|
|
44
|
+
height = container.current.offsetHeight;
|
|
45
|
+
}
|
|
46
|
+
if (canvas.current != null) {
|
|
47
|
+
canvas.current.style.width = "".concat(width, "px");
|
|
48
|
+
canvas.current.style.height = "".concat(height, "px");
|
|
49
|
+
canvas.current.width = width * scale;
|
|
50
|
+
canvas.current.height = height * scale;
|
|
51
|
+
}
|
|
52
|
+
(_ctx = ctx) === null || _ctx === void 0 ? void 0 : _ctx.scale(scale, scale);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Returns the background fill create offscreen as pattern
|
|
56
|
+
function createPatternFill() {
|
|
57
|
+
// create the off-screen canvas
|
|
58
|
+
var canvasPattern = document.createElement('canvas');
|
|
59
|
+
canvasPattern.width = PATTERN.SIZE;
|
|
60
|
+
canvasPattern.height = PATTERN.SIZE;
|
|
61
|
+
var contextPattern = canvasPattern.getContext('2d');
|
|
62
|
+
|
|
63
|
+
// draw pattern to off-screen context
|
|
64
|
+
if (contextPattern != null) {
|
|
65
|
+
contextPattern.fillStyle = FOREGROUND;
|
|
66
|
+
contextPattern.fillRect(0, 0, PATTERN.DOT_SIZE, PATTERN.DOT_SIZE);
|
|
67
|
+
|
|
68
|
+
// add an overlay fill
|
|
69
|
+
contextPattern.fillStyle = FOREGROUND + Math.round(255 * PATTERN.FILL_OPACITY).toString(16).padStart(2, '0'); // adds opacity in hex to color
|
|
70
|
+
contextPattern.fillRect(0, 0, PATTERN.SIZE, PATTERN.SIZE);
|
|
71
|
+
}
|
|
72
|
+
return contextPattern === null || contextPattern === void 0 ? void 0 : contextPattern.createPattern(canvasPattern, 'repeat');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Generates a step in a random walk between LOW - HIGH given a previous value
|
|
77
|
+
* data is always in 0-1 data space so its scaleable
|
|
78
|
+
* data space is converted to screen space inside draw functions
|
|
79
|
+
* @param prev previous random walk step
|
|
80
|
+
* @return new random walk step
|
|
81
|
+
*/
|
|
82
|
+
function randomWalk(prev) {
|
|
83
|
+
var rand = Math.random() - 0.5; // give it directionality
|
|
84
|
+
var change = VOLATILITY * rand; // scale by volatity constant
|
|
85
|
+
|
|
86
|
+
// ensure directional bounce off approaching edges
|
|
87
|
+
if (prev < HIGH) {
|
|
88
|
+
change = Math.abs(change);
|
|
89
|
+
} else if (prev > LOW) {
|
|
90
|
+
change = -Math.abs(change);
|
|
91
|
+
}
|
|
92
|
+
return prev + change;
|
|
93
|
+
}
|
|
94
|
+
function initData() {
|
|
95
|
+
var startingData = [];
|
|
96
|
+
var y = START_Y; // always start towards the bottom of the screen
|
|
97
|
+
for (var x = 0; x < width + PX_PER_SECOND; x += 1) {
|
|
98
|
+
y = randomWalk(y);
|
|
99
|
+
startingData.push(y);
|
|
100
|
+
}
|
|
101
|
+
return startingData;
|
|
102
|
+
}
|
|
103
|
+
function setDataSize() {
|
|
104
|
+
while (data.length >= width + PX_PER_SECOND) {
|
|
105
|
+
data.pop();
|
|
106
|
+
}
|
|
107
|
+
while (data.length < width + PX_PER_SECOND) {
|
|
108
|
+
data.push(randomWalk(data[data.length - 1]));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function drawAreaLine(path, context) {
|
|
112
|
+
context.beginPath();
|
|
113
|
+
// start offscreen
|
|
114
|
+
context.moveTo(-1, height + 1);
|
|
115
|
+
context.lineTo(-1, height * path[0]);
|
|
116
|
+
|
|
117
|
+
// draw the line
|
|
118
|
+
for (var i = 0; i < path.length; i += 1) {
|
|
119
|
+
context.lineTo(i, height * path[i]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// close offscreen
|
|
123
|
+
context.lineTo(width + PX_PER_SECOND, height * path[path.length - 1]);
|
|
124
|
+
context.lineTo(width + PX_PER_SECOND, height + 1);
|
|
125
|
+
context.closePath();
|
|
126
|
+
}
|
|
127
|
+
function drawGridLines(context) {
|
|
128
|
+
context.beginPath();
|
|
129
|
+
// draw verticals
|
|
130
|
+
for (var x = 1; x < width; x += GRID_SIZE) {
|
|
131
|
+
context.moveTo(x, 0);
|
|
132
|
+
context.lineTo(x, height);
|
|
133
|
+
}
|
|
134
|
+
// draw horizontals
|
|
135
|
+
for (var y = 1; y < height; y += GRID_SIZE) {
|
|
136
|
+
context.moveTo(0, y);
|
|
137
|
+
context.lineTo(width, y);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Main draw loop for where the animation happens
|
|
143
|
+
* all the styling happens within drawCanvas from paths generated by other functions
|
|
144
|
+
* @param timestamp passed in callback from requestAnimationFrame
|
|
145
|
+
*/
|
|
146
|
+
function drawCanvas(timestamp) {
|
|
147
|
+
var _lastTimestamp, _lastTimestamp2, _lastTimestamp3;
|
|
148
|
+
lastTimestamp = (_lastTimestamp = lastTimestamp) !== null && _lastTimestamp !== void 0 ? _lastTimestamp : timestamp;
|
|
149
|
+
assertNotNull(ctx);
|
|
150
|
+
// clear the canvas
|
|
151
|
+
ctx.fillStyle = BACKGROUND;
|
|
152
|
+
ctx.fillRect(0, 0, width, height);
|
|
153
|
+
drawGridLines(ctx);
|
|
154
|
+
ctx.lineWidth = 1;
|
|
155
|
+
ctx.strokeStyle = GRID_COLOR;
|
|
156
|
+
ctx.stroke();
|
|
157
|
+
|
|
158
|
+
// for speeds less then 60 px per second, subpixel motion is required to look smooth
|
|
159
|
+
var subPixelMotion = (((_lastTimestamp2 = lastTimestamp) !== null && _lastTimestamp2 !== void 0 ? _lastTimestamp2 : 0) - (timestamp !== null && timestamp !== void 0 ? timestamp : 0)) / (1000 / PX_PER_SECOND);
|
|
160
|
+
ctx.translate(subPixelMotion, 0);
|
|
161
|
+
drawAreaLine(data, ctx);
|
|
162
|
+
ctx.lineWidth = 2;
|
|
163
|
+
ctx.strokeStyle = FOREGROUND;
|
|
164
|
+
ctx.stroke();
|
|
165
|
+
ctx.translate(-subPixelMotion, 0); // we don't pattern to shift however
|
|
166
|
+
if (pattern != null) {
|
|
167
|
+
ctx.fillStyle = pattern;
|
|
168
|
+
}
|
|
169
|
+
ctx.fill();
|
|
170
|
+
ctx.setTransform(scale, 0, 0, scale, 0, 0); // reset the translate matrix to normal
|
|
171
|
+
|
|
172
|
+
// generate new data points
|
|
173
|
+
if ((timestamp !== null && timestamp !== void 0 ? timestamp : 0) - ((_lastTimestamp3 = lastTimestamp) !== null && _lastTimestamp3 !== void 0 ? _lastTimestamp3 : 0) > 1000 / PX_PER_SECOND) {
|
|
174
|
+
var _lastTimestamp4;
|
|
175
|
+
// number of points to add since last update
|
|
176
|
+
var numberOfPoints = Math.floor(((timestamp !== null && timestamp !== void 0 ? timestamp : 0) - ((_lastTimestamp4 = lastTimestamp) !== null && _lastTimestamp4 !== void 0 ? _lastTimestamp4 : 0)) / (1000 / PX_PER_SECOND));
|
|
177
|
+
for (var i = 0; i < numberOfPoints; i += 1) {
|
|
178
|
+
data.shift();
|
|
179
|
+
data.push(randomWalk(data[data.length - 1]));
|
|
180
|
+
}
|
|
181
|
+
lastTimestamp = timestamp;
|
|
182
|
+
}
|
|
183
|
+
if (rAF != null) {
|
|
184
|
+
cancelAnimationFrame(rAF);
|
|
185
|
+
}
|
|
186
|
+
rAF = requestAnimationFrame(drawCanvas);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// debounce the resize so its not overly aggresive
|
|
190
|
+
var debouncedHandleResize = debounce(() => {
|
|
191
|
+
rAF = requestAnimationFrame(timestamp => {
|
|
192
|
+
setCanvasSize(); // setCanvas can cause lag if not debounced
|
|
193
|
+
|
|
194
|
+
// fill or remove extra data points
|
|
195
|
+
setDataSize();
|
|
196
|
+
|
|
197
|
+
// opening devtools triggers a blur then resize,
|
|
198
|
+
// need to reset shade as we are restarting animation
|
|
199
|
+
setShade(false);
|
|
200
|
+
drawCanvas(timestamp);
|
|
201
|
+
});
|
|
202
|
+
}, RESIZE_DEBOUNCE, {
|
|
203
|
+
leading: true
|
|
204
|
+
} // resize immediately, once.
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
function pauseAnimation() {
|
|
208
|
+
// pause animation when browser window is blurred to conserve CPU usage
|
|
209
|
+
setShade(true);
|
|
210
|
+
if (rAF != null) {
|
|
211
|
+
cancelAnimationFrame(rAF);
|
|
212
|
+
}
|
|
213
|
+
rAF = null;
|
|
214
|
+
lastTimestamp = null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// when timeout expires, pause animation
|
|
218
|
+
var resetIdleTimeout = debounce(() => {
|
|
219
|
+
pauseAnimation();
|
|
220
|
+
}, INTERACTION_TIMEOUT);
|
|
221
|
+
function startAnimation() {
|
|
222
|
+
// can fire multiple times, check if rAF is null first
|
|
223
|
+
// restart animation loop, and fade back in
|
|
224
|
+
if (rAF == null) {
|
|
225
|
+
setShade(false);
|
|
226
|
+
setCanvasSize();
|
|
227
|
+
setDataSize();
|
|
228
|
+
rAF = requestAnimationFrame(drawCanvas);
|
|
229
|
+
}
|
|
230
|
+
resetIdleTimeout();
|
|
231
|
+
}
|
|
232
|
+
function handleActivity() {
|
|
233
|
+
if (document.hasFocus()) {
|
|
234
|
+
// only if document has focus (mousemove can fire on non-focused tabs)
|
|
235
|
+
startAnimation();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function handleResize() {
|
|
239
|
+
// pause and debounce animation during resize for better resizing performance
|
|
240
|
+
if (rAF != null) {
|
|
241
|
+
cancelAnimationFrame(rAF);
|
|
242
|
+
}
|
|
243
|
+
resetIdleTimeout(); // treat resizing as a form of activity
|
|
244
|
+
debouncedHandleResize();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// react mount/unmount hooks
|
|
248
|
+
useEffect(() => {
|
|
249
|
+
var _canvas$current;
|
|
250
|
+
ctx = (_canvas$current = canvas.current) === null || _canvas$current === void 0 ? void 0 : _canvas$current.getContext('2d', {
|
|
251
|
+
alpha: false
|
|
252
|
+
});
|
|
253
|
+
setCanvasSize();
|
|
254
|
+
data = initData();
|
|
255
|
+
pattern = createPatternFill();
|
|
256
|
+
|
|
257
|
+
// start draw loop
|
|
258
|
+
drawCanvas();
|
|
259
|
+
resetIdleTimeout();
|
|
260
|
+
window.addEventListener('resize', handleResize);
|
|
261
|
+
window.addEventListener('focus', startAnimation);
|
|
262
|
+
window.addEventListener('blur', pauseAnimation);
|
|
263
|
+
|
|
264
|
+
// don't burn cpu if the user is "idle", start a timer that resets
|
|
265
|
+
// on any user activity, and on timeout expiry pause the animation
|
|
266
|
+
window.addEventListener('mousemove', handleActivity);
|
|
267
|
+
window.addEventListener('keydown', handleActivity);
|
|
268
|
+
return () => {
|
|
269
|
+
if (rAF != null) {
|
|
270
|
+
cancelAnimationFrame(rAF);
|
|
271
|
+
}
|
|
272
|
+
window.removeEventListener('resize', handleResize);
|
|
273
|
+
window.removeEventListener('focus', startAnimation);
|
|
274
|
+
window.removeEventListener('blur', pauseAnimation);
|
|
275
|
+
window.removeEventListener('mousemove', handleActivity);
|
|
276
|
+
window.removeEventListener('keydown', handleActivity);
|
|
277
|
+
resetIdleTimeout.cancel();
|
|
278
|
+
debouncedHandleResize.cancel();
|
|
279
|
+
};
|
|
280
|
+
}, []);
|
|
281
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
282
|
+
className: "random-area-plot-animation-container",
|
|
283
|
+
ref: container
|
|
284
|
+
}, /*#__PURE__*/React.createElement("canvas", {
|
|
285
|
+
ref: canvas,
|
|
286
|
+
className: shade ? 'shade' : ''
|
|
287
|
+
}));
|
|
288
|
+
});
|
|
289
|
+
export default RandomAreaPlotAnimation;
|
|
290
|
+
//# sourceMappingURL=RandomAreaPlotAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RandomAreaPlotAnimation.js","names":["React","useEffect","useState","useRef","debounce","assertNotNull","ThemeExport","VOLATILITY","LOW","HIGH","START_Y","FOREGROUND","GRID_SIZE","GRID_COLOR","BACKGROUND","PATTERN","SIZE","DOT_SIZE","FILL_OPACITY","PX_PER_SECOND","RESIZE_DEBOUNCE","INTERACTION_TIMEOUT","RandomAreaPlotAnimation","memo","canvas","container","shade","setShade","scale","window","devicePixelRatio","ctx","pattern","width","height","rAF","lastTimestamp","data","setCanvasSize","current","offsetWidth","offsetHeight","style","createPatternFill","canvasPattern","document","createElement","contextPattern","getContext","fillStyle","fillRect","Math","round","toString","padStart","createPattern","randomWalk","prev","rand","random","change","abs","initData","startingData","y","x","push","setDataSize","length","pop","drawAreaLine","path","context","beginPath","moveTo","lineTo","i","closePath","drawGridLines","drawCanvas","timestamp","lineWidth","strokeStyle","stroke","subPixelMotion","translate","fill","setTransform","numberOfPoints","floor","shift","cancelAnimationFrame","requestAnimationFrame","debouncedHandleResize","leading","pauseAnimation","resetIdleTimeout","startAnimation","handleActivity","hasFocus","handleResize","alpha","addEventListener","removeEventListener","cancel"],"sources":["../src/RandomAreaPlotAnimation.tsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable react/display-name */\n\nimport React, { useEffect, useState, useRef } from 'react';\nimport debounce from 'lodash.debounce';\nimport { assertNotNull } from '@deephaven/utils';\nimport './RandomAreaPlotAnimation.scss';\nimport ThemeExport from './ThemeExport';\n\nconst VOLATILITY = 0.025; // how spikey the data gets\nconst LOW = 0.9;\nconst HIGH = 0.1;\nconst START_Y = 0.618;\nconst FOREGROUND = ThemeExport['primary-dark'];\nconst GRID_SIZE = 80;\nconst GRID_COLOR = ThemeExport['gray-800'];\nconst BACKGROUND = ThemeExport['gray-900'];\nconst PATTERN = { SIZE: 8, DOT_SIZE: 2, FILL_OPACITY: 0.25 };\nconst PX_PER_SECOND = 18;\nconst RESIZE_DEBOUNCE = 250;\nconst INTERACTION_TIMEOUT = 60 * 1000;\n\n// Draw a background canvas, paint it with a fun chart looking animation\nconst RandomAreaPlotAnimation = React.memo(() => {\n const canvas = useRef<HTMLCanvasElement>(null);\n const container = useRef<HTMLDivElement>(null);\n const [shade, setShade] = useState(false);\n const scale = window.devicePixelRatio;\n\n let ctx: CanvasRenderingContext2D | null | undefined;\n let pattern: CanvasPattern | null | undefined;\n let width: number;\n let height: number;\n let rAF: number | null;\n\n let lastTimestamp: DOMHighResTimeStamp | null | undefined = null;\n let data: number[] = [];\n\n function setCanvasSize() {\n // Set canvas size to fill screen\n if (container.current != null) {\n width = container.current.offsetWidth;\n height = container.current.offsetHeight;\n }\n\n if (canvas.current != null) {\n canvas.current.style.width = `${width}px`;\n canvas.current.style.height = `${height}px`;\n\n canvas.current.width = width * scale;\n canvas.current.height = height * scale;\n }\n\n ctx?.scale(scale, scale);\n }\n\n // Returns the background fill create offscreen as pattern\n function createPatternFill() {\n // create the off-screen canvas\n const canvasPattern = document.createElement('canvas');\n canvasPattern.width = PATTERN.SIZE;\n canvasPattern.height = PATTERN.SIZE;\n const contextPattern = canvasPattern.getContext('2d');\n\n // draw pattern to off-screen context\n if (contextPattern != null) {\n contextPattern.fillStyle = FOREGROUND;\n contextPattern.fillRect(0, 0, PATTERN.DOT_SIZE, PATTERN.DOT_SIZE);\n\n // add an overlay fill\n contextPattern.fillStyle =\n FOREGROUND +\n Math.round(255 * PATTERN.FILL_OPACITY)\n .toString(16)\n .padStart(2, '0'); // adds opacity in hex to color\n contextPattern.fillRect(0, 0, PATTERN.SIZE, PATTERN.SIZE);\n }\n return contextPattern?.createPattern(canvasPattern, 'repeat');\n }\n\n /**\n * Generates a step in a random walk between LOW - HIGH given a previous value\n * data is always in 0-1 data space so its scaleable\n * data space is converted to screen space inside draw functions\n * @param prev previous random walk step\n * @return new random walk step\n */\n function randomWalk(prev: number): number {\n const rand = Math.random() - 0.5; // give it directionality\n let change = VOLATILITY * rand; // scale by volatity constant\n\n // ensure directional bounce off approaching edges\n if (prev < HIGH) {\n change = Math.abs(change);\n } else if (prev > LOW) {\n change = -Math.abs(change);\n }\n\n return prev + change;\n }\n\n function initData() {\n const startingData = [];\n let y = START_Y; // always start towards the bottom of the screen\n for (let x = 0; x < width + PX_PER_SECOND; x += 1) {\n y = randomWalk(y);\n startingData.push(y);\n }\n return startingData;\n }\n\n function setDataSize() {\n while (data.length >= width + PX_PER_SECOND) {\n data.pop();\n }\n while (data.length < width + PX_PER_SECOND) {\n data.push(randomWalk(data[data.length - 1]));\n }\n }\n\n function drawAreaLine(path: number[], context: CanvasRenderingContext2D) {\n context.beginPath();\n // start offscreen\n context.moveTo(-1, height + 1);\n context.lineTo(-1, height * path[0]);\n\n // draw the line\n for (let i = 0; i < path.length; i += 1) {\n context.lineTo(i, height * path[i]);\n }\n\n // close offscreen\n context.lineTo(width + PX_PER_SECOND, height * path[path.length - 1]);\n context.lineTo(width + PX_PER_SECOND, height + 1);\n context.closePath();\n }\n\n function drawGridLines(context: CanvasRenderingContext2D) {\n context.beginPath();\n // draw verticals\n for (let x = 1; x < width; x += GRID_SIZE) {\n context.moveTo(x, 0);\n context.lineTo(x, height);\n }\n // draw horizontals\n for (let y = 1; y < height; y += GRID_SIZE) {\n context.moveTo(0, y);\n context.lineTo(width, y);\n }\n }\n\n /**\n * Main draw loop for where the animation happens\n * all the styling happens within drawCanvas from paths generated by other functions\n * @param timestamp passed in callback from requestAnimationFrame\n */\n function drawCanvas(timestamp?: DOMHighResTimeStamp) {\n lastTimestamp = lastTimestamp ?? timestamp;\n\n assertNotNull(ctx);\n // clear the canvas\n ctx.fillStyle = BACKGROUND;\n ctx.fillRect(0, 0, width, height);\n\n drawGridLines(ctx);\n ctx.lineWidth = 1;\n ctx.strokeStyle = GRID_COLOR;\n ctx.stroke();\n\n // for speeds less then 60 px per second, subpixel motion is required to look smooth\n const subPixelMotion =\n ((lastTimestamp ?? 0) - (timestamp ?? 0)) / (1000 / PX_PER_SECOND);\n ctx.translate(subPixelMotion, 0);\n\n drawAreaLine(data, ctx);\n ctx.lineWidth = 2;\n ctx.strokeStyle = FOREGROUND;\n ctx.stroke();\n\n ctx.translate(-subPixelMotion, 0); // we don't pattern to shift however\n if (pattern != null) {\n ctx.fillStyle = pattern;\n }\n ctx.fill();\n ctx.setTransform(scale, 0, 0, scale, 0, 0); // reset the translate matrix to normal\n\n // generate new data points\n if ((timestamp ?? 0) - (lastTimestamp ?? 0) > 1000 / PX_PER_SECOND) {\n // number of points to add since last update\n const numberOfPoints = Math.floor(\n ((timestamp ?? 0) - (lastTimestamp ?? 0)) / (1000 / PX_PER_SECOND)\n );\n for (let i = 0; i < numberOfPoints; i += 1) {\n data.shift();\n data.push(randomWalk(data[data.length - 1]));\n }\n lastTimestamp = timestamp;\n }\n\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n rAF = requestAnimationFrame(drawCanvas);\n }\n\n // debounce the resize so its not overly aggresive\n const debouncedHandleResize = debounce(\n () => {\n rAF = requestAnimationFrame(timestamp => {\n setCanvasSize(); // setCanvas can cause lag if not debounced\n\n // fill or remove extra data points\n setDataSize();\n\n // opening devtools triggers a blur then resize,\n // need to reset shade as we are restarting animation\n setShade(false);\n drawCanvas(timestamp);\n });\n },\n RESIZE_DEBOUNCE,\n { leading: true } // resize immediately, once.\n );\n\n function pauseAnimation() {\n // pause animation when browser window is blurred to conserve CPU usage\n setShade(true);\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n rAF = null;\n lastTimestamp = null;\n }\n\n // when timeout expires, pause animation\n const resetIdleTimeout = debounce(() => {\n pauseAnimation();\n }, INTERACTION_TIMEOUT);\n\n function startAnimation() {\n // can fire multiple times, check if rAF is null first\n // restart animation loop, and fade back in\n if (rAF == null) {\n setShade(false);\n setCanvasSize();\n setDataSize();\n rAF = requestAnimationFrame(drawCanvas);\n }\n resetIdleTimeout();\n }\n\n function handleActivity() {\n if (document.hasFocus()) {\n // only if document has focus (mousemove can fire on non-focused tabs)\n startAnimation();\n }\n }\n\n function handleResize() {\n // pause and debounce animation during resize for better resizing performance\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n resetIdleTimeout(); // treat resizing as a form of activity\n debouncedHandleResize();\n }\n\n // react mount/unmount hooks\n useEffect(() => {\n ctx = canvas.current?.getContext('2d', { alpha: false });\n setCanvasSize();\n data = initData();\n pattern = createPatternFill();\n\n // start draw loop\n drawCanvas();\n resetIdleTimeout();\n\n window.addEventListener('resize', handleResize);\n\n window.addEventListener('focus', startAnimation);\n window.addEventListener('blur', pauseAnimation);\n\n // don't burn cpu if the user is \"idle\", start a timer that resets\n // on any user activity, and on timeout expiry pause the animation\n window.addEventListener('mousemove', handleActivity);\n window.addEventListener('keydown', handleActivity);\n\n return () => {\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('focus', startAnimation);\n window.removeEventListener('blur', pauseAnimation);\n\n window.removeEventListener('mousemove', handleActivity);\n window.removeEventListener('keydown', handleActivity);\n\n resetIdleTimeout.cancel();\n debouncedHandleResize.cancel();\n };\n }, []);\n\n return (\n <div className=\"random-area-plot-animation-container\" ref={container}>\n <canvas ref={canvas} className={shade ? 'shade' : ''} />\n </div>\n );\n});\n\nexport default RandomAreaPlotAnimation;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.search-group {
|
|
3
|
+
position: relative;
|
|
4
|
+
}
|
|
5
|
+
.search-group .form-control {
|
|
6
|
+
padding-right: 1.75rem;
|
|
7
|
+
}
|
|
8
|
+
.search-group .search-icon {
|
|
9
|
+
pointer-events: none;
|
|
10
|
+
position: absolute;
|
|
11
|
+
right: 0.5rem;
|
|
12
|
+
top: 0;
|
|
13
|
+
bottom: 0;
|
|
14
|
+
height: 100%;
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
}
|
|
18
|
+
.search-group ::-webkit-search-cancel-button {
|
|
19
|
+
-webkit-appearance: none;
|
|
20
|
+
height: 16px;
|
|
21
|
+
width: 16px;
|
|
22
|
+
background-repeat: no-repeat;
|
|
23
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23c0bfbf' d='M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z'/%3E%3C/svg%3E");
|
|
24
|
+
transition: background-image 0.15s;
|
|
25
|
+
}
|
|
26
|
+
.search-group ::-webkit-search-cancel-button:hover {
|
|
27
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23fcfcfa' d='M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z' /%3E%3C/svg%3E");
|
|
28
|
+
}
|
|
29
|
+
.search-group .search-match {
|
|
30
|
+
pointer-events: none;
|
|
31
|
+
position: absolute;
|
|
32
|
+
right: 3rem;
|
|
33
|
+
top: 15%;
|
|
34
|
+
bottom: 15%;
|
|
35
|
+
height: 70%;
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
padding: 0 0.5rem;
|
|
39
|
+
border-radius: 1rem;
|
|
40
|
+
background-color: rgba(240, 240, 238, 0.25);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/*# sourceMappingURL=SearchInput.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../scss/custom.scss","../src/SearchInput.scss","../scss/new_variables.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;EACA,OCTO;EDUP;EACA;EACA;EACA;EACA;;AAGF;EAIE;EACA;EACA;EACA;EAEA;EAKA;;AACA;EACE;;AAQJ;EACE;EACA;EACA,OCzCO;ED0CP;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"SearchInput.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.search-group {\n position: relative;\n\n .form-control {\n padding-right: 1.75rem; // leave space for search icon and cancel button from browser\n }\n\n .search-icon {\n pointer-events: none;\n position: absolute;\n right: $spacer-2;\n top: 0;\n bottom: 0;\n height: 100%;\n display: flex;\n align-items: center;\n }\n\n ::-webkit-search-cancel-button {\n $close-path: 'M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z';\n\n // Need to specify -webkit-appearance: none for Chrome\n -webkit-appearance: none;\n height: 16px;\n width: 16px;\n background-repeat: no-repeat;\n // vsClose icon\n background-image: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$gray-300}' d='#{$close-path}'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n );\n transition: background-image $transition;\n &:hover {\n background-image: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$gray-100}' d='#{$close-path}' /%3E%3C/svg%3E\"),\n '#',\n '%23'\n );\n }\n }\n\n .search-match {\n pointer-events: none;\n position: absolute;\n right: $spacer-5;\n top: 15%;\n bottom: 15%;\n height: 70%;\n display: flex;\n align-items: center;\n padding: 0 $spacer-2;\n border-radius: 1rem;\n background-color: rgba($white, 0.25);\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
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; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
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); }
|
|
4
|
+
import React, { PureComponent } from 'react';
|
|
5
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
6
|
+
import { vsSearch } from '@deephaven/icons';
|
|
7
|
+
import classNames from 'classnames';
|
|
8
|
+
import "./SearchInput.css";
|
|
9
|
+
class SearchInput extends PureComponent {
|
|
10
|
+
constructor(props) {
|
|
11
|
+
super(props);
|
|
12
|
+
_defineProperty(this, "inputField", void 0);
|
|
13
|
+
this.inputField = /*#__PURE__*/React.createRef();
|
|
14
|
+
}
|
|
15
|
+
focus() {
|
|
16
|
+
var _this$inputField$curr;
|
|
17
|
+
(_this$inputField$curr = this.inputField.current) === null || _this$inputField$curr === void 0 ? void 0 : _this$inputField$curr.focus();
|
|
18
|
+
}
|
|
19
|
+
render() {
|
|
20
|
+
var {
|
|
21
|
+
value,
|
|
22
|
+
placeholder,
|
|
23
|
+
onBlur,
|
|
24
|
+
onChange,
|
|
25
|
+
className,
|
|
26
|
+
disabled,
|
|
27
|
+
matchCount,
|
|
28
|
+
id,
|
|
29
|
+
onKeyDown,
|
|
30
|
+
'data-testid': dataTestId
|
|
31
|
+
} = this.props;
|
|
32
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
className: classNames('search-group', className)
|
|
34
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
35
|
+
type: "search",
|
|
36
|
+
value: value,
|
|
37
|
+
onBlur: onBlur,
|
|
38
|
+
onChange: onChange,
|
|
39
|
+
onKeyDown: onKeyDown,
|
|
40
|
+
className: "form-control",
|
|
41
|
+
disabled: disabled,
|
|
42
|
+
placeholder: placeholder,
|
|
43
|
+
ref: this.inputField,
|
|
44
|
+
id: id,
|
|
45
|
+
"data-testid": dataTestId
|
|
46
|
+
}), matchCount != null && /*#__PURE__*/React.createElement("span", {
|
|
47
|
+
className: "search-match"
|
|
48
|
+
}, matchCount), /*#__PURE__*/React.createElement("span", {
|
|
49
|
+
className: "search-icon"
|
|
50
|
+
}, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
51
|
+
icon: vsSearch
|
|
52
|
+
})));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
_defineProperty(SearchInput, "defaultProps", {
|
|
56
|
+
placeholder: 'Search',
|
|
57
|
+
className: '',
|
|
58
|
+
matchCount: null,
|
|
59
|
+
onKeyDown() {
|
|
60
|
+
// no-op
|
|
61
|
+
},
|
|
62
|
+
id: '',
|
|
63
|
+
'data-testid': undefined
|
|
64
|
+
});
|
|
65
|
+
export default SearchInput;
|
|
66
|
+
//# sourceMappingURL=SearchInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInput.js","names":["React","PureComponent","FontAwesomeIcon","vsSearch","classNames","SearchInput","constructor","props","inputField","createRef","focus","current","render","value","placeholder","onBlur","onChange","className","disabled","matchCount","id","onKeyDown","dataTestId","undefined"],"sources":["../src/SearchInput.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsSearch } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport './SearchInput.scss';\n\ninterface SearchInputProps {\n value: string;\n placeholder: string;\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>;\n className: string;\n disabled?: boolean;\n matchCount: number;\n id: string;\n 'data-testid'?: string;\n}\n\nclass SearchInput extends PureComponent<SearchInputProps> {\n static defaultProps = {\n placeholder: 'Search',\n className: '',\n matchCount: null,\n onKeyDown(): void {\n // no-op\n },\n id: '',\n 'data-testid': undefined,\n };\n\n constructor(props: SearchInputProps) {\n super(props);\n this.inputField = React.createRef();\n }\n\n inputField: React.RefObject<HTMLInputElement>;\n\n focus(): void {\n this.inputField.current?.focus();\n }\n\n render(): JSX.Element {\n const {\n value,\n placeholder,\n onBlur,\n onChange,\n className,\n disabled,\n matchCount,\n id,\n onKeyDown,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div className={classNames('search-group', className)}>\n <input\n type=\"search\"\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n className=\"form-control\"\n disabled={disabled}\n placeholder={placeholder}\n ref={this.inputField}\n id={id}\n data-testid={dataTestId}\n />\n {matchCount != null && (\n <span className=\"search-match\">{matchCount}</span>\n )}\n <span className=\"search-icon\">\n <FontAwesomeIcon icon={vsSearch} />\n </span>\n </div>\n );\n }\n}\n\nexport default SearchInput;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,OAAOC,UAAU,MAAM,YAAY;AAAC;AAgBpC,MAAMC,WAAW,SAASJ,aAAa,CAAmB;EAYxDK,WAAW,CAACC,KAAuB,EAAE;IACnC,KAAK,CAACA,KAAK,CAAC;IAAC;IACb,IAAI,CAACC,UAAU,gBAAGR,KAAK,CAACS,SAAS,EAAE;EACrC;EAIAC,KAAK,GAAS;IAAA;IACZ,6BAAI,CAACF,UAAU,CAACG,OAAO,0DAAvB,sBAAyBD,KAAK,EAAE;EAClC;EAEAE,MAAM,GAAgB;IACpB,IAAM;MACJC,KAAK;MACLC,WAAW;MACXC,MAAM;MACNC,QAAQ;MACRC,SAAS;MACTC,QAAQ;MACRC,UAAU;MACVC,EAAE;MACFC,SAAS;MACT,aAAa,EAAEC;IACjB,CAAC,GAAG,IAAI,CAACf,KAAK;IACd,oBACE;MAAK,SAAS,EAAEH,UAAU,CAAC,cAAc,EAAEa,SAAS;IAAE,gBACpD;MACE,IAAI,EAAC,QAAQ;MACb,KAAK,EAAEJ,KAAM;MACb,MAAM,EAAEE,MAAO;MACf,QAAQ,EAAEC,QAAS;MACnB,SAAS,EAAEK,SAAU;MACrB,SAAS,EAAC,cAAc;MACxB,QAAQ,EAAEH,QAAS;MACnB,WAAW,EAAEJ,WAAY;MACzB,GAAG,EAAE,IAAI,CAACN,UAAW;MACrB,EAAE,EAAEY,EAAG;MACP,eAAaE;IAAW,EACxB,EACDH,UAAU,IAAI,IAAI,iBACjB;MAAM,SAAS,EAAC;IAAc,GAAEA,UAAU,CAC3C,eACD;MAAM,SAAS,EAAC;IAAa,gBAC3B,oBAAC,eAAe;MAAC,IAAI,EAAEhB;IAAS,EAAG,CAC9B,CACH;EAEV;AACF;AAAC,gBA5DKE,WAAW,kBACO;EACpBS,WAAW,EAAE,QAAQ;EACrBG,SAAS,EAAE,EAAE;EACbE,UAAU,EAAE,IAAI;EAChBE,SAAS,GAAS;IAChB;EAAA,CACD;EACDD,EAAE,EAAE,EAAE;EACN,aAAa,EAAEG;AACjB,CAAC;AAoDH,eAAelB,WAAW"}
|
package/dist/Select.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React, { useCallback } from 'react';
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
function Select(_ref) {
|
|
4
|
+
var {
|
|
5
|
+
children,
|
|
6
|
+
onBlur,
|
|
7
|
+
onChange,
|
|
8
|
+
className,
|
|
9
|
+
defaultValue,
|
|
10
|
+
name,
|
|
11
|
+
value,
|
|
12
|
+
disabled,
|
|
13
|
+
'data-testid': dataTestId
|
|
14
|
+
} = _ref;
|
|
15
|
+
var handleChange = useCallback(event => {
|
|
16
|
+
onChange(event.target.value);
|
|
17
|
+
}, [onChange]);
|
|
18
|
+
return /*#__PURE__*/React.createElement("select", {
|
|
19
|
+
className: classNames('custom-select', className),
|
|
20
|
+
onBlur: onBlur,
|
|
21
|
+
onChange: handleChange,
|
|
22
|
+
defaultValue: defaultValue,
|
|
23
|
+
value: value,
|
|
24
|
+
name: name,
|
|
25
|
+
disabled: disabled,
|
|
26
|
+
"data-testid": dataTestId
|
|
27
|
+
}, children);
|
|
28
|
+
}
|
|
29
|
+
export default Select;
|
|
30
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","names":["React","useCallback","classNames","Select","children","onBlur","onChange","className","defaultValue","name","value","disabled","dataTestId","handleChange","event","target"],"sources":["../src/Select.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport type SelectProps = {\n children: React.ReactNode;\n onBlur?: React.FocusEventHandler<HTMLSelectElement>;\n onChange: (value: string) => void;\n className?: string;\n defaultValue?: string;\n name?: string;\n value?: string;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nfunction Select({\n children,\n onBlur,\n onChange,\n className,\n defaultValue,\n name,\n value,\n disabled,\n 'data-testid': dataTestId,\n}: SelectProps): JSX.Element {\n const handleChange = useCallback(\n event => {\n onChange(event.target.value);\n },\n [onChange]\n );\n\n return (\n <select\n className={classNames('custom-select', className)}\n onBlur={onBlur}\n onChange={handleChange}\n defaultValue={defaultValue}\n value={value}\n name={name}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n </select>\n );\n}\n\nexport default Select;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,OAAOC,UAAU,MAAM,YAAY;AAcnC,SAASC,MAAM,OAUc;EAAA,IAVb;IACdC,QAAQ;IACRC,MAAM;IACNC,QAAQ;IACRC,SAAS;IACTC,YAAY;IACZC,IAAI;IACJC,KAAK;IACLC,QAAQ;IACR,aAAa,EAAEC;EACJ,CAAC;EACZ,IAAMC,YAAY,GAAGZ,WAAW,CAC9Ba,KAAK,IAAI;IACPR,QAAQ,CAACQ,KAAK,CAACC,MAAM,CAACL,KAAK,CAAC;EAC9B,CAAC,EACD,CAACJ,QAAQ,CAAC,CACX;EAED,oBACE;IACE,SAAS,EAAEJ,UAAU,CAAC,eAAe,EAAEK,SAAS,CAAE;IAClD,MAAM,EAAEF,MAAO;IACf,QAAQ,EAAEQ,YAAa;IACvB,YAAY,EAAEL,YAAa;IAC3B,KAAK,EAAEE,KAAM;IACb,IAAI,EAAED,IAAK;IACX,QAAQ,EAAEE,QAAS;IACnB,eAAaC;EAAW,GAEvBR,QAAQ,CACF;AAEb;AAEA,eAAeD,MAAM"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.select-value-list-scroll-pane {
|
|
3
|
+
overflow-x: hidden;
|
|
4
|
+
overflow-y: auto;
|
|
5
|
+
border: 1px solid #929192;
|
|
6
|
+
border-radius: 4px;
|
|
7
|
+
padding: 0.375rem 0 0.375rem;
|
|
8
|
+
}
|
|
9
|
+
.select-value-list-scroll-pane.is-invalid {
|
|
10
|
+
border-color: rgba(249, 93, 132, 0.85);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.select-value-list {
|
|
14
|
+
position: relative;
|
|
15
|
+
}
|
|
16
|
+
.select-value-list .select-value-list-content {
|
|
17
|
+
width: 100%;
|
|
18
|
+
margin: 0;
|
|
19
|
+
list-style-type: none;
|
|
20
|
+
padding: 0;
|
|
21
|
+
}
|
|
22
|
+
.select-value-list .select-value-list-content li {
|
|
23
|
+
width: 100%;
|
|
24
|
+
}
|
|
25
|
+
.select-value-list .select-value-list-content .custom-control {
|
|
26
|
+
margin: 0;
|
|
27
|
+
display: flex;
|
|
28
|
+
}
|
|
29
|
+
.select-value-list .select-value-list-content .custom-control:hover {
|
|
30
|
+
background: #5b5a5c;
|
|
31
|
+
}
|
|
32
|
+
.select-value-list .select-value-list-content .custom-control .custom-control-label {
|
|
33
|
+
margin-left: 0.75rem;
|
|
34
|
+
flex-grow: 1;
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/*# sourceMappingURL=SelectValueList.css.map */
|