@fungi.computer/bonsai 0.0.0-stage → 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 (133) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +21 -0
  3. package/README.md +196 -2
  4. package/backend/background.ts +259 -0
  5. package/backend/change-copy.ts +99 -0
  6. package/backend/changes.ts +530 -0
  7. package/backend/diff.ts +228 -0
  8. package/backend/file-edits.ts +850 -0
  9. package/backend/files-copy.ts +361 -0
  10. package/backend/gills.ts +125 -0
  11. package/backend/git.ts +123 -0
  12. package/backend/graph-commit-copies.ts +321 -0
  13. package/backend/history.ts +178 -0
  14. package/backend/index.ts +144 -0
  15. package/backend/insights.ts +256 -0
  16. package/backend/merge.ts +999 -0
  17. package/backend/methods.ts +848 -0
  18. package/backend/policy.ts +160 -0
  19. package/backend/read-copy-page.ts +77 -0
  20. package/backend/repository-copy.ts +70 -0
  21. package/backend/reviews.ts +317 -0
  22. package/backend/service.ts +892 -0
  23. package/backend/state.ts +914 -0
  24. package/demo/koi-pond/README.md +17 -0
  25. package/demo/koi-pond/index.html +11 -0
  26. package/demo/koi-pond/package.json +13 -0
  27. package/demo/koi-pond/pnpm-lock.yaml +450 -0
  28. package/demo/koi-pond/src/fish.ts +32 -0
  29. package/demo/koi-pond/src/main.ts +24 -0
  30. package/demo/koi-pond/src/pond.ts +27 -0
  31. package/docs/media/bonsai-insights.png +0 -0
  32. package/docs/media/overview-phone.png +0 -0
  33. package/docs/media/overview.png +0 -0
  34. package/package.json +152 -3
  35. package/scripts/agent.sh +55 -0
  36. package/scripts/demo.sh +233 -0
  37. package/scripts/rebuild-copies.mjs +34 -0
  38. package/scripts/release.mjs +52 -0
  39. package/scripts/runtime-proof.mjs +299 -0
  40. package/scripts/seed-demo.mjs +724 -0
  41. package/scripts/seed-step.mjs +37 -0
  42. package/scripts/shed-terminal-proof.mjs +774 -0
  43. package/shared/contract.ts +404 -0
  44. package/shared/hooks.ts +208 -0
  45. package/shared/insights.ts +90 -0
  46. package/shared/picker-options.ts +23 -0
  47. package/shared/presentation.ts +21 -0
  48. package/shared/repository-deletion.ts +4 -0
  49. package/test/apps-build-install.test.ts +302 -0
  50. package/test/background-runtime.test.ts +206 -0
  51. package/test/browser/board.browser.mjs +52 -0
  52. package/test/browser/capture.browser.mjs +1264 -0
  53. package/test/browser/edit-in-inkcap.browser.mjs +83 -0
  54. package/test/browser/repository-settings-fixture.tsx +108 -0
  55. package/test/browser/repository-settings.browser.mjs +136 -0
  56. package/test/browser/repository-settings.html +10 -0
  57. package/test/browser/visual-fixture.tsx +667 -0
  58. package/test/browser/visual.html +10 -0
  59. package/test/browser/vite.config.mjs +9 -0
  60. package/test/change-page.test.ts +916 -0
  61. package/test/changes.test.ts +1063 -0
  62. package/test/checks-workflow-template.test.mjs +234 -0
  63. package/test/diff.test.ts +70 -0
  64. package/test/edit-in-inkcap.test.ts +227 -0
  65. package/test/file-edits.test.ts +2714 -0
  66. package/test/files-read-copy-calls.test.ts +374 -0
  67. package/test/fork-adoption.test.ts +111 -0
  68. package/test/gills.test.ts +125 -0
  69. package/test/git-binding.fixture.ts +30 -0
  70. package/test/git-push.config.jsonc +9 -0
  71. package/test/git-push.native.mjs +413 -0
  72. package/test/git-push.worker.ts +280 -0
  73. package/test/graph-commit-read-copy-calls.test.ts +401 -0
  74. package/test/home-page.test.ts +170 -0
  75. package/test/hooks.test.ts +250 -0
  76. package/test/insight-data.test.ts +51 -0
  77. package/test/insight-layout.test.mjs +230 -0
  78. package/test/insights.test.ts +154 -0
  79. package/test/merge-background.test.ts +756 -0
  80. package/test/merge-conflict.test.ts +337 -0
  81. package/test/merge-declaration.test.ts +46 -0
  82. package/test/merge-repro.test.ts +561 -0
  83. package/test/merge-template-build.test.mjs +234 -0
  84. package/test/network-layout.test.ts +200 -0
  85. package/test/outbox.test.ts +424 -0
  86. package/test/parts.test.ts +86 -0
  87. package/test/pkt-line.test.ts +54 -0
  88. package/test/policy.test.ts +172 -0
  89. package/test/present.test.ts +27 -0
  90. package/test/read-copy-calls.test.ts +691 -0
  91. package/test/read-copy-composer.test.ts +388 -0
  92. package/test/read-copy-lifetimes.test.ts +214 -0
  93. package/test/read-copy-rpc.config.jsonc +12 -0
  94. package/test/read-copy-rpc.native.mjs +47 -0
  95. package/test/read-copy-rpc.worker.ts +92 -0
  96. package/test/recent-activity.test.ts +62 -0
  97. package/test/repository-deletion.test.ts +500 -0
  98. package/test/seed-resume.test.mjs +91 -0
  99. package/test/storyboard-save-https-git.fixture.mjs +119 -0
  100. package/test/storyboard-save-template.test.mjs +545 -0
  101. package/test/ui-errors.test.ts +976 -0
  102. package/test/workflow-store.test.ts +115 -0
  103. package/tsconfig.json +36 -0
  104. package/turbo.jsonc +25 -0
  105. package/vite.config.ts +19 -0
  106. package/vitest.config.ts +47 -0
  107. package/web/api.ts +224 -0
  108. package/web/app-build-panel.tsx +171 -0
  109. package/web/board.tsx +259 -0
  110. package/web/bonsai.css +642 -0
  111. package/web/change-page.tsx +719 -0
  112. package/web/change-rows.tsx +135 -0
  113. package/web/code-tab.tsx +267 -0
  114. package/web/commit-tree.tsx +152 -0
  115. package/web/format.ts +54 -0
  116. package/web/home-page.tsx +274 -0
  117. package/web/index.html +17 -0
  118. package/web/insight-data.ts +76 -0
  119. package/web/insight-tiles.tsx +534 -0
  120. package/web/insights.tsx +250 -0
  121. package/web/issues-panel.tsx +305 -0
  122. package/web/main.tsx +72 -0
  123. package/web/network-graph.tsx +647 -0
  124. package/web/overview.tsx +339 -0
  125. package/web/pages.tsx +469 -0
  126. package/web/parts.tsx +381 -0
  127. package/web/public/favicon.svg +1 -0
  128. package/web/repo-navigation.tsx +256 -0
  129. package/web/repo-settings.tsx +145 -0
  130. package/web/router.tsx +151 -0
  131. package/web/transport.ts +91 -0
  132. package/web/views.tsx +151 -0
  133. package/web/working-now.tsx +98 -0
