@contember/react-devbar 2.0.0-alpha.4 → 2.0.0-alpha.40

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 (135) hide show
  1. package/api-extractor.json +3 -0
  2. package/dist/development/index.cjs +6 -6
  3. package/dist/development/index.js +6 -6
  4. package/dist/development/{DevErrorManager.cjs → src/DevErrorManager.cjs} +10 -13
  5. package/dist/development/src/DevErrorManager.cjs.map +1 -0
  6. package/dist/development/{DevErrorManager.js → src/DevErrorManager.js} +5 -8
  7. package/dist/development/src/DevErrorManager.js.map +1 -0
  8. package/dist/development/{errorHandling.cjs → src/errorHandling.cjs} +1 -1
  9. package/dist/development/src/errorHandling.cjs.map +1 -0
  10. package/dist/development/{errorHandling.js → src/errorHandling.js} +2 -2
  11. package/dist/development/src/errorHandling.js.map +1 -0
  12. package/dist/development/{hooks → src/hooks}/useParsedStacktrace.cjs +9 -4
  13. package/dist/development/src/hooks/useParsedStacktrace.cjs.map +1 -0
  14. package/dist/{production → development/src}/hooks/useParsedStacktrace.js +6 -1
  15. package/dist/development/src/hooks/useParsedStacktrace.js.map +1 -0
  16. package/dist/development/src/ui/DevBar/DevBar.cjs +191 -0
  17. package/dist/development/src/ui/DevBar/DevBar.cjs.map +1 -0
  18. package/dist/development/src/ui/DevBar/DevBar.js +191 -0
  19. package/dist/development/src/ui/DevBar/DevBar.js.map +1 -0
  20. package/dist/development/{ui → src/ui}/DevError/DevError.cjs +10 -10
  21. package/dist/development/src/ui/DevError/DevError.cjs.map +1 -0
  22. package/dist/development/{ui → src/ui}/DevError/DevError.js +10 -10
  23. package/dist/development/src/ui/DevError/DevError.js.map +1 -0
  24. package/dist/development/{ui → src/ui}/DevError/DevErrorBadge.cjs +2 -2
  25. package/dist/development/src/ui/DevError/DevErrorBadge.cjs.map +1 -0
  26. package/dist/development/{ui → src/ui}/DevError/DevErrorBadge.js +2 -2
  27. package/dist/development/src/ui/DevError/DevErrorBadge.js.map +1 -0
  28. package/dist/development/{ui → src/ui}/DevError/DevErrorInner.cjs +15 -15
  29. package/dist/development/src/ui/DevError/DevErrorInner.cjs.map +1 -0
  30. package/dist/development/{ui → src/ui}/DevError/DevErrorInner.js +15 -15
  31. package/dist/development/src/ui/DevError/DevErrorInner.js.map +1 -0
  32. package/dist/development/{ui → src/ui}/DevError/DevErrorList.cjs +41 -30
  33. package/dist/development/src/ui/DevError/DevErrorList.cjs.map +1 -0
  34. package/dist/development/src/ui/DevError/DevErrorList.js +101 -0
  35. package/dist/development/src/ui/DevError/DevErrorList.js.map +1 -0
  36. package/dist/development/{ui → src/ui}/DevError/StackTrace.cjs +10 -10
  37. package/dist/development/src/ui/DevError/StackTrace.cjs.map +1 -0
  38. package/dist/development/{ui → src/ui}/DevError/StackTrace.js +10 -10
  39. package/dist/development/src/ui/DevError/StackTrace.js.map +1 -0
  40. package/dist/production/index.cjs +6 -6
  41. package/dist/production/index.js +6 -6
  42. package/dist/production/{errorHandling.cjs → src/errorHandling.cjs} +1 -0
  43. package/dist/production/src/errorHandling.cjs.map +1 -0
  44. package/dist/production/{errorHandling.js → src/errorHandling.js} +1 -0
  45. package/dist/production/src/errorHandling.js.map +1 -0
  46. package/dist/production/{hooks → src/hooks}/useParsedStacktrace.cjs +9 -4
  47. package/dist/production/src/hooks/useParsedStacktrace.cjs.map +1 -0
  48. package/dist/{development → production/src}/hooks/useParsedStacktrace.js +6 -1
  49. package/dist/production/src/hooks/useParsedStacktrace.js.map +1 -0
  50. package/dist/production/src/ui/DevBar/DevBar.cjs +123 -0
  51. package/dist/production/src/ui/DevBar/DevBar.cjs.map +1 -0
  52. package/dist/production/src/ui/DevBar/DevBar.js +123 -0
  53. package/dist/production/src/ui/DevBar/DevBar.js.map +1 -0
  54. package/dist/production/src/ui/DevError/DevError.cjs.map +1 -0
  55. package/dist/production/src/ui/DevError/DevError.js.map +1 -0
  56. package/dist/production/src/ui/DevError/DevErrorBadge.cjs.map +1 -0
  57. package/dist/production/src/ui/DevError/DevErrorBadge.js.map +1 -0
  58. package/dist/production/{ui → src/ui}/DevError/DevErrorInner.cjs +1 -1
  59. package/dist/production/src/ui/DevError/DevErrorInner.cjs.map +1 -0
  60. package/dist/production/{ui → src/ui}/DevError/DevErrorInner.js +1 -1
  61. package/dist/production/src/ui/DevError/DevErrorInner.js.map +1 -0
  62. package/dist/production/{ui → src/ui}/DevError/DevErrorList.cjs +11 -4
  63. package/dist/production/src/ui/DevError/DevErrorList.cjs.map +1 -0
  64. package/dist/production/{ui → src/ui}/DevError/DevErrorList.js +11 -4
  65. package/dist/production/src/ui/DevError/DevErrorList.js.map +1 -0
  66. package/dist/production/src/ui/DevError/StackTrace.cjs.map +1 -0
  67. package/dist/production/src/ui/DevError/StackTrace.js.map +1 -0
  68. package/dist/types/hooks/useParsedStacktrace.d.ts +1 -1
  69. package/dist/types/hooks/useParsedStacktrace.d.ts.map +1 -1
  70. package/dist/types/tsconfig.tsbuildinfo +1 -1
  71. package/dist/types/ui/DevBar/DevBar.d.ts +5 -4
  72. package/dist/types/ui/DevBar/DevBar.d.ts.map +1 -1
  73. package/dist/types/ui/DevError/DevError.d.ts.map +1 -1
  74. package/dist/types/ui/DevError/DevErrorList.d.ts.map +1 -1
  75. package/package.json +11 -21
  76. package/src/DevErrorManager.tsx +4 -4
  77. package/src/hooks/useParsedStacktrace.ts +6 -1
  78. package/src/index.css +448 -2
  79. package/src/tsconfig.json +5 -2
  80. package/src/ui/DevBar/DevBar.tsx +76 -101
  81. package/src/ui/DevError/DevError.tsx +0 -1
  82. package/src/ui/DevError/DevErrorInner.tsx +1 -1
  83. package/src/ui/DevError/DevErrorList.tsx +14 -5
  84. package/tsconfig.json +7 -0
  85. package/tsdoc.json +6 -0
  86. package/dist/assets/index.css +0 -377
  87. package/dist/development/DevErrorManager.cjs.map +0 -1
  88. package/dist/development/DevErrorManager.js.map +0 -1
  89. package/dist/development/errorHandling.cjs.map +0 -1
  90. package/dist/development/errorHandling.js.map +0 -1
  91. package/dist/development/hooks/useParsedStacktrace.cjs.map +0 -1
  92. package/dist/development/hooks/useParsedStacktrace.js.map +0 -1
  93. package/dist/development/ui/DevBar/DevBar.cjs +0 -237
  94. package/dist/development/ui/DevBar/DevBar.cjs.map +0 -1
  95. package/dist/development/ui/DevBar/DevBar.js +0 -237
  96. package/dist/development/ui/DevBar/DevBar.js.map +0 -1
  97. package/dist/development/ui/DevError/DevError.cjs.map +0 -1
  98. package/dist/development/ui/DevError/DevError.js.map +0 -1
  99. package/dist/development/ui/DevError/DevErrorBadge.cjs.map +0 -1
  100. package/dist/development/ui/DevError/DevErrorBadge.js.map +0 -1
  101. package/dist/development/ui/DevError/DevErrorInner.cjs.map +0 -1
  102. package/dist/development/ui/DevError/DevErrorInner.js.map +0 -1
  103. package/dist/development/ui/DevError/DevErrorList.cjs.map +0 -1
  104. package/dist/development/ui/DevError/DevErrorList.js +0 -90
  105. package/dist/development/ui/DevError/DevErrorList.js.map +0 -1
  106. package/dist/development/ui/DevError/StackTrace.cjs.map +0 -1
  107. package/dist/development/ui/DevError/StackTrace.js.map +0 -1
  108. package/dist/production/errorHandling.cjs.map +0 -1
  109. package/dist/production/errorHandling.js.map +0 -1
  110. package/dist/production/hooks/useParsedStacktrace.cjs.map +0 -1
  111. package/dist/production/hooks/useParsedStacktrace.js.map +0 -1
  112. package/dist/production/ui/DevBar/DevBar.cjs +0 -161
  113. package/dist/production/ui/DevBar/DevBar.cjs.map +0 -1
  114. package/dist/production/ui/DevBar/DevBar.js +0 -161
  115. package/dist/production/ui/DevBar/DevBar.js.map +0 -1
  116. package/dist/production/ui/DevError/DevError.cjs.map +0 -1
  117. package/dist/production/ui/DevError/DevError.js.map +0 -1
  118. package/dist/production/ui/DevError/DevErrorBadge.cjs.map +0 -1
  119. package/dist/production/ui/DevError/DevErrorBadge.js.map +0 -1
  120. package/dist/production/ui/DevError/DevErrorInner.cjs.map +0 -1
  121. package/dist/production/ui/DevError/DevErrorInner.js.map +0 -1
  122. package/dist/production/ui/DevError/DevErrorList.cjs.map +0 -1
  123. package/dist/production/ui/DevError/DevErrorList.js.map +0 -1
  124. package/dist/production/ui/DevError/StackTrace.cjs.map +0 -1
  125. package/dist/production/ui/DevError/StackTrace.js.map +0 -1
  126. package/src/ui/DevBar/index.css +0 -171
  127. package/src/ui/DevError/DevError.css +0 -191
  128. package/src/ui/DevError/DevErrorBadge.css +0 -16
  129. package/src/ui/DevError/index.css +0 -2
  130. /package/dist/production/{ui → src/ui}/DevError/DevError.cjs +0 -0
  131. /package/dist/production/{ui → src/ui}/DevError/DevError.js +0 -0
  132. /package/dist/production/{ui → src/ui}/DevError/DevErrorBadge.cjs +0 -0
  133. /package/dist/production/{ui → src/ui}/DevError/DevErrorBadge.js +0 -0
  134. /package/dist/production/{ui → src/ui}/DevError/StackTrace.cjs +0 -0
  135. /package/dist/production/{ui → src/ui}/DevError/StackTrace.js +0 -0
