@oharness/server 0.8.0 → 0.9.1

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 (43) hide show
  1. package/dist/account-usage.d.ts +29 -0
  2. package/dist/account-usage.js +56 -0
  3. package/dist/account-usage.js.map +1 -0
  4. package/dist/files.d.ts +40 -1
  5. package/dist/files.js +94 -3
  6. package/dist/files.js.map +1 -1
  7. package/dist/i18n.js +126 -2
  8. package/dist/i18n.js.map +1 -1
  9. package/dist/page/client/base.js +4 -0
  10. package/dist/page/client/base.js.map +1 -1
  11. package/dist/page/client/browser.js +3 -1
  12. package/dist/page/client/browser.js.map +1 -1
  13. package/dist/page/client/composer.js +20 -0
  14. package/dist/page/client/composer.js.map +1 -1
  15. package/dist/page/client/files.d.ts +7 -0
  16. package/dist/page/client/files.js +412 -0
  17. package/dist/page/client/files.js.map +1 -0
  18. package/dist/page/client/index.js +4 -0
  19. package/dist/page/client/index.js.map +1 -1
  20. package/dist/page/client/panels.js +1 -1
  21. package/dist/page/client/routines.js +19 -1
  22. package/dist/page/client/routines.js.map +1 -1
  23. package/dist/page/client/shell.js +12 -1
  24. package/dist/page/client/shell.js.map +1 -1
  25. package/dist/page/client/state.js +12 -4
  26. package/dist/page/client/state.js.map +1 -1
  27. package/dist/page/client/terminal.d.ts +7 -0
  28. package/dist/page/client/terminal.js +347 -0
  29. package/dist/page/client/terminal.js.map +1 -0
  30. package/dist/page/client/transcript.js +167 -0
  31. package/dist/page/client/transcript.js.map +1 -1
  32. package/dist/page/client/usage.js +400 -70
  33. package/dist/page/client/usage.js.map +1 -1
  34. package/dist/page/style.js +258 -3
  35. package/dist/page/style.js.map +1 -1
  36. package/dist/page.js +35 -1
  37. package/dist/page.js.map +1 -1
  38. package/dist/server.js +238 -31
  39. package/dist/server.js.map +1 -1
  40. package/dist/terminal.d.ts +34 -0
  41. package/dist/terminal.js +211 -0
  42. package/dist/terminal.js.map +1 -0
  43. package/package.json +9 -8
@@ -33,8 +33,25 @@ code,pre,.mono{font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,
33
33
  /* sidebar */
34
34
  aside{
35
35
  width:236px;flex:0 0 236px;background:var(--panel);
36
- display:flex;flex-direction:column;overflow:hidden;
36
+ display:flex;flex-direction:column;overflow:hidden;transition:flex-basis .18s,width .18s;
37
37
  }
38
+ /* Folded away on a desktop. Zero width rather than display:none, for the
39
+ slide, and so nothing inside has to be rebuilt when it comes back. */
40
+ body.nav-collapsed>aside{width:0;flex-basis:0}
41
+ #nav-collapse,#nav-expand{
42
+ width:28px;height:28px;border:0;border-radius:7px;background:transparent;color:var(--dim);
43
+ cursor:pointer;padding:0;display:grid;place-items:center;flex:0 0 auto;-webkit-app-region:no-drag;
44
+ }
45
+ #nav-collapse{margin-left:auto}
46
+ #nav-collapse:hover,#nav-expand:hover{background:var(--hover);color:var(--fg)}
47
+ #nav-collapse svg,#nav-expand svg{width:16px;height:16px;display:block;shape-rendering:geometricPrecision}
48
+ #nav-expand{display:none;position:absolute;z-index:5;top:7px;left:8px}
49
+ body.nav-collapsed #nav-expand{display:grid}
50
+ body.nav-collapsed #tabs{padding-left:44px}
51
+ /* The traffic lights sit where the sidebar's corner was; step past them. */
52
+ body.inset-titlebar.nav-collapsed #nav-expand{left:80px}
53
+ body.inset-titlebar.nav-collapsed #tabs{padding-left:116px;-webkit-app-region:drag}
54
+ body.inset-titlebar.nav-collapsed #tabs>*{-webkit-app-region:no-drag}
38
55
  aside header{padding:15px 14px 8px;display:flex;gap:8px;align-items:center}
