squint

borkdude 2025-10-22T08:21:10.413179Z

https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvaWRpb21vcnBoIiA6cmVmZXIgW0lkaW9tb3JwaF0gOnJlbmFtZSB7SWRpb21vcnBoIEl9XSkKCihkZWYgc2l6ZSAyMCkgOzsgZ3JpZCBzaXplICgyMHgyMCkKKGRlZiBjZWxsIDEwKSA7OyBlYWNoIGNlbGwgPSAxMHB4CgooZGVmb25jZSBzdGF0ZQogIChhdG9tIHs6c25ha2UgW1s1IDEwXSBbNCAxMF0gWzMgMTBdXSA7IGluaXRpYWwgc25ha2UgYm9keQogICAgICAgICA6ZGlyIFsxIDBdIDsgbW92aW5nIHJpZ2h0CiAgICAgICAgIDpmb29kIFsxNSAxMF0gOyBpbml0aWFsIGZvb2QKICAgICAgICAgOmFsaXZlPyB0cnVlfSkpCgooZGVmbiByYW5kb20tZm9vZCBbXQogIFsocmFuZC1pbnQgc2l6ZSkgKHJhbmQtaW50IHNpemUpXSkKCihkZWZuIG1vdmUtc25ha2UgW10KICAoc3dhcCEgc3RhdGUKICAgIChmbiBbezprZXlzIFtzbmFrZSBkaXIgZm9vZCBhbGl2ZT9dIDphcyBzdH1dCiAgICAgIChpZiAobm90IGFsaXZlPykKICAgICAgICAgICAgIHN0CiAgICAgICAgICAgICAobGV0IFtoZWFkICh2ZWMgWygrIChudGggKGZpcnN0IHNuYWtlKSAwKSAobnRoIGRpciAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgKG50aCAoZmlyc3Qgc25ha2UpIDEpIChudGggZGlyIDEpKV0pCiAgICAgICAgICAgICAgICAgICBhdGU%2FICg9IGhlYWQgZm9vZCkKICAgICAgICAgICAgICAgICAgIG5ldy1zbmFrZSAodmVjIChjb25zIGhlYWQgKGlmIGF0ZT8gc25ha2UgKGJ1dGxhc3Qgc25ha2UpKSkpCiAgICAgICAgICAgICAgICAgICB4IChudGggaGVhZCAwKQogICAgICAgICAgICAgICAgICAgeSAobnRoIGhlYWQgMSkKICAgICAgICAgICAgICAgICAgIGhpdC13YWxsPyAob3IgKDwgeCAwKSAoPCB5IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPj0geCBzaXplKSAoPj0geSBzaXplKSkKICAgICAgICAgICAgICAgICAgIGhpdC1zZWxmPyAoc29tZSAjKD0gaGVhZCAlKSAocmVzdCBuZXctc25ha2UpKV0KICAgICAgICAgICAgICAgKGNvbmQKICAgICAgICAgICAgICAgICBoaXQtd2FsbD8gKGFzc29jIHN0IDphbGl2ZT8gZmFsc2UpCiAgICAgICAgICAgICAgICAgaGl0LXNlbGY%2FIChhc3NvYyBzdCA6YWxpdmU%2FIGZhbHNlKQogICAgICAgICAgICAgICAgIGF0ZT8gKGFzc29jIHN0IDpzbmFrZSBuZXctc25ha2UgOmZvb2QgKHJhbmRvbS1mb29kKSkKICAgICAgICAgICAgICAgICA6ZWxzZSAoYXNzb2Mgc3QgOnNuYWtlIG5ldy1zbmFrZSkpKSkpKSkKCjs7IFRpbWVyIGxvb3AKKGpzL3NldEludGVydmFsIG1vdmUtc25ha2UgMjAwKQoKOzsgS2V5Ym9hcmQgY29udHJvbHMKKC5hZGRFdmVudExpc3RlbmVyIGpzL3dpbmRvdyAia2V5ZG93biIKICAoZm4gW2VdCiAgICAobGV0IFtrZXkgKC4ta2V5IGUpXQogICAgICAgKHN3YXAhIHN0YXRlIHVwZGF0ZSA6ZGlyCiAgICAgICAgIChmbiBbZGlyXQogICAgICAgICAgIChjYXNlIGtleQogICAgICAgICAgICAgICAgICAiQXJyb3dVcCIgKGlmICg9IGRpciBbMCAxXSkgZGlyIFswIC0xXSkKICAgICAgICAgICAgICAgICAgIkFycm93RG93biIgKGlmICg9IGRpciBbMCAtMV0pIGRpciBbMCAxXSkKICAgICAgICAgICAgICAgICAgIkFycm93TGVmdCIgKGlmICg9IGRpciBbMSAwXSkgZGlyIFstMSAwXSkKICAgICAgICAgICAgICAgICAgIkFycm93UmlnaHQiIChpZiAoPSBkaXIgWy0xIDBdKSBkaXIgWzEgMF0pCiAgICAgICAgICAgICAgICAgIGRpcikpKSkpKQoKKGRlZm4gY2VsbC1yZWN0IFtbeCB5XSBjb2xvcl0KICAjaHRtbAogIFs6cmVjdCB7OnggKCogeCBjZWxsKSA6eSAoKiB5IGNlbGwpCiAgICAgICAgICA6d2lkdGggY2VsbCA6aGVpZ2h0IGNlbGwKICAgICAgICAgIDpmaWxsIGNvbG9yfV0pCgooZGVmbiBnYW1lLWJvYXJkIFtdCiAgKGxldCBbezprZXlzIFtzbmFrZSBmb29kIGFsaXZlP119IEBzdGF0ZV0KICAgICNodG1sCiAgICBbOnN2ZyB7OndpZHRoICgqIHNpemUgY2VsbCkgOmhlaWdodCAoKiBzaXplIGNlbGwpCiAgICAgICAgICAgOnN0eWxlIHs6Ym9yZGVyICIxcHggc29saWQgYmxhY2siCiAgICAgICAgICAgICAgICAgICA6YmFja2dyb3VuZCAiI2VlZiJ9fQogICAgIDs7IHNuYWtlCiAgICAgKGZvciBbcGFydCBzbmFrZV0KICAgICAgIChjZWxsLXJlY3QgcGFydCAiZ3JlZW4iKSkKICAgICA7OyBmb29kCiAgICAgKGNlbGwtcmVjdCBmb29kICJyZWQiKQogICAgIDs7IGdhbWUgb3ZlciBvdmVybGF5CiAgICAgKHdoZW4gKG5vdCBhbGl2ZT8pCiAgICAgICAjaHRtbAogICAgICAgWzp0ZXh0IHs6eCA1MCA6eSAxMDAgOmZvbnQtc2l6ZSAyMCA6ZmlsbCAiYmxhY2sifSAiR2FtZSBPdmVyISJdKV0pKQoKKGRlZiByb290IChvcgogICAgICAgICAgICAoanMvZG9jdW1lbnQucXVlcnlTZWxlY3RvciAiI2NvbnRhaW5lciIpCiAgICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgIChzZXQhIC1pZCAiY29udGFpbmVyIikKICAgICAgICAgICAgICAoanMvZG9jdW1lbnQuYm9keS5wcmVwZW5kKSkpKQoKKGRlZm4gbW9ycGggW10KICAoSS9tb3JwaCByb290IChzdHIgKGdhbWUtYm9hcmQpKQogICAgezptb3JwaFN0eWxlIDppbm5lckhUTUx9KSkKCihhZGQtd2F0Y2ggc3RhdGUgOnN0YXRlIChmbiBbXyBfIF8gX10KICAgICAgICAgICAgICAgICAgICAgICAgICAobW9ycGgpKSkKCihtb3JwaCk%3D Only a few changes needed :) Now hosted here: https://www.michielborkent.nl/squint-snake/ According to browser: 7.2kb gzip

