diff --git a/lib/assets/libs/_html.js b/lib/assets/libs/_html.js
new file mode 100644
--- /dev/null
+++ b/lib/assets/libs/_html.js
@@ -0,0 +1,126 @@
+// creation of an HTML element
+var $module = (function($B){
+
+var _b_ = $B.builtins
+var $TagSumDict = $B.$TagSum.$dict
+
+function makeTagDict(tagName){
+ // return the dictionary for the class associated with tagName
+ var dict = {__class__:$B.$type,
+ __name__:tagName
+ }
+
+ dict.__init__ = function(){
+ var $ns=$B.args('__init__',1,{self:null},['self'],
+ arguments,{},'args','kw')
+ var self = $ns['self']
+ var args = $ns['args']
+ if(args.length==1){
+ var first=args[0]
+ if(_b_.isinstance(first,[_b_.str,_b_.int,_b_.float])){
+ self.elt.appendChild(document.createTextNode(_b_.str(first)))
+ } else if(first.__class__===$TagSumDict){
+ for(var i=0, _len_i = first.children.length; i < _len_i;i++){
+ self.elt.appendChild(first.children[i].elt)
+ }
+ } else { // argument is another DOMNode instance
+ try{self.elt.appendChild(first.elt)}
+ catch(err){throw _b_.ValueError('wrong element '+first)}
+ }
+ }
+
+ // attributes
+ var items = _b_.list(_b_.dict.$dict.items($ns['kw']))
+ for(var i=0, _len_i = items.length; i < _len_i;i++){
+ // keyword arguments
+ var arg = items[i][0]
+ var value = items[i][1]
+ if(arg.toLowerCase().substr(0,2)==="on"){
+ // Event binding passed as argument "onclick", "onfocus"...
+ // Better use method bind of DOMNode objects
+ var js = '$B.DOMNodeDict.bind(self,"'
+ js += arg.toLowerCase().substr(2)+'",function(){eval("'+value+'")})'
+ eval(js)
+ }else if(arg.toLowerCase()=="style"){
+ $B.DOMNodeDict.set_style(self,value)
+ } else {
+ if(value!==false){
+ // option.selected=false sets it to true :-)
+ try{
+ arg = arg.toLowerCase().replace('_','-')
+ self.elt.setAttribute(arg,value)
+ }catch(err){
+ throw _b_.ValueError("can't set attribute "+arg)
+ }
+ }
+ }
+ }
+ }
+
+ dict.__mro__ = [dict,$B.DOMNodeDict,$B.builtins.object.$dict]
+
+ dict.__new__ = function(cls){
+ // __new__ must be defined explicitely : it returns an instance of
+ // DOMNode for the specified tagName
+ var res = $B.DOMNode(document.createElement(tagName))
+ res.__class__ = cls.$dict
+ return res
+ }
+
+ return dict
+}
+
+
+// the classes used for tag sums, $TagSum and $TagSumClass
+// are defined in py_dom.js
+
+function makeFactory(tagName){
+ var factory = function(){
+ var res = $B.DOMNode(document.createElement(tagName))
+ res.__class__ = dicts[tagName]
+ // apply __init__
+ var args = [res].concat(Array.prototype.slice.call(arguments))
+ dicts[tagName].__init__.apply(null,args)
+ return res
+ }
+ factory.__class__=$B.$factory
+ factory.$dict = dicts[tagName]
+ return factory
+}
+
+// All HTML 4, 5.x extracted from
+// https://w3c.github.io/elements-of-html/
+// HTML4.01 tags
+var $tags = ['A','ABBR','ACRONYM','ADDRESS','APPLET','AREA','B','BASE',
+ 'BASEFONT','BDO','BIG','BLOCKQUOTE','BODY','BR','BUTTON',
+ 'CAPTION','CENTER','CITE','CODE','COL','COLGROUP','DD',
+ 'DEL','DFN','DIR','DIV','DL','DT','EM','FIELDSET','FONT',
+ 'FORM','FRAME','FRAMESET','H1','H2','H3','H4','H5','H6',
+ 'HEAD','HR','HTML','I','IFRAME','IMG','INPUT','INS',
+ 'ISINDEX','KBD','LABEL','LEGEND','LI','LINK','MAP','MENU',
+ 'META','NOFRAMES','NOSCRIPT','OBJECT','OL','OPTGROUP',
+ 'OPTION','P','PARAM','PRE','Q','S','SAMP','SCRIPT','SELECT',
+ 'SMALL','SPAN','STRIKE','STRONG','STYLE','SUB','SUP',
+ 'TABLE','TBODY','TD','TEXTAREA','TFOOT','TH','THEAD',
+ 'TITLE','TR','TT','U','UL','VAR',
+ // HTML5 tags
+ 'ARTICLE','ASIDE','AUDIO','BDI','CANVAS','COMMAND','DATA',
+ 'DATALIST','EMBED','FIGCAPTION','FIGURE','FOOTER','HEADER',
+ 'KEYGEN','MAIN','MARK','MATH','METER','NAV','OUTPUT',
+ 'PROGRESS','RB','RP','RT','RTC','RUBY','SECTION','SOURCE',
+ 'TEMPLATE','TIME','TRACK','VIDEO','WBR',
+ // HTML5.1 tags
+ 'DETAILS','DIALOG','MENUITEM','PICTURE','SUMMARY']
+
+// create classes
+var obj = new Object()
+var dicts = {}
+for(var i=0, _len_i = $tags.length; i < _len_i;i++){
+ var tag = $tags[i]
+ dicts[tag] = makeTagDict(tag)
+ obj[tag] = makeFactory(tag)
+ dicts[tag].$factory = obj[tag]
+}
+$B.tag_classes = dicts
+return obj
+})(__BRYTHON__)