Here is a nice way to open a modal in FastHTML and Hyperscript
There is absolutely no Javascript
from fasthtml.common import * app, rt = fast_app( hdrs=( StyleX("./static/styledev.css"), Script(src="https://unpkg.com/hyperscript.org@0.9.12"), ), live=True, ) @app.get("/modal") def modal(): return Div( Div(_="on click trigger closeModal", cls="modal-underlay"), Div( H1("Modal Dialog"), P("This is the modal content"), P("You can put anything here, like text, or a form, or an image."), Button("Close", _="on click trigger closeModal", cls="btn danger"), cls="modal-content", ), id="modal", _="on closeModal add .closing then wait for animationend then remove me", ) @app.get("/") def home(): return Div( H2("Modal with FastHTML and Hyperscript", style="text-align:center"), Button( "Open a Modal", hx_get="/modal", hx_target="body", hx_swap="beforeend", cls="btn primary", ), ) serve(port=3333) The CSS part :
/***** MODAL DIALOG ****/ #modal { /* Underlay covers entire screen. */ position: fixed; top:0px; bottom: 0px; left:0px; right:0px; background-color:rgba(0,0,0,0.5); z-index:1000; /* Flexbox centers the .modal-content vertically and horizontally */ display:flex; flex-direction:column; align-items:center; /* Animate when opening */ animation-name: fadeIn; animation-duration:150ms; animation-timing-function: ease; } #modal > .modal-underlay { /* underlay takes up the entire viewport. This is only required if you want to click to dismiss the popup */ position: absolute; z-index: -1; top:0px; bottom:0px; left: 0px; right: 0px; } #modal > .modal-content { /* Position visible dialog near the top of the window */ margin-top:10vh; /* Sizing for visible dialog */ width:80%; max-width:600px; /* Display properties for visible dialog*/ border:solid 1px #999; border-radius:8px; box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.3); background-color:white; padding:20px; /* Animate when opening */ animation-name:zoomIn; animation-duration:150ms; animation-timing-function: ease; } #modal.closing { /* Animate when closing */ animation-name: fadeOut; animation-duration:150ms; animation-timing-function: ease; } #modal.closing > .modal-content { /* Animate when closing */ animation-name: zoomOut; animation-duration:150ms; animation-timing-function: ease; } @keyframes fadeIn { 0% {opacity: 0;} 100% {opacity: 1;} } @keyframes fadeOut { 0% {opacity: 1;} 100% {opacity: 0;} } @keyframes zoomIn { 0% {transform: scale(0.9);} 100% {transform: scale(1);} } @keyframes zoomOut { 0% {transform: scale(1);} 100% {transform: scale(0.9);} }
Top comments (0)