├── .gitignore ├── example ├── src │ ├── main.js │ └── App.svelte ├── public │ ├── global.css │ └── index.html └── rollup.config.js ├── .vscode └── settings.json ├── .editorconfig ├── src ├── br.svelte ├── hr.svelte ├── col.svelte ├── wbr.svelte ├── b.svelte ├── embed.svelte ├── i.svelte ├── input.svelte ├── p.svelte ├── param.svelte ├── q.svelte ├── s.svelte ├── source.svelte ├── track.svelte ├── u.svelte ├── bdi.svelte ├── bdo.svelte ├── dd.svelte ├── del.svelte ├── dfn.svelte ├── dir.svelte ├── div.svelte ├── dl.svelte ├── dt.svelte ├── em.svelte ├── h1.svelte ├── h2.svelte ├── h3.svelte ├── h4.svelte ├── h5.svelte ├── h6.svelte ├── ins.svelte ├── kbd.svelte ├── li.svelte ├── map.svelte ├── nav.svelte ├── ol.svelte ├── pre.svelte ├── rb.svelte ├── rp.svelte ├── rt.svelte ├── rtc.svelte ├── sub.svelte ├── sup.svelte ├── td.svelte ├── th.svelte ├── tr.svelte ├── tt.svelte ├── ul.svelte ├── var.svelte ├── abbr.svelte ├── aside.svelte ├── cite.svelte ├── code.svelte ├── data.svelte ├── form.svelte ├── label.svelte ├── main.svelte ├── mark.svelte ├── menu.svelte ├── meter.svelte ├── ruby.svelte ├── samp.svelte ├── small.svelte ├── span.svelte ├── table.svelte ├── tbody.svelte ├── tfoot.svelte ├── thead.svelte ├── time.svelte ├── applet.svelte ├── button.svelte ├── canvas.svelte ├── dialog.svelte ├── figure.svelte ├── footer.svelte ├── header.svelte ├── hgroup.svelte ├── legend.svelte ├── output.svelte ├── select.svelte ├── strong.svelte ├── address.svelte ├── article.svelte ├── caption.svelte ├── colgroup.svelte ├── datalist.svelte ├── details.svelte ├── fieldset.svelte ├── menuitem.svelte ├── noembed.svelte ├── noscript.svelte ├── optgroup.svelte ├── picture.svelte ├── progress.svelte ├── section.svelte ├── summary.svelte ├── textarea.svelte ├── blockquote.svelte ├── audio.svelte ├── video.svelte ├── img.svelte ├── area.svelte ├── a.svelte ├── option.svelte ├── iframe.svelte ├── object.svelte ├── utils.js └── index.js ├── rollup.config.js ├── package.json ├── README.md └── scripts └── generate.js /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | example/public/bundle* 3 | node_modules 4 | -------------------------------------------------------------------------------- /example/src/main.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte'; 2 | 3 | const app = new App({ target: document.body }); 4 | export default app; 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[javascript]": { "editor.formatOnSave": true }, 3 | "[typescript]": { "editor.formatOnSave": true } 4 | } 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | indent_style = space 3 | indent_size = 2 4 | end_of_line = lf 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | charset = utf-8 8 | -------------------------------------------------------------------------------- /src/br.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/hr.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/col.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/wbr.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/b.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/embed.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/i.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/input.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/p.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

9 | -------------------------------------------------------------------------------- /src/param.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/q.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/s.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/source.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/track.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/u.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/bdi.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/bdo.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/dd.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/del.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/dfn.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/dir.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/div.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/dl.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/dt.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/em.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/h1.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

9 | -------------------------------------------------------------------------------- /src/h2.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

9 | -------------------------------------------------------------------------------- /src/h3.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

9 | -------------------------------------------------------------------------------- /src/h4.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

