HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by Skypack, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ES6 import
usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
/*
encode to base64 with Python 2.7 (b64encode without \n)
import base64
d=open('digital-7.ttf','rb').read()
b64=base64.b64encode(d)
*/
@font-face {
font-family: 'D7MBI';
src: url('data:font/woff;charset=utf-8;base64,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') format('woff');
}
@font-face {
font-family: 'Digital-7';
src: url('data:font/ttf;charset=utf-8;base64,AAEAAAASAQAABAAgTFRTSPCmpr8AAAO0AAAAb09TLzJnKvA9AAABqAAAAGBQQ0xUzZbuTAAAhgAAAAA2VkRNWGtqcwUAAAQkAAAF4GNtYXCQW9VlAAAUHAAAAlBjdnQgEnUMPQAAKowAAABmZnBnbTREFoUAABZsAAATO2dhc3AAFwAJAACF8AAAABBnbHlm3ul9EAAAKvQAAFLAaGRteK80MhkAAAoEAAAKGGhlYWTwNu85AAABLAAAADZoaGVhBXkDvgAAAWQAAAAkaG10eL+CFFAAAAIIAAABrGxvY2FPJmYMAAB9tAAAANhtYXhwAw4T0QAAAYgAAAAgbmFtZa5nJUgAAH6MAAAGY3Bvc3RdSWIxAACE8AAAAP1wcmVwVvJmgAAAKagAAADhAAEAAAABAADoRKrbXw889QAQBEwAAAAAxQtN8AAAAADJr10tADL/iAImA0gAAAALAAIAAAAAAAAAAQAAAyAAyAAAAlgAMgAyAiYAAQAAAAAAAAAAAAAAAAAAAGsAAQAAAGsAVAAOAAAAAAACAAgAQACMAAACABM7AAAAAAADAcoBkAAFAAACvAKKAAAAjwK8AooAAAHFADIBAwAAAgAAAAAAAAAAAIAAAAEAAAAAAAAAAAAAAABBTFRTAEAAICAwAyAAyAAAA4QAuwAAAAEAAAAAArwCvAAAACAAAAJEADIB9AAAAfQAAAEsAAAAtAAyAVUAMgIcADICCAAyAlgAMgIwADIAtAAyAV4AMgFeADIBrgAyAbgAMgC0ADIBuAAyALQAMgIIADICCAAyALQAMgIIADICCAAyAggAMgIIADICCAAyAggAMgIIADICCAAyALQAMgC0ADIBcgAyAbgAMgFyADICCAAyAggAMgIIADICCAAyAeAAMgIIADIB4AAyAeAAMgIIADICCAAyALQAMgIIADICCAAyAggAMgIIADICCAAyAggAMgIIADICEgAyAggAMgIIADICBwAyAggAMgIIADICCAAyAggAMgIIADICCAAyATYAMgIGADIBNgAyAgcAMgIHADIBGAAyAggAMgIIADIB4AAyAggAMgHgADIB4AAyAggAMgIIADIAtAAyAggAMgIIADICCAAyAggAMgIIADICCAAyAggAMgISADICCAAyAggAMgIHADICCAAyAggAMgIIADICCAAyAggAMgIIADIBrgAyALQAMgGuADICHAAyAk4AMgC0ADIAtAAyAVQAMgFVADIBhgAyAhwAMgJEADICRAAyAAAAa0sBAQFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLAAAAAAEAAQEBAQEADAD4CP8ACAAH//4ACQAI//4ACgAJ//4ACwAJ//4ADAAK//0ADQAL//0ADgAM//0ADwAN//0AEAAO//0AEQAO//0AEgAP//wAEwAQ//wAFAAR//wAFQAS//wAFgAS//wAFwAT//wAGAAU//sAGQAV//sAGgAW//sAGwAX//sAHAAX//sAHQAY//sAHgAZ//oAHwAa//oAIAAb//oAIQAb//oAIgAc//oAIwAd//oAJAAe//kAJQAf//kAJgAg//kAJwAg//kAKAAh//kAKQAi//kAKgAj//gAKwAk//gALAAk//gALQAl//gALgAm//gALwAn//gAMAAo//cAMQAp//cAMgAp//cAMwAq//cANAAr//cANQAs//YANgAt//YANwAt//YAOAAu//YAOQAv//YAOgAw//YAOwAx//UAPAAy//UAPQAy//UAPgAz//UAPwA0//UAQAA1//UAQQA2//QAQgA2//QAQwA3//QARAA4//QARQA5//QARgA6//QARwA7//MASAA7//MASQA8//MASgA9//MASwA+//MATAA///MATQA///IATgBA//IATwBB//IAUABC//IAUQBD//IAUgBE//IAUwBE//EAVABF//EAVQBG//EAVgBH//EAVwBI//EAWABI//EAWQBJ//AAWgBK//AAWwBL//AAXABM//AAXQBN//AAXgBN//AAXwBO/+8AYABP/+8AYQBQ/+8AYgBR/+8AYwBR/+8AZABS/+8AZQBT/+4AZgBU/+4AZwBV/+4AaABW/+4AaQBW/+4AagBX/+0AawBY/+0AbABZ/+0AbQBa/+0AbgBa/+0AbwBb/+0AcABc/+wAcQBd/+wAcgBe/+wAcwBf/+wAdABf/+wAdQBg/+wAdgBh/+sAdwBi/+sAeABj/+sAeQBj/+sAegBk/+sAewBl/+sAfABm/+oAfQBn/+oAfgBo/+oAfwBo/+oAgABp/+oAgQBq/+oAggBr/+kAgwBs/+kAhABs/+kAhQBt/+kAhgBu/+kAhwBv/+kAiABw/+gAiQBx/+gAigBx/+gAiwBy/+gAjABz/+gAjQB0/+gAjgB1/+cAjwB1/+cAkAB2/+cAkQB3/+cAkgB4/+cAkwB5/+cAlAB6/+YAlQB6/+YAlgB7/+YAlwB8/+YAmAB9/+YAmQB+/+UAmgB+/+UAmwB//+UAnACA/+UAnQCB/+UAngCC/+UAnwCD/+QAoACD/+QAoQCE/+QAogCF/+QAowCG/+QApACH/+QApQCH/+MApgCI/+MApwCJ/+MAqACK/+MAqQCL/+MAqgCM/+MAqwCM/+IArACN/+IArQCO/+IArgCP/+IArwCQ/+IAsACQ/+IAsQCR/+EAsgCS/+EAswCT/+EAtACU/+EAtQCV/+EAtgCV/+EAtwCW/+AAuACX/+AAuQCY/+AAugCZ/+AAuwCZ/+AAvACa/+AAvQCb/98AvgCc/98AvwCd/98AwACe/98AwQCe/98AwgCf/98AwwCg/94AxACh/94AxQCi/94AxgCi/94AxwCj/94AyACk/94AyQCl/90AygCm/90AywCn/90AzACn/90AzQCo/90AzgCp/9wAzwCq/9wA0ACr/9wA0QCr/9wA0gCs/9wA0wCt/9wA1ACu/9sA1QCv/9sA1gCw/9sA1wCw/9sA2ACx/9sA2QCy/9sA2gCz/9oA2wC0/9oA3AC0/9oA3QC1/9oA3gC2/9oA3wC3/9oA4AC4/9kA4QC5/9kA4gC5/9kA4wC6/9kA5AC7/9kA5QC8/9kA5gC9/9gA5wC9/9gA6AC+/9gA6QC//9gA6gDA/9gA6wDB/9gA7ADC/9cA7QDC/9cA7gDD/9cA7wDE/9cA8ADF/9cA8QDG/9cA8gDG/9YA8wDH/9YA9ADI/9YA9QDJ/9YA9gDK/9YA9wDL/9YA+ADL/9UA+QDM/9UA+gDN/9UA+wDO/9UA/ADP/9UA/QDP/9QA/gDQ/9QA/wDR/9QAAAAXAAAAcAkFBQQEAgEDBAQFBQEDAwQEAQQBBAQBBAQEBAQEBAQBAQMEAwQEBAQEBAQEBAQBBAQEBAQEBAQEBAQEBAQEBAQDBAMEBAIEBAQEBAQEBAEEBAQEBAQEBAQEBAQEBAQEBAQBBAQFAQEDAwMEBQUAAAAKBQUFBQMCAwUFBQUCAwMEBAIEAgUFAgUFBQUFBQUFAgIDBAMFBQUFBAUEBAUFAgUFBQUFBQUFBQUFBQUFBQUFAwUDBQUDBQUEBQQEBQUCBQUFBQUFBQUFBQUFBQUFBQUEAgQFBQICAwMEBQUFAAAACwYGBQUDAgMFBQYGAgQEBAQCBAIFBQIFBQUFBQUFBQICBAQEBQUFBQUFBQUFBQIFBQUFBQUFBQUFBQUFBQUFBQMFAwUFAwUFBQUFBQUFAgUFBQUFBQUFBQUFBQUFBQUFBAIEBQYCAgMDBAUGBgAAAAwHBgUFAwIEBgYHBgIEBAUFAgUCBgYCBgYGBgYGBgYCAgQFBAYGBgYFBgUFBgYCBgYGBgYGBgYGBgYGBgYGBgYDBgMGBgMGBgUGBQUGBgIGBgYGBgYGBgYGBgYGBgYGBgUCBQYGAgIEBAQGBgYAAAANBwcGBgQCBAYGBwcCBAQFBQIFAgYGAgYGBgYGBgYGAgIEBQQGBgYGBgYGBgYGAgYGBgYGBgYGBgYGBgYGBgYGBAYEBgYDBgYGBgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYFAgUGBwICBAQFBgcHAAAADwgIBwcEAgUHBwgIAgUFBgYCBgIHBwIHBwcHBwcHBwICBQYFBwcHBwcHBwcHBwIHBwcHBwcHBwcHBwcHBwcHBwQHBAcHBAcHBwcHBwcHAgcHBwcHBwcHBwcHBwcHBwcHBgIGBwgCAgUFBQcICAAAABAJCAcHBAMFCAgJCAMFBQYGAwYDCAgDCAgICAgICAgDAwUGBQgICAgHCAcHCAgDCAgICAgICAgICAgICAgICAgFCAUICAQICAcIBwcICAMICAgICAgICAgICAgICAgICAYDBggJAwMFBQYICAgAAAARCQkICAUDBQgICQkDBQUHBwMHAwgIAwgICAgICAgIAwMGBwYICAgIBwgHBwgIAwgICAgICAgICAgICAgICAgIBQgFCAgECAgHCAcHCAgDCAgICAgICAgICAgICAgICAgHAwcICQMDBQUGCAkJAAAAEwoKCQkFAwYJCQoKAwYGBwgDCAMJCQMJCQkJCQkJCQMDBggGCQkJCQgJCAgJCQMJCQkJCQkJCQkJCQkJCQkJCQUJBQkJBQkJCAkICAkJAwkJCQkJCQkJCQkJCQkJCQkJBwMHCQoDAwYGBwkKCgAAABULCwoKBgMHCgoLCwMHBwgIAwgDCgoDCgoKCgoKCgoDAwcIBwoKCgoJCgkJCgoDCgoKCgoKCgoKCgoKCgoKCgoGCgYKCgUKCgkKCQkKCgMKCgoKCgoKCgoKCgoKCgoKCggDCAoLAwMGBwcKCwsAAAAYDQ0LCwcEBwwLDQwECAgJCgQKBAsLBAsLCwsLCwsLBAQICggLCwsLCgsKCgsLBAsLCwsLCwsMCwsLCwsLCwsLBwsHCwsGCwsKCwoKCwsECwsLCwsLCwwLCwsLCwsLCwsJBAkMDQQEBwcJDA0NAAAAGw8ODAwHBAgNDQ8OBAkJCwsECwQNDQQNDQ0NDQ0NDQQECQsJDQ0NDQwNDAwNDQQNDQ0NDQ0NDQ0NDQ0NDQ0NDQgNCA0NBw0NDA0MDA0NBA0NDQ0NDQ0NDQ0NDQ0NDQ0NCwQLDQ4EBAgICg0ODgAAAB0QDw0NCAUJDg4QDwUJCQsMBQwFDg4FDg4ODg4ODg4FBQoMCg4ODg4NDg0NDg4FDg4ODg4ODg4ODg4ODg4ODg4IDggODgcODg0ODQ0ODgUODg4ODg4ODg4ODg4ODg4ODgsFCw4QBQUJCQoODw8AAAAgEREPDwkFChAPERAFCgoNDQUNBQ8PBQ8PDw8PDw8PBQULDQsPDw8PDg8ODg8PBQ8PDw8PDw8PDw8PDw8PDw8PCQ8JDw8IDw8ODw4ODw8FDw8PDw8PDw8PDw8PDw8PDw8NBQ0QEQUFCgoLEBERAAAAIRIRDw8JBQoQEBIRBQsLDQ0FDQUQEAUQEBAQEBAQEAUFCw0LEBAQEA4QDg4QEAUQEBAQEBAQEBAQEBAQEBAQEAkQCRAQCBAQDhAODhAQBRAQEBAQEBAQEBAQEBAQEBAQDQUNEBIFBQoKDBAREQAAACUUFBERCgYLEhEUEwYMDA4PBg8GEREGEREREREREREGBgwPDBEREREQERAQEREGERERERERERIREREREREREREKEQoREQkRERAREBAREQYREREREREREhEREREREREREQ4GDhIUBgYLCw0SFBQAAAAqFxYTEwsHDRUUFxUHDQ0QEQcRBxQUBxQUFBQUFBQUBwcOEQ4UFBQUEhQSEhQUBxQUFBQUFBQUFBQUFBQUFBQUDBQMFBQLFBQSFBISFBQHFBQUFBQUFBQUFBQUFBQUFBQQBxAVFwcHDQ0PFRYWAAAALhkYFRUNCA4XFhkXCA8PEhIIEggWFggW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ACuzDQtGACuzDgFGACuzEA9GACuzEQ9GACuzEgtGACuzEwtGACuzFAFGACuzFQFGACuzFg9GACuzFwFGACuzGAFGACuzGQtGACtFaERFaERFaERFaERFaEQAAAACuwGDAEsCRgIGAAADUQHO/5ABnQIwAAACFQAOATn/jP9F/6cAtgBxAdUBUP9rAQQA7gCMAEsASwCeAIMArACCABwASwBhAA4AMwBKABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAAAAEADIAAAISAtAABQALAA8AFwCPuABkK7gAGC+4ABMvuAAQ3LoAAAATABAREjm4ABgQuAAN0LgADS+4AATcuAAH0LgABy+4AA0QuAAI0LgACC+6AAsAEwAQERI5uAAEELgAD9C4ABAQuAAZ3AC6ABMAAABnK7oACwAUAGcruAATELgABNC4ABQQuAAH0LoADQAAABMREjm6AA4AFAALERI5MDEpASYnNyERISc2NyEBBxEXAQYHJxE3FhcBzP6YKApQASz+1VAKKAFn/rZQUAGQCigeHigKCigeAjAeKAr9lB4CRB79xigKUAIwUAooAAADADIAAACCAtAABAALAA8AQ7gAZCu6AAIAAwBnK7gAAxC4AAXQuAACELgACdC4AAIQuAAM0LgAAxC4AA3QALgABy+6AA8ADABnK7gADxC4AAPcMDETFxUjPQI3FhcRBxMjNTNuFFAeKAoUFFBQAV4UqoKM0lAKKP7oFP6OUAAAAAIAMgIIASMC0QAEAAkAO7gAZCu4AAovuAAHL7gAChC4AALQuAACL7gAANy4AAcQuAAF3LgAC9wAuAADL7gACC+4AAEvuAAGLzAxEwcnNTMXByc1M4IoKFChKChQAjAoKKCfKCigAAAADAAyAHcB6gJYAAUACwARABcAHQAjACkALwA1ADsAQQBHAOe4AGQruABIL7gAEi+4AEgQuAAM0LgADC+4AA7cuAASELgAFNy4AAwQuAAY0LgADhC4ABrQuAASELgAHtC4ABQQuAAg0LgAEhC4ACTQuAAUELgAJtC4AAwQuAAq0LgADhC4ACzQALgAGS+4AB8vuAAoL7gALi+6ADYAOABnK7oAQgBEAGcruABCELgAANC4AAAvuABEELgAAtC4AAIvuAA2ELgABtC4AAYvuAA4ELgACNC4AAgvuAA2ELgAMNC4ADAvuAA4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AA4AAhESOboAEAAOAAIREjm6ABQADgACERI5MDETNTcXFTcXDwEfAQcnFQcnNQcnPwEvATevKChGNw9FRQ83RigoRjcPRUUPNwGuUCgoUCgPNygoNw8oUCgoUCgPNygoNw8AAAABADIAvgGGAhIADwA/uABkK7oABAAAAGcruAAEELgACNC4AAAQuAAL0AC4AAovuAACL7oABQAHAGcruAAFELgAANC4AAcQuAAM0DAxEzU3FxUzFwcjFQcnNSMnN7QoKFooKFooKFooKAGQWigoWigoWigoWigoAAABADL/iACCAFAABAAXuABkK7oAAAACAGcrALgAAS+4AAMvMDEXByc1M4IoKFBQKCigAAAAAQAyAUABhgGQAAUAD7gAZCsAugAAAAIAZyswMQEXByEnNwFeKCj+/CgoAZAoKCgoAAAAAAEAMgAAAIIAUAADABe4AGQrugAAAAEAZysAugADAAAAZyswMTMjNTOCUFBQAAAAAAIAMgAAAdYC0AAFAAsAD7gAZCsAuAABL7gABy8wMQE3MhcDIw8BIicTMwEPdzwUmi0WdzwUmi0B3vIo/sqA8igBNgAABgAyAAAB1gLQAAYADAARABcAHAAjAK+4AGQruAAkL7gABS+4AALcugAHAAUAAhESObgAJBC4AA3QuAANL7gAC9y4ABDQuAALELgAE9C4ABMvuAANELgAFNC4ABQvugAXAAUAAhESObgACxC4ABjQuAANELgAG9C4AAUQuAAd0LgAAhC4ACHQuAACELgAJdwAugAFAAcAZyu6ABcAHgBnK7gABRC4AAvQugANAAcABRESObgAHhC4ABPQugAcAB4AFxESOTAxARcRBgcnNRMhJic3MwURNxcVEyMnNjchBRUHJxEFNTcWFxEHAcIUCigeCv7UKApQ8P7AFDzw71AKKAEr/vI8FAFUHigKFAFeFP7oKApQ0v7eCigeCgEEFDy+AhweKApkvjwUAQTc0lAKKP7oFAACADIAAACCAtAABgANAC+4AForugACAAUAXSu4AAUQuAAH0LgAAhC4AAvQuAACELgAD9wAuAAEL7gACS8wMRMXEQYHJz0CNxYXEQduFAooHh4oChQBXhT+6CgKUNKM0lAKKP7oFAAAAAUAMgAAAdYC0AAFAAsAEAAWAB0ApbgAZCu4AB4vuAAAL7gAAtC4AB4QuAAM0LgADC+4AArcuAAD0LgAChC4AAXQuAAAELgAHNy6AAYAAAAcERI5uAAKELgAD9C4AAoQuAAS0LgAEi+4AAwQuAAT0LgAEy+6ABYAAAAcERI5uAAAELgAF9C4ABwQuAAf3AC6AAsABgBnK7oAFgAYAGcrugAAAAIAZyu6AAwABgALERI5uAAYELgAEtAwMQEXByEnNwEhJic3IQURNxcVEyMnNjchAzU3FhcRBwGGKCj+/CgoASz+tigKUAEO/qIUPPDvUAooASsKHigKFAGQKCgoKP5wCigeCgEEFDy+AhweKAr+3tJQCij+6BQAAAAABQAyAAAB1gLQAAUADAASABgAHwBruABaK7oAHgAAAF0ruAAeELgAB9C4AAAQuAAL0LoADQAAAB4REjm6ABgAAAAeERI5uAAAELgAGdC4AB4QuAAh3AC6AAsADQBdK7oAGAAaAF0rugAAAAIAXSu4AAsQuAAR0LgAGhC4ABTQMDEBFwchJzcFFxEGByc1EyEmJzczESMnNjchAzU3FhcRBwGGKCj+/CgoAUAUCigeCv7UKApQ8O9QCigBKwoeKAoUAZAoKCgoMhT+6CgKUNL+3gooHgIwHigK/t7SUAoo/ugUAAAABAAyAAAB1gLQAAUADAARABgAbbgAZCu4ABkvuAAAL7gAAtC4ABkQuAAQ0LgAEC+4AAXcuAAD0LgAABC4ABfcuAAH0LgAABC4AAvQuAAFELgADdC4AAAQuAAS0LgAFxC4ABrcALgAFC+4AAovugAAAAIAZyu6ABEACgAUERI5MDEBFwchJzcFFxEGByc1ARUHJxEFNTcWFxEHAYYoKP78KCgBQBQKKB7+/DwUAVQeKAoUAZAoKCgoMhT+6CgKUNIBaNw8FAEi+tJQCij+6BQAAAUAMgAAAdYC0AAFAAwAEgAYAB0ArbgAZCu4AB4vuAACL7gAANC4AB4QuAAQ0LgAEC+4ABHcuAAD0LgAERC4AAXQuAACELgAB9y4AAIQuAAL0LoADQACAAcREjm4ABEQuAAU0LgAFC+4ABAQuAAV0LgAFS+6ABgAAgAHERI5uAARELgAGdC4ABAQuAAc0LgABxC4AB/cALoACwANAGcrugAYABMAZyu6AAAAAgBnK7gACxC4ABHQugAdABMAGBESOTAxARcHISc3BRcRBgcnNRMhJic3MxMhJzY3IQUVBycRAYYoKP78KCgBQBQKKB4K/tQoClDwHv7zUAooAUn+1DwUAZAoKCgoMhT+6CgKUNL+3gooHgIwHigKZL48FAEEAAYAMgAAAdYC0AAFAAwAEgAXAB0AIgC/uABkK7gAIy+4AAIvuAAA0LgAIxC4ABPQuAATL7gAEdy4AAPQuAARELgABdC4AAIQuAAH3LgAAhC4AAvQugANAAIABxESObgAERC4ABbQuAARELgAGdC4ABkvuAATELgAGtC4ABovugAdAAIABxESObgAERC4AB7QuAATELgAIdC4AAcQuAAk3AC6AAsADQBnK7oAHQAYAGcrugAAAAIAZyu4AAsQuAAR0LoAEwANAAsREjm6ACIAGAAdERI5MDEBFwchJzcFFxEGByc1EyEmJzczBRE3FxUBISc2NyEFFQcnEQGGKCj+/CgoAUAUCigeCv7UKApQ8P7AFDwBDv7zUAooAUn+1DwUAZAoKCgoMhT+6CgKUNL+3gooHgoBBBQ8vgIcHigKZL48FAEEAAQAMgAAAdYC0AAGAAwAEQAYAHe4AForuAAZL7gABS+4AALcuAAZELgAENC4ABAvuAAO3LgACNC4AAgvuAAQELgACdC4AAkvugAMAAUAAhESObgABRC4ABLQuAACELgAFtC4AAIQuAAa3AC4AAQvugAMABMAXSu4ABMQuAAI0LoAEQATAAwREjkwMQEXEQYHJzUDIyc2NyEFFQcnEQU1NxYXEQcBwhQKKB4U71AKKAEr/vI8FAFUHigKFAFeFP7oKApQ0gFeHigKZL48FAEE3NJQCij+6BQAAAcAMgAAAdYC0AAFAAwAEgAXAB0AIgApANO4AForuAAqL7gAAC+4AALQuAAqELgAE9C4ABMvuAAR3LgAA9C4ABEQuAAF0LgAABC4ACjcuAAH0LgAABC4AAvQugANAAAAKBESObgAERC4ABbQuAARELgAGdC4ABkvuAATELgAGtC4ABovugAdAAAAKBESObgAERC4AB7QuAATELgAIdC4AAAQuAAj0LgAKBC4ACvcALoACwANAF0rugAdACQAXSu6AAAAAgBdK7gACxC4ABHQugATAA0ACxESObgAJBC4ABnQugAiACQAHRESOTAxARcHISc3BRcRBgcnNRMhJic3MwURNxcVEyMnNjchBRUHJxEFNTcWFxEHAYYoKP78KCgBQBQKKB4K/tQoClDw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KBC4AAvQuAALL7oABQALAAIREjm4AAncuAAO0LgACRC4ABHQuAARL7gACxC4ABLQuAASL7oAFQADAAIREjm4AAkQuAAW0LgACxC4ABnQuAADELgAG9C4AAIQuAAf0LgAAhC4ACncALgAJS+6AAoABQBnK7oAFQAcAGcrugALAAUAChESObgAHBC4ABHQugAaABwAFRESOTAxARcVJzUDISYnNzMHETcXFRMjJzY3IQUVBycRBTU3FhcRDwEzFxUjJwHCFFAK/ugoClCq+hQ88O9QCigBK/7yPBQBVB4oChSgPII8ggFeFPBQeP7eCigeCgEEFDy+AhweKApkvjwUAQTc0lAKKP7oFL6CPIIAAAAABgAyAAAB1gLQAAUACwASABgAHwAkAK+4AGQruAAlL7gAAC+4AALQuAAlELgAENC4ABAvuAAN3LgAA9C4AA0QuAAF0LgAABC4AB7cuAAI0LgAABC4AArQuAANELgAFNC4ABQvuAAQELgAFdC4ABUvugAYAAAAHhESObgAABC4ABnQuAANELgAINC4ABAQuAAj0LgAHhC4ACbcALgACi+4AA4vugAYABoAZyu6AAAAAgBnK7gAGhC4ABTQugAkABoAGBESOTAxARcHISc3FzMBBiMvARUHJicRNwEjJzY3IQM1NxYXEQclFQcnEQGGKCj+/CgoFDwBBBQ88BQeKAoUASzvUAooASsKHigKFP7APBQBkCgoKChk/vwo8DLSUAooARgUASIeKAr+3tJQCij+6BT6vjwUAQQABQAyAAAB1gLQAAUADAASABcAHwCzuABkK7gAIC+4AAIvuAAA0LgAIBC4ABDQuAAQL7gAEdy4AAPQuAARELgABdC4AAIQuAAH3LgAAhC4AAvQugANAAIABxESObgAERC4ABPQuAAQELgAFtC4ABEQuAAY0LgAGC+4ABAQuAAZ0LgAGS+4AAcQuAAe0LgAAhC4AB/QuAAHELgAIdwAugALAA0AZyu6ABsAGABnK7oAAAACAGcruAALELgAEdC6ABcAGAAbERI5MDEBFwchJzcFFxEGByc1EyEmJzczAxUHJxEXJzY3IRYXBwGGKCj+/CgoAUAUCigeCv7UKApQ8PA8FFFQCigBPygKUAGQKCgoKDIU/ugoClDS/t4KKB4CHL48FAEECh4oCgooHgAAAwAyAAAB1QLQAAYACwAT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KIsUASIoKEYoKGTmFDzcAnYUCigeCtw8FOb95B4oChQBfCgoKCgAAAAFADIBSgHqAhwABQALABEAFwAdAD+4AGQrALgAGi+4ABIvugAAAAIAZyu4AAAQuAAG0LgABi+4AAIQuAAI0LgACC+4AAAQuAAM0LgAAhC4AA7QMDEBFwcjJzcHFwcjJzclFwcjJzcnFwcjJzcfAQcjJzcBIigoKCgoeCgoKCgoAWgoKCgoKMgoKCgoKMgoKCgoKAHgKCgoKAEoKCgoASgoKCg8KCgoKIIoKCgoAAAAAA4AMv//AhwC0AAFAAsAEQAXAB0AIwApAC8ANQA7AEEARwBNAFMBKbgAZCu6ABwACABnK7oALAAoAGcrugALAAgAHBESObgACBC4ABDQugAXAAgAHBESOboAIwAoACwREjm6AC8AKAAsERI5uAAsELgANNC6AEoACAAcERI5uABKL7gAOty6AEEACAAcERI5uABKELgARtC6AEcACAAcERI5ugBNAEoAOhESObgALBC4AFXcALgACi+4ABovuAAmL7gALi+4AEAvuABEL7gAQBC4ADjcuAAB0LoAEQBAAAoREjm6ABcAQAAKERI5ugAdAEAAChESObgAOBC4ACLQugAjAEAAChESOboAKQBAADgREjm4AEAQuAAv0LgALy+6ADUAQAA4ERI5ugA7AEAAOBESOboARwBAADgREjm4ADgQuABM0LoATQBAAAoREjkwMQEHBj8BMycjJzY3MwcVByYnNRczFwYHIzc1NxYXFRMjJzY3MwcVByYnNRczFwYHIzc1NxYXFSU1NxYXFSczFwYHIzcVByYnNRcjJzY3MxM3Ng8BJwEXoDwBvR6LClAKKEYoHigKZApQCihGKB4oCsgKUAooRiceKApjClAKKEYoHigK/soeKApaClAKKEYKHigKWgpQCihGMqA8Ab0eAY+fATy+lx4oCmQ8UAooeFoeKApkPFAKKHj+eh4oCmQ8UAooeFoeKApkPFAKKHgePFAKKHgJHigKjTxQCih4Ch4oCgEjnwE8vwEAAAAAAQAyAggAggLQAAQAF7gAZCu6AAAAAQBnKwC4AAAvuAADLzAxEyM1NxeCUCgoAgigKCgAAAEAMgIIAIIC0AAEABe4AGQrugAAAAIAZysAuAABL7gAAy8wMRMHJzUzgigoUAIwKCigAAACADICCAEi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') format('truetype');
}
//for tests: make comment "//" next, last, 29th and 53th line; activate (delete "//") 7th line
//xxAPI.functions.XXRSLIDER = function( oarg ) {
//////////////////
// overwrite values for tests
//////////////////
var rot_test = false;
rot_test = true; //7th line
//////////// Start Logic
var xx_; // short form for 'oarg.item.xxapi', also for tests
var rot_;// short form for 'oarg.item.xxapi.rot', also for tests
if (rot_test){
xx_ = {}; //for tests
} else {
xx_ = oarg.item.xxapi; //for production, use of "xxapi.js" library
}
rot_ = xx_.rot;
rot_ = {};
if (rot_test){
initRotByDefault();
rot_.var=4; //4=Heizung
rot_.pat=1; //bg_blackGrid
rot_.colinv=0; //colinv
console.log('value:',rot_.value);
initVarPredefined();
} else { //(!rot_test)
debug(2,"XXRSLIDER",oarg);
if(oarg.item.action_id != 9) {
debug(1,"XXRSLIDER needs Action 'Werteingabe'", oarg);
// return; //29th line
}//action_id != 9
oarg.item.text = "";
oarg.item.value = Number(oarg.args[1]); // from calling app
rot_.value = oarg.item.value;
if(rot_.hasOwnProperty("rslider_init")) {
rot_.valDeg = calcVal2Rt(rot_.value); // in Deg
TweenMax.set(xx_.dial, {rotation:rot_.valDeg})
doDial(rot_.valDeg);
} else {
oarg.item.customcss = {
"background-color" : "transparent",
"pointer-events" : "auto",
"overflow" : "initial"
}
initRotByDefault();
oarg.item.click = false;
}//if-else property rslider_init
if($.isEmptyObject(oarg.item.info)) {
debug(4,"XXRSLIDER no item info " + oarg.item.uid, oarg);
oarg.item.item_callback = function() {
oarg.iscallback = true;
xxAPI.functions.XXRSLIDER( oarg );
}//callback
//return; //53th line
}//if isEmptyObject --> callback
}//(!rot_test)
if(!xx_.hasOwnProperty("rslider")) { //used always, independant from rot_test
xx_.start = document.createElement('div');
if (rot_test){
document.body.appendChild(xx_.start);
TweenMax.set(document.body, {backgroundColor:'#181A19',userSelect:'none'});
} else {
////values from calling app
var _text2 = oarg.item.info._txt2 || "";
if(_text2.match(/^XXOPTIONS\*/)) { // additional values from calling app
rot_=Object.assign({},rot_,hs.functions.option_parser(_text2.substring(10),rot_));
}
rot_.width = oarg.item.width || 240;// set width from calling app
rot_.height = oarg.item.height || 240;// set height from calling app
rot_.unit = oarg.item.info._einh || ""; // set unit from calling app
rot_.valPrec = oarg.item.info._prec || 0; // set valPrec from calling app
rot_.valBaseStart= oarg.item.info._min || 0; // set valPrec from calling app
rot_.valBase = oarg.item.info._max || 0; // set valPrec from calling app
//calculations and automatic settings - based on parameters from calling app
if (rot_.pat==2) rot_.pattern=rot_.pattern2; //blackGrid
if (rot_.pat==3) rot_.pattern=rot_.pattern3; //black
if (rot_.pat==4) rot_.pattern=rot_.pattern4; //greenGrid
if (rot_.pat==4) rot_.colinv =1; //greenGrid
rot_.valBase=rot_.valBase-rot_.valBaseStart; // calc valBase
rot_.valLength=
Math.floor(Math.log10(Math.abs(rot_.valBase))+1)||0; // calc valLength
if (rot_.valPrec) // .. add prec
rot_.valLength=rot_.valLength+rot_.valPrec+1; //
if (rot_.valBaseStart<0) // .. add minus-sign
rot_.valLength++; //
////end values from calling app
initVarPredefined();
}//(!rot_test)
createDialValueAndKnob();
createDialScale();
createDialDraggable();
if (!rot_test)
xx_.rslider = xx_.start;
}//(!xx_.hasOwnProperty("rslider"))
if (!rot_test){
if(oarg.iscallback) {
oarg.item.object.html(xx_.rslider);
} else {
oarg.item.html = xx_.rslider;
}
}//(!rot_test)
//all function calls from here
function initRotByDefault(){ //default values --> can be changed over XXOPTIONS* (some can be changed only with problems)
rot_ = { // ***default values***
rslider_init:1, // INIT
var:0, // 0:Default, 1: Sollwert Heizung, 2: Dimmer, 3: Lautsprecher, 4: Temperatur
value:0, // init value (send from calling app) and actual/end value (send to calling app)
tr:true, // move triangle, false: it seams that it not move - but it moves (invisible) in the opposite direction
insDial:true, // dialnumbers - inside
dialLive:true, // dialnumbers - inside ... true: always horizontal (== 'rotating' during spin), false: along the circle
dialFixed2Center:0, // 0: none, 90: 90 degrees (to the center) --> no dialLive
outsDial:false, // dialnumbers - outside
outsDialDistance:0, // 0=inside, 80=outside
arcStartDeg:null, // start arc
valDeg:0, // value in deg (0..maxDeg)
valBase:100, // base of values, e.g. 100 for percent, 5 for Sollwertabweichung
valBaseStart:0, // start base vaule, e.g. 0 for percent, -2.5 for Sollwertabweichung
valLength:3, // length incl sign (dots included)
valPrec:0, // precision (Anz.Kommastellen)
numDigits:1, // 10 hoch val.Prec = anz. der Stellen (rundungsgenauigkeit)
maxDeg:300, // max. rotation
stepDeg:15, // deg of each rotation step (base: full rotation == 360)
fullRotation:360, //
arc:0, // rotation between -arc and arc
unit:'', // examples: '%', '°C'
br:false, // unit 2-lines, separated with '<br>' -- not work
ticks:2, // 1: no ticks, 2: 10 . 20 . 30, 3: 10 . . 20 . . 30
xticks:3, //
numDialFaces:24, // 4*2*2=8 (45°), 4*3*1=12 (30°), 4*3*2=24 (15°): dh. ein vielfaches von 4*x*rot_.ticks
width:240, // width of the knob
height:240, // height of the knob
szB:800, // base size knob generator
szR:400, // base radius knob generator, important by outsDialDistance
lcd:false, // dialValue: lcd (true), Digital-7 or Arial font (false)
blur:'blur(2px)', // blur background dialValue
colDialValue:'#5f0', // color dialValue (green: #5f0; ...)
colTr:'red', // color triangle
colinv:0, // text color --light bg
colTxt:'silver', // text color --dark bg
colArcFrom:'lightyellow', // arc color from
colArc2:'whitesmoke', // ..
colArc3:'whitesmoke', // colArc3 additional: arc-background-color
colArc4:'whitesmoke', // ..
colArcTo:'gold', // arc color to
scaleColor:null, // d3.color
pat:1, // pattern#
//pattern: 'img/Bg_transparent.png',// pattern for knob
pattern2:'img/Bg_blackGrid.png', // pattern for knob
pattern3:'img/Bg_black.png', // pattern for knob
pattern4:'img/Bg_greenGrid.png', // pattern for knob
// pattern: 'img/knob.steel.jpg', // pattern for knob
pattern: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/314556/metalGrid.jpg',
// pattern: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/knob_Base.png',
useInsTbl: false, // use of dialNumTbl
dialNumTbl:['0','.','1','.','2','.',/*3*/'3','','4','','5','','6','','7','','8','','9','','10','','11','','12']
}
}//initRotByDefault
function initVarPredefined(){ //predefined variants
if(rot_test){
rot_.width=240;
rot_.height=240;
}
if(rot_.var == 1){ // Sollwertabweichung Heizung
if(rot_test){
rot_.value = -1.5; // only for test
rot_.unit ='°C'; //from app
rot_.valBase = 5;
rot_.valBaseStart = -2.5;
rot_.valPrec = 1; //from app
rot_.valLength = 4;
}
rot_.insDial=false;
rot_.arcStartDeg=0;
rot_.ticks = 2;
rot_.xticks = 1.5;
rot_.arc=150;
rot_.useInsTbl=true;
rot_.colArcFrom='royalblue';
rot_.colArc2='lightskyblue';
rot_.colArc3='whitesmoke'; // background-color
rot_.colArc4='orange';
rot_.colArcTo='darkorange';
rot_.scaleColor=d3.scaleLinear()
.domain([toRad(-rot_.arc),toRad(-rot_.arc/2),0,toRad(rot_.arc/2),toRad(rot_.arc)])
.range([rot_.colArcFrom,rot_.colArc2,rot_.colArc3,rot_.colArc4,rot_.colArcTo]);
rot_.dialNumTbl =
['0°C'/* 0*/,'.'/*10*/,'+1°C'/*20*/,'.'/*30*/,'+2°C'/* 40*/,'.'/*50*/,
'' /*60*/,'.'/*70*/,'-2°C'/*80*/,'.'/*90*/,'-1°C'/*100*/,'.'/*110*/,''/*120*/];
}//rot_.var==1 (Sollwertabweichung Heizung)
if(rot_.var == 2){ // Dimmer
if (rot_test){
rot_.value=75;
rot_.unit ='%'; //from app
}
rot_.arc=150;
rot_.ticks = 2;
rot_.colArcFrom='lightyellow';
rot_.colArc3='whitesmoke'; // background-color
rot_.colArcTo='gold';
} //rot_.var==2 (Dimmer)
if(rot_.var == 3){ // Loudspeaker
rot_.tr=false ;
rot_.maxDeg=288;
if(rot_test){
rot_.value =70;
rot_.unit ='db'; //from app
rot_.valBaseStart = 0;
rot_.valBase = 80;
rot_.valLength = 2;
}
rot_.ticks = 2;
rot_.xticks = 2.5;
rot_.colArcFrom='chartreuse';
rot_.colArc3='whitesmoke'; // background-color
rot_.colArcTo='DarkGreen';
rot_.scaleColor=d3.scaleLinear()
.domain([toRad(0),toRad(rot_.maxDeg)])
.range([rot_.colArcFrom,rot_.colArcTo]);
}//rot_.var==3 (Loudspeaker)
if(rot_.var == 4){ // Heizung
if(rot_test){
rot_.value=16;
rot_.valBase = 20;
rot_.valBaseStart = 7;
rot_.valLength=2;
rot_.valPrec=0; //from app
rot_.unit ='°C'; //from app
}
rot_.ticks = 2;
rot_.xticks = 3;
rot_.arc=150;
rot_.arcStartDeg=-rot_.arc;
rot_.colArcFrom='royalblue';
rot_.colArc2='lightskyblue';
rot_.colArc3='whitesmoke'; // background-color
rot_.colArc4='orange';
rot_.colArcTo='darkorange';
rot_.scaleColor=d3.scaleLinear()
.domain([toRad(-rot_.arc),toRad(-rot_.arc/2),0,toRad(rot_.arc/2),toRad(rot_.arc)])
.range([rot_.colArcFrom,rot_.colArc2,rot_.colArc3,rot_.colArc4,rot_.colArcTo]);
}//rot_.var==4 (Heizung)
/////////////// Changes depends on configured variants
if (rot_.insDial) {
rot_.outsDial=false;
rot_.outsDialDistance=0;
}
if (rot_.outsDial){
rot_.outsDialDistance=80; //can be changed general here
rot_.insDial=false;
rot_.dialLive=0;
}
if (rot_.arc){ //default settings for arc
rot_.dialLive = 0;
rot_.maxDeg=2*rot_.arc;
if (rot_.arcStartDeg===null) rot_.arcStartDeg = -rot_.arc;
if (rot_.var in [0,2]){ //no variant - default
rot_.scaleColor=d3.scaleLinear()
.domain([toRad(-rot_.arc),toRad(rot_.arc)])
.range([rot_.colArcFrom,rot_.colArcTo]);
}//rot_.var in [0,2]
}//rot_.arc
if (rot_.arcStartDeg===null) rot_.arcStartDeg = 0; //default
rot_.dialLive = (rot_.dialFixed2Center ? false : rot_.dialLive); // false = no, true = yes
////////////////// COLORS
if (rot_.colinv){//text color on light background
rot_.colTxt='black',
rot_.colDialValue='black';
}
if (rot_.scaleColor===null) //default, when not defined
rot_.scaleColor=d3.scaleLinear()
.domain([toRad(rot_.arcStartDeg),toRad(rot_.arc?rot_.arc:rot_.maxDeg)])
.range([rot_.colArcFrom,rot_.colArcTo]);
//calculations - based on above settings
rot_.szR = (rot_.szB)/2-rot_.outsDialDistance; // radius inside, when dial# outside
rot_.numDigits = Math.pow(10,rot_.valPrec); // Math.round - depending on valPrec
rot_.value = Math.round(rot_.value*rot_.numDigits)/rot_.numDigits;// from calling app
rot_.numDialFaces = 4*rot_.xticks*rot_.ticks; // 4*1*2=8 (45°), 4*3*1=12 (30°), 4*3*2=24 (15°): dh. ein vielfaches von 4*rot_.xticks*rot_.ticks
rot_.stepDeg = rot_.fullRotation/rot_.numDialFaces; // each rotation step in Deg
if(rot_.arc){rot_.maxDeg=rot_.arc*2} //
rot_.valDeg = calcVal2Rt(rot_.value); // in Deg
// rot_.valDeg = rot_.valDeg - rot_.valDeg%rot_.stepDeg; // full STEPS by start, otherwise not OK from Draggable
}//initVarPredefined
///////////// END Global Initializations
function createDialKnob(dialLive,nodialLive){ // Create Knob (SVG Graphic)
var dial = (rot_.dialLive) ? dialLive : nodialLive;
cr_c(dial,p(rot_.szB),p(rot_.szR-40),p(40),"",1,"img",null); //circle with pattern
cr_c(nodialLive,p(rot_.szB),p(rot_.szR),p(40),"#181a19",1,"circle",null); //circle background 1
cr_c(dial,p(rot_.szB),p(rot_.szR),p(40),rot_.colArc3,0.3,"circle",null); //circle background 2
xx_.arc = //arc
cr_c(nodialLive,p(rot_.szB),p(rot_.szR-8),p(30),rot_.scaleColor(toRad(rot_.valDeg)),0.9,"arc",rot_.valDeg);
cr_c(dial,p(rot_.szB),p(rot_.szR-2),p(4), "#FFF",0.1,"circle",null); //circle
cr_c(dial,p(rot_.szB),p(rot_.szR-40),p(20),"#333",1, "circle",null); //..
cr_c(dial,p(rot_.szB),p(rot_.szR-44),p(4), "#FFF",0.1,"circle",null); //..
cr_c(dial,p(rot_.szB),p(rot_.szR-50),p(4), "#000",1, "circle",null); //..
cr_t((rot_.tr)?dialLive:nodialLive,p(rot_.szB),p(31), p( 8+rot_.szB/2-rot_.szR),rot_.colTr,1, rot_.outsDial/*direction*/);
cr_t((rot_.tr)?dialLive:nodialLive,p(rot_.szB),p(24), p(12+rot_.szB/2-rot_.szR),rot_.colTr,0.3,rot_.outsDial/*direction*/);
// functions for creation of the 'knob'
function cr_svg(dom,sz){ //create and append d3.svg
return d3.select(dom)
.append('svg:svg').attr('width',sz).attr('height',sz)
.style('position','absolute').style('top',0).style('left',0)
.style('xPercent',-50).style('yPercent',-50);
}//cr_svg
function cr_c(dom,sz,br,bw,bc,bo,v,arc){ //create circle
var c = cr_svg(dom,sz);
if(v=='arc'){ //arc
return drawArc(c,sz,br,bw,bc,bo,arc)
} else { //circle
if(v=='img') { //backgroundImage
c .append("svg:defs")
.append("svg:pattern")
.attr("id","patternKnob").attr('patternUnits','userSpaceOnUse')
.attr("height", 800).attr("width", 800)
.append("svg:image").attr("x",0).attr("y",0)
.attr("xlink:href",rot_.pattern)
.attr("height", sz).attr("width", sz)
}
return drawCircle(c,sz,br,bw,bc,bo)
} //if-else
} //cr_c
function cr_t(dom,sz,sz_tr,tp,fc,fo,directionUp){ //triangle with d3-canvas
var c = cr_svg(dom,sz);
var px=d3.path();//d3 canvas (svg)
if(directionUp){ //triangle direction up
px.moveTo(sz/2,tp);
px.lineTo(sz/2-sz_tr/2,tp+sz_tr);
px.lineTo(sz/2+sz_tr/2,tp+sz_tr);
} else { //triangle direction down
px.moveTo(sz/2,tp+sz_tr);
px.lineTo(sz/2-sz_tr/2,tp);
px.lineTo(sz/2+sz_tr/2,tp);
}//if-else
px.closePath();
var cx=c.append('svg:path').attr('d',px.toString()).attr('fill',fc).style('fill-opacity',fo);
return cx
} //cr_tr - triangle
} // createDialKnob
function drawArc(c,sz,br,bw,bc,bo,arc){
xx_.arcGen = d3.arc()
.innerRadius(br-bw)
.outerRadius(br)
.cornerRadius(1.5)
.startAngle(toRad(rot_.arcStartDeg));
var g = c.append('svg:g').attr('transform','translate('+ sz/2 +','+ sz/2 +')');
var cx = g.append('svg:path')
.datum({endAngle:toRad(arc)})
.style('fill', rot_.scaleColor(arc))
// .style('fill', bc)
.style('opacity',bo)
.attr('d', xx_.arcGen);
return cx
} //drawArc
function drawCircle(c,sz,br,bw,bc,bo){
var cx = c.append('svg:circle').attr('cx',sz/2).attr('cy',sz/2).attr('r',br-bw/2);
if(bc){
cx.attr('stroke', bc).attr('stroke-width',bw).attr('fill','none')
.style('stroke-opacity',bo);
} else {
cx.attr('fill','url(#patternKnob)')
}
return cx
} //drawCircle
function arcTo(endAngleNew){
console.log('arcTo',endAngleNew);
console.log('arcVo',rot_.arcStartDeg);
function arcD(endAngleNew) {
return function(d) {
d.endAngle = toRad(endAngleNew);
return xx_.arcGen(d);
} //function 'd'
} //arc
xx_.arc.attr('d', arcD(endAngleNew));
xx_.arc.style('fill',rot_.scaleColor(toRad(endAngleNew)));
} //arcTo
//////////// Start
function digitQ(y,n,tr){
var cx = d3.path();
cx.moveTo(10+n*56+tr*8,8+y*40);
cx.lineTo(14+n*56+tr*8,4+y*40);
cx.lineTo(42+n*56+tr*8,4+y*40);
cx.lineTo(46+n*56+tr*8,8+y*40);
cx.lineTo(42+n*56+tr*8,12+y*40);
cx.lineTo(14+n*56+tr*8,12+y*40);
cx.lineTo(10+n*56+tr*8,8+y*40);
cx.closePath();
return cx.toString()
}//digitQ
function digitH(x,y,n,tr){
var cx = d3.path();
cx.moveTo(8+x*40+n*56+tr*8,10+y*40);
cx.lineTo(12+x*40+n*56+tr*8,14+y*40);
cx.lineTo(12+x*40+n*56+tr*8,42+y*40);
cx.lineTo(8+x*40+n*56+tr*8,46+y*40);
cx.lineTo(4+x*40+n*56+tr*8,42+y*40);
cx.lineTo(4+x*40+n*56+tr*8,14+y*40);
cx.lineTo(8+x*40+n*56+tr*8,10+y*40);
cx.closePath();
return cx.toString()
}//digitH
function createDecSept(g,n,tr){
var gx = g.append('svg:g')
.attr('class','decSept')
.attr('transform', 'skewX(-8)');
gx.append('svg:circle')
.attr('cx',56*n+8*tr).attr('cy',88)
.attr('r',4);
}//createDecSept
function createTxtUnit(g,n,tr,txt){
var gx = g.append('svg:g')
.attr('class','txtUnit')
.attr('transform', 'skewX(-8)');
gx.append('text')
.text(txt)
.attr('x',56*(n-1)+8*(tr+2)).attr('y',78)
.attr('id','txtU')
}//createTxtUnit
function calcLength(c,len,prec,sz,txt){
var ltxt=0;
if(txt) {
var p = c.append('svg:text').attr('x',0).attr('y',0).text(txt);
ltxt = p.node().getComputedTextLength();
}
return (len-(prec!=0))*56 + (prec!=0)*8 + ltxt + 4
}//calcLength
function createSegment(g,n,tr){
var gx = g.append('svg:g')
.attr('class','digit')
.attr('transform', 'skewX(-8)');
gx.append('svg:path').attr('d', digitQ(0,n,tr)); // A // AAAAAA
gx.append('svg:path').attr('d', digitH(0,0,n,tr)); // D // D E
gx.append('svg:path').attr('d', digitH(1,0,n,tr)); // E // D E
gx.append('svg:path').attr('d', digitQ(1,n,tr)); // B // BBBBBB
gx.append('svg:path').attr('d', digitH(0,1,n,tr)); // F // F G
gx.append('svg:path').attr('d', digitH(1,1,n,tr)); // G // F G
gx.append('svg:path').attr('d', digitQ(2,n,tr)); // C // CCCCCC
}//createSegment
function createDisplay(g,len,prec,unit,w,h){
var j=0;
var l=len-(prec!=0);
var gx = g.append('svg:g')
.attr('class','display')
.style('width',w)
.style('height',h)
.style('position','absolute').style('background-size','100vH auto')
.style('top','-50%').style('left','-50%')
.style('xPercent',-50).style('yPercent',-50);
for (var i=0;i<l;i++){
if(prec && i==(l-prec)){
createDecSept(gx,i,++j); // comma: . //
j++;
}
createSegment(gx,i,j); // digit,minus
}
if(unit){
createTxtUnit(gx,len,++j,unit); //
}
}//createDisplay
function setStyle() {
xx_.underlay
.style('-webkit-filter',rot_.blur)
.style('-moz-filter',rot_.blur)
.style('-ms-filter',rot_.blur)
.style('-o-filter',rot_.blur)
.style('filter',rot_.blur);
xx_.underlay.selectAll('path, circle, text')
.style('fill','none');
xx_.overlay.selectAll('path, circle')
.style('fill',rot_.colDialValue).style('stroke',rot_.colDialValue).style('stroke-opacity',0);
xx_.overlay.selectAll('text')
.style('fill',rot_.colDialValue).style('fill-opacity',0);
xx_.underlay.selectAll('.lit')
.style('fill',rot_.colDialValue).style('fill-opacity',.2).style('stroke',rot_.colDialValue);
xx_.overlay.selectAll('.lit')
.style('fill',rot_.colDialValue).style('fill-opacity',1).style('stroke-opacity',1);
}//setStyle
function setDigits(num,len,prec){
var digitPattern = [
// 0 1 2 3 4 5 6 7 8 9 - ''
[1,0,1,1,0,1,1,1,1,1,0,0], // 0 // 0000
[1,0,0,0,1,1,1,0,1,1,0,0], // 1 // 1 2
[1,1,1,1,1,0,0,1,1,1,0,0], // 2 // 1 2
[0,0,1,1,1,1,1,0,1,1,1,0], // 3 // 3333
[1,0,1,0,0,0,1,0,1,0,0,0], // 4 // 4 5
[1,1,0,1,1,1,1,1,1,1,0,0], // 5 // 4 5
[1,0,1,1,0,1,1,0,1,1,0,0] // 6 // 6666
];
var sN = d3.format(len+'.'+prec+'f')(num).replace('.','');
sN = sN.substring(sN.length-len,sN.length);
var sD = [].map.call(sN,function(dP){return Number(dP=='-'?10:dP==' '? 11:dP)});
xx_.digit = xx_.digit.data(sD);
for (var i=0;i<7;i++){
xx_.digit.select('path:nth-child('+(i+1)+')').classed('lit', function(d) { return digitPattern[i][d]; });
}
xx_.decSept.select('circle').classed('lit',1);
xx_.txtUnit.select('text').classed('lit',1);
setStyle();
}//setDigits
function createLCDdisplay(dom) {
///////////////////
var w=rot_.szB,
h=96;
xx_.dummy = dom
.append('svg:svg').attr('width',w).attr('height',h) //.attr('viewBox',[0,0,w,h].join(' '));
var l = calcLength(xx_.dummy,rot_.valLength,rot_.valPrec,w,rot_.unit)*1.7;
xx_.dummy.remove();
xx_.lcdContainer = dom
.append('svg:svg')
// .attr('viewBox',[-120,-120,240,240].join(' '))
.attr('viewBox',[-l/2,-h/2,l,h].join(' '))
.style('position','absolute')
.style('width', p(l)).style('height',p(h))
.style('display','flex').style('align-items','center').style('justifyContent','center')
.style('vertical-align','middle').style('text-align','center')
.style('top', '50%').style('left','50%')
// .style('right','50%')
// .style('xPercent',-50).style('yPercent',-50);
.style('font-family', 'Arial, Helvetica, sans-serif')
.style('font-weight', 200).style('font-size', 96)
.style('background-size', '100vH auto');
if(rot_.unit=='%') xx_.lcdContainer
.style('font-family', 'Digital-7, Helvetica, regular');
var g = xx_.lcdContainer
.append('svg:g'); //.attr('transform','translate('+(-0)+',0)');
createDisplay(g,rot_.valLength,rot_.valPrec,rot_.unit,l,h);
var bb = g.node().getBBox();
posGroup2Center(g);
// console.log('l',l,'w',bb.width,'h',bb.height,'x',bb.x,'y',bb.y);
// console.log('transform','translate(' + (-bb.width/2) + ', ' + (-bb.height/2) + ')');
xx_.underlay = dom.select('svg')
.attr('id', 'underlay');
xx_.overlay = dom.append(function() { return xx_.underlay.node().cloneNode(true); })
.attr('id', 'overlay');
xx_.lcd = dom.selectAll('svg');
xx_.digit = xx_.lcd.selectAll('.digit');
xx_.decSept = xx_.lcd.selectAll('.decSept');
xx_.txtUnit = xx_.lcd.selectAll('.txtUnit');
}//createLCDdisplay
function posGroup2Center(element){
var bb=element.node().getBBox();
var matrix = [1,0,0,1,-(bb.x+(bb.width/2)),-(bb.y+(bb.height/2))].join(' ');
element.attr('transform','matrix('+matrix+')'); //equal translate(x,y)
}//posGroup2Center
function createDivAppendTo(element,dom,styles){
xx_[element] = document.createElement('div');
xx_[element].className = element;
xx_[dom].appendChild(xx_[element]);
TweenMax.set(xx_[element], styles);
}//createDivAppendTo
function createDialValueAndKnob(){
// #1: define styles
var style_base = Object.assign({},
{position:'absolute'},{top:'50%'},{left:'50%'},{xPercent:-50},{yPercent:-50},
{backgroundColor:'rgba(0,0,0,0)'},{backgroundSize:'100vh auto'/*for scaling*/});
var style_sz = Object.assign({},
{width:rot_.width},{height:rot_.height});
var style_center = Object.assign({},
{display:'flex'},{alignItems:'center'},{justifyContent:'center'}
/* verticalAlign: 'middle', textAlign:'center' */ );
var style_lcd = Object.assign({},
{fontFamily:'D7MBI'},{fontSize:'24pt'},{y:'+2pt'});
var style_unit = Object.assign({},
{fontFamily:'Arial, Helvetica, sans-serif'},{fontSize:'20pt'},{fontStyle:'italic'},{y:'-2pt'});
var style_col_bg = Object.assign({},
{color:rot_.colDialValue},{opacity:0.6},{filter:rot_.blur});
var style_unit_alt =
(rot_.unit=='db')?
Object.assign({},{fontFamily:'D7MBI'},{fontSize:'20pt'},{fontStyle:'normal'},{y:'-2pt'}):
(rot_.unit=='%')?
Object.assign({},{fontFamily:'Digital-7'},{fontStyle:'oblique'},{fontSize:'24pt'},{y:'-2pt'}):{};
// #2: create general connectors
createDivAppendTo('not_dial','start',Object.assign({},style_base,style_sz));
createDivAppendTo('dial','start',Object.assign({},style_base,style_sz));
createDivAppendTo('dialKnob','dial', Object.assign({},style_base,style_sz));
// #3: create dialValue, based on lcd (== d3.svg) or on fonts (like as a lcd)
if(rot_.lcd) { //lcd-segment (d3.svg)
xx_.dialValue = d3.select(xx_.start).append('div');
createLCDdisplay(xx_.dialValue);
} else { //with fonts (@font-face)
createDivAppendTo('dialValueBg','start',Object.assign({},style_base,style_center,style_col_bg));
createDivAppendTo('lcdFontBg','dialValueBg',Object.assign({},style_lcd,style_col_bg));
createDivAppendTo('unitFontBg','dialValueBg',Object.assign({},style_unit,style_unit_alt));
createDivAppendTo('dialValue','start',Object.assign({},style_base,style_center,{color:rot_.colDialValue}));
createDivAppendTo('lcdFont1','dialValue',Object.assign({},style_lcd,{color:'transparent'}));
createDivAppendTo('lcdFont2','dialValue',Object.assign({},style_lcd,{color:rot_.colDialValue}));
createDivAppendTo('unitFont','dialValue',Object.assign({},style_unit,style_unit_alt,{color:rot_.colDialValue}));
xx_.lcdFontBg.innerHTML =
d3.format("8>"+rot_.valLength+"."+rot_.valPrec+"f")(8.777777777); /*LCD Background*/
xx_.unitFontBg.innerHTML = rot_.unit;
xx_.unitFont.innerHTML = rot_.unit;
}
setDialValue(rot_.value,rot_.valLength,rot_.valPrec);
TweenMax.set([xx_.dial], {rotation:rot_.valDeg});
// #4: create Knob graphic, based on d3.svg
createDialKnob(xx_.dialKnob,xx_.not_dial);
}//createDialValueAndKnob
//////////////////// Create Scale 'rotating dials'
function createDialScale(){
var style_base = {
position:'absolute',
width:0, // 0, otherwise problem with Safari
height:20,
display:'flex',alignItems:'center',justifyContent:'center'
}
var i_num = rot_.numDialFaces/360*rot_.maxDeg;
for(var i = 0; i <= rot_.numDialFaces; i++){
createDivAppendTo('dialNumContainer',rot_.dialLive?'dial':'not_dial',style_base);
createDivAppendTo('dialNum','dialNumContainer',style_base);
// Tick = HTML Unicode UTF-8 (examples)
// (1) Black circle: Dec/9679 Hex/25CF
// (2) Small black circle: Dec/8226 Hex/2022
// (3) Small up-pointing triangle: Dec/9652 Hex/25B4
// (4) Small down-pointing triangle: Dec/9662 Hex/25BE
// (5) Light vertical bar: Dec/10072 Hex/2758
// (6) Medium vertical bar: Dec/10073 Hex/2759
if(rot_.useInsTbl){ // custom: e.g.: Sollwert-Verschiebung
xx_.dialNum.innerHTML =
(rot_.dialNumTbl[i]=='.')? '●' : rot_.dialNumTbl[i]; // custom solution (with custom table)
} else {
var _i = (rot_.outsDial || rot_.arc)? i : rot_.numDialFaces-i; // clockwise:acw
_i = rt0to360(_i*rot_.stepDeg+rot_.arc)/rot_.stepDeg;
xx_.dialNum.innerHTML =
(_i>i_num)?'': //free: no number and no tick
(i%rot_.ticks)?'❘': //tick: see above examples (1)..(6)
calcRt2Val(_i*rot_.stepDeg-rot_.arc); //number rotate (always horizontal)
}//ifelse
TweenMax.set(xx_.dialNumContainer,{
rotation:rot_.stepDeg * i, // position of dialNum on circle
x:((rot_.width/2) - (0/2)) + 'px', // 0, otherwise problem with Safari
y:((rot_.outsDialDistance==0) ? 22 : 2) + 'px', // scale inside : outside
transformOrigin:'50% ' + (rot_.width/2-((rot_.outsDialDistance==0) ? 22 : 2)) + 'px' // radius -22px
})//Tween
TweenMax.set(xx_.dialNum,{
fontSize:i%rot_.ticks ? 8 : 12, // fontSize depends: tick : number
color:rot_.colTxt,
fontFamily:'Arial, Helvetica, sans-serif'
})//Tween
xx_.dialNum.initRotation = rot_.stepDeg * (i);
if(i%rot_.ticks == 0) { // rotate only num, no ticks
if(rot_.dialLive || rot_.tr) { // rotate only when dialLive or rot_.tr
TweenMax.set(xx_.dialNum, { // rotation of dialNum
rotation:
(rot_.insDial && !rot_.tr) ?
360-(rot_.stepDeg * (i)) - rot_.valDeg : // triangle spins not, triangle spins opposite direction
360-(rot_.stepDeg * (i)) // triangle spins
})//TweenMax
}
if(rot_.dialFixed2Center) { //no live Dial, direction of number is to center (90 deg)
TweenMax.set(xx_.dialNum, {
rotation:rot_.dialFixed2Center // rot_.dialFixed2Center: -90 deg == to center
})//TweenMax
}//if
}//i%rot_.ticks
}//for-loop
}//createDialScale
//////////////// GLOBAL ROTATE function
function createDialDraggable(){
xx_.lock4XY2rt=false;
xx_.myDial = Draggable.create(xx_.dial, {
bounds:{minRotation:(rot_.arc)? -rot_.arc : 0, maxRotation:(rot_.arc) ? rot_.arc : rot_.maxDeg},
type:'rotation',
dragResistance:0.4,
maxDuration:1,
throwResistance:0,
throwProps:true,
onPress: XY2rt,
onDrag: rtDial,
//otherwise, if we click and release immediately, there's momentum from the initial jump that'll cause the throwProps to kick in, but we don't want it to in this case.
onRelease:function() {if (this.tween && (xx_.lock4XY2rt || this.timeSinceDrag() > 0.02)) {this.tween.kill();}},
onUpdate:rtDial,
onThrowUpdate:rtDial,
onThrowComplete:function(){setValue(this.rotation)},
ease:Back.easeOut.config(0.3),
// liveSnap: [0, 10, 50, 100]
// liveSnap:function(endValue){ },
snap:function(rt){return rtRound(rt, rot_.stepDeg)}
})[0];
arcTo(rot_.valDeg);
setValue(rot_.valDeg);
rtDialNumbers(rot_.valDeg);
}//createDialDraggable
///////////////// rotate functions
function setValue(rt){
var val = calcRt2Val(rt);
setDialValue(val,rot_.valLength,rot_.valPrec);
setValue2App(val);
}//setValue
function rtMinMax(rt){
var r = rt;
if (r>=0) { // rt>=0
if ((rot_.arc!=0) && (((-360+r)>=-rot_.arc))) {
r=-360+r;
}
} else { // rt<0
if ((rot_.arcStartDeg<0) && ((-360+r)>rot_.arcStartDeg) && (r>rot_.arcStartDeg)) {
r = (-360-r);
}
}
if (rot_.arc) {if (r>180) {r = Math.max(r-360,-rot_.arc)}};
if (rot_.arc) {if (r>=0) {r = Math.min(r,rot_.arc)}};
return r
}//rtMinMax
function calcVal2Rt(val){
return calcXp2X(calcX2Xp(val-rot_.valBaseStart,rot_.valBase),rot_.maxDeg)-rot_.arc; // in Deg
}//calcVal2Deg
function calcRt2Val(rt){
var x = rt0to360(rt+rot_.arc);
x = rtRound(x,rot_.stepDeg);
return calcXp2X(calcX2Xp(x,rot_.maxDeg),rot_.valBase)+rot_.valBaseStart;
}//calcRt2Val
function setDialValue(val,length,prec){
if(rot_.lcd)
setDigits(val,length,prec)
else {
var x=d3.format("."+prec+"f")(val);
xx_.lcdFont2.innerHTML = x; /*visible*/
xx_.lcdFont1.innerHTML = Array(length-x.length+1).join('0'); /*invisible filler*/
}
}//setDialValue
function setValue2App(val){ //value to calling App
if (!rot_test){
if(oarg.item.value != val){
oarg.item.value = oarg.item.info._val = val;
hs.functions.do_valset( oarg )
}
}
}//setValue2App
function XY2rt(rt){
rot_.rtOffset = 90; //in case the dial's "home" position isn't at 0 degrees (pointing right). Greensock use 90 degrees.
if (rot_.var in [3]) return;
if (!xx_.lock4XY2rt) {
//figure out the angle from the pointer to the rotational origin (in degrees)
//set the rotation (with any offset that's necessary)
var _rt = deg(Math.atan2(this.pointerY - this.rotationOrigin.y, this.pointerX - this.rotationOrigin.x))+rot_.rtOffset;
_rt = rtRound(_rt, rot_.stepDeg); //snap
_rt = rtMinMax(_rt);
TweenMax.set(this.target, {rotation:_rt});
//now we'll end the drag and start it again from this new place, but when we start again,
//it'll call the onPress of course so to avoid an endless loop,
//we use the "lock4XY2rt" variable to skip it in the triggered onPress.
xx_.lock4XY2rt = true;
this.endDrag(rt);
this.startDrag(rt);
this.isDragging = false;
xx_.lock4XY2rt = false;
doDial(_rt)
}//end if
}//XY2rt
function rtPress(rt){
if (!rot_.var in [3]){
XY2rt(rt)
}
}//rtPress
function rtDial(){
doDial(this.rotation);
}//rtDial
function doDial(rt){
rtDialNumbers(rt);
arcTo(rt);
setValue(rt);
}//doDial
function rtDialNumbers(rt){
if(rot_.dialLive) {
var dn = document.getElementsByClassName('dialNum');
var i = dn.length;
while(--i > -1){
if(i%rot_.ticks==0) { // rotate text, no ticks
TweenMax.set(dn[i], { rotation:-rt0to360(rt) - dn[i].initRotation})
} //if
} //while
} //if
}//rtDialNumbers
///////////////// global functions
function p(x){return x/rot_.szB*240}
function rtRound(_rt, _rtStep_deg){return Math.round(_rt/_rtStep_deg) * _rtStep_deg;}
function calcX2Xp(X,B) {return Math.round(X/B*100*rot_.numDigits)/rot_.numDigits}
function calcXp2X(Xp,B){return Math.round(Xp/100*B*rot_.numDigits)/rot_.numDigits}
function toRad(deg){return (deg)*(Math.PI/180);} //d3
function rad(deg){return (deg-90)*(Math.PI/180);}//canvas d3
function deg(rad){return rad*(180/Math.PI);}
function toXY(c,r,deg){return {x:c.x+Math.cos(rad(deg))*r,y:c.y+Math.sin(rad(deg))*r}}
function rt0to360(rt){
rt = rt%360; // Math.round(_rt%360);
if(rt<0) { rt == 0 ? rt = 0 : rt = 360 + rt };
return rt;
}//rt0to360
function rtAdapt(rt){
if (rt < 0) {
rt += 360;
} else if (rt > 270) {
rt -= 360;
}
return rt
}//rtAdapt
function closeestDeg(num,arr){
// example: arr = [0,15,30,45,90,120,180];
var ds = arr.map(function(b){
var d = Math.abs(num - b);
return d > 180 ? 360 - d : d;
});
return arr[ds.indexOf(Math.min.apply(null, ds))];
}//closeestDeg
//////////// END
//}//RSLIDER
Also see: Tab Triggers