πŸ—œοΈ 1
Chris McCormick 2025-10-22T11:19:20.253509Z

(add-watch state :state (fn [_ _ _ _]
                          (morph)))
This is cool πŸ‘

πŸ˜† 1
borkdude 2025-10-22T12:10:39.553669Z

Hmm, it seems for this game I don't even need idiomorph, just this works equally well:

(defn morph []
  (set! (js/document.querySelector "#app") -innerHTML (str (game))))
:-s

😁 1
borkdude 2025-10-22T12:14:30.121009Z

now 5.13 kB

borkdude 2025-10-22T12:35:52.640019Z

even with a grid size of 200x200 I don't see any difference

Chris McCormick 2025-10-22T12:37:17.770559Z

I think Mithril might work like this - just blatting the new dom without any diffing.

borkdude 2025-10-22T12:39:24.102149Z

it seems mithril does have a vdom

borkdude 2025-10-22T12:39:37.511169Z

maybe we've been misled and we don't need vdoms ;)

Chris McCormick 2025-10-22T12:43:27.999659Z

ha ha yes maybe

borkdude 2025-10-22T12:50:50.643179Z

ah yes, here is where idiomorph comes in. this won't work for example: https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvaWRpb21vcnBoIiA6cmVmZXIgW0lkaW9tb3JwaF0gOnJlbmFtZSB7SWRpb21vcnBoIEl9XSkKCihkZWYgcm9vdCAob3IKICAgICAgICAgICAgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNjb250YWluZXIiKQogICAgICAgICAgICAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAoc2V0ISAtaWQgImNvbnRhaW5lciIpCiAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKSkKCihkZWYgc3RhdGUgKGF0b20gezpjb3VudGVyIDAKICAgICAgICAgICAgICAgICAgOmlucHV0ICJIZWxsbyJ9KSkKCihkZWZuIG15LWNvbXBvbmVudCBbXQogICNodG1sIFs6PD4KICAgICAgICAgWzpkaXYgIkNvdW50OiAiICg6Y291bnRlciBAc3RhdGUpXQogICAgICAgICBbOmRpdiBbOmJ1dHRvbiB7OmlkIDpidG59CiAgICAgICAgICAgICAgICAiUGxlYXNlIGNsaWNrIG1lIl1dCiAgICAgICAgIFs6aW5wdXQgezppZCA6aW4gOnR5cGUgOnRleHQgOnZhbHVlICg6aW5wdXQgQHN0YXRlKX1dCiAgICAgICAgIFs6cHJlICg6aW5wdXQgQHN0YXRlKV1dKQoKKGRlZm4gbW9ycGggW10KICAoc2V0ISByb290IC1pbm5lckhUTUwgKG15LWNvbXBvbmVudCkpCiAgI18oSS9tb3JwaCByb290IChzdHIgKG15LWNvbXBvbmVudCkpCiAgICB7Om1vcnBoU3R5bGUgOmlubmVySFRNTH0pKQoKKGFkZC13YXRjaCBzdGF0ZSA6c3RhdGUgKGZuIFtfIF8gXyBfXQogICAgICAgICAgICAgICAgICAgICAgICAgIChtb3JwaCkpKQoKKG1vcnBoKQoKKC5hZGRFdmVudExpc3RlbmVyIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjYnRuIikgOmNsaWNrCiAgKGZuIFtdCiAgICAoc3dhcCEgc3RhdGUgdXBkYXRlIDpjb3VudGVyIGluYykpKQoKKC5hZGRFdmVudExpc3RlbmVyIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjaW4iKSA6aW5wdXQKICAoZm4gW2V2XQogICAgKHN3YXAhIHN0YXRlIGFzc29jIDppbnB1dCAoLT4gZXYgOnRhcmdldCA6dmFsdWUpKSkp

borkdude 2025-10-22T12:51:10.524369Z

so input state etc won't work well with innerHTML

πŸ‘ 1
borkdude 2025-10-22T12:51:56.443699Z

for something where you repaint the whole scene every 200ms it's fine to use innerHTML (like the snake game)

borkdude 2025-10-22T12:52:07.364659Z

but for crud apps idiomorph is better

borkdude 2025-10-22T13:14:28.324409Z

