react-science 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/lib/app/hooks/file-loading.d.ts +3 -2
  2. package/lib/app/hooks/file-loading.d.ts.map +1 -1
  3. package/lib/app/hooks/file-loading.js +12 -12
  4. package/lib/app/hooks/file-loading.js.map +1 -1
  5. package/lib/app/panels/SignalProcessingPanel.js +1 -1
  6. package/lib/app/panels/SignalProcessingPanel.js.map +1 -1
  7. package/lib/app/panels/measurement-info/MeasurementInfoPanelAccordion.js +1 -1
  8. package/lib/app/panels/measurement-info/MeasurementInfoPanelAccordion.js.map +1 -1
  9. package/lib/app-data/loaders/biologicLoader.d.ts +2 -2
  10. package/lib/app-data/loaders/biologicLoader.d.ts.map +1 -1
  11. package/lib/app-data/loaders/biologicLoader.js +4 -4
  12. package/lib/app-data/loaders/biologicLoader.js.map +1 -1
  13. package/lib/app-data/loaders/cdfLoader.d.ts +2 -2
  14. package/lib/app-data/loaders/cdfLoader.d.ts.map +1 -1
  15. package/lib/app-data/loaders/cdfLoader.js +6 -9
  16. package/lib/app-data/loaders/cdfLoader.js.map +1 -1
  17. package/lib/app-data/loaders/jcampLoader.d.ts +2 -2
  18. package/lib/app-data/loaders/jcampLoader.d.ts.map +1 -1
  19. package/lib/app-data/loaders/jcampLoader.js +10 -13
  20. package/lib/app-data/loaders/jcampLoader.js.map +1 -1
  21. package/lib/app-data/loaders/loadMeasurements.d.ts +4 -3
  22. package/lib/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  23. package/lib/app-data/loaders/loadMeasurements.js +3 -3
  24. package/lib/app-data/loaders/loadMeasurements.js.map +1 -1
  25. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  26. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  27. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js +4 -9
  28. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  29. package/lib/app-data/loaders/spcLoader.d.ts +2 -2
  30. package/lib/app-data/loaders/spcLoader.d.ts.map +1 -1
  31. package/lib/app-data/loaders/spcLoader.js +3 -8
  32. package/lib/app-data/loaders/spcLoader.js.map +1 -1
  33. package/lib/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  34. package/lib/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  35. package/lib/app-data/loaders/utility/measurementLoader.js.map +1 -1
  36. package/lib/app-data/loaders/wdfLoader.d.ts +2 -2
  37. package/lib/app-data/loaders/wdfLoader.d.ts.map +1 -1
  38. package/lib/app-data/loaders/wdfLoader.js +3 -9
  39. package/lib/app-data/loaders/wdfLoader.js.map +1 -1
  40. package/lib/components/accordion/Accordion.d.ts +1 -0
  41. package/lib/components/accordion/Accordion.d.ts.map +1 -1
  42. package/lib/components/accordion/Accordion.js +12 -11
  43. package/lib/components/accordion/Accordion.js.map +1 -1
  44. package/lib/components/index.d.ts +2 -1
  45. package/lib/components/index.d.ts.map +1 -1
  46. package/lib/components/index.js +2 -1
  47. package/lib/components/index.js.map +1 -1
  48. package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
  49. package/lib/components/info-panel/InfoPanel.js +2 -5
  50. package/lib/components/info-panel/InfoPanel.js.map +1 -1
  51. package/lib/components/logger/FifoLoggerDialog.d.ts +10 -0
  52. package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  53. package/lib/components/logger/FifoLoggerDialog.js +55 -0
  54. package/lib/components/logger/FifoLoggerDialog.js.map +1 -0
  55. package/lib/components/logger/FifoLoggerProvider.d.ts +7 -0
  56. package/lib/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  57. package/lib/components/logger/FifoLoggerProvider.js +10 -0
  58. package/lib/components/logger/FifoLoggerProvider.js.map +1 -0
  59. package/lib/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  60. package/lib/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  61. package/lib/components/logger/FifoLoggerToolbarItem.js +39 -0
  62. package/lib/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  63. package/lib/components/logger/index.d.ts +5 -0
  64. package/lib/components/logger/index.d.ts.map +1 -0
  65. package/lib/components/logger/index.js +21 -0
  66. package/lib/components/logger/index.js.map +1 -0
  67. package/lib/components/logger/loggerContext.d.ts +4 -0
  68. package/lib/components/logger/loggerContext.d.ts.map +1 -0
  69. package/lib/components/logger/loggerContext.js +6 -0
  70. package/lib/components/logger/loggerContext.js.map +1 -0
  71. package/lib/components/logger/useFifoLogger.d.ts +3 -0
  72. package/lib/components/logger/useFifoLogger.d.ts.map +1 -0
  73. package/lib/components/logger/useFifoLogger.js +25 -0
  74. package/lib/components/logger/useFifoLogger.js.map +1 -0
  75. package/lib/components/root-layout/RootLayout.d.ts.map +1 -1
  76. package/lib/components/root-layout/RootLayout.js +6 -1
  77. package/lib/components/root-layout/RootLayout.js.map +1 -1
  78. package/lib/components/table/Table.d.ts +2 -3
  79. package/lib/components/table/Table.d.ts.map +1 -1
  80. package/lib/components/table/Table.js +2 -2
  81. package/lib/components/table/Table.js.map +1 -1
  82. package/lib/components/table/TableHeader.d.ts +1 -1
  83. package/lib/components/table/TableHeader.d.ts.map +1 -1
  84. package/lib/components/table/TableHeader.js +2 -2
  85. package/lib/components/table/TableHeader.js.map +1 -1
  86. package/lib/components/table/TableRow.d.ts +3 -1
  87. package/lib/components/table/TableRow.d.ts.map +1 -1
  88. package/lib/components/table/TableRow.js +9 -22
  89. package/lib/components/table/TableRow.js.map +1 -1
  90. package/lib/components/table/tableContext.d.ts +0 -2
  91. package/lib/components/table/tableContext.d.ts.map +1 -1
  92. package/lib/components/table/tableContext.js +1 -1
  93. package/lib/components/table/tableContext.js.map +1 -1
  94. package/lib/components/toolbar/Toolbar.d.ts +4 -2
  95. package/lib/components/toolbar/Toolbar.d.ts.map +1 -1
  96. package/lib/components/toolbar/Toolbar.js +2 -2
  97. package/lib/components/toolbar/Toolbar.js.map +1 -1
  98. package/lib/components/toolbar/TooltipHelpContent.d.ts +11 -0
  99. package/lib/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  100. package/lib/components/toolbar/TooltipHelpContent.js +102 -0
  101. package/lib/components/toolbar/TooltipHelpContent.js.map +1 -0
  102. package/lib/components/toolbar/index.d.ts +1 -0
  103. package/lib/components/toolbar/index.d.ts.map +1 -1
  104. package/lib/components/toolbar/index.js +1 -0
  105. package/lib/components/toolbar/index.js.map +1 -1
  106. package/lib-esm/app/hooks/file-loading.d.ts +3 -2
  107. package/lib-esm/app/hooks/file-loading.d.ts.map +1 -1
  108. package/lib-esm/app/hooks/file-loading.js +9 -9
  109. package/lib-esm/app/hooks/file-loading.js.map +1 -1
  110. package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
  111. package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
  112. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanelAccordion.js +1 -1
  113. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanelAccordion.js.map +1 -1
  114. package/lib-esm/app-data/loaders/biologicLoader.d.ts +2 -2
  115. package/lib-esm/app-data/loaders/biologicLoader.d.ts.map +1 -1
  116. package/lib-esm/app-data/loaders/biologicLoader.js +4 -4
  117. package/lib-esm/app-data/loaders/biologicLoader.js.map +1 -1
  118. package/lib-esm/app-data/loaders/cdfLoader.d.ts +2 -2
  119. package/lib-esm/app-data/loaders/cdfLoader.d.ts.map +1 -1
  120. package/lib-esm/app-data/loaders/cdfLoader.js +6 -9
  121. package/lib-esm/app-data/loaders/cdfLoader.js.map +1 -1
  122. package/lib-esm/app-data/loaders/jcampLoader.d.ts +2 -2
  123. package/lib-esm/app-data/loaders/jcampLoader.d.ts.map +1 -1
  124. package/lib-esm/app-data/loaders/jcampLoader.js +10 -13
  125. package/lib-esm/app-data/loaders/jcampLoader.js.map +1 -1
  126. package/lib-esm/app-data/loaders/loadMeasurements.d.ts +4 -3
  127. package/lib-esm/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  128. package/lib-esm/app-data/loaders/loadMeasurements.js +3 -3
  129. package/lib-esm/app-data/loaders/loadMeasurements.js.map +1 -1
  130. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  131. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  132. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js +5 -10
  133. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  134. package/lib-esm/app-data/loaders/spcLoader.d.ts +2 -2
  135. package/lib-esm/app-data/loaders/spcLoader.d.ts.map +1 -1
  136. package/lib-esm/app-data/loaders/spcLoader.js +4 -9
  137. package/lib-esm/app-data/loaders/spcLoader.js.map +1 -1
  138. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  139. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  140. package/lib-esm/app-data/loaders/utility/measurementLoader.js.map +1 -1
  141. package/lib-esm/app-data/loaders/wdfLoader.d.ts +2 -2
  142. package/lib-esm/app-data/loaders/wdfLoader.d.ts.map +1 -1
  143. package/lib-esm/app-data/loaders/wdfLoader.js +3 -9
  144. package/lib-esm/app-data/loaders/wdfLoader.js.map +1 -1
  145. package/lib-esm/components/accordion/Accordion.d.ts +1 -0
  146. package/lib-esm/components/accordion/Accordion.d.ts.map +1 -1
  147. package/lib-esm/components/accordion/Accordion.js +12 -11
  148. package/lib-esm/components/accordion/Accordion.js.map +1 -1
  149. package/lib-esm/components/index.d.ts +2 -1
  150. package/lib-esm/components/index.d.ts.map +1 -1
  151. package/lib-esm/components/index.js +2 -1
  152. package/lib-esm/components/index.js.map +1 -1
  153. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
  154. package/lib-esm/components/info-panel/InfoPanel.js +2 -5
  155. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
  156. package/lib-esm/components/logger/FifoLoggerDialog.d.ts +10 -0
  157. package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  158. package/lib-esm/components/logger/FifoLoggerDialog.js +48 -0
  159. package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -0
  160. package/lib-esm/components/logger/FifoLoggerProvider.d.ts +7 -0
  161. package/lib-esm/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  162. package/lib-esm/components/logger/FifoLoggerProvider.js +6 -0
  163. package/lib-esm/components/logger/FifoLoggerProvider.js.map +1 -0
  164. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  165. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  166. package/lib-esm/components/logger/FifoLoggerToolbarItem.js +35 -0
  167. package/lib-esm/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  168. package/lib-esm/components/logger/index.d.ts +5 -0
  169. package/lib-esm/components/logger/index.d.ts.map +1 -0
  170. package/lib-esm/components/logger/index.js +5 -0
  171. package/lib-esm/components/logger/index.js.map +1 -0
  172. package/lib-esm/components/logger/loggerContext.d.ts +4 -0
  173. package/lib-esm/components/logger/loggerContext.d.ts.map +1 -0
  174. package/lib-esm/components/logger/loggerContext.js +3 -0
  175. package/lib-esm/components/logger/loggerContext.js.map +1 -0
  176. package/lib-esm/components/logger/useFifoLogger.d.ts +3 -0
  177. package/lib-esm/components/logger/useFifoLogger.d.ts.map +1 -0
  178. package/lib-esm/components/logger/useFifoLogger.js +20 -0
  179. package/lib-esm/components/logger/useFifoLogger.js.map +1 -0
  180. package/lib-esm/components/root-layout/RootLayout.d.ts.map +1 -1
  181. package/lib-esm/components/root-layout/RootLayout.js +6 -1
  182. package/lib-esm/components/root-layout/RootLayout.js.map +1 -1
  183. package/lib-esm/components/table/Table.d.ts +2 -3
  184. package/lib-esm/components/table/Table.d.ts.map +1 -1
  185. package/lib-esm/components/table/Table.js +2 -2
  186. package/lib-esm/components/table/Table.js.map +1 -1
  187. package/lib-esm/components/table/TableHeader.d.ts +1 -1
  188. package/lib-esm/components/table/TableHeader.d.ts.map +1 -1
  189. package/lib-esm/components/table/TableHeader.js +2 -2
  190. package/lib-esm/components/table/TableHeader.js.map +1 -1
  191. package/lib-esm/components/table/TableRow.d.ts +3 -1
  192. package/lib-esm/components/table/TableRow.d.ts.map +1 -1
  193. package/lib-esm/components/table/TableRow.js +7 -20
  194. package/lib-esm/components/table/TableRow.js.map +1 -1
  195. package/lib-esm/components/table/tableContext.d.ts +0 -2
  196. package/lib-esm/components/table/tableContext.d.ts.map +1 -1
  197. package/lib-esm/components/table/tableContext.js +1 -1
  198. package/lib-esm/components/table/tableContext.js.map +1 -1
  199. package/lib-esm/components/toolbar/Toolbar.d.ts +4 -2
  200. package/lib-esm/components/toolbar/Toolbar.d.ts.map +1 -1
  201. package/lib-esm/components/toolbar/Toolbar.js +2 -2
  202. package/lib-esm/components/toolbar/Toolbar.js.map +1 -1
  203. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts +11 -0
  204. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  205. package/lib-esm/components/toolbar/TooltipHelpContent.js +95 -0
  206. package/lib-esm/components/toolbar/TooltipHelpContent.js.map +1 -0
  207. package/lib-esm/components/toolbar/index.d.ts +1 -0
  208. package/lib-esm/components/toolbar/index.d.ts.map +1 -1
  209. package/lib-esm/components/toolbar/index.js +1 -0
  210. package/lib-esm/components/toolbar/index.js.map +1 -1
  211. package/package.json +7 -5
  212. package/src/app/hooks/file-loading.ts +12 -10
  213. package/src/app/panels/SignalProcessingPanel.tsx +1 -1
  214. package/src/app/panels/measurement-info/MeasurementInfoPanelAccordion.tsx +1 -1
  215. package/src/app-data/loaders/biologicLoader.ts +6 -5
  216. package/src/app-data/loaders/cdfLoader.ts +8 -13
  217. package/src/app-data/loaders/jcampLoader.ts +11 -15
  218. package/src/app-data/loaders/loadMeasurements.ts +6 -5
  219. package/src/app-data/loaders/proprietary/agilent/cary500Loader.ts +8 -16
  220. package/src/app-data/loaders/spcLoader.ts +6 -12
  221. package/src/app-data/loaders/utility/measurementLoader.ts +2 -3
  222. package/src/app-data/loaders/wdfLoader.ts +5 -12
  223. package/src/components/accordion/Accordion.tsx +17 -12
  224. package/src/components/index.ts +2 -1
  225. package/src/components/info-panel/InfoPanel.tsx +2 -12
  226. package/src/components/logger/FifoLoggerDialog.tsx +129 -0
  227. package/src/components/logger/FifoLoggerProvider.tsx +15 -0
  228. package/src/components/logger/FifoLoggerToolbarItem.tsx +59 -0
  229. package/src/components/logger/index.ts +4 -0
  230. package/src/components/logger/loggerContext.ts +4 -0
  231. package/src/components/logger/useFifoLogger.ts +22 -0
  232. package/src/components/root-layout/RootLayout.tsx +20 -13
  233. package/src/components/table/Table.tsx +1 -6
  234. package/src/components/table/TableHeader.tsx +2 -2
  235. package/src/components/table/TableRow.tsx +17 -24
  236. package/src/components/table/tableContext.ts +1 -1
  237. package/src/components/toolbar/Toolbar.tsx +8 -3
  238. package/src/components/toolbar/TooltipHelpContent.tsx +173 -0
  239. package/src/components/toolbar/index.ts +1 -0
