snabbis
An opinionated domain specific language for snabbdom.
API overview
- attach
- tag
- module s
- id
- classes
- classed
- style
- css
- attrs
- key
- on
- on_
- hook
- hooks
- props
- dataset
- input
- checkbox
- button
- textarea
- select
- TagData
- h
- VNode
- VNodeData
- Patch
- module tags
- factory
- div
- span
- p
- pre
- em
- strong
- b
- i
- u
- strike
- small
- table
- tbody
- thead
- tfoot
- tr
- td
- th
- h1
- h2
- h3
- h4
- h5
- h6
- li
- ul
- ol
- option
Documentation
-
attach:
<S>(root: HTMLElement, init_state: S, setup_view: (store: Store<S>) => () => vnode.VNode, patch?: Patch) => (setup_next_view: (store: Store<S>) => () => vnode.VNode) => void
Attach a view to a reactive lens store initialized at some state.
Suggested usage:
declare ;declare ;if module.hotReturns the reattach function.
-
tag:
(tag_name_classes_id: string, ...tag_data: Array<TagData>) => vnode.VNode
Make a VNode
toHTMLtag'span#faq.right'// => '<span id="faq" class="right"></span>'toHTMLtag'table .grid12 .tiny #mainTable'// => '<table id="mainTable" class="grid12 tiny"></table>'toHTMLtag'.green'// => '<div class="green"></div>'You can use strings for text:
toHTMLtag'span', 'Loreen ispun'// => '<span>Loreen ispun</span>'You can nest tags:
toHTMLtag'span', 'Announcement: ', tag'em', 'hello world', '!'// => '<span>Announcement: <em>hello world</em>!</span>'You can pass arrays:
toHTMLtag'div', arr.maptag'span', e// => '<div><span>apa</span><span>bepa</span></div>'You may also pass booleans, undefined/null and those will be filtered out:
toHTMLtag'span', largest// => '<span>y largest</span>'toHTMLtag'span', d, d// => '<span>3</span>'The other kinds of content to the tag function are documented by their respective function.
Note: this documentation has imported
snabbis
like so:Feel free to rename
tag
ors
to whatever you feel beautiful, example:The documentation also uses
toHTML
from thesnabbdom-to-html
.
module s
-
id:
(id: string) => TagData
Set the id
toHTMLtag'div', s.id'root'// => '<div id="root"></div>' -
classes:
(classes: Record<string, boolean>) => TagData
Set some classes
toHTMLtag'div', s.classes// => '<div class="example"></div>'toHTMLtag'div', s.classes, s.classes// => '<div class="nav strip left-side"></div>'toHTMLtag'div', s.classes, s.classes// => '<div></div>' -
classed:
(...classnames: Array<string>) => TagData
Set one or more classes
toHTMLtag'div', s.classed'navbar'// => '<div class="navbar"></div>'toHTMLtag'div', s.classed'colourless', 'green', 'idea', 'sleeping', 'furious'// => '<div class="colourless green idea sleeping furious"></div>'Since you cannot have class names with spaces, the string is split on whitespace:
toHTMLtag'div', s.classed' colourless green idea sleeping furious '// => '<div class="colourless green idea sleeping furious"></div>'Whitespace-only strings vanish:
toHTMLtag'div', s.classed'', ' '// => '<div></div>' -
style:
(styles: VNodeStyle) => TagData
Set some styles
toHTMLtag'div', s.style// => '<div style="display: inline-block; text-transform: uppercase"></div>' -
css:
(styles: VNodeStyle) => TagData
-
attrs:
(attrs: Record<string, string | number | boolean>) => TagData
Set some attributes
toHTMLtag'div', s.attrs// => '<div example="1"></div>'toHTMLtag'div', s.attrs, s.attrs// => '<div a="1" b="2" c="3"></div>'toHTMLtag'div', s.attrs, s.attrs// => '<div a="2"></div>' -
key:
(key: string | number) => TagData
Set the key, used to identify elements when diffing
tag'div', s.key'example_key'.key// => 'example_key' -
on:
<N extends "abort" | "activate" | "beforeactivate" | "beforecopy" | "beforecut" | "beforedeactivate" | "beforepaste" | "blur" | "canplay" | "canplaythrough" | "change" | "click" | "contextmenu" | "copy" | "cuechange" | "cut" | "dblclick" | "deactivate" | "drag" | "dragend" | "dragenter" | "dragleave" | "dragover" | "dragstart" | "drop" | "durationchange" | "emptied" | "ended" | "error" | "focus" | "input" | "invalid" | "keydown" | "keypress" | "keyup" | "load" | "loadeddata" | "loadedmetadata" | "loadstart" | "mousedown" | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup" | "mousewheel" | "MSContentZoom" | "MSManipulationStateChanged" | "paste" | "pause" | "play" | "playing" | "progress" | "ratechange" | "reset" | "scroll" | "seeked" | "seeking" | "select" | "selectstart" | "stalled" | "submit" | "suspend" | "timeupdate" | "volumechange" | "waiting" | "ariarequest" | "command" | "gotpointercapture" | "lostpointercapture" | "MSGestureChange" | "MSGestureDoubleTap" | "MSGestureEnd" | "MSGestureHold" | "MSGestureStart" | "MSGestureTap" | "MSGotPointerCapture" | "MSInertiaStart" | "MSLostPointerCapture" | "MSPointerCancel" | "MSPointerDown" | "MSPointerEnter" | "MSPointerLeave" | "MSPointerMove" | "MSPointerOut" | "MSPointerOver" | "MSPointerUp" | "touchcancel" | "touchend" | "touchmove" | "touchstart" | "webkitfullscreenchange" | "webkitfullscreenerror" | "pointercancel" | "pointerdown" | "pointerenter" | "pointerleave" | "pointermove" | "pointerout" | "pointerover" | "pointerup" | "wheel">(event_name: N) => (h: (e: HTMLElementEventMap[N]) => void) => TagData
Insert an event handler which is in the
HTMLElementEventMap
tag'div',s.on'keydown'.data.on.keydown !== undefined// => true -
on_:
(event_name: string, h: (e: Event) => void) => TagData
Insert an event handler with any name
tag'div',s.on_'keydown',.data.on.keydown !== undefined// => true -
hook:
<N extends "pre" | "init" | "create" | "insert" | "prepatch" | "update" | "postpatch" | "destroy" | "remove" | "post">(hook_name: N) => (h: Hooks[N]) => TagData
Insert a
snabbdom
hooktag'div',s.hook'insert'console.log'inserted vnode', vn, 'associated with dom element', vn.elm}.data.hook.insert !== undefined// => true -
hooks:
(hooks: Hooks) => TagData
Insert
snabbdom
hookstag'div',s.hooks.data.hook.insert !== undefined// => true -
props:
(props: Record<string, any>) => TagData
Set some properties (ambient data attached to dom nodes)
tag'div', s.props.data.props// => {example: 1}tag'div', s.props, s.props.data.props// => {a: 1, b: 2, c: 3}tag'div', s.props, s.props.data.props// => {a: 2} -
dataset:
(dataset: Record<string, string>) => TagData
Set data attribute
tag'div', s.dataset.data.dataset.foo// => 'bar' -
input:
(store: Store<string>, onEnter?: () => void, ...tag_data: Array<TagData>) => vnode.VNode
-
checkbox:
(store: Store<boolean>, ...tag_data: Array<TagData>) => vnode.VNode
-
button:
(label: string, onClick: () => void, ...tag_data: Array<TagData>) => vnode.VNode
-
textarea:
(store: Store<string>, rows?: number, cols?: number, ...tag_data: Array<TagData>) => vnode.VNode
-
select:
(stored: Store<string>, keys: Store<Array<string>>, option: (key: string, index: number) => vnode.VNode, ...tag_data: Array<TagData>) => vnode.VNode
-
TagData:
undefined
Content to put in a
tag
-
h:
{ (sel: string): vnode.VNode; (sel: string, data: vnode.VNodeData): vnode.VNode; (sel: string, text: string): vnode.VNode; (sel: string, children: Array<vnode.VNode>): vnode.VNode; (sel: string, data: vnode.VNodeData, text: string): vnode.VNode; (sel: string, data: vnode.VNodeData, children: Array<vnode.VNode>): vnode.VNode; }
-
VNode:
undefined
Convenience reexport of
snabbdom
'sVNode
-
VNodeData:
undefined
Convenience reexport of
snabbdom
'sVNodeData
-
Patch:
undefined
The type of a snabbdom patch, create one with snabbdom.init
module tags
Common tags
Example usage:
-
factory:
(name: string) => (...tag_data: Array<TagData>) => vnode.VNode
-
div:
(...tag_data: Array<TagData>) => vnode.VNode
-
span:
(...tag_data: Array<TagData>) => vnode.VNode
-
p:
(...tag_data: Array<TagData>) => vnode.VNode
-
pre:
(...tag_data: Array<TagData>) => vnode.VNode
-
em:
(...tag_data: Array<TagData>) => vnode.VNode
-
strong:
(...tag_data: Array<TagData>) => vnode.VNode
-
b:
(...tag_data: Array<TagData>) => vnode.VNode
-
i:
(...tag_data: Array<TagData>) => vnode.VNode
-
u:
(...tag_data: Array<TagData>) => vnode.VNode
-
strike:
(...tag_data: Array<TagData>) => vnode.VNode
-
small:
(...tag_data: Array<TagData>) => vnode.VNode
-
table:
(...tag_data: Array<TagData>) => vnode.VNode
-
tbody:
(...tag_data: Array<TagData>) => vnode.VNode
-
thead:
(...tag_data: Array<TagData>) => vnode.VNode
-
tfoot:
(...tag_data: Array<TagData>) => vnode.VNode
-
tr:
(...tag_data: Array<TagData>) => vnode.VNode
-
td:
(...tag_data: Array<TagData>) => vnode.VNode
-
th:
(...tag_data: Array<TagData>) => vnode.VNode
-
h1:
(...tag_data: Array<TagData>) => vnode.VNode
-
h2:
(...tag_data: Array<TagData>) => vnode.VNode
-
h3:
(...tag_data: Array<TagData>) => vnode.VNode
-
h4:
(...tag_data: Array<TagData>) => vnode.VNode
-
h5:
(...tag_data: Array<TagData>) => vnode.VNode
-
h6:
(...tag_data: Array<TagData>) => vnode.VNode
-
li:
(...tag_data: Array<TagData>) => vnode.VNode
-
ul:
(...tag_data: Array<TagData>) => vnode.VNode
-
ol:
(...tag_data: Array<TagData>) => vnode.VNode
-
option:
(...tag_data: Array<TagData>) => vnode.VNode