Bookmarklet builder
by phloe
HTML
<form class="builder" onsubmit="build(title, description, type, urls, autoinclude, source, result); return false;">
<h2>Bookmarklet</h2>
<span class="builder__toggler">Expand/collapse</span>
<fieldset>
<label class="builder__input--text">
<span>Name</span>
<input name="title" type="text" />
</label>
<label class="builder__input--text">
<span>Description</span>
<textarea name="description" rows="1"></textarea>
</label>
<input class="builder__tab" type="radio" id="bootstrap" name="type" value="bootstrap" checked/>
<label for="bootstrap">Bootstrap</label>
<fieldset class="builder__tab-content">
<label class="builder__input--text">
<span>Url(s)</span>
<input name="urls" type="text" value=""/>
</label>
<label class="builder__input--checkbox">
<input type="checkbox" name="autoinclude" />
<span>Include _amoeba.js</span>
</label>
</fieldset>
<input class="builder__tab" type="radio" id="inline" name="type" value="inline"/>
<label for="inline">Inline</label>
<fieldset class="builder__tab-content">
<label class="builder__input--text">
<span>Source</span>
<textarea name="source"></textarea>
</label>
</fieldset>
<p>
<button>Build</button>
</p>
</fieldset>
<output name="result"><a></a></output>
</form>
CSS
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
padding: 20px;
background-color: #777;
font-family: "Helvetica Neue", Arial, sans-serif;
}
form {
background-color: #444;
color: #FFF;
max-width: 440px;
position: relative;
}
form h2 {
text-transform: lowercase;
font-weight: 100;
font-size: 30px;
line-height: 1;
padding: 20px;
}
.builder__toggler {
position: absolute;
right: 20px;
top: 23px;
text-indent: -9999px;
width: 25px;
height: 25px;
cursor: pointer;
}
.builder__toggler:before{
position: absolute;
left: 12px;
top: 0;
content: "";
display: none;
width: 1px;
height: 25px;
background-color: #fff;
}
.builder__toggler:after{
position: absolute;
left: 0;
top: 12px;
content: "";
display: block;
width: 25px;
height: 1px;
background-color: #fff;
}
.builder--collapsed .builder__toggler:before {
display: block;
}
.builder--collapsed fieldset {
display: none;
}
.builder__input--text {
display: block;
margin-bottom: 20px;
width: 100%;
cursor: pointer;
}
.builder__input--text > span {
font-size: 14px;
display: block;
margin-bottom: 5px;
}
.builder__input--checkbox > input {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
}
.builder__input--checkbox > span {
font-size: 14px;
display: block;
margin-bottom: 5px;
cursor: pointer;
position: relative;
}
.builder__input--checkbox > span:before {
content: ""; /*"\2714";*/
background-color: #999;
color: transparent;
display: inline-block;
width: 15px;
height:15px;
border-radius: 2px;
text-align: center;
margin-right: 10px;
}
.builder__input--checkbox > input:checked + span:after {
content: "";
display: block;
position: absolute;
left:...
JavaScript
var loaders = {
inline: "(function(){{arguments}}())",
single: "(function(b,a){a.body.appendChild(a.createElement(\"script\")).src=b})(\"{arguments}\",document);",
chained: "(function(b,c){var d=b.length;(function e(){if(d){var a=c.createElement(\"script\");a.onload=e;c.body.appendChild(a);a.src=b[--d]}})()})([\"{arguments}\"],document);"
};
function build (title, description, type, urls, autoinclude, source, output) {
var loader = "inline";
var bookmarklet = document.createElement("a");
bookmarklet.textContent = title.value;
var src = source.value;
if (type.value == "bootstrap") {
src = urls.value.split(",");
if (autoinclude.checked) {
src.push("http://amoeba.build/js/_amoeba.js");
}
loader = (src.length > 1) ? "chained" : "single";
src = src.join("\",\"");
}
bookmarklet.href = "javascript:" + loaders[loader].replace(/\{arguments\}/, src);
while (output.firstChild) {
output.removeChild(output.firstChild);
}
output.appendChild(bookmarklet);
};
var builder, collapsed;
function toggle () {
collapsed = !collapsed;
builder.className = "builder" + (collapsed ? " builder--collapsed" : "");
}
window.onload = function () {
var toggler = document.querySelector(".builder__toggler");
if (toggler) {
builder = document.querySelector(".builder");
toggler.addEventListener("click", toggle, false);
}
};