@@ -1,13 +1,14 @@
1
1
  export * from './accordion/index';
2
2
  export * from './button/index';
3
3
  export * from './color-picker/index';
4
+ export * from './dialog/index';
4
5
  export * from './drop-zone/index';
5
6
  export * from './forms/index';
6
7
  export * from './fullscreen/index';
7
8
  export * from './header/index';
8
9
  export * from './hooks/index';
9
10
  export * from './info-panel/index';
10
- export * from './dialog/index';
11
+ export * from './logger/index';
11
12
  export * from './root-layout/index';
12
13
  export * from './split-pane/index';
13
14
  export * from './table/index';
@@ -150,32 +150,22 @@ export function InfoPanel(props: InfoPanelProps) {
150
150
  striped
151
151
  css={css({
152
152
  width: '100%',
153
- 'td:first-child': {
154
- width: '30%',
155
- },
156
153
  })}
157
154
  compact
158
155
  >
159
156
  <Table.Header>
160
- <ValueRenderers.Header
161
- style={{ width: '50px' }}
162
- value="Parameter"
163
- />
157
+ <ValueRenderers.Header value="Parameter" />
164
158
  <ValueRenderers.Header value="Value" />
165
159
  </Table.Header>
166
160
  {data.map(([key, value]) => (
167
161
  <Table.Row
168
162
  key={key}
169
- bordered
170
163
  style={{
171
164
  height: '10px',
172
165
  padding: '0 !imporant',
173
166
  }}
174
167
  >
175
- <ValueRenderers.Text
176
- style={{ width: '50px' }}
177
- value={key}
178
- />
168
+ <ValueRenderers.Text value={key} />
179
169
  {valueCell(value)}
180
170
  </Table.Row>
181
171
  ))}
@@ -0,0 +1,129 @@
1
+ /** @jsxImportSource @emotion/react */
2
+
3
+ import { Dialog, DialogBody, DialogFooter } from '@blueprintjs/core';
4
+ import { css } from '@emotion/react';
5
+ import styled from '@emotion/styled';
6
+ import type { LogEntry } from 'fifo-logger';
7
+ import { CSSProperties } from 'react';
8
+
9
+ import { Button, Table, useFifoLogger, ValueRenderers } from '../index';
10
+
11
+ const ActionsFooter = styled.div`
12
+ display: flex;
13
+ gap: 3px;
14
+ `;
15
+
16
+ interface RowIndexCellProps {
17
+ pillColor: CSSProperties['backgroundColor'];
18
+ }
19
+
20
+ const RowIndexCell = styled.div<RowIndexCellProps>`
21
+ ::before {
22
+ content: '';
23
+ display: inline-block;
24
+ width: 10px;
25
+ height: 10px;
26
+ margin-right: 5px;
27
+ border-radius: 7px;
28
+ filter: brightness(60%);
29
+ background-color: ${({ pillColor }) => pillColor};
30
+ }
31
+ `;
32
+
33
+ export interface FifoLoggerDialogProps {
34
+ isOpen: boolean;
35
+ onClose: () => void;
36
+ logs: LogEntry[];
37
+ unseen: number;
38
+ }
39
+
40
+ export function FifoLoggerDialog(props: FifoLoggerDialogProps) {
41
+ const logger = useFifoLogger();
42
+ return (
43
+ <Dialog
44
+ shouldReturnFocusOnClose={false}
45
+ isOpen={props.isOpen}
46
+ onClose={props.onClose}
47
+ title="Logs"
48
+ icon="info-sign"
49
+ css={css`
50
+ min-width: 800px;
51
+ min-height: 500px;
52
+ max-height: 80vh;
53
+ max-width: 1000px;
54
+ `}
55
+ >
56
+ <DialogBody>
57
+ <Table
58
+ compact
59
+ bordered
60
+ css={css`
61
+ width: 100%;
62
+ `}
63
+ >
64
+ <Table.Header>
65
+ <ValueRenderers.Header value="#" />
66
+ <ValueRenderers.Header value="Time" />
67
+ <ValueRenderers.Header value="Level" />
68
+ <ValueRenderers.Header value="Message" />
69
+ </Table.Header>
70
+ {props.logs.map((logEntry, idx) => (
71
+ <Table.Row
72
+ key={logEntry.id}
73
+ style={{
74
+ backgroundColor: rowBackgroundColor[logEntry.levelLabel],
75
+ }}
76
+ >
77
+ <ValueRenderers.Component>
78
+ <RowIndexCell
79
+ pillColor={
80
+ idx >= props.unseen
81
+ ? 'transparent'
82
+ : rowBackgroundColor[logEntry.levelLabel]
83
+ }
84
+ >
85
+ {String(idx + 1)}
86
+ </RowIndexCell>
87
+ </ValueRenderers.Component>
88
+ <ValueRenderers.Text
89
+ value={new Date(logEntry.time).toLocaleTimeString()}
90
+ />
91
+ <ValueRenderers.Text value={logEntry.levelLabel} />
92
+ <ValueRenderers.Text value={logEntry.message} />
93
+ </Table.Row>
94
+ ))}
95
+ </Table>
96
+ </DialogBody>
97
+ <DialogFooter
98
+ actions={
99
+ <ActionsFooter>
100
+ <Button
101
+ outlined
102
+ intent="danger"
103
+ icon="trash"
104
+ text="Clear logs"
105
+ onClick={() => logger.clear()}
106
+ />
107
+ <Button
108
+ outlined
109
+ intent="none"
110
+ text="Close"
111
+ onClick={props.onClose}
112
+ />
113
+ </ActionsFooter>
114
+ }
115
+ />
116
+ </Dialog>
117
+ );
118
+ }
119
+
120
+ // "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent"
121
+ const rowBackgroundColor: Record<string, CSSProperties['backgroundColor']> = {
122
+ fatal: 'pink',
123
+ error: 'pink',
124
+ warn: 'lightyellow',
125
+ info: 'lightgreen',
126
+ debug: 'lightgrey',
127
+ trace: 'lightgrey',
128
+ silent: 'lightgrey',
129
+ };
@@ -0,0 +1,15 @@
1
+ import type { FifoLogger } from 'fifo-logger';
2
+ import { ReactNode } from 'react';
3
+
4
+ import { fifoLoggerContext } from './loggerContext';
5
+
6
+ export function FifoLoggerProvider(props: {
7
+ logger: FifoLogger;
8
+ children: ReactNode;
9
+ }) {
10
+ return (
11
+ <fifoLoggerContext.Provider value={props.logger}>
12
+ {props.children}
13
+ </fifoLoggerContext.Provider>
14
+ );
15
+ }
@@ -0,0 +1,59 @@
1
+ import { Intent } from '@blueprintjs/core';
2
+ import type { LogEntry } from 'fifo-logger';
3
+ import { useState } from 'react';
4
+
5
+ import { useOnOff } from '../hooks';
6
+ import { Toolbar } from '../toolbar';
7
+
8
+ import { FifoLoggerDialog } from './FifoLoggerDialog';
9
+ import { useFifoLogs } from './useFifoLogger';
10
+
11
+ export function FifoLoggerToolbarItem() {
12
+ const [seen, setSeen] = useState(0);
13
+ const [isOpen, open, close] = useOnOff(false);
14
+ const logs = useFifoLogs();
15
+
16
+ const unseen = logs.length - seen;
17
+ return (
18
+ <>
19
+ <Toolbar.Item
20
+ icon="bug"
21
+ tooltip="Logs"
22
+ onClick={open}
23
+ tag={unseen > 0 ? unseen : undefined}
24
+ tagProps={{
25
+ intent: getIntent(logs),
26
+ style: {
27
+ pointerEvents: 'none',
28
+ },
29
+ }}
30
+ />
31
+ <FifoLoggerDialog
32
+ isOpen={isOpen}
33
+ unseen={unseen}
34
+ onClose={() => {
35
+ setSeen(logs.length);
36
+ close();
37
+ }}
38
+ logs={logs}
39
+ />
40
+ </>
41
+ );
42
+ }
43
+
44
+ function getIntent(logs: LogEntry[]): Intent {
45
+ const maxLevel = Math.max(
46
+ ...logs.map((log) => log.level),
47
+ ) as LogEntry['level'];
48
+ return intentMap[maxLevel || 0];
49
+ }
50
+
51
+ const intentMap: Record<LogEntry['level'], Intent> = {
52
+ 60: 'danger',
53
+ 50: 'danger',
54
+ 40: 'warning',
55
+ 30: 'success',
56
+ 20: 'none',
57
+ 10: 'none',
58
+ 0: 'none',
59
+ };
@@ -0,0 +1,4 @@
1
+ export * from './FifoLoggerProvider';
2
+ export * from './FifoLoggerDialog';
3
+ export * from './FifoLoggerToolbarItem';
4
+ export * from './useFifoLogger';
@@ -0,0 +1,4 @@
1
+ import type { FifoLogger } from 'fifo-logger';
2
+ import { createContext } from 'react';
3
+
4
+ export const fifoLoggerContext = createContext<FifoLogger | null>(null);
@@ -0,0 +1,22 @@
1
+ import { useContext, useEffect, useState } from 'react';
2
+
3
+ import { fifoLoggerContext } from './loggerContext';
4
+
5
+ export function useFifoLogger() {
6
+ const fifoLogger = useContext(fifoLoggerContext);
7
+ if (!fifoLogger) {
8
+ throw new Error('useFifoLogger must be used within a FifoLoggerProvider');
9
+ }
10
+ return fifoLogger;
11
+ }
12
+
13
+ export function useFifoLogs() {
14
+ const logger = useFifoLogger();
15
+ const [logs, setLogs] = useState(logger.getLogs());
16
+ useEffect(() => {
17
+ logger.addEventListener('change', () => {
18
+ setLogs(logger.getLogs());
19
+ });
20
+ }, [logger]);
21
+ return logs;
22
+ }
@@ -19,6 +19,8 @@ const style: CSSProperties = {
19
19
  width: '100%',
20
20
  height: '100%',
21
21
  fontSize: '14px',
22
+ display: 'flex',
23
+ flexDirection: 'column',
22
24
  };
23
25
 
24
26
  export function RootLayout(props: RootLayoutProps) {
@@ -33,18 +35,23 @@ export function RootLayout(props: RootLayoutProps) {
33
35
  }, []);
34
36
 
35
37
  return (
36
- <div style={{ ...style, ...props.style }} translate="no">
37
- <CustomDivPreflight ref={ref}>
38
- <BlueprintProvider
39
- {...(rootRef ? { portalContainer: rootRef } : undefined)}
40
- >
41
- <RootLayoutProvider innerRef={rootRef}>
42
- <QueryClientProvider client={queryClient}>
43
- <AccordionProvider>{props.children}</AccordionProvider>
44
- </QueryClientProvider>
45
- </RootLayoutProvider>
46
- </BlueprintProvider>
47
- </CustomDivPreflight>
48
- </div>
38
+ <CustomDivPreflight
39
+ ref={ref}
40
+ style={{
41
+ ...style,
42
+ ...props.style,
43
+ }}
44
+ translate="no"
45
+ >
46
+ <BlueprintProvider
47
+ {...(rootRef ? { portalContainer: rootRef } : undefined)}
48
+ >
49
+ <RootLayoutProvider innerRef={rootRef}>
50
+ <QueryClientProvider client={queryClient}>
51
+ <AccordionProvider>{props.children}</AccordionProvider>
52
+ </QueryClientProvider>
53
+ </RootLayoutProvider>
54
+ </BlueprintProvider>
55
+ </CustomDivPreflight>
49
56
  );
50
57
  }