9 | -------------------------------------------------------------------------------- /src/h5.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/h6.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /src/ins.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/kbd.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/li.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
  • 9 | -------------------------------------------------------------------------------- /src/map.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/nav.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/ol.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/pre.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/rb.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/rp.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/rt.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/rtc.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/sub.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/sup.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/td.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/th.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/tr.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/tt.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/ul.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/var.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/abbr.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/aside.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/cite.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/code.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/data.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/form.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/label.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/mark.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/menu.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/meter.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/ruby.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/samp.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/small.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/span.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/table.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/tbody.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/tfoot.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/thead.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/time.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/applet.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/button.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/canvas.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/dialog.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/figure.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/footer.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/header.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/hgroup.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/legend.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/output.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/select.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/strong.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/address.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/article.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/caption.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/colgroup.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/datalist.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/details.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/fieldset.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/menuitem.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/noembed.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | <slot /> 9 | -------------------------------------------------------------------------------- /src/noscript.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/optgroup.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/picture.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/progress.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/section.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/summary.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/textarea.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/blockquote.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
    9 | -------------------------------------------------------------------------------- /src/audio.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/video.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/img.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {alt 10 | -------------------------------------------------------------------------------- /src/area.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {alt 10 | -------------------------------------------------------------------------------- /src/a.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/option.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/iframe.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /src/object.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /example/public/global.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | body { 8 | color: #333; 9 | margin: 0; 10 | padding: 8px; 11 | box-sizing: border-box; 12 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 13 | } 14 | -------------------------------------------------------------------------------- /example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | svelte-elements 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import filesize from 'rollup-plugin-filesize'; 3 | 4 | export default [ 5 | { 6 | input: 'src/index.js', 7 | external: ['svelte', 'svelte/internal', 'svelte/store'], 8 | output: [ 9 | { 10 | file: 'dist/svelte-elements.es.js', 11 | format: 'es', 12 | sourcemap: true 13 | }, 14 | { 15 | file: 'dist/svelte-elements.cjs.js', 16 | format: 'cjs', 17 | sourcemap: true 18 | } 19 | ], 20 | plugins: [svelte(), filesize()] 21 | } 22 | ]; 23 | -------------------------------------------------------------------------------- /example/rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import resolve from 'rollup-plugin-node-resolve'; 3 | import commonjs from 'rollup-plugin-commonjs'; 4 | import replace from 'rollup-plugin-replace'; 5 | 6 | export default { 7 | input: 'src/main.js', 8 | output: { 9 | sourcemap: true, 10 | format: 'iife', 11 | name: 'app', 12 | file: 'public/bundle.js' 13 | }, 14 | external: [], 15 | plugins: [ 16 | svelte({ 17 | dev: true, 18 | css: css => { 19 | css.write('public/bundle.css'); 20 | } 21 | }), 22 | resolve(), 23 | commonjs(), 24 | replace({ 25 | 'process.env.NODE_ENV': process.env.NODE_ENV || JSON.stringify('development') 26 | }) 27 | ] 28 | }; 29 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | export function subscribe(node, listeners) { 2 | let subscriptions = listen(node, listeners); 3 | 4 | return { 5 | update(listeners) { 6 | unsubscribe(subscriptions); 7 | subscriptions = listen(node, listeners); 8 | }, 9 | destroy() { 10 | unsubscribe(subscriptions); 11 | } 12 | }; 13 | } 14 | 15 | function listen(node, listeners) { 16 | if (!listeners) return []; 17 | 18 | return Object.keys(listeners).map(event => { 19 | const handler = listeners[event]; 20 | 21 | node.addEventListener(event, handler); 22 | return () => node.removeEventListener(event, handler); 23 | }); 24 | } 25 | 26 | function unsubscribe(subscriptions) { 27 | return subscriptions.forEach(unsubscribe => unsubscribe()); 28 | } 29 | -------------------------------------------------------------------------------- /example/src/App.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |

    A

    13 | clicked = true}>Howdy! 14 | 15 |

    Results

    16 |
    17 | 18 | 19 |

    Input

    20 | focused = true} listen={{ keydown: () => keydown = true}} /> 21 | 22 |

    Results

    23 |
    24 | 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-elements", 3 | "version": "0.4.2", 4 | "author": "Tim Hall ", 5 | "license": "MIT", 6 | "description": "Component wrappers for built-in html elements", 7 | "repository": "https://github.com/timhall/svelte-elements.git", 8 | "main": "dist/svelte-elements.cjs.js", 9 | "module": "dist/svelte-elements.es.js", 10 | "svelte": "src/index.js", 11 | "keywords": [ 12 | "svelte", 13 | "elements", 14 | "html" 15 | ], 16 | "scripts": { 17 | "build": "rollup -c", 18 | "prepublishOnly": "npm run build", 19 | "example": "run-p example:*", 20 | "example:build": "cd example && rollup -c --watch", 21 | "example:serve": "serve example/public" 22 | }, 23 | "peerDependencies": { 24 | "svelte": "^3.0.0" 25 | }, 26 | "devDependencies": { 27 | "dedent": "^0.7.0", 28 | "npm-run-all": "^4.1.5", 29 | "rollup": "^1.11.3", 30 | "rollup-plugin-commonjs": "^9.3.4", 31 | "rollup-plugin-filesize": "^6.0.1", 32 | "rollup-plugin-node-resolve": "^4.2.4", 33 | "rollup-plugin-replace": "^2.2.0", 34 | "rollup-plugin-svelte": "^5.0.3", 35 | "serve": "^11.0.0", 36 | "svelte": "^3.0.0" 37 | }, 38 | "prettier": { 39 | "singleQuote": true, 40 | "printWidth": 100 41 | }, 42 | "files": [ 43 | "src", 44 | "dist" 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # svelte-elements 2 | 3 | `svelte:component` is a powerful primitive for rendering _components_ dynamically in svelte, but it doesn't handle html _elements_... until now. 4 | 5 | ```html 6 | 7 | 12 | 13 | 14 | 15 | 16 | ``` 17 | 18 | There are some limitations in this approach, namely `bind:this` does not point to the native element and events are not forwarded by default from the native element. This can be addressed in two ways: 19 | 20 | ### `bind:el` 21 | 22 | Instead of `bind:this={ref}`, use `bind:el={ref}`. `this` points to the wrapper component, `el` points to the native element 23 | 24 | ```html 25 | 31 | 32 | ... 33 | ``` 34 | 35 | ### `listen` 36 | 37 | Forwarding events from the native element through the wrapper element comes with a cost, so to avoid adding extra event handlers only a few are forwarded. For all elements except `
    ` and `
    `, `on:focus`, `on:blur`, `on:keypress`, and `on:click` are forwarded. For `audio` and `video`, `on:pause` and `on:play` are also forwarded. 38 | 39 | For any other events that need to be listened to, you can use the `listen` property: 40 | 41 | ```html 42 | 48 | 49 | ... 50 | ``` 51 | -------------------------------------------------------------------------------- /scripts/generate.js: -------------------------------------------------------------------------------- 1 | const { join } = require('path'); 2 | const { existsSync, readFileSync, writeFileSync } = require('fs'); 3 | const dedent = require('dedent'); 4 | 5 | // Load existing exports from src/index.js 6 | const src = join(__dirname, '../src'); 7 | const index = join(src, 'index.js'); 8 | 9 | const list = new Set( 10 | readFileSync(index, 'utf8') 11 | .split('\n') 12 | .filter(Boolean) 13 | ); 14 | 15 | // Get tags from stdin or all tags 16 | let tags = process.argv.slice(2); 17 | if (!tags.length) tags = allTags(); 18 | 19 | // Generate tags 20 | for (const tag of tags) { 21 | const path = join(src, `${tag}.svelte`); 22 | if (existsSync(path)) { 23 | console.log(`<${tag}> - Skipped`); 24 | continue; 25 | } 26 | 27 | const events = `${matchingEvents(tag)}use:subscribe={listen}`; 28 | 29 | const data = dedent` 35 | 36 | <${tag} bind:this={el} ${events} {...$$props}${isVoid(tag) ? ' />' : `>`}\n`; 37 | 38 | writeFileSync(path, data, 'utf8'); 39 | list.add(`export { default as ${capitalize(tag)} } from './${tag}.svelte';`); 40 | 41 | console.log(`<${tag}> - Created`); 42 | } 43 | 44 | writeFileSync(index, `${[...list].sort(byExport).join('\n')}\n`, 'utf8'); 45 | 46 | // 47 | // utils 48 | // 49 | 50 | function capitalize(tag) { 51 | return tag[0].toUpperCase() + tag.slice(1); 52 | } 53 | 54 | function exportName(line) { 55 | return line.replace(`export { default as }`, ''); 56 | } 57 | 58 | function byExport(a, b) { 59 | const a_name = exportName(a); 60 | const b_name = exportName(b); 61 | 62 | if (a_name < b_name) return -1; 63 | if (a_name > b_name) return 1; 64 | return 0; 65 | } 66 | 67 | // All events: 68 | // (https://developer.mozilla.org/en-US/docs/Web/Events) 69 | // 70 | // on:focus on:blur 71 | // on:cut on:copy on:paste 72 | // on:keydown on:keypress on:keyup 73 | // on:auxclick on:click on:contextmenu on:dblclick on:mousedown on:mouseenter on:mouseleave on:mousemove on:mouseover on:mouseout on:mouseup on:pointerlockchange on:pointerlockerror on:select on:wheel 74 | // on:drag on:dragend on:dragenter on:dragstart on:dragleave on:dragover on:drop 75 | // on:audioprocess on:canplay on:canplaythrough on:complete on:durationchange on:emptied on:ended on:loadeddata on:loadedmetadata on:pause on:play on:playing on:ratechange on:seeked on:seeking on:stalled on:suspend on:timeupdate on:volumechange on:waiting 76 | // 77 | // Forwarding events adds an event listener per event, which could get fairly expensive 78 | // Instead, forward common events: 79 | // 80 | // everything: on:focus on:blur on:keypress on:click 81 | // media: on:pause on:play 82 | function matchingEvents(tag) { 83 | let events = !['br', 'hr'].includes(tag) 84 | ? ['on:focus', 'on:blur', 'on:keypress', 'on:click'] 85 | : []; 86 | if (['audio', 'video'].includes(tag)) events = events.concat(['on:pause', 'on:play']); 87 | 88 | return events.length ? `${events.join(' ')} ` : ''; 89 | } 90 | 91 | function isVoid(tag) { 92 | return [ 93 | 'area', 94 | 'br', 95 | 'col', 96 | 'embed', 97 | 'hr', 98 | 'img', 99 | 'input', 100 | 'param', 101 | 'source', 102 | 'track', 103 | 'wbr' 104 | ].includes(tag); 105 | } 106 | 107 | function allTags() { 108 | return [ 109 | 'a', 110 | 'abbr', 111 | 'address', 112 | 'applet', 113 | 'area', 114 | 'article', 115 | 'aside', 116 | 'audio', 117 | 'b', 118 | 'bdi', 119 | 'bdo', 120 | 'blockquote', 121 | 'br', 122 | 'button', 123 | 'canvas', 124 | 'caption', 125 | 'cite', 126 | 'code', 127 | 'col', 128 | 'colgroup', 129 | 'data', 130 | 'datalist', 131 | 'dd', 132 | 'del', 133 | 'details', 134 | 'dfn', 135 | 'dialog', 136 | 'dir', 137 | 'div', 138 | 'dl', 139 | 'dt', 140 | 'em', 141 | 'embed', 142 | 'fieldset', 143 | // Unlikely to need, throws annoying a11y warning 144 | // 'figcaption', 145 | 'figure', 146 | 'footer', 147 | 'form', 148 | 'h1', 149 | 'h2', 150 | 'h3', 151 | 'h4', 152 | 'h5', 153 | 'h6', 154 | 'header', 155 | 'hgroup', 156 | 'hr', 157 | 'i', 158 | 'iframe', 159 | 'img', 160 | 'input', 161 | 'ins', 162 | 'kbd', 163 | 'label', 164 | 'legend', 165 | 'li', 166 | 'main', 167 | 'map', 168 | 'mark', 169 | 'menu', 170 | 'menuitem', 171 | 'meter', 172 | 'nav', 173 | 'noembed', 174 | 'noscript', 175 | 'object', 176 | 'ol', 177 | 'optgroup', 178 | 'option', 179 | 'output', 180 | 'p', 181 | 'param', 182 | 'picture', 183 | 'pre', 184 | 'progress', 185 | 'q', 186 | 'rb', 187 | 'rp', 188 | 'rt', 189 | 'rtc', 190 | 'ruby', 191 | 's', 192 | 'samp', 193 | 'section', 194 | 'select', 195 | 'small', 196 | 'source', 197 | 'span', 198 | 'strong', 199 | 'sub', 200 | 'summary', 201 | 'sup', 202 | 'table', 203 | 'tbody', 204 | 'td', 205 | 'textarea', 206 | 'tfoot', 207 | 'th', 208 | 'thead', 209 | 'time', 210 | 'tr', 211 | 'track', 212 | 'tt', 213 | 'u', 214 | 'ul', 215 | 'var', 216 | 'video', 217 | 'wbr' 218 | ]; 219 | } 220 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | export { default as A } from './a.svelte'; 2 | export { default as Abbr } from './abbr.svelte'; 3 | export { default as Address } from './address.svelte'; 4 | export { default as Applet } from './applet.svelte'; 5 | export { default as Area } from './area.svelte'; 6 | export { default as Article } from './article.svelte'; 7 | export { default as Aside } from './aside.svelte'; 8 | export { default as Audio } from './audio.svelte'; 9 | export { default as B } from './b.svelte'; 10 | export { default as Bdi } from './bdi.svelte'; 11 | export { default as Bdo } from './bdo.svelte'; 12 | export { default as Blockquote } from './blockquote.svelte'; 13 | export { default as Br } from './br.svelte'; 14 | export { default as Button } from './button.svelte'; 15 | export { default as Canvas } from './canvas.svelte'; 16 | export { default as Caption } from './caption.svelte'; 17 | export { default as Cite } from './cite.svelte'; 18 | export { default as Code } from './code.svelte'; 19 | export { default as Col } from './col.svelte'; 20 | export { default as Colgroup } from './colgroup.svelte'; 21 | export { default as Data } from './data.svelte'; 22 | export { default as Datalist } from './datalist.svelte'; 23 | export { default as Dd } from './dd.svelte'; 24 | export { default as Del } from './del.svelte'; 25 | export { default as Details } from './details.svelte'; 26 | export { default as Dfn } from './dfn.svelte'; 27 | export { default as Dialog } from './dialog.svelte'; 28 | export { default as Dir } from './dir.svelte'; 29 | export { default as Div } from './div.svelte'; 30 | export { default as Dl } from './dl.svelte'; 31 | export { default as Dt } from './dt.svelte'; 32 | export { default as Em } from './em.svelte'; 33 | export { default as Embed } from './embed.svelte'; 34 | export { default as Fieldset } from './fieldset.svelte'; 35 | export { default as Figure } from './figure.svelte'; 36 | export { default as Footer } from './footer.svelte'; 37 | export { default as Form } from './form.svelte'; 38 | export { default as H1 } from './h1.svelte'; 39 | export { default as H2 } from './h2.svelte'; 40 | export { default as H3 } from './h3.svelte'; 41 | export { default as H4 } from './h4.svelte'; 42 | export { default as H5 } from './h5.svelte'; 43 | export { default as H6 } from './h6.svelte'; 44 | export { default as Header } from './header.svelte'; 45 | export { default as Hgroup } from './hgroup.svelte'; 46 | export { default as Hr } from './hr.svelte'; 47 | export { default as I } from './i.svelte'; 48 | export { default as Iframe } from './iframe.svelte'; 49 | export { default as Img } from './img.svelte'; 50 | export { default as Input } from './input.svelte'; 51 | export { default as Ins } from './ins.svelte'; 52 | export { default as Kbd } from './kbd.svelte'; 53 | export { default as Label } from './label.svelte'; 54 | export { default as Legend } from './legend.svelte'; 55 | export { default as Li } from './li.svelte'; 56 | export { default as Main } from './main.svelte'; 57 | export { default as Map } from './map.svelte'; 58 | export { default as Mark } from './mark.svelte'; 59 | export { default as Menu } from './menu.svelte'; 60 | export { default as Menuitem } from './menuitem.svelte'; 61 | export { default as Meter } from './meter.svelte'; 62 | export { default as Nav } from './nav.svelte'; 63 | export { default as Noembed } from './noembed.svelte'; 64 | export { default as Noscript } from './noscript.svelte'; 65 | export { default as Object } from './object.svelte'; 66 | export { default as Ol } from './ol.svelte'; 67 | export { default as Optgroup } from './optgroup.svelte'; 68 | export { default as Option } from './option.svelte'; 69 | export { default as Output } from './output.svelte'; 70 | export { default as P } from './p.svelte'; 71 | export { default as Param } from './param.svelte'; 72 | export { default as Picture } from './picture.svelte'; 73 | export { default as Pre } from './pre.svelte'; 74 | export { default as Progress } from './progress.svelte'; 75 | export { default as Q } from './q.svelte'; 76 | export { default as Rb } from './rb.svelte'; 77 | export { default as Rp } from './rp.svelte'; 78 | export { default as Rt } from './rt.svelte'; 79 | export { default as Rtc } from './rtc.svelte'; 80 | export { default as Ruby } from './ruby.svelte'; 81 | export { default as S } from './s.svelte'; 82 | export { default as Samp } from './samp.svelte'; 83 | export { default as Section } from './section.svelte'; 84 | export { default as Select } from './select.svelte'; 85 | export { default as Small } from './small.svelte'; 86 | export { default as Source } from './source.svelte'; 87 | export { default as Span } from './span.svelte'; 88 | export { default as Strong } from './strong.svelte'; 89 | export { default as Sub } from './sub.svelte'; 90 | export { default as Summary } from './summary.svelte'; 91 | export { default as Sup } from './sup.svelte'; 92 | export { default as Table } from './table.svelte'; 93 | export { default as Tbody } from './tbody.svelte'; 94 | export { default as Td } from './td.svelte'; 95 | export { default as Textarea } from './textarea.svelte'; 96 | export { default as Tfoot } from './tfoot.svelte'; 97 | export { default as Th } from './th.svelte'; 98 | export { default as Thead } from './thead.svelte'; 99 | export { default as Time } from './time.svelte'; 100 | export { default as Tr } from './tr.svelte'; 101 | export { default as Track } from './track.svelte'; 102 | export { default as Tt } from './tt.svelte'; 103 | export { default as U } from './u.svelte'; 104 | export { default as Ul } from './ul.svelte'; 105 | export { default as Var } from './var.svelte'; 106 | export { default as Video } from './video.svelte'; 107 | export { default as Wbr } from './wbr.svelte'; 108 | --------------------------------------------------------------------------------