@deephaven/components 0.58.1-beta.5 → 0.58.1-beta.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,KAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD,CAAC;AAKF,QAAA,MAAM,SAAS,yFAmHd,CAAC;AAaF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,KAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD,CAAC;AAeF,QAAA,MAAM,SAAS,yFAqId,CAAC;AAaF,eAAe,SAAS,CAAC"}
package/dist/TimeInput.js CHANGED
@@ -7,6 +7,14 @@ import { jsx as _jsx } from "react/jsx-runtime";
7
7
  var log = Log.module('TimeInput');
8
8
  var TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';
9
9
  var EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];
10
+ function fixIncompleteValue(value) {
11
+ // If value is not a complete HH:mm:ss time, fill missing parts with 0
12
+ if (value != null) {
13
+ return "".concat(value.substring(0, 8).replace(/\u2007/g, '0')).concat("00:00:00".substring(value.length));
14
+ }
15
+ return value;
16
+ }
17
+
10
18
  // Forward ref causes a false positive for display-name in eslint:
11
19
  // https://github.com/yannickcr/eslint-plugin-react/issues/2269
12
20
  // eslint-disable-next-line react/display-name
@@ -22,6 +30,7 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
22
30
  'data-testid': dataTestId
23
31
  } = props;
24
32
  var [value, setValue] = useState(TimeUtils.formatTime(propsValue));
33
+ var parsedValueRef = useRef(propsValue);
25
34
  var [selection, _setSelection] = useState();
26
35
  var inputRef = useRef(null);
27
36
  useImperativeHandle(ref, () => ({
@@ -36,8 +45,13 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
36
45
  }
37
46
  }), []);
38
47
  useEffect(function setFormattedTime() {
39
- setValue(TimeUtils.formatTime(propsValue));
40
- }, [propsValue]);
48
+ // Ignore value prop update if it matches the displayed value
49
+ // to preserve the displayed value while typing
50
+ if (parsedValueRef.current !== propsValue) {
51
+ setValue(TimeUtils.formatTime(propsValue));
52
+ parsedValueRef.current = propsValue;
53
+ }
54
+ }, [parsedValueRef, propsValue]);
41
55
  function getNextSegmentValue(range, delta, segmentValue) {
42
56
  // Delta is backward because negative Y is up
43
57
  var maxValue = range.selectionStart === 0 ? 24 : 60;
@@ -59,15 +73,21 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
59
73
  }
60
74
  return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(replaceValue, replaceIndex, newChar);
61
75
  }