@@ -34,13 +34,11 @@ export interface TableProps extends React.HTMLAttributes<HTMLTableElement> {
34
34
  compact?: boolean;
35
35
  interactive?: boolean;
36
36
  striped?: boolean;
37
- hasBorder?: boolean;
38
37
  color?: string;
39
38
  }
40
39
 
41
40
  export function Table(props: TableProps) {
42
41
  const {
43
- hasBorder = false,
44
42
  bordered = false,
45
43
  compact = false,
46
44
  interactive = false,
@@ -51,10 +49,7 @@ export function Table(props: TableProps) {
51
49
  } = props;
52
50
  const { Header, Rows } = splitChildren(children);
53
51
 
54
- const tableContextValue = useMemo(
55
- () => ({ hasBorder, color }),
56
- [hasBorder, color],
57
- );
52
+ const tableContextValue = useMemo(() => ({ color }), [color]);
58
53
  return (
59
54
  <TableContext.Provider value={tableContextValue}>
60
55
  <HTMLTable
@@ -1,10 +1,10 @@
1
1
  import type { TableProps } from './Table';
2
2
  import { TableRow } from './TableRow';
3
3
 
4
- export const TableHeader = ({ children, hasBorder, style }: TableProps) => {
4
+ export const TableHeader = ({ children, bordered, style }: TableProps) => {
5
5
  return (
6
6
  <thead>
7
- <TableRow hasBorder={hasBorder} style={style}>
7
+ <TableRow bordered={bordered} style={style}>
8
8
  {children}
9
9
  </TableRow>
10
10
  </thead>
@@ -1,6 +1,10 @@
1
- /** @jsxImportSource @emotion/react */
2
- import { css } from '@emotion/react';
3
- import { Children, isValidElement, ReactElement, ReactNode } from 'react';
1
+ import {
2
+ Children,
3
+ HTMLAttributes,
4
+ isValidElement,
5
+ ReactElement,
6
+ ReactNode,
7
+ } from 'react';
4
8
 
5
9
  import {
6
10
  Boolean,
@@ -15,26 +19,20 @@ import {
15
19
  import type { TableProps } from './Table';
16
20
  import { useTableContext } from './tableContext';
17
21
 
18
- const styles = {
19
- hasBorder: css({
20
- border: '0.5px solid rgb(0, 0, 0)',
21
- padding: '5px',
22
- position: 'relative',
23
- }),
24
- noBorder: css({
25
- padding: '5px',
26
- position: 'relative',
27
- }),
28
- };
22
+ export type TableRowProps = TableProps & HTMLAttributes<HTMLTableRowElement>;
29
23
 
30
24
  export const TableRow = ({
31
25
  children,
32
26
  style = {},
33
- hasBorder = false,
34
- }: TableProps) => {
27
+ bordered = false,
28
+ ...other
29
+ }: TableRowProps) => {
35
30
  const { cells } = useRowChildren(children);
36
31
  return (
37
- <tr style={{ border: hasBorder ? '1px solid black' : '', ...style }}>
32
+ <tr
33
+ style={{ border: bordered ? '1px solid black' : '', ...style }}
34
+ {...other}
35
+ >
38
36
  {cells}
39
37
  </tr>
40
38
  );
@@ -42,7 +40,7 @@ export const TableRow = ({
42
40
 
43
41
  function useRowChildren(children: ReactNode) {
44
42
  const cells: ReactElement[] = [];
45
- const { hasBorder, color } = useTableContext();
43
+ const { color } = useTableContext();
46
44
  for (const child of Children.toArray(children)) {
47
45
  if (
48
46
  typeof child === 'object' &&
@@ -57,11 +55,7 @@ function useRowChildren(children: ReactNode) {
57
55
  ) {
58
56
  if (child.type === Header) {
59
57
  cells.push(
60
- <th
61
- key={child.key}
62
- style={{ color }}
63
- css={hasBorder ? styles.hasBorder : styles.noBorder}
64
- >
58
+ <th key={child.key} style={{ color }}>
65
59
  {child}
66
60
  </th>,
67
61
  );
@@ -73,7 +67,6 @@ function useRowChildren(children: ReactNode) {
73
67
  color,
74
68
  position: 'relative',
75
69
  }}
76
- css={hasBorder ? styles.hasBorder : styles.noBorder}
77
70
  >
78
71
  {child}
79
72
  </td>,
@@ -1,6 +1,6 @@
1
1
  import { createContext, useContext } from 'react';
2
2
 
3
- export const TableContext = createContext({ hasBorder: true, color: '' });
3
+ export const TableContext = createContext({ color: '' });
4
4
  export function useTableContext() {
5
5
  const context = useContext(TableContext);
6
6
  return context;
@@ -15,6 +15,7 @@ import { css } from '@emotion/react';
15
15
  import {
16
16
  cloneElement,
17
17
  JSX,
18
+ MouseEvent,
18
19
  ReactElement,
19
20
  ReactNode,
20
21
  useLayoutEffect,
@@ -58,7 +59,11 @@ export interface ToolbarItemProps extends ToolbarBaseProps {
58
59
  tooltipProps?: Omit<TooltipProps, 'content'>;
59
60
  icon: IconName | JSX.Element;
60
61
  active?: boolean;
61
- onClick?: (item: ToolbarItemProps) => void;
62
+ onClick?: (
63
+ item: ToolbarItemProps & {
64
+ event: MouseEvent;
65
+ },
66
+ ) => void;
62
67
  className?: string;
63
68
  isPopover?: boolean;
64
69
  tag?: ReactNode;
@@ -211,8 +216,8 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
211
216
  )}
212
217
  </div>
213
218
  }
214
- onClick={() => {
215
- onClick?.(props);
219
+ onClick={(event) => {
220
+ onClick?.({ event, ...props });
216
221
  }}
217
222
  tooltipProps={
218
223
  !tooltip
@@ -0,0 +1,173 @@
1
+ import styled from '@emotion/styled';
2
+ import { CSSProperties } from 'react';
3
+
4
+ const shortcutBoxSize = 1.5;
5
+
6
+ const FlexContainer = styled.div`
7
+ display: flex;
8
+ justify-content: space-between;
9
+ flex-wrap: wrap;
10
+ align-items: center;
11
+ `;
12
+
13
+ interface TitleProps {
14
+ size: CSSProperties['fontSize'];
15
+ }
16
+
17
+ const Title = styled.span<TitleProps>`
18
+ font-size: ${({ size }) => size};
19
+ flex: 1;
20
+ padding: 5px 0;
21
+ text-align: left;
22
+ `;
23
+ const Description = styled.p`
24
+ padding-top: 1rem;
25
+ font-size: 0.7rem;
26
+ text-align: left;
27
+ `;
28
+
29
+ const ShortcutItem = styled.div`
30
+ display: flex;
31
+ justify-content: center;
32
+ align-items: center;
33
+ padding: 0.2rem;
34
+ border: 1px solid;
35
+ border-radius: 4px;
36
+ height: ${shortcutBoxSize}rem;
37
+ min-width: ${shortcutBoxSize}rem;
38
+ margin-left: 5px;
39
+ font-size: 0.75rem;
40
+ font-weight: bold;
41
+ `;
42
+
43
+ const SubTitleItem = styled.div`
44
+ position: relative;
45
+ padding-left: 15px;
46
+ box-sizing: border-box;
47
+
48
+ &::before {
49
+ position: absolute;
50
+ top: ${shortcutBoxSize / 2}rem;
51
+ left: 0;
52
+ width: 10px;
53
+ height: 1px;
54
+ margin: auto;
55
+ content: '';
56
+ border-bottom: 1px solid;
57
+ }
58
+
59
+ &::after {
60
+ position: absolute;
61
+ top: 0;
62
+ bottom: 0;
63
+ left: 0;
64
+ width: 1px;
65
+ height: 100%;
66
+ content: '';
67
+ border-left: 1px solid;
68
+ }
69
+
70
+ &:last-child::after {
71
+ height: ${shortcutBoxSize / 2}rem;
72
+ }
73
+
74
+ &:first-child {
75
+ margin: 0;
76
+ }
77
+ `;
78
+
79
+ export interface TooltipItem {
80
+ title: string;
81
+ shortcuts?: string[];
82
+ subTitles?: Array<Pick<TooltipItem, 'title' | 'shortcuts'>>;
83
+ description?: string;
84
+ link?: string;
85
+ style?: CSSProperties;
86
+ }
87
+
88
+ export function TooltipHelpContent(props: TooltipItem) {
89
+ const {
90
+ title,
91
+ shortcuts = [],
92
+ subTitles = [],
93
+ description = '',
94
+ link,
95
+ style = {},
96
+ } = props;
97
+
98
+ return (
99
+ <div
100
+ style={{
101
+ color: 'white',
102
+ width: '250px',
103
+ padding: '0.5rem',
104
+ ...style,
105
+ }}
106
+ >
107
+ <FlexContainer>
108
+ <Title size="0.9rem">{title}</Title>
109
+ <ShortCuts shortcuts={shortcuts} />
110
+ </FlexContainer>
111
+ <SubTitles items={subTitles} />
112
+
113
+ {(description || link) && (
114
+ <Description>
115
+ {description}
116
+ {link && (
117
+ <a
118
+ style={description ? { paddingLeft: '5px' } : {}}
119
+ target="_blank"
120
+ href={link}
121
+ rel="noreferrer"
122
+ >
123
+ Learn more
124
+ </a>
125
+ )}
126
+ </Description>
127
+ )}
128
+ </div>
129
+ );
130
+ }
131
+
132
+ function ShortCuts({ shortcuts }: { shortcuts: string[] }) {
133
+ return (
134
+ <div
135
+ style={{
136
+ display: 'flex',
137
+ textWrap: 'nowrap',
138
+ }}
139
+ >
140
+ {shortcuts.map((key) => {
141
+ return (
142
+ <ShortcutItem key={key}>
143
+ <span>{key}</span>
144
+ </ShortcutItem>
145
+ );
146
+ })}
147
+ </div>
148
+ );
149
+ }
150
+
151
+ function SubTitles({ items }: { items: TooltipItem[] }) {
152
+ if (!items || items.length === 0) {
153
+ return null;
154
+ }
155
+
156
+ return (
157
+ <ul
158
+ style={{
159
+ paddingLeft: '5px',
160
+ listStyle: 'none',
161
+ }}
162
+ >
163
+ {items.map(({ shortcuts = [], title }) => (
164
+ <SubTitleItem key={title}>
165
+ <FlexContainer>
166
+ <Title size="0.7rem">{title}</Title>
167
+ <ShortCuts shortcuts={shortcuts} />
168
+ </FlexContainer>
169
+ </SubTitleItem>
170
+ ))}
171
+ </ul>
172
+ );
173
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './Toolbar';
2
2
  export * from './PanelPreferencesToolbar';
3
+ export * from './TooltipHelpContent';