package/src/index.css CHANGED
@@ -1,2 +1,448 @@
1
- @import "./ui/DevBar/index.css";
2
- @import "./ui/DevError/index.css";
1
+ .cui-devBar {
2
+ align-items: center;
3
+ bottom: 0;
4
+ display: flex;
5
+ flex-direction: column;
6
+ position: fixed;
7
+ z-index: 50;
8
+ left: 0;
9
+ right: 0;
10
+ opacity: 1;
11
+ padding: 1rem;
12
+ transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
13
+ }
14
+
15
+ .cui-devBar-content,
16
+ .cui-devBar-panel-content {
17
+ background-color: hsl(0, 0%, 15%);
18
+ color: hsl(0, 0%, 90%);
19
+ }
20
+
21
+ .cui-devBar-content {
22
+ align-self: center;
23
+ align-items: center;
24
+ border-radius: 0.75rem;
25
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
26
+ display: flex;
27
+ gap: 0.75rem;
28
+ padding: 0.35rem;
29
+ margin: 0 auto;
30
+ border: 1px solid hsl(0 0 85);
31
+ }
32
+
33
+ .cui-devBar-close,
34
+ .cui-devBar-trigger-label,
35
+ .cui-devBar-brand {
36
+ align-items: center;
37
+ height: 2.5rem;
38
+ border-radius: 0.5rem;
39
+ justify-content: center;
40
+ max-height: 2.5rem;
41
+ min-height: 2.5rem;
42
+ white-space: nowrap;
43
+ }
44
+
45
+ .cui-devBar-close {
46
+ background: transparent;
47
+ cursor: pointer;
48
+ display: flex;
49
+ max-width: 2.5rem;
50
+ width: 2.5rem;
51
+ order: 999;
52
+ transition: background-color 200ms;
53
+ }
54
+
55
+ .cui-devBar-close:hover {
56
+ background-color: hsl(0 0 96);
57
+ }
58
+
59
+ .cui-devBar-brand {
60
+ align-items: center;
61
+ display: flex;
62
+ gap: 0.75rem;
63
+ text-align: right;
64
+ }
65
+
66
+ .cui-devBar-trigger-label {
67
+ align-items: center;
68
+ color: inherit;
69
+ cursor: pointer;
70
+ display: inline-flex;
71
+ font-weight: 500;
72
+ gap: 0.3rem;
73
+ padding: 0 0.75rem;
74
+ transition: background-color 200ms;
75
+ }
76
+
77
+ .cui-devBar-trigger-label:hover {
78
+ background-color: hsl(0, 0%, 3%);
79
+ }
80
+
81
+ .cui-devBar-panel-content {
82
+ background: hsl(0 0 100);
83
+ border: 1px solid hsl(0 0 85);
84
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
85
+ border-radius: 0.75rem;
86
+ display: flex;
87
+ min-width: min(20rem, 100%);
88
+ max-width: 100%;
89
+ flex-direction: column;
90
+ flex-shrink: 1;
91
+ }
92
+
93
+ .cui-devBar-panel-content h2 {
94
+ font-weight: 600;
95
+ margin-bottom: 0;
96
+ border-radius: 0.75rem 0.75rem 0 0;
97
+ background: #f8f8f8;
98
+ }
99
+
100
+ .cui-devBar-panel-body {
101
+ border-top: 1px solid hsl(0 0 85);
102
+ display: flex;
103
+ flex-direction: column;
104
+ gap: 1rem;
105
+ padding: 1.25rem;
106
+ color: hsl(0 0 10);
107
+ }
108
+
109
+ .cui-devBar-panel {
110
+ padding: 0;
111
+ border: none;
112
+ border-radius: 0.75rem;
113
+ background: transparent;
114
+ }
115
+
116
+ .cui-devBar-panel::backdrop {
117
+ background: hsl(0 0 100 / 0.8);
118
+ }
119
+
120
+ .cui-devBar-panel[open] {
121
+ animation: dialog-show 150ms cubic-bezier(0.16, 1, 0.3, 1);
122
+ }
123
+
124
+ .cui-devBar-panel-header {
125
+ display: flex;
126
+ justify-content: space-between;
127
+ align-items: center;
128
+ padding: 0.75rem 1rem;
129
+ background: #f8f8f8;
130
+ border-radius: 0.75rem 0.75rem 0 0;
131
+ border-bottom: 1px solid hsl(0 0 85);
132
+ color: hsl(0 0 10);
133
+ }
134
+
135
+ .cui-devBar-close-button {
136
+ padding: 0.25rem 0.5rem;
137
+ background: transparent;
138
+ border: none;
139
+ border-radius: 0.375rem;
140
+ cursor: pointer;
141
+ font-size: 1.25rem;
142
+ line-height: 1;
143
+ color: hsl(0 0 10);
144
+ transition: background-color 200ms;
145
+ }
146
+
147
+ .cui-devBar-close-button:hover {
148
+ background-color: hsl(0 0 90);
149
+ }
150
+
151
+ @keyframes dialog-show {
152
+ from {
153
+ opacity: 0;
154
+ transform: translateY(10px);
155
+ }
156
+ to {
157
+ opacity: 1;
158
+ transform: translateY(0);
159
+ }
160
+ }
161
+
162
+ /* Media Queries */
163
+ @media screen and (min-width: 768px) {
164
+ .cui-devBar-trigger {
165
+ position: relative;
166
+ }
167
+
168
+ .cui-devBar-panel-content {
169
+ min-width: unset;
170
+ max-width: unset;
171
+ }
172
+
173
+ .cui-devBar-panel-body {
174
+ min-width: 20rem;
175
+ }
176
+ }
177
+
178
+ /* Hidden States */
179
+ .cui-devBar:not([data-expanded]) {
180
+ transform: translateY(2rem);
181
+ opacity: 0;
182
+ max-width: 5rem;
183
+ margin: auto;
184
+ }
185
+
186
+ .cui-devBar:not([data-expanded]):hover,
187
+ .cui-devBar:not([data-expanded]):focus-within {
188
+ transform: unset;
189
+ opacity: 1;
190
+ }
191
+
192
+ [id^="dev-bar-panel"]:not([data-expanded]) > * {
193
+ display: none;
194
+ }
195
+
196
+ .cui-devBar-panel .cui-table-wrapper {
197
+ overflow: auto;
198
+ }
199
+
200
+
201
+ /* Error styles */
202
+ .cui-devError {
203
+ position: fixed;
204
+ inset: 0;
205
+ width: 100vw;
206
+ height: 100vh;
207
+ z-index: 50;
208
+ display: flex;
209
+ justify-content: center;
210
+ align-items: flex-start;
211
+ background: rgba(212, 212, 212, 0.66);
212
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
213
+ }
214
+
215
+ .cui-devError-in {
216
+ z-index: 51;
217
+ width: 100%;
218
+ height: 100%;
219
+ color: #333333;
220
+ background: #222222;
221
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
222
+ display: flex;
223
+ flex-direction: column;
224
+ overflow: hidden;
225
+ }
226
+
227
+ .cui-devError-header {
228
+ position: sticky;
229
+ top: 0;
230
+ background: #cd1818;
231
+ color: #ffffff;
232
+ padding: 0.5em 1em;
233
+ border-bottom: 1px solid #980a0a;
234
+ }
235
+
236
+ .cui-devError-content {
237
+ overflow: auto;
238
+ }
239
+
240
+ .cui-devError-errorMessage,
241
+ .cui-devError-errorName,
242
+ .cui-devError-errorDetails {
243
+ margin: 0;
244
+ flex: 0 0 auto;
245
+ font-weight: 400;
246
+ white-space: pre-wrap;
247
+ overflow-wrap: break-word;
248
+ line-height: 1.5;
249
+ }
250
+
251
+ .cui-devError-errorMessage {
252
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
253
+ margin-top: 0.75rem;
254
+ font-size: 1.25rem;
255
+ }
256
+
257
+ .cui-devError-errorDetails {
258
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
259
+ margin-top: 0.75rem;
260
+ font-size: 0.875rem;
261
+ white-space: pre;
262
+ }
263
+
264
+ .cui-devError-causeLink {
265
+ color: #ffcc00;
266
+ text-decoration: underline;
267
+ text-underline-offset: 4px;
268
+ }
269
+
270
+ .cui-devError-stack {
271
+ flex: 1 1 auto;
272
+ }
273
+
274
+ .cui-devError-stack-dump {
275
+ color: #ffffff;
276
+ margin-top: 1rem;
277
+ padding: 1rem;
278
+ white-space: pre-wrap;
279
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
280
+ font-size: 0.875rem;
281
+ }
282
+
283
+ .cui-devError-bar {
284
+ padding: 0.5rem 0.5rem 0.5rem 1rem;
285
+ background: #ac1616;
286
+ color: #eeeeee;
287
+ display: flex;
288
+ align-items: center;
289
+ }
290
+
291
+ .cui-devError-causedBy {
292
+ padding: 0.5rem 0.5rem 0.5rem 1rem;
293
+ background: #ffcc00;
294
+ color: #000000;
295
+ display: flex;
296
+ align-items: center;
297
+ }
298
+
299
+ .cui-devError-actions {
300
+ margin-left: auto;
301
+ display: flex;
302
+ gap: 0.5rem;
303
+ }
304
+
305
+ .cui-devError-actions .cui-button {
306
+ color: #ffffff;
307
+ border-color: #cbcbcb;
308
+ padding: 0.5rem 1rem;
309
+ border-radius: 0.375rem;
310
+ font-weight: 500;
311
+ transition: all 200ms;
312
+ }
313
+
314
+ .cui-devError-actions .cui-button:hover {
315
+ color: #ffffff;
316
+ }
317
+
318
+ .cui-devError-close {
319
+ margin-left: 1rem;
320
+ }
321
+
322
+ .cui-devError-close .cui-button {
323
+ border-color: transparent;
324
+ }
325
+
326
+ .cui-devError-switcher {
327
+ display: flex;
328
+ align-items: center;
329
+ margin-left: 2rem;
330
+ gap: 0.75rem;
331
+ }
332
+
333
+ .cui-devError-switcherButtons {
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 0.5rem;
337
+ }
338
+
339
+ .cui-devError-closeButton,
340
+ .cui-devError-switcherButton {
341
+ border: 1px solid #cbcbcb;
342
+ border-radius: 0.375rem;
343
+ padding: 0.375rem 0.75rem;
344
+ font-size: 0.875rem;
345
+ font-weight: 500;
346
+ transition: all 200ms;
347
+ background: transparent;
348
+ }
349
+
350
+ .cui-devError-closeButton:hover,
351
+ .cui-devError-switcherButton:hover {
352
+ border-color: #910f0f;
353
+ background: #910f0f;
354
+ }
355
+
356
+ .cui-devError-errorCount {
357
+ margin: 0;
358
+ margin-right: 0.75rem;
359
+ font-weight: 500;
360
+ }
361
+
362
+ /* Stack Frame Styles */
363
+ .cui-devError-stackFrame {
364
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
365
+ border-bottom: 1px solid #666666;
366
+ }
367
+
368
+ .cui-devError-stackFrameHeader {
369
+ display: flex;
370
+ padding: 0.75rem 1rem;
371
+ background: #333333;
372
+ color: #ffffff;
373
+ border-bottom: 1px solid #666666;
374
+ }
375
+
376
+ .cui-devError-stackFrameSource {
377
+ margin-left: 0.5rem;
378
+ color: hsl(0, 0%, 88%);
379
+ }
380
+
381
+ .cui-devError-stackFrameCallee {
382
+ margin-left: 1rem;
383
+ color: #a4ffa4
384
+ }
385
+
386
+ .cui-devError-stackFrameCode {
387
+ background: #222222;
388
+ color: #d5d5d5;
389
+ }
390
+
391
+ .cui-devError-stackFrameLine {
392
+ display: flex;
393
+ transition: all 200ms;
394
+ }
395
+
396
+ .cui-devError-stackFrameLine.is-active {
397
+ color: hsl(0, 0%, 100%);
398
+ background: hsl(0, 79%, 45%);
399
+ }
400
+
401
+ .cui-devError-stackFrameLine.is-active .cui-devError-stackFrameLineNumber {
402
+ color: hsl(0, 0%, 100%);
403
+ }
404
+
405
+ .cui-devError-stackFrameLineNumber {
406
+ color: hsl(0, 0%, 53%);
407
+ flex: 0 0 50px;
408
+ text-align: right;
409
+ padding: 0.375rem;
410
+ user-select: none;
411
+ }
412
+
413
+ .cui-devError-stackFrameLineCode {
414
+ padding: 0.375rem 1rem;
415
+ white-space: pre-wrap;
416
+ tab-size: 4;
417
+ }
418
+
419
+ /* Error Badge Styles */
420
+ .cui-devErrorBadge {
421
+ position: fixed;
422
+ bottom: 1.25rem;
423
+ left: 1.25rem;
424
+ z-index: 50;
425
+ }
426
+
427
+ .cui-devErrorBadge-button {
428
+ display: inline-flex;
429
+ align-items: center;
430
+ background: hsl(0, 79%, 45%);
431
+ color: hsl(0, 0%, 100%);
432
+ font-weight: 600;
433
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
434
+ border-radius: 0.75rem;
435
+ padding: 0.75rem 1.5rem;
436
+ cursor: pointer;
437
+ transition: all 200ms;
438
+ }
439
+
440
+ .cui-devErrorBadge-button:hover {
441
+ background: hsl(0, 79%, 45%);
442
+ color: hsl(0, 0%, 100%);
443
+ transform: translateY(-1px);
444
+ }
445
+
446
+ .cui-devError-body {
447
+ overflow: hidden;
448
+ }
package/src/tsconfig.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "extends": "../../../tsconfig.settings.json",
3
3
  "compilerOptions": {
4
- "outDir": "../dist/types"
4
+ "outDir": "../dist/types",
5
+ "types": [
6
+ "vite/client"
7
+ ]
5
8
  },