This example illustrates why you need idiomorph or react or eucalypt: https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvaWRpb21vcnBoIiA6cmVmZXIgW0lkaW9tb3JwaF1dKQoKKGRlZiByb290IChvcgogICAgICAgICAgICAoanMvZG9jdW1lbnQucXVlcnlTZWxlY3RvciAiI2NvbnRhaW5lciIpCiAgICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgIChzZXQhIC1pZCAiY29udGFpbmVyIikKICAgICAgICAgICAgICAoanMvZG9jdW1lbnQuYm9keS5wcmVwZW5kKSkpKQoKKGRlZiBzdGF0ZSAoYXRvbSB7OmNvdW50ZXIgMAogICAgICAgICAgICAgICAgICA6aW5wdXQgIkhlbGxvIn0pKQoKKGRlZm4gbXktY29tcG9uZW50IFtdCiAgI2h0bWwgWzo8PgogICAgICAgICBbOnByZSAocHItc3RyIEBzdGF0ZSldCiAgICAgICAgIFs6ZGl2ICJDb3VudDogIiAoOmNvdW50ZXIgQHN0YXRlKV0KICAgICAgICAgWzpkaXYgWzpidXR0b24gezppZCA6YnRufQogICAgICAgICAgICAgICAgIlBsZWFzZSBjbGljayBtZSJdXQogICAgICAgICBbOmlucHV0IHs6aWQgOmluIDp0eXBlIDp0ZXh0IDp2YWx1ZSAoOmlucHV0IEBzdGF0ZSl9XQogICAgICAgICBbOnByZSAoOmlucHV0IEBzdGF0ZSldXSkKCihkZWZuIHJlc3RvcmUtZm9jdXMgW2h0bWxdCiAgKGxldCBbYWN0aXZlLWVsICguLWFjdGl2ZUVsZW1lbnQganMvZG9jdW1lbnQpCiAgICAgICAgYWN0aXZlLWlkICguLWlkIGFjdGl2ZS1lbCkKICAgICAgICBjYXJldCAod2hlbiBhY3RpdmUtZWwgKC4tc2VsZWN0aW9uU3RhcnQgYWN0aXZlLWVsKSldCiAgICA7OyB1cGRhdGUgRE9NCiAgICAoc2V0ISAoLi1pbm5lckhUTUwgcm9vdCkgaHRtbCkKICAgIDs7IHJlc3RvcmUgZm9jdXMgYW5kIGNhcmV0CiAgICAod2hlbiBhY3RpdmUtaWQKICAgICAgKHdoZW4tbGV0IFtlbCAoLmdldEVsZW1lbnRCeUlkIGpzL2RvY3VtZW50IGFjdGl2ZS1pZCldCiAgICAgICAgKC5mb2N1cyBlbCkKICAgICAgICAod2hlbiBjYXJldAogICAgICAgICAgKHRyeQogICAgICAgICAgICAoLnNldFNlbGVjdGlvblJhbmdlIGVsIGNhcmV0IGNhcmV0KQogICAgICAgICAgICAoY2F0Y2ggOmRlZmF1bHQgXyBuaWwpKSkpKSkpCgooZGVmbiBtb3JwaCBbXQogIChyZXN0b3JlLWZvY3VzIChteS1jb21wb25lbnQpKQogIAogICNfKElkaW9tb3JwaC5tb3JwaCByb290IChzdHIgKG15LWNvbXBvbmVudCkpCiAgICAgIHs6bW9ycGhTdHlsZSA6aW5uZXJIVE1MfSkpCgooYWRkLXdhdGNoIHN0YXRlIDpzdGF0ZSAoZm4gW18gXyBfIF9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vcnBoKSkpCgoobW9ycGgpCgooLmFkZEV2ZW50TGlzdGVuZXIgcm9vdCAiY2xpY2siCiAgKGZuIFtlXQogICAgKHdoZW4gKD0gImJ0biIgKC4taWQgKC4tdGFyZ2V0IGUpKSkKICAgICAgKHN3YXAhIHN0YXRlIHVwZGF0ZSA6Y291bnRlciBpbmMpKSkpCgooLmFkZEV2ZW50TGlzdGVuZXIgcm9vdCAiaW5wdXQiCiAgKGZuIFtlXQogICAgKHdoZW4gKD0gImluIiAoLi1pZCAoLi10YXJnZXQgZSkpKQogICAgICAoc3dhcCEgc3RhdGUgYXNzb2MgOmlucHV0ICgtPiBlIDp0YXJnZXQgOnZhbHVlKSkpKSk%3D

borkdude 2025-10-22T13:14:45.748169Z

when you type in the input field, then you see it's constantly refocussing

Chris McCormick 2025-10-22T13:21:35.911789Z

Yep - focus tracking

borkdude 2025-10-22T13:21:36.387939Z

what is still annoying with the idiomorph + squint aproach is that on-click etc don't work so you have to define those out of band

Chris McCormick 2025-10-22T13:22:13.244309Z

When the dom diffing is done correctly then the input doesn't get unmounted at all so the focus remains.

borkdude 2025-10-22T13:25:47.952919Z

This does work with idiomorph:

:onClick "globalThis.user.fuck()"
but I don't know how to express this in squint...

borkdude 2025-10-22T13:26:30.438809Z

writing :onClick (fuck) won't work since that will just evaluate fuck and then insert the result of that

Chris McCormick 2025-10-22T13:28:52.852949Z

:onClick #(fuck) doesn't work?

borkdude 2025-10-22T13:29:17.426479Z

no, that's now how browser :onClick attributes work I think?

borkdude 2025-10-22T13:29:25.369149Z

it expects a string of JS I think

Chris McCormick 2025-10-22T13:30:03.636809Z

Depends what idiomorph is doing - you can set .onclick to a function on an element, not a string.

borkdude 2025-10-22T13:30:49.411509Z

oh really!

borkdude 2025-10-22T13:31:33.377549Z

ah but here I'm fucked by the html tag creating a string

borkdude 2025-10-22T13:31:49.834099Z

so maybe I need to introduce #dom ;)

Chris McCormick 2025-10-22T13:32:33.720399Z

Ah yep I see so it's stringifying the cljs

Chris McCormick 2025-10-22T13:33:17.973699Z

If you introduce dom (which would be like a recursive createElement?)I could re-use it in Eucalpyt.

Chris McCormick 2025-10-22T13:33:25.095709Z

If it could be used runtime that is.

Chris McCormick 2025-10-22T13:33:54.391869Z

Oh it would have to have a runtime counterpart wouldn't it because you can't have dom elements at compile time.

borkdude 2025-10-22T13:38:14.055589Z

I think for dom it doesn't make sense to have a compile time thing, since you can't have compile time dom nodes

πŸ‘ 1
borkdude 2025-10-22T13:49:47.690979Z

how do I create a dom node with onclick where it's a function. setAttribute assumes text

Chris McCormick 2025-10-22T13:51:50.572909Z

(aset el "onclick" (fn [ev] ...)) should work?

borkdude 2025-10-22T13:53:15.774419Z

