Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

base-element

An element authoring library for creating standalone and performant elements.

build statusNPM versionexperimental

Sauce Test Status

View this example List element in use with:

Or other examples:

example usage

You can construct your element API however you choose. A way that I prefer is by inheriting prototypes:

varBaseElement=require('base-element')functionBear(){BaseElement.call(this)}Bear.prototype=Object.create(BaseElement.prototype)// Or inherits(Bear, BaseElement)// Or class Bear extends BaseElement

Then build your elements:

Bear.prototype.render=function(typeOfBear){// Create a virtual DOM treevarvtree=this.html('div.bear',['Im a '+typeOfBear+'!'])// Call afterRender with your vtree when returning your vtreereturnthis.afterRender(vtree)}

Prefer just functions?

If you prefer just functions, an alternative interface is available:

varcreateElement=require('base-element')// Create an element on a parentvarel=createElement(document.body)el.render(function(){// Render a button upon clicked will alertreturnel.html('button',{onclick: function(e){window.alert(e.target.innerText+' button was clicked')}},'click me')})

data down, events up

DOMs work best (in the opinion of myself and many) when data goes down and event (or actions) go up.

A simple example is a button element that changes when clicked. How it changes is up to the element but what it changes to is up to the user.

This is our Button element:

varBaseElement=require('base-element')functionButton(){BaseElement.call(this)}Button.prototype=Object.create(BaseElement.prototype)// Or inherits(Button, BaseElement)// Or class Button extends BaseElementButton.prototype.render=function(label){varself=this// The "label" data is coming downvarvtree=this.html('button',{onclick: function(event){// We send the "clicked" event upself.send('clicked',event.target)}},label)returnthis.afterRender(vtree)}

and this is the user's implementation, creates a button and on every click it changes to a random number:

varbutton=require('your-button')()button.addEventListener('clicked',function(node){button.render('button label '+Math.random())})

nested architecture

Elements created using base-element are intended on being shared and extended by others. Each element should not require an additional library/framework to run it or be injected into it in order to be ran. Elements should be standalone.

For example if you create an input-box element and published on npm:

varBaseElement=require('base-element')functionInputBox(el){BaseElement.call(this,el)}InputBox.prototype=Object.create(BaseElement.prototype)module.exports=InputBoxInputBox.prototype.render=function(value){// Builds an <input value="{value}: />returnthis.afterRender(this.html('input',{onkeyup: function(e){// When keys are typed in it we send the value upthis.send('changed',e.target.value)}.bind(this),value: value||''}))}

Later yourself or another user can extend input-box to add functionality on top, such as email-input:

varInputBox=require('input-box')functionEmailInput(el){InputBox.call(this,el)// When we receive a "changed" event from InputBox, handle it herethis.addEventListener('changed',function(text){/* Perform some email validation on text here, then render() if we need an update */})}EmailInput.prototype=Object.create(InputBox.prototype)module.exports=EmailInputEmailInput.prototype.render=function(data){data=data||{}varvtree=this.html('div',[// Put a <label>Enter your email</label> inside this <div>this.html('label',data.label||'Enter your email'),// Call the InputBox's renderInputBox.prototype.render(data.value)])// Return the virtual DOM treereturnthis.afterRender(vtree)}

Both input-box and email-input can be ran on their own. When input-box updates over time, email-input can stay on a previous version until an upgrade can be made.

install

npm with browserify, webpack, etc

  • npm install base-element
  • var BaseElement = require('base-element')

standalone

  • copy/download/etc dist/base-element.js
  • <script src="base-element.js"></script>
  • <script>var element = new BaseElement()</script>

api

var element = new BaseElement([attachTo])

attachTo is a DOM element you want to append to such as document.body

By default, the element will not attach itself to a parent node. This is useful for handling the rendering on your own.

element.send(name[, params...])

Sends an event up with a given name and params.

element.addEventListener(name, function)

Register an event listener for a given name:

element.addEventListener('clicked',function(params){})

element.afterRender([params...])

This method needs to be called when returning a constructed virtual tree. It will detect if we are at the top of the render tree and perform the DOM diff and patching.

Button.prototype.render=function(data){varvtree=this.html('button')returnthis.afterRender(vtree)}

element.html(tag[, options], value)

A convenience wrapper for creating virtual-hyperscript nodes, i.e.:

varh=require('virtual-dom/h')varvtree=h('div','Testing')// is the same asvarvtree=this.html('div','Testing')

element.toString([data...])

For rendering your element as a string of HTML. data is any initial data passed to your render function.

element.element

The root DOM node the virtual tree resides on.

element.vtree

The current virtual DOM tree of the base element.

default events

load and unload events will be sent by default if your top level element registers this as it's properties:

varBaseElement=require('base-element')functionButton(el){BaseElement.call(this,el)this.addEventListener('load',function(node){console.log(node+' has loaded!')})this.addEventListener('unload',function(node){console.log(node+' has unloaded!')})}Button.prototype.render=function(data){// The top level element is provided with `this`, events will be firedreturnthis.afterRender(this.html('button',this,'click me'))}

similar projects

  • vel create and render virtual-dom elements with ease

license

(c) 2015 Kyle Robinson Young. MIT License

About

🔰 An element authoring library for creating standalone and performant elements.

Resources

Stars

82 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages