lognal 0.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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/dist/core/filter.d.ts +29 -0
  4. package/dist/core/filter.js +82 -0
  5. package/dist/core/layout/entry-lines.d.ts +16 -0
  6. package/dist/core/layout/entry-lines.js +120 -0
  7. package/dist/core/layout/layout.d.ts +152 -0
  8. package/dist/core/layout/layout.js +784 -0
  9. package/dist/core/layout/row-index.d.ts +33 -0
  10. package/dist/core/layout/row-index.js +99 -0
  11. package/dist/core/layout/types.d.ts +128 -0
  12. package/dist/core/layout/types.js +8 -0
  13. package/dist/core/store.d.ts +96 -0
  14. package/dist/core/store.js +204 -0
  15. package/dist/core/text/ansi.d.ts +20 -0
  16. package/dist/core/text/ansi.js +187 -0
  17. package/dist/core/text/graphemes.d.ts +17 -0
  18. package/dist/core/text/graphemes.js +70 -0
  19. package/dist/core/text/line-splitter.d.ts +18 -0
  20. package/dist/core/text/line-splitter.js +56 -0
  21. package/dist/core/text/measure.d.ts +10 -0
  22. package/dist/core/text/measure.js +38 -0
  23. package/dist/core/text/shape.d.ts +24 -0
  24. package/dist/core/text/shape.js +220 -0
  25. package/dist/core/text/unicode-width-data.d.ts +54 -0
  26. package/dist/core/text/unicode-width-data.js +227 -0
  27. package/dist/core/text/width.d.ts +20 -0
  28. package/dist/core/text/width.js +157 -0
  29. package/dist/core/text/wrap.d.ts +14 -0
  30. package/dist/core/text/wrap.js +94 -0
  31. package/dist/core/time.d.ts +10 -0
  32. package/dist/core/time.js +24 -0
  33. package/dist/core/types.d.ts +131 -0
  34. package/dist/core/types.js +9 -0
  35. package/dist/core/value/preview.d.ts +16 -0
  36. package/dist/core/value/preview.js +207 -0
  37. package/dist/index.d.ts +27 -0
  38. package/dist/index.js +24 -0
  39. package/dist/lognal.css +589 -0
  40. package/dist/react/LogViewer.d.ts +32 -0
  41. package/dist/react/LogViewer.js +183 -0
  42. package/dist/react/index.d.ts +1 -0
  43. package/dist/react/index.js +2 -0
  44. package/dist/renderer/canvas/canvas-renderer.d.ts +45 -0
  45. package/dist/renderer/canvas/canvas-renderer.js +464 -0
  46. package/dist/renderer/canvas/palette.d.ts +6 -0
  47. package/dist/renderer/canvas/palette.js +25 -0
  48. package/dist/renderer/theme.d.ts +3 -0
  49. package/dist/renderer/theme.js +52 -0
  50. package/dist/renderer/types.d.ts +82 -0
  51. package/dist/renderer/types.js +1 -0
  52. package/dist/sources/console/format.d.ts +32 -0
  53. package/dist/sources/console/format.js +189 -0
  54. package/dist/sources/console/hook.d.ts +27 -0
  55. package/dist/sources/console/hook.js +94 -0
  56. package/dist/sources/console/recorder.d.ts +41 -0
  57. package/dist/sources/console/recorder.js +239 -0
  58. package/dist/sources/console/snapshot.d.ts +22 -0
  59. package/dist/sources/console/snapshot.js +547 -0
  60. package/dist/sources/console/table.d.ts +9 -0
  61. package/dist/sources/console/table.js +87 -0
  62. package/dist/sources/text/encoding.d.ts +11 -0
  63. package/dist/sources/text/encoding.js +59 -0
  64. package/dist/sources/text/follow-file.d.ts +49 -0
  65. package/dist/sources/text/follow-file.js +109 -0
  66. package/dist/sources/text/read-file.d.ts +63 -0
  67. package/dist/sources/text/read-file.js +82 -0
  68. package/dist/viewer/icons.d.ts +14 -0
  69. package/dist/viewer/icons.js +30 -0
  70. package/dist/viewer/input-line.d.ts +46 -0
  71. package/dist/viewer/input-line.js +144 -0
  72. package/dist/viewer/labels.d.ts +35 -0
  73. package/dist/viewer/labels.js +61 -0
  74. package/dist/viewer/scrollbar.d.ts +27 -0
  75. package/dist/viewer/scrollbar.js +143 -0
  76. package/dist/viewer/theme.d.ts +15 -0
  77. package/dist/viewer/theme.js +105 -0
  78. package/dist/viewer/viewer.d.ts +217 -0
  79. package/dist/viewer/viewer.js +1201 -0
  80. package/package.json +92 -0
