- Refactor lifespan handling into Lifespan class with
on_eventsupport and addadd_websocket_routemethod (#851)
- Add
_mk_lifespanhelper to wrapon_startup/on_shutdownfor Starlette 1.x compatibility (#850)
- missing
format_datetime(#846)
- Add HostRoute class for host-header based routing with pattern matching (#843)
- Fix
_fix_annomangling barelistannotations (#841), thanks to @jackhogan
- Cache request body if content-type header is not
multipart/form-data(#837), thanks to @curtis-allan
- Make ApiReturn callable without positional args by defaulting norm to None (#833)
- Add
__bool__method to ApiReturn for direct boolean context support (#832)
- Add all HTTP request param handling to websockets too
- Add ApiReturn class for dual browser/API responses in route handlers (#831)
- Add uvicorn kwargs to serve() with @delegates(uvicorn.run) and add colored link output (#830)
- Add async OAuth methods and make OAuth handlers async (#828)
- Add
Stateinjection support for route handlers via type annotation or arg name (#827)
- add optional client arg to HTMX for persistent tests (#824), thanks to @johnowhitaker
- Fix typo: put='hx-post' → put='hx-put' in
_verbsmapping (#821), thanks to @erikgaas - Fix live reload infinite loop on uvicorn >= 0.39 (#818), thanks to @erikgaas
- Line defaults suppressed inheriting of stroke color from parent elements (#804), thanks to @erikgaas
- Add Apple sign in (#813), thanks to @erikgaas
- Adding sign in with apple. It is slightly different because it requires parsing a p8 file and a post request for the redirect if you want name and email.
Adding PyJWT as a req. It's small and fairly ubiquitous, but I'm down to reconsider.
Fun fact apple sign in does not work on localhost which is super annoying, but you can use solveit easily to test it out : )
- [FEATURE] (#793)
- Hi my feature request has to do with how we interact with database tables
Currently although they do implement CRUD I feel very limited in how I can manipulate data and interact with tables. I was wondering if by any chance it's possible to instead just load in databases using pandas and interact with tables as data frames?
This would make it a lot easier and faster to work with data and python users would likely have an easier time developing with pandas dataframes as their API is more familiar and has a ton of features and documentation
- Line defaults suppressed inheriting of stroke color from parent elements (#804), thanks to @erikgaas
- Fixes #757
Line defaults suppressed inheriting of stroke color from parent elements.
- [BUG] SVG Line should not have some default parameters (#757)
- in FastHTML 0.12.21 in file
svg.pytheLineis defined with default values for stroke and stroke_width:
- in FastHTML 0.12.21 in file
def Line(x1, y1, x2=0, y2=0, stroke='black', w=None, stroke_width=1, **kwargs): ...This results that using a line with only coordinates, will also auto generate: stroke="black" stroke-width="1"
This is wrong as it overrides attributes defined in a parent tag like <g>.
Eg. this will fail to achieve the result of having red and thick lines:
G(stroke="red", stroke_width="20" )(
Line(x1=0, y1=0, x2=100, y2=100),
Line(x1=0, y1=0, x2=10, y2=100),
)Instead of desired outputs like:
<line x1="0" y1="0" x2="100" y2="100">will generate lines that have unwanted attributes, that override the parent:
<line x1="0" y1="0" x2="100" y2="100" stroke="black" stroke-width="1">- [BUG] Toasts are not displayed in version 0.12.12 (#709)
- Until now, my application used version 0.12.6, and toasts were displayed at the bottom of the screen. But I updated to the latest version 0.12.12, which supposedly fixed the issue, and to my surprise, the toasts no longer appear. I tested with a simple app, and the toasts show correctly, so I suspect some interference with my code.
I suspect the code in my main.js, which I'm copying below:
// DataTables initialization and event handling for HTMX
// This script initializes DataTables on elements with the class "datatable"
document.addEventListener("DOMContentLoaded", () => {
document.body.addEventListener('htmx:afterSwap', (e) => {
console.log("📦 htmx:afterSwap event received");
const tables = document.querySelectorAll(".datatable");
console.log("🔍 Looking for .datatable...");
tables.forEach(table => {
console.log(`➡️ Init DataTable for: #${table.id}`);
if ($.fn.DataTable.isDataTable(table)) {
console.warn("⚠️ Table already initialized. Destroying existing instance.");
$(table).DataTable().destroy();
const clonedTable = table.cloneNode(true);
table.parentElement.replaceChild(clonedTable, table);
table = clonedTable;
}
const $table = $(table);
// DataTable configuration in Spanish
$table.DataTable({
renderer: 'bootstrap',
language: {
decimal: ",",
processing: "Procesando...",
search: "Buscar:",
lengthMenu: "Mostrar _MENU_",
info: "Mostrando (_START_ a _END_) de _TOTAL_ registros",
infoEmpty: "No hay datos que mostrar.",
infoFiltered: "(filtrado de _MAX_ registros en total)",
loadingRecords: "Cargando...",
zeroRecords: "No se encontraron registros coincidentes",
emptyTable: "No hay datos disponibles en la tabla",
paginate: {
first: "<<",
previous: "<",
next: ">",
last: ">>"
},
aria: {
sortAscending: ": activar para ordenar la columna de manera ascendente",
sortDescending: ": activar para ordenar la columna de manera descendente"
}
},
layout: {
topStart: 'info',
topEnd: {
search: { placeholder: 'Buscar ...' },
},
bottomStart: 'pageLength',
bottomEnd: {
paging: { firstLast: false }
}
},
initComplete: function () {
htmx.process(this.api().table().node());
},
drawCallback: function () {
const rows = this.api().rows({ page: 'current' }).nodes();
rows.each(function (row) {
htmx.process(row); // 🔥 this reactivates the buttons in each visible row
});
},
// dom: 'Bfrtip',
// buttons: [
// {
// extend: 'excelHtml5',
// text: '<i class="bi bi-file-earmark-excel"></i> Export records',
// className: 'btn btn-success btn-sm',
// exportOptions: {
// modifier: {
// page: 'current' // Solo exporta los visibles
// }
// }
// }
// ],
});
// Focus on search field
document.querySelector(`#${table.id}_wrapper .dt-search input`)?.focus();
});
});
});
// Bootstrap 5.3.0 - Collapse
// This script handles the collapse functionality of the Bootstrap navbar
document.addEventListener('DOMContentLoaded', function () {
const navbarCollapse = document.querySelector('.navbar-collapse');
const navLinks = document.querySelectorAll('.navbar-collapse .nav-link, .navbar-collapse .dropdown-item');
navLinks.forEach(link => {
link.addEventListener('click', (e) => {
// Do not close if the click was on the dropdown button.
if (link.getAttribute('data-bs-toggle') === 'dropdown') {
return;
}
// Close the menu if it is expanded.
if (navbarCollapse.classList.contains('show')) {
const bsCollapse = bootstrap.Collapse.getInstance(navbarCollapse);
if (bsCollapse) {
bsCollapse.hide();
}
}
});
});
});This code is meant to interact with Datatable.js and Bootstrap, addressing some unusual behaviors from these two libraries. I suspect the conflict stems from the htmx:afterSwap Listener.
- [BUG] XT undefined in components.py (#672)
Describe the bug
In FastHTML version 0.12.4, there is an error in the components.py file where XT is referenced but not defined. According to the error message, this should be FT based on the library's own suggestion. This appears to be a remnant from a transition from using XT to FT for component types, as mentioned in FastHTML's changelog for version 0.1.10.
The error prevents any application using FastHTML from running, as the import chain fails before any application code can execute. This appears to be a critical issue affecting all users of FastHTML 0.12.4.
Minimal Reproducible Example
from fasthtml.core import fast_app
from fasthtml.xtend import Style
# Initialize the FastHTML app
app, rt = fast_app(
hdrs=[Style("body { font-family: sans-serif; }")]
)
@rt("/")
def get():
return "Hello, World!"
if __name__ == "__main__":
from fasthtml.core import serve
serve()When running the above script, the following error occurs:
Traceback (most recent call last):
File "/path/to/app.py", line 1, in <module>
from fasthtml.core import fast_app
File "/path/to/.venv/lib/python3.11/site-packages/fasthtml/__init__.py", line 2, in <module>
from .core import *
File "/path/to/.venv/lib/python3.11/site-packages/fasthtml/core.py", line 14, in <module>
from .xtend import *
File "/path/to/.venv/lib/python3.11/site-packages/fasthtml/xtend.py", line 15, in <module>
from .components import *
File "/path/to/.venv/lib/python3.11/site-packages/fasthtml/components.py", line 85, in <module>
def fill_form(form:XT, obj)->XT:
^^
NameError: name 'XT' is not defined. Did you mean: 'FT'?
Expected behavior The script should run successfully, starting a FastHTML application without any import errors.
Environment Information Please provide the following version information:
- fasthtml version: 0.12.4
- fastcore version: 1.7.29
- fastlite version: 0.1.2
- Python version: 3.11
- Operating system: Linux 6.11.0-18-generic
- Installation method: pip via uv (
uv pip install python-fasthtml)
Confirmation
- I have read the FAQ (https://docs.fastht.ml/explains/faq.html)
- I have provided a minimal reproducible example
- I have included the versions of fastlite, fastcore, and fasthtml
- I understand that this is a volunteer open source project with no commercial support.
Additional context This appears to be a leftover artifact from the transition mentioned in the changelog for version 0.1.10:
## 0.1.10
### Dependencies
* Update for fastcore XT to FT name change
It seems that in components.py, line 85, the type annotation still uses XT instead of FT, but XT is no longer defined in the namespace.
Looking at the error message, the Python interpreter even suggests the correct fix: "Did you mean: 'FT'?", supporting the hypothesis that this is a missed rename.
The fix would likely involve updating the fill_form function signature in components.py from:
def fill_form(form:XT, obj)->XT:to:
def fill_form(form:FT, obj)->FT:- [BUG] Pico Search component doesn't work as expected (#484)
- Describe the bug Using the Pico Search component does not reproduce UI elements like in teh pico docs https://picocss.com/docs/group#search
Minimal Reproducible Example
from fasthtml.common import *
app, rt = fast_app(
hdrs=(picolink,),
)
def search_form():
return Search(
Input(name="search", type="search", placeholder="search"),
Input(type="submit", value="search"),cls="container")result:
<search class="container">
<input name="search" type="search" placeholder="search">
<input type="submit" value="search">
</search>Visually, the textbox has the correct style but the submit button does not. Expected html per picocss docs
<form role="search">
<input name="search" type="search" placeholder="Search" />
<input type="submit" value="Search" />
</form>Environment Information Please provide the following version information:
- fastlite version: 0.0.11
- fastcore version: 1.7.10
- fasthtml version: 0.6.9
Confirmation Please confirm the following:
- I have read the FAQ (https://docs.fastht.ml/explains/faq.html)
- I have provided a minimal reproducible example
- I have included the versions of fastlite, fastcore, and fasthtml
- I understand that this is a volunteer open source project with no commercial support.
Additional context Add any other context about the problem here.
Screenshots If applicable, add screenshots to help explain your problem.
- [BUG] FastHTML by Example should use a redirect for POST instead of render (#389)
- Describe the bug This is more a "bug"/question about the tutorial. I was following along and noticed when I got to the WebPage->Web App section that things did not work in the browser.
- There seemed to be some loop (that I can not repo) that caused the page to keep adding the last item I submitted
- After you add an items and get back to the home page, if you refresh the page it wants to do another form submission
Feels like both issues are because the POST renders the home page instead of redirecting
@app.post("/")
def add_message(data:str):
messages.append(data)
return home()
vs
@app.post("/")
def add_message(data: str):
messages.append(data)
return RedirectResponse("/", status_code=302)
Expected behavior If I am follow a demo, the demo produces best practice web patterns. I had to go looking through GitHub example repos to even find that RedirectResponse is the right way to do this.
Environment Information Please provide the following version information:
- fastlite version: "0.0.9"
- fastcore version:"1.7.3"
- fasthtml version:"0.5.1"
Confirmation Please confirm the following:
- I have read the FAQ (https://docs.fastht.ml/explains/faq.html)
- I have provided a minimal reproducible example
- I have included the versions of fastlite, fastcore, and fasthtml
- I understand that this is a volunteer open source project with no commercial support.
Additional context Note: problem #1 might have been because I was using an earlier version of fasthtml and recently updated, but #2 to exists still.
- Bump toast z-index to 1090 so toasts appear above modals (#807), thanks to @erikgaas
- Fix StreamingResponse handling in
_resp(#792), thanks to @kenfj - Add
get_client(#800) - Handle str in
show(#796)
- Use updated railway return val (#798)
- Only strip newlines when parsing strings (#797), thanks to @johnowhitaker
- Fix StreamingResponse handling in
_resp(#792), thanks to @kenfj
render_ftkw param (#791)
- Use TestClient to render HTMX components (#790)
- Use https for canonical (#789)
- Add LsJson, robots.txt, and sitemap.xml (#786)
- Add
StaticNoCache(#783)
- fix broken toasts (#782), thanks to @comhar
- Fix Railway CLI command (#781), thanks to @knollfear
- Use kw args for handler params (#771)
- Update htmx and ext versions (#767)
- Support dict params in ws routes (#759)
- Add a small JS snippet to support HTMX requests for toasts
- support x-forwarded-host as source for redirect (#755), thanks to @erikgaas
- Overhaul
adv_appwith more modern idioms (#754)
- Handle empty host in
HTMX()(#752)
- Add
set_lifespan(#744) - Add title= kwarg to
fast_app()constructor (#740), thanks to @mmacpherson - Allow any Mapping children to specify attributes. fix #737 (#738), thanks to @gazpachoking
- Correct treatment of empty/boolean attributes in the html2ft function (#732), thanks to @renatodamas
- html2ft handling empty attribute (#731)
- Toasts inserted at bottom of page (#703)
seededoption forunqid(#741)
- Check for "hx-history-restore-request" for identifying full page request (#733)
- Set
"vary": "HX-Request, HX-History-Restore-Request"(#733) - Allow background tasks in tuple for non-FT responses (#733)
- Pass through kwargs in
show(#723)
- Add
Fragment(#706)
- Background tasks fix+docs (#692), thanks to @pydanny
- Move htmx and ext js to jsdelivr from unpkg (#698)
- Add additional static file types
zip tgz gz csv mp3 wav ogg flac aac doc docx xls xlsx ppt pptx epub mobi bmp tiff avi mov wmv mkv json xml yaml yml rar 7z tar bz2 htm xhtml apk dmg exe msi swf iso json(#678) - Add YouTube embed FastHTML component (#654), thanks to @dgwyer
- Handle type hints on session (#651), thanks to @henriwoodcock
- Add missing monsterui dev dependency (#685), thanks to @pydanny
- Toast bug fixes (#684), thanks to @curtis-allan
- Toast container duplication fix (#657), thanks to @curtis-allan
- Add Google Credentials helpers (#661)
- oauth
login_linkkwargs (#660)
- Toast container duplication fix (#657), thanks to @curtis-allan
- Add JupyUviAsync (#640)
- Handling for query or url params in qp/to (#638), thanks to @Isaac-Flath
- Add pdf extension to static routes (#616), thanks to @pydanny
HTMLtag from fastcore.xml is shadowed (#634)- Exception Handlers Return 200 Status Code Instead of Original Error Code (#633)
- Update fastlite dep to 0.1.1 (#626)
- This version of fastlite uses apsw, instead of the stdlib's sqlite3.
- FT components now stringify as their id if they have one
- Create unique route names for nested functions (#622)
- Pass
id=Truewhen creating a component to get an auto unique id (#622) - Add
+to FT components (#622)
- Update sqlite-minutils to apswutils in fasthtml.common
- Adds
body_wrapbits to APIRouter (#612), thanks to @ohmeow - Fix/add default title (#604), thanks to @banditburai
- upgrade to [email protected], [email protected], etc to latest version (#603), thanks to @pratapvardhan
- Optimise highlightjs usage (#602), thanks to @curtis-allan
- Use explicit version numbers in cdn links (#599), thanks to @curtis-allan
- Made route functions accesible from an instance of APIRouter as well … (#598), thanks to @ohmeow
- Improved APIRouter to allow for prefixs and discrovery (#594), thanks to @ohmeow
- The OAuth API is now simplified to only require
chk_auth, and no longer useslogin.chk_authshould either returnFalse(meaning not authenticated) or aRedirectResponse. After authentication, theauthparameter will be provided to handlers, which will have the oauth ID.
- Simplify OAuth API (#580)
- Include session param in websockets handlers (#563), thanks to @callmephilip
- Add path to jupy HTMX (#503)
- Add oauth
error_path(#570), thanks to @comhar - Add
qpto create routes with query params (#560) render_rt()function enables automatic rendering of FT components in notebook (#558)- In
HTMX()heightis now fixed if passed, andFTcomponents can be rendered instead of paths (#557)
- Rename
.rtmethod to.to(#539)
- Support json request key parameters (#555)
- Add
fh_cfg["auto_name"]option (#548) - Allow generators etc as responses (#547)
- Add experimental
body_wrapattr toFastHTML(#546) - Auto-add headers to notebook in
FastHTML(#544) - Allow FT components to be used directly as id and
hx_targetvalues #544) - Add
hostparam to JupyUvi, defaulting to "0.0.0.0" (#543) - In-jupyter HTMX web apps! (#541)
- Add HTTP verb methods to
APIRouter(#538) - Support
WebSockettype annotation inapp.wshandlers (#538)
- Add
nb_hdrstofast_app(#551), thanks to @Isaac-Flath
jupy_appandFastJupyremoved; their functionality is now built intofast_appandFastHTMLand enabled automatically in notebooksRouteXandRouterXremoved; useFastHTML.add_routeinstead
- Add
APIRouter(#535)
ws_hdrandcts_hdrboth removed fromFastHTMLandfast_app; replaced withexts, which takes a list of extension names (e.g.exts='ws')
- Unified syntax for common HTMX extensions (#533)
- Allow toasts to work with FtResponse (#526), thanks to @tomasz-pankowski
- Replace experimental
Pusherwith experimentalsetup_wsandws_client(#522) - Add experimental
with_sid()(#521) - Ensure FT children are tuples
- Adding mermaidJS for mermaid graphs (#518), thanks to @ImtiazKhanDS
- Uploading a single file on a multiple file field requires try/except (#513)
- Add
scopeparam (#519) - Allow
FastHTML.wsto be used without a function (#519) - Allow setting of xmlns in
Svg(#519)
- Add missing
unqidimport (#519)
- Add
pusher()for real time DOM updates; addfh_cfg.auto_idto automatically add unique IDs (#517) - Support background tasks (#512)
- Allows for passing route functions (#511), thanks to @Isaac-Flath
- Add path arg to HTMX (#504), thanks to @Isaac-Flath
- Multi file upload does not work (#509)
- Document usage with Jupyter (#469)
- Add
oauth.redir_urlfunction (#476)
- Allow for handler names with same name as an http verb, even if path not provided (#459)
- Support explicit iframe height in Jupyter HTMX (#458), thanks to @callmephilip
- Improve type annotations for element attributes (#453), thanks to @callmephilip
- Make compatible w/ ddtrace (#452), thanks to @derekgliwa
- Remove IPython dep (#456)
- Add
def_hdrs(#446)
- Jupyter compatibility (#445)
- Redefining a route overwrites existing definition (e.g for use in notebooks) (#444)
- [BUG] d argument is not passed in Path function for SVGs (#437)
- Pass query params to custom class annotated args (#439)
svg.Pathnot passingdparam (#438)
- Include both
m(me) andp(prev) inOnandPrevhandlers, and run after DOM ready (#429)
proc_htmxnot exported correctly (#434)
datehas been renamed toparsed_date
- Handle non-list/tuple
hdrsandftrsinFastHTML()(#426) - Handle automatic
datetime.dateform field conversion (#415)
- Make sure only the selected radio button in a radio group is checked during
form_fill(#424), thanks to @rbavery - All radio buttons in a radio group are checked during
fill_form(#423) - receiving a list[str] as a parameter doesn't work with get request (#422)
- Multipart error when submitting with empty form-data (#405)
- Add
FtResponse(#425) - Add
sid_scr(#425) - Scope
Onselector top(#414) - Store
p=me()beforeOnhandler (#413) - Convert
dictchildren inft_htmxandft_hxto kwargs (#412) - Add reload on CSS and JS file changes (#401)
static_pathignored infast_app(#410)
- Greatly improved SVG support (#409)
- Add SVG HTMX helpers:
svg_sel,SvgOob, andSvgInb(#408) - Add
ClientandNbsp(#403) - Add
Redirect()and handle magic__response__method (#400) - Add
HtmxResponseHeaders(#399) - Add
sessiontoOAuth.chk_auth(#394) - Add
static_routesandstatic_route_extsmethods toFastHTML(#387)
- toasts do not show if response empty or tuple (#386)
- toasts.py not updated for router refactor (#385)
- Add
sse_message,EventStream, andsignal_shutdown(#384)
- Make hdrs, ftrs, htmlkw, bodykw, etc available to
RouterXandRouteXvia._app(#381) - Add
OAuthclass (#381)- Move redirect url into methods for oauth
- Add options to change default static media directory (#373), thanks to @coreman14
- Add
PicoBusy()function to display loading spinner during html load (#372) - Add
HtmxOn()to allow adding htmx event listeners more easily (#371) - Set toasts to only work with FT responses (#368), thanks to @pydanny
- Routing subapp improvements (#365), thanks to @Isaac-Flath
- Add all HTMX attrs to component signatures (#363)
- Add markdown version of all docs (#361)
- add easy to use chunked transfer extension header (#346), thanks to @fabge
- Set 404 exception handling to give "404 Not Found" message (#335), thanks to @Isaac-Flath
- [BUG] Toasts don't show after redirect (#358)
- railway deployment not checking deployed projects correctly (#340)
- Socials tag only appears in head tag when added via FastHTML.hdrs (#324)
- Replace
__call__withrtin handler functions (#334) - Add
flat_tupleand use it to allow nested tuples in route responses - Add
bodyparameter for decoded body - Move pico-specific components to separate module (#327)
- Add "get" and "post" as default methods on routes (#317)
- Support Reverse URL lookups by exposing
url_for(#189)
- Fastlite 0.0.9 dep
- Rename
CheckboxtoCheckboxX(#314)- CheckboxX also adds a hidden field before the checkbox
- Automatically choose last field in form data if list provided by non-list parameter
- post release fix for
fill_form(#309)
__init.py__now only containsfasthtml.core
- Fastcore 1.7 compatibility (#307)
- Add
fasthtml.basicsfor importing the main fasthtml modules
- katex.js missing (#305)
- postrelease fix markdown js (#290)
- Support
dictvalue inhx_vals(#288) - Add
sess_clsparam toFastHTML(#284) - Make
indexa special handler name for path "/" get request (#274) - Use
run_in_threadpoolfor non-async handlers (#270) - Enhance LaTeX rendering in Markdown with support for environments (#269), thanks to @rian-dolphin
- Duplicate parameters in components.pyi (#255)
- Experimental new named-based HTMX routing system (#267)
urifunction to constructurl_forpath params- patch
HTTPConnection.url_path_for - replace HTTP verb FT attr names with
hx-prefixed versions, and look up values in route names (withlinkused forhrefattrs) - Default route paths to
/{func.__name__} - Default route method to
postif func name isn't an http verb - Support skipping
()in route decorators
- Default route name to function name if method provided (#263)
surrealandhtmxbool params forFastHTMLandfast_app(#258)
- generic list annotated params double-wrapped (#253)
- Add
Prev()(#253) ft_cfgconfig defaults (#251)- Make
fill_formset selected option (#185), thanks to @ostwilkens
- Do not make session vars available as direct params (#237)
- Add surreal.js helpers
Me,Any,On(#238) - Add support for application/json in POST requests (#234), thanks to @khoaHyh
- Wrap Starlette's session in an AttrDict (#213), thanks to @jbellis
- Handle mismatches between existing db and schema (#202), thanks to @ncoop57
- Raise warning if type is not passed (#195)
- Signature may not resolve types from str (#198)
- Add
attrs1stformatting to html2ft (#193), thanks to @AndrewRPerkins
- Check for railway app version (#192)
- Update
flat_xtto handle single FT item (#190) - Support FT in HTTPException handling (#175)
- Add
pep8_app.py(#163) - Add support for LaTeX formula rendering when rendering markdown (#158), thanks to @yym68686
- Add to request:
req.hdrs,req.ftrs,req.htmlkw,req.bodykw(#152) - Add htmlkw to
fast_app(#145), thanks to @ranzuh - Add
Formfor multipart form data; initial poetry compatibility forserve(#137) - changes toast names to avoid conflict with bootstrap (#133), thanks to @vacmar01
- Automatically move ('title','meta','link','style','base') into head (#122)
- Allow for
AnyorFTas return type of routes (#112)
- railway deploy did not connect mount point on first use (#89)
- Initial launch version
- Rename
run_uvtoserve(#84)
- Update for fastcore XT to FT name change
- Remove comments in html2xt (#76)
- Handle relative paths in
Social(#70) - Add
ftrsfor scripts etc at end of body element (#62) - Updated html2xt to use unpacked dicts when attr keys are not valid python names (#57), thanks to @matdmiller
- fix social relative urls (#77)
- Add
indenttohtml2xt(#53) - New
fasthtml.ftnamespace for components (#50) - Add
bodykwinfast_app(#49)
ScriptXandStyleXfor templated generation from external files (#42)
fast_appreturnsapp.routeas well as app (#38)
- Add
fasthtml.toasts(#35) - 'Afterware' support
- Add
injectsto request - Basic websocket support (#29)
- Support
metatags in returned tuple (#28) - Support npm provider in jsdelivr (#27)
Styledoes not accept multiple positional args correctly (#34)
- Add
railway_deploy(#26)
- Add
run_uv()(#25) - New demo app (#25)
- Add
Containercomponent (#24) - Add all HTML elements (#22)
- Add svg.py (#21)
- Add
Titled(#18) - Disable PicoCSS font scaling
- Use constant time string comparison for password checking, h/t José Valim (#17)
- Add surreal js and scope scripts to default headers, and add
default_hdrsbool to allow removing default headers (#16) - Add xtend.py
ScriptandStylethat do not needNotStr(#15) - Add
jsd(#14) - Handle lists of
hdrs(#14) - Autogen HTML wrapper for non-htmx partials (#13)
html2txtonly parses first partial (#12)
- Add
html2xt(#11)
- use
sqlite_minutilsin all.py (#10)
- sortable js support (#7)
- Add
MarkdownJSand support textareas (#6) - Handle multi-value form data correctly
- fix body arg parsing (#2)
- Init release