39
56
  /* The desktop shell hides the title bar, so on macOS the traffic lights float
40
57
  * over this corner. The wordmark moves below them, and the strip they sit in
@@ -531,8 +548,14 @@ details.provider>summary .vmark.filled,.pp-item .vmark.filled{padding:0}
531
548
  .tab .dot{width:6px;height:6px;border-radius:50%;background:var(--brand);flex:0 0 auto}
532
549
  .tab .x{
533
550
  width:18px;height:18px;padding:0;border:0;border-radius:5px;background:transparent;color:inherit;
534
- display:grid;place-items:center;cursor:pointer;opacity:0;flex:0 0 auto;
535
- }
551
+ display:none;place-items:center;cursor:pointer;opacity:0;flex:0 0 auto;
552
+ }
553
+ /* A tab's controls take no room until the pointer or focus is on it: an idle
554
+ tab spends its width on its title, and a hovered one gives some back to its
555
+ buttons, where the title then ends in an ellipsis. Hidden rather than only
556
+ transparent — a transparent button still holds its space. A running
557
+ browser keeps its button, because its dot is what says so. */
558
+ .tab:hover .x,.tab:focus-within .x{display:grid}
536
559
  /* The tab's browser button's size. Much smaller and the 1.5px strokes thin
537
560
  below a pixel and blur; the full 16px outweighs the tab's own text. */
538
561
  .tab .x svg{width:14px;height:14px}
@@ -543,6 +566,8 @@ details.provider>summary .vmark.filled,.pp-item .vmark.filled{padding:0}
543
566
  display:grid;place-items:center;background:transparent;color:inherit;cursor:pointer;
544
567
  opacity:0;flex:0 0 auto;
545
568
  }
569
+ .tab .tab-browser{display:none}
570
+ .tab:hover .tab-browser,.tab:focus-within .tab-browser,.tab .tab-browser.running{display:grid}
546
571
  .tab:hover .tab-browser,.tab.on .tab-browser,.tab-browser.running{opacity:.62}
547
572
  .tab-browser:hover,.tab-browser.on{opacity:1;background:var(--sel)}
548
573
  .tab-browser svg{width:14px;height:14px}
@@ -799,6 +824,140 @@ body.panelled #composer,body.panelled #jump,body.panelled #changes-btn{display:n
799
824
  #diff pre.diff{padding:8px 0}
800
825
  .d-add,.d-del,.d-same{padding:0 12px}
801
826
  .hunk{color:var(--dim);background:var(--field);padding:3px 12px;font-size:11px}