6
9
  "references": [
7
10
  { "path": "../../react-utils/src" },
8
- { "path": "../../utilities/src" },
11
+ { "path": "../../utilities/src" }
9
12
  ]
10
13
  }
@@ -1,26 +1,22 @@
1
1
  import {
2
2
  useId,
3
3
  useOnElementClickOutsideCallback,
4
- useOnElementMouseEnterDelayedCallback,
5
4
  useReferentiallyStableCallback,
6
5
  useWindowSize,
7
6
  } from '@contember/react-utils'
8
7
  import { dataAttribute } from '@contember/utilities'
9
- import { PropsWithChildren, ReactNode, useEffect, useRef, useState } from 'react'
8
+ import { PropsWithChildren, ReactNode, useCallback, useEffect, useRef, useState } from 'react'
10
9
 
11
10
  const className = (cls: string | null) => cls ? `cui-devBar-${cls}` : 'cui-devBar'
12
11
 
13
12
  export const DevBar = ({
14
13
  breakpoint = 768,
15
14
  children,
16
- brand,
17
15
  }: PropsWithChildren<{
18
- brand?: ReactNode;
19
- breakpoint?: number;
16
+ breakpoint?: number
20
17
  }>) => {
21
- const [expanded, setExpanded] = useState(true)
18
+ const [expanded, setExpanded] = useState(false)
22
19
  const isSmallScreen = useWindowSize().width < breakpoint
23
- const toggleButtonRef = useRef<HTMLButtonElement>(null)
24
20
 
25
21
  const handleToggle = useReferentiallyStableCallback(() => {
26
22
  setExpanded(expanded => !expanded)
@@ -32,16 +28,7 @@ export const DevBar = ({
32
28
  event.preventDefault()
33
29
  event.stopPropagation()
34
30
 
35
- if (expanded) {
36
- setExpanded(false)
37
- toggleButtonRef.current?.blur()
38
- } else {
39
- if (toggleButtonRef.current !== document.activeElement) {
40
- toggleButtonRef.current?.focus()
41
- } else {
42
- toggleButtonRef.current?.blur()
43
- }
44
- }
31
+ handleToggle()
45
32
  }
46
33
  }
47
34
 
@@ -54,7 +41,6 @@ export const DevBar = ({
54
41
  useOnElementClickOutsideCallback(devBarContentRef, () => {
55
42
  if (expanded) {
56
43
  setExpanded(false)
57
- toggleButtonRef.current?.blur()
58
44
  }
59
45
  })
60
46
 
@@ -62,125 +48,114 @@ export const DevBar = ({
62
48
 
63
49
  return (
64
50
  <section
65
- data-transparent
66
- data-overrides-lucide-icons
51
+ data-transparent="true"
52
+ data-overrides-lucide-icons="true"
67
53
  data-expanded={dataAttribute(expanded)}
68
54
  data-small-screen={dataAttribute(isSmallScreen)}
69
55
  className={className(null)}
70
- onKeyDown={event => {
71
- if (event.code === 'Escape') {
72
- event.preventDefault()
73
- event.stopPropagation()
74
-
75
- if (expanded) {
76
- setExpanded(false)
77
- } else if (document.activeElement && document.activeElement instanceof HTMLElement) {
78
- document.activeElement.blur()
79
- }
80
- }
81
- }}
82
56
  >
83
- <style>{`svg { pointer-events: none }`}</style>
84
57
  <div ref={devBarContentRef} className={className('content')}>
85
58
  <div
86
- data-expanded={dataAttribute(expanded)}
59
+ data-expanded={true}
87
60
  id={id}
88
61
  role="dialog"
89
62
  style={{ display: 'contents' }}
90
63
  >
91
- <div className={className('brand')}>
92
- {brand}
93
-
94
- </div>
95
-
96
64
  <div className={className('panels')}>
97
65
  {children}
98
66
  </div>
99
-
100
67
  </div>
101
-
102
- <button
103
- ref={toggleButtonRef}
104
- id="dev-bar-toggle-button"
105
- aria-label="Toggle Contember Developer Toolbar"
106
- aria-controls={id}
107
- aria-expanded={expanded}
108
- className={className('close')}
109
- onClick={handleToggle}
110
- tabIndex={0}
111
- >
112
- {expanded ? '🗙' : 'ᐸ'}
113
- </button>
114
68
  </div>
115
69
  </section>
116
70
  )
117
71
  }
118
72
 
119
- export const DevPanel = ({ heading, icon, children, preview }: {
120
- icon: ReactNode;
121
- heading: ReactNode,
122
- children: ReactNode,
73
+ interface DevPanelProps {
74
+ icon: ReactNode
75
+ heading: ReactNode
76
+ children: ReactNode
123
77
  preview?: ReactNode
124
- }) => {
78
+ }
79
+
80
+ export const DevPanel = ({ heading, icon, children, preview }: DevPanelProps) => {
125
81
  const id = `cui-devBar-panel-${useId()}`
126
- const [expanded, setExpanded] = useState(false)
127
- const mouseEnterTimeStampRef = useRef<ReturnType<typeof Date.now> | undefined>(undefined)
82
+ const dialogRef = useRef<HTMLDialogElement>(null)
83
+ const triggerRef = useRef<HTMLButtonElement>(null)
84
+
85
+ const handleOpen = useCallback(() => {
86
+ dialogRef.current?.showModal()
87
+ }, [])
88
+
89
+ const handleClose = useCallback(() => {
90
+ dialogRef.current?.close()
91
+ }, [])
128
92
 
129
- const devPanelRef = useRef<HTMLDivElement>(null)
93
+ useEffect(() => {
94
+ const dialog = dialogRef.current
95
+ if (!dialog) return
96
+
97
+ const handleClickOutside = (event: MouseEvent) => {
98
+ const rect = dialog.getBoundingClientRect()
99
+ const isInDialog = (
100
+ rect.top <= event.clientY &&
101
+ event.clientY <= rect.top + rect.height &&
102
+ rect.left <= event.clientX &&
103
+ event.clientX <= rect.left + rect.width
104
+ )
105
+
106
+ if (!isInDialog) {
107
+ dialog.close()
108
+ }
109
+ }
130
110
 
131
- useOnElementMouseEnterDelayedCallback(devPanelRef, useReferentiallyStableCallback(({ type }) => {
132
- if (type === 'mouseenter') {
133
- mouseEnterTimeStampRef.current = Date.now() + 300
134
- setExpanded(true)
111
+ dialog.addEventListener('click', handleClickOutside)
112
+ return () => dialog.removeEventListener('click', handleClickOutside)
113
+ }, [])
114
+
115
+ useEffect(() => {
116
+ const handleEscape = (event: KeyboardEvent) => {
117
+ if (event.key === 'Escape') {
118
+ handleClose()
119
+ }
135
120
  }
136
- }))
121
+
122
+ document.addEventListener('keydown', handleEscape)
123
+ return () => document.removeEventListener('keydown', handleEscape)
124
+ }, [handleClose])
137
125
 
138
126
  return (
139
- <div
140
- ref={devPanelRef}
141
- data-expanded={dataAttribute(expanded)}
142
- className={className('trigger')}
143
- onMouseLeave={useReferentiallyStableCallback(() => {
144
- setExpanded(false)
145
- })}
146
- onKeyDown={useReferentiallyStableCallback(event => {
147
- if (expanded && event.code === 'Escape') {
148
- event.preventDefault()
149
- event.stopPropagation()
150
- setExpanded(false)
151
- }
152
- })}
153
- >
127
+ <div className={className('trigger')}>
154
128
  <button
129
+ ref={triggerRef}
155
130
  tabIndex={0}
156
131
  aria-haspopup="dialog"
157
132
  aria-controls={id}
158
- aria-expanded={expanded}
159
133
  className={className('trigger-label')}
160
- onClick={useReferentiallyStableCallback(() => {
161
- if (mouseEnterTimeStampRef.current && Date.now() < mouseEnterTimeStampRef.current) {
162
- return
163
- } else {
164
- setExpanded(expanded => !expanded)
165
- mouseEnterTimeStampRef.current = undefined
166
- }
167
- })}
134
+ onClick={handleOpen}
168
135
  >
169
136
  {icon}
170
- <span className={className('trigger-label-text')}>{preview ?? heading}</span>
137
+ <span className={className('trigger-label-text')}>
138
+ {preview ?? heading}
139
+ </span>
171
140
  </button>
172
- {expanded && (
173
- <div tabIndex={0} id={id} role="dialog" className={className('panel')}>
174
- <div className={className('panel-content')}>
175
- <h2 className="h4">
176
- {heading}
177
- </h2>
178
- <div className={className('panel-body')}>
179
- {children}
180
- </div>
141
+
142
+ <dialog ref={dialogRef} id={id} className={className('panel')}>
143
+ <div className={className('panel-content')}>
144
+ <div className={className('panel-header')}>
145
+ <h2 className="h4">{heading}</h2>
146
+ <button
147
+ onClick={handleClose}
148
+ className={className('close-button')}
149
+ aria-label="Close"
150
+ >
151
+ ✕
152
+ </button>
153
+ </div>
154
+ <div className={className('panel-body')}>
155
+ {children}
181
156
  </div>
182
157
  </div>
183
- )}
158
+ </dialog>
184
159
  </div>
185
160
  )
186
161
  }
@@ -7,7 +7,6 @@ export interface DevErrorProps extends DevErrorInnerProps {
7
7
  const className = (cls?: string | null) => cls ? `cui-devError-${cls}` : 'cui-devError'
8
8
 
9
9
  export function DevError(props: DevErrorProps) {
10
-
11
10
  return (
12
11
  <div className={className()}>
13
12
  <div className={className('in')}>