The dom nodes are rendering now in this example, but the event handler is not firing: https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvaWRpb21vcnBoIiA6cmVmZXIgW0lkaW9tb3JwaF0gOnJlbmFtZSB7SWRpb21vcnBoIEl9XSkKCihkZWZuIGNyZWF0ZS1ub2RlIFtoaWNjdXBdCiAgKGpzL2NvbnNvbGUubG9nIGhpY2N1cCkKICAoY29uZAogICAgOzsgVGV4dCBub2RlCiAgICAob3IKICAgICAgKG51bWJlcj8gaGljY3VwKQogICAgICAoc3RyaW5nPyBoaWNjdXApKSAoanMvZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUgaGljY3VwKQogICAgCiAgICA7OyBWZWN0b3IgPSBbdGFnIGF0dHJzICYgY2hpbGRyZW5dCiAgICAodmVjdG9yPyBoaWNjdXApCiAgICAobGV0IFtbdGFnIGF0dHJzICYgY2hpbGRyZW5dIGhpY2N1cAogICAgICAgICAgXyAoanMvY29uc29sZS5sb2cgOnRhZyB0YWcgOmNoaWxkcmVuIGNoaWxkcmVuKQogICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXSAoaWYgKG1hcD8gYXR0cnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwgKGNvbnMgYXR0cnMgY2hpbGRyZW4pXSkKICAgICAgICAgIF8gKGpzL2NvbnNvbGUubG9nIDpjaGlsZHJlbm5uIGNoaWxkcmVuKQogICAgICAgICAgZWwgKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgdGFnKV0KICAgICAgKGpzL2NvbnNvbGUubG9nIDpkdWR1dXVkZSkKICAgICAgOzsgU2V0IGF0dHJpYnV0ZXMKICAgICAgKGRvc2VxIFtbayB2XSAob3IgYXR0cnMge30pXQogICAgICAgIChjb25kCiAgICAgICAgICA7OyBzcGVjaWFsIGNhc2U6IGZ1bmN0aW9ucyBsaWtlIDpvbmNsaWNrCiAgICAgICAgICAoZm4%2FIHYpIChhc2V0IGVsIGsgdikKICAgICAgICAgIDs7IHJlZ3VsYXIgYXR0cmlidXRlOiBjb252ZXJ0IHRvIHN0cmluZwogICAgICAgICAgOmVsc2UgKC5zZXRBdHRyaWJ1dGUgZWwgayB2KSkpCiAgICAgIAogICAgICA7OyBBcHBlbmQgY2hpbGRyZW4gcmVjdXJzaXZlbHkKICAgICAgKGpzL2NvbnNvbGUubG9nIDpjaGlsZHJlbnMgY2hpbGRyZW4pCiAgICAgIChkb3NlcSBbY2hpbGQgY2hpbGRyZW5dCiAgICAgICAgKGpzL2NvbnNvbGUubG9nIDpjaGlsZCBjaGlsZCA6Y2hpbGRyZW4gY2hpbGRyZW4pCiAgICAgICAgKC5hcHBlbmRDaGlsZCBlbCAoZG90byAoY3JlYXRlLW5vZGUgY2hpbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChqcy9jb25zb2xlLmxvZyA6Y2hpbGQtbm9kZSkpKSkKICAgICAgCiAgICAgIGVsKQoKICAgIDplbHNlCiAgICAodGhyb3cgKGpzL0Vycm9yLiAoc3RyICJJbnZhbGlkIGhpY2N1cDogIiBoaWNjdXApKSkpKQoKKGRlZiByb290IChvcgogICAgICAgICAgICAoanMvZG9jdW1lbnQucXVlcnlTZWxlY3RvciAiI2NvbnRhaW5lciIpCiAgICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgIChzZXQhIC1pZCAiY29udGFpbmVyIikKICAgICAgICAgICAgICAoanMvZG9jdW1lbnQuYm9keS5wcmVwZW5kKSkpKQoKKGRlZiBzdGF0ZSAoYXRvbSB7OmNvdW50ZXIgMAogICAgICAgICAgICAgICAgICA6aW5wdXQgIkhlbGxvIn0pKQoKKGRlZm4gZnVjayBbXQogIChqcy9jb25zb2xlLmxvZyA6ZnVjaykpCgooZGVmbiBteS1jb21wb25lbnQgW10KICBbOmRpdgogICBbOmRpdiAiQ291bnQ6ICIgKDpjb3VudGVyIEBzdGF0ZSldCiAgIFs6ZGl2IFs6YnV0dG9uIHs7OyA6aWQgOmJ0bgogICAgICAgICAgICAgICAgICAgOm9uY2xpY2sgIyhkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBybiA6ZHVkZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzd2FwISBzdGF0ZSBhc3NvYyA6aW5wdXQgKC0%2BICUgOnRhcmdldCA6dmFsdWUpKSl9CiAgICAgICAgICAiUGxlYXNlIGNsaWNrIG1lIl1dCiAgIFs6aW5wdXQgezppZCA6aW4gOnR5cGUgOnRleHQgOnZhbHVlICg6aW5wdXQgQHN0YXRlKX1dCiAgIFs6cHJlICg6aW5wdXQgQHN0YXRlKV1dKQoKKGRlZm4gbW9ycGggW10KICAoSS9tb3JwaCByb290IChkb3RvIChjcmVhdGUtbm9kZSAobXktY29tcG9uZW50KSkKICAgICAgICAgICAgICAgICAgKGpzL2NvbnNvbGUubG9nKSkKICAgIHs6bW9ycGhTdHlsZSA6aW5uZXJIVE1MfSkpCgooYWRkLXdhdGNoIHN0YXRlIDpzdGF0ZSAoZm4gW18gXyBfIF9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vcnBoKSkpCgoobW9ycGgpCgojXyguYWRkRXZlbnRMaXN0ZW5lciAoanMvZG9jdW1lbnQucXVlcnlTZWxlY3RvciAiI2J0biIpIDpjbGljawogICAgKGZuIFtdCiAgICAgIChzd2FwISBzdGF0ZSB1cGRhdGUgOmNvdW50ZXIgaW5jKSkpCgojXyguYWRkRXZlbnRMaXN0ZW5lciAoanMvZG9jdW1lbnQucXVlcnlTZWxlY3RvciAiI2luIikgOmlucHV0CiAgICAoZm4gW2V2XQogICAgICAoc3dhcCEgc3RhdGUgYXNzb2MgOmlucHV0ICgtPiBldiA6dGFyZ2V0IDp2YWx1ZSkpKSk%3D

Chris McCormick 2025-10-22T13:57:03.404359Z

Looks like idiomorph doesn't attach it correctly. If I right click the button, inspect, do "Use in Console" and then this: temp0.onclick = () => alert("hi"); it then alerts if i click the button.

borkdude 2025-10-22T13:57:32.971809Z

oooh ok

Chris McCormick 2025-10-22T13:57:36.412849Z

So that method definitely does attach the handler

borkdude 2025-10-22T13:59:30.923389Z

document.querySelector("#btn").onclick

borkdude 2025-10-22T13:59:37.478089Z

is null

Chris McCormick 2025-10-22T14:00:40.392769Z

You mean the idiomorph rendered version?

borkdude 2025-10-22T14:00:45.081399Z

yeah

Chris McCormick 2025-10-22T14:00:57.713339Z

i don't know anything about it but maybe they have some other way of mounting functions

borkdude 2025-10-22T14:01:01.771449Z

but when Iog it in my building of the dom it's there:

(js/console.log :set??? (.-onclick el))