827
+ /*
828
+ * The files pane: the same column as #review, a little wider because it holds
829
+ * two — the tree, and the file picked from it.
830
+ */
831
+ #explorer{
832
+ width:0;flex:0 0 0;background:var(--panel);
833
+ display:flex;flex-direction:column;overflow:hidden;transition:flex-basis .18s,width .18s;
834
+ /* Above the transcript column, whose composer bar can spill sideways when
835
+ the window is narrow enough to squeeze it. */
836
+ position:relative;z-index:2;
837
+ }
838
+ #explorer.open{width:var(--explorer-width,min(52vw,860px));flex:0 0 var(--explorer-width,min(52vw,860px));overflow:clip;overflow-clip-margin:6px}
839
+ #explorer-head{display:flex;align-items:center;gap:8px;padding:10px 10px 6px 16px;font-size:12.5px}
840
+ #explorer-title{font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
841
+ #explorer-actions{display:flex;gap:2px}
842
+ #explorer-actions button{
843
+ width:28px;height:28px;border:0;border-radius:7px;background:transparent;color:var(--dim);
844
+ cursor:pointer;padding:0;display:grid;place-items:center;
845
+ }
846
+ #explorer-actions button:hover{background:var(--hover);color:var(--fg)}
847
+ #explorer-actions svg{width:15px;height:15px}
848
+ #explorer-body{flex:1;display:flex;min-height:0}
849
+ #explorer-tree{width:var(--explorer-tree-width,min(40%,260px));flex:0 0 auto;overflow:auto;padding:2px 6px 12px}
850
+ /* The line between the tree and the file, and the handle that moves it: a
851
+ gap wide enough to grab, drawn only while it is being pointed at. */
852
+ #explorer-split{flex:0 0 7px;margin:0 -3px;position:relative;z-index:1;cursor:col-resize;touch-action:none;outline:0}
853
+ #explorer-split::before{
854
+ content:"";position:absolute;left:2px;top:50%;width:3px;height:34px;border-radius:999px;
855
+ background:var(--dim);opacity:0;transform:translateY(-50%) scaleY(.65);transition:opacity .12s,transform .16s;
856
+ }
857
+ .explorer-row{
858
+ display:flex;align-items:center;gap:5px;width:100%;border:0;background:transparent;color:var(--fg);
859
+ font:inherit;font-size:12.5px;text-align:left;padding:4px 8px;border-radius:6px;cursor:pointer;
860
+ white-space:nowrap;
861
+ }
862
+ .explorer-row:hover{background:var(--hover)}
863
+ .explorer-row.on{background:var(--sel)}
864
+ .explorer-row svg{width:14px;height:14px;flex:0 0 auto;color:var(--dim)}
865
+ .explorer-caret{width:12px;flex:0 0 12px;display:grid;place-items:center}
866
+ .explorer-caret svg{width:11px;height:11px}
867
+ .explorer-name{overflow:hidden;text-overflow:ellipsis;min-width:0}
868
+ #explorer-view{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--bg)}
869
+ .explorer-hint{padding:16px;font-size:12.5px;margin:0}
870
+ .explorer-bar{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:12px}
871
+ .explorer-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}
872
+ .explorer-size{color:var(--dim);font-size:11px;flex:0 0 auto}
873
+ .explorer-btn{
874
+ border:0;background:var(--field);color:var(--fg);border-radius:6px;padding:3px 9px;
875
+ font:inherit;font-size:11.5px;cursor:pointer;flex:0 0 auto;
876
+ }
877
+ .explorer-btn:hover{background:var(--sel)}
878
+ .explorer-content{flex:1;overflow:auto;min-height:0}
879
+ .explorer-code{display:flex;align-items:flex-start;min-width:max-content}
880
+ .explorer-code pre{margin:0;font-size:12.5px;line-height:1.55;padding:8px 12px 16px}
881
+ .explorer-gutter{color:var(--dim);text-align:right;user-select:none;opacity:.7;padding-right:10px!important;position:sticky;left:0;background:var(--bg)}
882
+ .explorer-src{overflow:visible!important;padding-left:4px!important}
883
+ .explorer-md{padding:12px 20px 24px;max-width:780px}
884
+ .explorer-img{display:block;max-width:calc(100% - 32px);margin:16px;image-rendering:auto}
885
+ .explorer-video{display:block;max-width:calc(100% - 32px);max-height:calc(100% - 32px);margin:16px;background:#000;border-radius:8px}
886
+ .explorer-audio{display:block;width:calc(100% - 32px);margin:16px}
887
+ .explorer-content.explorer-fill{overflow:hidden;display:flex}
888
+ .explorer-pdf{flex:1;width:100%;height:100%;border:0;background:var(--bg)}
889
+ /* Resize handles: an invisible strip on an edge, with a short pill drawn on
890
+ hover or while dragging — the same look as the browser pane's handle. */
891
+ .resizer-col{position:absolute;z-index:4;left:-6px;top:0;bottom:0;width:15px;cursor:col-resize;outline:0;touch-action:none}
892
+ .resizer-col::before{
893
+ content:"";position:absolute;left:6px;top:50%;width:3px;height:34px;border-radius:999px;
894
+ background:var(--dim);opacity:0;transform:translateY(-50%) scaleY(.65);transition:opacity .12s,transform .16s;
895
+ }
896
+ .resizer-row{position:absolute;z-index:4;left:0;right:0;top:-6px;height:13px;cursor:row-resize;outline:0;touch-action:none}
897
+ .resizer-row::before{
898
+ content:"";position:absolute;top:5px;left:50%;height:3px;width:34px;border-radius:999px;
899
+ background:var(--dim);opacity:0;transform:translateX(-50%) scaleX(.65);transition:opacity .12s,transform .16s;
900
+ }
901
+ .resizer-col:hover::before,.resizer-col:focus-visible::before,
902
+ #explorer-split:hover::before,#explorer-split:focus-visible::before,body.dragging-x #explorer-split::before{
903
+ opacity:.55;transform:translateY(-50%) scaleY(1);
904
+ }
905
+ .resizer-row:hover::before,.resizer-row:focus-visible::before,body.dragging-y .resizer-row::before{
906
+ opacity:.55;transform:translateX(-50%) scaleX(1);
907
+ }
908
+ body.dragging{user-select:none;-webkit-user-select:none}
909
+ body.dragging-x{cursor:col-resize}
910
+ body.dragging-y{cursor:row-resize}
911
+ body.dragging #explorer{transition:none}
912
+ body.dragging iframe{pointer-events:none}
913
+ /*
914
+ * The terminal, under the composer and as wide as the conversation. Its
915
+ * height is whatever it was last dragged to.
916
+ */
917
+ #terminal{
918
+ flex:0 0 var(--terminal-height,clamp(180px,34vh,420px));min-height:120px;position:relative;
919
+ display:flex;flex-direction:column;background:var(--panel);
920
+ }
921
+ #terminal[hidden]{display:none}
922
+ #terminal-head{display:flex;align-items:center;gap:4px;padding:5px 8px 3px 8px;font-size:12px;flex:0 0 auto;min-width:0}
923
+ #terminal-tabs{display:flex;gap:2px;overflow-x:auto;min-width:0;flex:0 1 auto;scrollbar-width:none}
924
+ #terminal-tabs::-webkit-scrollbar{display:none}
925
+ .terminal-tab{
926
+ display:flex;align-items:center;gap:6px;height:26px;padding:0 4px 0 8px;border-radius:6px;
927
+ color:var(--dim);cursor:pointer;flex:0 0 auto;max-width:180px;user-select:none;
928
+ }
929
+ .terminal-tab:hover{background:var(--hover);color:var(--fg)}
930
+ .terminal-tab.on{background:var(--bg);color:var(--fg)}
931
+ .terminal-tab>svg{width:13px;height:13px;flex:0 0 auto}
932
+ .terminal-tab-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
933
+ .terminal-tab-x{
934
+ width:18px;height:18px;border:0;border-radius:4px;background:transparent;color:inherit;padding:0;
935
+ display:grid;place-items:center;cursor:pointer;opacity:0;flex:0 0 auto;
936
+ }
937
+ .terminal-tab:hover .terminal-tab-x,.terminal-tab.on .terminal-tab-x{opacity:.6}
938
+ .terminal-tab-x:hover{opacity:1;background:var(--sel)}
939
+ .terminal-tab-x svg{width:12px;height:12px}
940
+ #terminal-where{flex:1;min-width:0;text-align:right;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 6px}
941
+ #terminal-new,#terminal-hide{
942
+ width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--dim);
943
+ cursor:pointer;padding:0;display:grid;place-items:center;flex:0 0 auto;
944
+ }
945
+ #terminal-new:hover,#terminal-hide:hover{background:var(--hover);color:var(--fg)}
946
+ #terminal-new svg,#terminal-hide svg{width:14px;height:14px}
947
+ #terminal-body{flex:1;min-height:0;position:relative;background:var(--bg)}
948
+ .terminal-host{position:absolute;inset:4px 0 6px 12px}
949
+ .terminal-host[hidden]{display:none}
950
+ .terminal-host .xterm{height:100%}
951
+ .terminal-host .xterm-viewport{background:transparent!important}
952
+ .tab-tool{
953
+ width:22px;height:22px;border:0;border-radius:6px;background:transparent;color:inherit;
954
+ display:grid;place-items:center;padding:0;cursor:pointer;flex:0 0 auto;opacity:0;
955
+ }
956
+ .tab .tab-tool{display:none}
957
+ .tab:hover .tab-tool,.tab:focus-within .tab-tool{display:grid}
958
+ .tab:hover .tab-tool,.tab.on .tab-tool{opacity:.62}
959
+ .tab-tool:hover,.tab-tool.on{opacity:1;background:var(--sel)}
960
+ .tab-tool svg{width:14px;height:14px}
802
961
  #changes-btn{
