react-science 3.1.0 → 4.1.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 (236) 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-data/loaders/biologicLoader.d.ts +2 -2
  8. package/lib/app-data/loaders/biologicLoader.d.ts.map +1 -1
  9. package/lib/app-data/loaders/biologicLoader.js +4 -4
  10. package/lib/app-data/loaders/biologicLoader.js.map +1 -1
  11. package/lib/app-data/loaders/cdfLoader.d.ts +2 -2
  12. package/lib/app-data/loaders/cdfLoader.d.ts.map +1 -1
  13. package/lib/app-data/loaders/cdfLoader.js +6 -9
  14. package/lib/app-data/loaders/cdfLoader.js.map +1 -1
  15. package/lib/app-data/loaders/jcampLoader.d.ts +2 -2
  16. package/lib/app-data/loaders/jcampLoader.d.ts.map +1 -1
  17. package/lib/app-data/loaders/jcampLoader.js +10 -13
  18. package/lib/app-data/loaders/jcampLoader.js.map +1 -1
  19. package/lib/app-data/loaders/loadMeasurements.d.ts +4 -3
  20. package/lib/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  21. package/lib/app-data/loaders/loadMeasurements.js +3 -3
  22. package/lib/app-data/loaders/loadMeasurements.js.map +1 -1
  23. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  24. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  25. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js +4 -9
  26. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  27. package/lib/app-data/loaders/spcLoader.d.ts +2 -2
  28. package/lib/app-data/loaders/spcLoader.d.ts.map +1 -1
  29. package/lib/app-data/loaders/spcLoader.js +3 -8
  30. package/lib/app-data/loaders/spcLoader.js.map +1 -1
  31. package/lib/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  32. package/lib/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  33. package/lib/app-data/loaders/utility/measurementLoader.js.map +1 -1
  34. package/lib/app-data/loaders/wdfLoader.d.ts +2 -2
  35. package/lib/app-data/loaders/wdfLoader.d.ts.map +1 -1
  36. package/lib/app-data/loaders/wdfLoader.js +3 -9
  37. package/lib/app-data/loaders/wdfLoader.js.map +1 -1
  38. package/lib/components/button/Button.d.ts +1 -1
  39. package/lib/components/button/Button.d.ts.map +1 -1
  40. package/lib/components/button/Button.js +3 -2
  41. package/lib/components/button/Button.js.map +1 -1
  42. package/lib/components/color-picker/gradient-select/GradientSelect.d.ts +1 -1
  43. package/lib/components/color-picker/gradient-select/GradientSelect.d.ts.map +1 -1
  44. package/lib/components/color-picker/gradient-select/GradientSelect.js +45 -23
  45. package/lib/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  46. package/lib/components/hooks/useSelect.d.ts +7 -5
  47. package/lib/components/hooks/useSelect.d.ts.map +1 -1
  48. package/lib/components/hooks/useSelect.js +3 -1
  49. package/lib/components/hooks/useSelect.js.map +1 -1
  50. package/lib/components/index.d.ts +2 -1
  51. package/lib/components/index.d.ts.map +1 -1
  52. package/lib/components/index.js +2 -1
  53. package/lib/components/index.js.map +1 -1
  54. package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
  55. package/lib/components/info-panel/InfoPanel.js +78 -20
  56. package/lib/components/info-panel/InfoPanel.js.map +1 -1
  57. package/lib/components/logger/FifoLoggerDialog.d.ts +10 -0
  58. package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  59. package/lib/components/logger/FifoLoggerDialog.js +55 -0
  60. package/lib/components/logger/FifoLoggerDialog.js.map +1 -0
  61. package/lib/components/logger/FifoLoggerProvider.d.ts +7 -0
  62. package/lib/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  63. package/lib/components/logger/FifoLoggerProvider.js +10 -0
  64. package/lib/components/logger/FifoLoggerProvider.js.map +1 -0
  65. package/lib/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  66. package/lib/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  67. package/lib/components/logger/FifoLoggerToolbarItem.js +39 -0
  68. package/lib/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  69. package/lib/components/logger/index.d.ts +5 -0
  70. package/lib/components/logger/index.d.ts.map +1 -0
  71. package/lib/components/logger/index.js +21 -0
  72. package/lib/components/logger/index.js.map +1 -0
  73. package/lib/components/logger/loggerContext.d.ts +4 -0
  74. package/lib/components/logger/loggerContext.d.ts.map +1 -0
  75. package/lib/components/logger/loggerContext.js +6 -0
  76. package/lib/components/logger/loggerContext.js.map +1 -0
  77. package/lib/components/logger/useFifoLogger.d.ts +3 -0
  78. package/lib/components/logger/useFifoLogger.d.ts.map +1 -0
  79. package/lib/components/logger/useFifoLogger.js +25 -0
  80. package/lib/components/logger/useFifoLogger.js.map +1 -0
  81. package/lib/components/table/Table.d.ts +4 -3
  82. package/lib/components/table/Table.d.ts.map +1 -1
  83. package/lib/components/table/Table.js +2 -2
  84. package/lib/components/table/Table.js.map +1 -1
  85. package/lib/components/table/TableHeader.d.ts +3 -1
  86. package/lib/components/table/TableHeader.d.ts.map +1 -1
  87. package/lib/components/table/TableHeader.js +8 -2
  88. package/lib/components/table/TableHeader.js.map +1 -1
  89. package/lib/components/table/TableRow.d.ts +1 -1
  90. package/lib/components/table/TableRow.d.ts.map +1 -1
  91. package/lib/components/table/TableRow.js +9 -22
  92. package/lib/components/table/TableRow.js.map +1 -1
  93. package/lib/components/table/tableContext.d.ts +0 -2
  94. package/lib/components/table/tableContext.d.ts.map +1 -1
  95. package/lib/components/table/tableContext.js +1 -1
  96. package/lib/components/table/tableContext.js.map +1 -1
  97. package/lib/components/toolbar/TooltipHelpContent.d.ts +11 -0
  98. package/lib/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  99. package/lib/components/toolbar/TooltipHelpContent.js +102 -0
  100. package/lib/components/toolbar/TooltipHelpContent.js.map +1 -0
  101. package/lib/components/toolbar/index.d.ts +1 -0
  102. package/lib/components/toolbar/index.d.ts.map +1 -1
  103. package/lib/components/toolbar/index.js +1 -0
  104. package/lib/components/toolbar/index.js.map +1 -1
  105. package/lib-esm/app/hooks/file-loading.d.ts +3 -2
  106. package/lib-esm/app/hooks/file-loading.d.ts.map +1 -1
  107. package/lib-esm/app/hooks/file-loading.js +9 -9
  108. package/lib-esm/app/hooks/file-loading.js.map +1 -1
  109. package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
  110. package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
  111. package/lib-esm/app-data/loaders/biologicLoader.d.ts +2 -2
  112. package/lib-esm/app-data/loaders/biologicLoader.d.ts.map +1 -1
  113. package/lib-esm/app-data/loaders/biologicLoader.js +4 -4
  114. package/lib-esm/app-data/loaders/biologicLoader.js.map +1 -1
  115. package/lib-esm/app-data/loaders/cdfLoader.d.ts +2 -2
  116. package/lib-esm/app-data/loaders/cdfLoader.d.ts.map +1 -1
  117. package/lib-esm/app-data/loaders/cdfLoader.js +6 -9
  118. package/lib-esm/app-data/loaders/cdfLoader.js.map +1 -1
  119. package/lib-esm/app-data/loaders/jcampLoader.d.ts +2 -2
  120. package/lib-esm/app-data/loaders/jcampLoader.d.ts.map +1 -1
  121. package/lib-esm/app-data/loaders/jcampLoader.js +10 -13
  122. package/lib-esm/app-data/loaders/jcampLoader.js.map +1 -1
  123. package/lib-esm/app-data/loaders/loadMeasurements.d.ts +4 -3
  124. package/lib-esm/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  125. package/lib-esm/app-data/loaders/loadMeasurements.js +3 -3
  126. package/lib-esm/app-data/loaders/loadMeasurements.js.map +1 -1
  127. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  128. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  129. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js +5 -10
  130. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  131. package/lib-esm/app-data/loaders/spcLoader.d.ts +2 -2
  132. package/lib-esm/app-data/loaders/spcLoader.d.ts.map +1 -1
  133. package/lib-esm/app-data/loaders/spcLoader.js +4 -9
  134. package/lib-esm/app-data/loaders/spcLoader.js.map +1 -1
  135. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  136. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  137. package/lib-esm/app-data/loaders/utility/measurementLoader.js.map +1 -1
  138. package/lib-esm/app-data/loaders/wdfLoader.d.ts +2 -2
  139. package/lib-esm/app-data/loaders/wdfLoader.d.ts.map +1 -1
  140. package/lib-esm/app-data/loaders/wdfLoader.js +3 -9
  141. package/lib-esm/app-data/loaders/wdfLoader.js.map +1 -1
  142. package/lib-esm/components/button/Button.d.ts +1 -1
  143. package/lib-esm/components/button/Button.d.ts.map +1 -1
  144. package/lib-esm/components/button/Button.js +3 -2
  145. package/lib-esm/components/button/Button.js.map +1 -1
  146. package/lib-esm/components/color-picker/gradient-select/GradientSelect.d.ts +1 -1
  147. package/lib-esm/components/color-picker/gradient-select/GradientSelect.d.ts.map +1 -1
  148. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js +45 -23
  149. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  150. package/lib-esm/components/hooks/useSelect.d.ts +7 -5
  151. package/lib-esm/components/hooks/useSelect.d.ts.map +1 -1
  152. package/lib-esm/components/hooks/useSelect.js +3 -1
  153. package/lib-esm/components/hooks/useSelect.js.map +1 -1
  154. package/lib-esm/components/index.d.ts +2 -1
  155. package/lib-esm/components/index.d.ts.map +1 -1
  156. package/lib-esm/components/index.js +2 -1
  157. package/lib-esm/components/index.js.map +1 -1
  158. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
  159. package/lib-esm/components/info-panel/InfoPanel.js +52 -17
  160. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
  161. package/lib-esm/components/logger/FifoLoggerDialog.d.ts +10 -0
  162. package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  163. package/lib-esm/components/logger/FifoLoggerDialog.js +48 -0
  164. package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -0
  165. package/lib-esm/components/logger/FifoLoggerProvider.d.ts +7 -0
  166. package/lib-esm/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  167. package/lib-esm/components/logger/FifoLoggerProvider.js +6 -0
  168. package/lib-esm/components/logger/FifoLoggerProvider.js.map +1 -0
  169. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  170. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  171. package/lib-esm/components/logger/FifoLoggerToolbarItem.js +35 -0
  172. package/lib-esm/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  173. package/lib-esm/components/logger/index.d.ts +5 -0
  174. package/lib-esm/components/logger/index.d.ts.map +1 -0
  175. package/lib-esm/components/logger/index.js +5 -0
  176. package/lib-esm/components/logger/index.js.map +1 -0
  177. package/lib-esm/components/logger/loggerContext.d.ts +4 -0
  178. package/lib-esm/components/logger/loggerContext.d.ts.map +1 -0
  179. package/lib-esm/components/logger/loggerContext.js +3 -0
  180. package/lib-esm/components/logger/loggerContext.js.map +1 -0
  181. package/lib-esm/components/logger/useFifoLogger.d.ts +3 -0
  182. package/lib-esm/components/logger/useFifoLogger.d.ts.map +1 -0
  183. package/lib-esm/components/logger/useFifoLogger.js +20 -0
  184. package/lib-esm/components/logger/useFifoLogger.js.map +1 -0
  185. package/lib-esm/components/table/Table.d.ts +4 -3
  186. package/lib-esm/components/table/Table.d.ts.map +1 -1
  187. package/lib-esm/components/table/Table.js +2 -2
  188. package/lib-esm/components/table/Table.js.map +1 -1
  189. package/lib-esm/components/table/TableHeader.d.ts +3 -1
  190. package/lib-esm/components/table/TableHeader.d.ts.map +1 -1
  191. package/lib-esm/components/table/TableHeader.js +8 -2
  192. package/lib-esm/components/table/TableHeader.js.map +1 -1
  193. package/lib-esm/components/table/TableRow.d.ts +1 -1
  194. package/lib-esm/components/table/TableRow.d.ts.map +1 -1
  195. package/lib-esm/components/table/TableRow.js +6 -19
  196. package/lib-esm/components/table/TableRow.js.map +1 -1
  197. package/lib-esm/components/table/tableContext.d.ts +0 -2
  198. package/lib-esm/components/table/tableContext.d.ts.map +1 -1
  199. package/lib-esm/components/table/tableContext.js +1 -1
  200. package/lib-esm/components/table/tableContext.js.map +1 -1
  201. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts +11 -0
  202. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  203. package/lib-esm/components/toolbar/TooltipHelpContent.js +95 -0
  204. package/lib-esm/components/toolbar/TooltipHelpContent.js.map +1 -0
  205. package/lib-esm/components/toolbar/index.d.ts +1 -0
  206. package/lib-esm/components/toolbar/index.d.ts.map +1 -1
  207. package/lib-esm/components/toolbar/index.js +1 -0
  208. package/lib-esm/components/toolbar/index.js.map +1 -1
  209. package/package.json +15 -13
  210. package/src/app/hooks/file-loading.ts +12 -10
  211. package/src/app/panels/SignalProcessingPanel.tsx +1 -1
  212. package/src/app-data/loaders/biologicLoader.ts +6 -5
  213. package/src/app-data/loaders/cdfLoader.ts +8 -13
  214. package/src/app-data/loaders/jcampLoader.ts +11 -15
  215. package/src/app-data/loaders/loadMeasurements.ts +6 -5
  216. package/src/app-data/loaders/proprietary/agilent/cary500Loader.ts +8 -16
  217. package/src/app-data/loaders/spcLoader.ts +6 -12
  218. package/src/app-data/loaders/utility/measurementLoader.ts +2 -3
  219. package/src/app-data/loaders/wdfLoader.ts +5 -12
  220. package/src/components/button/Button.tsx +12 -5
  221. package/src/components/color-picker/gradient-select/GradientSelect.tsx +82 -46
  222. package/src/components/hooks/useSelect.tsx +13 -8
  223. package/src/components/index.ts +2 -1
  224. package/src/components/info-panel/InfoPanel.tsx +88 -49
  225. package/src/components/logger/FifoLoggerDialog.tsx +129 -0
  226. package/src/components/logger/FifoLoggerProvider.tsx +15 -0
  227. package/src/components/logger/FifoLoggerToolbarItem.tsx +59 -0
  228. package/src/components/logger/index.ts +4 -0
  229. package/src/components/logger/loggerContext.ts +4 -0
  230. package/src/components/logger/useFifoLogger.ts +22 -0
  231. package/src/components/table/Table.tsx +1 -6
  232. package/src/components/table/TableHeader.tsx +15 -3
  233. package/src/components/table/TableRow.tsx +4 -23
  234. package/src/components/table/tableContext.ts +1 -1
  235. package/src/components/toolbar/TooltipHelpContent.tsx +173 -0
  236. package/src/components/toolbar/index.ts +1 -0