πŸ€” 1
borkdude 2025-10-22T14:02:03.489529Z

are you sure idiomorph supports onclick, where did you read this

Chris McCormick 2025-10-22T14:04:07.330999Z

huh? did I say that?

Chris McCormick 2025-10-22T14:04:25.373759Z

i mean the aset method of attaching onclick

Chris McCormick 2025-10-22T14:04:33.898839Z

I don't know anything about idiomorph

borkdude 2025-10-22T14:04:56.767159Z

lol

borkdude 2025-10-22T14:05:03.906349Z

maybe I'm confusing you with chatGPT :P

πŸ™€ 1
borkdude 2025-10-22T14:05:06.168619Z

sorry

borkdude 2025-10-22T14:05:24.344689Z

yeah I'll try attaching an onclick, to see if that works

πŸ‘ 1
Chris McCormick 2025-10-22T14:05:28.131019Z

i am basically a human chatgpt, always having hallucinations

borkdude 2025-10-22T14:05:31.666369Z

lol

borkdude 2025-10-22T14:06:14.698909Z

I'm trying (.addEventListener el "click" v)

borkdude 2025-10-22T14:07:04.936779Z

but no lock

borkdude 2025-10-22T14:07:06.520719Z

luck

Chris McCormick 2025-10-22T14:07:59.729619Z

unlike chatgpt i have to sleep unfortunately. good luck with it! πŸ‘‹

borkdude 2025-10-22T14:08:22.185439Z

fair enough! sleep well

borkdude 2025-10-22T14:45:01.014959Z

anyway, this wasn't in vain. I've discovered that idiomorph doesn't preserve event handlers, so eucalypt has a +1 on this one now too

borkdude 2025-10-22T14:49:40.411499Z

snabbdom might be nice to try next

borkdude 2025-10-22T14:50:05.703419Z

it does allow you to preserve event listeners and seems to be just as small as idiomorph

borkdude 2025-10-22T14:51:08.191779Z

probably eucalypt already does something like snabbdom

borkdude 2025-10-22T17:49:29.035289Z

Got a snabbdom example working: https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvc25hYmJkb20iIDpyZWZlciBbaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzTW9kdWxlXV0pCgooZGVmIHBhdGNoIChpbml0IFtjbGFzc01vZHVsZSBwcm9wc01vZHVsZSBzdHlsZU1vZHVsZSBldmVudExpc3RlbmVyc01vZHVsZV0pKQoKKGRlZm4gY3JlYXRlLW5vZGUgW2hpY2N1cF0KICAoY29uZAogICAgKG9yCiAgICAgIChudW1iZXI%2FIGhpY2N1cCkKICAgICAgKHN0cmluZz8gaGljY3VwKSkgaGljY3VwCiAgICAodmVjdG9yPyBoaWNjdXApCiAgICAobGV0IFtbdGFnIGF0dHJzICYgY2hpbGRyZW5dIGhpY2N1cAogICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXSAoaWYgKG1hcD8gYXR0cnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwgKGNvbnMgYXR0cnMgY2hpbGRyZW4pXSkKICAgICAgICAgIGVsIChoIHRhZyBhdHRycwogICAgICAgICAgICAgICAobWFwdiBjcmVhdGUtbm9kZSBjaGlsZHJlbikpXQogICAgICBlbCkKICAgIDplbHNlCiAgICAodGhyb3cgKGpzL0Vycm9yLiAoc3RyICJJbnZhbGlkIGhpY2N1cDogIiBoaWNjdXApKSkpKQoKKGRlZiBzdGF0ZSAoYXRvbSB7OmNvdW50ZXIgMAogICAgICAgICAgICAgICAgICA6aW5wdXQgIkhlbGxvIn0pKQoKKGRlZm4gbXktY29tcG9uZW50IFtdCiAgWzpkaXYKICAgWzpkaXYgIkNvdW50OiAiICg6Y291bnRlciBAc3RhdGUpXQogICBbOmRpdiBbOmJ1dHRvbiB7Om9uIHs6Y2xpY2sgIyhkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN3YXAhIHN0YXRlIHVwZGF0ZSA6Y291bnRlciBpbmMpKX19CiAgICAgICAgICAiUGxlYXNlIGNsaWNrIG1lIl1dCiAgIFs6aW5wdXQgezpvbiB7OmlucHV0ICMoc3dhcCEgc3RhdGUgYXNzb2MgOmlucHV0ICgtPiAlIDp0YXJnZXQgOnZhbHVlKSl9CiAgICAgICAgICAgIDpwcm9wcyB7OnR5cGUgOnRleHQgOnZhbHVlICg6aW5wdXQgQHN0YXRlKX19XQogICBbOnByZSAoOmlucHV0IEBzdGF0ZSldXSkKCihkZWYgcm9vdCAob3IKICAgICAgICAgICAgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNjb250YWluZXIiKQogICAgICAgICAgICAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAoc2V0ISAtaWQgImNvbnRhaW5lciIpCiAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKSkKCihkZWYgdmRvbSAoYXRvbSAocGF0Y2ggcm9vdCAoY3JlYXRlLW5vZGUgKG15LWNvbXBvbmVudCkpKSkpCgooZGVmbiBtb3JwaCBbXQogIChsZXQgW25ldyAoY3JlYXRlLW5vZGUgKG15LWNvbXBvbmVudCkpXQogICAgKHBhdGNoIEB2ZG9tIG5ldykKICAgIChyZXNldCEgdmRvbSBuZXcpKSkKCihhZGQtd2F0Y2ggc3RhdGUgOnN0YXRlIChmbiBbXyBfIF8gX10KICAgICAgICAgICAgICAgICAgICAgICAgICAobW9ycGgpKSk%3D

borkdude 2025-10-22T17:52:49.735799Z

(6kb zipped single page with vite)

πŸ’― 1
Chris McCormick 2025-10-22T22:31:56.573679Z

Very nice!

Chris McCormick 2025-10-22T22:34:12.767139Z

That's so clean.

borkdude 2025-10-22T17:50:01.448249Z