803
962
  border:0;background:var(--panel);color:var(--fg);border-radius:7px;
804
963
  padding:5px 11px;font:inherit;font-size:12px;cursor:pointer;
@@ -1294,6 +1453,38 @@ details.setting>summary:focus-visible{outline:none;background:var(--hover)}
1294
1453
  .status-dot.ok{background:var(--ok);opacity:1}
1295
1454
  /* The presets and the calendar on one line, on the same baseline. */
1296
1455
  .usage-window{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
1456
+ .usage-kind-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
1457
+ .usage-head-actions{display:inline-flex;align-items:center;gap:8px;margin-left:auto}
1458
+ .usage-head-actions .seg{margin:0}
1459
+ .usage-head-actions .seg-item{padding:3px 10px;font-size:12px}
1460
+ /*
1461
+ * The kinds, as figures that are also the filter. Filled, never outlined: the
1462
+ * chosen one takes the accent fill the model chips use for "this one".
1463
+ */
1464
+ .usage-kinds{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;margin:4px 0 10px}
1465
+ .usage-kind{display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:0;padding:12px 14px;border:0;border-radius:10px;background:var(--panel);color:var(--fg);font:inherit;text-align:left;cursor:pointer}
1466
+ .usage-kind:hover{box-shadow:inset 0 0 0 999px var(--hover)}
1467
+ .usage-kind:focus-visible{outline:none;box-shadow:inset 0 0 0 999px var(--sel)}
1468
+ .usage-kind-label{font-size:11.5px;color:var(--dim)}
1469
+ .usage-kind-value{font-size:20px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1470
+ .usage-kind-sub{font-size:12px;color:var(--dim)}
1471
+ .usage-kind.empty .usage-kind-value{color:var(--dim)}
1472
+ .usage-kind.on{background:var(--accent);color:var(--bg);box-shadow:none}
1473
+ .usage-kind.on .usage-kind-label,.usage-kind.on .usage-kind-sub,.usage-kind.on.empty .usage-kind-value{color:var(--bg);opacity:.72}
1474
+ .usage-counted{margin:0 0 10px}
1475
+ /* Amounts in one column at the right edge, so a list is compared by glancing down it. */
1476
+ .usage .row-head .usage-amount{margin-left:auto;flex:none;font-variant-numeric:tabular-nums}
1477
+ .usage .row-head .row-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1478
+ @media (max-width:640px){.usage-kinds{grid-template-columns:repeat(2,minmax(0,1fr))}.usage-kind:first-child{grid-column:1/-1}}
1479
+ .usage-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:22px 0 8px}
1480
+ .usage-section-head .section-title{margin:0}
1481
+ .usage-session{cursor:pointer}
1482
+ .usage-session:hover{background:var(--hover)}
1483
+ .usage-session:focus-visible{outline:none;background:var(--hover)}
1484
+ .usage-sessions-count{margin:10px 0 8px}
1485
+ .usage-sessions-foot{padding:10px 0 24px;text-align:center}
1486
+ .usage-sessions-sentinel{height:1px}
1487
+ .usage-kind-title .muted{font-weight:400;text-transform:none;letter-spacing:0}
1297
1488
  .perms-card{display:flex;flex-direction:column;gap:10px}
1298
1489
  .perms-card .setting-list{margin:0}
1299
1490
  /* The mode, as the one fact the rest of the page qualifies. */
@@ -2152,6 +2343,40 @@ pre.diff{margin:0;font-size:12px;line-height:1.5;overflow-x:auto}
2152
2343
  * between two paragraphs — and the box is kept for what opens under it. The
2153
2344
  * chevron trails the words, where it points at what a click will show. */
2154
2345
  details.work{margin:0 0 12px}
2346
+ /* What a media tool made, under the steps that made it. No frame: the image is
2347
+ its own edge, and a border would only box it in. */
2348
+ .media-strip{display:flex;flex-wrap:wrap;align-items:flex-start;gap:12px;margin:0 0 14px}
2349
+ .media-item{margin:0;display:flex;flex-direction:column;gap:5px;max-width:100%}
2350
+ /* Sized by the picture itself, so the corners are the picture's corners: a
2351
+ box of fixed proportions around it showed as a panel-coloured frame
2352
+ wherever the two shapes differed. */
2353
+ .media-item img,.media-item video{display:block;width:auto;height:auto;max-width:min(360px,100%);max-height:440px;border-radius:12px;cursor:zoom-in}
2354
+ .media-item video{max-width:min(480px,100%);cursor:auto}
2355
+ /* A clip, drawn by the page: a filled card, no outline, like everything else
2356
+ that sits on the conversation. */
2357
+ .media-item.audio{width:min(360px,100%)}
2358
+ .media-item audio{display:none}
2359
+ .audio-card{display:flex;align-items:center;gap:12px;padding:10px 14px 10px 10px;border-radius:14px;background:var(--panel)}
2360
+ .audio-play{
2361
+ width:36px;height:36px;flex:0 0 auto;border:0;border-radius:50%;padding:0;
2362
+ display:grid;place-items:center;background:var(--fg);color:var(--bg);cursor:pointer;
2363
+ }
2364
+ .audio-play:hover{opacity:.85}
2365
+ .audio-play svg{width:14px;height:14px}
2366
+ .audio-play svg path{fill:currentColor}
2367
+ .audio-card.playing .audio-play svg path{fill:none;stroke-width:2.2}
2368
+ .audio-meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
2369
+ .audio-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:12.5px}
2370
+ .audio-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg);cursor:pointer}
2371
+ .audio-name:hover{text-decoration:underline;text-underline-offset:2px}
2372
+ .audio-time{flex:0 0 auto;color:var(--dim);font-size:11.5px;font-variant-numeric:tabular-nums}
2373
+ /* Thin to look at, tall to hit: the pseudo-element widens the target. */
2374
+ .audio-track{position:relative;height:4px;border-radius:2px;background:var(--hover);cursor:pointer}
2375
+ .audio-track::before{content:"";position:absolute;left:0;right:0;top:-7px;bottom:-7px}
2376
+ .audio-track:focus-visible{outline:none;background:var(--sel)}
2377
+ .audio-fill{height:100%;width:0;border-radius:2px;background:var(--fg);pointer-events:none}
2378
+ .media-item figcaption{max-width:360px;font-size:11.5px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}
2379
+ .media-item figcaption:hover{color:var(--fg)}
2155
2380
  details.work>summary{
2156
2381
  padding:3px 0;cursor:pointer;font-size:13.5px;color:var(--dim);list-style:none;
2157
2382
  display:flex;gap:6px;align-items:center;width:max-content;max-width:100%;
@@ -2684,6 +2909,9 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
2684
2909
  body>aside.open{transform:none;box-shadow:0 0 0 1px #0000000a,0 12px 40px #00000040}
2685
2910
  body.nav-open #scrim{display:block}
2686
2911
  #nav-close{display:grid}
2912
+ #nav-collapse,body.nav-collapsed #nav-expand{display:none}
2913
+ body.nav-collapsed>aside{width:min(280px,84vw);flex-basis:auto}
2914
+ body.nav-collapsed #tabs{padding-left:12px}
2687
2915
  #burger{display:grid}
2688
2916
  #top{padding:6px 10px}
2689
2917
  #top:has(#changes-btn:not([hidden])){padding:6px 10px}
@@ -2695,6 +2923,31 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
2695
2923
  }
2696
2924
  #review-head{padding:10px 10px 8px 16px}
2697
2925
  #review-close{display:grid}
2926
+ #explorer.open{position:fixed;inset:0;z-index:50;width:100%;height:100%;flex:none;transition:none}
2927
+ #explorer-head{padding-top:max(10px,env(safe-area-inset-top))}
2928
+ #explorer-body{flex-direction:column}
2929
+ #explorer-resizer{display:none}
2930
+ #explorer-tree{width:auto;height:var(--explorer-tree-height,38%);max-height:none}
2931
+ /* Stacked, so the handle between them drags up and down — and is a strip
2932
+ a thumb can find rather than a hairline. */
2933
+ #explorer-split{flex:0 0 18px;margin:0;cursor:row-resize}
2934
+ #explorer-split::before{left:50%;top:7px;width:34px;height:4px;opacity:.4;transform:translateX(-50%)}
2935
+ body.dragging-y #explorer-split::before{opacity:.7;transform:translateX(-50%)}
2936
+ .explorer-row{padding-top:8px;padding-bottom:8px}
2937
+ #explorer-actions button{width:34px;height:34px}
2938
+ /* A phone has room for the conversation or a shell, and the shell needs the
2939
+ keyboard: while it is open the composer steps aside, and the handle on
2940
+ top is a visible grip. */
2941
+ body.terminal-open #composer,body.terminal-open #jump{display:none}
2942
+ #terminal{flex-basis:var(--terminal-height,55%);padding-bottom:env(safe-area-inset-bottom)}
2943
+ #terminal-resizer{top:0;height:18px}
2944
+ #terminal-resizer::before{top:6px;opacity:.4;transform:translateX(-50%)}
2945
+ #terminal-head{padding-top:14px}
2946
+ #terminal-new,#terminal-hide{width:34px;height:34px}
2947
+ .terminal-tab{height:32px}
2948
+ .terminal-tab-x{opacity:.6;width:24px;height:24px}
2949
+ #terminal-where{display:none}
2950
+ .terminal-host{inset:4px 0 6px 6px}
2698
2951
  #files{max-height:40%}
2699
2952
  #shelf-bar{flex-wrap:wrap;row-gap:4px}
2700
2953
 
@@ -2767,6 +3020,8 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
2767
3020
  .turn{margin-bottom:14px}
2768
3021
  .act{padding:6px 10px}
2769
3022
  .tab .x{opacity:.55;width:24px;height:24px}
3023
+ /* No hover to reveal them on a touch screen. */
3024
+ .tab .x,.tab .tab-tool,.tab .tab-browser{display:grid}
2770
3025
  #tab-add{width:32px;height:32px}
2771
3026
  .tab{height:34px}
2772
3027
  .nav-item,.session,.fold,.project{height:38px}
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;EAC7B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAouFV,CAAC"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;EAC7B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAm+FV,CAAC"}
package/dist/page.js CHANGED
@@ -55,6 +55,7 @@ ${ANALYTICS_STUB}
55
55
  </svg>
