|
291 | 291 | "metadata": {}, |
292 | 292 | "outputs": [], |
293 | 293 | "source": [ |
294 | | - "server.stop()" |
| 294 | + "server.stop()\n", |
| 295 | + "await asyncio.sleep(0.2)" |
295 | 296 | ] |
296 | 297 | }, |
297 | 298 | { |
|
356 | 357 | "metadata": {}, |
357 | 358 | "outputs": [], |
358 | 359 | "source": [ |
359 | | - "server.stop()" |
| 360 | + "server.stop()\n", |
| 361 | + "await asyncio.sleep(0.2)" |
360 | 362 | ] |
361 | 363 | }, |
362 | 364 | { |
|
438 | 440 | "metadata": {}, |
439 | 441 | "outputs": [], |
440 | 442 | "source": [ |
441 | | - "server.stop()" |
| 443 | + "server.stop()\n", |
| 444 | + "await asyncio.sleep(0.2)" |
442 | 445 | ] |
443 | 446 | }, |
444 | 447 | { |
|
486 | 489 | "text/html": [ |
487 | 490 | "<meta charset=\"utf-8\">\n", |
488 | 491 | "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n", |
489 | | - "<script src=\"https://cdn.jsdelivr.net/npm/[email protected].4/dist/htmx.min.js\"></script><script src=\"https://cdn.jsdelivr.net/gh/answerdotai/[email protected]/fasthtml.js\"></script><script src=\"https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js\"></script><script src=\"https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js\"></script><script id=\"_DHTp7k3SRbaeAjPb6FGNOw\">if (window.htmx) htmx.process(document.body)</script>" |
| 492 | + "<script src=\"https://cdn.jsdelivr.net/npm/[email protected].7/dist/htmx.js\"></script><script src=\"https://cdn.jsdelivr.net/gh/answerdotai/[email protected]/fasthtml.js\"></script><script src=\"https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js\"></script><script src=\"https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js\"></script><script id=\"_9KAKqmADTB2z5Tid0GamWQ\">if (window.htmx) htmx.process(document.body)</script>" |
490 | 493 | ], |
491 | 494 | "text/plain": [ |
492 | 495 | "<IPython.core.display.HTML object>" |
|
548 | 551 | { |
549 | 552 | "data": { |
550 | 553 | "text/markdown": [ |
551 | | - "<div id=\"_Uxpzz_26TZeN-kzFA6LeKg\">\n", |
552 | | - " <div id=\"_9s4Pdqx7TxGcbe-7x7MKVQ\"></div>\n", |
553 | | - "<script id=\"_k1VVcEJeS3e1JxBePQpAnw\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
| 554 | + "<div id=\"_g7uKZu_ARsq-n3THwmSmWw\">\n", |
| 555 | + " <div id=\"_0h9Dbvf-R0amBDsWTQQWZg\"></div>\n", |
| 556 | + "<script id=\"_EToaMaxrRDa8MVsJAH_28Q\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
554 | 557 | ], |
555 | 558 | "text/plain": [ |
556 | | - "div(('',),{'id': '_9s4Pdqx7TxGcbe-7x7MKVQ'})" |
| 559 | + "div(('',),{'id': '_0h9Dbvf-R0amBDsWTQQWZg'})" |
557 | 560 | ] |
558 | 561 | }, |
559 | 562 | "execution_count": null, |
|
593 | 596 | { |
594 | 597 | "data": { |
595 | 598 | "text/markdown": [ |
596 | | - "<div id=\"_evO_Voq9Qi_5b-1p0oZS0g\">\n", |
597 | | - " <p hx-get=\"/hoho\" hx-trigger=\"load\" id=\"_gJNOsF9IQdmKesYSdh1qTA\">not loaded</p>\n", |
598 | | - "<script id=\"_ow7qEPILT7OQmBtdrWq9xQ\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
| 599 | + "<div id=\"_XgMVy0kiSoqMdapiYOvKjQ\">\n", |
| 600 | + " <p hx-get=\"/hoho\" hx-trigger=\"load\" id=\"_x4TFzZPvTtWff74RmcHGVQ\">not loaded</p>\n", |
| 601 | + "<script id=\"_bjgxEv1nSTSRImWdUhYk4Q\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
599 | 602 | ], |
600 | 603 | "text/plain": [ |
601 | | - "p(('not loaded',),{'hx-get': <fasthtml.core._mk_locfunc.<locals>._lf object>, 'hx-trigger': 'load', 'id': '_gJNOsF9IQdmKesYSdh1qTA'})" |
| 604 | + "p(('not loaded',),{'hx-get': <fasthtml.core._mk_locfunc.<locals>._lf object>, 'hx-trigger': 'load', 'id': '_x4TFzZPvTtWff74RmcHGVQ'})" |
602 | 605 | ] |
603 | 606 | }, |
604 | 607 | "execution_count": null, |
|
627 | 630 | { |
628 | 631 | "data": { |
629 | 632 | "text/markdown": [ |
630 | | - "<div id=\"_knZLzRRZSa_OAxB-fR4ksQ\">\n", |
631 | | - " <div id=\"_o4AwfFRyQWmVI9xjlOzMHA\"></div>\n", |
632 | | - "<script id=\"_y2CD7-QJS-6s7XTrdTdVZw\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
| 633 | + "<div id=\"_tLh3mf0ZRdecNW_hYz9eYA\">\n", |
| 634 | + " <div id=\"_AsIIqL_PTs_nPASliaNYGA\"></div>\n", |
| 635 | + "<script id=\"_zVvvP66UT_aabITIdgho2g\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
633 | 636 | ], |
634 | 637 | "text/plain": [ |
635 | | - "div(('',),{'id': '_o4AwfFRyQWmVI9xjlOzMHA'})" |
| 638 | + "div(('',),{'id': '_AsIIqL_PTs_nPASliaNYGA'})" |
636 | 639 | ] |
637 | 640 | }, |
638 | 641 | "execution_count": null, |
|
653 | 656 | { |
654 | 657 | "data": { |
655 | 658 | "text/markdown": [ |
656 | | - "<div id=\"_irfLkUpwQxeAxNgcbzO7cA\">\n", |
657 | | - " <p hx-get=\"/foo\" hx-trigger=\"load\" hx-target=\"#_o4AwfFRyQWmVI9xjlOzMHA\" id=\"_RtkS_DHNSNWtnCdfdhuyoA\">hi</p>\n", |
658 | | - "<script id=\"_GaeLaNuzS9ifDsTnO6pHYw\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
| 659 | + "<div id=\"_ofCzAKDvSsWqGb_i-9X95A\">\n", |
| 660 | + " <p hx-get=\"/foo\" hx-trigger=\"load\" hx-target=\"#_AsIIqL_PTs_nPASliaNYGA\" id=\"_LjH2GVPJS_6wMMIQSQpyJA\">hi</p>\n", |
| 661 | + "<script id=\"_tWo0Xu7TSQGyuYfd68xuaA\">if (window.htmx) htmx.process(document.body)</script></div>\n" |
659 | 662 | ], |
660 | 663 | "text/plain": [ |
661 | | - "p(('hi',),{'hx-get': <fasthtml.core._mk_locfunc.<locals>._lf object>, 'hx-trigger': 'load', 'hx-target': '#_o4AwfFRyQWmVI9xjlOzMHA', 'id': '_RtkS_DHNSNWtnCdfdhuyoA'})" |
| 664 | + "p(('hi',),{'hx-get': <fasthtml.core._mk_locfunc.<locals>._lf object>, 'hx-trigger': 'load', 'hx-target': '#_AsIIqL_PTs_nPASliaNYGA', 'id': '_LjH2GVPJS_6wMMIQSQpyJA'})" |
662 | 665 | ] |
663 | 666 | }, |
664 | 667 | "execution_count": null, |
|
679 | 682 | "metadata": {}, |
680 | 683 | "outputs": [], |
681 | 684 | "source": [ |
682 | | - "server.stop()" |
| 685 | + "server.stop()\n", |
| 686 | + "await asyncio.sleep(0.2)" |
683 | 687 | ] |
684 | 688 | }, |
685 | 689 | { |
|
701 | 705 | { |
702 | 706 | "cell_type": "code", |
703 | 707 | "execution_count": null, |
704 | | - "id": "4ef1415d", |
| 708 | + "id": "a448e420", |
| 709 | + "metadata": {}, |
| 710 | + "outputs": [], |
| 711 | + "source": [ |
| 712 | + "#| export\n", |
| 713 | + "from starlette.testclient import TestClient\n", |
| 714 | + "from html import escape" |
| 715 | + ] |
| 716 | + }, |
| 717 | + { |
| 718 | + "cell_type": "code", |
| 719 | + "execution_count": null, |
| 720 | + "id": "89b8984b", |
705 | 721 | "metadata": {}, |
706 | 722 | "outputs": [], |
707 | 723 | "source": [ |
708 | 724 | "#| export\n", |
709 | 725 | "def HTMX(path=\"/\", host='localhost', app=None, port=8000, height=\"auto\", link=False, iframe=True):\n", |
710 | 726 | " \"An iframe which displays the HTMX application in a notebook.\"\n", |
711 | | - " if isinstance(path, (FT,tuple,Safe)):\n", |
712 | | - " assert app, 'Need an app to render a component'\n", |
713 | | - " route = f'/{unqid()}'\n", |
714 | | - " res = path\n", |
715 | | - " app.get(route)(lambda: res)\n", |
716 | | - " path = route\n", |
717 | 727 | " if isinstance(height, int): height = f\"{height}px\"\n", |
718 | 728 | " scr = \"\"\"{\n", |
719 | 729 | " let frame = this;\n", |
|
724 | 734 | " }\"\"\" if height == \"auto\" else \"\"\n", |
725 | 735 | " proto = 'http' if host=='localhost' else 'https'\n", |
726 | 736 | " fullpath = f\"{proto}://{host}:{port}{path}\" if host else path\n", |
| 737 | + " src = f'src=\"{fullpath}\"'\n", |
727 | 738 | " if link: display(HTML(f'<a href=\"{fullpath}\" target=\"_blank\">Open in new tab</a>'))\n", |
| 739 | + " if isinstance(path, (FT,tuple,Safe)):\n", |
| 740 | + " assert app, 'Need an app to render a component'\n", |
| 741 | + " route = f'/{unqid()}'\n", |
| 742 | + " res = path\n", |
| 743 | + " app.get(route)(lambda: res)\n", |
| 744 | + " page = TestClient(app).get(route).text\n", |
| 745 | + " src = f'srcdoc=\"{escape(page)}\"'\n", |
728 | 746 | " if iframe:\n", |
729 | | - " return HTML(f'<iframe src=\"{fullpath}\" style=\"width: 100%; height: {height}; border: none;\" onload=\"{scr}\" ' + \"\"\"allow=\"accelerometer; autoplay; camera; clipboard-read; clipboard-write; display-capture; encrypted-media; fullscreen; gamepad; geolocation; gyroscope; hid; identity-credentials-get; idle-detection; magnetometer; microphone; midi; payment; picture-in-picture; publickey-credentials-get; screen-wake-lock; serial; usb; web-share; xr-spatial-tracking\"></iframe> \"\"\")" |
| 747 | + " return HTML(f'<iframe {src} style=\"width: 100%; height: {height}; border: none;\" onload=\"{scr}\" ' + \"\"\"allow=\"accelerometer; autoplay; camera; clipboard-read; clipboard-write; display-capture; encrypted-media; fullscreen; gamepad; geolocation; gyroscope; hid; identity-credentials-get; idle-detection; magnetometer; microphone; midi; payment; picture-in-picture; publickey-credentials-get; screen-wake-lock; serial; usb; web-share; xr-spatial-tracking\"></iframe> \"\"\")" |
730 | 748 | ] |
731 | 749 | }, |
732 | 750 | { |
|
760 | 778 | { |
761 | 779 | "cell_type": "code", |
762 | 780 | "execution_count": null, |
763 | | - "id": "0063bb43", |
| 781 | + "id": "81669294", |
764 | 782 | "metadata": {}, |
765 | 783 | "outputs": [ |
766 | 784 | { |
767 | 785 | "data": { |
768 | 786 | "text/html": [ |
769 | | - "<iframe src=\"http://localhost:8000\" style=\"width: 100%; height: auto; border: none;\" onload=\"{\n", |
| 787 | + "<iframe src=\"http://localhost:8000/\" style=\"width: 100%; height: auto; border: none;\" onload=\"{\n", |
770 | 788 | " let frame = this;\n", |
771 | 789 | " window.addEventListener('message', function(e) {\n", |
772 | 790 | " if (e.source !== frame.contentWindow) return; // Only proceed if the message is from this iframe\n", |
|
0 commit comments