A more advanced snabbdom example with minimal runtime hiccup impl: https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvc25hYmJkb20iIDpyZWZlciBbaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzTW9kdWxlXV0pCgooZGVmIHBhdGNoIChpbml0IFtjbGFzc01vZHVsZSBwcm9wc01vZHVsZSBzdHlsZU1vZHVsZSBldmVudExpc3RlbmVyc01vZHVsZV0pKQoKKGRlZm4gY3JlYXRlLW5vZGUgW2hpY2N1cF0KICAoY29uZAogICAgKG9yCiAgICAgIChudW1iZXI%2FIGhpY2N1cCkKICAgICAgKHN0cmluZz8gaGljY3VwKSkgaGljY3VwCiAgICAodmVjdG9yPyBoaWNjdXApCiAgICAobGV0IFtbdGFnIGF0dHJzICYgY2hpbGRyZW5dIGhpY2N1cAogICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXSAoaWYgKG1hcD8gYXR0cnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwgKGNvbnMgYXR0cnMgY2hpbGRyZW4pXSkKICAgICAgICAgIGVsIChoIHRhZyBhdHRycwogICAgICAgICAgICAgICAobWFwdiBjcmVhdGUtbm9kZSBjaGlsZHJlbikpXQogICAgICBlbCkKICAgIDplbHNlCiAgICAodGhyb3cgKGpzL0Vycm9yLiAoc3RyICJJbnZhbGlkIGhpY2N1cDogIiBoaWNjdXApKSkpKQoKKGRlZiBzdGF0ZSAoYXRvbSB7OmNvdW50ZXIgMAogICAgICAgICAgICAgICAgICA6aW5wdXQgIkhlbGxvIn0pKQoKKGRlZm4gbXktY29tcG9uZW50IFtdCiAgWzpkaXYKICAgWzpkaXYgIkNvdW50OiAiICg6Y291bnRlciBAc3RhdGUpXQogICBbOmRpdiBbOmJ1dHRvbiB7Om9uIHs6Y2xpY2sgIyhkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN3YXAhIHN0YXRlIHVwZGF0ZSA6Y291bnRlciBpbmMpKX19CiAgICAgICAgICAiUGxlYXNlIGNsaWNrIG1lIl1dCiAgIFs6aW5wdXQgezpvbiB7OmlucHV0ICMoc3dhcCEgc3RhdGUgYXNzb2MgOmlucHV0ICgtPiAlIDp0YXJnZXQgOnZhbHVlKSl9CiAgICAgICAgICAgIDpwcm9wcyB7OnR5cGUgOnRleHQgOnZhbHVlICg6aW5wdXQgQHN0YXRlKX19XQogICBbOnByZSAoOmlucHV0IEBzdGF0ZSldXSkKCihkZWYgcm9vdCAob3IKICAgICAgICAgICAgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNjb250YWluZXIiKQogICAgICAgICAgICAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAoc2V0ISAtaWQgImNvbnRhaW5lciIpCiAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKSkKCihkZWYgdmRvbSAoYXRvbSAocGF0Y2ggcm9vdCAoY3JlYXRlLW5vZGUgKG15LWNvbXBvbmVudCkpKSkpCgooZGVmbiBtb3JwaCBbXQogIChsZXQgW25ldyAoY3JlYXRlLW5vZGUgKG15LWNvbXBvbmVudCkpXQogICAgKHBhdGNoIEB2ZG9tIG5ldykKICAgIChyZXNldCEgdmRvbSBuZXcpKSkKCihhZGQtd2F0Y2ggc3RhdGUgOnN0YXRlIChmbiBbXyBfIF8gX10KICAgICAgICAgICAgICAgICAgICAgICAgICAobW9ycGgpKSk%3D (6kb zipped single page with vite)

borkdude 2025-10-22T21:22:39.938109Z

https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvc25hYmJkb20iIDpyZWZlciBbaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzTW9kdWxlXV0pCgooZGVmIHBhdGNoIChpbml0IFtjbGFzc01vZHVsZSBwcm9wc01vZHVsZSBzdHlsZU1vZHVsZSBldmVudExpc3RlbmVyc01vZHVsZV0pKQoKKGRlZm4gY3JlYXRlLW5vZGUgW2hpY2N1cF0KICAoY29uZAogICAgKG9yCiAgICAgIChudW1iZXI%2FIGhpY2N1cCkKICAgICAgKHN0cmluZz8gaGljY3VwKSkgaGljY3VwCiAgICAodmVjdG9yPyBoaWNjdXApCiAgICAobGV0IFtbdGFnICYgW2F0dHJzICYgY2hpbGRyZW4gOmFzIGFsbC1jaGlsZHJlbl1dIGhpY2N1cAogICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXSAoaWYgKG1hcD8gYXR0cnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJzIGNoaWxkcmVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwgYWxsLWNoaWxkcmVuXSkKICAgICAgICAgIGVsIChpZiAoZm4%2FIHRhZykKICAgICAgICAgICAgICAgKGNyZWF0ZS1ub2RlIChhcHBseSB0YWcgYWxsLWNoaWxkcmVuKSkKICAgICAgICAgICAgICAgKGRvCiAgICAgICAgICAgICAgICAgKGggdGFnIGF0dHJzCiAgICAgICAgICAgICAgICAgICAobWFwdiBjcmVhdGUtbm9kZSBjaGlsZHJlbikpKSldCiAgICAgIGVsKQogICAgOmVsc2UKICAgIChkbwogICAgICAodGhyb3cgKGpzL0Vycm9yLiAoc3RyICJJbnZhbGlkIGhpY2N1cDogIiBoaWNjdXApKSkpKSkKCihkZWZuIHNsaWRlciBbdGhlLWF0b20gY2FsYy1mbiBwYXJhbSB2YWx1ZSBtaW4gbWF4IHN0ZXAgaW52YWxpZGF0ZXNdCiAgWzppbnB1dCB7OnByb3BzIHs6dHlwZSAicmFuZ2UiIDp2YWx1ZSB2YWx1ZSA6bWluIG1pbiA6bWF4IG1heCA6c3RlcCBzdGVwfQogICAgICAgICAgIDpzdHlsZSB7OndpZHRoICI1MCUifQogICAgICAgICAgIDpvbiB7OmlucHV0IChmbiBbZV0KICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgW25ldy12YWx1ZSAoanMvcGFyc2VGbG9hdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFnZXQgKGFnZXQgZSAidGFyZ2V0IikgInZhbHVlIikpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3dhcCEgdGhlLWF0b20KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW2RhdGFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLT4gZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzb2MgcGFyYW0gbmV3LXZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlzc29jIGludmFsaWRhdGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjLWZuKSkpKSl9fV0pCgooZGVmbiBjYWxjLW9obXMgW3s6a2V5cyBbdm9sdGFnZSBjdXJyZW50IHJlc2lzdGFuY2VdIDphcyBkYXRhfV0KICAoaWYgKG5pbD8gdm9sdGFnZSkKICAgIChhc3NvYyBkYXRhIDp2b2x0YWdlICgqIGN1cnJlbnQgcmVzaXN0YW5jZSkpCiAgICAoYXNzb2MgZGF0YSA6Y3VycmVudCAoLyB2b2x0YWdlIHJlc2lzdGFuY2UpKSkpCgooZGVmIG9obXMtZGF0YSAoYXRvbSB7OnZvbHRhZ2UgMTIgOmN1cnJlbnQgMC41IDpyZXNpc3RhbmNlIDI0fSkpCgooZGVmbiBvaG1zLWxhdy1wYWdlIFtdCiAgKGxldCBbezprZXlzIFt2b2x0YWdlIGN1cnJlbnQgcmVzaXN0YW5jZV19IEBvaG1zLWRhdGFdCiAgICBbOmRpdgogICAgIFs6aDMgIk9obSdzIExhdyBDYWxjdWxhdG9yIl0KICAgICBbOmRpdgogICAgICAiVm9sdGFnZTogIiAoLnRvRml4ZWQgdm9sdGFnZSAyKSAiViIKICAgICAgW3NsaWRlciBvaG1zLWRhdGEgY2FsYy1vaG1zIDp2b2x0YWdlIHZvbHRhZ2UgMCAzMCAwLjEgOmN1cnJlbnRdXQogICAgIFs6ZGl2CiAgICAgICJDdXJyZW50OiAiICgudG9GaXhlZCBjdXJyZW50IDIpICJBIgogICAgICBbc2xpZGVyIG9obXMtZGF0YSBjYWxjLW9obXMgOmN1cnJlbnQgY3VycmVudCAwIDMgMC4wMSA6dm9sdGFnZV1dCiAgICAgWzpkaXYKICAgICAgIlJlc2lzdGFuY2U6ICIgKC50b0ZpeGVkIHJlc2lzdGFuY2UgMikgIiIKICAgICAgW3NsaWRlciBvaG1zLWRhdGEgY2FsYy1vaG1zIDpyZXNpc3RhbmNlIHJlc2lzdGFuY2UgMCAxMDAgMSA6dm9sdGFnZV1dXSkpCgooZGVmIHJvb3QgKG9yCiAgICAgICAgICAgIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjY29udGFpbmVyIikKICAgICAgICAgICAgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpCiAgICAgICAgICAgICAgKHNldCEgLWlkICJjb250YWluZXIiKQogICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgooZGVmIHZkb20gKGF0b20gKHBhdGNoIHJvb3QgKGNyZWF0ZS1ub2RlIFtvaG1zLWxhdy1wYWdlXSkpKSkKCihkZWZuIG1vcnBoIFtdCiAgKGxldCBbbmV3IChjcmVhdGUtbm9kZSBbb2htcy1sYXctcGFnZV0pXQogICAgKHBhdGNoIEB2ZG9tIG5ldykKICAgIChyZXNldCEgdmRvbSBuZXcpKSkKCihhZGQtd2F0Y2ggb2htcy1kYXRhIDpzdGF0ZSAoZm4gW18gXyBfIF9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3JwaCkpKQ%3D%3D