56
56
  </span>
57
57
  <b class="wordmark">OHarness</b>
58
+ <button id="nav-collapse" type="button" data-t-title="nav.collapse" data-t-aria-label="nav.collapse"><svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2.25" y="3.25" width="11.5" height="9.5" rx="2.5"/><path d="M6.25 3.25v9.5"/></svg></button>
58
59
  <button id="nav-close" type="button" aria-label="Close"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg></button>
59
60
  </header>
60
61
  <button id="project" class="project" type="button">
@@ -103,6 +104,8 @@ ${ANALYTICS_STUB}
103
104
 
104
105
  <div id="split">
105
106
  <div id="main">
107
+ <!-- Shown only while the sidebar is folded away: the way back to it. -->
108
+ <button id="nav-expand" type="button" data-t-title="nav.expand" data-t-aria-label="nav.expand"><svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2.25" y="3.25" width="11.5" height="9.5" rx="2.5"/><path d="M6.25 3.25v9.5"/></svg></button>
106
109
  <div id="tabs"></div>
107
110
  <div id="log">
108
111
  <div id="empty">
@@ -199,6 +202,19 @@ ${ANALYTICS_STUB}
199
202
  <span id="ctxtext"></span>
200
203
  </div>
201
204
  </form>
205
+ <!-- The embedded terminal: under the conversation, as tall as it is
206
+ dragged. The shell belongs to the project, not to this panel, so
207
+ hiding the panel leaves it running. -->
208
+ <div id="terminal" hidden>
209
+ <div id="terminal-resizer" class="resizer-row" role="separator" aria-orientation="horizontal" tabindex="0" data-t-aria-label="terminal.resize"></div>
210
+ <div id="terminal-head">
211
+ <div id="terminal-tabs" role="tablist"></div>
212
+ <button id="terminal-new" type="button" data-t-title="terminal.new" data-t-aria-label="terminal.new"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M8 3.5v9M3.5 8h9"/></svg></button>
213
+ <span id="terminal-where"></span>
214
+ <button id="terminal-hide" type="button" data-t-title="terminal.hide" data-t-aria-label="terminal.hide"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4.5 4.5l7 7M11.5 4.5l-7 7"/></svg></button>
215
+ </div>
216
+ <div id="terminal-body"></div>
217
+ </div>
202
218
  </div>