@@ -0,0 +1,589 @@
1
+ /*
2
+ * lognal viewer styles.
3
+ *
4
+ * Every color and size is a `--lognal-*` custom property on `.lognal`. The canvas reads the
5
+ * colors from these properties, so a theme is written once, in CSS. Override them on `.lognal`
6
+ * or on a class of your own to restyle the viewer.
7
+ */
8
+
9
+ .lognal {
10
+ /* Text grid */
11
+ --lognal-font-family:
12
+ ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'D2Coding', 'Noto Sans Mono CJK KR',
13
+ 'Liberation Mono', monospace;
14
+ --lognal-font-size: 13px;
15
+ --lognal-font-weight: 400;
16
+ --lognal-line-height: 1.6;
17
+
18
+ /* Chrome */
19
+ --lognal-ui-font-family:
20
+ system-ui, -apple-system, 'Segoe UI', 'Apple SD Gothic Neo', 'Malgun Gothic', sans-serif;
21
+ --lognal-ui-font-size: 12px;
22
+ --lognal-radius: 10px;
23
+ --lognal-control-radius: 6px;
24
+ --lognal-toolbar-height: 40px;
25
+ --lognal-statusbar-height: 26px;
26
+
27
+ /* Light palette */
28
+ --lognal-background: #ffffff;
29
+ --lognal-foreground: #1d2129;
30
+ --lognal-muted: #646a78;
31
+ --lognal-accent: #1f6fd6;
32
+ --lognal-border: #e3e6eb;
33
+ --lognal-surface: #f6f7f9;
34
+ --lognal-control-hover: rgba(29, 33, 41, 0.07);
35
+ --lognal-control-active: rgba(31, 111, 214, 0.12);
36
+ --lognal-focus-ring: #1f6fd6;
37
+ --lognal-selection: rgba(31, 111, 214, 0.22);
38
+ --lognal-match: rgba(240, 173, 0, 0.3);
39
+ --lognal-separator: rgba(29, 33, 41, 0.06);
40
+ --lognal-error: #c4262c;
41
+ --lognal-error-background: rgba(222, 53, 58, 0.07);
42
+ --lognal-warn: #8a5a00;
43
+ --lognal-warn-background: rgba(240, 173, 0, 0.1);
44
+ --lognal-info: #1f6fd6;
45
+ --lognal-debug: #646a78;
46
+ --lognal-scrollbar-thumb: rgba(29, 33, 41, 0.28);
47
+ --lognal-scrollbar-thumb-hover: rgba(29, 33, 41, 0.45);
48
+ --lognal-token-muted: #646a78;
49
+ --lognal-token-string: #1f7a47;
50
+ --lognal-token-number: #6f42c1;
51
+ --lognal-token-boolean: #6f42c1;
52
+ --lognal-token-null: #646a78;
53
+ --lognal-token-key: #1a5fb4;
54
+ --lognal-token-symbol: #a3316f;
55
+ --lognal-token-function: #1a5fb4;
56
+ --lognal-token-regexp: #b1361e;
57
+ --lognal-token-date: #1f7a47;
58
+ --lognal-token-tag: #1a5fb4;
59
+ --lognal-token-attribute: #8a5a00;
60
+ --lognal-token-error: #c4262c;
61
+ --lognal-token-warn: #8a5a00;
62
+ --lognal-token-info: #1f6fd6;
63
+ --lognal-token-accent: #1f6fd6;
64
+ --lognal-ansi-0: #1d2129;
65
+ --lognal-ansi-1: #c4262c;
66
+ --lognal-ansi-2: #1f7a47;
67
+ --lognal-ansi-3: #8a5a00;
68
+ --lognal-ansi-4: #1f6fd6;
69
+ --lognal-ansi-5: #8f3aa8;
70
+ --lognal-ansi-6: #0e7c86;
71
+ --lognal-ansi-7: #646a78;
72
+ --lognal-ansi-8: #4b515e;
73
+ --lognal-ansi-9: #de353a;
74
+ --lognal-ansi-10: #238b50;
75
+ --lognal-ansi-11: #9c6a00;
76
+ --lognal-ansi-12: #2f7fe6;
77
+ --lognal-ansi-13: #a34bbd;
78
+ --lognal-ansi-14: #10909b;
79
+ --lognal-ansi-15: #1d2129;
80
+
81
+ position: relative;
82
+ display: flex;
83
+ flex-direction: column;
84
+ min-width: 0;
85
+ min-height: 160px;
86
+ height: 100%;
87
+ overflow: hidden;
88
+ color: var(--lognal-foreground);
89
+ background: var(--lognal-background);
90
+ border: 1px solid var(--lognal-border);
91
+ border-radius: var(--lognal-radius);
92
+ font-family: var(--lognal-ui-font-family);
93
+ font-size: var(--lognal-ui-font-size);
94
+ line-height: 1.4;
95
+ box-sizing: border-box;
96
+ isolation: isolate;
97
+ }
98
+
99
+ /* Dark palette */
100
+ .lognal[data-theme='dark'] {
101
+ --lognal-background: #16181d;
102
+ --lognal-foreground: #e3e5ea;
103
+ --lognal-muted: #8f94a1;
104
+ --lognal-accent: #5aa2ff;
105
+ --lognal-border: #2a2e37;
106
+ --lognal-surface: #1c1f25;
107
+ --lognal-control-hover: rgba(227, 229, 234, 0.08);
108
+ --lognal-control-active: rgba(90, 162, 255, 0.18);
109
+ --lognal-focus-ring: #5aa2ff;
110
+ --lognal-selection: rgba(90, 162, 255, 0.3);
111
+ --lognal-match: rgba(252, 191, 50, 0.3);
112
+ --lognal-separator: rgba(227, 229, 234, 0.05);
113
+ --lognal-error: #ff8a8d;
114
+ --lognal-error-background: rgba(252, 79, 83, 0.1);
115
+ --lognal-warn: #fcc549;
116
+ --lognal-warn-background: rgba(252, 191, 50, 0.08);
117
+ --lognal-info: #5aa2ff;
118
+ --lognal-debug: #8f94a1;
119
+ --lognal-scrollbar-thumb: rgba(227, 229, 234, 0.25);
120
+ --lognal-scrollbar-thumb-hover: rgba(227, 229, 234, 0.42);
121
+ --lognal-token-muted: #8f94a1;
122
+ --lognal-token-string: #7fd6a4;
123
+ --lognal-token-number: #b9a8ff;
124
+ --lognal-token-boolean: #b9a8ff;
125
+ --lognal-token-null: #8f94a1;
126
+ --lognal-token-key: #82bdff;
127
+ --lognal-token-symbol: #f5a3d7;
128
+ --lognal-token-function: #82bdff;
129
+ --lognal-token-regexp: #ffa585;
130
+ --lognal-token-date: #7fd6a4;
131
+ --lognal-token-tag: #82bdff;
132
+ --lognal-token-attribute: #fcc549;
133
+ --lognal-token-error: #ff8a8d;
134
+ --lognal-token-warn: #fcc549;
135
+ --lognal-token-info: #5aa2ff;
136
+ --lognal-token-accent: #5aa2ff;
137
+ --lognal-ansi-0: #3b3f4a;
138
+ --lognal-ansi-1: #fc5c60;
139
+ --lognal-ansi-2: #43d786;
140
+ --lognal-ansi-3: #fcbf32;
141
+ --lognal-ansi-4: #5aa2ff;
142
+ --lognal-ansi-5: #c792ea;
143
+ --lognal-ansi-6: #56d4dd;
144
+ --lognal-ansi-7: #d0d3db;
145
+ --lognal-ansi-8: #6b7080;
146
+ --lognal-ansi-9: #ff8a8d;
147
+ --lognal-ansi-10: #7ee3a8;
148
+ --lognal-ansi-11: #ffd466;
149
+ --lognal-ansi-12: #82bdff;
150
+ --lognal-ansi-13: #ddb6f2;
151
+ --lognal-ansi-14: #8ae6ec;
152
+ --lognal-ansi-15: #ffffff;
153
+
154
+ color-scheme: dark;
155
+ }
156
+
157
+ @media (prefers-color-scheme: dark) {
158
+ .lognal[data-theme='auto'] {
159
+ --lognal-background: #16181d;
160
+ --lognal-foreground: #e3e5ea;
161
+ --lognal-muted: #8f94a1;
162
+ --lognal-accent: #5aa2ff;
163
+ --lognal-border: #2a2e37;
164
+ --lognal-surface: #1c1f25;
165
+ --lognal-control-hover: rgba(227, 229, 234, 0.08);
166
+ --lognal-control-active: rgba(90, 162, 255, 0.18);
167
+ --lognal-focus-ring: #5aa2ff;
168
+ --lognal-selection: rgba(90, 162, 255, 0.3);
169
+ --lognal-match: rgba(252, 191, 50, 0.3);
170
+ --lognal-separator: rgba(227, 229, 234, 0.05);
171
+ --lognal-error: #ff8a8d;
172
+ --lognal-error-background: rgba(252, 79, 83, 0.1);
173
+ --lognal-warn: #fcc549;
174
+ --lognal-warn-background: rgba(252, 191, 50, 0.08);
175
+ --lognal-info: #5aa2ff;
176
+ --lognal-debug: #8f94a1;
177
+ --lognal-scrollbar-thumb: rgba(227, 229, 234, 0.25);
178
+ --lognal-scrollbar-thumb-hover: rgba(227, 229, 234, 0.42);
179
+ --lognal-token-muted: #8f94a1;
180
+ --lognal-token-string: #7fd6a4;
181
+ --lognal-token-number: #b9a8ff;
182
+ --lognal-token-boolean: #b9a8ff;
183
+ --lognal-token-null: #8f94a1;
184
+ --lognal-token-key: #82bdff;
185
+ --lognal-token-symbol: #f5a3d7;
186
+ --lognal-token-function: #82bdff;
187
+ --lognal-token-regexp: #ffa585;
188
+ --lognal-token-date: #7fd6a4;
189
+ --lognal-token-tag: #82bdff;
190
+ --lognal-token-attribute: #fcc549;
191
+ --lognal-token-error: #ff8a8d;
192
+ --lognal-token-warn: #fcc549;
193
+ --lognal-token-info: #5aa2ff;
194
+ --lognal-token-accent: #5aa2ff;
195
+ --lognal-ansi-0: #3b3f4a;
196
+ --lognal-ansi-1: #fc5c60;
197
+ --lognal-ansi-2: #43d786;
198
+ --lognal-ansi-3: #fcbf32;
199
+ --lognal-ansi-4: #5aa2ff;
200
+ --lognal-ansi-5: #c792ea;
201
+ --lognal-ansi-6: #56d4dd;
202
+ --lognal-ansi-7: #d0d3db;
203
+ --lognal-ansi-8: #6b7080;
204
+ --lognal-ansi-9: #ff8a8d;
205
+ --lognal-ansi-10: #7ee3a8;
206
+ --lognal-ansi-11: #ffd466;
207
+ --lognal-ansi-12: #82bdff;
208
+ --lognal-ansi-13: #ddb6f2;
209
+ --lognal-ansi-14: #8ae6ec;
210
+ --lognal-ansi-15: #ffffff;
211
+
212
+ color-scheme: dark;
213
+ }
214
+ }
215
+
216
+ .lognal *,
217
+ .lognal *::before,
218
+ .lognal *::after {
219
+ box-sizing: border-box;
220
+ }
221
+
222
+ .lognal [hidden] {
223
+ display: none !important;
224
+ }
225
+
226
+ /* Toolbar */
227
+
228
+ .lognal-toolbar {
229
+ display: flex;
230
+ flex: none;
231
+ flex-wrap: wrap;
232
+ align-items: center;
233
+ justify-content: space-between;
234
+ gap: 6px 8px;
235
+ min-height: var(--lognal-toolbar-height);
236
+ padding: 6px 8px;
237
+ background: var(--lognal-surface);
238
+ border-bottom: 1px solid var(--lognal-border);
239
+ }
240
+
241
+ .lognal-toolbar-group {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 2px;
245
+ min-width: 0;
246
+ }
247
+
248
+ .lognal-toolbar-end {
249
+ flex: 1 1 auto;
250
+ justify-content: flex-end;
251
+ gap: 6px;
252
+ }
253
+
254
+ .lognal-separator {
255
+ width: 1px;
256
+ height: 16px;
257
+ margin: 0 6px;
258
+ background: var(--lognal-border);
259
+ }
260
+
261
+ .lognal-button {
262
+ display: inline-flex;
263
+ align-items: center;
264
+ justify-content: center;
265
+ width: 28px;
266
+ height: 28px;
267
+ padding: 0;
268
+ color: var(--lognal-muted);
269
+ background: transparent;
270
+ border: 0;
271
+ border-radius: var(--lognal-control-radius);
272
+ cursor: pointer;
273
+ transition:
274
+ background-color 120ms ease,
275
+ color 120ms ease;
276
+ }
277
+
278
+ .lognal-button:hover {
279
+ color: var(--lognal-foreground);
280
+ background: var(--lognal-control-hover);
281
+ }
282
+
283
+ .lognal-button[aria-pressed='true'] {
284
+ color: var(--lognal-accent);
285
+ background: var(--lognal-control-active);
286
+ }
287
+
288
+ .lognal-button:focus-visible,
289
+ .lognal-filter:focus-within,
290
+ .lognal-levels:focus-visible,
291
+ .lognal-new-logs:focus-visible {
292
+ outline: 2px solid var(--lognal-focus-ring);
293
+ outline-offset: 1px;
294
+ }
295
+
296
+ .lognal-icon {
297
+ flex: none;
298
+ display: block;
299
+ }
300
+
301
+ .lognal-filter {
302
+ display: flex;
303
+ flex: 0 1 200px;
304
+ align-items: center;
305
+ gap: 6px;
306
+ min-width: 96px;
307
+ height: 28px;
308
+ padding: 0 8px;
309
+ color: var(--lognal-muted);
310
+ background: var(--lognal-background);
311
+ border: 1px solid var(--lognal-border);
312
+ border-radius: var(--lognal-control-radius);
313
+ }
314
+
315
+ .lognal-filter-input {
316
+ flex: 1;
317
+ min-width: 0;
318
+ height: 100%;
319
+ padding: 0;
320
+ color: var(--lognal-foreground);
321
+ background: transparent;
322
+ border: 0;
323
+ outline: 0;
324
+ font: inherit;
325
+ }
326
+
327
+ .lognal-filter-input::placeholder {
328
+ color: var(--lognal-muted);
329
+ }
330
+
331
+ .lognal-filter:has([aria-invalid]) {
332
+ border-color: var(--lognal-error);
333
+ }
334
+
335
+ .lognal-levels {
336
+ /* Keep the native arrow on pages whose reset sets appearance to none. */
337
+ -webkit-appearance: auto;
338
+ appearance: auto;
339
+ height: 28px;
340
+ padding: 0 24px 0 8px;
341
+ color: var(--lognal-foreground);
342
+ background-color: var(--lognal-background);
343
+ border: 1px solid var(--lognal-border);
344
+ border-radius: var(--lognal-control-radius);
345
+ font: inherit;
346
+ cursor: pointer;
347
+ }
348
+
349
+ /* Log area */
350
+
351
+ .lognal-body {
352
+ position: relative;
353
+ flex: 1;
354
+ min-height: 0;
355
+ overflow: hidden;
356
+ }
357
+
358
+ .lognal-canvas {
359
+ position: absolute;
360
+ inset: 0;
361
+ display: block;
362
+ pointer-events: none;
363
+ }
364
+
365
+ .lognal-viewport {
366
+ position: absolute;
367
+ inset: 0;
368
+ overflow: auto;
369
+ overscroll-behavior: contain;
370
+ scrollbar-width: none;
371
+ outline: 0;
372
+ cursor: text;
373
+ -webkit-user-select: none;
374
+ user-select: none;
375
+ touch-action: pan-x pan-y;
376
+ }
377
+
378
+ .lognal-viewport::-webkit-scrollbar {
379
+ display: none;
380
+ }
381
+
382
+ .lognal-viewport.has-action {
383
+ cursor: pointer;
384
+ }
385
+
386
+ .lognal-viewport:focus-visible {
387
+ box-shadow: inset 0 0 0 2px var(--lognal-focus-ring);
388
+ }
389
+
390
+ .lognal-spacer {
391
+ width: 1px;
392
+ pointer-events: none;
393
+ }
394
+
395
+ /* Visually hidden, still read by screen readers. */
396
+ .lognal-mirror,
397
+ .lognal-clipboard {
398
+ position: absolute;
399
+ width: 1px;
400
+ height: 1px;
401
+ margin: -1px;
402
+ padding: 0;
403
+ overflow: hidden;
404
+ clip-path: inset(50%);
405
+ white-space: nowrap;
406
+ border: 0;
407
+ }
408
+
409
+ /* Scrollbars */
410
+
411
+ .lognal-scrollbar {
412
+ position: absolute;
413
+ z-index: 1;
414
+ opacity: 0;
415
+ transition: opacity 200ms ease;
416
+ }
417
+
418
+ .lognal-body:hover .lognal-scrollbar,
419
+ .lognal-scrollbar.is-active,
420
+ .lognal-scrollbar.is-dragging {
421
+ opacity: 1;
422
+ }
423
+
424
+ .lognal-scrollbar-vertical {
425
+ top: 2px;
426
+ right: 2px;
427
+ bottom: 2px;
428
+ width: 10px;
429
+ }
430
+
431
+ .lognal-scrollbar-horizontal {
432
+ right: 14px;
433
+ bottom: 2px;
434
+ left: 2px;
435
+ height: 10px;
436
+ }
437
+
438
+ .lognal-scrollbar-thumb {
439
+ position: absolute;
440
+ top: 0;
441
+ left: 0;
442
+ background: var(--lognal-scrollbar-thumb);
443
+ border: 2px solid transparent;
444
+ border-radius: 999px;
445
+ background-clip: padding-box;
446
+ transition: background-color 120ms ease;
447
+ }
448
+
449
+ .lognal-scrollbar-vertical .lognal-scrollbar-thumb {
450
+ width: 100%;
451
+ }
452
+
453
+ .lognal-scrollbar-horizontal .lognal-scrollbar-thumb {
454
+ height: 100%;
455
+ }
456
+
457
+ .lognal-scrollbar:hover .lognal-scrollbar-thumb,
458
+ .lognal-scrollbar.is-dragging .lognal-scrollbar-thumb {
459
+ background-color: var(--lognal-scrollbar-thumb-hover);
460
+ }
461
+
462
+ .lognal-new-logs {
463
+ position: absolute;
464
+ right: 20px;
465
+ bottom: 12px;
466
+ z-index: 2;
467
+ display: inline-flex;
468
+ align-items: center;
469
+ gap: 4px;
470
+ height: 28px;
471
+ padding: 0 12px 0 10px;
472
+ color: #ffffff;
473
+ background: var(--lognal-accent);
474
+ border: 0;
475
+ border-radius: 999px;
476
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);
477
+ font: inherit;
478
+ font-weight: 600;
479
+ cursor: pointer;
480
+ }
481
+
482
+ .lognal[data-theme='dark'] .lognal-new-logs {
483
+ color: #0b1220;
484
+ }
485
+
486
+ @media (prefers-color-scheme: dark) {
487
+ .lognal[data-theme='auto'] .lognal-new-logs {
488
+ color: #0b1220;
489
+ }
490
+ }
491
+
492
+ /* Input line */
493
+
494
+ .lognal-input {
495
+ display: flex;
496
+ flex: none;
497
+ align-items: flex-start;
498
+ gap: 8px;
499
+ margin: 0;
500
+ padding: 8px 12px;
501
+ background: var(--lognal-background);
502
+ border-top: 1px solid var(--lognal-border);
503
+ font-family: var(--lognal-font-family);
504
+ font-size: var(--lognal-font-size);
505
+ line-height: var(--lognal-line-height);
506
+ }
507
+
508
+ .lognal-input-prompt {
509
+ flex: none;
510
+ color: var(--lognal-accent);
511
+ font-weight: 700;
512
+ }
513
+
514
+ .lognal-input-field {
515
+ flex: 1;
516
+ min-width: 0;
517
+ margin: 0;
518
+ padding: 0;
519
+ color: var(--lognal-foreground);
520
+ background: transparent;
521
+ border: 0;
522
+ outline: 0;
523
+ resize: none;
524
+ font: inherit;
525
+ line-height: inherit;
526
+ }
527
+
528
+ .lognal-input-field::placeholder {
529
+ color: var(--lognal-muted);
530
+ }
531
+
532
+ .lognal-input:focus-within {
533
+ box-shadow: inset 0 2px 0 -1px var(--lognal-focus-ring);
534
+ }
535
+
536
+ /* Status bar */
537
+
538
+ .lognal-statusbar {
539
+ display: flex;
540
+ flex: none;
541
+ align-items: center;
542
+ justify-content: space-between;
543
+ gap: 12px;
544
+ min-height: var(--lognal-statusbar-height);
545
+ padding: 0 12px;
546
+ color: var(--lognal-muted);
547
+ background: var(--lognal-surface);
548
+ border-top: 1px solid var(--lognal-border);
549
+ font-variant-numeric: tabular-nums;
550
+ white-space: nowrap;
551
+ }
552
+
553
+ .lognal-status-follow {
554
+ display: inline-flex;
555
+ align-items: center;
556
+ gap: 6px;
557
+ }
558
+
559
+ .lognal-status-follow::before {
560
+ width: 6px;
561
+ height: 6px;
562
+ background: var(--lognal-muted);
563
+ border-radius: 50%;
564
+ content: '';
565
+ }
566
+
567
+ .lognal-status-follow.is-following::before {
568
+ background: var(--lognal-accent);
569
+ }
570
+
571
+ .lognal-levels {
572
+ flex: 0 1 auto;
573
+ min-width: 0;
574
+ max-width: 160px;
575
+ }
576
+
577
+ @media (max-width: 480px) {
578
+ .lognal-separator {
579
+ display: none;
580
+ }
581
+ }
582
+
583
+ @media (prefers-reduced-motion: reduce) {
584
+ .lognal-button,
585
+ .lognal-scrollbar,
586
+ .lognal-scrollbar-thumb {
587
+ transition: none;
588
+ }
589
+ }
@@ -0,0 +1,32 @@
1
+ import { type CSSProperties } from 'react';
2
+ import type { LogFilter } from '../core/filter.js';
3
+ import type { HookConsoleOptions } from '../sources/console/hook.js';
4
+ import { LogViewer as Viewer, type LogViewerOptions } from '../viewer/viewer.js';
5
+ export interface LogViewerProps extends LogViewerOptions {
6
+ className?: string;
7
+ style?: CSSProperties;
8
+ /**
9
+ * Records the global `console` into the viewer while the component is mounted. Pass options
10
+ * to choose the methods and the capture limits.
11
+ */
12
+ hookConsole?: boolean | HookConsoleOptions;
13
+ /** Called with the viewer once it exists, and with `null` after it is disposed. */
14
+ onReady?: (viewer: Viewer | null) => void;
15
+ onFollowChange?: (following: boolean) => void;
16
+ onFilterChange?: (filter: LogFilter | null) => void;
17
+ onSelectionChange?: (text: string) => void;
18
+ }
19
+ /**
20
+ * The lognal viewer as a React component.
21
+ *
22
+ * The component renders a container and creates the viewer in it after mounting. Log entries
23
+ * never go through React state: write to `store`, to the viewer from `onReady` or the ref, or
24
+ * turn on `hookConsole`.
25
+ *
26
+ * Only the option props whose data changed are applied, so passing a new object with the same
27
+ * contents on every render costs nothing, and a change to one prop does not undo what the
28
+ * user did in the viewer, such as turning off wrapping from the toolbar.
29
+ *
30
+ * Give the component a height, through `style`, `className` or its parent.
31
+ */
32
+ export declare const LogViewer: import("react").ForwardRefExoticComponent<LogViewerProps & import("react").RefAttributes<Viewer | null>>;