@@ -1,7 +1,7 @@
1
1
  /** @jsxImportSource @emotion/react */
2
2
  import { Icon, InputGroup } from '@blueprintjs/core';
3
3
  import { css } from '@emotion/react';
4
- import { Disclosure } from '@headlessui/react';
4
+ import * as Collapsible from '@radix-ui/react-collapsible';
5
5
  import { CSSProperties, useCallback, useMemo, useState } from 'react';
6
6
 
7
7
  import { ValueRenderers } from '../index';
@@ -19,19 +19,49 @@ interface InfoPanelProps {
19
19
  inputStyle?: CSSProperties;
20
20
  }
21
21
  const style = {
22
+ content: css({
23
+ overflow: 'hidden',
24
+ "&[data-state='open']": {
25
+ animation: 'slideDown 300ms ease-out',
26
+ },
27
+ '&[data-state="closed"]': {
28
+ animation: 'slideUp 300ms ease-out',
29
+ },
30
+ '@keyframes slideDown': {
31
+ from: {
32
+ height: 0,
33
+ },
34
+ to: { height: 'var(--radix-collapsible-content-height)' },
35
+ },
36
+ '@keyframes slideUp': {
37
+ from: {
38
+ height: 'var(--radix-collapsible-content-height)',
39
+ },
40
+ to: { height: 0 },
41
+ },
42
+ }),
22
43
  container: css({
23
- padding: '5px',
44
+ padding: '5px 0 0 0',
45
+ height: '100%',
46
+ display: 'flex',
47
+ flexDirection: 'column',
48
+ }),
49
+ chevron: css({
50
+ transition: 'all 0.3s ease-in-out',
24
51
  }),
25
- chevron: (open: boolean) =>
26
- css({
27
- rotate: open ? '90deg' : '0deg',
28
- transition: 'all 0.3s ease-in-out',
29
- }),
30
52
  button: css({
53
+ zIndex: 10,
54
+ position: 'sticky',
55
+ height: 30,
56
+ top: 0,
57
+ "&[data-state='open'] > span": {
58
+ rotate: '90deg',
59
+ },
60
+ cursor: 'pointer',
31
61
  borderBottom: '1px solid #f5f5f5',
62
+ backgroundColor: 'white',
32
63
  display: 'flex',
33
64
  alignItems: 'center',
34
- gap: 5,
35
65
  padding: '5px 2px',
36
66
  width: '100%',
37
67
  ':hover': {
@@ -95,13 +125,19 @@ export function InfoPanel(props: InfoPanelProps) {
95
125
  }, [data, viewData]);
96
126
  return (
97
127
  <div css={style.container}>
98
- <div style={titleStyle}>{title}</div>
128
+ <div
129
+ style={{
130
+ padding: '0 5px',
131
+ ...titleStyle,
132
+ }}
133
+ >
134
+ {title}
135
+ </div>
99
136
  <div
100
137
  tabIndex={0}
101
138
  css={css({
102
- zIndex: 10,
139
+ padding: '0 5px',
103
140
  marginTop: '5px',
104
- position: 'sticky',
105
141
  backgroundColor: 'white',
106
142
  top: '5px',
107
143
  display: 'flex',
@@ -114,7 +150,7 @@ export function InfoPanel(props: InfoPanelProps) {
114
150
  css={css({
115
151
  flexGrow: 1,
116
152
  })}
117
- placeholder="search for a parameter ..."
153
+ placeholder="Search for a parameter"
118
154
  value={search}
119
155
  onChange={({ target }) => {
120
156
  if (target.value !== undefined) {
@@ -130,51 +166,54 @@ export function InfoPanel(props: InfoPanelProps) {
130
166
  </div>
131
167
  <div
132
168
  style={{
169
+ position: 'relative',
133
170
  marginTop: '5px',
134
171
  display: 'flex',
135
172
  flexDirection: 'column',
136
- gap: '5px',
173
+ overflowY: 'auto',
174
+ flex: 1,
137
175
  }}
138
176
  >
139
177
  {filteredData.map(({ description, data }) => {
140
178
  return (
141
- <Disclosure defaultOpen key={description}>
142
- {({ open }) => (
143
- <>
144
- <Disclosure.Button css={style.button}>
145
- <Icon icon="chevron-right" css={style.chevron(open)} />
146
- {description}
147
- </Disclosure.Button>
148
- <Disclosure.Panel>
149
- <Table
150
- striped
151
- css={css({
152
- width: '100%',
153
- })}
154
- compact
179
+ <Collapsible.Root
180
+ key={description}
181
+ className="CollapsibleRoot"
182
+ defaultOpen
183
+ >
184
+ <Collapsible.Trigger asChild css={style.button}>
185
+ <div>
186
+ <Icon icon="chevron-right" css={style.chevron} />
187
+ {description}
188
+ </div>
189
+ </Collapsible.Trigger>
190
+ <Collapsible.Content css={style.content}>
191
+ <Table
192
+ striped
193
+ css={css({
194
+ width: '100%',
195
+ })}
196
+ compact
197
+ >
198
+ <Table.Header>
199
+ <ValueRenderers.Header value="Parameter" />
200
+ <ValueRenderers.Header value="Value" />
201
+ </Table.Header>
202
+ {data.map(([key, value]) => (
203
+ <Table.Row
204
+ key={key}
205
+ style={{
206
+ height: '10px',
207
+ padding: '0 !imporant',
208
+ }}
155
209
  >
156
- <Table.Header>
157
- <ValueRenderers.Header value="Parameter" />
158
- <ValueRenderers.Header value="Value" />
159
- </Table.Header>
160
- {data.map(([key, value]) => (
161
- <Table.Row
162
- key={key}
163
- bordered
164
- style={{
165
- height: '10px',
166
- padding: '0 !imporant',
167
- }}
168
- >
169
- <ValueRenderers.Text value={key} />
170
- {valueCell(value)}
171
- </Table.Row>
172
- ))}
173
- </Table>
174
- </Disclosure.Panel>
175
- </>
176
- )}
177
- </Disclosure>
210
+ <ValueRenderers.Text value={key} />
211
+ {valueCell(value)}
212
+ </Table.Row>
213
+ ))}
214
+ </Table>
215
+ </Collapsible.Content>
216
+ </Collapsible.Root>
178
217
  );
179
218
  })}
180
219
  </div>
@@ -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
+ }
@@ -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,22 @@
1
1
  import type { TableProps } from './Table';
2
2
  import { TableRow } from './TableRow';
3
3
 
4
- export const TableHeader = ({ children, hasBorder, style }: TableProps) => {
4
+ const headerStyle: React.CSSProperties = {
5
+ position: 'sticky',
6
+ top: 0,
7
+ zIndex: 10,
8
+ backgroundColor: 'white',
9
+ };
10
+
11
+ export const TableHeader = ({
12
+ children,
13
+ bordered,
14
+ style,
15
+ sticky,
16
+ }: TableProps & { sticky?: boolean }) => {
5
17
  return (
6
- <thead>
7
- <TableRow hasBorder={hasBorder} style={style}>
18
+ <thead style={sticky ? headerStyle : undefined}>
19
+ <TableRow bordered={bordered} style={style}>
8
20
  {children}
9
21
  </TableRow>
10
22
  </thead>
@@ -1,5 +1,3 @@
1
- /** @jsxImportSource @emotion/react */
2
- import { css } from '@emotion/react';
3
1
  import {
4
2
  Children,
5
3
  HTMLAttributes,
@@ -23,28 +21,16 @@ import { useTableContext } from './tableContext';
23
21
 
24
22
  export type TableRowProps = TableProps & HTMLAttributes<HTMLTableRowElement>;
25
23
 
26
- const styles = {
27
- hasBorder: css({
28
- border: '0.5px solid rgb(0, 0, 0)',
29
- padding: '5px',
30
- position: 'relative',
31
- }),
32
- noBorder: css({
33
- padding: '5px',
34
- position: 'relative',
35
- }),
36
- };
37
-
38
24
  export const TableRow = ({
39
25
  children,
40
26
  style = {},
41
- hasBorder = false,
27
+ bordered = false,
42
28
  ...other
43
29
  }: TableRowProps) => {
44
30
  const { cells } = useRowChildren(children);
45
31
  return (
46
32
  <tr
47
- style={{ border: hasBorder ? '1px solid black' : '', ...style }}
33
+ style={{ border: bordered ? '1px solid black' : '', ...style }}
48
34
  {...other}
49
35
  >
50
36
  {cells}
@@ -54,7 +40,7 @@ export const TableRow = ({
54
40
 
55
41
  function useRowChildren(children: ReactNode) {
56
42
  const cells: ReactElement[] = [];
57
- const { hasBorder, color } = useTableContext();
43
+ const { color } = useTableContext();
58
44
  for (const child of Children.toArray(children)) {
59
45
  if (
60
46
  typeof child === 'object' &&
@@ -69,11 +55,7 @@ function useRowChildren(children: ReactNode) {
69
55
  ) {
70
56
  if (child.type === Header) {
71
57
  cells.push(
72
- <th
73
- key={child.key}
74
- style={{ color }}
75
- css={hasBorder ? styles.hasBorder : styles.noBorder}
76
- >
58
+ <th key={child.key} style={{ color }}>
77
59
  {child}
78
60
  </th>,
79
61
  );
@@ -85,7 +67,6 @@ function useRowChildren(children: ReactNode) {
85
67
  color,
86
68
  position: 'relative',
87
69
  }}
88
- css={hasBorder ? styles.hasBorder : styles.noBorder}
89
70
  >
90
71
  {child}
91
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;