|
189 | 189 |
|
190 | 190 |
|
191 | 191 | #icons |
192 | | - {display:flex;align-items:center;gap:5px;margin-right:20px} |
| 192 | + {display:flex;align-items:center;gap:5px;margin-right:10px} |
193 | 193 |
|
194 | 194 | .icon |
195 | 195 | {width:32px;height:32px;border:1px solid gray;border-radius:3px;box-sizing:border-box;cursor:pointer} |
|
260 | 260 | <img id=snippet-console title=snippet-console class=icon> |
261 | 261 | </div> |
262 | 262 |
|
263 | | - <div class=spc> |
| 263 | + |
| 264 | + <div style='width:15px'> |
264 | 265 | </div> |
265 | 266 |
|
| 267 | + |
266 | 268 | <div id=more-menu class=m-root> |
267 | 269 | <div class=m-btn> |
268 | 270 | <span> |
|
284 | 286 | </span> |
285 | 287 | <img class=m-icon> |
286 | 288 | </div> |
287 | | - <div class=menu style='display:none;left:0px;top:35px;width:300px'> |
| 289 | + <div class=menu style='display:none;left:0px;top:35px'> |
| 290 | + Empty |
288 | 291 | </div> |
289 | 292 | </div> |
290 | 293 |
|
|
295 | 298 | </span> |
296 | 299 | <img class=m-icon> |
297 | 300 | </div> |
298 | | - <div class=menu style='display:none;right:0px;top:35px;width:300px'> |
| 301 | + <div class=menu style='display:none;right:0px;top:35px'> |
299 | 302 | <div class=menu-opt> |
300 | 303 | <a href='https://webcontainers.io/api' target=_blank> |
301 | 304 | webcontainers api |
302 | 305 | </a> |
303 | 306 | </div> |
| 307 | + <div class=menu-opt style='justify-content:flex-start'> |
| 308 | + <img style='width:20px;height:20px;margin-right:10px' class=icon src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADkElEQVR4Ab3V1XLcSBQGYC3z3iwzM5NZ3S0mD4aZGV5gGYeZzRxm5jyCX8DXy8y7yZyoPSWXJ5FZyak69vD/6dcAM52Zs3POzd5OYfu8fvmiu5X/XclwC5lrNb4eYev8HdJfi3YrsGCHDPP6JdALPGg5bkgukFevWrC/U3hvwXZpaNkBFZbsVWAEMCCBt10Ew0Q0l4SynufOa2ntbseCXSVy77zt0tEVh7XyisMq2AHm9EoVQJEHd4tgLv+fluc+nXH43H7x85WHtf/XHNdg1VENxgT0SeBpF4YRrpIAnjYBvB0iuFqFH7Uidk09eEBasPyQ8su6UzqsPaHDZACzusWqFijI1ymC37zd3cYPejrkxyYM9nbxzyzZpwxuOGvA+tM6TBVAj9xqwd1aacHfJcKsHnN7xXJzK7+XfoJsw+fvlPPrTuvljecMmC6ABjaPbqGt0gK9b3avBHP7JZjdLfyhl7jaqnDyCbl1Tp94gYbPFOAq8WDk7VugjzNzQEpzO6sBUXIvF8Gw9qQ+YwA9cj1XacFl04JhAnGYPXAFAAcReDtFRwBGodJCs9VCuzDcgq9LABJjxwJgoEuDnADoWRNRGNWCeZ+aIzR8XICp5h0BaCbAOhW0BXo7DqNxAAEMdCli6X7VEYCa5kZakJKYAqy1B1irpnlHAHKSAy1XaYKEJgKEED36EcTCnbIjACnBAR/DQF/fWntAvAlwdPj8mBAEYpyjH8sZA4QYMUMtgLWXA0rv3IvSDYCSDYDjjYAjLG2BvrAjAG5SgHwtoGwdoEw9rWgYwIcJDXYGEJwI0PoeoFIN4HQDDbeWvqgzgEAFYa4NYMAEdL4DqP1ds35UBSBBAssPqs4CAjYAtvctQIXaqnBrXUXBIQAeB9D/pnXubXfxHmWGgKqtBmhHn70FFWr+twu2VslwjgG40GU/x3TYQk0chdnyOAgzTJ4xAAXQr2yYfZuxG9Ra8xTO1A3ioD1AjBNYtn96ABIgF3AIlxhgrmcmGtJWr6JE4/d2CPq7PhUA/RrmIniQTbAPMVMdVKz9HEfZ/0YD+DAxw+VJAcQU+YZLs5iZybySe+VOlKvbi0OobCHo7/t4AK3I/SsX0QeMk1Pf9u5bKNUwZH05zd8uXwHwdPBltb1pL+kktzJXa1CpZpn5g/WbnudHALP7RHD1oSHXAHmRuSbzCXMjztd2+3vEi95e7ldjV6OfmeZcAuAsEWG+c8BcAAAAAElFTkSuQmCC'> |
| 309 | + <a href='https://nodejs.org/' target=_blank> |
| 310 | + https://nodejs.org/ |
| 311 | + </a> |
| 312 | + </div> |
| 313 | + <div style='padding-left:30px' class=menu-opt> |
| 314 | + <a href='https://nodejs.org/docs/latest/api/fs.html' target=_blank> |
| 315 | + https://nodejs.org/docs/latest/api/fs.html |
| 316 | + </a> |
| 317 | + </div> |
304 | 318 | </div> |
305 | 319 | </div> |
306 | 320 |
|
|
470 | 484 | snippet.css.insert_rule([':host {height:100%;}','#root {height:100%}']); |
471 | 485 | snippet.editor.css.insert_rule([':host {flex:1}','#root {height:100%}']); |
472 | 486 |
|
473 | | - snippet.ctx = {snippet,webcontainer,viewport,vm,shell,term,input,output}; |
| 487 | + snippet.ctx = {snippet,webcontainer,viewport,vm,tabs}; |
474 | 488 |
|
475 | 489 |
|
476 | 490 | var attrs = {component:'page'}; |
|
531 | 545 |
|
532 | 546 | menu_callback['https-server'] = async function(){ |
533 | 547 |
|
| 548 | + if(!tabs.cur.view){ |
| 549 | + log.red('no active terminal'); |
| 550 | + return; |
| 551 | + } |
| 552 | + |
| 553 | + var cwd = tabs.cur.view.terminal.shell.cwd; |
534 | 554 | if(cwd===null){ |
535 | 555 | term.writeln.red('can only install https-server relative to workdir'); |
536 | 556 | return; |
537 | 557 | } |
538 | 558 |
|
| 559 | + var term = tabs.cur.view.terminal.term; |
| 560 | + |
539 | 561 | var s; |
540 | 562 | term.writeln(''); |
541 | 563 | term.write.green('installing https-server ... '); |
542 | 564 | setTimeout(()=>{ |
543 | | - var {x,y} = cursor.xy(); |
544 | | - s = spinner({x,y}); |
| 565 | + var {x,y} = cursor.xy(term); |
| 566 | + s = spinner({term,x,y}); |
545 | 567 | term.write('\r\n'); |
546 | 568 | },50); |
547 | 569 |
|
|
583 | 605 |
|
584 | 606 | s.stop(); |
585 | 607 | term.write.green('ok.'); |
586 | | - await prompt(); |
| 608 | + await term.prompt(); |
587 | 609 |
|
588 | 610 | }//https-server |
589 | 611 |
|
590 | 612 |
|
591 | 613 | menu_callback['save-snapshot'] = async function(){ |
592 | 614 | console.log('save-snapshot'); |
| 615 | + if(!tabs.cur.view){ |
| 616 | + log.red('no active terminal'); |
| 617 | + return; |
| 618 | + } |
| 619 | + |
| 620 | + var cwd = tabs.cur.view.terminal.shell.cwd; |
| 621 | + var cwd_abs = tabs.cur.view.terminal.shell.cwd_abs; |
593 | 622 | console.log(cwd_abs); |
594 | 623 | if(cwd===null){ |
595 | 624 | term.writeln.red('can only save snapshot relative to workdir'); |
596 | 625 | return; |
597 | 626 | } |
598 | 627 |
|
| 628 | + var term = tabs.cur.view.terminal.term; |
| 629 | + |
599 | 630 | term.writeln(''); |
600 | 631 | term.writeln.green('saving snapshot ...'); |
601 | 632 |
|
|
623 | 654 | complete.load(file,blob); |
624 | 655 |
|
625 | 656 | term.writeln.green('ok.'); |
626 | | - await prompt(); |
| 657 | + await term.prompt(); |
627 | 658 |
|
628 | 659 | }//take-snapsht |
629 | 660 |
|
630 | 661 |
|
631 | 662 | menu_callback['load-snapshot'] = async function(){ |
632 | 663 | console.log('load-snapshot'); |
| 664 | + if(!tabs.cur.view){ |
| 665 | + log.red('no active terminal'); |
| 666 | + return; |
| 667 | + } |
| 668 | + |
| 669 | + var cwd = tabs.cur.view.terminal.shell.cwd; |
| 670 | + |
633 | 671 | if(cwd===null){ |
634 | 672 | term.writeln.red('can only load snapshot relative to workdir'); |
635 | 673 | return; |
|
639 | 677 | return; |
640 | 678 | } |
641 | 679 |
|
| 680 | + var term = tabs.cur.view.terminal.term; |
| 681 | + |
642 | 682 | term.writeln(''); |
643 | 683 | term.writeln.green('loading snapshot ...'); |
644 | 684 |
|
|
669 | 709 | } |
670 | 710 |
|
671 | 711 | term.writeln.green('ok.'); |
672 | | - await prompt(); |
| 712 | + await term.prompt(); |
673 | 713 |
|
674 | 714 | }//restore-snapshot |
675 | 715 |
|
|
876 | 916 | restore : '\x1b[u', |
877 | 917 | hide : '\x1b[?25l', |
878 | 918 | show : '\x1b[?25h', |
879 | | - xy : ()=>{ |
| 919 | + xy : term=>{ |
880 | 920 | // Note: These are 0-indexed, so the top-left is 0,0. |
881 | 921 | // ANSI sequences are usually 1-indexed (1,1). |
882 | 922 | var x = term.buffer.active.cursorX; |
|
1058 | 1098 | }//spawn |
1059 | 1099 |
|
1060 | 1100 |
|
1061 | | - async function prompt(){ |
1062 | | - console.log('prompt'); |
1063 | | - //await input.write('\u0003'); // Sends Ctrl+C to clear any junk |
1064 | | - await input.write('\n'); // Sends Enter to get a clean prompt |
1065 | | - |
1066 | | - }//prompt |
1067 | 1101 |
|
1068 | 1102 |
|
1069 | 1103 | function spinner({term,x,y}){ |
|
0 commit comments