npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

object-dom

v0.7.0

Published

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

Downloads

18

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>