home.social

#thingumbrella — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #thingumbrella, aggregated by home.social.

  1. I somehow missed that the Go-rewrite of #TypeScript (v7.0.2) with supposedly 10x performance already had been released two weeks ago[1]. Of course, I immediately had to try it out with thi.ng/umbrella and see how this impacts build times. tl;dr It's very impressive and congrats to the team who pulled it off!

    For context, the current #ThingUmbrella codebase contains 328k lines of TypeScript source code, of which 218k lines are actual code, 87k lines comments, the rest blanks. There're 216 packages (aka individual libraries) and 188 example projects to demonstrate their usage.

    TS v6 build times:

    • from scratch (packages only): 5m 44s
    • rebuild (packages only): 2m 18s
    • examples: 1m 18s

    TS v7 build times:

    • from scratch (packages only): 1m 50s
    • rebuild (packages only): 29s 166ms
    • examples: 56s 193ms

    This is really cool and means a 3-5x speed up for (re)building all packages. The difference for example projects is much smaller, since there most of the time there is consumed by Vite (TypeScript is only used for type checking prior to building).

    Currently (for TS6), my package build steps are actually using esbuild for code generation and here tsc is also only used for type checking and outputting type declaration files. This was done because esbuild is much faster (even in incremental mode). But with the TS7 speedups, I don't need this extra build tool anymore...

    Notice for users: I've not yet officially switched to TS7, but will do so in the near future. I'm also grateful that there were only minor code changes (and fair ones) required for switching to the new version. For example, TS7 is catching obsolete generics, which previous versions didn't complain about...

    Actually very happy about this new release (usually more of a dread)!

    [1] devblogs.microsoft.com/typescr

    #ThingUmbrella #Build #Performance #Benchmark

  2. I somehow missed that the Go-rewrite of #TypeScript (v7.0.2) with supposedly 10x performance already had been released two weeks ago[1]. Of course, I immediately had to try it out with thi.ng/umbrella and see how this impacts build times. tl;dr It's very impressive and congrats to the team who pulled it off!

    For context, the current #ThingUmbrella codebase contains 328k lines of TypeScript source code, of which 218k lines are actual code, 87k lines comments, the rest blanks. There're 216 packages (aka individual libraries) and 188 example projects to demonstrate their usage.

    TS v6 build times:

    • from scratch (packages only): 5m 44s
    • rebuild (packages only): 2m 18s
    • examples: 1m 18s

    TS v7 build times:

    • from scratch (packages only): 1m 50s
    • rebuild (packages only): 29s 166ms
    • examples: 56s 193ms

    This is really cool and means a 3-5x speed up for (re)building all packages. The difference for example projects is much smaller, since there most of the time there is consumed by Vite (TypeScript is only used for type checking prior to building).

    Currently (for TS6), my package build steps are actually using esbuild for code generation and here tsc is also only used for type checking and outputting type declaration files. This was done because esbuild is much faster (even in incremental mode). But with the TS7 speedups, I don't need this extra build tool anymore...

    Notice for users: I've not yet officially switched to TS7, but will do so in the near future. I'm also grateful that there were only minor code changes (and fair ones) required for switching to the new version. For example, TS7 is catching obsolete generics, which previous versions didn't complain about...

    Actually very happy about this new release (usually more of a dread)!

    [1] devblogs.microsoft.com/typescr

    #ThingUmbrella #Build #Performance #Benchmark

  3. I somehow missed that the Go-rewrite of #TypeScript (v7.0.2) with supposedly 10x performance already had been released two weeks ago[1]. Of course, I immediately had to try it out with thi.ng/umbrella and see how this impacts build times. tl;dr It's very impressive and congrats to the team who pulled it off!

    For context, the current #ThingUmbrella codebase contains 328k lines of TypeScript source code, of which 218k lines are actual code, 87k lines comments, the rest blanks. There're 216 packages (aka individual libraries) and 188 example projects to demonstrate their usage.

    TS v6 build times:

    • from scratch (packages only): 5m 44s
    • rebuild (packages only): 2m 18s
    • examples: 1m 18s

    TS v7 build times:

    • from scratch (packages only): 1m 50s
    • rebuild (packages only): 29s 166ms
    • examples: 56s 193ms

    This is really cool and means a 3-5x speed up for (re)building all packages. The difference for example projects is much smaller, since there most of the time there is consumed by Vite (TypeScript is only used for type checking prior to building).

    Currently (for TS6), my package build steps are actually using esbuild for code generation and here tsc is also only used for type checking and outputting type declaration files. This was done because esbuild is much faster (even in incremental mode). But with the TS7 speedups, I don't need this extra build tool anymore...

    Notice for users: I've not yet officially switched to TS7, but will do so in the near future. I'm also grateful that there were only minor code changes (and fair ones) required for switching to the new version. For example, TS7 is catching obsolete generics, which previous versions didn't complain about...

    Actually very happy about this new release (usually more of a dread)!

    [1] devblogs.microsoft.com/typescr

    #ThingUmbrella #Build #Performance #Benchmark

  4. I somehow missed that the Go-rewrite of #TypeScript (v7.0.2) with supposedly 10x performance already had been released two weeks ago[1]. Of course, I immediately had to try it out with thi.ng/umbrella and see how this impacts build times. tl;dr It's very impressive and congrats to the team who pulled it off!

    For context, the current #ThingUmbrella codebase contains 328k lines of TypeScript source code, of which 218k lines are actual code, 87k lines comments, the rest blanks. There're 216 packages (aka individual libraries) and 188 example projects to demonstrate their usage.

    TS v6 build times:

    • from scratch (packages only): 5m 44s
    • rebuild (packages only): 2m 18s
    • examples: 1m 18s

    TS v7 build times:

    • from scratch (packages only): 1m 50s
    • rebuild (packages only): 29s 166ms
    • examples: 56s 193ms

    This is really cool and means a 3-5x speed up for (re)building all packages. The difference for example projects is much smaller, since there most of the time there is consumed by Vite (TypeScript is only used for type checking prior to building).

    Currently (for TS6), my package build steps are actually using esbuild for code generation and here tsc is also only used for type checking and outputting type declaration files. This was done because esbuild is much faster (even in incremental mode). But with the TS7 speedups, I don't need this extra build tool anymore...

    Notice for users: I've not yet officially switched to TS7, but will do so in the near future. I'm also grateful that there were only minor code changes (and fair ones) required for switching to the new version. For example, TS7 is catching obsolete generics, which previous versions didn't complain about...

    Actually very happy about this new release (usually more of a dread)!

    [1] devblogs.microsoft.com/typescr

    #ThingUmbrella #Build #Performance #Benchmark

  5. I somehow missed that the Go-rewrite of #TypeScript (v7.0.2) with supposedly 10x performance already had been released two weeks ago[1]. Of course, I immediately had to try it out with thi.ng/umbrella and see how this impacts build times. tl;dr It's very impressive and congrats to the team who pulled it off!

    For context, the current #ThingUmbrella codebase contains 328k lines of TypeScript source code, of which 218k lines are actual code, 87k lines comments, the rest blanks. There're 216 packages (aka individual libraries) and 188 example projects to demonstrate their usage.

    TS v6 build times:

    • from scratch (packages only): 5m 44s
    • rebuild (packages only): 2m 18s
    • examples: 1m 18s

    TS v7 build times:

    • from scratch (packages only): 1m 50s
    • rebuild (packages only): 29s 166ms
    • examples: 56s 193ms

    This is really cool and means a 3-5x speed up for (re)building all packages. The difference for example projects is much smaller, since there most of the time there is consumed by Vite (TypeScript is only used for type checking prior to building).

    Currently (for TS6), my package build steps are actually using esbuild for code generation and here tsc is also only used for type checking and outputting type declaration files. This was done because esbuild is much faster (even in incremental mode). But with the TS7 speedups, I don't need this extra build tool anymore...

    Notice for users: I've not yet officially switched to TS7, but will do so in the near future. I'm also grateful that there were only minor code changes (and fair ones) required for switching to the new version. For example, TS7 is catching obsolete generics, which previous versions didn't complain about...

    Actually very happy about this new release (usually more of a dread)!

    [1] devblogs.microsoft.com/typescr

    #ThingUmbrella #Build #Performance #Benchmark

  6. With Firefox 153 officially supporting WebAssembly.promising and its counterpart WebAssembly.Suspending[1], I've updated thi.ng/wasm-api to simplify the integration of hybrid JS/WASM async function calls, so you don't have to worry about manually creating these wrappers:

    • JavaScript async functions declared in a module's WASM imports will be auto-wrapped using WebAssembly.Suspending
    • WASM exports declared/listed via WasmModuleOpts.asyncExports will be auto-wrapped using WebAssembly.promising

    However, since that WASM feature isn't yet supported by Safari (no surprise there) and various mobile browsers, it's best to check for and selectively limit features relying on this mechanism...

    Happy coding! :)

    [1] developer.mozilla.org/en-US/do

    #ReleaseAnnouncement #ThingUmbrella #OpenSource #WASM #WebAssembly #TypeScript #JavaScript #Async

  7. With Firefox 153 officially supporting WebAssembly.promising and its counterpart WebAssembly.Suspending[1], I've updated thi.ng/wasm-api to simplify the integration of hybrid JS/WASM async function calls, so you don't have to worry about manually creating these wrappers:

    • JavaScript async functions declared in a module's WASM imports will be auto-wrapped using WebAssembly.Suspending
    • WASM exports declared/listed via WasmModuleOpts.asyncExports will be auto-wrapped using WebAssembly.promising

    However, since that WASM feature isn't yet supported by Safari (no surprise there) and various mobile browsers, it's best to check for and selectively limit features relying on this mechanism...

    Happy coding! :)

    [1] developer.mozilla.org/en-US/do

    #ReleaseAnnouncement #ThingUmbrella #OpenSource #WASM #WebAssembly #TypeScript #JavaScript #Async

  8. With Firefox 153 officially supporting WebAssembly.promising and its counterpart WebAssembly.Suspending[1], I've updated thi.ng/wasm-api to simplify the integration of hybrid JS/WASM async function calls, so you don't have to worry about manually creating these wrappers:

    • JavaScript async functions declared in a module's WASM imports will be auto-wrapped using WebAssembly.Suspending
    • WASM exports declared/listed via WasmModuleOpts.asyncExports will be auto-wrapped using WebAssembly.promising

    However, since that WASM feature isn't yet supported by Safari (no surprise there) and various mobile browsers, it's best to check for and selectively limit features relying on this mechanism...

    Happy coding! :)

    [1] developer.mozilla.org/en-US/do

    #ReleaseAnnouncement #ThingUmbrella #OpenSource #WASM #WebAssembly #TypeScript #JavaScript #Async

  9. With Firefox 153 officially supporting WebAssembly.promising and its counterpart WebAssembly.Suspending[1], I've updated thi.ng/wasm-api to simplify the integration of hybrid JS/WASM async function calls, so you don't have to worry about manually creating these wrappers:

    • JavaScript async functions declared in a module's WASM imports will be auto-wrapped using WebAssembly.Suspending
    • WASM exports declared/listed via WasmModuleOpts.asyncExports will be auto-wrapped using WebAssembly.promising

    However, since that WASM feature isn't yet supported by Safari (no surprise there) and various mobile browsers, it's best to check for and selectively limit features relying on this mechanism...

    Happy coding! :)

    [1] developer.mozilla.org/en-US/do

    #ReleaseAnnouncement #ThingUmbrella #OpenSource #WASM #WebAssembly #TypeScript #JavaScript #Async

  10. With Firefox 153 officially supporting WebAssembly.promising and its counterpart WebAssembly.Suspending[1], I've updated thi.ng/wasm-api to simplify the integration of hybrid JS/WASM async function calls, so you don't have to worry about manually creating these wrappers:

    • JavaScript async functions declared in a module's WASM imports will be auto-wrapped using WebAssembly.Suspending
    • WASM exports declared/listed via WasmModuleOpts.asyncExports will be auto-wrapped using WebAssembly.promising

    However, since that WASM feature isn't yet supported by Safari (no surprise there) and various mobile browsers, it's best to check for and selectively limit features relying on this mechanism...

    Happy coding! :)

    [1] developer.mozilla.org/en-US/do

    #ReleaseAnnouncement #ThingUmbrella #OpenSource #WASM #WebAssembly #TypeScript #JavaScript #Async

  11. Another #ThingUmbrella release cycle this AM:

    • fixed yesterday's thi.ng/geom-io-obj stream parser update to also support #Safari (aka the modern IE6-like browser problem child), which in the release notes for Safari v26.4 claims[1] that ReadableStream can (finally) be iterated via for await(...) syntax, but then turns out it's still only planned for v27 [2]... 🙄
    • added async versions of all timing & benchmarking functions in thi.ng/bench to support benchmarking async functions

    [1] webkit.org/blog/17862/webkit-f
    [2] developer.mozilla.org/en-US/do

    #OpenSource #ReleaseDay #TypeScript #JavaScript #Async

  12. Another #ThingUmbrella release cycle this AM:

    • fixed yesterday's thi.ng/geom-io-obj stream parser update to also support #Safari (aka the modern IE6-like browser problem child), which in the release notes for Safari v26.4 claims[1] that ReadableStream can (finally) be iterated via for await(...) syntax, but then turns out it's still only planned for v27 [2]... 🙄
    • added async versions of all timing & benchmarking functions in thi.ng/bench to support benchmarking async functions

    [1] webkit.org/blog/17862/webkit-f
    [2] developer.mozilla.org/en-US/do

    #OpenSource #ReleaseDay #TypeScript #JavaScript #Async

  13. Another #ThingUmbrella release cycle this AM:

    • fixed yesterday's thi.ng/geom-io-obj stream parser update to also support #Safari (aka the modern IE6-like browser problem child), which in the release notes for Safari v26.4 claims[1] that ReadableStream can (finally) be iterated via for await(...) syntax, but then turns out it's still only planned for v27 [2]... 🙄
    • added async versions of all timing & benchmarking functions in thi.ng/bench to support benchmarking async functions

    [1] webkit.org/blog/17862/webkit-f
    [2] developer.mozilla.org/en-US/do

    #OpenSource #ReleaseDay #TypeScript #JavaScript #Async

  14. Another #ThingUmbrella release cycle this AM:

    • fixed yesterday's thi.ng/geom-io-obj stream parser update to also support #Safari (aka the modern IE6-like browser problem child), which in the release notes for Safari v26.4 claims[1] that ReadableStream can (finally) be iterated via for await(...) syntax, but then turns out it's still only planned for v27 [2]... 🙄
    • added async versions of all timing & benchmarking functions in thi.ng/bench to support benchmarking async functions

    [1] webkit.org/blog/17862/webkit-f
    [2] developer.mozilla.org/en-US/do

    #OpenSource #ReleaseDay #TypeScript #JavaScript #Async

  15. Another #ThingUmbrella release cycle this AM:

    • fixed yesterday's thi.ng/geom-io-obj stream parser update to also support #Safari (aka the modern IE6-like browser problem child), which in the release notes for Safari v26.4 claims[1] that ReadableStream can (finally) be iterated via for await(...) syntax, but then turns out it's still only planned for v27 [2]... 🙄
    • added async versions of all timing & benchmarking functions in thi.ng/bench to support benchmarking async functions

    [1] webkit.org/blog/17862/webkit-f
    [2] developer.mozilla.org/en-US/do

    #OpenSource #ReleaseDay #TypeScript #JavaScript #Async

  16. New #ThingUmbrella release(s): Updated the thi.ng/geom-io-obj OBJ mesh parser to support stream parsing using async iterables. This allows direct piping fetch() responses to the parser.

    const response = await fetch(MODEL_URL);
    const objModel = await parseOBJFromStream(response.body);

    Also polished and published a related small example project for it (incl. arcball camera controller, which had an update too):

    Demo (Click & drag to rotate view, touchpad/mousewheel to zoom):
    demo.thi.ng/umbrella/webgl-obj/

    Source:
    codeberg.org/thi.ng/umbrella/s

    Alternatively to stream parsing, there's also a generator/co-routine based version. This can be used standalone or together with thi.ng/fibers to better control the time slicing behavior when parsing large model files (tens or hundreds of MB) and so gives fine-grained control to avoid blocking the main UI thread:

    import { timeSlice } from "@thi.ng/fibers";

    const response = await fetch(MODEL_URL);
    const src = await response.text();
    // parse in 10 millisecond time slices
    const model = await timeSlice(parseOBJGenerator(src), 10).run().promise();

    More background info & discussion for those interested:
    codeberg.org/thi.ng/umbrella/p

    #OpenSource #Stream #Mesh #OBJ #WebGL #TypeScript #JavaScript

  17. New #ThingUmbrella release(s): Updated the thi.ng/geom-io-obj OBJ mesh parser to support stream parsing using async iterables. This allows direct piping fetch() responses to the parser.

    const response = await fetch(MODEL_URL);
    const objModel = await parseOBJFromStream(response.body);

    Also polished and published a related small example project for it (incl. arcball camera controller, which had an update too):

    Demo (Click & drag to rotate view, touchpad/mousewheel to zoom):
    demo.thi.ng/umbrella/webgl-obj/

    Source:
    codeberg.org/thi.ng/umbrella/s

    Alternatively to stream parsing, there's also a generator/co-routine based version. This can be used standalone or together with thi.ng/fibers to better control the time slicing behavior when parsing large model files (tens or hundreds of MB) and so gives fine-grained control to avoid blocking the main UI thread:

    import { timeSlice } from "@thi.ng/fibers";

    const response = await fetch(MODEL_URL);
    const src = await response.text();
    // parse in 10 millisecond time slices
    const model = await timeSlice(parseOBJGenerator(src), 10).run().promise();

    More background info & discussion for those interested:
    codeberg.org/thi.ng/umbrella/p

    #OpenSource #Stream #Mesh #OBJ #WebGL #TypeScript #JavaScript

  18. New #ThingUmbrella release(s): Updated the thi.ng/geom-io-obj OBJ mesh parser to support stream parsing using async iterables. This allows direct piping fetch() responses to the parser.

    const response = await fetch(MODEL_URL);
    const objModel = await parseOBJFromStream(response.body);

    Also polished and published a related small example project for it (incl. arcball camera controller, which had an update too):

    Demo (Click & drag to rotate view, touchpad/mousewheel to zoom):
    demo.thi.ng/umbrella/webgl-obj/

    Source:
    codeberg.org/thi.ng/umbrella/s

    Alternatively to stream parsing, there's also a generator/co-routine based version. This can be used standalone or together with thi.ng/fibers to better control the time slicing behavior when parsing large model files (tens or hundreds of MB) and so gives fine-grained control to avoid blocking the main UI thread:

    import { timeSlice } from "@thi.ng/fibers";

    const response = await fetch(MODEL_URL);
    const src = await response.text();
    // parse in 10 millisecond time slices
    const model = await timeSlice(parseOBJGenerator(src), 10).run().promise();

    More background info & discussion for those interested:
    codeberg.org/thi.ng/umbrella/p

    #OpenSource #Stream #Mesh #OBJ #WebGL #TypeScript #JavaScript

  19. New #ThingUmbrella release(s): Updated the thi.ng/geom-io-obj OBJ mesh parser to support stream parsing using async iterables. This allows direct piping fetch() responses to the parser.

    const response = await fetch(MODEL_URL);
    const objModel = await parseOBJFromStream(response.body);

    Also polished and published a related small example project for it (incl. arcball camera controller, which had an update too):

    Demo (Click & drag to rotate view, touchpad/mousewheel to zoom):
    demo.thi.ng/umbrella/webgl-obj/

    Source:
    codeberg.org/thi.ng/umbrella/s

    Alternatively to stream parsing, there's also a generator/co-routine based version. This can be used standalone or together with thi.ng/fibers to better control the time slicing behavior when parsing large model files (tens or hundreds of MB) and so gives fine-grained control to avoid blocking the main UI thread:

    import { timeSlice } from "@thi.ng/fibers";

    const response = await fetch(MODEL_URL);
    const src = await response.text();
    // parse in 10 millisecond time slices
    const model = await timeSlice(parseOBJGenerator(src), 10).run().promise();

    More background info & discussion for those interested:
    codeberg.org/thi.ng/umbrella/p

    #OpenSource #Stream #Mesh #OBJ #WebGL #TypeScript #JavaScript

  20. New #ThingUmbrella release(s): Updated the thi.ng/geom-io-obj OBJ mesh parser to support stream parsing using async iterables. This allows direct piping fetch() responses to the parser.

    const response = await fetch(MODEL_URL);
    const objModel = await parseOBJFromStream(response.body);

    Also polished and published a related small example project for it (incl. arcball camera controller, which had an update too):

    Demo (Click & drag to rotate view, touchpad/mousewheel to zoom):
    demo.thi.ng/umbrella/webgl-obj/

    Source:
    codeberg.org/thi.ng/umbrella/s

    Alternatively to stream parsing, there's also a generator/co-routine based version. This can be used standalone or together with thi.ng/fibers to better control the time slicing behavior when parsing large model files (tens or hundreds of MB) and so gives fine-grained control to avoid blocking the main UI thread:

    import { timeSlice } from "@thi.ng/fibers";

    const response = await fetch(MODEL_URL);
    const src = await response.text();
    // parse in 10 millisecond time slices
    const model = await timeSlice(parseOBJGenerator(src), 10).run().promise();

    More background info & discussion for those interested:
    codeberg.org/thi.ng/umbrella/p

    #OpenSource #Stream #Mesh #OBJ #WebGL #TypeScript #JavaScript

  21. Some weeks ago I got a cheap and fast TTArtisan 50mm/f1.2 prime lens to take better indoor pictures and close ups. Since it's fixed length and manual focus only, it's a very different kind of taking pictures, selecting/framing motifs, and often feels like a throwback to my first camera in the 1980s. I love it!

    Since the lens has quite noticeable vignetting, I found it interesting how that effect is showing up as curve in the image waveform...

    You can visualize your own images here:
    demo.thi.ng/umbrella/pixel-wav

    #TTArtisan #ThingUmbrella #DataViz #Photography

  22. Some weeks ago I got a cheap and fast TTArtisan 50mm/f1.2 prime lens to take better indoor pictures and close ups. Since it's fixed length and manual focus only, it's a very different kind of taking pictures, selecting/framing motifs, and often feels like a throwback to my first camera in the 1980s. I love it!

    Since the lens has quite noticeable vignetting, I found it interesting how that effect is showing up as curve in the image waveform...

    You can visualize your own images here:
    demo.thi.ng/umbrella/pixel-wav

    #TTArtisan #ThingUmbrella #DataViz #Photography

  23. Remembering dear Roman Verostko, who died this month two years ago, aged 94. An highly influential figure, not just for algorithmic art in general, but also for younger me personally, after meeting him during a panel discussion at the Victoria & Albert Museum in London and then corresponding for several years after...

    Living as a monk and ordained priest in the 1950/60s, he absolutely cherished his limited computer time which he had first access to as student. The more he learned about automata, automatic drawing, algorithms, rule-based methods, natural processes etc. the more his belief in religion (vs. spirituality) and in an omniscient creator was fundamentally challenged, causing years of deep internal turmoil and eventually leading him to leave the monastery to lead a secular life dedicated to making art as means to finding/reconciling answers.

    Even though both of our lives (and works) couldn't have been more different, we quickly found a kindred spirit and shared an awe of nature as primary source of inspiration. I'm sad we never met again in person, but his story and insights have stayed with me...

    (Remembering him today as I'm sorting through older pieces of mine, and it was him who originally encouraged me to investigate more plotter-based art forms/techniques, an advice I only heeded over a decade later... 🫶)

    RIP 🖤

    #TextureTuesday #AlgorithmicArt #PlotterArt #PenPlotter #Axidraw #ThingUmbrella

  24. Remembering dear Roman Verostko, who died this month two years ago, aged 94. An highly influential figure, not just for algorithmic art in general, but also for younger me personally, after meeting him during a panel discussion at the Victoria & Albert Museum in London and then corresponding for several years after...

    Living as a monk and ordained priest in the 1950/60s, he absolutely cherished his limited computer time which he had first access to as student. The more he learned about automata, automatic drawing, algorithms, rule-based methods, natural processes etc. the more his belief in religion (vs. spirituality) and in an omniscient creator was fundamentally challenged, causing years of deep internal turmoil and eventually leading him to leave the monastery to lead a secular life dedicated to making art as means to finding/reconciling answers.

    Even though both of our lives (and works) couldn't have been more different, we quickly found a kindred spirit and shared an awe of nature as primary source of inspiration. I'm sad we never met again in person, but his story and insights have stayed with me...

    (Remembering him today as I'm sorting through older pieces of mine, and it was him who originally encouraged me to investigate more plotter-based art forms/techniques, an advice I only heeded over a decade later... 🫶)

    RIP 🖤

    #TextureTuesday #AlgorithmicArt #PlotterArt #PenPlotter #Axidraw #ThingUmbrella

  25. Remembering dear Roman Verostko, who died this month two years ago, aged 94. An highly influential figure, not just for algorithmic art in general, but also for younger me personally, after meeting him during a panel discussion at the Victoria & Albert Museum in London and then corresponding for several years after...

    Living as a monk and ordained priest in the 1950/60s, he absolutely cherished his limited computer time which he had first access to as student. The more he learned about automata, automatic drawing, algorithms, rule-based methods, natural processes etc. the more his belief in religion (vs. spirituality) and in an omniscient creator was fundamentally challenged, causing years of deep internal turmoil and eventually leading him to leave the monastery to lead a secular life dedicated to making art as means to finding/reconciling answers.

    Even though both of our lives (and works) couldn't have been more different, we quickly found a kindred spirit and shared an awe of nature as primary source of inspiration. I'm sad we never met again in person, but his story and insights have stayed with me...

    (Remembering him today as I'm sorting through older pieces of mine, and it was him who originally encouraged me to investigate more plotter-based art forms/techniques, an advice I only heeded over a decade later... 🫶)

    RIP 🖤

    #TextureTuesday #AlgorithmicArt #PlotterArt #PenPlotter #Axidraw #ThingUmbrella

  26. Remembering dear Roman Verostko, who died this month two years ago, aged 94. An highly influential figure, not just for algorithmic art in general, but also for younger me personally, after meeting him during a panel discussion at the Victoria & Albert Museum in London and then corresponding for several years after...

    Living as a monk and ordained priest in the 1950/60s, he absolutely cherished his limited computer time which he had first access to as student. The more he learned about automata, automatic drawing, algorithms, rule-based methods, natural processes etc. the more his belief in religion (vs. spirituality) and in an omniscient creator was fundamentally challenged, causing years of deep internal turmoil and eventually leading him to leave the monastery to lead a secular life dedicated to making art as means to finding/reconciling answers.

    Even though both of our lives (and works) couldn't have been more different, we quickly found a kindred spirit and shared an awe of nature as primary source of inspiration. I'm sad we never met again in person, but his story and insights have stayed with me...

    (Remembering him today as I'm sorting through older pieces of mine, and it was him who originally encouraged me to investigate more plotter-based art forms/techniques, an advice I only heeded over a decade later... 🫶)

    RIP 🖤

    #TextureTuesday #AlgorithmicArt #PlotterArt #PenPlotter #Axidraw #ThingUmbrella

  27. Remembering dear Roman Verostko, who died this month two years ago, aged 94. An highly influential figure, not just for algorithmic art in general, but also for younger me personally, after meeting him during a panel discussion at the Victoria & Albert Museum in London and then corresponding for several years after...

    Living as a monk and ordained priest in the 1950/60s, he absolutely cherished his limited computer time which he had first access to as student. The more he learned about automata, automatic drawing, algorithms, rule-based methods, natural processes etc. the more his belief in religion (vs. spirituality) and in an omniscient creator was fundamentally challenged, causing years of deep internal turmoil and eventually leading him to leave the monastery to lead a secular life dedicated to making art as means to finding/reconciling answers.

    Even though both of our lives (and works) couldn't have been more different, we quickly found a kindred spirit and shared an awe of nature as primary source of inspiration. I'm sad we never met again in person, but his story and insights have stayed with me...

    (Remembering him today as I'm sorting through older pieces of mine, and it was him who originally encouraged me to investigate more plotter-based art forms/techniques, an advice I only heeded over a decade later... 🫶)

    RIP 🖤

    #TextureTuesday #AlgorithmicArt #PlotterArt #PenPlotter #Axidraw #ThingUmbrella

  28. CW: Fundraising for Open Source work & maintenance

    I don't do these often (only once or twice a year, if at all), but since I just lost the main sponsor of my open source work (forever grateful for their long & major support!), I urgently need to reach out to other people (especially users) for financial help with the continued development, documentation and maintenance efforts (incl. hosting costs) of the primarily 215 TypeScript libraries and 185 example projects in thi.ng/umbrella, but also other existing & still unreleased work/projects/tools (also Zig, Clojure)... The breadth and depth of the larger project is impossible to summarize (see project readme for an overview)

    I'm regularly posting updates related to these projects (and examples) using the #ThingUmbrella and #HowToThing hashtags.

    Being between roles, these donations are my only income at current, so every little helps! The projects have been in active long term development (some of them since 2016). In a typical irony of the universe kind of event, just yesterday the projects were featured on the frontpage of Hacker News[1] for over 12 hours and here's what some people had to say:

    "this is a absolutely remarkable set of libraries covering all kinds of nooks and cranies. It's worth putting on everyones list."

    "thi.ng is great and should really get more attention. The packages have a very clean and atomic structure, you can easily pick one or more and use them in your project."

    "This has been around for a long time and I've always been so surprised it has had seemingly so little traction outside of the author's own projects. The love and care and thoughtfulness of every library has always been so great to explore."

    If you have any questions, please reach out here (or via DM) or the issue tracker on Codeberg:

    codeberg.org/thi.ng/umbrella/i

    (I'm not always able to help [esp. when there are super detailed long requests/questions], but I'm doing my best to be helpful...)

    Deep gratitude and thank you to all my other supporters for your ongoing help and new ones for your consideration. Possible ways of funding are listed here (i.e. Liberapay, Stripe, Github Sponsors, Patreon):

    codeberg.org/thi.ng/umbrella/s

    🙏🫶

    Happy coding!

    [1] mastodon.thi.ng/@toxi/11672061

    #OpenSource #ThingUmbrella #Fundraising

  29. CW: Fundraising for Open Source work & maintenance

    I don't do these often (only once or twice a year, if at all), but since I just lost the main sponsor of my open source work (forever grateful for their long & major support!), I urgently need to reach out to other people (especially users) for financial help with the continued development, documentation and maintenance efforts (incl. hosting costs) of the primarily 215 TypeScript libraries and 185 example projects in thi.ng/umbrella, but also other existing & still unreleased work/projects/tools (also Zig, Clojure)... The breadth and depth of the larger project is impossible to summarize (see project readme for an overview)

    I'm regularly posting updates related to these projects (and examples) using the #ThingUmbrella and #HowToThing hashtags.

    Being between roles, these donations are my only income at current, so every little helps! The projects have been in active long term development (some of them since 2016). In a typical irony of the universe kind of event, just yesterday the projects were featured on the frontpage of Hacker News[1] for over 12 hours and here's what some people had to say:

    "this is a absolutely remarkable set of libraries covering all kinds of nooks and cranies. It's worth putting on everyones list."

    "thi.ng is great and should really get more attention. The packages have a very clean and atomic structure, you can easily pick one or more and use them in your project."

    "This has been around for a long time and I've always been so surprised it has had seemingly so little traction outside of the author's own projects. The love and care and thoughtfulness of every library has always been so great to explore."

    If you have any questions, please reach out here (or via DM) or the issue tracker on Codeberg:

    codeberg.org/thi.ng/umbrella/i

    (I'm not always able to help [esp. when there are super detailed long requests/questions], but I'm doing my best to be helpful...)

    Deep gratitude and thank you to all my other supporters for your ongoing help and new ones for your consideration. Possible ways of funding are listed here (i.e. Liberapay, Stripe, Github Sponsors, Patreon):

    codeberg.org/thi.ng/umbrella/s

    🙏🫶

    Happy coding!

    [1] mastodon.thi.ng/@toxi/11672061

    #OpenSource #ThingUmbrella #Fundraising

  30. Since it seems to come up every single time thi.ng is mentioned on HN or Reddit: Here's another partial clarification why and when the transition from originally mostly Clojure/ClojureScript to mostly TypeScript occurred:

    news.ycombinator.com/item?id=4

    It's not a comprehensive answer, but thi.ng always was a polyglot project. There're also parts written in (and for):

    There are infrastructure packages to simplify creation of ad hoc DSLs, their transpilation or interpretation, but also interop with WASM (so far mostly geared towards & tested with Zig), for example:

    In general, thi.ng projects range from super high level computational design concepts to low-level primitives like memory allocators and memory/data layout management (e.g. thi.ng/tinyalloc, thi.ng/malloc, thi.ng/simd, thi.ng/soa) and a huge spectrum of other things in between...

    #ThingUmbrella

  31. Since it seems to come up every single time thi.ng is mentioned on HN or Reddit: Here's another partial clarification why and when the transition from originally mostly Clojure/ClojureScript to mostly TypeScript occurred:

    news.ycombinator.com/item?id=4

    It's not a comprehensive answer, but thi.ng always was a polyglot project. There're also parts written in (and for):

    There are infrastructure packages to simplify creation of ad hoc DSLs, their transpilation or interpretation, but also interop with WASM (so far mostly geared towards & tested with Zig), for example:

    In general, thi.ng projects range from super high level computational design concepts to low-level primitives like memory allocators and memory/data layout management (e.g. thi.ng/tinyalloc, thi.ng/malloc, thi.ng/simd, thi.ng/soa) and a huge spectrum of other things in between...

    #ThingUmbrella

  32. Three years ago, I was busy finishing Marblemania, an endless algorithmic/generative realtime animation piece inspired by marbling, using softbody physics (but no actual fluid sim) and with thousands of variations and stylistic options...

    This video shows stills of a small sampling of these variations.

    More variations here (and in the #Marblemania hashtag):

    mastodon.thi.ng/@toxi/11068868
    mastodon.thi.ng/@toxi/11066757

    #TextureTuesday #Marblemania #AlgorithmicArt #GenerativeArt #Art #Marbling #Animation #ThingUmbrella

  33. @eniko @TomF @Moosader If you want to go even more meta, here's the repo for a workshop I ran with design students at Augsburg uni a few years ago to build a TIC-80 inspired fantasy console ourselves:

    github.com/thi-ng/fantasy-cons

    Written in TypeScript, includes custom DSL, runs in the browser, includes six demos (incl. bitmap font editor). More details in readme

    #FantasyConsole #Workshop #ThingUmbrella #TypeScript #TIC80 #RetroComputing #BitmapFont

  34. @eniko @TomF @Moosader If you want to go even more meta, here's the repo for a workshop I ran with design students at Augsburg uni a few years ago to build a TIC-80 inspired fantasy console ourselves:

    github.com/thi-ng/fantasy-cons

    Written in TypeScript, includes custom DSL, runs in the browser, includes six demos (incl. bitmap font editor). More details in readme

    #FantasyConsole #Workshop #ThingUmbrella #TypeScript #TIC80 #RetroComputing #BitmapFont

  35. Just installed the latest Zig master branch to check how much breakage (if any) the upcoming v0.17.0 release will cause in thi.ng/umbrella. Happy to report that it's only very few minor syntax changes:

    • std.fmt.bufPrintZ() => std.fmt.bufPrintSentinel() (w/ manually specified sentinel)
    • std.mem.Allocator.dupeZ() => std.mem.Allocator.dupeSentinel()
    • @Type(.EnumLiteral) => @EnumLiteral() (dynamic type creation)

    So far so good! 🤩

    #Zig #ThingUmbrella

  36. Just installed the latest Zig master branch to check how much breakage (if any) the upcoming v0.17.0 release will cause in thi.ng/umbrella. Happy to report that it's only very few minor syntax changes:

    • std.fmt.bufPrintZ() => std.fmt.bufPrintSentinel() (w/ manually specified sentinel)
    • std.mem.Allocator.dupeZ() => std.mem.Allocator.dupeSentinel()
    • @Type(.EnumLiteral) => @EnumLiteral() (dynamic type creation)

    So far so good! 🤩

    #Zig #ThingUmbrella

  37. #ReleaseDay The new version of thi.ng/geom-sdf is automatically preprocessing the vertices given for 2D polygons & polylines to remove any coincident and colinear ones (using Douglas-Peucker algorithm). This avoids some degenerate cases, but can also speed up the SDF evaluation of converted shapes in some other cases...

    Thanks to @made for reporting the issue! 🙏

    (To clarify: This package is for converting 2D shapes/geometries/SVG to composable SDF JavaScript/TypeScript functions, not for shader-based SDF use cases. For the latter, the thi.ng/shader-ast-stdlib package provides similar SDF functions/operators, for use with thi.ng/shader-ast and transpilation to GLSL)

    Some examples:

    thi.ng logo as SDF:
    demo.thi.ng/umbrella/geom-sdf-

    SVG smiley deformation:
    demo.thi.ng/umbrella/geom-sdf-

    #ThingUmbrella #SDF #SVG #Geometry #Shapes #TypeScript #JavaScript

  38. #ReleaseDay The new version of thi.ng/geom-sdf is automatically preprocessing the vertices given for 2D polygons & polylines to remove any coincident and colinear ones (using Douglas-Peucker algorithm). This avoids some degenerate cases, but can also speed up the SDF evaluation of converted shapes in some other cases...

    Thanks to @made for reporting the issue! 🙏

    (To clarify: This package is for converting 2D shapes/geometries/SVG to composable SDF JavaScript/TypeScript functions, not for shader-based SDF use cases. For the latter, the thi.ng/shader-ast-stdlib package provides similar SDF functions/operators, for use with thi.ng/shader-ast and transpilation to GLSL)

    Some examples:

    thi.ng logo as SDF:
    demo.thi.ng/umbrella/geom-sdf-

    SVG smiley deformation:
    demo.thi.ng/umbrella/geom-sdf-

    #ThingUmbrella #SDF #SVG #Geometry #Shapes #TypeScript #JavaScript

  39. Recently, at the library...

    "Have you got their new book 'Silk switch system problem'?"
    "No. Is that the sequel to 'Equiconnected nanosky oasis'?"
    "What's that?"
    "Oh, you've never read the 'Magnetic haze cycle' series? That's just too bad. It's full of cool ideas like the ultra-iridescent opcode sentinel, infraconnected division boundary, or even beige frontier mirror..."
    "Dude!"
    "Yeah, it's real porcelain ultra-peak! Absolutely life changing epoch omnicurve vision!"
    "I did like 'Supraviolet ring department'..."
    "Well, in that case, I'd recommend 'Macroluminous shimmer facet' instead. It's a good intro to all the abundant assembly craft."

    In preparation for some name/passphrase generator and LLM-poisoning projects/tools, I updated my online procedural text editor to be able to export generator specs/recipes directly as TypeScript source code for easy integration into your own projects...

    The above generator is here (the entire recipe is part of this super long URL):

    demo.thi.ng/umbrella/procedura

    More project & syntax info here:
    thi.ng/proctext

    #Microfiction #ProcGen #ProceduralText #ThingUmbrella #DSL #TypeScript #LLMPoisoning #NoAI

  40. Recently, at the library...

    "Have you got their new book 'Silk switch system problem'?"
    "No. Is that the sequel to 'Equiconnected nanosky oasis'?"
    "What's that?"
    "Oh, you've never read the 'Magnetic haze cycle' series? That's just too bad. It's full of cool ideas like the ultra-iridescent opcode sentinel, infraconnected division boundary, or even beige frontier mirror..."
    "Dude!"
    "Yeah, it's real porcelain ultra-peak! Absolutely life changing epoch omnicurve vision!"
    "I did like 'Supraviolet ring department'..."
    "Well, in that case, I'd recommend 'Macroluminous shimmer facet' instead. It's a good intro to all the abundant assembly craft."

    In preparation for some name/passphrase generator and LLM-poisoning projects/tools, I updated my online procedural text editor to be able to export generator specs/recipes directly as TypeScript source code for easy integration into your own projects...

    The above generator is here (the entire recipe is part of this super long URL):

    demo.thi.ng/umbrella/procedura

    More project & syntax info here:
    thi.ng/proctext

    #Microfiction #ProcGen #ProceduralText #ThingUmbrella #DSL #TypeScript #LLMPoisoning #NoAI

  41. Color Therapy. Noisy evolution.

    Two snapshots of my piece C-SCAPE, 2022, a multi-organism 1.5D cellular automata simulation. Patterns of symbiosis and annihilation.

    Made with thi.ng/cellular

    #CSCAPE #CellularAutomata #GenerativeArt #AlgorithmicArt #EvolutionaryArt #Abstract #Color #Texture #ThingUmbrella #NoAI

  42. Color Therapy. Noisy evolution.

    Two snapshots of my piece C-SCAPE, 2022, a multi-organism 1.5D cellular automata simulation. Patterns of symbiosis and annihilation.

    Made with thi.ng/cellular

    #CSCAPE #CellularAutomata #GenerativeArt #AlgorithmicArt #EvolutionaryArt #Abstract #Color #Texture #ThingUmbrella #NoAI

  43. PSA: Not that it was ambiguous beforehand, but these are times for stating things more clearly...

    All #ThingUmbrella package readme files are now clearly stating that these projects are "LLM-free, human-made and cared for software, maintained as part of the thi.ng/umbrella ecosystem and anti-framework" 🫡

    I cared for and tended this garden of hundreds of projects almost daily for close to 10 years[1] (even if the commit heatmap doesn't always show it). It's a testament to the things I've learned, built, explored and tried to share with the world, things which helped numerous people and companies (big & small) to realize their unique projects/products/services. I'm not gonna sacrifice this body of work and all this cohesion by watering/poisoning it with slopicides[2] and/or making it dependent on the great planetary token machine...

    In The Handmaid's Tale, I always found the moment about "freedom from" vs "freedom to" very poignant, albeit in a different/inverted sense to how it was used there: Traditionally, Open Source licenses have granted freedoms "to" certain things, especially unconstrained uses. But if licenses still have any meaning at all (highly debatable in this climate/age), we increasingly need alternative licenses/mechanisms to also grant our creations freedoms "from" certain uses/practices/people/orgs...

    [1] ...only the TypeScript/Umbrella parts counted here. Many other thi.ng projects are much older...
    [2] Have I just coined a new word?!

    #ThingUmbrella #OpenSource #NoAI

  44. PSA: Not that it was ambiguous beforehand, but these are times for stating things more clearly...

    All #ThingUmbrella package readme files are now clearly stating that these projects are "LLM-free, human-made and cared for software, maintained as part of the thi.ng/umbrella ecosystem and anti-framework" 🫡

    I cared for and tended this garden of hundreds of projects almost daily for close to 10 years[1] (even if the commit heatmap doesn't always show it). It's a testament to the things I've learned, built, explored and tried to share with the world, things which helped numerous people and companies (big & small) to realize their unique projects/products/services. I'm not gonna sacrifice this body of work and all this cohesion by watering/poisoning it with slopicides[2] and/or making it dependent on the great planetary token machine...

    In The Handmaid's Tale, I always found the moment about "freedom from" vs "freedom to" very poignant, albeit in a different/inverted sense to how it was used there: Traditionally, Open Source licenses have granted freedoms "to" certain things, especially unconstrained uses. But if licenses still have any meaning at all (highly debatable in this climate/age), we increasingly need alternative licenses/mechanisms to also grant our creations freedoms "from" certain uses/practices/people/orgs...

    [1] ...only the TypeScript/Umbrella parts counted here. Many other thi.ng projects are much older...
    [2] Have I just coined a new word?!

    #ThingUmbrella #OpenSource #NoAI

  45. #ReleaseDay thi.ng/column-store is an in-memory database with customizable column types, extensible query engine, bitfield indexing for query acceleration, JSON serialization with optional RLE compression.

    The new version introduces support for arbitrarily nested queries and merging of sub-query results using a choice of AND (intersection/constraint), OR (union/alternative) or NAND/NOR (negated versions) semantics.

    docs.thi.ng/umbrella/column-st

    Also without query nesting, each individual query term's results can be merged as union now. The previous behavior only allowed for term result intersections, with each subsequent term further narrowing the total result set. This behavior limited the types of compound queries possible and therefore required multiple separate queries and additional user effort to merge results manually. Well, no more! :)

    docs.thi.ng/umbrella/column-st

    Another (intentional) side effect: Since queries are defined declaratively, creating complex queries is much easier (and legible) now via composition and re-use of predefined sub-queries. The support for nesting also simplifies the creation of user-defined query DSLs (domain specific languages).

    As before, for columns with bitmap indexing enabled, most of the query operators are extremely fast since only bit masks need to be combined and no actual row or column data is being visited. The latter is only necessary for predicate-based matchXXX() operators...

    #ThingUmbrella #OpenSource #Database #QueryEngine #TypeScript #BitField

  46. #ReleaseDay thi.ng/column-store is an in-memory database with customizable column types, extensible query engine, bitfield indexing for query acceleration, JSON serialization with optional RLE compression.

    The new version introduces support for arbitrarily nested queries and merging of sub-query results using a choice of AND (intersection/constraint), OR (union/alternative) or NAND/NOR (negated versions) semantics.

    docs.thi.ng/umbrella/column-st

    Also without query nesting, each individual query term's results can be merged as union now. The previous behavior only allowed for term result intersections, with each subsequent term further narrowing the total result set. This behavior limited the types of compound queries possible and therefore required multiple separate queries and additional user effort to merge results manually. Well, no more! :)

    docs.thi.ng/umbrella/column-st

    Another (intentional) side effect: Since queries are defined declaratively, creating complex queries is much easier (and legible) now via composition and re-use of predefined sub-queries. The support for nesting also simplifies the creation of user-defined query DSLs (domain specific languages).

    As before, for columns with bitmap indexing enabled, most of the query operators are extremely fast since only bit masks need to be combined and no actual row or column data is being visited. The latter is only necessary for predicate-based matchXXX() operators...

    #ThingUmbrella #OpenSource #Database #QueryEngine #TypeScript #BitField

  47. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  48. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  49. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  50. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev