No description
Find a file
2025-02-17 15:23:22 +01:00
documentation Document render module 2025-02-17 14:51:58 +01:00
.editorconfig Add basic editorconfig 2024-06-24 12:27:05 +02:00
domProxy.js Add meta-tag domProxy 2024-02-06 22:56:08 +01:00
importmaps.html Add importmaps snippet 2025-02-17 15:23:01 +01:00
jsconfig.json Add jsdoc class annotations to skooma module 2024-02-12 13:38:57 +01:00
license.md Update metadata 2023-10-04 10:35:56 +02:00
mini.js Improved case rewriting 2025-02-17 15:13:56 +01:00
observable.js More code documentation 2024-06-24 13:04:42 +02:00
package.json Rename to nyooom 2025-02-10 11:12:21 +01:00
readme.md Update readme 2025-02-17 15:23:22 +01:00
ref.js Extract Ref class into separate module 2024-02-29 15:33:26 +01:00
render.js Improved case rewriting 2025-02-17 15:13:56 +01:00

Nyooom

import {html} from "nyooom/render.js"

document.body.append(
	html.p(
		"This is a paragraph with some text ",
		html.b("and some bold text "),
		html.img({
			alt: "And an image",
			href: "http://picsum.photos/200/200"
		})
	)
)

Goals

  1. nyooom/render should stay small enough to use it as just a helper library to generate some dom nodes in any sort of web environment.
  2. nyooom/observable should likewise function as a standalone reactive state management library to be used with or without a framework
  3. A developer who doesn't use nyooom should be able to read any code using it and piece together what it does based on structure and function names
  4. Nyooom should be easy to gradually introduce into an application that uses a different framework or no framework at all
  5. Nyooom should make it easy to gradually replace it with a different solution should it prove unfit for a project it is being used in
  6. The library should be hackable so that developers can tweak it for different environments like SSR or frameworks

Warning

This branch is in the process of being aggressively refactored and improved. This readme file may not reflect the latest state of the interface.

Overview

const text = new State({value: "Nyooom is cool"})
setTimeout(() => {text.value = "Nyooom is awesome!"}, 1e5)

document.body.append(html.div(
    html.h1("Hello, World!"),
    html.p(text, {class: "amazing"}),
    html.button("Show Proof", {click: event => { alert("It's true!") }})
))

Importmaps

The included file importmaps.html can be used as a starting point for importing nyooom via importmaps in a minimal environment. Search-and-replace ./ to wherever the library should be loaded from if necessary.

A few more examples:

Create a Button that deletes itself:

document.body.append(
	html.button("Delete Me", {click: event => event.target.remove()})
)

Turn a two-dimensional array into an HTML table:

const table = rows =>
	html.table(html.tbody(rows.map(
		row => html.tr(row.map(
			cell => html.rd(cell, {dataset: {
				content: cell.toLowerCase(),
			}})
		))
	)))

A list that you can add items to

let list, input = ""
document.body.append(html.div([
	list=html.ul(),
	html.input({type: 'text', input: e => input = e.target.value}),
	html.button({click: event => list.append(html.li(input))}, "Add"),
]))

A list that you can also delete items from

const listItem = content => html.li(
	html.span(content), " ", html.a("[remove]", {
		click: event => event.target.closest("li").remove(),
		style: { cursor: 'pointer', color: 'red' },
	})
)
let list, input = ""
document.body.append(html.div([
	list=html.ul(),
	html.input({type: 'text', input: e => input = e.target.value}),
	html.button({click: event => list.append(listItem(input))}, "Add"),
]))