| /* | |||||
| Holder - 2.2 - client side image placeholders | |||||
| (c) 2012-2013 Ivan Malopinsky / http://imsky.co | |||||
| Provided under the MIT License. | |||||
| Commercial use requires attribution. | |||||
| */ | |||||
| var Holder = Holder || {}; | |||||
| (function (app, win) { | |||||
| var preempted = false, | |||||
| fallback = false, | |||||
| canvas = document.createElement('canvas'); | |||||
| var dpr = 1, bsr = 1; | |||||
| var resizable_images = []; | |||||
| if (!canvas.getContext) { | |||||
| fallback = true; | |||||
| } else { | |||||
| if (canvas.toDataURL("image/png") | |||||
| .indexOf("data:image/png") < 0) { | |||||
| //Android doesn't support data URI | |||||
| fallback = true; | |||||
| } else { | |||||
| var ctx = canvas.getContext("2d"); | |||||
| } | |||||
| } | |||||
| if(!fallback){ | |||||
| dpr = window.devicePixelRatio || 1, | |||||
| bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; | |||||
| } | |||||
| var ratio = dpr / bsr; | |||||
| var settings = { | |||||
| domain: "holder.js", | |||||
| images: "img", | |||||
| bgnodes: ".holderjs", | |||||
| themes: { | |||||
| "gray": { | |||||
| background: "#eee", | |||||
| foreground: "#aaa", | |||||
| size: 12 | |||||
| }, | |||||
| "social": { | |||||
| background: "#3a5a97", | |||||
| foreground: "#fff", | |||||
| size: 12 | |||||
| }, | |||||
| "industrial": { | |||||
| background: "#434A52", | |||||
| foreground: "#C2F200", | |||||
| size: 12 | |||||
| }, | |||||
| "sky": { | |||||
| background: "#0D8FDB", | |||||
| foreground: "#fff", | |||||
| size: 12 | |||||
| }, | |||||
| "vine": { | |||||
| background: "#39DBAC", | |||||
| foreground: "#1E292C", | |||||
| size: 12 | |||||
| }, | |||||
| "lava": { | |||||
| background: "#F8591A", | |||||
| foreground: "#1C2846", | |||||
| size: 12 | |||||
| } | |||||
| }, | |||||
| stylesheet: "" | |||||
| }; | |||||
| app.flags = { | |||||
| dimensions: { | |||||
| regex: /^(\d+)x(\d+)$/, | |||||
| output: function (val) { | |||||
| var exec = this.regex.exec(val); | |||||
| return { | |||||
| width: +exec[1], | |||||
| height: +exec[2] | |||||
| } | |||||
| } | |||||
| }, | |||||
| fluid: { | |||||
| regex: /^([0-9%]+)x([0-9%]+)$/, | |||||
| output: function (val) { | |||||
| var exec = this.regex.exec(val); | |||||
| return { | |||||
| width: exec[1], | |||||
| height: exec[2] | |||||
| } | |||||
| } | |||||
| }, | |||||
| colors: { | |||||
| regex: /#([0-9a-f]{3,})\:#([0-9a-f]{3,})/i, | |||||
| output: function (val) { | |||||
| var exec = this.regex.exec(val); | |||||
| return { | |||||
| size: settings.themes.gray.size, | |||||
| foreground: "#" + exec[2], | |||||
| background: "#" + exec[1] | |||||
| } | |||||
| } | |||||
| }, | |||||
| text: { | |||||
| regex: /text\:(.*)/, | |||||
| output: function (val) { | |||||
| return this.regex.exec(val)[1]; | |||||
| } | |||||
| }, | |||||
| font: { | |||||
| regex: /font\:(.*)/, | |||||
| output: function (val) { | |||||
| return this.regex.exec(val)[1]; | |||||
| } | |||||
| }, | |||||
| auto: { | |||||
| regex: /^auto$/ | |||||
| }, | |||||
| textmode: { | |||||
| regex: /textmode\:(.*)/, | |||||
| output: function(val){ | |||||
| return this.regex.exec(val)[1]; | |||||
| } | |||||
| } | |||||
| } | |||||
| //getElementsByClassName polyfill | |||||
| document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s}) | |||||
| //getComputedStyle polyfill | |||||
| window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this}) | |||||
| //http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications | |||||
| function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}} | |||||
| //https://gist.github.com/991057 by Jed Schmidt with modifications | |||||
| function selector(a){ | |||||
| a=a.match(/^(\W)?(.*)/);var b=document["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2]); | |||||
| var ret=[]; b!==null&&(b.length?ret=b:b.length===0?ret=b:ret=[b]); return ret; | |||||
| } | |||||
| //shallow object property extend | |||||
| function extend(a,b){ | |||||
| var c={}; | |||||
| for(var i in a){ | |||||
| if(a.hasOwnProperty(i)){ | |||||
| c[i]=a[i]; | |||||
| } | |||||
| } | |||||
| for(var i in b){ | |||||
| if(b.hasOwnProperty(i)){ | |||||
| c[i]=b[i]; | |||||
| } | |||||
| } | |||||
| return c | |||||
| } | |||||
| //hasOwnProperty polyfill | |||||
| if (!Object.prototype.hasOwnProperty) | |||||
| /*jshint -W001, -W103 */ | |||||
| Object.prototype.hasOwnProperty = function(prop) { | |||||
| var proto = this.__proto__ || this.constructor.prototype; | |||||
| return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]); | |||||
| } | |||||
| /*jshint +W001, +W103 */ | |||||
| function text_size(width, height, template) { | |||||
| height = parseInt(height, 10); | |||||
| width = parseInt(width, 10); | |||||
| var bigSide = Math.max(height, width) | |||||
| var smallSide = Math.min(height, width) | |||||
| var scale = 1 / 12; | |||||
| var newHeight = Math.min(smallSide * 0.75, 0.75 * bigSide * scale); | |||||
| return { | |||||
| height: Math.round(Math.max(template.size, newHeight)) | |||||
| } | |||||
| } | |||||
| function draw(args) { | |||||
| var ctx = args.ctx; | |||||
| var dimensions = args.dimensions; | |||||
| var template = args.template; | |||||
| var ratio = args.ratio; | |||||
| var holder = args.holder; | |||||
| var literal = holder.textmode == "literal"; | |||||
| var exact = holder.textmode == "exact"; | |||||
| var ts = text_size(dimensions.width, dimensions.height, template); | |||||
| var text_height = ts.height; | |||||
| var width = dimensions.width * ratio, | |||||
| height = dimensions.height * ratio; | |||||
| var font = template.font ? template.font : "sans-serif"; | |||||
| canvas.width = width; | |||||
| canvas.height = height; | |||||
| ctx.textAlign = "center"; | |||||
| ctx.textBaseline = "middle"; | |||||
| ctx.fillStyle = template.background; | |||||
| ctx.fillRect(0, 0, width, height); | |||||
| ctx.fillStyle = template.foreground; | |||||
| ctx.font = "bold " + text_height + "px " + font; | |||||
| var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height)); | |||||
| if (literal) { | |||||
| var dimensions = holder.dimensions; | |||||
| text = dimensions.width + "x" + dimensions.height; | |||||
| } | |||||
| else if(exact && holder.exact_dimensions){ | |||||
| var dimensions = holder.exact_dimensions; | |||||
| text = (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height)); | |||||
| } | |||||
| var text_width = ctx.measureText(text).width; | |||||
| if (text_width / width >= 0.75) { | |||||
| text_height = Math.floor(text_height * 0.75 * (width / text_width)); | |||||
| } | |||||
| //Resetting font size if necessary | |||||
| ctx.font = "bold " + (text_height * ratio) + "px " + font; | |||||
| ctx.fillText(text, (width / 2), (height / 2), width); | |||||
| return canvas.toDataURL("image/png"); | |||||
| } | |||||
| function render(mode, el, holder, src) { | |||||
| var dimensions = holder.dimensions, | |||||
| theme = holder.theme, | |||||
| text = holder.text ? decodeURIComponent(holder.text) : holder.text; | |||||
| var dimensions_caption = dimensions.width + "x" + dimensions.height; | |||||
| theme = (text ? extend(theme, { | |||||
| text: text | |||||
| }) : theme); | |||||
| theme = (holder.font ? extend(theme, { | |||||
| font: holder.font | |||||
| }) : theme); | |||||
| el.setAttribute("data-src", src); | |||||
| holder.theme = theme; | |||||
| el.holder_data = holder; | |||||
| if (mode == "image") { | |||||
| el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); | |||||
| if (fallback || !holder.auto) { | |||||
| el.style.width = dimensions.width + "px"; | |||||
| el.style.height = dimensions.height + "px"; | |||||
| } | |||||
| if (fallback) { | |||||
| el.style.backgroundColor = theme.background; | |||||
| } else { | |||||
| el.setAttribute("src", draw({ctx: ctx, dimensions: dimensions, template: theme, ratio:ratio, holder: holder})); | |||||
| if(holder.textmode && holder.textmode == "exact"){ | |||||
| resizable_images.push(el); | |||||
| resizable_update(el); | |||||
| } | |||||
| } | |||||
| } else if (mode == "background") { | |||||
| if (!fallback) { | |||||
| el.style.backgroundImage = "url(" + draw({ctx:ctx, dimensions: dimensions, template: theme, ratio: ratio, holder: holder}) + ")"; | |||||
| el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px"; | |||||
| } | |||||
| } else if (mode == "fluid") { | |||||
| el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); | |||||
| if (dimensions.height.slice(-1) == "%") { | |||||
| el.style.height = dimensions.height | |||||
| } else { | |||||
| el.style.height = dimensions.height + "px" | |||||
| } | |||||
| if (dimensions.width.slice(-1) == "%") { | |||||
| el.style.width = dimensions.width | |||||
| } else { | |||||
| el.style.width = dimensions.width + "px" | |||||
| } | |||||
| if (el.style.display == "inline" || el.style.display === "" || el.style.display == "none") { | |||||
| el.style.display = "block"; | |||||
| } | |||||
| if (fallback) { | |||||
| el.style.backgroundColor = theme.background; | |||||
| } else { | |||||
| resizable_images.push(el); | |||||
| resizable_update(el); | |||||
| } | |||||
| } | |||||
| } | |||||
| function dimension_check(el, callback) { | |||||
| var dimensions = { | |||||
| height: el.clientHeight, | |||||
| width: el.clientWidth | |||||
| }; | |||||
| if (!dimensions.height && !dimensions.width) { | |||||
| if (el.hasAttribute("data-holder-invisible")) { | |||||
| throw new Error("Holder: placeholder is not visible"); | |||||
| } else { | |||||
| el.setAttribute("data-holder-invisible", true) | |||||
| setTimeout(function () { | |||||
| callback.call(this, el) | |||||
| }, 1) | |||||
| return null; | |||||
| } | |||||
| } else { | |||||
| el.removeAttribute("data-holder-invisible") | |||||
| } | |||||
| return dimensions; | |||||
| } | |||||
| function resizable_update(element) { | |||||
| var images; | |||||
| if (element.nodeType == null) { | |||||
| images = resizable_images; | |||||
| } else { | |||||
| images = [element] | |||||
| } | |||||
| for (var i in images) { | |||||
| if (!images.hasOwnProperty(i)) { | |||||
| continue; | |||||
| } | |||||
| var el = images[i] | |||||
| if (el.holder_data) { | |||||
| var holder = el.holder_data; | |||||
| var dimensions = dimension_check(el, resizable_update) | |||||
| if(dimensions){ | |||||
| if(holder.fluid){ | |||||
| el.setAttribute("src", draw({ | |||||
| ctx: ctx, | |||||
| dimensions: dimensions, | |||||
| template: holder.theme, | |||||
| ratio: ratio, | |||||
| holder: holder | |||||
| })) | |||||
| } | |||||
| if(holder.textmode && holder.textmode == "exact"){ | |||||
| holder.exact_dimensions = dimensions; | |||||
| el.setAttribute("src", draw({ | |||||
| ctx: ctx, | |||||
| dimensions: holder.dimensions, | |||||
| template: holder.theme, | |||||
| ratio: ratio, | |||||
| holder: holder | |||||
| })) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| function parse_flags(flags, options) { | |||||
| var ret = { | |||||
| theme: extend(settings.themes.gray, {}) | |||||
| }; | |||||
| var render = false; | |||||
| for (sl = flags.length, j = 0; j < sl; j++) { | |||||
| var flag = flags[j]; | |||||
| if (app.flags.dimensions.match(flag)) { | |||||
| render = true; | |||||
| ret.dimensions = app.flags.dimensions.output(flag); | |||||
| } else if (app.flags.fluid.match(flag)) { | |||||
| render = true; | |||||
| ret.dimensions = app.flags.fluid.output(flag); | |||||
| ret.fluid = true; | |||||
| } else if (app.flags.textmode.match(flag)) { | |||||
| ret.textmode = app.flags.textmode.output(flag) | |||||
| } else if (app.flags.colors.match(flag)) { | |||||
| ret.theme = app.flags.colors.output(flag); | |||||
| } else if (options.themes[flag]) { | |||||
| //If a theme is specified, it will override custom colors | |||||
| if(options.themes.hasOwnProperty(flag)){ | |||||
| ret.theme = extend(options.themes[flag], {}); | |||||
| } | |||||
| } else if (app.flags.font.match(flag)) { | |||||
| ret.font = app.flags.font.output(flag); | |||||
| } else if (app.flags.auto.match(flag)) { | |||||
| ret.auto = true; | |||||
| } else if (app.flags.text.match(flag)) { | |||||
| ret.text = app.flags.text.output(flag); | |||||
| } | |||||
| } | |||||
| return render ? ret : false; | |||||
| } | |||||
| for (var flag in app.flags) { | |||||
| if (!app.flags.hasOwnProperty(flag)) continue; | |||||
| app.flags[flag].match = function (val) { | |||||
| return val.match(this.regex) | |||||
| } | |||||
| } | |||||
| app.add_theme = function (name, theme) { | |||||
| name != null && theme != null && (settings.themes[name] = theme); | |||||
| return app; | |||||
| }; | |||||
| app.add_image = function (src, el) { | |||||
| var node = selector(el); | |||||
| if (node.length) { | |||||
| for (var i = 0, l = node.length; i < l; i++) { | |||||
| var img = document.createElement("img") | |||||
| img.setAttribute("data-src", src); | |||||
| node[i].appendChild(img); | |||||
| } | |||||
| } | |||||
| return app; | |||||
| }; | |||||
| app.run = function (o) { | |||||
| preempted = true; | |||||
| var options = extend(settings, o), | |||||
| images = [], | |||||
| imageNodes = [], | |||||
| bgnodes = []; | |||||
| if (typeof (options.images) == "string") { | |||||
| imageNodes = selector(options.images); | |||||
| } else if (window.NodeList && options.images instanceof window.NodeList) { | |||||
| imageNodes = options.images; | |||||
| } else if (window.Node && options.images instanceof window.Node) { | |||||
| imageNodes = [options.images]; | |||||
| } | |||||
| if (typeof (options.bgnodes) == "string") { | |||||
| bgnodes = selector(options.bgnodes); | |||||
| } else if (window.NodeList && options.elements instanceof window.NodeList) { | |||||
| bgnodes = options.bgnodes; | |||||
| } else if (window.Node && options.bgnodes instanceof window.Node) { | |||||
| bgnodes = [options.bgnodes]; | |||||
| } | |||||
| for (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]); | |||||
| var holdercss = document.getElementById("holderjs-style"); | |||||
| if (!holdercss) { | |||||
| holdercss = document.createElement("style"); | |||||
| holdercss.setAttribute("id", "holderjs-style"); | |||||
| holdercss.type = "text/css"; | |||||
| document.getElementsByTagName("head")[0].appendChild(holdercss); | |||||
| } | |||||
| if (!options.nocss) { | |||||
| if (holdercss.styleSheet) { | |||||
| holdercss.styleSheet.cssText += options.stylesheet; | |||||
| } else { | |||||
| holdercss.appendChild(document.createTextNode(options.stylesheet)); | |||||
| } | |||||
| } | |||||
| var cssregex = new RegExp(options.domain + "\/(.*?)\"?\\)"); | |||||
| for (var l = bgnodes.length, i = 0; i < l; i++) { | |||||
| var src = window.getComputedStyle(bgnodes[i], null) | |||||
| .getPropertyValue("background-image"); | |||||
| var flags = src.match(cssregex); | |||||
| var bgsrc = bgnodes[i].getAttribute("data-background-src"); | |||||
| if (flags) { | |||||
| var holder = parse_flags(flags[1].split("/"), options); | |||||
| if (holder) { | |||||
| render("background", bgnodes[i], holder, src); | |||||
| } | |||||
| } else if (bgsrc != null) { | |||||
| var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1) | |||||
| .split("/"), options); | |||||
| if (holder) { | |||||
| render("background", bgnodes[i], holder, src); | |||||
| } | |||||
| } | |||||
| } | |||||
| for (l = images.length, i = 0; i < l; i++) { | |||||
| var attr_data_src, attr_src; | |||||
| attr_src = attr_data_src = src = null; | |||||
| try { | |||||
| attr_src = images[i].getAttribute("src"); | |||||
| attr_datasrc = images[i].getAttribute("data-src"); | |||||
| } catch (e) {} | |||||
| if (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) { | |||||
| src = attr_src; | |||||
| } else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) { | |||||
| src = attr_datasrc; | |||||
| } | |||||
| if (src) { | |||||
| var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1) | |||||
| .split("/"), options); | |||||
| if (holder) { | |||||
| if (holder.fluid) { | |||||
| render("fluid", images[i], holder, src) | |||||
| } else { | |||||
| render("image", images[i], holder, src); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return app; | |||||
| }; | |||||
| contentLoaded(win, function () { | |||||
| if (window.addEventListener) { | |||||
| window.addEventListener("resize", resizable_update, false); | |||||
| window.addEventListener("orientationchange", resizable_update, false); | |||||
| } else { | |||||
| window.attachEvent("onresize", resizable_update) | |||||
| } | |||||
| preempted || app.run(); | |||||
| }); | |||||
| if (typeof define === "function" && define.amd) { | |||||
| define([], function () { | |||||
| return app; | |||||
| }); | |||||
| } | |||||
| })(Holder, window); |
| // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT | |||||
| // IT'S JUST JUNK FOR OUR DOCS! | |||||
| // ++++++++++++++++++++++++++++++++++++++++++ | |||||
| /*! | |||||
| * Copyright 2014-2015 Twitter, Inc. | |||||
| * | |||||
| * Licensed under the Creative Commons Attribution 3.0 Unported License. For | |||||
| * details, see https://creativecommons.org/licenses/by/3.0/. | |||||
| */ | |||||
| // Intended to prevent false-positive bug reports about Bootstrap not working properly in old versions of IE due to folks testing using IE's unreliable emulation modes. | |||||
| (function () { | |||||
| 'use strict'; | |||||
| function emulatedIEMajorVersion() { | |||||
| var groups = /MSIE ([0-9.]+)/.exec(window.navigator.userAgent) | |||||
| if (groups === null) { | |||||
| return null | |||||
| } | |||||
| var ieVersionNum = parseInt(groups[1], 10) | |||||
| var ieMajorVersion = Math.floor(ieVersionNum) | |||||
| return ieMajorVersion | |||||
| } | |||||
| function actualNonEmulatedIEMajorVersion() { | |||||
| // Detects the actual version of IE in use, even if it's in an older-IE emulation mode. | |||||
| // IE JavaScript conditional compilation docs: https://msdn.microsoft.com/library/121hztk3%28v=vs.94%29.aspx | |||||
| // @cc_on docs: https://msdn.microsoft.com/library/8ka90k2e%28v=vs.94%29.aspx | |||||
| var jscriptVersion = new Function('/*@cc_on return @_jscript_version; @*/')() // jshint ignore:line | |||||
| if (jscriptVersion === undefined) { | |||||
| return 11 // IE11+ not in emulation mode | |||||
| } | |||||
| if (jscriptVersion < 9) { | |||||
| return 8 // IE8 (or lower; haven't tested on IE<8) | |||||
| } | |||||
| return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode | |||||
| } | |||||
| var ua = window.navigator.userAgent | |||||
| if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) { | |||||
| return // Opera, which might pretend to be IE | |||||
| } | |||||
| var emulated = emulatedIEMajorVersion() | |||||
| if (emulated === null) { | |||||
| return // Not IE | |||||
| } | |||||
| var nonEmulated = actualNonEmulatedIEMajorVersion() | |||||
| if (emulated !== nonEmulated) { | |||||
| window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!') | |||||
| } | |||||
| })(); |
| /*! | |||||
| * IE10 viewport hack for Surface/desktop Windows 8 bug | |||||
| * Copyright 2014-2015 Twitter, Inc. | |||||
| * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |||||
| */ | |||||
| // See the Getting Started docs for more information: | |||||
| // http://getbootstrap.com/getting-started/#support-ie10-width | |||||
| (function () { | |||||
| 'use strict'; | |||||
| if (navigator.userAgent.match(/IEMobile\/10\.0/)) { | |||||
| var msViewportStyle = document.createElement('style') | |||||
| msViewportStyle.appendChild( | |||||
| document.createTextNode( | |||||
| '@-ms-viewport{width:auto!important}' | |||||
| ) | |||||
| ) | |||||
| document.querySelector('head').appendChild(msViewportStyle) | |||||
| } | |||||
| })(); |
| body { | |||||
| font-size: .875rem; | |||||
| } | |||||
| .feather { | |||||
| width: 16px; | |||||
| height: 16px; | |||||
| vertical-align: text-bottom; | |||||
| } | |||||
| /* | |||||
| * Sidebar | |||||
| */ | |||||
| .sidebar { | |||||
| position: fixed; | |||||
| top: 0; | |||||
| bottom: 0; | |||||
| left: 0; | |||||
| z-index: 100; /* Behind the navbar */ | |||||
| padding: 48px 0 0; /* Height of navbar */ | |||||
| box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); | |||||
| } | |||||
| .sidebar-sticky { | |||||
| position: relative; | |||||
| top: 0; | |||||
| height: calc(100vh - 48px); | |||||
| padding-top: .5rem; | |||||
| overflow-x: hidden; | |||||
| overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ | |||||
| } | |||||
| @supports ((position: -webkit-sticky) or (position: sticky)) { | |||||
| .sidebar-sticky { | |||||
| position: -webkit-sticky; | |||||
| position: sticky; | |||||
| } | |||||
| } | |||||
| .sidebar .nav-link { | |||||
| font-weight: 500; | |||||
| color: #333; | |||||
| } | |||||
| .sidebar .nav-link .feather { | |||||
| margin-right: 4px; | |||||
| color: #999; | |||||
| } | |||||
| .sidebar .nav-link.active { | |||||
| color: #007bff; | |||||
| } | |||||
| .sidebar .nav-link:hover .feather, | |||||
| .sidebar .nav-link.active .feather { | |||||
| color: inherit; | |||||
| } | |||||
| .sidebar-heading { | |||||
| font-size: .75rem; | |||||
| text-transform: uppercase; | |||||
| } | |||||
| /* | |||||
| * Content | |||||
| */ | |||||
| [role="main"] { | |||||
| padding-top: 48px; /* Space for fixed navbar */ | |||||
| } | |||||
| /* | |||||
| * Navbar | |||||
| */ | |||||
| .navbar-brand { | |||||
| padding-top: .75rem; | |||||
| padding-bottom: .75rem; | |||||
| font-size: 1rem; | |||||
| background-color: rgba(0, 0, 0, .25); | |||||
| box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25); | |||||
| } | |||||
| .navbar .form-control { | |||||
| padding: .75rem 1rem; | |||||
| border-width: 0; | |||||
| border-radius: 0; | |||||
| } | |||||
| .form-control-dark { | |||||
| color: #fff; | |||||
| background-color: rgba(255, 255, 255, .1); | |||||
| border-color: rgba(255, 255, 255, .1); | |||||
| } | |||||
| .form-control-dark:focus { | |||||
| border-color: transparent; | |||||
| box-shadow: 0 0 0 3px rgba(255, 255, 255, .25); | |||||
| } | |||||
| /* | |||||
| * Utilities | |||||
| */ | |||||
| .border-top { border-top: 1px solid #e5e5e5; } | |||||
| .border-bottom { border-bottom: 1px solid #e5e5e5; } |
| <!doctype html> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="utf-8"> | |||||
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | |||||
| <meta name="description" content=""> | |||||
| <meta name="author" content=""> | |||||
| <title>Dashboard Template for Bootstrap</title> | |||||
| <!-- Bootstrap core CSS --> | |||||
| <link href="bootstrap/css/bootstrap.css" rel="stylesheet"> | |||||
| <!-- Custom styles for this template --> | |||||
| <link href="dashboard.css" rel="stylesheet"> | |||||
| </head> | |||||
| <body> | |||||
| <nav class="navbar navbar-dark fixed-top bg-dark flex-md-nowrap p-0 shadow"> | |||||
| <a class="navbar-brand col-sm-3 col-md-2 mr-0" href="#">Company name</a> | |||||
| <input class="form-control form-control-dark w-100" type="text" placeholder="Search" aria-label="Search"> | |||||
| <ul class="navbar-nav px-3"> | |||||
| <li class="nav-item text-nowrap"> | |||||
| <a class="nav-link" href="#">Sign out</a> | |||||
| </li> | |||||
| </ul> | |||||
| </nav> | |||||
| <div class="container-fluid"> | |||||
| <div class="row"> | |||||
| <nav class="col-md-2 d-none d-md-block bg-light sidebar"> | |||||
| <div class="sidebar-sticky"> | |||||
| <ul class="nav flex-column"> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link active" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-home"> | |||||
| <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path> | |||||
| <polyline points="9 22 9 12 15 12 15 22"></polyline> | |||||
| </svg> | |||||
| Dashboard <span class="sr-only">(current)</span> </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file"> | |||||
| <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path> | |||||
| <polyline points="13 2 13 9 20 9"></polyline> | |||||
| </svg> | |||||
| Orders </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-shopping-cart"> | |||||
| <circle cx="9" cy="21" r="1"></circle> | |||||
| <circle cx="20" cy="21" r="1"></circle> | |||||
| <path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path> | |||||
| </svg> | |||||
| Products </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-users"> | |||||
| <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path> | |||||
| <circle cx="9" cy="7" r="4"></circle> | |||||
| <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path> | |||||
| <path d="M16 3.13a4 4 0 0 1 0 7.75"></path> | |||||
| </svg> | |||||
| Customers </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-bar-chart-2"> | |||||
| <line x1="18" y1="20" x2="18" y2="10"></line> | |||||
| <line x1="12" y1="20" x2="12" y2="4"></line> | |||||
| <line x1="6" y1="20" x2="6" y2="14"></line> | |||||
| </svg> | |||||
| Reports </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-layers"> | |||||
| <polygon points="12 2 2 7 12 12 22 7 12 2"></polygon> | |||||
| <polyline points="2 17 12 22 22 17"></polyline> | |||||
| <polyline points="2 12 12 17 22 12"></polyline> | |||||
| </svg> | |||||
| Integrations </a> | |||||
| </li> | |||||
| </ul> | |||||
| <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted"> <span>Saved reports</span> <a class="d-flex align-items-center text-muted" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle"> | |||||
| <circle cx="12" cy="12" r="10"></circle> | |||||
| <line x1="12" y1="8" x2="12" y2="16"></line> | |||||
| <line x1="8" y1="12" x2="16" y2="12"></line> | |||||
| </svg> </a> </h6> | |||||
| <ul class="nav flex-column mb-2"> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text"> | |||||
| <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> | |||||
| <polyline points="14 2 14 8 20 8"></polyline> | |||||
| <line x1="16" y1="13" x2="8" y2="13"></line> | |||||
| <line x1="16" y1="17" x2="8" y2="17"></line> | |||||
| <polyline points="10 9 9 9 8 9"></polyline> | |||||
| </svg> | |||||
| Current month </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text"> | |||||
| <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> | |||||
| <polyline points="14 2 14 8 20 8"></polyline> | |||||
| <line x1="16" y1="13" x2="8" y2="13"></line> | |||||
| <line x1="16" y1="17" x2="8" y2="17"></line> | |||||
| <polyline points="10 9 9 9 8 9"></polyline> | |||||
| </svg> | |||||
| Last quarter </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text"> | |||||
| <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> | |||||
| <polyline points="14 2 14 8 20 8"></polyline> | |||||
| <line x1="16" y1="13" x2="8" y2="13"></line> | |||||
| <line x1="16" y1="17" x2="8" y2="17"></line> | |||||
| <polyline points="10 9 9 9 8 9"></polyline> | |||||
| </svg> | |||||
| Social engagement </a> | |||||
| </li> | |||||
| <li class="nav-item"> | |||||
| <a class="nav-link" href="#"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text"> | |||||
| <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> | |||||
| <polyline points="14 2 14 8 20 8"></polyline> | |||||
| <line x1="16" y1="13" x2="8" y2="13"></line> | |||||
| <line x1="16" y1="17" x2="8" y2="17"></line> | |||||
| <polyline points="10 9 9 9 8 9"></polyline> | |||||
| </svg> | |||||
| Year-end sale </a> | |||||
| </li> | |||||
| </ul> | |||||
| </div> | |||||
| </nav> | |||||
| <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> | |||||
| <div class="chartjs-size-monitor" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px; overflow: hidden; pointer-events: none; visibility: hidden; z-index: -1;"> | |||||
| <div class="chartjs-size-monitor-expand" style="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;"> | |||||
| <div style="position:absolute;width:1000000px;height:1000000px;left:0;top:0"></div> | |||||
| </div> | |||||
| <div class="chartjs-size-monitor-shrink" style="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;"> | |||||
| <div style="position:absolute;width:200%;height:200%;left:0; top:0"></div> | |||||
| </div> | |||||
| </div> | |||||
| <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> | |||||
| <h1 class="h2">Dashboard</h1> | |||||
| <div class="btn-toolbar mb-2 mb-md-0"> | |||||
| <div class="btn-group mr-2"> | |||||
| <button class="btn btn-sm btn-outline-secondary">Share</button> | |||||
| <button class="btn btn-sm btn-outline-secondary">Export</button> | |||||
| </div> | |||||
| <button class="btn btn-sm btn-outline-secondary dropdown-toggle"> | |||||
| <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-calendar"> | |||||
| <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect> | |||||
| <line x1="16" y1="2" x2="16" y2="6"></line> | |||||
| <line x1="8" y1="2" x2="8" y2="6"></line> | |||||
| <line x1="3" y1="10" x2="21" y2="10"></line> | |||||
| </svg> | |||||
| This week | |||||
| </button> | |||||
| </div> | |||||
| </div> | |||||
| <canvas class="my-4 w-100 chartjs-render-monitor" id="myChart" width="2304" height="972" style="display: block; height: 486px; width: 1152px;"></canvas> | |||||
| <h2>Section title</h2> | |||||
| <div class="table-responsive"> | |||||
| <table class="table table-striped table-sm"> | |||||
| <thead> | |||||
| <tr> | |||||
| <th>#</th> | |||||
| <th>Header</th> | |||||
| <th>Header</th> | |||||
| <th>Header</th> | |||||
| <th>Header</th> | |||||
| </tr> | |||||
| </thead> | |||||
| <tbody> | |||||
| <tr> | |||||
| <td>1,001</td> | |||||
| <td>Lorem</td> | |||||
| <td>ipsum</td> | |||||
| <td>dolor</td> | |||||
| <td>sit</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,002</td> | |||||
| <td>amet</td> | |||||
| <td>consectetur</td> | |||||
| <td>adipiscing</td> | |||||
| <td>elit</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,003</td> | |||||
| <td>Integer</td> | |||||
| <td>nec</td> | |||||
| <td>odio</td> | |||||
| <td>Praesent</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,003</td> | |||||
| <td>libero</td> | |||||
| <td>Sed</td> | |||||
| <td>cursus</td> | |||||
| <td>ante</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,004</td> | |||||
| <td>dapibus</td> | |||||
| <td>diam</td> | |||||
| <td>Sed</td> | |||||
| <td>nisi</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,005</td> | |||||
| <td>Nulla</td> | |||||
| <td>quis</td> | |||||
| <td>sem</td> | |||||
| <td>at</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,006</td> | |||||
| <td>nibh</td> | |||||
| <td>elementum</td> | |||||
| <td>imperdiet</td> | |||||
| <td>Duis</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,007</td> | |||||
| <td>sagittis</td> | |||||
| <td>ipsum</td> | |||||
| <td>Praesent</td> | |||||
| <td>mauris</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,008</td> | |||||
| <td>Fusce</td> | |||||
| <td>nec</td> | |||||
| <td>tellus</td> | |||||
| <td>sed</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,009</td> | |||||
| <td>augue</td> | |||||
| <td>semper</td> | |||||
| <td>porta</td> | |||||
| <td>Mauris</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,010</td> | |||||
| <td>massa</td> | |||||
| <td>Vestibulum</td> | |||||
| <td>lacinia</td> | |||||
| <td>arcu</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,011</td> | |||||
| <td>eget</td> | |||||
| <td>nulla</td> | |||||
| <td>Class</td> | |||||
| <td>aptent</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,012</td> | |||||
| <td>taciti</td> | |||||
| <td>sociosqu</td> | |||||
| <td>ad</td> | |||||
| <td>litora</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,013</td> | |||||
| <td>torquent</td> | |||||
| <td>per</td> | |||||
| <td>conubia</td> | |||||
| <td>nostra</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,014</td> | |||||
| <td>per</td> | |||||
| <td>inceptos</td> | |||||
| <td>himenaeos</td> | |||||
| <td>Curabitur</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td>1,015</td> | |||||
| <td>sodales</td> | |||||
| <td>ligula</td> | |||||
| <td>in</td> | |||||
| <td>libero</td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| </div> | |||||
| </main> | |||||
| </div> | |||||
| </div> | |||||
| <!-- Bootstrap core JavaScript | |||||
| ================================================== --> | |||||
| <!-- Placed at the end of the document so the pages load faster --> | |||||
| <script src="assets/js/jquery.min.js"></script> | |||||
| <script src="assets/js/popper.js"></script> | |||||
| <script src="bootstrap/js/bootstrap.min.js"></script> | |||||
| <!-- Icons --> | |||||
| <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> | |||||
| <script>feather.replace()</script> | |||||
| <!-- Graphs --> | |||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script> | |||||
| <script> | |||||
| var ctx = document.getElementById("myChart"); | |||||
| var myChart = new Chart(ctx, { | |||||
| type: 'line', | |||||
| data: { | |||||
| labels: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], | |||||
| datasets: [{ | |||||
| data: [15339, 21345, 18483, 24003, 23489, 24092, 12034], | |||||
| lineTension: 0, | |||||
| backgroundColor: 'transparent', | |||||
| borderColor: '#007bff', | |||||
| borderWidth: 4, | |||||
| pointBackgroundColor: '#007bff' | |||||
| }] | |||||
| }, | |||||
| options: { | |||||
| scales: { | |||||
| yAxes: [{ | |||||
| ticks: { | |||||
| beginAtZero: false | |||||
| } | |||||
| }] | |||||
| }, | |||||
| legend: { | |||||
| display: false, | |||||
| } | |||||
| } | |||||
| }); | |||||
| </script> | |||||
| </body> | |||||
| </html> |
| {"files":{"dashboard.html":{"frameworks":["pg.insight.events","pg.css.grid","pg.image.overlay","pg.code-validator","pg.project.items","pg.asset.manager","bs4","pg.html","pg.components"],"last_page_width":1024}},"breakpoints":["576px","768px","992px","1200px"],"frameworks":["pg.insight.events","pg.css.grid","pg.image.overlay","pg.code-validator","pg.project.items","pg.asset.manager","bs4","pg.html","pg.components"],"template_framework_id":"bootstrap"} |