203
219
  <div id="review">
204
220
  <div id="review-head">
@@ -209,6 +225,24 @@ ${ANALYTICS_STUB}
209
225
  <div id="files"></div>
210
226
  <div id="diff"></div>
211
227
  </div>
228
+ <!-- A project's own files: the tree on one side, the file on the other.
229
+ Shaped and placed like #review, which is the same kind of column. -->
230
+ <div id="explorer">
231
+ <div id="explorer-resizer" class="resizer-col" role="separator" aria-orientation="vertical" tabindex="0" data-t-aria-label="files.resize"></div>
232
+ <div id="explorer-head">
233
+ <span id="explorer-title"></span>
234
+ <span id="explorer-actions">
235
+ <button id="explorer-terminal" type="button" data-t-title="files.terminal" data-t-aria-label="files.terminal"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 5.5 6.5 8 4 10.5"/><path d="M8.5 10.5H12"/></svg></button>
236
+ <button id="explorer-refresh" type="button" data-t-title="files.refresh" data-t-aria-label="files.refresh"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13.2 5.4A5.6 5.6 0 1 0 13.5 10"/><path d="M13.2 2.5v2.9h-2.9"/></svg></button>
237
+ <button id="explorer-close" type="button" data-t-title="files.close" data-t-aria-label="files.close"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4.5 4.5l7 7M11.5 4.5l-7 7"/></svg></button>
238
+ </span>
239
+ </div>
240
+ <div id="explorer-body">
241
+ <div id="explorer-tree" role="tree"></div>
242
+ <div id="explorer-split" role="separator" tabindex="0" data-t-aria-label="files.resize"></div>
243
+ <div id="explorer-view"></div>
244
+ </div>
245
+ </div>
212
246
  <!-- The agent's browser, beside the transcript rather than over it.
