@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.
- package/dist/account-usage.d.ts +29 -0
- package/dist/account-usage.js +56 -0
- package/dist/account-usage.js.map +1 -0
- package/dist/files.d.ts +40 -1
- package/dist/files.js +94 -3
- package/dist/files.js.map +1 -1
- package/dist/i18n.js +126 -2
- package/dist/i18n.js.map +1 -1
- package/dist/page/client/base.js +4 -0
- package/dist/page/client/base.js.map +1 -1
- package/dist/page/client/browser.js +3 -1
- package/dist/page/client/browser.js.map +1 -1
- package/dist/page/client/composer.js +20 -0
- package/dist/page/client/composer.js.map +1 -1
- package/dist/page/client/files.d.ts +7 -0
- package/dist/page/client/files.js +412 -0
- package/dist/page/client/files.js.map +1 -0
- package/dist/page/client/index.js +4 -0
- package/dist/page/client/index.js.map +1 -1
- package/dist/page/client/panels.js +1 -1
- package/dist/page/client/routines.js +19 -1
- package/dist/page/client/routines.js.map +1 -1
- package/dist/page/client/shell.js +12 -1
- package/dist/page/client/shell.js.map +1 -1
- package/dist/page/client/state.js +12 -4
- package/dist/page/client/state.js.map +1 -1
- package/dist/page/client/terminal.d.ts +7 -0
- package/dist/page/client/terminal.js +347 -0
- package/dist/page/client/terminal.js.map +1 -0
- package/dist/page/client/transcript.js +167 -0
- package/dist/page/client/transcript.js.map +1 -1
- package/dist/page/client/usage.js +400 -70
- package/dist/page/client/usage.js.map +1 -1
- package/dist/page/style.js +258 -3
- package/dist/page/style.js.map +1 -1
- package/dist/page.js +35 -1
- package/dist/page.js.map +1 -1
- package/dist/server.js +238 -31
- package/dist/server.js.map +1 -1
- package/dist/terminal.d.ts +34 -0
- package/dist/terminal.js +211 -0
- package/dist/terminal.js.map +1 -0
- package/package.json +9 -8
package/dist/page/style.js
CHANGED
|
@@ -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:
|
|
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}
|
package/dist/page/style.js.map
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
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"}
|