borkdude 2025-10-23T07:05:07.185079Z

Yeah I knew

borkdude 2025-10-23T07:06:09.943309Z

Probably we can also build replicant without snabbdom now that we have eucalypts example

ray 2025-10-23T10:44:02.200389Z

cc @christian767

2
Chris McCormick 2025-10-23T11:54:53.883009Z

I'm 74% of the way through porting the Preact test suite to Eucalypt. Have fixed a ton of bugs due to this (`preact-tests` branch).

borkdude 2025-10-23T11:55:54.538299Z

nice!

cjohansen 2025-10-23T20:51:14.456509Z

Dumdom was a stop-gap solution to get us off React. It was built to be 1:1 API compliant with Quiescent, the react wrapper we used. I chose snabbdom for the vdom implementation, because I thought doing that part would be too difficult. The dumdom code was not very good, and certainly not very performant. Still it served us well for a few years. The main priority was to get us off React, but ultimately the goal was to get out of the JS ecosystem entirely. After a few years I worked up the courage to try my hand at the DOM diffing, and built Replicant as a pure Clojure alternative that supported the ideas we developed with Dumdom as first class concepts: event handlers as data, no component local state, hiccup/data all the way. There wasn't anything particularly wrong with snabbdom. We just wanted a pure CLJ solution.

πŸ‘ 2
1
borkdude 2025-10-22T22:14:51.846929Z

