Skip to content

JDOM is a JQuery like DOM selector! It includes JDOM-Template, an optional reactive Library built on top of JS-Template-Strings.

Notifications You must be signed in to change notification settings

interaapps/jdom

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JDOM 3.1.11

A wrapper for query selector and html elements + templating & reactivity framework

Install

NPM

npm install jdomjs

Module

import { $, $n, $c, $r, $h, JDOM } from 'https://cdn.jsdelivr.net/npm/jdomjs@3.1.11'

HTML import

<script src="https://cdn.jsdelivr.net/npm/jdom@3.1.11/dist/jdom.js"></script>

DOM Manipulation

const el = $('#a-div') el.css({ background: '#000000' }) el.each($el => { console.log(el.html()) }) el.text('Hello world') el.html('<span>Hello</span> world') el.attr('key', value) el.classes('hello', 'world') if (el.hasClass('hello')) {} // Builder pattern el.text('Example').attr('type', 'text').classes('input-big') el.click(e => { console.log(e) })

Create Element

$('#app').append( // Creates a new div with 'Hey' text $n('div').text('Hey') )

Create element from HTML

const name = 'John' const el = $h(`<h1>Hello ${name}!</h1>`) console.log(el) // -> JDOM(HTMLElement)

Animator

// Single animation $('#test').animate({ background: '#000000' }, 1000) // Using animator $('#test').animator([ { duration: 1000, css: { background: '#FF0000' } }, { duration: 1000, css: { background: '#00FF00' } } ])

Web-Components

<my-component></my-component> <script> // Create HTMLElement const MyComponent = $c((el, component) => { el.append( $n('span') .text('Hello World') .click(() => { alert('Hey') }) ) component.addStyle(`span { color: red }`) }/*, {shadowed: true} */) // Register component $r('my-component', MyComponent) </script>

Typescript Class-Component

import {html, JDOMComponent} from 'jdomjs' import {CustomElement, State, Attribute} from "jdomjs/decorator.ts"; @CustomElement('example-component') // This will register the component on customElements class ExampleComponent extends JDOMComponent { private name = new Hook<String>('John') private lastName = new Hook<String>('default') private greetings = computed(() => comp`Hello ${this.name}`) constructor() { super(); super.addAttributeListener('lastName', {name: 'last-name'}) } render() { return html`  <input :bind=${this.name}>  <h1>${this.greetings}</h1>  ` } }

Javascript Class-Component

import {html, JDOMComponent, $r} from 'jdomjs' class ExampleComponent extends JDOMComponent { private name = new Hook('John') private lastName = new Hook('default') constructor() { super(); this.addAttributeListener('lastName', { name: 'last-name' }) } private greetings() { return comp`Hello ${this.name}` } render() { return html`  <input :bind=${this.name}>  <h1>${this.greetings()}</h1>  ` } } $r('example-component', ExampleComponent)

Shadowed Component

import {html, JDOMShadowComponent, $r} from 'jdomjs' class ExampleComponent extends JDOMShadowComponent { ... } $r('example-component', ExampleComponent)

JDOM-Template

import { html } from 'jdomjs' const name = "John" const myHTML = html`  <h1>Hello ${name}</h1>  <button @click=${() => alert('Clicked')}>Click me</button> ` $(document).append(myHTML) // binding const name = state('John') html`  name: ${name} <br>  <input :bind=${name}> `

Reactivity

import { state, html, $ } from 'jdomjs' const count = state(0) const button = html`  <button @click=${() => count.value++}>The count is ${count}</button> ` $(document).append(button)

if-confitions

// if-condition html`  <!-- Reactive if condition with ternary operator -->  ${computed(() =>   isEnabled.value   ? html`<div>Now shown!</div>` // If true render this div   : null, // If false render nothing  [isEnabled])}    <!-- :if attribute -->  <div :if=${isEnabled} @click=${() => alert('Yo')}>  Now I'm shown :o  </div>  <div :else>  Not shown :(  </div>  <div></div> `

Reactive for-each

html`  ${computed(() => elements.value.map(user => html`  <div>  <span>${user.name}</span>  </div>  `), [elements])}   <button @click=${() => elements.value = [...elements.value, {name: 'Joe'}]}>Add Element</button> ` // Or use Helper-Component import { ForEach } from 'jdomjs/template/helper/components.js' html`  <${ForEach}   :bind=${elements}  :content=${user => html`  <div>  <span>${user.name}</span>  </div>  `}  />    <button @click=${() => elements.value = [...elements.value, {name: 'Joe'}]}>Add Element</button> `

Function-Components

// Function components function UserLayout({ exampleProp, $slot }) { return html`<div class="user-profile">  ${$slot}  </div>` } html`<${UserLayout} exampleProp="test">  Profile </${UserLayout}>`

Promise-Handling

const promise = fetch('/user/name') html`${promise.then(r => r.json()).then(u => u.name)}` // Or use Helper-Component import { Awaiting } from 'jdomjs/template/helper/components.js' const promise = fetch('/api/user') html`  <${Awaiting}   promise=${promise.then(r => r.json())}  finished=${user => html`<${User} user=${user} />`}  awaiting${html`<${LoadingIndicator} />`}  error="Something went wrong"  /> `

JDOM-Hooks

import { state, computed, watch, bind, $, $c, $r, html } from 'jdom' // Create a state const name = state('John') // Set value name.value = 'Jessica' // Read value console.log(name.value) // Add to JDOM $('#user-name').text(name) // Add to jdom-template html`Hello ${name}` // computed const lowerCaseName = computed(() => { return name.value.toLowerCase() }, [name]) // <- Dependencies. The function given will be called if one of the dependencies change // Helper template-string-tag: const greeting = comp`Hello ${name}!` // Watch watch([name], () => { console.log(`Name changed to ${name}!`) }) // Bindings in components $r('my-example-component', $c((el, component) => { const value = bind(component) return html`Your name is ${value}` })) // <my-example-component value="test" /> -> Your name is test 

About

JDOM is a JQuery like DOM selector! It includes JDOM-Template, an optional reactive Library built on top of JS-Template-Strings.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published