62
- function handleChange(newValue) {
76
+ var handleChange = useCallback(newValue => {
63
77
  log.debug('handleChange', newValue);
64
78
  setValue(newValue);
65
-
66
- // Only send a change if the value is actually valid
67
- if (TimeUtils.isTimeString(newValue)) {
68
- onChange(TimeUtils.parseTime(newValue));
79
+ parsedValueRef.current = TimeUtils.parseTime(fixIncompleteValue(newValue));
80
+ onChange(parsedValueRef.current);
81
+ }, [onChange]);
82
+ var handleBlur = useCallback(() => {
83
+ var fixedValue = fixIncompleteValue(value);
84
+ // Update the value displayed in the input
85
+ // onChange with the fixed value already triggered in handleChange
86
+ if (fixedValue !== value) {
87
+ setValue(fixedValue);
69
88
  }
70
- }
89
+ onBlur();
90
+ }, [value, onBlur]);
71
91
  var handleSelect = useCallback(newSelection => {
72
92
  _setSelection(newSelection);
73
93
  onSelect(newSelection);
@@ -84,7 +104,7 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
84
104
  selection: selection,
85
105
  value: value,
86
106
  onFocus: onFocus,
87
- onBlur: onBlur,
107
+ onBlur: handleBlur,
88
108
  "data-testid": dataTestId
89
109
  });
90
110
  });
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","jsx","_jsx","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","_inputRef$current","current","newSelection","_inputRef$current2","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","concat","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","example","pattern","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?: (timeInSec: number) => void;\n onSelect?: (selection: SelectionSegment) => void;\n value?: number;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n setValue(TimeUtils.formatTime(propsValue));\n },\n [propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n function handleChange(newValue: string): void {\n log.debug('handleChange', newValue);\n setValue(newValue);\n\n // Only send a change if the value is actually valid\n if (TimeUtils.isTimeString(newValue)) {\n onChange(TimeUtils.parseTime(newValue));\n }\n }\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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"}
1
+ {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","jsx","_jsx","log","module","TIME_PATTERN","EXAMPLES","fixIncompleteValue","value","concat","substring","replace","length","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","parsedValueRef","selection","setSelection","inputRef","focus","_inputRef$current","current","newSelection","_inputRef$current2","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","handleChange","newValue","debug","parseTime","handleBlur","fixedValue","handleSelect","example","pattern","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?: (timeInSec: number) => void;\n onSelect?: (selection: SelectionSegment) => void;\n value?: number;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\nfunction fixIncompleteValue(value: string): string {\n // If value is not a complete HH:mm:ss time, fill missing parts with 0\n if (value != null) {\n return `${value\n .substring(0, 8)\n .replace(/\\u2007/g, '0')}${`00:00:00`.substring(value.length)}`;\n }\n return value;\n}\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const parsedValueRef = useRef<number>(propsValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n // Ignore value prop update if it matches the displayed value\n // to preserve the displayed value while typing\n if (parsedValueRef.current !== propsValue) {\n setValue(TimeUtils.formatTime(propsValue));\n parsedValueRef.current = propsValue;\n }\n },\n [parsedValueRef, propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n parsedValueRef.current = TimeUtils.parseTime(\n fixIncompleteValue(newValue)\n );\n onChange(parsedValueRef.current);\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const fixedValue = fixIncompleteValue(value);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== value) {\n setValue(fixedValue);\n }\n onBlur();\n }, [value, onBlur]);\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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"}
@@ -6,6 +6,27 @@ export type ThemePreloadColorVariable = '--dh-color-accent-contrast' | '--dh-col
6
6
  export type ThemeIconsRequiringManualColorChanges = '--dh-svg-icon-select-indicator' | '--dh-svg-icon-select-indicator-hover' | '--dh-svg-icon-select-indicator-disabled' | '--dh-svg-icon-error';
7
7
  export declare const DEFAULT_DARK_THEME_KEY = "default-dark";
8
8
  export declare const DEFAULT_LIGHT_THEME_KEY = "default-light";
9
+ export declare const DEFAULT_DARK_THEME_PALETTE: {
10
+ readonly blue: {
11
+ readonly 500: "#2f5bc0";
12
+ readonly 400: "#254ba4";
13
+ readonly 600: "#3b6bda";
14
+ };
15
+ readonly red: {
16
+ readonly 600: "#c73f61";
17
+ };
18
+ readonly gray: {
19
+ readonly 50: "#1a171a";
20
+ readonly 75: "#211f22";
21
+ readonly 300: "#373438";
22
+ readonly 400: "#403e41";
23
+ readonly 500: "#5b5a5c";
24
+ readonly 600: "#929192";
25
+ readonly 700: "#c0bfbf";
26
+ readonly 800: "#f0f0ee";
27
+ readonly 900: "#fcfcfa";
28
+ };
29
+ };
9
30
  export declare const DEFAULT_PRELOAD_DATA_VARIABLES: Record<ThemePreloadColorVariable, string>;
10
31
  /**
11
32
  * Some inline SVGs require manually updating their fill color via
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeModel.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeModel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,YAAY,GAAG,WAAW,aAAa,EAAE,CAAC;AACtD,MAAM,MAAM,uBAAuB,GAAG,SAAS,MAAM,EAAE,CAAC;AACxD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEpD,MAAM,MAAM,yBAAyB,GACjC,4BAA4B,GAC5B,sBAAsB,GACtB,4BAA4B,GAC5B,2BAA2B,GAC3B,gCAAgC,GAChC,wBAAwB,GACxB,oCAAoC,GACpC,sCAAsC,GACtC,eAAe,GACf,eAAe,GACf,qBAAqB,GACrB,qBAAqB,GACrB,8BAA8B,GAC9B,yBAAyB,GACzB,8BAA8B,GAC9B,+BAA+B,GAI/B,0BAA0B,GAC1B,iCAAiC,GACjC,0BAA0B,GAC1B,4BAA4B,GAC5B,+CAA+C,GAC/C,iDAAiD,GACjD,0CAA0C,GAC1C,4CAA4C,CAAC;AAEjD,MAAM,MAAM,qCAAqC,GAC7C,gCAAgC,GAChC,sCAAsC,GACtC,yCAAyC,GACzC,qBAAqB,CAAC;AAE1B,eAAO,MAAM,sBAAsB,iBAAwC,CAAC;AAC5E,eAAO,MAAM,uBAAuB,kBAAyC,CAAC;AA2B9E,eAAO,MAAM,8BAA8B,EAAE,MAAM,CACjD,yBAAyB,EACzB,MAAM,CA+BP,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,qCAAqC,EACrC,MAAM,CAMP,CAAC;AAEF,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"ThemeModel.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeModel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,YAAY,GAAG,WAAW,aAAa,EAAE,CAAC;AACtD,MAAM,MAAM,uBAAuB,GAAG,SAAS,MAAM,EAAE,CAAC;AACxD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEpD,MAAM,MAAM,yBAAyB,GACjC,4BAA4B,GAC5B,sBAAsB,GACtB,4BAA4B,GAC5B,2BAA2B,GAC3B,gCAAgC,GAChC,wBAAwB,GACxB,oCAAoC,GACpC,sCAAsC,GACtC,eAAe,GACf,eAAe,GACf,qBAAqB,GACrB,qBAAqB,GACrB,8BAA8B,GAC9B,yBAAyB,GACzB,8BAA8B,GAC9B,+BAA+B,GAI/B,0BAA0B,GAC1B,iCAAiC,GACjC,0BAA0B,GAC1B,4BAA4B,GAC5B,+CAA+C,GAC/C,iDAAiD,GACjD,0CAA0C,GAC1C,4CAA4C,CAAC;AAEjD,MAAM,MAAM,qCAAqC,GAC7C,gCAAgC,GAChC,sCAAsC,GACtC,yCAAyC,GACzC,qBAAqB,CAAC;AAE1B,eAAO,MAAM,sBAAsB,iBAAwC,CAAC;AAC5E,eAAO,MAAM,uBAAuB,kBAAyC,CAAC;AAI9E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;CAoB7B,CAAC;AAGX,eAAO,MAAM,8BAA8B,EAAE,MAAM,CACjD,yBAAyB,EACzB,MAAM,CA+BP,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,qCAAqC,EACrC,MAAM,CAMP,CAAC;AAEF,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB"}
@@ -3,7 +3,7 @@ export var DEFAULT_LIGHT_THEME_KEY = 'default-light';
3
3
 
4
4
  // Hex versions of some of the default dark theme color palette needed for
5
5
  // preload defaults.
6
- var DEFAULT_DARK_THEME_PALETTE = {
6
+ export var DEFAULT_DARK_THEME_PALETTE = {
7
7
  blue: {
8
8
  500: '#2f5bc0',
9
9
  400: '#254ba4',
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeModel.js","names":["DEFAULT_DARK_THEME_KEY","DEFAULT_LIGHT_THEME_KEY","DEFAULT_DARK_THEME_PALETTE","blue","red","gray","DEFAULT_PRELOAD_DATA_VARIABLES","concat","SVG_ICON_MANUAL_COLOR_MAP","THEME_CACHE_LOCAL_STORAGE_KEY"],"sources":["../../src/theme/ThemeModel.ts"],"sourcesContent":["export type BaseThemeType = 'dark' | 'light';\nexport type BaseThemeKey = `default-${BaseThemeType}`;\nexport type CssVariableStyleContent = `:root{${string}`;\nexport type ThemeCssVariableName = `--dh-${string}`;\n\nexport type ThemePreloadColorVariable =\n | '--dh-color-accent-contrast'\n | '--dh-color-accent-bg'\n | '--dh-color-accent-hover-bg'\n | '--dh-color-accent-down-bg'\n | '--dh-color-accent-key-focus-bg'\n | '--dh-color-negative-bg'\n | '--dh-color-loading-spinner-primary'\n | '--dh-color-loading-spinner-secondary'\n | '--dh-color-bg'\n | '--dh-color-fg'\n | '--dh-color-input-bg'\n | '--dh-color-input-fg'\n | '--dh-color-input-disabled-bg'\n | '--dh-color-input-border'\n | '--dh-color-input-placeholder'\n | '--dh-color-input-focus-border'\n // Preloading login specific variables should only be needed in DHE. Including\n // them for now until we have a way for DHE to configure them. To be addressed\n // by #1679\n | '--dh-color-login-form-bg'\n | '--dh-color-login-status-message'\n | '--dh-color-login-logo-bg'\n | '--dh-color-login-footer-fg'\n | '--dh-color-random-area-plot-animation-fg-fill'\n | '--dh-color-random-area-plot-animation-fg-stroke'\n | '--dh-color-random-area-plot-animation-bg'\n | '--dh-color-random-area-plot-animation-grid';\n\nexport type ThemeIconsRequiringManualColorChanges =\n | '--dh-svg-icon-select-indicator'\n | '--dh-svg-icon-select-indicator-hover'\n | '--dh-svg-icon-select-indicator-disabled'\n | '--dh-svg-icon-error';\n\nexport const DEFAULT_DARK_THEME_KEY = 'default-dark' satisfies BaseThemeKey;\nexport const DEFAULT_LIGHT_THEME_KEY = 'default-light' satisfies BaseThemeKey;\n\n// Hex versions of some of the default dark theme color palette needed for\n// preload defaults.\nconst DEFAULT_DARK_THEME_PALETTE = {\n blue: {\n 500: '#2f5bc0',\n 400: '#254ba4',\n 600: '#3b6bda', // accent color\n },\n red: {\n 600: '#c73f61',\n },\n gray: {\n 50: '#1a171a',\n 75: '#211f22',\n 300: '#373438',\n 400: '#403e41',\n 500: '#5b5a5c',\n 600: '#929192',\n 700: '#c0bfbf',\n 800: '#f0f0ee',\n 900: '#fcfcfa',\n },\n} as const;\n\n// Css properties that are used in preload data with default values.\nexport const DEFAULT_PRELOAD_DATA_VARIABLES: Record<\n ThemePreloadColorVariable,\n string\n> = {\n '--dh-color-accent-contrast': DEFAULT_DARK_THEME_PALETTE.gray[900],\n '--dh-color-accent-bg': DEFAULT_DARK_THEME_PALETTE.blue[600],\n '--dh-color-accent-hover-bg': DEFAULT_DARK_THEME_PALETTE.blue[500],\n '--dh-color-accent-down-bg': DEFAULT_DARK_THEME_PALETTE.blue[400],\n '--dh-color-accent-key-focus-bg': DEFAULT_DARK_THEME_PALETTE.blue[500],\n '--dh-color-negative-bg': DEFAULT_DARK_THEME_PALETTE.red[600],\n '--dh-color-loading-spinner-primary': DEFAULT_DARK_THEME_PALETTE.blue[600],\n '--dh-color-loading-spinner-secondary': `${DEFAULT_DARK_THEME_PALETTE.gray[800]}80`, // 50% opacity\n '--dh-color-bg': DEFAULT_DARK_THEME_PALETTE.gray[50],\n '--dh-color-fg': DEFAULT_DARK_THEME_PALETTE.gray[800],\n '--dh-color-input-bg': DEFAULT_DARK_THEME_PALETTE.gray[500],\n '--dh-color-input-fg': DEFAULT_DARK_THEME_PALETTE.gray[800],\n '--dh-color-input-disabled-bg': DEFAULT_DARK_THEME_PALETTE.gray[300],\n '--dh-color-input-border': DEFAULT_DARK_THEME_PALETTE.gray[600],\n '--dh-color-input-placeholder': DEFAULT_DARK_THEME_PALETTE.gray[600],\n '--dh-color-input-focus-border': `${DEFAULT_DARK_THEME_PALETTE.blue[600]}d9`, // 85% opacity\n // Preloading login specific variables should only be needed in DHE. Including\n // them for now until we have a way for DHE to configure them. To be addressed\n // by #1679\n '--dh-color-login-form-bg': DEFAULT_DARK_THEME_PALETTE.gray[400],\n '--dh-color-login-status-message': DEFAULT_DARK_THEME_PALETTE.gray[600],\n '--dh-color-login-logo-bg': DEFAULT_DARK_THEME_PALETTE.gray[900],\n '--dh-color-login-footer-fg': DEFAULT_DARK_THEME_PALETTE.gray[700],\n '--dh-color-random-area-plot-animation-fg-fill': `${DEFAULT_DARK_THEME_PALETTE.blue[600]}14`, // .08 opacity\n '--dh-color-random-area-plot-animation-fg-stroke': `${DEFAULT_DARK_THEME_PALETTE.blue[600]}33`, // .2 opacity\n '--dh-color-random-area-plot-animation-bg':\n DEFAULT_DARK_THEME_PALETTE.gray[75],\n '--dh-color-random-area-plot-animation-grid':\n DEFAULT_DARK_THEME_PALETTE.gray[300],\n};\n\n/**\n * Some inline SVGs require manually updating their fill color via\n * `updateSVGFillColors`. This object maps these variables to their respective\n * fill color variables.\n */\nexport const SVG_ICON_MANUAL_COLOR_MAP: Record<\n ThemeIconsRequiringManualColorChanges,\n string\n> = {\n '--dh-svg-icon-select-indicator': '--dh-color-selector-fg',\n '--dh-svg-icon-select-indicator-hover': '--dh-color-selector-hover-fg',\n '--dh-svg-icon-select-indicator-disabled': '--dh-color-selector-disabled-fg',\n '--dh-svg-icon-error': '--dh-color-form-control-error',\n};\n\nexport const THEME_CACHE_LOCAL_STORAGE_KEY = 'deephaven.themeCache';\n\nexport interface ThemePreloadData {\n themeKey: string;\n preloadStyleContent?: CssVariableStyleContent;\n}\n\nexport interface ThemeData {\n baseThemeKey?: BaseThemeKey;\n themeKey: string;\n name: string;\n styleContent: string;\n}\n\nexport interface ThemeRegistrationData {\n base: ThemeData[];\n custom: ThemeData[];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThemeModel.js","names":["DEFAULT_DARK_THEME_KEY","DEFAULT_LIGHT_THEME_KEY","DEFAULT_DARK_THEME_PALETTE","blue","red","gray","DEFAULT_PRELOAD_DATA_VARIABLES","concat","SVG_ICON_MANUAL_COLOR_MAP","THEME_CACHE_LOCAL_STORAGE_KEY"],"sources":["../../src/theme/ThemeModel.ts"],"sourcesContent":["export type BaseThemeType = 'dark' | 'light';\nexport type BaseThemeKey = `default-${BaseThemeType}`;\nexport type CssVariableStyleContent = `:root{${string}`;\nexport type ThemeCssVariableName = `--dh-${string}`;\n\nexport type ThemePreloadColorVariable =\n | '--dh-color-accent-contrast'\n | '--dh-color-accent-bg'\n | '--dh-color-accent-hover-bg'\n | '--dh-color-accent-down-bg'\n | '--dh-color-accent-key-focus-bg'\n | '--dh-color-negative-bg'\n | '--dh-color-loading-spinner-primary'\n | '--dh-color-loading-spinner-secondary'\n | '--dh-color-bg'\n | '--dh-color-fg'\n | '--dh-color-input-bg'\n | '--dh-color-input-fg'\n | '--dh-color-input-disabled-bg'\n | '--dh-color-input-border'\n | '--dh-color-input-placeholder'\n | '--dh-color-input-focus-border'\n // Preloading login specific variables should only be needed in DHE. Including\n // them for now until we have a way for DHE to configure them. To be addressed\n // by #1679\n | '--dh-color-login-form-bg'\n | '--dh-color-login-status-message'\n | '--dh-color-login-logo-bg'\n | '--dh-color-login-footer-fg'\n | '--dh-color-random-area-plot-animation-fg-fill'\n | '--dh-color-random-area-plot-animation-fg-stroke'\n | '--dh-color-random-area-plot-animation-bg'\n | '--dh-color-random-area-plot-animation-grid';\n\nexport type ThemeIconsRequiringManualColorChanges =\n | '--dh-svg-icon-select-indicator'\n | '--dh-svg-icon-select-indicator-hover'\n | '--dh-svg-icon-select-indicator-disabled'\n | '--dh-svg-icon-error';\n\nexport const DEFAULT_DARK_THEME_KEY = 'default-dark' satisfies BaseThemeKey;\nexport const DEFAULT_LIGHT_THEME_KEY = 'default-light' satisfies BaseThemeKey;\n\n// Hex versions of some of the default dark theme color palette needed for\n// preload defaults.\nexport const DEFAULT_DARK_THEME_PALETTE = {\n blue: {\n 500: '#2f5bc0',\n 400: '#254ba4',\n 600: '#3b6bda', // accent color\n },\n red: {\n 600: '#c73f61',\n },\n gray: {\n 50: '#1a171a',\n 75: '#211f22',\n 300: '#373438',\n 400: '#403e41',\n 500: '#5b5a5c',\n 600: '#929192',\n 700: '#c0bfbf',\n 800: '#f0f0ee',\n 900: '#fcfcfa',\n },\n} as const;\n\n// Css properties that are used in preload data with default values.\nexport const DEFAULT_PRELOAD_DATA_VARIABLES: Record<\n ThemePreloadColorVariable,\n string\n> = {\n '--dh-color-accent-contrast': DEFAULT_DARK_THEME_PALETTE.gray[900],\n '--dh-color-accent-bg': DEFAULT_DARK_THEME_PALETTE.blue[600],\n '--dh-color-accent-hover-bg': DEFAULT_DARK_THEME_PALETTE.blue[500],\n '--dh-color-accent-down-bg': DEFAULT_DARK_THEME_PALETTE.blue[400],\n '--dh-color-accent-key-focus-bg': DEFAULT_DARK_THEME_PALETTE.blue[500],\n '--dh-color-negative-bg': DEFAULT_DARK_THEME_PALETTE.red[600],\n '--dh-color-loading-spinner-primary': DEFAULT_DARK_THEME_PALETTE.blue[600],\n '--dh-color-loading-spinner-secondary': `${DEFAULT_DARK_THEME_PALETTE.gray[800]}80`, // 50% opacity\n '--dh-color-bg': DEFAULT_DARK_THEME_PALETTE.gray[50],\n '--dh-color-fg': DEFAULT_DARK_THEME_PALETTE.gray[800],\n '--dh-color-input-bg': DEFAULT_DARK_THEME_PALETTE.gray[500],\n '--dh-color-input-fg': DEFAULT_DARK_THEME_PALETTE.gray[800],\n '--dh-color-input-disabled-bg': DEFAULT_DARK_THEME_PALETTE.gray[300],\n '--dh-color-input-border': DEFAULT_DARK_THEME_PALETTE.gray[600],\n '--dh-color-input-placeholder': DEFAULT_DARK_THEME_PALETTE.gray[600],\n '--dh-color-input-focus-border': `${DEFAULT_DARK_THEME_PALETTE.blue[600]}d9`, // 85% opacity\n // Preloading login specific variables should only be needed in DHE. Including\n // them for now until we have a way for DHE to configure them. To be addressed\n // by #1679\n '--dh-color-login-form-bg': DEFAULT_DARK_THEME_PALETTE.gray[400],\n '--dh-color-login-status-message': DEFAULT_DARK_THEME_PALETTE.gray[600],\n '--dh-color-login-logo-bg': DEFAULT_DARK_THEME_PALETTE.gray[900],\n '--dh-color-login-footer-fg': DEFAULT_DARK_THEME_PALETTE.gray[700],\n '--dh-color-random-area-plot-animation-fg-fill': `${DEFAULT_DARK_THEME_PALETTE.blue[600]}14`, // .08 opacity\n '--dh-color-random-area-plot-animation-fg-stroke': `${DEFAULT_DARK_THEME_PALETTE.blue[600]}33`, // .2 opacity\n '--dh-color-random-area-plot-animation-bg':\n DEFAULT_DARK_THEME_PALETTE.gray[75],\n '--dh-color-random-area-plot-animation-grid':\n DEFAULT_DARK_THEME_PALETTE.gray[300],\n};\n\n/**\n * Some inline SVGs require manually updating their fill color via\n * `updateSVGFillColors`. This object maps these variables to their respective\n * fill color variables.\n */\nexport const SVG_ICON_MANUAL_COLOR_MAP: Record<\n ThemeIconsRequiringManualColorChanges,\n string\n> = {\n '--dh-svg-icon-select-indicator': '--dh-color-selector-fg',\n '--dh-svg-icon-select-indicator-hover': '--dh-color-selector-hover-fg',\n '--dh-svg-icon-select-indicator-disabled': '--dh-color-selector-disabled-fg',\n '--dh-svg-icon-error': '--dh-color-form-control-error',\n};\n\nexport const THEME_CACHE_LOCAL_STORAGE_KEY = 'deephaven.themeCache';\n\nexport interface ThemePreloadData {\n themeKey: string;\n preloadStyleContent?: CssVariableStyleContent;\n}\n\nexport interface ThemeData {\n baseThemeKey?: BaseThemeKey;\n themeKey: string;\n name: string;\n styleContent: string;\n}\n\nexport interface ThemeRegistrationData {\n base: ThemeData[];\n custom: ThemeData[];\n}\n"],"mappings":"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"}
@@ -10,8 +10,9 @@ export interface ThemeContextValue {
10
10
  export declare const ThemeContext: import("react").Context<ThemeContextValue | null>;
11
11
  export interface ThemeProviderProps {
12
12
  themes: ThemeData[] | null;
13
+ defaultPreloadValues?: Record<string, string>;
13
14
  children: ReactNode;
14
15
  }
15
- export declare function ThemeProvider({ themes: customThemes, children, }: ThemeProviderProps): JSX.Element | null;
16
+ export declare function ThemeProvider({ themes: customThemes, defaultPreloadValues, children, }: ThemeProviderProps): JSX.Element | null;
16
17
  export default ThemeProvider;
17
18
  //# sourceMappingURL=ThemeProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAgC,MAAM,OAAO,CAAC;AAE/E,OAAO,EAA0B,SAAS,EAAE,MAAM,cAAc,CAAC;AAUjE,OAAO,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAID,eAAO,MAAM,YAAY,mDAAgD,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IAMjC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EAAE,YAAY,EACpB,QAAQ,GACT,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAiFzC;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAgC,MAAM,OAAO,CAAC;AAE/E,OAAO,EAGL,SAAS,EACV,MAAM,cAAc,CAAC;AAUtB,OAAO,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAID,eAAO,MAAM,YAAY,mDAAgD,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IAMjC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EAAE,YAAY,EACpB,oBAAqD,EACrD,QAAQ,GACT,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAkFzC;AAED,eAAe,aAAa,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { createContext, useEffect, useMemo, useState } from 'react';
2
2
  import Log from '@deephaven/log';
3
- import { DEFAULT_DARK_THEME_KEY } from "./ThemeModel.js";
3
+ import { DEFAULT_DARK_THEME_KEY, DEFAULT_PRELOAD_DATA_VARIABLES } from "./ThemeModel.js";
4
4
  import { calculatePreloadStyleContent, getActiveThemes, getDefaultBaseThemes, getThemePreloadData, setThemePreloadData, overrideSVGFillColors } from "./ThemeUtils.js";
5
5
  import { SpectrumThemeProvider } from "./SpectrumThemeProvider.js";
6
6
  import "./theme-svg.css";
@@ -12,6 +12,7 @@ export var ThemeContext = /*#__PURE__*/createContext(null);
12
12
  export function ThemeProvider(_ref) {
13
13
  var {
14
14
  themes: customThemes,
15
+ defaultPreloadValues = DEFAULT_PRELOAD_DATA_VARIABLES,
15
16
  children
16
17
  } = _ref;
17
18
  var baseThemes = useMemo(() => getDefaultBaseThemes(), []);
@@ -35,8 +36,8 @@ export function ThemeProvider(_ref) {
35
36
 
36
37
  // Override fill color for certain inline SVGs (the originals are provided
37
38
  // by theme-svg.scss)
38
- overrideSVGFillColors();
39
- var preloadStyleContent = calculatePreloadStyleContent();
39
+ overrideSVGFillColors(defaultPreloadValues);
40
+ var preloadStyleContent = calculatePreloadStyleContent(defaultPreloadValues);
40
41
  log.debug2('updateThemePreloadData:', {
41
42
  active: activeThemes.map(theme => theme.themeKey),
42
43
  custom: customThemes.map(theme => theme.themeKey),
@@ -47,7 +48,7 @@ export function ThemeProvider(_ref) {
47
48
  themeKey: selectedThemeKey,
48
49
  preloadStyleContent
49
50
  });
50
- }, [activeThemes, selectedThemeKey, customThemes]);
51
+ }, [activeThemes, selectedThemeKey, customThemes, defaultPreloadValues]);
51
52
  useEffect(() => {
52
53
  setValue({
53
54
  activeThemes,
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","names":["createContext","useEffect","useMemo","useState","Log","DEFAULT_DARK_THEME_KEY","calculatePreloadStyleContent","getActiveThemes","getDefaultBaseThemes","getThemePreloadData","setThemePreloadData","overrideSVGFillColors","SpectrumThemeProvider","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","ThemeContext","ThemeProvider","_ref","themes","customThemes","children","baseThemes","value","setValue","selectedThemeKey","setSelectedThemeKey","_getThemePreloadData$","_getThemePreloadData","themeKey","activeThemes","base","custom","updateThemePreloadData","preloadStyleContent","debug2","active","map","theme","styleContent","Provider"],"sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useEffect, useMemo, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { DEFAULT_DARK_THEME_KEY, ThemeData } from './ThemeModel';\nimport {\n calculatePreloadStyleContent,\n getActiveThemes,\n getDefaultBaseThemes,\n getThemePreloadData,\n setThemePreloadData,\n overrideSVGFillColors,\n} from './ThemeUtils';\nimport { SpectrumThemeProvider } from './SpectrumThemeProvider';\nimport './theme-svg.scss';\n\nexport interface ThemeContextValue {\n activeThemes: ThemeData[] | null;\n selectedThemeKey: string;\n themes: ThemeData[];\n setSelectedThemeKey: (themeKey: string) => void;\n}\n\nconst log = Log.module('ThemeProvider');\n\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n /*\n * Additional themes to load in addition to the base themes. If no additional\n * themes are to be loaded, this must be set to an empty array in order to\n * tell the provider to activate the base themes.\n */\n themes: ThemeData[] | null;\n children: ReactNode;\n}\n\nexport function ThemeProvider({\n themes: customThemes,\n children,\n}: ThemeProviderProps): JSX.Element | null {\n const baseThemes = useMemo(() => getDefaultBaseThemes(), []);\n\n const [value, setValue] = useState<ThemeContextValue | null>(null);\n\n const [selectedThemeKey, setSelectedThemeKey] = useState<string>(\n () => getThemePreloadData()?.themeKey ?? DEFAULT_DARK_THEME_KEY\n );\n\n // Calculate active themes once a non-null themes array is provided.\n const activeThemes = useMemo(\n () =>\n customThemes == null\n ? null\n : getActiveThemes(selectedThemeKey, {\n base: baseThemes,\n custom: customThemes ?? [],\n }),\n [baseThemes, selectedThemeKey, customThemes]\n );\n\n const themes = useMemo(\n () => [...baseThemes, ...(customThemes ?? [])],\n [baseThemes, customThemes]\n );\n\n useEffect(\n function updateThemePreloadData() {\n // Don't update preload data until themes have been loaded and activated\n if (activeThemes == null || customThemes == null) {\n return;\n }\n\n // Override fill color for certain inline SVGs (the originals are provided\n // by theme-svg.scss)\n overrideSVGFillColors();\n\n const preloadStyleContent = calculatePreloadStyleContent();\n\n log.debug2('updateThemePreloadData:', {\n active: activeThemes.map(theme => theme.themeKey),\n custom: customThemes.map(theme => theme.themeKey),\n preloadStyleContent,\n selectedThemeKey,\n });\n\n setThemePreloadData({\n themeKey: selectedThemeKey,\n preloadStyleContent,\n });\n },\n [activeThemes, selectedThemeKey, customThemes]\n );\n\n useEffect(() => {\n setValue({\n activeThemes,\n selectedThemeKey,\n themes,\n setSelectedThemeKey,\n });\n }, [activeThemes, selectedThemeKey, themes]);\n\n return (\n <>\n {activeThemes == null ? null : (\n <>\n {activeThemes.map(theme => (\n <style data-theme-key={theme.themeKey} key={theme.themeKey}>\n {theme.styleContent}\n </style>\n ))}\n </>\n )}\n {value == null ? null : (\n <ThemeContext.Provider value={value}>\n <SpectrumThemeProvider>{children}</SpectrumThemeProvider>\n </ThemeContext.Provider>\n )}\n </>\n );\n}\n\nexport default ThemeProvider;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThemeProvider.js","names":["createContext","useEffect","useMemo","useState","Log","DEFAULT_DARK_THEME_KEY","DEFAULT_PRELOAD_DATA_VARIABLES","calculatePreloadStyleContent","getActiveThemes","getDefaultBaseThemes","getThemePreloadData","setThemePreloadData","overrideSVGFillColors","SpectrumThemeProvider","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","ThemeContext","ThemeProvider","_ref","themes","customThemes","defaultPreloadValues","children","baseThemes","value","setValue","selectedThemeKey","setSelectedThemeKey","_getThemePreloadData$","_getThemePreloadData","themeKey","activeThemes","base","custom","updateThemePreloadData","preloadStyleContent","debug2","active","map","theme","styleContent","Provider"],"sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useEffect, useMemo, useState } from 'react';\nimport Log from '@deephaven/log';\nimport {\n DEFAULT_DARK_THEME_KEY,\n DEFAULT_PRELOAD_DATA_VARIABLES,\n ThemeData,\n} from './ThemeModel';\nimport {\n calculatePreloadStyleContent,\n getActiveThemes,\n getDefaultBaseThemes,\n getThemePreloadData,\n setThemePreloadData,\n overrideSVGFillColors,\n} from './ThemeUtils';\nimport { SpectrumThemeProvider } from './SpectrumThemeProvider';\nimport './theme-svg.scss';\n\nexport interface ThemeContextValue {\n activeThemes: ThemeData[] | null;\n selectedThemeKey: string;\n themes: ThemeData[];\n setSelectedThemeKey: (themeKey: string) => void;\n}\n\nconst log = Log.module('ThemeProvider');\n\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n /*\n * Additional themes to load in addition to the base themes. If no additional\n * themes are to be loaded, this must be set to an empty array in order to\n * tell the provider to activate the base themes.\n */\n themes: ThemeData[] | null;\n defaultPreloadValues?: Record<string, string>;\n children: ReactNode;\n}\n\nexport function ThemeProvider({\n themes: customThemes,\n defaultPreloadValues = DEFAULT_PRELOAD_DATA_VARIABLES,\n children,\n}: ThemeProviderProps): JSX.Element | null {\n const baseThemes = useMemo(() => getDefaultBaseThemes(), []);\n\n const [value, setValue] = useState<ThemeContextValue | null>(null);\n\n const [selectedThemeKey, setSelectedThemeKey] = useState<string>(\n () => getThemePreloadData()?.themeKey ?? DEFAULT_DARK_THEME_KEY\n );\n\n // Calculate active themes once a non-null themes array is provided.\n const activeThemes = useMemo(\n () =>\n customThemes == null\n ? null\n : getActiveThemes(selectedThemeKey, {\n base: baseThemes,\n custom: customThemes ?? [],\n }),\n [baseThemes, selectedThemeKey, customThemes]\n );\n\n const themes = useMemo(\n () => [...baseThemes, ...(customThemes ?? [])],\n [baseThemes, customThemes]\n );\n\n useEffect(\n function updateThemePreloadData() {\n // Don't update preload data until themes have been loaded and activated\n if (activeThemes == null || customThemes == null) {\n return;\n }\n\n // Override fill color for certain inline SVGs (the originals are provided\n // by theme-svg.scss)\n overrideSVGFillColors(defaultPreloadValues);\n\n const preloadStyleContent =\n calculatePreloadStyleContent(defaultPreloadValues);\n\n log.debug2('updateThemePreloadData:', {\n active: activeThemes.map(theme => theme.themeKey),\n custom: customThemes.map(theme => theme.themeKey),\n preloadStyleContent,\n selectedThemeKey,\n });\n\n setThemePreloadData({\n themeKey: selectedThemeKey,\n preloadStyleContent,\n });\n },\n [activeThemes, selectedThemeKey, customThemes, defaultPreloadValues]\n );\n\n useEffect(() => {\n setValue({\n activeThemes,\n selectedThemeKey,\n themes,\n setSelectedThemeKey,\n });\n }, [activeThemes, selectedThemeKey, themes]);\n\n return (\n <>\n {activeThemes == null ? null : (\n <>\n {activeThemes.map(theme => (\n <style data-theme-key={theme.themeKey} key={theme.themeKey}>\n {theme.styleContent}\n </style>\n ))}\n </>\n )}\n {value == null ? null : (\n <ThemeContext.Provider value={value}>\n <SpectrumThemeProvider>{children}</SpectrumThemeProvider>\n </ThemeContext.Provider>\n )}\n </>\n );\n}\n\nexport default ThemeProvider;\n"],"mappings":"AAAA,SAASA,aAAa,EAAaC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC9E,OAAOC,GAAG,MAAM,gBAAgB;AAAC,SAE/BC,sBAAsB,EACtBC,8BAA8B;AAAA,SAI9BC,4BAA4B,EAC5BC,eAAe,EACfC,oBAAoB,EACpBC,mBAAmB,EACnBC,mBAAmB,EACnBC,qBAAqB;AAAA,SAEdC,qBAAqB;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAU9B,IAAMC,GAAG,GAAGhB,GAAG,CAACiB,MAAM,CAAC,eAAe,CAAC;AAEvC,OAAO,IAAMC,YAAY,gBAAGtB,aAAa,CAA2B,IAAI,CAAC;AAazE,OAAO,SAASuB,aAAaA,CAAAC,IAAA,EAIc;EAAA,IAJb;IAC5BC,MAAM,EAAEC,YAAY;IACpBC,oBAAoB,GAAGrB,8BAA8B;IACrDsB;EACkB,CAAC,GAAAJ,IAAA;EACnB,IAAMK,UAAU,GAAG3B,OAAO,CAAC,MAAMO,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC;EAE5D,IAAM,CAACqB,KAAK,EAAEC,QAAQ,CAAC,GAAG5B,QAAQ,CAA2B,IAAI,CAAC;EAElE,IAAM,CAAC6B,gBAAgB,EAAEC,mBAAmB,CAAC,GAAG9B,QAAQ,CACtD;IAAA,IAAA+B,qBAAA,EAAAC,oBAAA;IAAA,QAAAD,qBAAA,IAAAC,oBAAA,GAAMzB,mBAAmB,CAAC,CAAC,cAAAyB,oBAAA,uBAArBA,oBAAA,CAAuBC,QAAQ,cAAAF,qBAAA,cAAAA,qBAAA,GAAI7B,sBAAsB;EAAA,CACjE,CAAC;;EAED;EACA,IAAMgC,YAAY,GAAGnC,OAAO,CAC1B,MACEwB,YAAY,IAAI,IAAI,GAChB,IAAI,GACJlB,eAAe,CAACwB,gBAAgB,EAAE;IAChCM,IAAI,EAAET,UAAU;IAChBU,MAAM,EAAEb,YAAY,aAAZA,YAAY,cAAZA,YAAY,GAAI;EAC1B,CAAC,CAAC,EACR,CAACG,UAAU,EAAEG,gBAAgB,EAAEN,YAAY,CAC7C,CAAC;EAED,IAAMD,MAAM,GAAGvB,OAAO,CACpB,MAAM,CAAC,GAAG2B,UAAU,EAAE,IAAIH,YAAY,aAAZA,YAAY,cAAZA,YAAY,GAAI,EAAE,CAAC,CAAC,EAC9C,CAACG,UAAU,EAAEH,YAAY,CAC3B,CAAC;EAEDzB,SAAS,CACP,SAASuC,sBAAsBA,CAAA,EAAG;IAChC;IACA,IAAIH,YAAY,IAAI,IAAI,IAAIX,YAAY,IAAI,IAAI,EAAE;MAChD;IACF;;IAEA;IACA;IACAd,qBAAqB,CAACe,oBAAoB,CAAC;IAE3C,IAAMc,mBAAmB,GACvBlC,4BAA4B,CAACoB,oBAAoB,CAAC;IAEpDP,GAAG,CAACsB,MAAM,CAAC,yBAAyB,EAAE;MACpCC,MAAM,EAAEN,YAAY,CAACO,GAAG,CAACC,KAAK,IAAIA,KAAK,CAACT,QAAQ,CAAC;MACjDG,MAAM,EAAEb,YAAY,CAACkB,GAAG,CAACC,KAAK,IAAIA,KAAK,CAACT,QAAQ,CAAC;MACjDK,mBAAmB;MACnBT;IACF,CAAC,CAAC;IAEFrB,mBAAmB,CAAC;MAClByB,QAAQ,EAAEJ,gBAAgB;MAC1BS;IACF,CAAC,CAAC;EACJ,CAAC,EACD,CAACJ,YAAY,EAAEL,gBAAgB,EAAEN,YAAY,EAAEC,oBAAoB,CACrE,CAAC;EAED1B,SAAS,CAAC,MAAM;IACd8B,QAAQ,CAAC;MACPM,YAAY;MACZL,gBAAgB;MAChBP,MAAM;MACNQ;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAACI,YAAY,EAAEL,gBAAgB,EAAEP,MAAM,CAAC,CAAC;EAE5C,oBACEN,KAAA,CAAAF,SAAA;IAAAW,QAAA,GACGS,YAAY,IAAI,IAAI,GAAG,IAAI,gBAC1BtB,IAAA,CAAAE,SAAA;MAAAW,QAAA,EACGS,YAAY,CAACO,GAAG,CAACC,KAAK,iBACrB9B,IAAA;QAAO,kBAAgB8B,KAAK,CAACT,QAAS;QAAAR,QAAA,EACnCiB,KAAK,CAACC;MAAY,GADuBD,KAAK,CAACT,QAE3C,CACR;IAAC,CACF,CACH,EACAN,KAAK,IAAI,IAAI,GAAG,IAAI,gBACnBf,IAAA,CAACO,YAAY,CAACyB,QAAQ;MAACjB,KAAK,EAAEA,KAAM;MAAAF,QAAA,eAClCb,IAAA,CAACF,qBAAqB;QAAAe,QAAA,EAAEA;MAAQ,CAAwB;IAAC,CACpC,CACxB;EAAA,CACD,CAAC;AAEP;AAEA,eAAeL,aAAa"}
@@ -9,16 +9,24 @@ export type VarExpressionResolver = (varExpression: string) => string;
9
9
  * happens before themes are fully loaded so that we can style things like the
10
10
  * loading spinner and background color which are shown to the user early on in
11
11
  * the app lifecycle.
12
+ * @defaultPreloadValues Default values to use if a preload variable is not set.
12
13
  */
13
- export declare function calculatePreloadStyleContent(): CssVariableStyleContent;
14
+ export declare function calculatePreloadStyleContent(defaultPreloadValues: Record<string, string>): CssVariableStyleContent;
14
15
  /**
15
16
  * Create a resolver function for calculating the value of a css variable based
16
17
  * on a given element's computed style. If the variable resolves to '', we check
17
- * DEFAULT_PRELOAD_DATA_VARIABLES for a default value, and if one does not exist,
18
+ * `defaultValues` for a default value, and if one does not exist,
18
19
  * return ''.
19
20
  * @param el Element to resolve css variables against
21
+ * @param defaultValues Default values to use if a variable is not set.
20
22
  */
21
- export declare function createCssVariableResolver(el: Element): (varName: ThemeCssVariableName) => string;
23
+ export declare function createCssVariableResolver(el: Element, defaultValues: Record<string, string>): (varName: ThemeCssVariableName) => string;
24
+ /**
25
+ * Create a style tag containing preload css variables and add to the head.
26
+ * @param id The id of the style tag
27
+ * @param preloadStyleContent The css variable content to add to the style tag
28
+ */
29
+ export declare function createPreloadStyleElement(id: `theme-preload-${string}`, preloadStyleContent: CssVariableStyleContent): void;
22
30
  /**
23
31
  * Extracts all css variable expressions from the given record and returns
24
32
  * a set of unique expressions.
@@ -115,8 +123,9 @@ export declare function setThemePreloadData(preloadData: ThemePreloadData): void
115
123
  export declare function getThemeKey(pluginName: string, themeName: string): string;
116
124
  /**
117
125
  * Preload minimal theme variables from the cache.
126
+ * @defaultPreloadValues Optional default values to use if a preload variable is not set.
118
127
  */
119
- export declare function preloadTheme(): void;
128
+ export declare function preloadTheme(defaultPreloadValues?: Record<string, string>): void;
120
129
  /**
121
130
  * Inline SVGs cannot depend on dynamic CSS variables, so we have to statically
122
131
  * update them if we want to change their color.
@@ -131,6 +140,7 @@ export declare function preloadTheme(): void;
131
140
  * just change the background color instead of relying on this util, but this
132
141
  * is not always possible. e.g. <select> elements don't support pseudo elements,
133
142
  * so there's not a good way to set icons via masks.
143
+ * @param defaultValues Default values to use if a variable is not set.
134
144
  */
135
- export declare function overrideSVGFillColors(): void;
145
+ export declare function overrideSVGFillColors(defaultValues: Record<string, string>): void;
136
146
  //# sourceMappingURL=ThemeUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeUtils.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeUtils.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EAEvB,qBAAqB,EAGrB,oBAAoB,EAErB,MAAM,cAAc,CAAC;AAItB,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAClD,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,oBAAoB,QAAO,CAAC;AACzC,eAAO,MAAM,gBAAgB,QAAO,CAAC;AAErC,MAAM,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;AAEtE;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,uBAAuB,CAUtE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,OAAO,GACV,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,CAkB3C;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,GAAG,CAAC,MAAM,CAAC,CAcb;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,qBAAqB,GACvC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CA+BtC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,EAAE,CAgBlD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAU7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAiCrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1E,MAAM,EAAE,CAAC,EACT,aAAa,GAAE,WAA2B,EAC1C,eAAe,UAAQ,GACtB,CAAC,CA2CH;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,GACZ,MAAM,CAyBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAKvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAWnC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAkB5C"}
1
+ {"version":3,"file":"ThemeUtils.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeUtils.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EAEvB,qBAAqB,EAGrB,oBAAoB,EAErB,MAAM,cAAc,CAAC;AAItB,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAClD,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,oBAAoB,QAAO,CAAC;AACzC,eAAO,MAAM,gBAAgB,QAAO,CAAC;AAErC,MAAM,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;AAEtE;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,uBAAuB,CAazB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,OAAO,EACX,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,CAgB3C;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,iBAAiB,MAAM,EAAE,EAC7B,mBAAmB,EAAE,uBAAuB,GAC3C,IAAI,CAKN;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,GAAG,CAAC,MAAM,CAAC,CAcb;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,qBAAqB,GACvC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CA+BtC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,EAAE,CAgBlD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAU7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAiCrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1E,MAAM,EAAE,CAAC,EACT,aAAa,GAAE,WAA2B,EAC1C,eAAe,UAAQ,GACtB,CAAC,CA2CH;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,GACZ,MAAM,CAyBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAKvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,oBAAoB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAkC,GAC5E,IAAI,CAyBN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,IAAI,CAkBN"}
@@ -13,24 +13,26 @@ export var WHITESPACE_REGEX = /\s/;
13
13
  * happens before themes are fully loaded so that we can style things like the
14
14
  * loading spinner and background color which are shown to the user early on in
15
15
  * the app lifecycle.
16
+ * @defaultPreloadValues Default values to use if a preload variable is not set.
16
17
  */
17
- export function calculatePreloadStyleContent() {
18
- var resolveVar = createCssVariableResolver(document.body);
18
+ export function calculatePreloadStyleContent(defaultPreloadValues) {
19
+ var resolveVar = createCssVariableResolver(document.body, defaultPreloadValues);
19
20
 
20
21
  // Calculate the current preload variables. If the variable is not set, use
21
22
  // the default value.
22
- var pairs = Object.keys(DEFAULT_PRELOAD_DATA_VARIABLES).map(key => "".concat(key, ":").concat(resolveVar(key)));
23
+ var pairs = Object.keys(defaultPreloadValues).map(key => "".concat(key, ":").concat(resolveVar(key)));
23
24
  return ":root{".concat(pairs.join(';'), "}");
24
25
  }
25
26
 
26
27
  /**
27
28
  * Create a resolver function for calculating the value of a css variable based
28
29
  * on a given element's computed style. If the variable resolves to '', we check
29
- * DEFAULT_PRELOAD_DATA_VARIABLES for a default value, and if one does not exist,
30
+ * `defaultValues` for a default value, and if one does not exist,
30
31
  * return ''.
31
32
  * @param el Element to resolve css variables against
33
+ * @param defaultValues Default values to use if a variable is not set.
32
34
  */
33
- export function createCssVariableResolver(el) {
35
+ export function createCssVariableResolver(el, defaultValues) {
34
36
  var computedStyle = getComputedStyle(el);
35
37
 
36
38
  /**
@@ -38,15 +40,27 @@ export function createCssVariableResolver(el) {
38
40
  * return the default preload value or '' if one does not exist.
39
41
  */
40
42
  return function cssVariableResolver(varName) {
41
- var _DEFAULT_PRELOAD_DATA;
43
+ var _defaultValues;
42
44
  var value = computedStyle.getPropertyValue(varName);
43
45
  if (value !== '') {
44
46
  return value;
45
47
  }
46
- return (_DEFAULT_PRELOAD_DATA = DEFAULT_PRELOAD_DATA_VARIABLES[varName]) !== null && _DEFAULT_PRELOAD_DATA !== void 0 ? _DEFAULT_PRELOAD_DATA : '';
48
+ return (_defaultValues = defaultValues[varName]) !== null && _defaultValues !== void 0 ? _defaultValues : '';
47
49
  };
48
50
  }
49
51
 
52
+ /**
53
+ * Create a style tag containing preload css variables and add to the head.
54
+ * @param id The id of the style tag
55
+ * @param preloadStyleContent The css variable content to add to the style tag
56
+ */
57
+ export function createPreloadStyleElement(id, preloadStyleContent) {
58
+ var style = document.createElement('style');
59
+ style.id = id;
60
+ style.innerHTML = preloadStyleContent;
61
+ document.head.appendChild(style);
62
+ }
63
+
50
64
  /**
51
65
  * Extracts all css variable expressions from the given record and returns
52
66
  * a set of unique expressions.
@@ -279,15 +293,24 @@ export function getThemeKey(pluginName, themeName) {
279
293
 
280
294
  /**
281
295
  * Preload minimal theme variables from the cache.
296
+ * @defaultPreloadValues Optional default values to use if a preload variable is not set.
282
297
  */
283
298
  export function preloadTheme() {
284
- var _getThemePreloadData$, _getThemePreloadData;
285
- var preloadStyleContent = (_getThemePreloadData$ = (_getThemePreloadData = getThemePreloadData()) === null || _getThemePreloadData === void 0 ? void 0 : _getThemePreloadData.preloadStyleContent) !== null && _getThemePreloadData$ !== void 0 ? _getThemePreloadData$ : calculatePreloadStyleContent();
286
- log.debug('Preloading theme content:', "'".concat(preloadStyleContent, "'"));
287
- var style = document.createElement('style');
288
- style.id = 'theme-preload';
289
- style.innerHTML = preloadStyleContent;
290
- document.head.appendChild(style);
299
+ var _getThemePreloadData;
300
+ var defaultPreloadValues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_PRELOAD_DATA_VARIABLES;
301
+ var previousPreloadStyleContent = (_getThemePreloadData = getThemePreloadData()) === null || _getThemePreloadData === void 0 ? void 0 : _getThemePreloadData.preloadStyleContent;
302
+ var defaultPreloadStyleContent = calculatePreloadStyleContent(defaultPreloadValues);
303
+ log.debug('Preloading theme content:', {
304
+ defaultPreloadStyleContent,
305
+ previousPreloadStyleContent
306
+ });
307
+ createPreloadStyleElement('theme-preload-defaults', defaultPreloadStyleContent);
308
+
309
+ // Any preload variables that were saved by last theme load should override
310
+ // the defaults
311
+ if (previousPreloadStyleContent != null) {
312
+ createPreloadStyleElement('theme-preload-previous', previousPreloadStyleContent);
313
+ }
291
314
  }
292
315
 
293
316
  /**
@@ -304,9 +327,10 @@ export function preloadTheme() {
304
327
  * just change the background color instead of relying on this util, but this
305
328
  * is not always possible. e.g. <select> elements don't support pseudo elements,
306
329
  * so there's not a good way to set icons via masks.
330
+ * @param defaultValues Default values to use if a variable is not set.
307
331
  */
308
- export function overrideSVGFillColors() {
309
- var resolveVar = createCssVariableResolver(document.body);
332
+ export function overrideSVGFillColors(defaultValues) {
333
+ var resolveVar = createCssVariableResolver(document.body, defaultValues);
310
334
  Object.entries(SVG_ICON_MANUAL_COLOR_MAP).forEach(_ref4 => {
311
335
  var [key, value] = _ref4;
312
336
  // Clear any previous override so that our variables get resolved against the
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeUtils.js","names":["Log","assertNotNull","ColorUtils","themeDark","themeLight","DEFAULT_DARK_THEME_KEY","DEFAULT_LIGHT_THEME_KEY","DEFAULT_PRELOAD_DATA_VARIABLES","THEME_CACHE_LOCAL_STORAGE_KEY","SVG_ICON_MANUAL_COLOR_MAP","log","module","CSS_VAR_EXPRESSION_PREFIX","TMP_CSS_PROP_PREFIX","NON_WHITESPACE_REGEX","WHITESPACE_REGEX","calculatePreloadStyleContent","resolveVar","createCssVariableResolver","document","body","pairs","Object","keys","map","key","concat","join","el","computedStyle","getComputedStyle","cssVariableResolver","varName","_DEFAULT_PRELOAD_DATA","value","getPropertyValue","extractDistinctCssVariableExpressions","record","set","Set","values","forEach","getExpressionRanges","_ref","start","end","expression","substring","includes","add","getActiveThemes","themeKey","themeRegistration","_custom$baseThemeKey","custom","find","theme","baseThemeKey","base","error","debug","getDefaultBaseThemes","name","styleContent","getThemePreloadData","data","localStorage","getItem","JSON","parse","_unused","_NON_WHITESPACE_REGEX","_NON_WHITESPACE_REGEX2","ranges","exec","index","parenLevel","i","length","test","push","replaceSVGFillColor","svgContent","fillColor","replace","encodeURIComponent","resolveCssVariablesInRecord","targetElement","arguments","undefined","isAlphaOptional","perfStart","performance","now","tmpPropEl","createElement","appendChild","varExpressions","varExpression","tmpPropKey","style","setProperty","result","window","resolver","indexOf","resolved","normalizeCssColor","entries","_ref2","resolveCssVariablesInString","remove","_ref3","setThemePreloadData","preloadData","setItem","stringify","getThemeKey","pluginName","themeName","preloadTheme","_getThemePreloadData$","_getThemePreloadData","preloadStyleContent","id","innerHTML","head","overrideSVGFillColors","_ref4","removeProperty","newSVGContent"],"sources":["../../src/theme/ThemeUtils.ts"],"sourcesContent":["import Log from '@deephaven/log';\nimport { assertNotNull, ColorUtils } from '@deephaven/utils';\nimport { themeDark } from './theme-dark';\nimport { themeLight } from './theme-light';\nimport {\n DEFAULT_DARK_THEME_KEY,\n DEFAULT_LIGHT_THEME_KEY,\n DEFAULT_PRELOAD_DATA_VARIABLES,\n ThemeData,\n ThemePreloadData,\n CssVariableStyleContent,\n ThemePreloadColorVariable,\n ThemeRegistrationData,\n THEME_CACHE_LOCAL_STORAGE_KEY,\n SVG_ICON_MANUAL_COLOR_MAP,\n ThemeCssVariableName,\n ThemeIconsRequiringManualColorChanges,\n} from './ThemeModel';\n\nconst log = Log.module('ThemeUtils');\n\nexport const CSS_VAR_EXPRESSION_PREFIX = 'var(--';\nexport const TMP_CSS_PROP_PREFIX = 'dh-tmp';\nexport const NON_WHITESPACE_REGEX = /\\S/;\nexport const WHITESPACE_REGEX = /\\s/;\n\nexport type VarExpressionResolver = (varExpression: string) => string;\n\n/**\n * Resolves the current values of CSS variables we want to preload. Preloading\n * happens before themes are fully loaded so that we can style things like the\n * loading spinner and background color which are shown to the user early on in\n * the app lifecycle.\n */\nexport function calculatePreloadStyleContent(): CssVariableStyleContent {\n const resolveVar = createCssVariableResolver(document.body);\n\n // Calculate the current preload variables. If the variable is not set, use\n // the default value.\n const pairs = Object.keys(DEFAULT_PRELOAD_DATA_VARIABLES).map(\n key => `${key}:${resolveVar(key as ThemePreloadColorVariable)}`\n );\n\n return `:root{${pairs.join(';')}}`;\n}\n\n/**\n * Create a resolver function for calculating the value of a css variable based\n * on a given element's computed style. If the variable resolves to '', we check\n * DEFAULT_PRELOAD_DATA_VARIABLES for a default value, and if one does not exist,\n * return ''.\n * @param el Element to resolve css variables against\n */\nexport function createCssVariableResolver(\n el: Element\n): (varName: ThemeCssVariableName) => string {\n const computedStyle = getComputedStyle(el);\n\n /**\n * Resolve the given css variable name to a value. If the variable is not set,\n * return the default preload value or '' if one does not exist.\n */\n return function cssVariableResolver(varName: ThemeCssVariableName): string {\n const value = computedStyle.getPropertyValue(varName);\n\n if (value !== '') {\n return value;\n }\n\n return (\n DEFAULT_PRELOAD_DATA_VARIABLES[varName as ThemePreloadColorVariable] ?? ''\n );\n };\n}\n\n/**\n * Extracts all css variable expressions from the given record and returns\n * a set of unique expressions.\n * @param record The record to extract css variable expressions from\n */\nexport function extractDistinctCssVariableExpressions(\n record: Record<string, string>\n): Set<string> {\n const set = new Set<string>();\n\n Object.values(record).forEach(value => {\n getExpressionRanges(value).forEach(([start, end]) => {\n const expression = value.substring(start, end + 1);\n\n if (expression.includes(CSS_VAR_EXPRESSION_PREFIX)) {\n set.add(expression);\n }\n });\n });\n\n return set;\n}\n\n/**\n * Returns an array of the active themes. The first item will always be one\n * of the base themes. Optionally, the second item will be a custom theme.\n */\nexport function getActiveThemes(\n themeKey: string,\n themeRegistration: ThemeRegistrationData\n): [ThemeData] | [ThemeData, ThemeData] {\n const custom = themeRegistration.custom.find(\n theme => theme.themeKey === themeKey\n );\n\n const baseThemeKey = custom?.baseThemeKey ?? themeKey;\n\n let base = themeRegistration.base.find(\n theme => theme.themeKey === baseThemeKey\n );\n\n if (base == null) {\n log.error(\n `No registered base theme found for theme key: '${baseThemeKey}'`,\n 'Registered:',\n themeRegistration.base.map(theme => theme.themeKey),\n themeRegistration.custom.map(theme => theme.themeKey)\n );\n base = themeRegistration.base.find(\n theme => theme.themeKey === DEFAULT_DARK_THEME_KEY\n );\n\n assertNotNull(\n base,\n `Default base theme '${DEFAULT_DARK_THEME_KEY}' is not registered`\n );\n }\n\n log.debug('Applied themes:', base.themeKey, custom?.themeKey);\n\n return custom == null ? [base] : [base, custom];\n}\n\n/**\n * Get default base theme data.\n */\nexport function getDefaultBaseThemes(): ThemeData[] {\n return [\n {\n name: 'Default Dark',\n themeKey: DEFAULT_DARK_THEME_KEY,\n styleContent: themeDark,\n },\n // The ThemePicker shows whenever more than 1 theme is available. Disable\n // light theme for now to keep the picker hidden until it is fully\n // implemented by #1539.\n {\n name: 'Default Light',\n themeKey: DEFAULT_LIGHT_THEME_KEY,\n styleContent: themeLight,\n },\n ];\n}\n\n/**\n * Get the preload data from local storage or null if it does not exist or is\n * invalid\n */\nexport function getThemePreloadData(): ThemePreloadData | null {\n const data = localStorage.getItem(THEME_CACHE_LOCAL_STORAGE_KEY);\n\n try {\n return data == null ? null : JSON.parse(data);\n } catch {\n // ignore\n }\n\n return null;\n}\n\n/**\n * Identifies start and end indices of any top-level expressions in the given\n * string.\n *\n * e.g.\n * getExpressionRanges('var(--aaa-aa) #fff var(--bbb-bb)')\n * yields:\n * [\n * [0, 12], // 'var(--aaa-aa)'\n * [14, 17] // '#fff'\n * [19, 31], // 'var(--bbb-bb)'\n * ]\n *\n * In cases where there are nested expressions, only the indices of the outermost\n * expression will be included.\n *\n * e.g.\n * getExpressionRanges('var(--ccc-cc, var(--aaa-aa, green)) var(--bbb-bb)')\n * yields:\n * [\n * [0, 34], // 'var(--ccc-cc, var(--aaa-aa, green))'\n * [36, 48], // 'var(--bbb-bb)'\n * ]\n * @param value The string to search for expressions\n * @returns An array of [start, end] index pairs for each expression\n */\nexport function getExpressionRanges(value: string): [number, number][] {\n const ranges: [number, number][] = [];\n\n let start = NON_WHITESPACE_REGEX.exec(value)?.index ?? 0;\n let parenLevel = 0;\n\n for (let i = 0; i < value.length; i += 1) {\n if (value[i] === '(') {\n parenLevel += 1;\n } else if (value[i] === ')') {\n parenLevel -= 1;\n }\n\n if (\n i === value.length - 1 ||\n (WHITESPACE_REGEX.test(value[i + 1]) && parenLevel === 0)\n ) {\n ranges.push([start, i]);\n\n while (i < value.length - 1 && WHITESPACE_REGEX.test(value[i + 1])) {\n i += 1;\n }\n\n start = i + 1;\n }\n }\n\n if (parenLevel !== 0) {\n log.error('Unbalanced parentheses in css var expression', value);\n return [];\n }\n\n return ranges;\n}\n\n/**\n * Replace the `fill='...'` attribute in the given SVG content with the given\n * color string.\n * @param svgContent Inline SVG content to replace the fill color in\n * @param fillColor The color to replace the fill color with\n */\nexport function replaceSVGFillColor(\n svgContent: string,\n fillColor: string\n): string {\n return svgContent.replace(\n /fill='.*?'/,\n `fill='${encodeURIComponent(fillColor)}'`\n );\n}\n\n/**\n * Make a copy of the given object replacing any css variable expressions\n * contained in its prop values with values resolved from the given HTML element.\n * Variables that resolve to color strings will also be normalized to 8 digit\n * hex values (or optionally 6 digit hex if `isAlphaOptional` is true).\n *\n * Note that the browser will force a reflow when calling `getComputedStyle` if\n * css properties have changed. In order to avoid a reflow for every property\n * check we use distinct setup, resolve / normalize, and cleanup passes:\n * 1. Setup - Create a tmp element and set all css props we want to evaluate\n * 2. Resolve / Normalize - Evaluate all css props via `getPropertyValue` calls\n * and replace the original expressions with resolved values. Also normalize\n * css colors to rgb/a.\n * 3. Cleanup - Remove the tmp element\n * @param record An object whose values may contain css var expressions\n * @param targetElement The element to resolve css variables against. Defaults\n * to document.body\n * @param isAlphaOptional If true, the alpha value will be dropped from resolved\n * 8 character hex colors if it is 'ff'. Defaults to false.\n */\nexport function resolveCssVariablesInRecord<T extends Record<string, string>>(\n record: T,\n targetElement: HTMLElement = document.body,\n isAlphaOptional = false\n): T {\n const perfStart = performance.now();\n\n // Add a temporary div to attach temp css variables to\n const tmpPropEl = document.createElement('div');\n targetElement.appendChild(tmpPropEl);\n\n const varExpressions = [...extractDistinctCssVariableExpressions(record)];\n\n // Set temporary css variables for resolving var expressions\n varExpressions.forEach((varExpression, i) => {\n const tmpPropKey = `--${TMP_CSS_PROP_PREFIX}-${i}`;\n tmpPropEl.style.setProperty(tmpPropKey, varExpression);\n });\n\n const result = {} as T;\n\n const computedStyle = window.getComputedStyle(tmpPropEl);\n\n const resolver = (varExpression: string): string => {\n const tmpPropKey = `--${TMP_CSS_PROP_PREFIX}-${varExpressions.indexOf(\n varExpression\n )}`;\n\n const resolved = computedStyle.getPropertyValue(tmpPropKey);\n\n return ColorUtils.normalizeCssColor(resolved, isAlphaOptional);\n };\n\n // Resolve the temporary css variables\n Object.entries(record).forEach(([key, value]) => {\n result[key as keyof T] = resolveCssVariablesInString(\n resolver,\n value\n ) as T[keyof T];\n });\n\n // Remove the temporary css variables\n tmpPropEl.remove();\n\n log.debug('Resolved css variables', performance.now() - perfStart, 'ms');\n\n return result;\n}\n\n/**\n * Resolve css variable expressions in the given string using the\n * given resolver and replace the original expressions with the resolved values.\n *\n * @param resolver Function that can resolve a css variable expression\n * @param value Value that may contain css variable expressions\n */\nexport function resolveCssVariablesInString(\n resolver: VarExpressionResolver,\n value: string\n): string {\n const result: string[] = [];\n let i = 0;\n getExpressionRanges(value).forEach(([start, end]) => {\n if (i < start) {\n result.push(value.substring(i, start));\n i += start - i;\n }\n\n const expression = value.substring(start, end + 1);\n\n result.push(\n expression.includes(CSS_VAR_EXPRESSION_PREFIX)\n ? resolver(expression)\n : expression\n );\n\n i += end - start + 1;\n });\n\n if (result.length === 0) {\n return value;\n }\n\n return result.join('');\n}\n\n/**\n * Store theme preload data in local storage.\n * @param preloadData The preload data to set\n */\nexport function setThemePreloadData(preloadData: ThemePreloadData): void {\n localStorage.setItem(\n THEME_CACHE_LOCAL_STORAGE_KEY,\n JSON.stringify(preloadData)\n );\n}\n\n/**\n * Derive unique theme key from plugin root path and theme name.\n * @param pluginName The root path of the plugin\n * @param themeName The name of the theme\n */\nexport function getThemeKey(pluginName: string, themeName: string): string {\n return `${pluginName}_${themeName}`;\n}\n\n/**\n * Preload minimal theme variables from the cache.\n */\nexport function preloadTheme(): void {\n const preloadStyleContent =\n getThemePreloadData()?.preloadStyleContent ??\n calculatePreloadStyleContent();\n\n log.debug('Preloading theme content:', `'${preloadStyleContent}'`);\n\n const style = document.createElement('style');\n style.id = 'theme-preload';\n style.innerHTML = preloadStyleContent;\n document.head.appendChild(style);\n}\n\n/**\n * Inline SVGs cannot depend on dynamic CSS variables, so we have to statically\n * update them if we want to change their color.\n *\n * This function:\n * 1. Clears any previous overrides\n * 2. Resolves CSS variables containing inline SVG urls\n * 3. Resolves mapped color variables and replaces the `fill='...'` attribute with the result\n * 4. Sets the original CSS variable to the new replaced value\n *\n * Note that it is preferable to use inline SVGs as background-mask values and\n * just change the background color instead of relying on this util, but this\n * is not always possible. e.g. <select> elements don't support pseudo elements,\n * so there's not a good way to set icons via masks.\n */\nexport function overrideSVGFillColors(): void {\n const resolveVar = createCssVariableResolver(document.body);\n\n Object.entries(SVG_ICON_MANUAL_COLOR_MAP).forEach(([key, value]) => {\n // Clear any previous override so that our variables get resolved against the\n // actual svg content provided by the active themes and not from a previous\n // override\n document.body.style.removeProperty(key);\n\n const svgContent = resolveVar(key as ThemeIconsRequiringManualColorChanges);\n const fillColor = resolveVar(value as ThemePreloadColorVariable);\n\n const newSVGContent = replaceSVGFillColor(svgContent, fillColor);\n\n // This will take precedence over any values for the variable provided by\n // the active themes\n document.body.style.setProperty(key, newSVGContent);\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThemeUtils.js","names":["Log","assertNotNull","ColorUtils","themeDark","themeLight","DEFAULT_DARK_THEME_KEY","DEFAULT_LIGHT_THEME_KEY","DEFAULT_PRELOAD_DATA_VARIABLES","THEME_CACHE_LOCAL_STORAGE_KEY","SVG_ICON_MANUAL_COLOR_MAP","log","module","CSS_VAR_EXPRESSION_PREFIX","TMP_CSS_PROP_PREFIX","NON_WHITESPACE_REGEX","WHITESPACE_REGEX","calculatePreloadStyleContent","defaultPreloadValues","resolveVar","createCssVariableResolver","document","body","pairs","Object","keys","map","key","concat","join","el","defaultValues","computedStyle","getComputedStyle","cssVariableResolver","varName","_defaultValues","value","getPropertyValue","createPreloadStyleElement","id","preloadStyleContent","style","createElement","innerHTML","head","appendChild","extractDistinctCssVariableExpressions","record","set","Set","values","forEach","getExpressionRanges","_ref","start","end","expression","substring","includes","add","getActiveThemes","themeKey","themeRegistration","_custom$baseThemeKey","custom","find","theme","baseThemeKey","base","error","debug","getDefaultBaseThemes","name","styleContent","getThemePreloadData","data","localStorage","getItem","JSON","parse","_unused","_NON_WHITESPACE_REGEX","_NON_WHITESPACE_REGEX2","ranges","exec","index","parenLevel","i","length","test","push","replaceSVGFillColor","svgContent","fillColor","replace","encodeURIComponent","resolveCssVariablesInRecord","targetElement","arguments","undefined","isAlphaOptional","perfStart","performance","now","tmpPropEl","varExpressions","varExpression","tmpPropKey","setProperty","result","window","resolver","indexOf","resolved","normalizeCssColor","entries","_ref2","resolveCssVariablesInString","remove","_ref3","setThemePreloadData","preloadData","setItem","stringify","getThemeKey","pluginName","themeName","preloadTheme","_getThemePreloadData","previousPreloadStyleContent","defaultPreloadStyleContent","overrideSVGFillColors","_ref4","removeProperty","newSVGContent"],"sources":["../../src/theme/ThemeUtils.ts"],"sourcesContent":["import Log from '@deephaven/log';\nimport { assertNotNull, ColorUtils } from '@deephaven/utils';\nimport { themeDark } from './theme-dark';\nimport { themeLight } from './theme-light';\nimport {\n DEFAULT_DARK_THEME_KEY,\n DEFAULT_LIGHT_THEME_KEY,\n DEFAULT_PRELOAD_DATA_VARIABLES,\n ThemeData,\n ThemePreloadData,\n CssVariableStyleContent,\n ThemePreloadColorVariable,\n ThemeRegistrationData,\n THEME_CACHE_LOCAL_STORAGE_KEY,\n SVG_ICON_MANUAL_COLOR_MAP,\n ThemeCssVariableName,\n ThemeIconsRequiringManualColorChanges,\n} from './ThemeModel';\n\nconst log = Log.module('ThemeUtils');\n\nexport const CSS_VAR_EXPRESSION_PREFIX = 'var(--';\nexport const TMP_CSS_PROP_PREFIX = 'dh-tmp';\nexport const NON_WHITESPACE_REGEX = /\\S/;\nexport const WHITESPACE_REGEX = /\\s/;\n\nexport type VarExpressionResolver = (varExpression: string) => string;\n\n/**\n * Resolves the current values of CSS variables we want to preload. Preloading\n * happens before themes are fully loaded so that we can style things like the\n * loading spinner and background color which are shown to the user early on in\n * the app lifecycle.\n * @defaultPreloadValues Default values to use if a preload variable is not set.\n */\nexport function calculatePreloadStyleContent(\n defaultPreloadValues: Record<string, string>\n): CssVariableStyleContent {\n const resolveVar = createCssVariableResolver(\n document.body,\n defaultPreloadValues\n );\n\n // Calculate the current preload variables. If the variable is not set, use\n // the default value.\n const pairs = Object.keys(defaultPreloadValues).map(\n key => `${key}:${resolveVar(key as ThemePreloadColorVariable)}`\n );\n\n return `:root{${pairs.join(';')}}`;\n}\n\n/**\n * Create a resolver function for calculating the value of a css variable based\n * on a given element's computed style. If the variable resolves to '', we check\n * `defaultValues` for a default value, and if one does not exist,\n * return ''.\n * @param el Element to resolve css variables against\n * @param defaultValues Default values to use if a variable is not set.\n */\nexport function createCssVariableResolver(\n el: Element,\n defaultValues: Record<string, string>\n): (varName: ThemeCssVariableName) => string {\n const computedStyle = getComputedStyle(el);\n\n /**\n * Resolve the given css variable name to a value. If the variable is not set,\n * return the default preload value or '' if one does not exist.\n */\n return function cssVariableResolver(varName: ThemeCssVariableName): string {\n const value = computedStyle.getPropertyValue(varName);\n\n if (value !== '') {\n return value;\n }\n\n return defaultValues[varName as ThemePreloadColorVariable] ?? '';\n };\n}\n\n/**\n * Create a style tag containing preload css variables and add to the head.\n * @param id The id of the style tag\n * @param preloadStyleContent The css variable content to add to the style tag\n */\nexport function createPreloadStyleElement(\n id: `theme-preload-${string}`,\n preloadStyleContent: CssVariableStyleContent\n): void {\n const style = document.createElement('style');\n style.id = id;\n style.innerHTML = preloadStyleContent;\n document.head.appendChild(style);\n}\n\n/**\n * Extracts all css variable expressions from the given record and returns\n * a set of unique expressions.\n * @param record The record to extract css variable expressions from\n */\nexport function extractDistinctCssVariableExpressions(\n record: Record<string, string>\n): Set<string> {\n const set = new Set<string>();\n\n Object.values(record).forEach(value => {\n getExpressionRanges(value).forEach(([start, end]) => {\n const expression = value.substring(start, end + 1);\n\n if (expression.includes(CSS_VAR_EXPRESSION_PREFIX)) {\n set.add(expression);\n }\n });\n });\n\n return set;\n}\n\n/**\n * Returns an array of the active themes. The first item will always be one\n * of the base themes. Optionally, the second item will be a custom theme.\n */\nexport function getActiveThemes(\n themeKey: string,\n themeRegistration: ThemeRegistrationData\n): [ThemeData] | [ThemeData, ThemeData] {\n const custom = themeRegistration.custom.find(\n theme => theme.themeKey === themeKey\n );\n\n const baseThemeKey = custom?.baseThemeKey ?? themeKey;\n\n let base = themeRegistration.base.find(\n theme => theme.themeKey === baseThemeKey\n );\n\n if (base == null) {\n log.error(\n `No registered base theme found for theme key: '${baseThemeKey}'`,\n 'Registered:',\n themeRegistration.base.map(theme => theme.themeKey),\n themeRegistration.custom.map(theme => theme.themeKey)\n );\n base = themeRegistration.base.find(\n theme => theme.themeKey === DEFAULT_DARK_THEME_KEY\n );\n\n assertNotNull(\n base,\n `Default base theme '${DEFAULT_DARK_THEME_KEY}' is not registered`\n );\n }\n\n log.debug('Applied themes:', base.themeKey, custom?.themeKey);\n\n return custom == null ? [base] : [base, custom];\n}\n\n/**\n * Get default base theme data.\n */\nexport function getDefaultBaseThemes(): ThemeData[] {\n return [\n {\n name: 'Default Dark',\n themeKey: DEFAULT_DARK_THEME_KEY,\n styleContent: themeDark,\n },\n // The ThemePicker shows whenever more than 1 theme is available. Disable\n // light theme for now to keep the picker hidden until it is fully\n // implemented by #1539.\n {\n name: 'Default Light',\n themeKey: DEFAULT_LIGHT_THEME_KEY,\n styleContent: themeLight,\n },\n ];\n}\n\n/**\n * Get the preload data from local storage or null if it does not exist or is\n * invalid\n */\nexport function getThemePreloadData(): ThemePreloadData | null {\n const data = localStorage.getItem(THEME_CACHE_LOCAL_STORAGE_KEY);\n\n try {\n return data == null ? null : JSON.parse(data);\n } catch {\n // ignore\n }\n\n return null;\n}\n\n/**\n * Identifies start and end indices of any top-level expressions in the given\n * string.\n *\n * e.g.\n * getExpressionRanges('var(--aaa-aa) #fff var(--bbb-bb)')\n * yields:\n * [\n * [0, 12], // 'var(--aaa-aa)'\n * [14, 17] // '#fff'\n * [19, 31], // 'var(--bbb-bb)'\n * ]\n *\n * In cases where there are nested expressions, only the indices of the outermost\n * expression will be included.\n *\n * e.g.\n * getExpressionRanges('var(--ccc-cc, var(--aaa-aa, green)) var(--bbb-bb)')\n * yields:\n * [\n * [0, 34], // 'var(--ccc-cc, var(--aaa-aa, green))'\n * [36, 48], // 'var(--bbb-bb)'\n * ]\n * @param value The string to search for expressions\n * @returns An array of [start, end] index pairs for each expression\n */\nexport function getExpressionRanges(value: string): [number, number][] {\n const ranges: [number, number][] = [];\n\n let start = NON_WHITESPACE_REGEX.exec(value)?.index ?? 0;\n let parenLevel = 0;\n\n for (let i = 0; i < value.length; i += 1) {\n if (value[i] === '(') {\n parenLevel += 1;\n } else if (value[i] === ')') {\n parenLevel -= 1;\n }\n\n if (\n i === value.length - 1 ||\n (WHITESPACE_REGEX.test(value[i + 1]) && parenLevel === 0)\n ) {\n ranges.push([start, i]);\n\n while (i < value.length - 1 && WHITESPACE_REGEX.test(value[i + 1])) {\n i += 1;\n }\n\n start = i + 1;\n }\n }\n\n if (parenLevel !== 0) {\n log.error('Unbalanced parentheses in css var expression', value);\n return [];\n }\n\n return ranges;\n}\n\n/**\n * Replace the `fill='...'` attribute in the given SVG content with the given\n * color string.\n * @param svgContent Inline SVG content to replace the fill color in\n * @param fillColor The color to replace the fill color with\n */\nexport function replaceSVGFillColor(\n svgContent: string,\n fillColor: string\n): string {\n return svgContent.replace(\n /fill='.*?'/,\n `fill='${encodeURIComponent(fillColor)}'`\n );\n}\n\n/**\n * Make a copy of the given object replacing any css variable expressions\n * contained in its prop values with values resolved from the given HTML element.\n * Variables that resolve to color strings will also be normalized to 8 digit\n * hex values (or optionally 6 digit hex if `isAlphaOptional` is true).\n *\n * Note that the browser will force a reflow when calling `getComputedStyle` if\n * css properties have changed. In order to avoid a reflow for every property\n * check we use distinct setup, resolve / normalize, and cleanup passes:\n * 1. Setup - Create a tmp element and set all css props we want to evaluate\n * 2. Resolve / Normalize - Evaluate all css props via `getPropertyValue` calls\n * and replace the original expressions with resolved values. Also normalize\n * css colors to rgb/a.\n * 3. Cleanup - Remove the tmp element\n * @param record An object whose values may contain css var expressions\n * @param targetElement The element to resolve css variables against. Defaults\n * to document.body\n * @param isAlphaOptional If true, the alpha value will be dropped from resolved\n * 8 character hex colors if it is 'ff'. Defaults to false.\n */\nexport function resolveCssVariablesInRecord<T extends Record<string, string>>(\n record: T,\n targetElement: HTMLElement = document.body,\n isAlphaOptional = false\n): T {\n const perfStart = performance.now();\n\n // Add a temporary div to attach temp css variables to\n const tmpPropEl = document.createElement('div');\n targetElement.appendChild(tmpPropEl);\n\n const varExpressions = [...extractDistinctCssVariableExpressions(record)];\n\n // Set temporary css variables for resolving var expressions\n varExpressions.forEach((varExpression, i) => {\n const tmpPropKey = `--${TMP_CSS_PROP_PREFIX}-${i}`;\n tmpPropEl.style.setProperty(tmpPropKey, varExpression);\n });\n\n const result = {} as T;\n\n const computedStyle = window.getComputedStyle(tmpPropEl);\n\n const resolver = (varExpression: string): string => {\n const tmpPropKey = `--${TMP_CSS_PROP_PREFIX}-${varExpressions.indexOf(\n varExpression\n )}`;\n\n const resolved = computedStyle.getPropertyValue(tmpPropKey);\n\n return ColorUtils.normalizeCssColor(resolved, isAlphaOptional);\n };\n\n // Resolve the temporary css variables\n Object.entries(record).forEach(([key, value]) => {\n result[key as keyof T] = resolveCssVariablesInString(\n resolver,\n value\n ) as T[keyof T];\n });\n\n // Remove the temporary css variables\n tmpPropEl.remove();\n\n log.debug('Resolved css variables', performance.now() - perfStart, 'ms');\n\n return result;\n}\n\n/**\n * Resolve css variable expressions in the given string using the\n * given resolver and replace the original expressions with the resolved values.\n *\n * @param resolver Function that can resolve a css variable expression\n * @param value Value that may contain css variable expressions\n */\nexport function resolveCssVariablesInString(\n resolver: VarExpressionResolver,\n value: string\n): string {\n const result: string[] = [];\n let i = 0;\n getExpressionRanges(value).forEach(([start, end]) => {\n if (i < start) {\n result.push(value.substring(i, start));\n i += start - i;\n }\n\n const expression = value.substring(start, end + 1);\n\n result.push(\n expression.includes(CSS_VAR_EXPRESSION_PREFIX)\n ? resolver(expression)\n : expression\n );\n\n i += end - start + 1;\n });\n\n if (result.length === 0) {\n return value;\n }\n\n return result.join('');\n}\n\n/**\n * Store theme preload data in local storage.\n * @param preloadData The preload data to set\n */\nexport function setThemePreloadData(preloadData: ThemePreloadData): void {\n localStorage.setItem(\n THEME_CACHE_LOCAL_STORAGE_KEY,\n JSON.stringify(preloadData)\n );\n}\n\n/**\n * Derive unique theme key from plugin root path and theme name.\n * @param pluginName The root path of the plugin\n * @param themeName The name of the theme\n */\nexport function getThemeKey(pluginName: string, themeName: string): string {\n return `${pluginName}_${themeName}`;\n}\n\n/**\n * Preload minimal theme variables from the cache.\n * @defaultPreloadValues Optional default values to use if a preload variable is not set.\n */\nexport function preloadTheme(\n defaultPreloadValues: Record<string, string> = DEFAULT_PRELOAD_DATA_VARIABLES\n): void {\n const previousPreloadStyleContent =\n getThemePreloadData()?.preloadStyleContent;\n\n const defaultPreloadStyleContent =\n calculatePreloadStyleContent(defaultPreloadValues);\n\n log.debug('Preloading theme content:', {\n defaultPreloadStyleContent,\n previousPreloadStyleContent,\n });\n\n createPreloadStyleElement(\n 'theme-preload-defaults',\n defaultPreloadStyleContent\n );\n\n // Any preload variables that were saved by last theme load should override\n // the defaults\n if (previousPreloadStyleContent != null) {\n createPreloadStyleElement(\n 'theme-preload-previous',\n previousPreloadStyleContent\n );\n }\n}\n\n/**\n * Inline SVGs cannot depend on dynamic CSS variables, so we have to statically\n * update them if we want to change their color.\n *\n * This function:\n * 1. Clears any previous overrides\n * 2. Resolves CSS variables containing inline SVG urls\n * 3. Resolves mapped color variables and replaces the `fill='...'` attribute with the result\n * 4. Sets the original CSS variable to the new replaced value\n *\n * Note that it is preferable to use inline SVGs as background-mask values and\n * just change the background color instead of relying on this util, but this\n * is not always possible. e.g. <select> elements don't support pseudo elements,\n * so there's not a good way to set icons via masks.\n * @param defaultValues Default values to use if a variable is not set.\n */\nexport function overrideSVGFillColors(\n defaultValues: Record<string, string>\n): void {\n const resolveVar = createCssVariableResolver(document.body, defaultValues);\n\n Object.entries(SVG_ICON_MANUAL_COLOR_MAP).forEach(([key, value]) => {\n // Clear any previous override so that our variables get resolved against the\n // actual svg content provided by the active themes and not from a previous\n // override\n document.body.style.removeProperty(key);\n\n const svgContent = resolveVar(key as ThemeIconsRequiringManualColorChanges);\n const fillColor = resolveVar(value as ThemePreloadColorVariable);\n\n const newSVGContent = replaceSVGFillColor(svgContent, fillColor);\n\n // This will take precedence over any values for the variable provided by\n // the active themes\n document.body.style.setProperty(key, newSVGContent);\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/components",
3
- "version": "0.58.1-beta.5+a3bea733",
3
+ "version": "0.58.1-beta.9+ed41c424",
4
4
  "description": "Deephaven React component library",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@adobe/react-spectrum": "^3.29.0",
28
- "@deephaven/icons": "^0.58.1-beta.5+a3bea733",
29
- "@deephaven/log": "^0.58.1-beta.5+a3bea733",
30
- "@deephaven/react-hooks": "^0.58.1-beta.5+a3bea733",
31
- "@deephaven/utils": "^0.58.1-beta.5+a3bea733",
28
+ "@deephaven/icons": "^0.58.1-beta.9+ed41c424",
29
+ "@deephaven/log": "^0.58.1-beta.9+ed41c424",
30
+ "@deephaven/react-hooks": "^0.58.1-beta.9+ed41c424",
31
+ "@deephaven/utils": "^0.58.1-beta.9+ed41c424",
32
32
  "@fortawesome/fontawesome-svg-core": "^6.2.1",
33
33
  "@fortawesome/react-fontawesome": "^0.2.0",
34
34
  "@react-spectrum/theme-default": "^3.5.1",
@@ -52,7 +52,7 @@
52
52
  "react-dom": "^17.x"
53
53
  },
54
54
  "devDependencies": {
55
- "@deephaven/mocks": "^0.58.1-beta.5+a3bea733"
55
+ "@deephaven/mocks": "^0.58.1-beta.9+ed41c424"
56
56
  },
57
57
  "files": [
58
58
  "dist",
@@ -66,5 +66,5 @@
66
66
  "publishConfig": {
67
67
  "access": "public"
68
68
  },
69
- "gitHead": "a3bea733b97dfafe33a54623ef8e8e04cb5aa44e"
69
+ "gitHead": "ed41c424de75fcba8751a70b54a189957f979e97"
70
70
  }