213
247
  A sibling of #main for the same reason #review is one: the split is a
214
248
  row of columns, and a pane nested inside #main would stack under the
@@ -221,7 +255,7 @@ ${ANALYTICS_STUB}
221
255
  <div id="browser-head">
222
256
  <div id="browser-context">
223
257
  <div id="browser-name-line">
224
- <span id="browser-mark" aria-hidden="true"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1.75" y="2.5" width="12.5" height="11" rx="2"/><path d="M1.75 6h12.5"/><circle cx="4.25" cy="4.25" r=".55" fill="currentColor" stroke="none"/></svg></span>
258
+ <span id="browser-mark" aria-hidden="true"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1.75" y="2.75" width="12.5" height="10.5" rx="2"/><path d="M1.75 6h12.5"/><path d="M4.1 4.4h.01M5.9 4.4h.01"/></svg></span>
225
259
  <span id="browser-title" data-t="nav.browser"></span>
226
260
  <span id="browser-status" hidden><i></i><span data-t="browser.live"></span></span>
227
261
  </div>
package/dist/page.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;;;;;;GAcG;AAGH;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;yCAKyB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;4CAOwB,kBAAkB,CAAC,OAAO,CAAC;SAC9D,KAAK;EACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwWK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;EAC1C,aAAa;EACb,UAAU;EACV,gBAAgB;;;QAGV,CAAC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;;;;;;GAcG;AAGH;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;yCAKyB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;4CAOwB,kBAAkB,CAAC,OAAO,CAAC;SAC9D,KAAK;EACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA0YK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;EAC1C,aAAa;EACb,UAAU;EACV,gBAAgB;;;QAGV,CAAC"}