Just for reference, might be interesting for @chris358 too Here's kinda lifecycle management using snabbdom https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvc25hYmJkb20iIDpyZWZlciBbaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzTW9kdWxlXV0pCgooZGVmIHBhdGNoIChpbml0IFtjbGFzc01vZHVsZSBwcm9wc01vZHVsZSBzdHlsZU1vZHVsZSBldmVudExpc3RlbmVyc01vZHVsZV0pKQoKKGRlZm4gY3JlYXRlLW5vZGUgW2hpY2N1cF0KICAoY29uZAogICAgKG9yCiAgICAgIChudW1iZXI%2FIGhpY2N1cCkKICAgICAgKHN0cmluZz8gaGljY3VwKQogICAgICAoYm9vbGVhbj8gaGljY3VwKQogICAgICAobmlsPyBoaWNjdXApKSAoc3RyIGhpY2N1cCkKICAgICh2ZWN0b3I%2FIGhpY2N1cCkKICAgIChsZXQgW1t0YWcgJiBbYXR0cnMgJiBjaGlsZHJlbiA6YXMgYWxsLWNoaWxkcmVuXV0gaGljY3VwCiAgICAgICAgICBbYXR0cnMgY2hpbGRyZW5dIChpZiAobWFwPyBhdHRycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0cnMgY2hpbGRyZW5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25pbCBhbGwtY2hpbGRyZW5dKQogICAgICAgICAgZWwgKGlmIChmbj8gdGFnKQogICAgICAgICAgICAgICAoY3JlYXRlLW5vZGUgKGFwcGx5IHRhZyBhbGwtY2hpbGRyZW4pKQogICAgICAgICAgICAgICAoZG8KICAgICAgICAgICAgICAgICAoaCB0YWcgYXR0cnMKICAgICAgICAgICAgICAgICAgIChtYXB2IGNyZWF0ZS1ub2RlIGNoaWxkcmVuKSkpKV0KICAgICAgZWwpCiAgICA6ZWxzZQogICAgKGRvCiAgICAgICh0aHJvdyAoanMvRXJyb3IuIChzdHIgIkludmFsaWQgaGljY3VwOiAiIGhpY2N1cCkpKSkpKQoKKGRlZm4gc2xpZGVyIFt0aGUtYXRvbSBjYWxjLWZuIHBhcmFtIHZhbHVlIG1pbiBtYXggc3RlcCBpbnZhbGlkYXRlc10KICBbOmlucHV0IHs6cHJvcHMgezp0eXBlICJyYW5nZSIgOnZhbHVlIHZhbHVlIDptaW4gbWluIDptYXggbWF4IDpzdGVwIHN0ZXB9CiAgICAgICAgICAgOnN0eWxlIHs6d2lkdGggIjUwJSJ9CiAgICAgICAgICAgOm9uIHs6aW5wdXQgKGZuIFtlXQogICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbbmV3LXZhbHVlIChqcy9wYXJzZUZsb2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWdldCAoYWdldCBlICJ0YXJnZXQiKSAidmFsdWUiKSldCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzd2FwISB0aGUtYXRvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbiBbZGF0YV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtPiBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYyBwYXJhbSBuZXctdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXNzb2MgaW52YWxpZGF0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGMtZm4pKSkpKX19XSkKCihkZWZuIGNhbGMtb2htcyBbezprZXlzIFt2b2x0YWdlIGN1cnJlbnQgcmVzaXN0YW5jZV0gOmFzIGRhdGF9XQogIChpZiAobmlsPyB2b2x0YWdlKQogICAgKGFzc29jIGRhdGEgOnZvbHRhZ2UgKCogY3VycmVudCByZXNpc3RhbmNlKSkKICAgIChhc3NvYyBkYXRhIDpjdXJyZW50ICgvIHZvbHRhZ2UgcmVzaXN0YW5jZSkpKSkKCihkZWYgb2htcy1kYXRhIChhdG9tIHs6dm9sdGFnZSAxMiA6Y3VycmVudCAwLjUgOnJlc2lzdGFuY2UgMjQKICAgICAgICAgICAgICAgICAgICAgIDpzaG93PyB0cnVlfSkpCgooZGVmbiBvaG1zLWxhdy1wYWdlIFtdCiAgKGxldCBbezprZXlzIFt2b2x0YWdlIGN1cnJlbnQgcmVzaXN0YW5jZV19IEBvaG1zLWRhdGFdCiAgICBbOmRpdgogICAgIFs6YnV0dG9uIHs6b24gezpjbGljayAjKHN3YXAhIG9obXMtZGF0YSB1cGRhdGUgOnNob3c%2FIG5vdCl9fQogICAgICAiU2hvdz8gIiAoOnNob3c%2FIEBvaG1zLWRhdGEpXQogICAgICh3aGVuICg6c2hvdz8gQG9obXMtZGF0YSkKICAgICBbOmRpdgogICAgICB7Omhvb2sgezpjcmVhdGUgKGZuIFt2bm9kZV0gKGpzL2NvbnNvbGUubG9nICJtb3VudGVkIikpCiAgICAgICAgICAgICA6dXBkYXRlIChmbiBbb2xkIG5ld10gKGpzL2NvbnNvbGUubG9nICJ1cGRhdGVkIikpCiAgICAgICAgICAgICA6ZGVzdHJveSAoZm4gW3Zub2RlXSAoanMvY29uc29sZS5sb2cgInVubW91bnRlZCIpKX19CiAgICAgIFs6aDMgIk9obSdzIExhdyBDYWxjdWxhdG9yIl0KICAgICAgWzpkaXYKICAgICAgIlZvbHRhZ2U6ICIgKC50b0ZpeGVkIHZvbHRhZ2UgMikgIlYiCiAgICAgIFtzbGlkZXIgb2htcy1kYXRhIGNhbGMtb2htcyA6dm9sdGFnZSB2b2x0YWdlIDAgMzAgMC4xIDpjdXJyZW50XV0KICAgICAgWzpkaXYKICAgICAgIkN1cnJlbnQ6ICIgKC50b0ZpeGVkIGN1cnJlbnQgMikgIkEiCiAgICAgIFtzbGlkZXIgb2htcy1kYXRhIGNhbGMtb2htcyA6Y3VycmVudCBjdXJyZW50IDAgMyAwLjAxIDp2b2x0YWdlXV0KICAgICAgWzpkaXYKICAgICAgIlJlc2lzdGFuY2U6ICIgKC50b0ZpeGVkIHJlc2lzdGFuY2UgMikgIiIKICAgICAgIFtzbGlkZXIgb2htcy1kYXRhIGNhbGMtb2htcyA6cmVzaXN0YW5jZSByZXNpc3RhbmNlIDAgMTAwIDEgOnZvbHRhZ2VdXV0pXSkpCgooZGVmIHJvb3QgKG9yCiAgICAgICAgICAgIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjY29udGFpbmVyIikKICAgICAgICAgICAgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpCiAgICAgICAgICAgICAgKHNldCEgLWlkICJjb250YWluZXIiKQogICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgooZGVmIHZkb20gKGF0b20gKHBhdGNoIHJvb3QgKGNyZWF0ZS1ub2RlIFtvaG1zLWxhdy1wYWdlXSkpKSkKCihkZWZuIG1vcnBoIFtdCiAgKGxldCBbbmV3IChjcmVhdGUtbm9kZSBbb2htcy1sYXctcGFnZV0pXQogICAgKHBhdGNoIEB2ZG9tIG5ldykKICAgIChyZXNldCEgdmRvbSBuZXcpKSkKCihhZGQtd2F0Y2ggb2htcy1kYXRhIDpzdGF0ZSAoZm4gW18gXyBfIF9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3JwaCkpKQ%3D%3D (click on Show to unmount and re-mount component)

borkdude 2025-10-22T22:21:21.462789Z

btw @pez I think implementing something that looks a lot like replicant on top of snabbdom will work in squint (see demo above)

Chris McCormick 2025-10-22T22:30:37.450899Z

Ooh very nice. > Snabbdom consists of an extremely simple, performant, and extensible core that is only β‰ˆ 200 SLOC. 🀯

Chris McCormick 2025-10-22T22:31:17.189359Z

If Eucalypt could be a Reagent-API wrapper around something like this it would mean less code to test/maintain which would be good.

borkdude 2025-10-22T22:32:01.998259Z

worth a branch :)

borkdude 2025-10-22T22:32:26.584879Z

wonder what it will do to the size

borkdude 2025-10-22T22:33:12.063809Z

my hacking sessions survived your bed time... now I need to catch some zzz myself I think, before you confuse me with an LLM

Chris McCormick 2025-10-22T22:34:51.870879Z

ha ha sleep well

Chris McCormick 2025-10-22T22:35:22.560199Z

I'll finish porting Preact tests over as I think having a good test suite will make it easier to try these things out.

borkdude 2025-10-22T22:35:40.404419Z

thanks. looking forward to the new version with the bugfix!

Chris McCormick 2025-10-22T22:37:14.525749Z

oh i should npm publish taht, thanks for the reminder

pez 2025-10-22T22:54:43.609429Z

Replicant’s predecessor, Dumdom, used snabbdom, as it happens.

πŸ‘€ 1