@tanstack/react-query-devtools 4.39.0 → 4.39.2

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.
Files changed (78) hide show
  1. package/build/lib/Explorer.esm.js +264 -0
  2. package/build/lib/Explorer.esm.js.map +1 -0
  3. package/build/lib/Explorer.js +302 -0
  4. package/build/lib/Explorer.js.map +1 -0
  5. package/build/lib/Explorer.mjs +264 -0
  6. package/build/lib/Explorer.mjs.map +1 -0
  7. package/build/lib/Logo.esm.js +32 -0
  8. package/build/lib/Logo.esm.js.map +1 -0
  9. package/build/lib/Logo.js +56 -0
  10. package/build/lib/Logo.js.map +1 -0
  11. package/build/lib/Logo.mjs +32 -0
  12. package/build/lib/Logo.mjs.map +1 -0
  13. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js +19 -0
  14. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +1 -0
  15. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +23 -0
  16. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  17. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs +19 -0
  18. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs.map +1 -0
  19. package/build/lib/devtools.esm.js +925 -0
  20. package/build/lib/devtools.esm.js.map +1 -0
  21. package/build/lib/devtools.js +949 -0
  22. package/build/lib/devtools.js.map +1 -0
  23. package/build/lib/devtools.mjs +925 -0
  24. package/build/lib/devtools.mjs.map +1 -0
  25. package/build/lib/index.esm.js +12 -0
  26. package/build/lib/index.esm.js.map +1 -0
  27. package/build/lib/index.js +17 -0
  28. package/build/lib/index.js.map +1 -0
  29. package/build/lib/index.mjs +12 -0
  30. package/build/lib/index.mjs.map +1 -0
  31. package/build/lib/index.prod.d.ts +4 -0
  32. package/build/lib/index.prod.esm.js +1604 -0
  33. package/build/lib/index.prod.esm.js.map +1 -0
  34. package/build/lib/index.prod.js +1631 -0
  35. package/build/lib/index.prod.js.map +1 -0
  36. package/build/lib/index.prod.mjs +1604 -0
  37. package/build/lib/index.prod.mjs.map +1 -0
  38. package/build/lib/screenreader.esm.js +17 -0
  39. package/build/lib/screenreader.esm.js.map +1 -0
  40. package/build/lib/screenreader.js +41 -0
  41. package/build/lib/screenreader.js.map +1 -0
  42. package/build/lib/screenreader.mjs +17 -0
  43. package/build/lib/screenreader.mjs.map +1 -0
  44. package/build/lib/styledComponents.esm.js +94 -0
  45. package/build/lib/styledComponents.esm.js.map +1 -0
  46. package/build/lib/styledComponents.js +105 -0
  47. package/build/lib/styledComponents.js.map +1 -0
  48. package/build/lib/styledComponents.mjs +94 -0
  49. package/build/lib/styledComponents.mjs.map +1 -0
  50. package/build/lib/theme.esm.js +33 -0
  51. package/build/lib/theme.esm.js.map +1 -0
  52. package/build/lib/theme.js +59 -0
  53. package/build/lib/theme.js.map +1 -0
  54. package/build/lib/theme.mjs +33 -0
  55. package/build/lib/theme.mjs.map +1 -0
  56. package/build/lib/useLocalStorage.esm.js +47 -0
  57. package/build/lib/useLocalStorage.esm.js.map +1 -0
  58. package/build/lib/useLocalStorage.js +71 -0
  59. package/build/lib/useLocalStorage.js.map +1 -0
  60. package/build/lib/useLocalStorage.mjs +47 -0
  61. package/build/lib/useLocalStorage.mjs.map +1 -0
  62. package/build/lib/useMediaQuery.esm.js +36 -0
  63. package/build/lib/useMediaQuery.esm.js.map +1 -0
  64. package/build/lib/useMediaQuery.js +60 -0
  65. package/build/lib/useMediaQuery.js.map +1 -0
  66. package/build/lib/useMediaQuery.mjs +36 -0
  67. package/build/lib/useMediaQuery.mjs.map +1 -0
  68. package/build/lib/utils.esm.js +186 -0
  69. package/build/lib/utils.esm.js.map +1 -0
  70. package/build/lib/utils.js +226 -0
  71. package/build/lib/utils.js.map +1 -0
  72. package/build/lib/utils.mjs +186 -0
  73. package/build/lib/utils.mjs.map +1 -0
  74. package/build/umd/index.development.js +3531 -0
  75. package/build/umd/index.development.js.map +1 -0
  76. package/build/umd/index.production.js +2 -0
  77. package/build/umd/index.production.js.map +1 -0
  78. package/package.json +3 -3
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n["default"] = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ function useMediaQuery(query) {
28
+ // Keep track of the preference in state, start with the current match
29
+ const [isMatch, setIsMatch] = React__namespace.useState(() => {
30
+ if (typeof window !== 'undefined') {
31
+ return window.matchMedia(query).matches;
32
+ }
33
+
34
+ return;
35
+ }); // Watch for changes
36
+
37
+ React__namespace.useEffect(() => {
38
+ if (typeof window !== 'undefined') {
39
+ // Create a matcher
40
+ const matcher = window.matchMedia(query); // Create our handler
41
+
42
+ const onChange = ({
43
+ matches
44
+ }) => setIsMatch(matches); // Listen for changes
45
+
46
+
47
+ matcher.addListener(onChange);
48
+ return () => {
49
+ // Stop listening for changes
50
+ matcher.removeListener(onChange);
51
+ };
52
+ }
53
+
54
+ return;
55
+ }, [isMatch, query, setIsMatch]);
56
+ return isMatch;
57
+ }
58
+
59
+ exports["default"] = useMediaQuery;
60
+ //# sourceMappingURL=useMediaQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaQuery.js","sources":["../../src/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react'\n\nexport default function useMediaQuery(query: string): boolean | undefined {\n // Keep track of the preference in state, start with the current match\n const [isMatch, setIsMatch] = React.useState(() => {\n if (typeof window !== 'undefined') {\n return window.matchMedia(query).matches\n }\n return\n })\n\n // Watch for changes\n React.useEffect(() => {\n if (typeof window !== 'undefined') {\n // Create a matcher\n const matcher = window.matchMedia(query)\n\n // Create our handler\n const onChange = ({ matches }: { matches: boolean }) =>\n setIsMatch(matches)\n\n // Listen for changes\n matcher.addListener(onChange)\n\n return () => {\n // Stop listening for changes\n matcher.removeListener(onChange)\n }\n }\n return\n }, [isMatch, query, setIsMatch])\n\n return isMatch\n}\n"],"names":["useMediaQuery","query","isMatch","setIsMatch","React","useState","window","matchMedia","matches","useEffect","matcher","onChange","addListener","removeListener"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEe,SAASA,aAAT,CAAuBC,KAAvB,EAA2D;AACxE;EACA,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwBC,gBAAK,CAACC,QAAN,CAAe,MAAM;AACjD,IAAA,IAAI,OAAOC,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAA,OAAOA,MAAM,CAACC,UAAP,CAAkBN,KAAlB,EAAyBO,OAAhC,CAAA;AACD,KAAA;;AACD,IAAA,OAAA;GAJ4B,CAA9B,CAFwE;;EAUxEJ,gBAAK,CAACK,SAAN,CAAgB,MAAM;AACpB,IAAA,IAAI,OAAOH,MAAP,KAAkB,WAAtB,EAAmC;AACjC;MACA,MAAMI,OAAO,GAAGJ,MAAM,CAACC,UAAP,CAAkBN,KAAlB,CAAhB,CAFiC;;MAKjC,MAAMU,QAAQ,GAAG,CAAC;AAAEH,QAAAA,OAAAA;AAAF,OAAD,KACfL,UAAU,CAACK,OAAD,CADZ,CALiC;;;MASjCE,OAAO,CAACE,WAAR,CAAoBD,QAApB,CAAA,CAAA;AAEA,MAAA,OAAO,MAAM;AACX;QACAD,OAAO,CAACG,cAAR,CAAuBF,QAAvB,CAAA,CAAA;OAFF,CAAA;AAID,KAAA;;AACD,IAAA,OAAA;AACD,GAlBD,EAkBG,CAACT,OAAD,EAAUD,KAAV,EAAiBE,UAAjB,CAlBH,CAAA,CAAA;AAoBA,EAAA,OAAOD,OAAP,CAAA;AACD;;;;"}
@@ -0,0 +1,36 @@
1
+ import * as React from 'react';
2
+
3
+ function useMediaQuery(query) {
4
+ // Keep track of the preference in state, start with the current match
5
+ const [isMatch, setIsMatch] = React.useState(() => {
6
+ if (typeof window !== 'undefined') {
7
+ return window.matchMedia(query).matches;
8
+ }
9
+
10
+ return;
11
+ }); // Watch for changes
12
+
13
+ React.useEffect(() => {
14
+ if (typeof window !== 'undefined') {
15
+ // Create a matcher
16
+ const matcher = window.matchMedia(query); // Create our handler
17
+
18
+ const onChange = ({
19
+ matches
20
+ }) => setIsMatch(matches); // Listen for changes
21
+
22
+
23
+ matcher.addListener(onChange);
24
+ return () => {
25
+ // Stop listening for changes
26
+ matcher.removeListener(onChange);
27
+ };
28
+ }
29
+
30
+ return;
31
+ }, [isMatch, query, setIsMatch]);
32
+ return isMatch;
33
+ }
34
+
35
+ export { useMediaQuery as default };
36
+ //# sourceMappingURL=useMediaQuery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaQuery.mjs","sources":["../../src/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react'\n\nexport default function useMediaQuery(query: string): boolean | undefined {\n // Keep track of the preference in state, start with the current match\n const [isMatch, setIsMatch] = React.useState(() => {\n if (typeof window !== 'undefined') {\n return window.matchMedia(query).matches\n }\n return\n })\n\n // Watch for changes\n React.useEffect(() => {\n if (typeof window !== 'undefined') {\n // Create a matcher\n const matcher = window.matchMedia(query)\n\n // Create our handler\n const onChange = ({ matches }: { matches: boolean }) =>\n setIsMatch(matches)\n\n // Listen for changes\n matcher.addListener(onChange)\n\n return () => {\n // Stop listening for changes\n matcher.removeListener(onChange)\n }\n }\n return\n }, [isMatch, query, setIsMatch])\n\n return isMatch\n}\n"],"names":["useMediaQuery","query","isMatch","setIsMatch","React","useState","window","matchMedia","matches","useEffect","matcher","onChange","addListener","removeListener"],"mappings":";;AAEe,SAASA,aAAT,CAAuBC,KAAvB,EAA2D;AACxE;EACA,MAAM,CAACC,OAAD,EAAUC,UAAV,IAAwBC,KAAK,CAACC,QAAN,CAAe,MAAM;AACjD,IAAA,IAAI,OAAOC,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAA,OAAOA,MAAM,CAACC,UAAP,CAAkBN,KAAlB,EAAyBO,OAAhC,CAAA;AACD,KAAA;;AACD,IAAA,OAAA;GAJ4B,CAA9B,CAFwE;;EAUxEJ,KAAK,CAACK,SAAN,CAAgB,MAAM;AACpB,IAAA,IAAI,OAAOH,MAAP,KAAkB,WAAtB,EAAmC;AACjC;MACA,MAAMI,OAAO,GAAGJ,MAAM,CAACC,UAAP,CAAkBN,KAAlB,CAAhB,CAFiC;;MAKjC,MAAMU,QAAQ,GAAG,CAAC;AAAEH,QAAAA,OAAAA;AAAF,OAAD,KACfL,UAAU,CAACK,OAAD,CADZ,CALiC;;;MASjCE,OAAO,CAACE,WAAR,CAAoBD,QAApB,CAAA,CAAA;AAEA,MAAA,OAAO,MAAM;AACX;QACAD,OAAO,CAACG,cAAR,CAAuBF,QAAvB,CAAA,CAAA;OAFF,CAAA;AAID,KAAA;;AACD,IAAA,OAAA;AACD,GAlBD,EAkBG,CAACT,OAAD,EAAUD,KAAV,EAAiBE,UAAjB,CAlBH,CAAA,CAAA;AAoBA,EAAA,OAAOD,OAAP,CAAA;AACD;;;;"}
@@ -0,0 +1,186 @@
1
+ import * as React from 'react';
2
+ import SuperJSON from 'superjson';
3
+ import { useTheme } from './theme.esm.js';
4
+ import useMediaQuery from './useMediaQuery.esm.js';
5
+
6
+ function getQueryStatusColor({
7
+ queryState,
8
+ observerCount,
9
+ isStale,
10
+ theme
11
+ }) {
12
+ return queryState.fetchStatus === 'fetching' ? theme.active : !observerCount ? theme.gray : queryState.fetchStatus === 'paused' ? theme.paused : isStale ? theme.warning : theme.success;
13
+ }
14
+ function getQueryStatusLabel(query) {
15
+ return query.state.fetchStatus === 'fetching' ? 'fetching' : !query.getObserversCount() ? 'inactive' : query.state.fetchStatus === 'paused' ? 'paused' : query.isStale() ? 'stale' : 'fresh';
16
+ }
17
+ function styled(type, newStyles, queries = {}) {
18
+ return /*#__PURE__*/React.forwardRef(({
19
+ style,
20
+ ...rest
21
+ }, ref) => {
22
+ const theme = useTheme();
23
+ const mediaStyles = Object.entries(queries).reduce((current, [key, value]) => {
24
+ // eslint-disable-next-line react-hooks/rules-of-hooks
25
+ return useMediaQuery(key) ? { ...current,
26
+ ...(typeof value === 'function' ? value(rest, theme) : value)
27
+ } : current;
28
+ }, {});
29
+ return /*#__PURE__*/React.createElement(type, { ...rest,
30
+ style: { ...(typeof newStyles === 'function' ? newStyles(rest, theme) : newStyles),
31
+ ...style,
32
+ ...mediaStyles
33
+ },
34
+ ref
35
+ });
36
+ });
37
+ }
38
+ function useIsMounted() {
39
+ const mountedRef = React.useRef(false);
40
+ const isMounted = React.useCallback(() => mountedRef.current, []);
41
+ React.useEffect(() => {
42
+ mountedRef.current = true;
43
+ return () => {
44
+ mountedRef.current = false;
45
+ };
46
+ }, []);
47
+ return isMounted;
48
+ }
49
+ /**
50
+ * Displays a string regardless the type of the data
51
+ * @param {unknown} value Value to be stringified
52
+ * @param {boolean} beautify Formats json to multiline
53
+ */
54
+
55
+ const displayValue = (value, beautify = false) => {
56
+ const {
57
+ json
58
+ } = SuperJSON.serialize(value);
59
+ return JSON.stringify(json, null, beautify ? 2 : undefined);
60
+ }; // Sorting functions
61
+
62
+ const getStatusRank = q => q.state.fetchStatus !== 'idle' ? 0 : !q.getObserversCount() ? 3 : q.isStale() ? 2 : 1;
63
+
64
+ const queryHashSort = (a, b) => a.queryHash.localeCompare(b.queryHash);
65
+
66
+ const dateSort = (a, b) => a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1;
67
+
68
+ const statusAndDateSort = (a, b) => {
69
+ if (getStatusRank(a) === getStatusRank(b)) {
70
+ return dateSort(a, b);
71
+ }
72
+
73
+ return getStatusRank(a) > getStatusRank(b) ? 1 : -1;
74
+ };
75
+
76
+ const sortFns = {
77
+ 'Status > Last Updated': statusAndDateSort,
78
+ 'Query Hash': queryHashSort,
79
+ 'Last Updated': dateSort
80
+ };
81
+ const minPanelSize = 70;
82
+ const defaultPanelSize = 500;
83
+ const sides = {
84
+ top: 'bottom',
85
+ bottom: 'top',
86
+ left: 'right',
87
+ right: 'left'
88
+ };
89
+
90
+ /**
91
+ * Check if the given side is vertical (left/right)
92
+ */
93
+ function isVerticalSide(side) {
94
+ return ['left', 'right'].includes(side);
95
+ }
96
+ /**
97
+ * Get the opposite side, eg 'left' => 'right'. 'top' => 'bottom', etc
98
+ */
99
+
100
+ function getOppositeSide(side) {
101
+ return sides[side];
102
+ }
103
+ /**
104
+ * Given as css prop it will return a sided css prop based on a given side
105
+ * Example given `border` and `right` it return `borderRight`
106
+ */
107
+
108
+ function getSidedProp(prop, side) {
109
+ return "" + prop + (side.charAt(0).toUpperCase() + side.slice(1));
110
+ }
111
+ function getSidePanelStyle({
112
+ position = 'bottom',
113
+ height,
114
+ width,
115
+ devtoolsTheme,
116
+ isOpen,
117
+ isResizing,
118
+ panelStyle
119
+ }) {
120
+ const oppositeSide = getOppositeSide(position);
121
+ const borderSide = getSidedProp('border', oppositeSide);
122
+ const isVertical = isVerticalSide(position);
123
+ return { ...panelStyle,
124
+ direction: 'ltr',
125
+ position: 'fixed',
126
+ [position]: 0,
127
+ [borderSide]: "1px solid " + devtoolsTheme.gray,
128
+ transformOrigin: oppositeSide,
129
+ boxShadow: '0 0 20px rgba(0,0,0,.3)',
130
+ zIndex: 99999,
131
+ // visibility will be toggled after transitions, but set initial state here
132
+ visibility: isOpen ? 'visible' : 'hidden',
133
+ ...(isResizing ? {
134
+ transition: "none"
135
+ } : {
136
+ transition: "all .2s ease"
137
+ }),
138
+ ...(isOpen ? {
139
+ opacity: 1,
140
+ pointerEvents: 'all',
141
+ transform: isVertical ? "translateX(0) scale(1)" : "translateY(0) scale(1)"
142
+ } : {
143
+ opacity: 0,
144
+ pointerEvents: 'none',
145
+ transform: isVertical ? "translateX(15px) scale(1.02)" : "translateY(15px) scale(1.02)"
146
+ }),
147
+ ...(isVertical ? {
148
+ top: 0,
149
+ height: '100vh',
150
+ maxWidth: '90%',
151
+ width: typeof width === 'number' && width >= minPanelSize ? width : defaultPanelSize
152
+ } : {
153
+ left: 0,
154
+ width: '100%',
155
+ maxHeight: '90%',
156
+ height: typeof height === 'number' && height >= minPanelSize ? height : defaultPanelSize
157
+ })
158
+ };
159
+ }
160
+ /**
161
+ * Get resize handle style based on a given side
162
+ */
163
+
164
+ function getResizeHandleStyle(position = 'bottom') {
165
+ const isVertical = isVerticalSide(position);
166
+ const oppositeSide = getOppositeSide(position);
167
+ const marginSide = getSidedProp('margin', oppositeSide);
168
+ return {
169
+ position: 'absolute',
170
+ cursor: isVertical ? 'col-resize' : 'row-resize',
171
+ zIndex: 100000,
172
+ [oppositeSide]: 0,
173
+ [marginSide]: "-4px",
174
+ ...(isVertical ? {
175
+ top: 0,
176
+ height: '100%',
177
+ width: '4px'
178
+ } : {
179
+ width: '100%',
180
+ height: '4px'
181
+ })
182
+ };
183
+ }
184
+
185
+ export { defaultPanelSize, displayValue, getOppositeSide, getQueryStatusColor, getQueryStatusLabel, getResizeHandleStyle, getSidePanelStyle, getSidedProp, isVerticalSide, minPanelSize, sides, sortFns, styled, useIsMounted };
186
+ //# sourceMappingURL=utils.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.esm.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as React from 'react'\nimport SuperJSON from 'superjson'\n\nimport { useTheme } from './theme'\nimport useMediaQuery from './useMediaQuery'\nimport type { Theme } from './theme'\nimport type { Query } from '@tanstack/react-query'\n\ntype StyledComponent<T> = T extends 'button'\n ? React.DetailedHTMLProps<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n >\n : T extends 'input'\n ? React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n >\n : T extends 'select'\n ? React.DetailedHTMLProps<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n HTMLSelectElement\n >\n : T extends keyof HTMLElementTagNameMap\n ? React.HTMLAttributes<HTMLElementTagNameMap[T]>\n : never\n\nexport function getQueryStatusColor({\n queryState,\n observerCount,\n isStale,\n theme,\n}: {\n queryState: Query['state']\n observerCount: number\n isStale: boolean\n theme: Theme\n}) {\n return queryState.fetchStatus === 'fetching'\n ? theme.active\n : !observerCount\n ? theme.gray\n : queryState.fetchStatus === 'paused'\n ? theme.paused\n : isStale\n ? theme.warning\n : theme.success\n}\n\nexport function getQueryStatusLabel(query: Query) {\n return query.state.fetchStatus === 'fetching'\n ? 'fetching'\n : !query.getObserversCount()\n ? 'inactive'\n : query.state.fetchStatus === 'paused'\n ? 'paused'\n : query.isStale()\n ? 'stale'\n : 'fresh'\n}\n\ntype Styles =\n | React.CSSProperties\n | ((props: Record<string, any>, theme: Theme) => React.CSSProperties)\n\nexport function styled<T extends keyof HTMLElementTagNameMap>(\n type: T,\n newStyles: Styles,\n queries: Record<string, Styles> = {},\n) {\n return React.forwardRef<HTMLElementTagNameMap[T], StyledComponent<T>>(\n ({ style, ...rest }, ref) => {\n const theme = useTheme()\n\n const mediaStyles = Object.entries(queries).reduce(\n (current, [key, value]) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMediaQuery(key)\n ? {\n ...current,\n ...(typeof value === 'function' ? value(rest, theme) : value),\n }\n : current\n },\n {},\n )\n\n return React.createElement(type, {\n ...rest,\n style: {\n ...(typeof newStyles === 'function'\n ? newStyles(rest, theme)\n : newStyles),\n ...style,\n ...mediaStyles,\n },\n ref,\n })\n },\n )\n}\n\nexport function useIsMounted() {\n const mountedRef = React.useRef(false)\n const isMounted = React.useCallback(() => mountedRef.current, [])\n\n React.useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n return isMounted\n}\n\n/**\n * Displays a string regardless the type of the data\n * @param {unknown} value Value to be stringified\n * @param {boolean} beautify Formats json to multiline\n */\nexport const displayValue = (value: unknown, beautify: boolean = false) => {\n const { json } = SuperJSON.serialize(value)\n\n return JSON.stringify(json, null, beautify ? 2 : undefined)\n}\n\n// Sorting functions\ntype SortFn = (a: Query, b: Query) => number\n\nconst getStatusRank = (q: Query) =>\n q.state.fetchStatus !== 'idle'\n ? 0\n : !q.getObserversCount()\n ? 3\n : q.isStale()\n ? 2\n : 1\n\nconst queryHashSort: SortFn = (a, b) => a.queryHash.localeCompare(b.queryHash)\n\nconst dateSort: SortFn = (a, b) =>\n a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1\n\nconst statusAndDateSort: SortFn = (a, b) => {\n if (getStatusRank(a) === getStatusRank(b)) {\n return dateSort(a, b)\n }\n\n return getStatusRank(a) > getStatusRank(b) ? 1 : -1\n}\n\nexport const sortFns: Record<string, SortFn> = {\n 'Status > Last Updated': statusAndDateSort,\n 'Query Hash': queryHashSort,\n 'Last Updated': dateSort,\n}\n\nexport const minPanelSize = 70\nexport const defaultPanelSize = 500\nexport const sides: Record<Side, Side> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n}\n\nexport type Corner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\nexport type Side = 'left' | 'right' | 'top' | 'bottom'\n/**\n * Check if the given side is vertical (left/right)\n */\nexport function isVerticalSide(side: Side) {\n return ['left', 'right'].includes(side)\n}\n/**\n * Get the opposite side, eg 'left' => 'right'. 'top' => 'bottom', etc\n */\nexport function getOppositeSide(side: Side): Side {\n return sides[side]\n}\n/**\n * Given as css prop it will return a sided css prop based on a given side\n * Example given `border` and `right` it return `borderRight`\n */\nexport function getSidedProp<T extends string>(prop: T, side: Side) {\n return `${prop}${\n side.charAt(0).toUpperCase() + side.slice(1)\n }` as `${T}${Capitalize<Side>}`\n}\n\nexport interface SidePanelStyleOptions {\n /**\n * Position of the panel\n * Defaults to 'bottom'\n */\n position?: Side\n /**\n * Staring height for the panel, it is set if the position is horizontal eg 'top' or 'bottom'\n * Defaults to 500\n */\n height?: number\n /**\n * Staring width for the panel, it is set if the position is vertical eg 'left' or 'right'\n * Defaults to 500\n */\n width?: number\n /**\n * RQ devtools theme\n */\n devtoolsTheme: Theme\n /**\n * Sets the correct transition and visibility styles\n */\n isOpen?: boolean\n /**\n * If the panel is resizing set to true to apply the correct transition styles\n */\n isResizing?: boolean\n /**\n * Extra panel style passed by the user\n */\n panelStyle?: React.CSSProperties\n}\n\nexport function getSidePanelStyle({\n position = 'bottom',\n height,\n width,\n devtoolsTheme,\n isOpen,\n isResizing,\n panelStyle,\n}: SidePanelStyleOptions): React.CSSProperties {\n const oppositeSide = getOppositeSide(position)\n const borderSide = getSidedProp('border', oppositeSide)\n const isVertical = isVerticalSide(position)\n\n return {\n ...panelStyle,\n direction: 'ltr',\n position: 'fixed',\n [position]: 0,\n [borderSide]: `1px solid ${devtoolsTheme.gray}`,\n transformOrigin: oppositeSide,\n boxShadow: '0 0 20px rgba(0,0,0,.3)',\n zIndex: 99999,\n // visibility will be toggled after transitions, but set initial state here\n visibility: isOpen ? 'visible' : 'hidden',\n ...(isResizing\n ? {\n transition: `none`,\n }\n : { transition: `all .2s ease` }),\n ...(isOpen\n ? {\n opacity: 1,\n pointerEvents: 'all',\n transform: isVertical\n ? `translateX(0) scale(1)`\n : `translateY(0) scale(1)`,\n }\n : {\n opacity: 0,\n pointerEvents: 'none',\n transform: isVertical\n ? `translateX(15px) scale(1.02)`\n : `translateY(15px) scale(1.02)`,\n }),\n ...(isVertical\n ? {\n top: 0,\n height: '100vh',\n maxWidth: '90%',\n width:\n typeof width === 'number' && width >= minPanelSize\n ? width\n : defaultPanelSize,\n }\n : {\n left: 0,\n width: '100%',\n maxHeight: '90%',\n height:\n typeof height === 'number' && height >= minPanelSize\n ? height\n : defaultPanelSize,\n }),\n }\n}\n\n/**\n * Get resize handle style based on a given side\n */\nexport function getResizeHandleStyle(\n position: Side = 'bottom',\n): React.CSSProperties {\n const isVertical = isVerticalSide(position)\n const oppositeSide = getOppositeSide(position)\n const marginSide = getSidedProp('margin', oppositeSide)\n\n return {\n position: 'absolute',\n cursor: isVertical ? 'col-resize' : 'row-resize',\n zIndex: 100000,\n [oppositeSide]: 0,\n [marginSide]: `-4px`,\n ...(isVertical\n ? {\n top: 0,\n height: '100%',\n width: '4px',\n }\n : {\n width: '100%',\n height: '4px',\n }),\n }\n}\n"],"names":["getQueryStatusColor","queryState","observerCount","isStale","theme","fetchStatus","active","gray","paused","warning","success","getQueryStatusLabel","query","state","getObserversCount","styled","type","newStyles","queries","React","forwardRef","style","rest","ref","useTheme","mediaStyles","Object","entries","reduce","current","key","value","useMediaQuery","createElement","useIsMounted","mountedRef","useRef","isMounted","useCallback","useEffect","displayValue","beautify","json","SuperJSON","serialize","JSON","stringify","undefined","getStatusRank","q","queryHashSort","a","b","queryHash","localeCompare","dateSort","dataUpdatedAt","statusAndDateSort","sortFns","minPanelSize","defaultPanelSize","sides","top","bottom","left","right","isVerticalSide","side","includes","getOppositeSide","getSidedProp","prop","charAt","toUpperCase","slice","getSidePanelStyle","position","height","width","devtoolsTheme","isOpen","isResizing","panelStyle","oppositeSide","borderSide","isVertical","direction","transformOrigin","boxShadow","zIndex","visibility","transition","opacity","pointerEvents","transform","maxWidth","maxHeight","getResizeHandleStyle","marginSide","cursor"],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var SuperJSON = require('superjson');
7
+ var theme = require('./theme.js');
8
+ var useMediaQuery = require('./useMediaQuery.js');
9
+
10
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n["default"] = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
+ var SuperJSON__default = /*#__PURE__*/_interopDefaultLegacy(SuperJSON);
32
+
33
+ function getQueryStatusColor({
34
+ queryState,
35
+ observerCount,
36
+ isStale,
37
+ theme
38
+ }) {
39
+ return queryState.fetchStatus === 'fetching' ? theme.active : !observerCount ? theme.gray : queryState.fetchStatus === 'paused' ? theme.paused : isStale ? theme.warning : theme.success;
40
+ }
41
+ function getQueryStatusLabel(query) {
42
+ return query.state.fetchStatus === 'fetching' ? 'fetching' : !query.getObserversCount() ? 'inactive' : query.state.fetchStatus === 'paused' ? 'paused' : query.isStale() ? 'stale' : 'fresh';
43
+ }
44
+ function styled(type, newStyles, queries = {}) {
45
+ return /*#__PURE__*/React__namespace.forwardRef(({
46
+ style,
47
+ ...rest
48
+ }, ref) => {
49
+ const theme$1 = theme.useTheme();
50
+ const mediaStyles = Object.entries(queries).reduce((current, [key, value]) => {
51
+ // eslint-disable-next-line react-hooks/rules-of-hooks
52
+ return useMediaQuery["default"](key) ? { ...current,
53
+ ...(typeof value === 'function' ? value(rest, theme$1) : value)
54
+ } : current;
55
+ }, {});
56
+ return /*#__PURE__*/React__namespace.createElement(type, { ...rest,
57
+ style: { ...(typeof newStyles === 'function' ? newStyles(rest, theme$1) : newStyles),
58
+ ...style,
59
+ ...mediaStyles
60
+ },
61
+ ref
62
+ });
63
+ });
64
+ }
65
+ function useIsMounted() {
66
+ const mountedRef = React__namespace.useRef(false);
67
+ const isMounted = React__namespace.useCallback(() => mountedRef.current, []);
68
+ React__namespace.useEffect(() => {
69
+ mountedRef.current = true;
70
+ return () => {
71
+ mountedRef.current = false;
72
+ };
73
+ }, []);
74
+ return isMounted;
75
+ }
76
+ /**
77
+ * Displays a string regardless the type of the data
78
+ * @param {unknown} value Value to be stringified
79
+ * @param {boolean} beautify Formats json to multiline
80
+ */
81
+
82
+ const displayValue = (value, beautify = false) => {
83
+ const {
84
+ json
85
+ } = SuperJSON__default["default"].serialize(value);
86
+ return JSON.stringify(json, null, beautify ? 2 : undefined);
87
+ }; // Sorting functions
88
+
89
+ const getStatusRank = q => q.state.fetchStatus !== 'idle' ? 0 : !q.getObserversCount() ? 3 : q.isStale() ? 2 : 1;
90
+
91
+ const queryHashSort = (a, b) => a.queryHash.localeCompare(b.queryHash);
92
+
93
+ const dateSort = (a, b) => a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1;
94
+
95
+ const statusAndDateSort = (a, b) => {
96
+ if (getStatusRank(a) === getStatusRank(b)) {
97
+ return dateSort(a, b);
98
+ }
99
+
100
+ return getStatusRank(a) > getStatusRank(b) ? 1 : -1;
101
+ };
102
+
103
+ const sortFns = {
104
+ 'Status > Last Updated': statusAndDateSort,
105
+ 'Query Hash': queryHashSort,
106
+ 'Last Updated': dateSort
107
+ };
108
+ const minPanelSize = 70;
109
+ const defaultPanelSize = 500;
110
+ const sides = {
111
+ top: 'bottom',
112
+ bottom: 'top',
113
+ left: 'right',
114
+ right: 'left'
115
+ };
116
+
117
+ /**
118
+ * Check if the given side is vertical (left/right)
119
+ */
120
+ function isVerticalSide(side) {
121
+ return ['left', 'right'].includes(side);
122
+ }
123
+ /**
124
+ * Get the opposite side, eg 'left' => 'right'. 'top' => 'bottom', etc
125
+ */
126
+
127
+ function getOppositeSide(side) {
128
+ return sides[side];
129
+ }
130
+ /**
131
+ * Given as css prop it will return a sided css prop based on a given side
132
+ * Example given `border` and `right` it return `borderRight`
133
+ */
134
+
135
+ function getSidedProp(prop, side) {
136
+ return "" + prop + (side.charAt(0).toUpperCase() + side.slice(1));
137
+ }
138
+ function getSidePanelStyle({
139
+ position = 'bottom',
140
+ height,
141
+ width,
142
+ devtoolsTheme,
143
+ isOpen,
144
+ isResizing,
145
+ panelStyle
146
+ }) {
147
+ const oppositeSide = getOppositeSide(position);
148
+ const borderSide = getSidedProp('border', oppositeSide);
149
+ const isVertical = isVerticalSide(position);
150
+ return { ...panelStyle,
151
+ direction: 'ltr',
152
+ position: 'fixed',
153
+ [position]: 0,
154
+ [borderSide]: "1px solid " + devtoolsTheme.gray,
155
+ transformOrigin: oppositeSide,
156
+ boxShadow: '0 0 20px rgba(0,0,0,.3)',
157
+ zIndex: 99999,
158
+ // visibility will be toggled after transitions, but set initial state here
159
+ visibility: isOpen ? 'visible' : 'hidden',
160
+ ...(isResizing ? {
161
+ transition: "none"
162
+ } : {
163
+ transition: "all .2s ease"
164
+ }),
165
+ ...(isOpen ? {
166
+ opacity: 1,
167
+ pointerEvents: 'all',
168
+ transform: isVertical ? "translateX(0) scale(1)" : "translateY(0) scale(1)"
169
+ } : {
170
+ opacity: 0,
171
+ pointerEvents: 'none',
172
+ transform: isVertical ? "translateX(15px) scale(1.02)" : "translateY(15px) scale(1.02)"
173
+ }),
174
+ ...(isVertical ? {
175
+ top: 0,
176
+ height: '100vh',
177
+ maxWidth: '90%',
178
+ width: typeof width === 'number' && width >= minPanelSize ? width : defaultPanelSize
179
+ } : {
180
+ left: 0,
181
+ width: '100%',
182
+ maxHeight: '90%',
183
+ height: typeof height === 'number' && height >= minPanelSize ? height : defaultPanelSize
184
+ })
185
+ };
186
+ }
187
+ /**
188
+ * Get resize handle style based on a given side
189
+ */
190
+
191
+ function getResizeHandleStyle(position = 'bottom') {
192
+ const isVertical = isVerticalSide(position);
193
+ const oppositeSide = getOppositeSide(position);
194
+ const marginSide = getSidedProp('margin', oppositeSide);
195
+ return {
196
+ position: 'absolute',
197
+ cursor: isVertical ? 'col-resize' : 'row-resize',
198
+ zIndex: 100000,
199
+ [oppositeSide]: 0,
200
+ [marginSide]: "-4px",
201
+ ...(isVertical ? {
202
+ top: 0,
203
+ height: '100%',
204
+ width: '4px'
205
+ } : {
206
+ width: '100%',
207
+ height: '4px'
208
+ })
209
+ };
210
+ }
211
+
212
+ exports.defaultPanelSize = defaultPanelSize;
213
+ exports.displayValue = displayValue;
214
+ exports.getOppositeSide = getOppositeSide;
215
+ exports.getQueryStatusColor = getQueryStatusColor;
216
+ exports.getQueryStatusLabel = getQueryStatusLabel;
217
+ exports.getResizeHandleStyle = getResizeHandleStyle;
218
+ exports.getSidePanelStyle = getSidePanelStyle;
219
+ exports.getSidedProp = getSidedProp;
220
+ exports.isVerticalSide = isVerticalSide;
221
+ exports.minPanelSize = minPanelSize;
222
+ exports.sides = sides;
223
+ exports.sortFns = sortFns;
224
+ exports.styled = styled;
225
+ exports.useIsMounted = useIsMounted;
226
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as React from 'react'\nimport SuperJSON from 'superjson'\n\nimport { useTheme } from './theme'\nimport useMediaQuery from './useMediaQuery'\nimport type { Theme } from './theme'\nimport type { Query } from '@tanstack/react-query'\n\ntype StyledComponent<T> = T extends 'button'\n ? React.DetailedHTMLProps<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n >\n : T extends 'input'\n ? React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n >\n : T extends 'select'\n ? React.DetailedHTMLProps<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n HTMLSelectElement\n >\n : T extends keyof HTMLElementTagNameMap\n ? React.HTMLAttributes<HTMLElementTagNameMap[T]>\n : never\n\nexport function getQueryStatusColor({\n queryState,\n observerCount,\n isStale,\n theme,\n}: {\n queryState: Query['state']\n observerCount: number\n isStale: boolean\n theme: Theme\n}) {\n return queryState.fetchStatus === 'fetching'\n ? theme.active\n : !observerCount\n ? theme.gray\n : queryState.fetchStatus === 'paused'\n ? theme.paused\n : isStale\n ? theme.warning\n : theme.success\n}\n\nexport function getQueryStatusLabel(query: Query) {\n return query.state.fetchStatus === 'fetching'\n ? 'fetching'\n : !query.getObserversCount()\n ? 'inactive'\n : query.state.fetchStatus === 'paused'\n ? 'paused'\n : query.isStale()\n ? 'stale'\n : 'fresh'\n}\n\ntype Styles =\n | React.CSSProperties\n | ((props: Record<string, any>, theme: Theme) => React.CSSProperties)\n\nexport function styled<T extends keyof HTMLElementTagNameMap>(\n type: T,\n newStyles: Styles,\n queries: Record<string, Styles> = {},\n) {\n return React.forwardRef<HTMLElementTagNameMap[T], StyledComponent<T>>(\n ({ style, ...rest }, ref) => {\n const theme = useTheme()\n\n const mediaStyles = Object.entries(queries).reduce(\n (current, [key, value]) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMediaQuery(key)\n ? {\n ...current,\n ...(typeof value === 'function' ? value(rest, theme) : value),\n }\n : current\n },\n {},\n )\n\n return React.createElement(type, {\n ...rest,\n style: {\n ...(typeof newStyles === 'function'\n ? newStyles(rest, theme)\n : newStyles),\n ...style,\n ...mediaStyles,\n },\n ref,\n })\n },\n )\n}\n\nexport function useIsMounted() {\n const mountedRef = React.useRef(false)\n const isMounted = React.useCallback(() => mountedRef.current, [])\n\n React.useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n return isMounted\n}\n\n/**\n * Displays a string regardless the type of the data\n * @param {unknown} value Value to be stringified\n * @param {boolean} beautify Formats json to multiline\n */\nexport const displayValue = (value: unknown, beautify: boolean = false) => {\n const { json } = SuperJSON.serialize(value)\n\n return JSON.stringify(json, null, beautify ? 2 : undefined)\n}\n\n// Sorting functions\ntype SortFn = (a: Query, b: Query) => number\n\nconst getStatusRank = (q: Query) =>\n q.state.fetchStatus !== 'idle'\n ? 0\n : !q.getObserversCount()\n ? 3\n : q.isStale()\n ? 2\n : 1\n\nconst queryHashSort: SortFn = (a, b) => a.queryHash.localeCompare(b.queryHash)\n\nconst dateSort: SortFn = (a, b) =>\n a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1\n\nconst statusAndDateSort: SortFn = (a, b) => {\n if (getStatusRank(a) === getStatusRank(b)) {\n return dateSort(a, b)\n }\n\n return getStatusRank(a) > getStatusRank(b) ? 1 : -1\n}\n\nexport const sortFns: Record<string, SortFn> = {\n 'Status > Last Updated': statusAndDateSort,\n 'Query Hash': queryHashSort,\n 'Last Updated': dateSort,\n}\n\nexport const minPanelSize = 70\nexport const defaultPanelSize = 500\nexport const sides: Record<Side, Side> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n}\n\nexport type Corner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\nexport type Side = 'left' | 'right' | 'top' | 'bottom'\n/**\n * Check if the given side is vertical (left/right)\n */\nexport function isVerticalSide(side: Side) {\n return ['left', 'right'].includes(side)\n}\n/**\n * Get the opposite side, eg 'left' => 'right'. 'top' => 'bottom', etc\n */\nexport function getOppositeSide(side: Side): Side {\n return sides[side]\n}\n/**\n * Given as css prop it will return a sided css prop based on a given side\n * Example given `border` and `right` it return `borderRight`\n */\nexport function getSidedProp<T extends string>(prop: T, side: Side) {\n return `${prop}${\n side.charAt(0).toUpperCase() + side.slice(1)\n }` as `${T}${Capitalize<Side>}`\n}\n\nexport interface SidePanelStyleOptions {\n /**\n * Position of the panel\n * Defaults to 'bottom'\n */\n position?: Side\n /**\n * Staring height for the panel, it is set if the position is horizontal eg 'top' or 'bottom'\n * Defaults to 500\n */\n height?: number\n /**\n * Staring width for the panel, it is set if the position is vertical eg 'left' or 'right'\n * Defaults to 500\n */\n width?: number\n /**\n * RQ devtools theme\n */\n devtoolsTheme: Theme\n /**\n * Sets the correct transition and visibility styles\n */\n isOpen?: boolean\n /**\n * If the panel is resizing set to true to apply the correct transition styles\n */\n isResizing?: boolean\n /**\n * Extra panel style passed by the user\n */\n panelStyle?: React.CSSProperties\n}\n\nexport function getSidePanelStyle({\n position = 'bottom',\n height,\n width,\n devtoolsTheme,\n isOpen,\n isResizing,\n panelStyle,\n}: SidePanelStyleOptions): React.CSSProperties {\n const oppositeSide = getOppositeSide(position)\n const borderSide = getSidedProp('border', oppositeSide)\n const isVertical = isVerticalSide(position)\n\n return {\n ...panelStyle,\n direction: 'ltr',\n position: 'fixed',\n [position]: 0,\n [borderSide]: `1px solid ${devtoolsTheme.gray}`,\n transformOrigin: oppositeSide,\n boxShadow: '0 0 20px rgba(0,0,0,.3)',\n zIndex: 99999,\n // visibility will be toggled after transitions, but set initial state here\n visibility: isOpen ? 'visible' : 'hidden',\n ...(isResizing\n ? {\n transition: `none`,\n }\n : { transition: `all .2s ease` }),\n ...(isOpen\n ? {\n opacity: 1,\n pointerEvents: 'all',\n transform: isVertical\n ? `translateX(0) scale(1)`\n : `translateY(0) scale(1)`,\n }\n : {\n opacity: 0,\n pointerEvents: 'none',\n transform: isVertical\n ? `translateX(15px) scale(1.02)`\n : `translateY(15px) scale(1.02)`,\n }),\n ...(isVertical\n ? {\n top: 0,\n height: '100vh',\n maxWidth: '90%',\n width:\n typeof width === 'number' && width >= minPanelSize\n ? width\n : defaultPanelSize,\n }\n : {\n left: 0,\n width: '100%',\n maxHeight: '90%',\n height:\n typeof height === 'number' && height >= minPanelSize\n ? height\n : defaultPanelSize,\n }),\n }\n}\n\n/**\n * Get resize handle style based on a given side\n */\nexport function getResizeHandleStyle(\n position: Side = 'bottom',\n): React.CSSProperties {\n const isVertical = isVerticalSide(position)\n const oppositeSide = getOppositeSide(position)\n const marginSide = getSidedProp('margin', oppositeSide)\n\n return {\n position: 'absolute',\n cursor: isVertical ? 'col-resize' : 'row-resize',\n zIndex: 100000,\n [oppositeSide]: 0,\n [marginSide]: `-4px`,\n ...(isVertical\n ? {\n top: 0,\n height: '100%',\n width: '4px',\n }\n : {\n width: '100%',\n height: '4px',\n }),\n }\n}\n"],"names":["getQueryStatusColor","queryState","observerCount","isStale","theme","fetchStatus","active","gray","paused","warning","success","getQueryStatusLabel","query","state","getObserversCount","styled","type","newStyles","queries","React","forwardRef","style","rest","ref","useTheme","mediaStyles","Object","entries","reduce","current","key","value","useMediaQuery","createElement","useIsMounted","mountedRef","useRef","isMounted","useCallback","useEffect","displayValue","beautify","json","SuperJSON","serialize","JSON","stringify","undefined","getStatusRank","q","queryHashSort","a","b","queryHash","localeCompare","dateSort","dataUpdatedAt","statusAndDateSort","sortFns","minPanelSize","defaultPanelSize","sides","top","bottom","left","right","isVerticalSide","side","includes","getOppositeSide","getSidedProp","prop","charAt","toUpperCase","slice","getSidePanelStyle","position","height","width","devtoolsTheme","isOpen","isResizing","panelStyle","oppositeSide","borderSide","isVertical","direction","transformOrigin","boxShadow","zIndex","visibility","transition","opacity","pointerEvents","transform","maxWidth","maxHeight","getResizeHandleStyle","marginSide","cursor"],"mappings":"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"}