object-dom

Declarative dom with 1:1 mapping of objects and tags, typed css, reactive updates and no bundler needed.

Usage no npm install needed!

<script type="module">
  import objectDom from 'https://cdn.skypack.dev/object-dom';
</script>

README

object-dom

Declarative dom with 1:1 mapping of objects and tags, typed css, reactive updates and no bundler needed.

styled with prettier Tests Published on npm

  • ✅ No Dependencies
  • ✅ ES Modules
  • ✅ Full Browser Support
  • ✅ Full types for CSS
  • ✅ Full types for DOM Events
  • ✅ Full types for Attributes
  • ✅ 100% Typescript

Supported Tags

https://www.w3schools.com/TAGS/default.ASP

Tag Class Description
<a> A Defines a hyperlink
<abbr> Abbr Defines an abbreviation or an acronym
<address> Address Defines contact information for the author/owner of a document
<area> Area Defines an area inside an image map
<article> Article Defines an article
<aside> Aside Defines content aside from the page content
<audio> Audio Defines embedded sound content
<b> B Defines bold text
<base> Base Specifies the base URL/target for all relative URLs in a document
<bdi> Bdi Isolates a part of text that might be formatted in a different direction from other text outside it
<bdo> Bdo Overrides the current text direction
<blockquote> Blockquote Defines a section that is quoted from another source
<body> Body Defines the document's body
<br> Br Defines a single line break
<button> Button Defines a clickable button
<canvas> Canvas Used to draw graphics, on the fly, via scripting (usually JavaScript)
<caption> Caption Defines a table caption
<cite> Cite Defines the title of a work
<code> Code Defines a piece of computer code
<col> Col Specifies column properties for each column within a <colgroup> element
<colgroup> Colgroup Specifies a group of one or more columns in a table for formatting
<data> Data Adds a machine-readable translation of a given content
<datalist> Datalist Specifies a list of pre-defined options for input controls
<dd> Dd Defines a description/value of a term in a description list
<del> Del Defines text that has been deleted from a document
<details> Details Defines additional details that the user can view or hide
<dfn> Dfn Specifies a term that is going to be defined within the content
<dialog> Dialog Defines a dialog box or window
<div> Div Defines a section in a document
<dl> Dl Defines a description list
<dt> Dt Defines a term/name in a description list
<em> Em Defines emphasized text
<embed> Embed Defines a container for an external application
<fieldset> Fieldset Groups related elements in a form
<figcaption> Figcaption Defines a caption for a <figure> element
<figure> Figure Specifies self-contained content
<footer> Footer Defines a footer for a document or section
<form> Form Defines an HTML form for user input
<h1> H1 Defines HTML headings
<h2> H2 Defines HTML headings
<h3> H3 Defines HTML headings
<h4> H4 Defines HTML headings
<h5> H5 Defines HTML headings
<h6> H6 Defines HTML headings
<head> Head Contains metadata/information for the document
<header> Header Defines a header for a document or section
<hr> Hr Defines a thematic change in the content
<html> Html Defines the root of an HTML document
<i> I Defines a part of text in an alternate voice or mood
<iframe> Iframe Defines an inline frame
<img> Img Defines an image
<input> Input Defines an input control
<ins> Ins Defines a text that has been inserted into a document
<kbd> Kbd Defines keyboard input
<label> Label Defines a label for an <input> element
<legend> Legend Defines a caption for a <fieldset> element
<li> Li Defines a list item
<link> Link Defines the relationship between a document and an external resource (most used to link to style sheets)
<main> Main Specifies the main content of a document
<map> Map Defines an image map
<mark> Mark Defines marked/highlighted text
<meta> Meta Defines metadata about an HTML document
<meter> Meter Defines a scalar measurement within a known range (a gauge)
<nav> Nav Defines navigation links
<noscript> Noscript Defines an alternate content for users that do not support client-side scripts
<object> Obj Defines a container for an external application
<ol> Ol Defines an ordered list
<optgroup> Optgroup Defines a group of related options in a drop-down list
<option> Option Defines an option in a drop-down list
<output> Output Defines the result of a calculation
<p> P Defines a paragraph
<param> Param Defines a parameter for an object
<picture> Picture Defines a container for multiple image resources
<pre> Pre Defines preformatted text
<progress> Progress Represents the progress of a task
<q> Q Defines a short quotation
<rp> Rp Defines what to show in browsers that do not support ruby annotations
<rt> Rt Defines an explanation/pronunciation of characters (for East Asian typography)
<ruby> Ruby Defines a ruby annotation (for East Asian typography)
<s> S Defines text that is no longer correct
<samp> Samp Defines sample output from a computer program
<script> Script Defines a client-side script
<section> Section Defines a section in a document
<select> Select Defines a drop-down list
<small> Small Defines smaller text
<source> Source Defines multiple media resources for media elements (<video> and <audio>)
<span> Span Defines a section in a document
<strong> Strong Defines important text
<style> Style Defines style information for a document
<sub> Sub Defines subscripted text
<summary> Summary Defines a visible heading for a <details> element
<sup> Sup Defines superscripted text
<svg> Svg Defines a container for SVG graphics
<table> Table Defines a table
<tbody> Tbody Groups the body content in a table
<td> Td Defines a cell in a table
<template> Template Defines a container for content that should be hidden when the page loads
<textarea> Textarea Defines a multiline input control (text area)
<tfoot> Tfoot Groups the footer content in a table
<th> Th Defines a header cell in a table
<thead> Thead Groups the header content in a table
<time> Time Defines a specific time (or datetime)
<title> Title Defines a title for the document
<tr> Tr Defines a row in a table
<track> Track Defines text tracks for media elements (<video> and <audio>)
<u> U Defines some text that is unarticulated and styled differently from normal text
<ul> Ul Defines an unordered list
<var> Var Defines a variable
<video> Video Defines embedded video content
<wbr> Wbr Defines a possible line-break

