@deephaven/components 0.55.0 → 0.55.1-alpha-theme-spectrum.17
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/css/BaseStyleSheet.css +878 -3622
- package/css/BaseStyleSheet.css.map +1 -1
- package/dist/AutoCompleteInput.css +4 -4
- package/dist/AutoCompleteInput.css.map +1 -1
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +26 -2
- package/dist/Button.js.map +1 -1
- package/dist/ComboBox.css +26 -6
- package/dist/ComboBox.css.map +1 -1
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +2 -4
- package/dist/ComboBox.js.map +1 -1
- package/dist/CustomTimeSelect.css +23 -10
- package/dist/CustomTimeSelect.css.map +1 -1
- package/dist/CustomTimeSelect.d.ts.map +1 -1
- package/dist/CustomTimeSelect.js +2 -5
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DraggableItemList.css +14 -14
- package/dist/DraggableItemList.css.map +1 -1
- package/dist/ErrorBoundary.d.ts +26 -0
- package/dist/ErrorBoundary.d.ts.map +1 -0
- package/dist/ErrorBoundary.js +55 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/HierarchicalCheckboxMenu.css +20 -6
- package/dist/HierarchicalCheckboxMenu.css.map +1 -1
- package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js +2 -4
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.css +1 -1
- package/dist/ItemList.css.map +1 -1
- package/dist/ItemListItem.css +7 -7
- package/dist/ItemListItem.css.map +1 -1
- package/dist/LoadingOverlay.css +1 -1
- package/dist/LoadingOverlay.css.map +1 -1
- package/dist/LoadingSpinner.css +2 -8
- package/dist/LoadingSpinner.css.map +1 -1
- package/dist/MaskedInput.css.map +1 -1
- package/dist/RandomAreaPlotAnimation.d.ts +1 -1
- package/dist/RandomAreaPlotAnimation.d.ts.map +1 -1
- package/dist/RandomAreaPlotAnimation.js +43 -14
- package/dist/RandomAreaPlotAnimation.js.map +1 -1
- package/dist/SearchInput.css +28 -12
- package/dist/SearchInput.css.map +1 -1
- package/dist/SearchInput.d.ts +10 -1
- package/dist/SearchInput.d.ts.map +1 -1
- package/dist/SearchInput.js +73 -7
- package/dist/SearchInput.js.map +1 -1
- package/dist/SelectValueList.css +3 -3
- package/dist/SelectValueList.css.map +1 -1
- package/dist/SocketedButton.css +33 -33
- package/dist/SocketedButton.css.map +1 -1
- package/dist/ThemeExport.module.css +33 -33
- package/dist/ThemeExport.module.css.map +1 -1
- package/dist/TimeSlider.css +10 -10
- package/dist/TimeSlider.css.map +1 -1
- package/dist/TimeSlider.module.css +10 -10
- package/dist/TimeSlider.module.css.map +1 -1
- package/dist/ToastNotification.css +4 -4
- package/dist/ToastNotification.css.map +1 -1
- package/dist/UISwitch.css +19 -19
- package/dist/UISwitch.css.map +1 -1
- package/dist/ValidateLabelInput.css +1 -1
- package/dist/ValidateLabelInput.css.map +1 -1
- package/dist/context-actions/ContextActions.css +19 -19
- package/dist/context-actions/ContextActions.css.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.css +2 -2
- package/dist/menu-actions/DropdownMenu.css.map +1 -1
- package/dist/navigation/MenuItem.css +9 -9
- package/dist/navigation/MenuItem.css.map +1 -1
- package/dist/navigation/Page.css.map +1 -1
- package/dist/navigation/Stack.css +2 -2
- package/dist/navigation/Stack.css.map +1 -1
- package/dist/popper/Popper.css +4 -4
- package/dist/popper/Popper.css.map +1 -1
- package/dist/shortcuts/GlobalShortcuts.d.ts +2 -0
- package/dist/shortcuts/GlobalShortcuts.d.ts.map +1 -1
- package/dist/shortcuts/GlobalShortcuts.js +14 -0
- package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
- package/dist/theme/SpectrumThemeProvider.d.ts.map +1 -1
- package/dist/theme/SpectrumThemeProvider.js +1 -0
- package/dist/theme/SpectrumThemeProvider.js.map +1 -1
- package/dist/theme/ThemeModel.d.ts +12 -6
- package/dist/theme/ThemeModel.d.ts.map +1 -1
- package/dist/theme/ThemeModel.js +67 -3
- package/dist/theme/ThemeModel.js.map +1 -1
- package/dist/theme/ThemePicker.d.ts +4 -0
- package/dist/theme/ThemePicker.d.ts.map +1 -0
- package/dist/theme/ThemePicker.js +25 -0
- package/dist/theme/ThemePicker.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +3 -1
- package/dist/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/theme/ThemeProvider.js +23 -13
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/ThemeUtils.d.ts +42 -8
- package/dist/theme/ThemeUtils.d.ts.map +1 -1
- package/dist/theme/ThemeUtils.js +97 -36
- package/dist/theme/ThemeUtils.js.map +1 -1
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/theme-dark/theme-dark-components.css +1 -1
- package/dist/theme/theme-dark/theme-dark-components.css.map +1 -1
- package/dist/theme/theme-dark/theme-dark-palette.css +1 -1
- package/dist/theme/theme-dark/theme-dark-palette.css.map +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic-chart.css +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic-chart.css.map +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic-editor.css +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic-editor.css.map +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic-grid.css +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic-grid.css.map +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic.css +1 -1
- package/dist/theme/theme-dark/theme-dark-semantic.css.map +1 -1
- package/dist/theme/theme-light/theme-light-palette.css +1 -1
- package/dist/theme/theme-light/theme-light-palette.css.map +1 -1
- package/dist/theme/theme-spectrum/index.d.ts +1 -0
- package/dist/theme/theme-spectrum/index.d.ts.map +1 -1
- package/dist/theme/theme-spectrum/index.js +3 -3
- package/dist/theme/theme-spectrum/index.js.map +1 -1
- package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css +1 -1
- package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css.map +1 -1
- package/dist/theme/theme-spectrum/theme-spectrum-overrides.css +1 -0
- package/dist/theme/theme-spectrum/theme-spectrum-overrides.css.map +1 -0
- package/dist/theme/theme-svg.css +1 -0
- package/dist/theme/theme-svg.css.map +1 -0
- package/package.json +7 -7
- package/scss/BaseStyleSheet.scss +169 -82
- package/scss/bootstrap_imports.scss +49 -0
- package/scss/bootstrap_override_functions.scss +31 -0
- package/scss/bootstrap_override_mixins_background_variant.scss +16 -0
- package/scss/bootstrap_override_mixins_buttons.scss +123 -0
- package/scss/bootstrap_override_mixins_forms.scss +231 -0
- package/scss/bootstrap_override_mixins_text_emphasis.scss +21 -0
- package/scss/bootstrap_overrides.scss +144 -101
- package/scss/new_variables.scss +18 -0
- package/scss/util.scss +27 -0
- package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css +0 -1
- package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css.map +0 -1
|
@@ -1,31 +1,44 @@
|
|
|
1
1
|
/* eslint-disable react-hooks/exhaustive-deps */
|
|
2
2
|
/* eslint-disable react/display-name */
|
|
3
3
|
|
|
4
|
-
import React, { useEffect, useState, useRef } from 'react';
|
|
4
|
+
import React, { useEffect, useState, useRef, useMemo } from 'react';
|
|
5
5
|
import debounce from 'lodash.debounce';
|
|
6
6
|
import { assertNotNull } from '@deephaven/utils';
|
|
7
7
|
import "./RandomAreaPlotAnimation.css";
|
|
8
|
-
import
|
|
8
|
+
import { resolveCssVariablesInRecord, useTheme } from "./theme/index.js";
|
|
9
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
10
|
var VOLATILITY = 0.025; // how spikey the data gets
|
|
11
11
|
var LOW = 0.9;
|
|
12
12
|
var HIGH = 0.1;
|
|
13
13
|
var START_Y = 0.618;
|
|
14
|
-
var FOREGROUND = ThemeExport['primary-dark'];
|
|
15
14
|
var GRID_SIZE = 80;
|
|
16
|
-
var GRID_COLOR = ThemeExport['gray-800'];
|
|
17
|
-
var BACKGROUND = ThemeExport['gray-900'];
|
|
18
15
|
var PATTERN = {
|
|
19
16
|
SIZE: 8,
|
|
20
|
-
DOT_SIZE: 2
|
|
21
|
-
FILL_OPACITY: 0.25
|
|
17
|
+
DOT_SIZE: 2
|
|
22
18
|
};
|
|
23
19
|
var PX_PER_SECOND = 18;
|
|
24
20
|
var RESIZE_DEBOUNCE = 250;
|
|
25
21
|
var INTERACTION_TIMEOUT = 60 * 1000;
|
|
22
|
+
var THEME_COLOR_VARIABLES = {
|
|
23
|
+
background: 'var(--dh-color-random-area-plot-animation-bg)',
|
|
24
|
+
foregroundFill: 'var(--dh-color-random-area-plot-animation-fg-fill)',
|
|
25
|
+
foregroundStroke: 'var(--dh-color-random-area-plot-animation-fg-stroke)',
|
|
26
|
+
gridColor: 'var(--dh-color-random-area-plot-animation-grid)'
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Resolve theme colors needed for our animation.
|
|
31
|
+
*/
|
|
32
|
+
function getRandomAreaPlotAnimationThemeColors() {
|
|
33
|
+
return resolveCssVariablesInRecord(THEME_COLOR_VARIABLES);
|
|
34
|
+
}
|
|
26
35
|
|
|
27
36
|
// Draw a background canvas, paint it with a fun chart looking animation
|
|
28
37
|
var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
38
|
+
var {
|
|
39
|
+
activeThemes
|
|
40
|
+
} = useTheme();
|
|
41
|
+
var themeColors = useMemo(() => activeThemes == null ? null : getRandomAreaPlotAnimationThemeColors(), [activeThemes]);
|
|
29
42
|
var canvas = useRef(null);
|
|
30
43
|
var container = useRef(null);
|
|
31
44
|
var [shade, setShade] = useState(false);
|
|
@@ -55,6 +68,14 @@ var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
|
55
68
|
|
|
56
69
|
// Returns the background fill create offscreen as pattern
|
|
57
70
|
function createPatternFill() {
|
|
71
|
+
if (themeColors == null) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
var {
|
|
75
|
+
foregroundFill,
|
|
76
|
+
foregroundStroke
|
|
77
|
+
} = themeColors;
|
|
78
|
+
|
|
58
79
|
// create the off-screen canvas
|
|
59
80
|
var canvasPattern = document.createElement('canvas');
|
|
60
81
|
canvasPattern.width = PATTERN.SIZE;
|
|
@@ -63,11 +84,11 @@ var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
|
63
84
|
|
|
64
85
|
// draw pattern to off-screen context
|
|
65
86
|
if (contextPattern != null) {
|
|
66
|
-
contextPattern.fillStyle =
|
|
87
|
+
contextPattern.fillStyle = foregroundStroke;
|
|
67
88
|
contextPattern.fillRect(0, 0, PATTERN.DOT_SIZE, PATTERN.DOT_SIZE);
|
|
68
89
|
|
|
69
90
|
// add an overlay fill
|
|
70
|
-
contextPattern.fillStyle =
|
|
91
|
+
contextPattern.fillStyle = foregroundFill;
|
|
71
92
|
contextPattern.fillRect(0, 0, PATTERN.SIZE, PATTERN.SIZE);
|
|
72
93
|
}
|
|
73
94
|
return contextPattern === null || contextPattern === void 0 ? void 0 : contextPattern.createPattern(canvasPattern, 'repeat');
|
|
@@ -146,14 +167,22 @@ var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
|
146
167
|
*/
|
|
147
168
|
function drawCanvas(timestamp) {
|
|
148
169
|
var _lastTimestamp, _lastTimestamp2, _lastTimestamp3;
|
|
170
|
+
if (themeColors == null) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
149
173
|
lastTimestamp = (_lastTimestamp = lastTimestamp) !== null && _lastTimestamp !== void 0 ? _lastTimestamp : timestamp;
|
|
174
|
+
var {
|
|
175
|
+
background,
|
|
176
|
+
foregroundStroke,
|
|
177
|
+
gridColor
|
|
178
|
+
} = themeColors;
|
|
150
179
|
assertNotNull(ctx);
|
|
151
180
|
// clear the canvas
|
|
152
|
-
ctx.fillStyle =
|
|
181
|
+
ctx.fillStyle = background;
|
|
153
182
|
ctx.fillRect(0, 0, width, height);
|
|
154
183
|
drawGridLines(ctx);
|
|
155
184
|
ctx.lineWidth = 1;
|
|
156
|
-
ctx.strokeStyle =
|
|
185
|
+
ctx.strokeStyle = gridColor;
|
|
157
186
|
ctx.stroke();
|
|
158
187
|
|
|
159
188
|
// for speeds less then 60 px per second, subpixel motion is required to look smooth
|
|
@@ -161,7 +190,7 @@ var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
|
161
190
|
ctx.translate(subPixelMotion, 0);
|
|
162
191
|
drawAreaLine(data, ctx);
|
|
163
192
|
ctx.lineWidth = 2;
|
|
164
|
-
ctx.strokeStyle =
|
|
193
|
+
ctx.strokeStyle = foregroundStroke;
|
|
165
194
|
ctx.stroke();
|
|
166
195
|
ctx.translate(-subPixelMotion, 0); // we don't pattern to shift however
|
|
167
196
|
if (pattern != null) {
|
|
@@ -278,8 +307,8 @@ var RandomAreaPlotAnimation = /*#__PURE__*/React.memo(() => {
|
|
|
278
307
|
resetIdleTimeout.cancel();
|
|
279
308
|
debouncedHandleResize.cancel();
|
|
280
309
|
};
|
|
281
|
-
}, []);
|
|
282
|
-
return /*#__PURE__*/_jsx("div", {
|
|
310
|
+
}, [themeColors]);
|
|
311
|
+
return themeColors && /*#__PURE__*/_jsx("div", {
|
|
283
312
|
className: "random-area-plot-animation-container",
|
|
284
313
|
ref: container,
|
|
285
314
|
children: /*#__PURE__*/_jsx("canvas", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RandomAreaPlotAnimation.js","names":["React","useEffect","useState","useRef","debounce","assertNotNull","ThemeExport","jsx","_jsx","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","_ctx","current","offsetWidth","offsetHeight","style","concat","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","_lastTimestamp","_lastTimestamp2","_lastTimestamp3","lineWidth","strokeStyle","stroke","subPixelMotion","translate","fill","setTransform","_lastTimestamp4","numberOfPoints","floor","shift","cancelAnimationFrame","requestAnimationFrame","debouncedHandleResize","leading","pauseAnimation","resetIdleTimeout","startAnimation","handleActivity","hasFocus","handleResize","_canvas$current","alpha","addEventListener","removeEventListener","cancel","className","ref","children"],"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(): void {\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(): CanvasPattern | null | undefined {\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(): number[] {\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(): void {\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(\n path: number[],\n context: CanvasRenderingContext2D\n ): void {\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): void {\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): void {\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(): void {\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(): void {\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(): void {\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(): void {\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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"}
|
|
1
|
+
{"version":3,"file":"RandomAreaPlotAnimation.js","names":["React","useEffect","useState","useRef","useMemo","debounce","assertNotNull","resolveCssVariablesInRecord","useTheme","jsx","_jsx","VOLATILITY","LOW","HIGH","START_Y","GRID_SIZE","PATTERN","SIZE","DOT_SIZE","PX_PER_SECOND","RESIZE_DEBOUNCE","INTERACTION_TIMEOUT","THEME_COLOR_VARIABLES","background","foregroundFill","foregroundStroke","gridColor","getRandomAreaPlotAnimationThemeColors","RandomAreaPlotAnimation","memo","activeThemes","themeColors","canvas","container","shade","setShade","scale","window","devicePixelRatio","ctx","pattern","width","height","rAF","lastTimestamp","data","setCanvasSize","_ctx","current","offsetWidth","offsetHeight","style","concat","createPatternFill","canvasPattern","document","createElement","contextPattern","getContext","fillStyle","fillRect","createPattern","randomWalk","prev","rand","Math","random","change","abs","initData","startingData","y","x","push","setDataSize","length","pop","drawAreaLine","path","context","beginPath","moveTo","lineTo","i","closePath","drawGridLines","drawCanvas","timestamp","_lastTimestamp","_lastTimestamp2","_lastTimestamp3","lineWidth","strokeStyle","stroke","subPixelMotion","translate","fill","setTransform","_lastTimestamp4","numberOfPoints","floor","shift","cancelAnimationFrame","requestAnimationFrame","debouncedHandleResize","leading","pauseAnimation","resetIdleTimeout","startAnimation","handleActivity","hasFocus","handleResize","_canvas$current","alpha","addEventListener","removeEventListener","cancel","className","ref","children"],"sources":["../src/RandomAreaPlotAnimation.tsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable react/display-name */\n\nimport React, { useEffect, useState, useRef, useMemo } from 'react';\nimport debounce from 'lodash.debounce';\nimport { assertNotNull } from '@deephaven/utils';\nimport './RandomAreaPlotAnimation.scss';\nimport { resolveCssVariablesInRecord, useTheme } from './theme';\n\nconst VOLATILITY = 0.025; // how spikey the data gets\nconst LOW = 0.9;\nconst HIGH = 0.1;\nconst START_Y = 0.618;\nconst GRID_SIZE = 80;\nconst PATTERN = { SIZE: 8, DOT_SIZE: 2 };\nconst PX_PER_SECOND = 18;\nconst RESIZE_DEBOUNCE = 250;\nconst INTERACTION_TIMEOUT = 60 * 1000;\n\ninterface ThemeColors {\n background: string;\n foregroundFill: string;\n foregroundStroke: string;\n gridColor: string;\n}\n\nconst THEME_COLOR_VARIABLES = {\n background: 'var(--dh-color-random-area-plot-animation-bg)',\n foregroundFill: 'var(--dh-color-random-area-plot-animation-fg-fill)',\n foregroundStroke: 'var(--dh-color-random-area-plot-animation-fg-stroke)',\n gridColor: 'var(--dh-color-random-area-plot-animation-grid)',\n} satisfies ThemeColors;\n\n/**\n * Resolve theme colors needed for our animation.\n */\nfunction getRandomAreaPlotAnimationThemeColors(): ThemeColors {\n return resolveCssVariablesInRecord(THEME_COLOR_VARIABLES);\n}\n\n// Draw a background canvas, paint it with a fun chart looking animation\nconst RandomAreaPlotAnimation = React.memo(() => {\n const { activeThemes } = useTheme();\n\n const themeColors = useMemo(\n () =>\n activeThemes == null ? null : getRandomAreaPlotAnimationThemeColors(),\n [activeThemes]\n );\n\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(): void {\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(): CanvasPattern | null | undefined {\n if (themeColors == null) {\n return null;\n }\n\n const { foregroundFill, foregroundStroke } = themeColors;\n\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 = foregroundStroke;\n contextPattern.fillRect(0, 0, PATTERN.DOT_SIZE, PATTERN.DOT_SIZE);\n\n // add an overlay fill\n contextPattern.fillStyle = foregroundFill;\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(): number[] {\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(): void {\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(\n path: number[],\n context: CanvasRenderingContext2D\n ): void {\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): void {\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): void {\n if (themeColors == null) {\n return;\n }\n\n lastTimestamp = lastTimestamp ?? timestamp;\n\n const { background, foregroundStroke, gridColor } = themeColors;\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 = gridColor;\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 = foregroundStroke;\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(): void {\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(): void {\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(): void {\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(): void {\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 }, [themeColors]);\n\n return (\n themeColors && (\n <div className=\"random-area-plot-animation-container\" ref={container}>\n <canvas ref={canvas} className={shade ? 'shade' : ''} />\n </div>\n )\n );\n});\n\nexport default RandomAreaPlotAnimation;\n"],"mappings":"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"}
|
package/dist/SearchInput.css
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
padding-right: 1.75rem;
|
|
7
7
|
}
|
|
8
8
|
.search-group .search-icon {
|
|
9
|
+
color: var(--dh-color-search-icon);
|
|
9
10
|
pointer-events: none;
|
|
10
11
|
position: absolute;
|
|
11
12
|
right: 0.5rem;
|
|
@@ -16,28 +17,43 @@
|
|
|
16
17
|
align-items: center;
|
|
17
18
|
}
|
|
18
19
|
.search-group ::-webkit-search-cancel-button {
|
|
20
|
+
background-size: 16px;
|
|
21
|
+
background-color: var(--dh-color-fg);
|
|
22
|
+
mask-image: var(--dh-svg-icon-search-cancel);
|
|
23
|
+
mask-position: center center;
|
|
24
|
+
mask-repeat: no-repeat;
|
|
25
|
+
mask-size: 16px;
|
|
19
26
|
-webkit-appearance: none;
|
|
20
27
|
height: 16px;
|
|
21
28
|
width: 16px;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
transition: background-image 0.15s;
|
|
29
|
+
opacity: 0.4;
|
|
30
|
+
transition: opacity 300ms ease;
|
|
25
31
|
}
|
|
26
32
|
.search-group ::-webkit-search-cancel-button:hover {
|
|
27
|
-
|
|
33
|
+
opacity: 1;
|
|
28
34
|
}
|
|
29
|
-
.search-group .search-
|
|
30
|
-
pointer-events: none;
|
|
35
|
+
.search-group .search-change-selection {
|
|
31
36
|
position: absolute;
|
|
32
|
-
right:
|
|
37
|
+
right: 0.25rem;
|
|
33
38
|
top: 15%;
|
|
34
39
|
bottom: 15%;
|
|
35
40
|
height: 70%;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
border
|
|
40
|
-
|
|
41
|
+
}
|
|
42
|
+
.search-group .search-change-button {
|
|
43
|
+
background: none;
|
|
44
|
+
border: none;
|
|
45
|
+
padding: 1px 2px;
|
|
46
|
+
}
|
|
47
|
+
.search-group .search-change-text {
|
|
48
|
+
background-color: hsla(var(--dh-color-white-hsl), 0.2);
|
|
49
|
+
border-radius: 10px;
|
|
50
|
+
padding: 1px 5px;
|
|
51
|
+
}
|
|
52
|
+
.search-group .search-match {
|
|
53
|
+
background-color: hsla(var(--dh-color-white-hsl), 0.2);
|
|
54
|
+
border-radius: 10px;
|
|
55
|
+
padding: 1px 5px;
|
|
56
|
+
margin: 0 5px;
|
|
41
57
|
}
|
|
42
58
|
|
|
43
59
|
/*# sourceMappingURL=SearchInput.css.map */
|
package/dist/SearchInput.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../scss/custom.scss","../src/SearchInput.scss","../scss/new_variables.scss"],"names":[],"mappings":"AAAA;
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../scss/custom.scss","../src/SearchInput.scss","../scss/new_variables.scss","../scss/util.scss"],"names":[],"mappings":"AAAA;ACGA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA,OCTO;EDUP;EACA;EACA;EACA;EACA;;AAGF;EEpBA,iBFqBc;EEpBd;EACA,YFoB2B;EEnB3B;EACA;EACA,WFgBc;EAIZ;EACA,QALY;EAMZ,OANY;EAOZ;EACA;;AACA;EACE;;AAIJ;EACE;EACA,OCnCO;EDoCP;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;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@import '../scss/util.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 color: var(--dh-color-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 $icon-size: 16px;\n @include icon-image-mask(var(--dh-svg-icon-search-cancel), $icon-size);\n\n // Need to specify -webkit-appearance: none for Chrome\n -webkit-appearance: none;\n height: $icon-size;\n width: $icon-size;\n opacity: 0.4;\n transition: opacity 300ms ease;\n &:hover {\n opacity: 1;\n }\n }\n\n .search-change-selection {\n position: absolute;\n right: $spacer-1;\n top: 15%;\n bottom: 15%;\n height: 70%;\n }\n\n .search-change-button {\n background: none;\n border: none;\n padding: 1px 2px;\n }\n\n .search-change-text {\n background-color: hsla(var(--dh-color-white-hsl), 0.2);\n border-radius: 10px;\n padding: 1px 5px;\n }\n\n .search-match {\n background-color: hsla(var(--dh-color-white-hsl), 0.2);\n border-radius: 10px;\n padding: 1px 5px;\n margin: 0 5px;\n }\n}\n","@use 'sass:math';\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:\n $ant-size $ant-thickness,\n $ant-size $ant-thickness,\n $ant-thickness $ant-size,\n $ant-thickness $ant-size;\n background-position:\n 0 top,\n 0 bottom,\n left 0,\n 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@function hsla-opacity($semantic-name, $i: 100) {\n @return hsla(var(--dh-color-#{$semantic-name}-hsl), math.div($i, 100));\n}\n\n@function accent-opacity($i: 100) {\n @return hsla-opacity('accent', $i);\n}\n\n@function background-opacity($i: 100) {\n @return hsla-opacity('bg', $i);\n}\n\n@function foreground-opacity($i: 100) {\n @return hsla-opacity('fg', $i);\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","// Setup a mask-image for an inline svg\n@mixin icon-image-mask($mask-image, $size: 16px) {\n background-size: $size;\n background-color: var(--dh-color-fg);\n mask-image: $mask-image;\n mask-position: center center;\n mask-repeat: no-repeat;\n mask-size: $size;\n}\n\n// Caret icon for pickers, dropdowns, select, etc.\n@mixin caret-icon() {\n $width: 10px;\n $height: 6px;\n @include icon-image-mask(var(--dh-svg-icon-selector-caret), $width $height);\n\n background-color: var(--dh-color-selector-fg);\n width: $width;\n height: $height;\n}\n\n/// Utilty for increasing specificity by repeating a given selector n number of\n/// times.\n///\n/// It should work for selectors that can be concatenated without delimiters\n/// such as '.some-selector.some-selector', '#some-id#some-id', or '&&'. A\n/// case where it would not work would be with an element selector e.g. 'divdiv'.\n///\n/// Example usage:\n///\n/// #{multiply-specificity-n('.some-selector', 2)} {\n/// }\n///\n/// would produce\n///\n/// .some-selector.some-selector {\n/// }\n///\n/// @param {string} $selector the selector to duplicate\n/// @param {number} $n number of times to duplicate\n/// @return {string} duplicated selector\n@function multiply-specificity-n($selector, $n) {\n $result: $selector;\n @for $i from 2 through $n {\n $result: selector-append($result, $selector);\n }\n\n @return $result;\n}\n\n// Linear gradient with same start and end color. Useful for certain scenarios\n// where we need a solid background image layer.\n@function solid-gradient($color) {\n @return linear-gradient(0deg, $color, $color);\n}\n"]}
|
package/dist/SearchInput.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ interface SearchInputProps {
|
|
|
11
11
|
matchCount: number;
|
|
12
12
|
id: string;
|
|
13
13
|
'data-testid'?: string;
|
|
14
|
+
cursor?: {
|
|
15
|
+
index: number | undefined;
|
|
16
|
+
next: (direction: 'forward' | 'back') => void;
|
|
17
|
+
};
|
|
14
18
|
}
|
|
15
19
|
declare class SearchInput extends PureComponent<SearchInputProps> {
|
|
16
20
|
static defaultProps: {
|
|
@@ -20,10 +24,15 @@ declare class SearchInput extends PureComponent<SearchInputProps> {
|
|
|
20
24
|
onKeyDown(): void;
|
|
21
25
|
id: string;
|
|
22
26
|
'data-testid': undefined;
|
|
27
|
+
cursor: undefined;
|
|
23
28
|
};
|
|
24
29
|
constructor(props: SearchInputProps);
|
|
25
|
-
|
|
30
|
+
componentDidMount(): void;
|
|
31
|
+
componentDidUpdate(): void;
|
|
26
32
|
focus(): void;
|
|
33
|
+
inputField: React.RefObject<HTMLInputElement>;
|
|
34
|
+
searchChangeSelection: React.RefObject<HTMLDivElement>;
|
|
35
|
+
setInputPaddingRight(): void;
|
|
27
36
|
render(): JSX.Element;
|
|
28
37
|
}
|
|
29
38
|
export default SearchInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../src/SearchInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../src/SearchInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK7C,OAAO,oBAAoB,CAAC;AAI5B,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACnD,QAAQ,EAAE,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACrD,SAAS,EAAE,KAAK,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC;KAC/C,CAAC;CACH;AAED,cAAM,WAAY,SAAQ,aAAa,CAAC,gBAAgB,CAAC;IACvD,MAAM,CAAC,YAAY;;;;qBAIJ,IAAI;;;;MAMjB;gBAEU,KAAK,EAAE,gBAAgB;IAMnC,iBAAiB,IAAI,IAAI;IAIzB,kBAAkB,IAAI,IAAI;IAI1B,KAAK,IAAI,IAAI;IAIb,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE9C,qBAAqB,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAEvD,oBAAoB,IAAI,IAAI;IAS5B,MAAM,IAAI,GAAG,CAAC,OAAO;CAgGtB;AAED,eAAe,WAAW,CAAC"}
|
package/dist/SearchInput.js
CHANGED
|
@@ -3,21 +3,41 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typ
|
|
|
3
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
4
|
import React, { PureComponent } from 'react';
|
|
5
5
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
6
|
-
import { vsSearch } from '@deephaven/icons';
|
|
6
|
+
import { vsArrowLeft, vsArrowRight, vsSearch } from '@deephaven/icons';
|
|
7
7
|
import classNames from 'classnames';
|
|
8
|
+
import Button from "./Button.js";
|
|
8
9
|
import "./SearchInput.css";
|
|
10
|
+
import { GLOBAL_SHORTCUTS } from "./shortcuts/index.js";
|
|
11
|
+
import { ContextActions } from "./context-actions/index.js";
|
|
9
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
13
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
11
15
|
class SearchInput extends PureComponent {
|
|
12
16
|
constructor(props) {
|
|
13
17
|
super(props);
|
|
14
18
|
_defineProperty(this, "inputField", void 0);
|
|
19
|
+
_defineProperty(this, "searchChangeSelection", void 0);
|
|
15
20
|
this.inputField = /*#__PURE__*/React.createRef();
|
|
21
|
+
this.searchChangeSelection = /*#__PURE__*/React.createRef();
|
|
22
|
+
}
|
|
23
|
+
componentDidMount() {
|
|
24
|
+
this.setInputPaddingRight();
|
|
25
|
+
}
|
|
26
|
+
componentDidUpdate() {
|
|
27
|
+
this.setInputPaddingRight();
|
|
16
28
|
}
|
|
17
29
|
focus() {
|
|
18
30
|
var _this$inputField$curr;
|
|
19
31
|
(_this$inputField$curr = this.inputField.current) === null || _this$inputField$curr === void 0 ? void 0 : _this$inputField$curr.focus();
|
|
20
32
|
}
|
|
33
|
+
setInputPaddingRight() {
|
|
34
|
+
var inputField = this.inputField.current;
|
|
35
|
+
var searchChangeSelection = this.searchChangeSelection.current;
|
|
36
|
+
if (inputField && searchChangeSelection) {
|
|
37
|
+
var paddingRight = searchChangeSelection.getBoundingClientRect().width;
|
|
38
|
+
inputField.style.paddingRight = "".concat(paddingRight, "px");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
21
41
|
render() {
|
|
22
42
|
var {
|
|
23
43
|
value,
|
|
@@ -29,8 +49,48 @@ class SearchInput extends PureComponent {
|
|
|
29
49
|
matchCount,
|
|
30
50
|
id,
|
|
31
51
|
onKeyDown,
|
|
32
|
-
'data-testid': dataTestId
|
|
52
|
+
'data-testid': dataTestId,
|
|
53
|
+
cursor
|
|
33
54
|
} = this.props;
|
|
55
|
+
var matchCountSection;
|
|
56
|
+
var contextActions = [{
|
|
57
|
+
action: () => cursor === null || cursor === void 0 ? void 0 : cursor.next('forward'),
|
|
58
|
+
shortcut: GLOBAL_SHORTCUTS.NEXT
|
|
59
|
+
}, {
|
|
60
|
+
action: () => cursor === null || cursor === void 0 ? void 0 : cursor.next('back'),
|
|
61
|
+
shortcut: GLOBAL_SHORTCUTS.PREVIOUS
|
|
62
|
+
}];
|
|
63
|
+
if (cursor && matchCount > 1) {
|
|
64
|
+
matchCountSection = /*#__PURE__*/_jsxs(_Fragment, {
|
|
65
|
+
children: [/*#__PURE__*/_jsx(Button, {
|
|
66
|
+
kind: "ghost",
|
|
67
|
+
className: "search-change-button",
|
|
68
|
+
type: "button",
|
|
69
|
+
onClick: () => {
|
|
70
|
+
cursor.next('back');
|
|
71
|
+
},
|
|
72
|
+
icon: vsArrowLeft,
|
|
73
|
+
tooltip: "Previous match (".concat(GLOBAL_SHORTCUTS.PREVIOUS.getDisplayText(), ")")
|
|
74
|
+
}), /*#__PURE__*/_jsxs("span", {
|
|
75
|
+
className: "search-change-text",
|
|
76
|
+
children: [cursor.index !== undefined && "".concat(cursor.index + 1, " of "), matchCount]
|
|
77
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
78
|
+
kind: "ghost",
|
|
79
|
+
className: "search-change-button",
|
|
80
|
+
type: "button",
|
|
81
|
+
onClick: () => {
|
|
82
|
+
cursor.next('forward');
|
|
83
|
+
},
|
|
84
|
+
icon: vsArrowRight,
|
|
85
|
+
tooltip: "Next match (".concat(GLOBAL_SHORTCUTS.NEXT.getDisplayText(), ")")
|
|
86
|
+
})]
|
|
87
|
+
});
|
|
88
|
+
} else {
|
|
89
|
+
matchCountSection = matchCount > 0 && /*#__PURE__*/_jsx("span", {
|
|
90
|
+
className: "search-match",
|
|
91
|
+
children: matchCount
|
|
92
|
+
});
|
|
93
|
+
}
|
|
34
94
|
return /*#__PURE__*/_jsxs("div", {
|
|
35
95
|
className: classNames('search-group', className),
|
|
36
96
|
children: [/*#__PURE__*/_jsx("input", {
|
|
@@ -45,10 +105,15 @@ class SearchInput extends PureComponent {
|
|
|
45
105
|
ref: this.inputField,
|
|
46
106
|
id: id,
|
|
47
107
|
"data-testid": dataTestId
|
|
48
|
-
}), matchCount != null
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
108
|
+
}), matchCount != null ? /*#__PURE__*/_jsxs(_Fragment, {
|
|
109
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
110
|
+
className: "search-change-selection",
|
|
111
|
+
ref: this.searchChangeSelection,
|
|
112
|
+
children: matchCountSection
|
|
113
|
+
}), /*#__PURE__*/_jsx(ContextActions, {
|
|
114
|
+
actions: contextActions
|
|
115
|
+
})]
|
|
116
|
+
}) : /*#__PURE__*/_jsx("span", {
|
|
52
117
|
className: "search-icon",
|
|
53
118
|
children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
54
119
|
icon: vsSearch
|
|
@@ -65,7 +130,8 @@ _defineProperty(SearchInput, "defaultProps", {
|
|
|
65
130
|
// no-op
|
|
66
131
|
},
|
|
67
132
|
id: '',
|
|
68
|
-
'data-testid': undefined
|
|
133
|
+
'data-testid': undefined,
|
|
134
|
+
cursor: undefined
|
|
69
135
|
});
|
|
70
136
|
export default SearchInput;
|
|
71
137
|
//# sourceMappingURL=SearchInput.js.map
|
package/dist/SearchInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchInput.js","names":["React","PureComponent","FontAwesomeIcon","vsSearch","classNames","jsx","_jsx","jsxs","_jsxs","SearchInput","constructor","props","_defineProperty","inputField","createRef","focus","_this$inputField$curr","current","render","value","placeholder","onBlur","onChange","className","disabled","matchCount","id","onKeyDown","dataTestId","children","type","
|
|
1
|
+
{"version":3,"file":"SearchInput.js","names":["React","PureComponent","FontAwesomeIcon","vsArrowLeft","vsArrowRight","vsSearch","classNames","Button","GLOBAL_SHORTCUTS","ContextActions","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SearchInput","constructor","props","_defineProperty","inputField","createRef","searchChangeSelection","componentDidMount","setInputPaddingRight","componentDidUpdate","focus","_this$inputField$curr","current","paddingRight","getBoundingClientRect","width","style","concat","render","value","placeholder","onBlur","onChange","className","disabled","matchCount","id","onKeyDown","dataTestId","cursor","matchCountSection","contextActions","action","next","shortcut","NEXT","PREVIOUS","children","kind","type","onClick","icon","tooltip","getDisplayText","index","undefined","ref","actions"],"sources":["../src/SearchInput.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsArrowLeft, vsArrowRight, vsSearch } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Button from './Button';\nimport './SearchInput.scss';\nimport { GLOBAL_SHORTCUTS } from './shortcuts';\nimport { ContextActions } from './context-actions';\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 cursor?: {\n index: number | undefined;\n next: (direction: 'forward' | 'back') => void;\n };\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 cursor: undefined,\n };\n\n constructor(props: SearchInputProps) {\n super(props);\n this.inputField = React.createRef();\n this.searchChangeSelection = React.createRef();\n }\n\n componentDidMount(): void {\n this.setInputPaddingRight();\n }\n\n componentDidUpdate(): void {\n this.setInputPaddingRight();\n }\n\n focus(): void {\n this.inputField.current?.focus();\n }\n\n inputField: React.RefObject<HTMLInputElement>;\n\n searchChangeSelection: React.RefObject<HTMLDivElement>;\n\n setInputPaddingRight(): void {\n const inputField = this.inputField.current;\n const searchChangeSelection = this.searchChangeSelection.current;\n if (inputField && searchChangeSelection) {\n const paddingRight = searchChangeSelection.getBoundingClientRect().width;\n inputField.style.paddingRight = `${paddingRight}px`;\n }\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 cursor,\n } = this.props;\n\n let matchCountSection;\n const contextActions = [\n {\n action: () => cursor?.next('forward'),\n shortcut: GLOBAL_SHORTCUTS.NEXT,\n },\n {\n action: () => cursor?.next('back'),\n shortcut: GLOBAL_SHORTCUTS.PREVIOUS,\n },\n ];\n\n if (cursor && matchCount > 1) {\n matchCountSection = (\n <>\n <Button\n kind=\"ghost\"\n className=\"search-change-button\"\n type=\"button\"\n onClick={() => {\n cursor.next('back');\n }}\n icon={vsArrowLeft}\n tooltip={`Previous match (${GLOBAL_SHORTCUTS.PREVIOUS.getDisplayText()})`}\n />\n <span className=\"search-change-text\">\n {cursor.index !== undefined && `${cursor.index + 1} of `}\n {matchCount}\n </span>\n <Button\n kind=\"ghost\"\n className=\"search-change-button\"\n type=\"button\"\n onClick={() => {\n cursor.next('forward');\n }}\n icon={vsArrowRight}\n tooltip={`Next match (${GLOBAL_SHORTCUTS.NEXT.getDisplayText()})`}\n />\n </>\n );\n } else {\n matchCountSection = matchCount > 0 && (\n <span className=\"search-match\">{matchCount}</span>\n );\n }\n\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\n {matchCount != null ? (\n <>\n <div\n className=\"search-change-selection\"\n ref={this.searchChangeSelection}\n >\n {matchCountSection}\n </div>\n <ContextActions actions={contextActions} />\n </>\n ) : (\n <span className=\"search-icon\">\n <FontAwesomeIcon icon={vsSearch} />\n </span>\n )}\n </div>\n );\n }\n}\n\nexport default SearchInput;\n"],"mappings":"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"}
|
package/dist/SelectValueList.css
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
.select-value-list-scroll-pane {
|
|
3
3
|
overflow-x: hidden;
|
|
4
4
|
overflow-y: auto;
|
|
5
|
-
border: 1px solid
|
|
5
|
+
border: 1px solid var(--dh-color-input-border);
|
|
6
6
|
border-radius: 4px;
|
|
7
7
|
padding: 0.375rem 0 0.375rem;
|
|
8
8
|
}
|
|
9
9
|
.select-value-list-scroll-pane.is-invalid {
|
|
10
|
-
border-color:
|
|
10
|
+
border-color: hsla(var(--dh-color-negative-hsl), 0.85);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
.select-value-list {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
display: flex;
|
|
28
28
|
}
|
|
29
29
|
.select-value-list .select-value-list-content .custom-control:hover {
|
|
30
|
-
background:
|
|
30
|
+
background: var(--dh-color-gray-500);
|
|
31
31
|
}
|
|
32
32
|
.select-value-list .select-value-list-content .custom-control .custom-control-label {
|
|
33
33
|
margin-left: 0.75rem;
|