package/web/bonsai.css ADDED
@@ -0,0 +1,642 @@
1
+ @import "@fungi.computer/caps/tailwind.css";
2
+ @source "./";
3
+
4
+ /* App layout and Git visualization geometry. Caps owns component finish. */
5
+
6
+ :root {
7
+ /* Chart series use the active Caps theme's semantic palette. */
8
+ --bonsai-agent-c0: var(--color-base-content);
9
+ --bonsai-agent-c1: var(--stipe-art-blue);
10
+ --bonsai-agent-c2: var(--stipe-art-grape);
11
+ --bonsai-agent-c3: var(--stipe-art-mint);
12
+ --bonsai-agent-c4: var(--stipe-art-yellow);
13
+ --bonsai-agent-c5: var(--stipe-art-inkcap);
14
+ --bonsai-agent-c6: var(--stipe-art-graphite);
15
+ --bonsai-agent-c7: var(--stipe-art-ink);
16
+ /* Shiki's maintained CSS-variable theme consumes the same palette. */
17
+ --shiki-foreground: var(--color-base-content);
18
+ --shiki-background: var(--color-base-100);
19
+ --shiki-token-constant: var(--color-warning);
20
+ --shiki-token-string: var(--color-success);
21
+ --shiki-token-comment: var(--stipe-fg-muted);
22
+ --shiki-token-keyword: var(--color-primary);
23
+ --shiki-token-parameter: var(--color-warning);
24
+ --shiki-token-function: var(--color-info);
25
+ --shiki-token-string-expression: var(--color-success);
26
+ --shiki-token-punctuation: var(--color-base-content);
27
+ --shiki-token-link: var(--color-info);
28
+ }
29
+
30
+ [data-agent-slot="c0"] {
31
+ --bonsai-agent: var(--bonsai-agent-c0);
32
+ }
33
+ [data-agent-slot="c1"] {
34
+ --bonsai-agent: var(--bonsai-agent-c1);
35
+ }
36
+ [data-agent-slot="c2"] {
37
+ --bonsai-agent: var(--bonsai-agent-c2);
38
+ }
39
+ [data-agent-slot="c3"] {
40
+ --bonsai-agent: var(--bonsai-agent-c3);
41
+ }
42
+ [data-agent-slot="c4"] {
43
+ --bonsai-agent: var(--bonsai-agent-c4);
44
+ }
45
+ [data-agent-slot="c5"] {
46
+ --bonsai-agent: var(--bonsai-agent-c5);
47
+ }
48
+ [data-agent-slot="c6"] {
49
+ --bonsai-agent: var(--bonsai-agent-c6);
50
+ }
51
+ [data-agent-slot="c7"] {
52
+ --bonsai-agent: var(--bonsai-agent-c7);
53
+ }
54
+ .caps-monogram[data-agent-slot] {
55
+ --caps-monogram-tone: var(--bonsai-agent);
56
+ }
57
+
58
+ html,
59
+ body {
60
+ margin: 0;
61
+ min-height: 100%;
62
+ }
63
+
64
+ .bonsai-shell {
65
+ min-height: 100vh;
66
+ }
67
+
68
+ .bonsai-page {
69
+ max-width: 82rem;
70
+ margin: 0 auto;
71
+ padding: var(--spacing-xl);
72
+ }
73
+
74
+ .bonsai-columns {
75
+ display: grid;
76
+ grid-template-columns: minmax(0, 1fr) 22rem;
77
+ gap: var(--spacing-xl);
78
+ align-items: start;
79
+ }
80
+
81
+ .bonsai-main,
82
+ .bonsai-side {
83
+ min-width: 0;
84
+ }
85
+
86
+ .bonsai-side {
87
+ display: grid;
88
+ gap: var(--spacing-lg);
89
+ }
90
+
91
+ .bonsai-section-head {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: space-between;
95
+ gap: var(--spacing-sm);
96
+ margin-bottom: var(--spacing-sm);
97
+ }
98
+ .bonsai-section-head h2 {
99
+ display: inline-flex;
100
+ align-items: center;
101
+ gap: var(--spacing-xs);
102
+ }
103
+
104
+ .bonsai-loading {
105
+ display: grid;
106
+ place-items: center;
107
+ padding: var(--spacing-xl);
108
+ }
109
+ .bonsai-repo-row {
110
+ grid-template-columns: minmax(0, 1fr) auto auto;
111
+ align-items: center;
112
+ }
113
+ .bonsai-repo-meta {
114
+ display: flex;
115
+ flex-wrap: wrap;
116
+ gap: var(--spacing-md);
117
+ margin-top: var(--spacing-2xs);
118
+ }
119
+ .bonsai-repo-meta span {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ gap: var(--spacing-2xs);
123
+ }
124
+ .bonsai-repo-forks {
125
+ display: flex;
126
+ }
127
+ .bonsai-repo-forks > * + * {
128
+ margin-left: -0.375rem;
129
+ }
130
+ .bonsai-spark-area {
131
+ fill: var(--color-base-200);
132
+ }
133
+ .bonsai-spark-line {
134
+ fill: none;
135
+ stroke: var(--color-base-content);
136
+ stroke-width: 1.75;
137
+ }
138
+
139
+ /* Activity */
140
+ .bonsai-feed {
141
+ display: grid;
142
+ margin: 0;
143
+ padding: 0;
144
+ list-style: none;
145
+ }
146
+ .bonsai-feed-item {
147
+ display: grid;
148
+ grid-template-columns: minmax(0, 1fr);
149
+ padding: var(--spacing-sm) 0;
150
+ }
151
+ /* Working now */
152
+ .bonsai-working {
153
+ display: grid;
154
+ gap: var(--spacing-sm);
155
+ margin: 0;
156
+ padding: 0;
157
+ list-style: none;
158
+ }
159
+ .bonsai-working li {
160
+ display: grid;
161
+ grid-template-columns: auto minmax(0, 1fr) auto;
162
+ gap: var(--spacing-sm);
163
+ align-items: start;
164
+ }
165
+ .bonsai-working-areas {
166
+ display: flex;
167
+ flex-wrap: wrap;
168
+ gap: var(--spacing-2xs);
169
+ margin-top: var(--spacing-2xs);
170
+ }
171
+ .bonsai-working-areas code {
172
+ padding: 0 var(--spacing-xs);
173
+ }
174
+ .bonsai-working-empty {
175
+ padding: var(--spacing-xs) 0;
176
+ }
177
+
178
+ /* Repository */
179
+ .bonsai-repo,
180
+ .bonsai-commit {
181
+ display: grid;
182
+ grid-template-columns: minmax(0, 1fr);
183
+ gap: var(--spacing-lg);
184
+ }
185
+ .bonsai-toolbar {
186
+ display: flex;
187
+ flex-wrap: wrap;
188
+ align-items: center;
189
+ gap: var(--spacing-md);
190
+ margin-bottom: var(--spacing-sm);
191
+ }
192
+ .bonsai-toolbar .caps-select-shell {
193
+ flex: none;
194
+ width: 11rem;
195
+ max-width: 100%;
196
+ }
197
+ .bonsai-crumbs {
198
+ display: flex;
199
+ flex-wrap: wrap;
200
+ align-items: center;
201
+ gap: var(--spacing-2xs);
202
+ }
203
+ .bonsai-crumbs span {
204
+ display: inline-flex;
205
+ align-items: center;
206
+ gap: var(--spacing-2xs);
207
+ }
208
+ .bonsai-last-commit {
209
+ display: inline-flex;
210
+ flex: 1;
211
+ min-width: 0;
212
+ align-items: baseline;
213
+ gap: var(--spacing-sm);
214
+ }
215
+ .bonsai-last-commit > span:first-of-type {
216
+ overflow: hidden;
217
+ text-overflow: ellipsis;
218
+ white-space: nowrap;
219
+ }
220
+ .bonsai-browser {
221
+ display: grid;
222
+ grid-template-columns: 15rem minmax(0, 1fr);
223
+ gap: var(--spacing-md);
224
+ align-items: start;
225
+ }
226
+ .bonsai-browser-tree {
227
+ position: sticky;
228
+ top: 3.75rem;
229
+ display: flex;
230
+ height: min(32rem, calc(100vh - 5rem));
231
+ overflow: hidden;
232
+ }
233
+ .bonsai-tree {
234
+ flex: 1;
235
+ min-height: 0;
236
+ }
237
+ .bonsai-file {
238
+ min-width: 0;
239
+ overflow: hidden;
240
+ }
241
+ .bonsai-file > header {
242
+ display: flex;
243
+ justify-content: space-between;
244
+ padding: var(--spacing-sm) var(--spacing-md);
245
+ }
246
+
247
+ .bonsai-commit-list .list-row {
248
+ grid-template-columns: auto minmax(0, 1fr) auto;
249
+ align-items: start;
250
+ }
251
+
252
+ /* Network */
253
+ .bonsai-network-panel {
254
+ padding-bottom: var(--spacing-xs);
255
+ }
256
+ .bonsai-network {
257
+ position: relative;
258
+ display: flex;
259
+ min-height: 6rem;
260
+ }
261
+ .bonsai-network-tools {
262
+ position: absolute;
263
+ top: 0;
264
+ right: 0;
265
+ z-index: 2;
266
+ display: flex;
267
+ gap: var(--spacing-2xs);
268
+ padding: var(--spacing-2xs);
269
+ }
270
+ .bonsai-network-gutter {
271
+ position: relative;
272
+ flex: none;
273
+ width: max-content;
274
+ margin: 0;
275
+ padding: 8px var(--spacing-sm) 0 0;
276
+ list-style: none;
277
+ }
278
+ .bonsai-network-lane {
279
+ position: relative;
280
+ display: flex;
281
+ align-items: center;
282
+ gap: var(--spacing-xs);
283
+ height: 52px;
284
+ white-space: nowrap;
285
+ }
286
+ .bonsai-lane-swatch {
287
+ background: currentColor;
288
+ border-radius: 50%;
289
+ flex: none;
290
+ width: 0.625rem;
291
+ height: 0.625rem;
292
+ }
293
+ .bonsai-lane-ref {
294
+ overflow: hidden;
295
+ text-overflow: ellipsis;
296
+ }
297
+ .bonsai-network-scroll {
298
+ position: relative;
299
+ flex: 1;
300
+ min-width: 0;
301
+ overflow-x: auto;
302
+ overflow-y: hidden;
303
+ cursor: grab;
304
+ scrollbar-width: thin;
305
+ touch-action: pan-x;
306
+ }
307
+ .bonsai-network-scroll:active {
308
+ cursor: grabbing;
309
+ }
310
+ .bonsai-network-scroll svg {
311
+ display: block;
312
+ user-select: none;
313
+ }
314
+ .bonsai-network-tracks line {
315
+ stroke: var(--stipe-linework);
316
+ stroke-dasharray: 1 7;
317
+ stroke-linecap: round;
318
+ stroke-width: 1.5;
319
+ }
320
+ .bonsai-network-axis line {
321
+ stroke: var(--stipe-linework);
322
+ stroke-width: 1.5;
323
+ }
324
+ .bonsai-network-axis text {
325
+ fill: var(--stipe-fg-muted);
326
+ font-family: var(--font-numeric, var(--font-mono));
327
+ font-size: 10.5px;
328
+ }
329
+ .bonsai-edge[data-merge] {
330
+ stroke-dasharray: none;
331
+ }
332
+ .bonsai-bead {
333
+ cursor: pointer;
334
+ outline: none;
335
+ }
336
+ .bonsai-bead:is(:hover, :focus-visible, .bonsai-bead-active) .bonsai-bead-core {
337
+ r: 9;
338
+ }
339
+ .bonsai-bead:focus-visible .bonsai-bead-core {
340
+ stroke: var(--color-base-content);
341
+ stroke-width: 2;
342
+ }
343
+ .bonsai-bead-halo {
344
+ opacity: 0.18;
345
+ }
346
+ .bonsai-bead-ring {
347
+ opacity: 0.55;
348
+ }
349
+ .bonsai-head-label {
350
+ fill: var(--color-base-content);
351
+ font-family: var(--font-sans);
352
+ font-size: 12px;
353
+ font-weight: 600;
354
+ paint-order: stroke;
355
+ stroke: var(--color-base-100);
356
+ stroke-width: 4px;
357
+ stroke-linejoin: round;
358
+ }
359
+ .bonsai-network-tip {
360
+ position: absolute;
361
+ z-index: var(--stipe-layer-tooltip);
362
+ display: grid;
363
+ gap: 2px;
364
+ max-width: 20rem;
365
+ padding: var(--spacing-xs) var(--spacing-sm);
366
+ transform: translateX(-50%);
367
+ pointer-events: none;
368
+ }
369
+ .bonsai-network-tip span {
370
+ display: inline-flex;
371
+ align-items: center;
372
+ gap: var(--spacing-xs);
373
+ }
374
+ .bonsai-network-tip i {
375
+ width: 0.5rem;
376
+ height: 0.5rem;
377
+ }
378
+
379
+ /* Pierre code and diffs */
380
+ .bonsai-pierre {
381
+ --diffs-font-family: var(--font-mono);
382
+ }
383
+ .bonsai-file .bonsai-pierre {
384
+ max-height: 70vh;
385
+ overflow: auto;
386
+ }
387
+ .bonsai-markdown {
388
+ max-width: none;
389
+ padding: var(--spacing-lg) var(--spacing-xl);
390
+ }
391
+ .bonsai-change-list .list-row {
392
+ grid-template-columns: minmax(0, 1fr) auto;
393
+ align-items: center;
394
+ }
395
+ .bonsai-repo .caps-copy-field-value {
396
+ min-width: 0;
397
+ overflow: hidden;
398
+ text-overflow: ellipsis;
399
+ white-space: nowrap;
400
+ }
401
+ .bonsai-conflict {
402
+ margin-top: var(--spacing-sm);
403
+ }
404
+ .bonsai-merge-row {
405
+ display: flex;
406
+ flex-wrap: wrap;
407
+ align-items: center;
408
+ gap: var(--spacing-md);
409
+ margin-top: var(--spacing-md);
410
+ }
411
+ /* Issues */
412
+ .bonsai-issues,
413
+ .bonsai-issue {
414
+ display: grid;
415
+ gap: var(--spacing-lg);
416
+ }
417
+ .bonsai-issue-problems ul {
418
+ display: grid;
419
+ gap: var(--spacing-2xs);
420
+ margin: 0;
421
+ padding: 0;
422
+ list-style: none;
423
+ }
424
+
425
+ /* Home */
426
+ .bonsai-home {
427
+ display: grid;
428
+ grid-template-columns: minmax(0, 1fr);
429
+ gap: var(--spacing-lg);
430
+ }
431
+ .bonsai-intro p {
432
+ max-width: 40rem;
433
+ margin-top: var(--spacing-xs);
434
+ }
435
+
436
+ /* Tabs */
437
+ .bonsai-tab-count {
438
+ margin-left: var(--spacing-xs);
439
+ padding: 0 var(--spacing-xs);
440
+ }
441
+ .bonsai-commit-body {
442
+ margin-top: var(--spacing-sm);
443
+ white-space: pre-wrap;
444
+ }
445
+ .bonsai-commit-meta,
446
+ .bonsai-diff-summary {
447
+ display: flex;
448
+ flex-wrap: wrap;
449
+ align-items: center;
450
+ gap: var(--spacing-md);
451
+ margin-top: var(--spacing-md);
452
+ }
453
+ .bonsai-diff-file {
454
+ overflow: hidden;
455
+ }
456
+ .bonsai-diff-file > header {
457
+ display: flex;
458
+ align-items: center;
459
+ gap: var(--spacing-sm);
460
+ padding: var(--spacing-sm) var(--spacing-md);
461
+ }
462
+ .bonsai-diff-path {
463
+ overflow: hidden;
464
+ flex: 1;
465
+ text-overflow: ellipsis;
466
+ white-space: nowrap;
467
+ }
468
+ .bonsai-diff-counts {
469
+ display: inline-flex;
470
+ gap: var(--spacing-sm);
471
+ }
472
+ .bonsai-diff-note {
473
+ padding: var(--spacing-md);
474
+ }
475
+
476
+ /* Phone */
477
+ @media (max-width: 960px) {
478
+ .bonsai-columns {
479
+ grid-template-columns: minmax(0, 1fr);
480
+ }
481
+ }
482
+ @media (max-width: 640px) {
483
+ .bonsai-page {
484
+ padding: var(--spacing-lg) var(--spacing-lg) var(--spacing-2xl);
485
+ }
486
+ .bonsai-repo-row {
487
+ grid-template-columns: minmax(0, 1fr) auto;
488
+ }
489
+ .bonsai-repo-row .bonsai-spark {
490
+ display: none;
491
+ }
492
+ .bonsai-browser {
493
+ grid-template-columns: minmax(0, 1fr);
494
+ }
495
+ .bonsai-main [role="tablist"] {
496
+ overflow-x: auto;
497
+ flex-wrap: nowrap;
498
+ scrollbar-width: none;
499
+ }
500
+ .bonsai-browser-tree {
501
+ position: static;
502
+ height: 16rem;
503
+ }
504
+ .bonsai-lane-ref {
505
+ display: none;
506
+ }
507
+ }
508
+
509
+ /* History keeps readable labels beside a narrow, topology-preserving rail. */
510
+ .bonsai-history-body {
511
+ position: relative;
512
+ }
513
+ .bonsai-history-rail {
514
+ position: absolute;
515
+ left: 0;
516
+ top: 0;
517
+ }
518
+ .bonsai-history-commits {
519
+ list-style: none;
520
+ margin: 0;
521
+ padding: 0;
522
+ }
523
+ .bonsai-history-commits li {
524
+ height: 62px;
525
+ min-width: 0;
526
+ padding: 5px 8px;
527
+ position: relative;
528
+ }
529
+ .bonsai-history-commits a {
530
+ display: flex;
531
+ align-items: baseline;
532
+ gap: var(--spacing-xs);
533
+ overflow: hidden;
534
+ text-overflow: ellipsis;
535
+ white-space: nowrap;
536
+ }
537
+ .bonsai-history-commits p {
538
+ overflow: hidden;
539
+ text-overflow: ellipsis;
540
+ white-space: nowrap;
541
+ margin: 2px 0;
542
+ }
543
+ .bonsai-home .bonsai-network-panel {
544
+ max-height: 300px;
545
+ overflow: auto;
546
+ }
547
+ .bonsai-insight-actions select {
548
+ max-width: 190px;
549
+ }
550
+ .bonsai-tile-content {
551
+ min-width: 0;
552
+ }
553
+ .bonsai-tile-content svg:not(.lucide) {
554
+ max-width: 100%;
555
+ }
556
+ .bonsai-tile-content > svg {
557
+ display: block;
558
+ width: 100%;
559
+ height: 145px;
560
+ }
561
+ .bonsai-tile-content svg text {
562
+ font-family: inherit;
563
+ font-size: 11px;
564
+ fill: var(--color-base-content);
565
+ }
566
+ .bonsai-chart-note {
567
+ margin: 0 0 9px;
568
+ }
569
+ .bonsai-chart-legend {
570
+ list-style: none;
571
+ padding: 0;
572
+ margin: 8px 0;
573
+ display: flex;
574
+ flex-wrap: wrap;
575
+ gap: 6px 14px;
576
+ }
577
+ .bonsai-chart-legend li {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 6px;
581
+ flex: 1 0 44%;
582
+ min-width: 0;
583
+ }
584
+ .bonsai-chart-legend strong {
585
+ margin-left: auto;
586
+ }
587
+ .bonsai-chart-legend small {
588
+ display: block;
589
+ }
590
+ .bonsai-chart-legend i {
591
+ display: inline-block;
592
+ width: 8px;
593
+ height: 8px;
594
+ flex-shrink: 0;
595
+ margin-right: 4px;
596
+ }
597
+ .bonsai-file-counts {
598
+ list-style: none;
599
+ padding: 0;
600
+ }
601
+ .bonsai-file-counts li {
602
+ display: flex;
603
+ justify-content: space-between;
604
+ flex-wrap: wrap;
605
+ gap: 6px;
606
+ margin-top: 4px;
607
+ }
608
+ .bonsai-file-counts code {
609
+ overflow-wrap: anywhere;
610
+ }
611
+ .bonsai-tile-content details {
612
+ margin: 8px 0;
613
+ }
614
+
615
+ .bonsai-tile-content > .bonsai-age-chart {
616
+ height: 110px;
617
+ }
618
+ .bonsai-tile-content > .bonsai-contributor-chart {
619
+ height: 140px;
620
+ }
621
+
622
+ .bonsai-tile-content > .bonsai-actor-bar {
623
+ height: 16px;
624
+ margin: 8px 0;
625
+ }
626
+ .bonsai-tile-content > .bonsai-calendar-chart {
627
+ height: 130px;
628
+ }
629
+ .bonsai-recent-head {
630
+ opacity: 0.7;
631
+ animation: bonsai-head-pulse 2s ease-in-out infinite;
632
+ }
633
+ @keyframes bonsai-head-pulse {
634
+ 50% {
635
+ opacity: 0.2;
636
+ }
637
+ }
638
+ @media (prefers-reduced-motion: reduce) {
639
+ .bonsai-recent-head {
640
+ animation: none;
641
+ }
642
+ }