Available Methods

  • jsonTable
  • render
  • generateHtml
  • parseHtml
  • textContent

Getting Started

Functional Approach

<div id="root"></div>
<script type="module">
  import { Div, P, Button, Row, Column, render } from "object-dom";

  const label = new P({ text: "Hello World!" });
  const button = new Button({
    text: "Update",
    styles: { width: "100px" },
  });
  const app = new Div({
    children: [
      new Column({
        children: [
          label,
          button,
          new Row({
            styles: { padding: "10px" },
            children: ["A", "B", "C"],
          }),
        ],
      }),
    ],
  });
  button.addEventListener('click', () => {
     label.text = "New Update!";
  }, false);
  render(app, document.body.querySelector("#root"));
</script>

Class Approach

import { ObjectDom, Div, H1, Button, Row, Canvas } from "object-dom";

export class MyApp extends ObjectDom {
  render = () => {
    return new Div({
      children: [new H1({ text: "Counter Example" }), new Counter(), new CanvasExample()],
    });
  };
}

class Counter extends ObjectDom {
  value = 0;
  render() {
    return new Div({
      styles: { margin: "5px" },
      children: [
        `${this.value}`,
        new Row({
          children: [
            new Button({
              text: "-",
              styles: { width: "50px" },
              events: {
                click: () => {
                  this.value -= 1;
                  this.update();
                },
              },
            }),
            new Button({
              text: "+",
              styles: { width: "50px", marginLeft: "5px" },
              events: {
                click: () => {
                  this.value += 1;
                  this.update();
                },
              },
            }),
          ],
        }),
      ],
    });
  }
}

class CanvasExample extends ObjectDom {
  render() {
    return new Canvas({
      styles: { width: "200px", height: "200px" },
      onCreate: (node) => {
        const canvas = node as HTMLCanvasElement;
        const ctx = canvas.getContext("2d")!;

        // Create gradient
        const grd = ctx.createRadialGradient(75, 50, 5, 90, 60, 100);
        grd.addColorStop(0, "red");
        grd.addColorStop(1, "white");

        // Fill with gradient
        ctx.fillStyle = grd;
        ctx.fillRect(10, 10, 150, 80);
      },
    });
  }
}

render(new MyApp(), document.body.querySelector("#root"));

JSON Table

jsonTable(
  [
    {
      first_name: "John",
      last_name: "Smith",
      company: "N/A",
    },
    {
      first_name: "Steve",
      last_name: "Jobs",
      company: "Apple",
    },
    {
      first_name: "Bill",
      last_name: "Gates",
      company: "Microsoft",
    },
    {
      first_name: "Elon",
      last_name: "Musk",
      company: "Tesla",
    },
  ],
  { style: { margin: "10px" } }
);

Which renders the following html:

<table>
  <tr>
    <th>first_name</th>
    <th>last_name</th>
    <th>company</th>
  </tr>
  <tr>
    <td>John</td>
    <td>Smith</td>
    <td>N/A</td>
  </tr>
  <tr>
    <td>Steve</td>
    <td>Jobs</td>
    <td>Apple</td>
  </tr>
  <tr>
    <td>Bill</td>
    <td>Gates</td>
    <td>Microsoft</td>
  </tr>
  <tr>
    <td>Elon</td>
    <td>Musk</td>
    <td>Tesla</td>
  </tr>
</table>