UNPKG

antd-theme-generator

Version:

This a script to generate color specific styles less file and which you can use to change theme dynamically in browser

1,450 lines (1,261 loc) 454 kB
/*! * Less - Leaner CSS v3.9.0 * http://lesscss.org * * Copyright (c) 2009-2018, Alexis Sellier <self@cloudhead.net> * Licensed under the Apache-2.0 License. * */ /** * @license Apache-2.0 */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.less = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ var addDataAttr = require('./utils').addDataAttr, browser = require('./browser'); module.exports = function(window, options) { // use options from the current script tag data attribues addDataAttr(options, browser.currentScript(window)); if (options.isFileProtocol === undefined) { options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol); } // Load styles asynchronously (default: false) // // This is set to `false` by default, so that the body // doesn't start loading before the stylesheets are parsed. // Setting this to `true` can result in flickering. // options.async = options.async || false; options.fileAsync = options.fileAsync || false; // Interval between watch polls options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500); options.env = options.env || (window.location.hostname == '127.0.0.1' || window.location.hostname == '0.0.0.0' || window.location.hostname == 'localhost' || (window.location.port && window.location.port.length > 0) || options.isFileProtocol ? 'development' : 'production'); var dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash); if (dumpLineNumbers) { options.dumpLineNumbers = dumpLineNumbers[1]; } if (options.useFileCache === undefined) { options.useFileCache = true; } if (options.onReady === undefined) { options.onReady = true; } if (options.relativeUrls) { options.rewriteUrls = 'all'; } }; },{"./browser":3,"./utils":11}],2:[function(require,module,exports){ /** * Kicks off less and compiles any stylesheets * used in the browser distributed version of less * to kick-start less using the browser api */ /* global window, document */ // TODO - consider switching this out for a recommendation for this polyfill? // <script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script> // Browsers have good Promise support require('promise/polyfill'); var options = require('../less/default-options')(); if (window.less) { for (key in window.less) { if (window.less.hasOwnProperty(key)) { options[key] = window.less[key]; } } } require('./add-default-options')(window, options); options.plugins = options.plugins || []; if (window.LESS_PLUGINS) { options.plugins = options.plugins.concat(window.LESS_PLUGINS); } var less = module.exports = require('./index')(window, options); window.less = less; var css, head, style; // Always restore page visibility function resolveOrReject(data) { if (data.filename) { console.warn(data); } if (!options.async) { head.removeChild(style); } } if (options.onReady) { if (/!watch/.test(window.location.hash)) { less.watch(); } // Simulate synchronous stylesheet loading by hiding page rendering if (!options.async) { css = 'body { display: none !important }'; head = document.head || document.getElementsByTagName('head')[0]; style = document.createElement('style'); style.type = 'text/css'; if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } head.appendChild(style); } less.registerStylesheetsImmediately(); less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject); } },{"../less/default-options":17,"./add-default-options":1,"./index":8,"promise/polyfill":104}],3:[function(require,module,exports){ var utils = require('./utils'); module.exports = { createCSS: function (document, styles, sheet) { // Strip the query-string var href = sheet.href || ''; // If there is no title set, use the filename, minus the extension var id = 'less:' + (sheet.title || utils.extractId(href)); // If this has already been inserted into the DOM, we may need to replace it var oldStyleNode = document.getElementById(id); var keepOldStyleNode = false; // Create a new stylesheet node for insertion or (if necessary) replacement var styleNode = document.createElement('style'); styleNode.setAttribute('type', 'text/css'); if (sheet.media) { styleNode.setAttribute('media', sheet.media); } styleNode.id = id; if (!styleNode.styleSheet) { styleNode.appendChild(document.createTextNode(styles)); // If new contents match contents of oldStyleNode, don't replace oldStyleNode keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 && oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue); } var head = document.getElementsByTagName('head')[0]; // If there is no oldStyleNode, just append; otherwise, only append if we need // to replace oldStyleNode with an updated stylesheet if (oldStyleNode === null || keepOldStyleNode === false) { var nextEl = sheet && sheet.nextSibling || null; if (nextEl) { nextEl.parentNode.insertBefore(styleNode, nextEl); } else { head.appendChild(styleNode); } } if (oldStyleNode && keepOldStyleNode === false) { oldStyleNode.parentNode.removeChild(oldStyleNode); } // For IE. // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash. // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head if (styleNode.styleSheet) { try { styleNode.styleSheet.cssText = styles; } catch (e) { throw new Error('Couldn\'t reassign styleSheet.cssText.'); } } }, currentScript: function(window) { var document = window.document; return document.currentScript || (function() { var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; })(); } }; },{"./utils":11}],4:[function(require,module,exports){ // Cache system is a bit outdated and could do with work module.exports = function(window, options, logger) { var cache = null; if (options.env !== 'development') { try { cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage; } catch (_) {} } return { setCSS: function(path, lastModified, modifyVars, styles) { if (cache) { logger.info('saving ' + path + ' to cache.'); try { cache.setItem(path, styles); cache.setItem(path + ':timestamp', lastModified); if (modifyVars) { cache.setItem(path + ':vars', JSON.stringify(modifyVars)); } } catch (e) { // TODO - could do with adding more robust error handling logger.error('failed to save "' + path + '" to local storage for caching.'); } } }, getCSS: function(path, webInfo, modifyVars) { var css = cache && cache.getItem(path), timestamp = cache && cache.getItem(path + ':timestamp'), vars = cache && cache.getItem(path + ':vars'); modifyVars = modifyVars || {}; vars = vars || "{}"; // if not set, treat as the JSON representation of an empty object if (timestamp && webInfo.lastModified && (new Date(webInfo.lastModified).valueOf() === new Date(timestamp).valueOf()) && JSON.stringify(modifyVars) === vars) { // Use local copy return css; } } }; }; },{}],5:[function(require,module,exports){ var utils = require('./utils'), browser = require('./browser'); module.exports = function(window, less, options) { function errorHTML(e, rootHref) { var id = 'less-error-message:' + utils.extractId(rootHref || ''); var template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>'; var elem = window.document.createElement('div'), timer, content, errors = []; var filename = e.filename || rootHref; var filenameNoPath = filename.match(/([^\/]+(\?.*)?)$/)[1]; elem.id = id; elem.className = 'less-error-message'; content = '<h3>' + (e.type || 'Syntax') + 'Error: ' + (e.message || 'There is an error in your .less file') + '</h3>' + '<p>in <a href="' + filename + '">' + filenameNoPath + '</a> '; var errorline = function (e, i, classname) { if (e.extract[i] !== undefined) { errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) .replace(/\{class\}/, classname) .replace(/\{content\}/, e.extract[i])); } }; if (e.line) { errorline(e, 0, ''); errorline(e, 1, 'line'); errorline(e, 2, ''); content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' + '<ul>' + errors.join('') + '</ul>'; } if (e.stack && (e.extract || options.logLevel >= 4)) { content += '<br/>Stack Trace</br />' + e.stack.split('\n').slice(1).join('<br/>'); } elem.innerHTML = content; // CSS for error messages browser.createCSS(window.document, [ '.less-error-message ul, .less-error-message li {', 'list-style-type: none;', 'margin-right: 15px;', 'padding: 4px 0;', 'margin: 0;', '}', '.less-error-message label {', 'font-size: 12px;', 'margin-right: 15px;', 'padding: 4px 0;', 'color: #cc7777;', '}', '.less-error-message pre {', 'color: #dd6666;', 'padding: 4px 0;', 'margin: 0;', 'display: inline-block;', '}', '.less-error-message pre.line {', 'color: #ff0000;', '}', '.less-error-message h3 {', 'font-size: 20px;', 'font-weight: bold;', 'padding: 15px 0 5px 0;', 'margin: 0;', '}', '.less-error-message a {', 'color: #10a', '}', '.less-error-message .error {', 'color: red;', 'font-weight: bold;', 'padding-bottom: 2px;', 'border-bottom: 1px dashed red;', '}' ].join('\n'), { title: 'error-message' }); elem.style.cssText = [ 'font-family: Arial, sans-serif', 'border: 1px solid #e00', 'background-color: #eee', 'border-radius: 5px', '-webkit-border-radius: 5px', '-moz-border-radius: 5px', 'color: #e00', 'padding: 15px', 'margin-bottom: 15px' ].join(';'); if (options.env === 'development') { timer = setInterval(function () { var document = window.document, body = document.body; if (body) { if (document.getElementById(id)) { body.replaceChild(elem, document.getElementById(id)); } else { body.insertBefore(elem, body.firstChild); } clearInterval(timer); } }, 10); } } function removeErrorHTML(path) { var node = window.document.getElementById('less-error-message:' + utils.extractId(path)); if (node) { node.parentNode.removeChild(node); } } function removeErrorConsole(path) { // no action } function removeError(path) { if (!options.errorReporting || options.errorReporting === 'html') { removeErrorHTML(path); } else if (options.errorReporting === 'console') { removeErrorConsole(path); } else if (typeof options.errorReporting === 'function') { options.errorReporting('remove', path); } } function errorConsole(e, rootHref) { var template = '{line} {content}'; var filename = e.filename || rootHref; var errors = []; var content = (e.type || 'Syntax') + 'Error: ' + (e.message || 'There is an error in your .less file') + ' in ' + filename; var errorline = function (e, i, classname) { if (e.extract[i] !== undefined) { errors.push(template.replace(/\{line\}/, (parseInt(e.line, 10) || 0) + (i - 1)) .replace(/\{class\}/, classname) .replace(/\{content\}/, e.extract[i])); } }; if (e.line) { errorline(e, 0, ''); errorline(e, 1, 'line'); errorline(e, 2, ''); content += ' on line ' + e.line + ', column ' + (e.column + 1) + ':\n' + errors.join('\n'); } if (e.stack && (e.extract || options.logLevel >= 4)) { content += '\nStack Trace\n' + e.stack; } less.logger.error(content); } function error(e, rootHref) { if (!options.errorReporting || options.errorReporting === 'html') { errorHTML(e, rootHref); } else if (options.errorReporting === 'console') { errorConsole(e, rootHref); } else if (typeof options.errorReporting === 'function') { options.errorReporting('add', e, rootHref); } } return { add: error, remove: removeError }; }; },{"./browser":3,"./utils":11}],6:[function(require,module,exports){ /* global window, XMLHttpRequest */ module.exports = function(options, logger) { var AbstractFileManager = require('../less/environment/abstract-file-manager.js'); var fileCache = {}; // TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load var FileManager = function() { }; FileManager.prototype = new AbstractFileManager(); FileManager.prototype.alwaysMakePathsAbsolute = function alwaysMakePathsAbsolute() { return true; }; FileManager.prototype.join = function join(basePath, laterPath) { if (!basePath) { return laterPath; } return this.extractUrlParts(laterPath, basePath).path; }; FileManager.prototype.doXHR = function doXHR(url, type, callback, errback) { var xhr = new XMLHttpRequest(); var async = options.isFileProtocol ? options.fileAsync : true; if (typeof xhr.overrideMimeType === 'function') { xhr.overrideMimeType('text/css'); } logger.debug('XHR: Getting \'' + url + '\''); xhr.open('GET', url, async); xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5'); xhr.send(null); function handleResponse(xhr, callback, errback) { if (xhr.status >= 200 && xhr.status < 300) { callback(xhr.responseText, xhr.getResponseHeader('Last-Modified')); } else if (typeof errback === 'function') { errback(xhr.status, url); } } if (options.isFileProtocol && !options.fileAsync) { if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) { callback(xhr.responseText); } else { errback(xhr.status, url); } } else if (async) { xhr.onreadystatechange = function () { if (xhr.readyState == 4) { handleResponse(xhr, callback, errback); } }; } else { handleResponse(xhr, callback, errback); } }; FileManager.prototype.supports = function(filename, currentDirectory, options, environment) { return true; }; FileManager.prototype.clearFileCache = function() { fileCache = {}; }; FileManager.prototype.loadFile = function loadFile(filename, currentDirectory, options, environment) { // TODO: Add prefix support like less-node? // What about multiple paths? if (currentDirectory && !this.isPathAbsolute(filename)) { filename = currentDirectory + filename; } filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename; options = options || {}; // sheet may be set to the stylesheet for the initial load or a collection of properties including // some context variables for imports var hrefParts = this.extractUrlParts(filename, window.location.href); var href = hrefParts.url; var self = this; return new Promise(function(resolve, reject) { if (options.useFileCache && fileCache[href]) { try { var lessText = fileCache[href]; return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }}); } catch (e) { return reject({ filename: href, message: 'Error loading file ' + href + ' error was ' + e.message }); } } self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) { // per file cache fileCache[href] = data; // Use remote copy (re-parse) resolve({ contents: data, filename: href, webInfo: { lastModified: lastModified }}); }, function doXHRError(status, url) { reject({ type: 'File', message: '\'' + url + '\' wasn\'t found (' + status + ')', href: href }); }); }); }; return FileManager; }; },{"../less/environment/abstract-file-manager.js":18}],7:[function(require,module,exports){ module.exports = function() { var functionRegistry = require('./../less/functions/function-registry'); function imageSize() { throw { type: 'Runtime', message: 'Image size functions are not supported in browser version of less' }; } var imageFunctions = { 'image-size': function(filePathNode) { imageSize(this, filePathNode); return -1; }, 'image-width': function(filePathNode) { imageSize(this, filePathNode); return -1; }, 'image-height': function(filePathNode) { imageSize(this, filePathNode); return -1; } }; functionRegistry.addMultiple(imageFunctions); }; },{"./../less/functions/function-registry":27}],8:[function(require,module,exports){ // // index.js // Should expose the additional browser functions on to the less object // var addDataAttr = require('./utils').addDataAttr, browser = require('./browser'); module.exports = function(window, options) { var document = window.document; var less = require('../less')(); less.options = options; var environment = less.environment, FileManager = require('./file-manager')(options, less.logger), fileManager = new FileManager(); environment.addFileManager(fileManager); less.FileManager = FileManager; less.PluginLoader = require('./plugin-loader'); require('./log-listener')(less, options); var errors = require('./error-reporting')(window, less, options); var cache = less.cache = options.cache || require('./cache')(window, options, less.logger); require('./image-size')(less.environment); // Setup user functions - Deprecate? if (options.functions) { less.functions.functionRegistry.addMultiple(options.functions); } var typePattern = /^text\/(x-)?less$/; function clone(obj) { var cloned = {}; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { cloned[prop] = obj[prop]; } } return cloned; } // only really needed for phantom function bind(func, thisArg) { var curryArgs = Array.prototype.slice.call(arguments, 2); return function() { var args = curryArgs.concat(Array.prototype.slice.call(arguments, 0)); return func.apply(thisArg, args); }; } function loadStyles(modifyVars) { var styles = document.getElementsByTagName('style'), style; for (var i = 0; i < styles.length; i++) { style = styles[i]; if (style.type.match(typePattern)) { var instanceOptions = clone(options); instanceOptions.modifyVars = modifyVars; var lessText = style.innerHTML || ''; instanceOptions.filename = document.location.href.replace(/#.*$/, ''); /* jshint loopfunc:true */ // use closure to store current style less.render(lessText, instanceOptions, bind(function(style, e, result) { if (e) { errors.add(e, 'inline'); } else { style.type = 'text/css'; if (style.styleSheet) { style.styleSheet.cssText = result.css; } else { style.innerHTML = result.css; } } }, null, style)); } } } function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) { var instanceOptions = clone(options); addDataAttr(instanceOptions, sheet); instanceOptions.mime = sheet.type; if (modifyVars) { instanceOptions.modifyVars = modifyVars; } function loadInitialFileCallback(loadedFile) { var data = loadedFile.contents, path = loadedFile.filename, webInfo = loadedFile.webInfo; var newFileInfo = { currentDirectory: fileManager.getPath(path), filename: path, rootFilename: path, rewriteUrls: instanceOptions.rewriteUrls }; newFileInfo.entryPath = newFileInfo.currentDirectory; newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory; if (webInfo) { webInfo.remaining = remaining; var css = cache.getCSS(path, webInfo, instanceOptions.modifyVars); if (!reload && css) { webInfo.local = true; callback(null, css, data, sheet, webInfo, path); return; } } // TODO add tests around how this behaves when reloading errors.remove(path); instanceOptions.rootFileInfo = newFileInfo; less.render(data, instanceOptions, function(e, result) { if (e) { e.href = path; callback(e); } else { cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css); callback(null, result.css, data, sheet, webInfo, path); } }); } fileManager.loadFile(sheet.href, null, instanceOptions, environment) .then(function(loadedFile) { loadInitialFileCallback(loadedFile); }).catch(function(err) { console.log(err); callback(err); }); } function loadStyleSheets(callback, reload, modifyVars) { for (var i = 0; i < less.sheets.length; i++) { loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars); } } function initRunningMode() { if (less.env === 'development') { less.watchTimer = setInterval(function () { if (less.watchMode) { fileManager.clearFileCache(); loadStyleSheets(function (e, css, _, sheet, webInfo) { if (e) { errors.add(e, e.href || sheet.href); } else if (css) { browser.createCSS(window.document, css, sheet); } }); } }, options.poll); } } // // Watch mode // less.watch = function () { if (!less.watchMode ) { less.env = 'development'; initRunningMode(); } this.watchMode = true; return true; }; less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; }; // // Synchronously get all <link> tags with the 'rel' attribute set to // "stylesheet/less". // less.registerStylesheetsImmediately = function() { var links = document.getElementsByTagName('link'); less.sheets = []; for (var i = 0; i < links.length; i++) { if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) && (links[i].type.match(typePattern)))) { less.sheets.push(links[i]); } } }; // // Asynchronously get all <link> tags with the 'rel' attribute set to // "stylesheet/less", returning a Promise. // less.registerStylesheets = function() { return new Promise(function(resolve, reject) { less.registerStylesheetsImmediately(); resolve(); }); }; // // With this function, it's possible to alter variables and re-render // CSS without reloading less-files // less.modifyVars = function(record) { return less.refresh(true, record, false); }; less.refresh = function (reload, modifyVars, clearFileCache) { if ((reload || clearFileCache) && clearFileCache !== false) { fileManager.clearFileCache(); } return new Promise(function (resolve, reject) { var startTime, endTime, totalMilliseconds, remainingSheets; startTime = endTime = new Date(); // Set counter for remaining unprocessed sheets remainingSheets = less.sheets.length; if (remainingSheets === 0) { endTime = new Date(); totalMilliseconds = endTime - startTime; less.logger.info('Less has finished and no sheets were loaded.'); resolve({ startTime: startTime, endTime: endTime, totalMilliseconds: totalMilliseconds, sheets: less.sheets.length }); } else { // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array loadStyleSheets(function (e, css, _, sheet, webInfo) { if (e) { errors.add(e, e.href || sheet.href); reject(e); return; } if (webInfo.local) { less.logger.info('Loading ' + sheet.href + ' from cache.'); } else { less.logger.info('Rendered ' + sheet.href + ' successfully.'); } browser.createCSS(window.document, css, sheet); less.logger.info('CSS for ' + sheet.href + ' generated in ' + (new Date() - endTime) + 'ms'); // Count completed sheet remainingSheets--; // Check if the last remaining sheet was processed and then call the promise if (remainingSheets === 0) { totalMilliseconds = new Date() - startTime; less.logger.info('Less has finished. CSS generated in ' + totalMilliseconds + 'ms'); resolve({ startTime: startTime, endTime: endTime, totalMilliseconds: totalMilliseconds, sheets: less.sheets.length }); } endTime = new Date(); }, reload, modifyVars); } loadStyles(modifyVars); }); }; less.refreshStyles = loadStyles; return less; }; },{"../less":37,"./browser":3,"./cache":4,"./error-reporting":5,"./file-manager":6,"./image-size":7,"./log-listener":9,"./plugin-loader":10,"./utils":11}],9:[function(require,module,exports){ module.exports = function(less, options) { var logLevel_debug = 4, logLevel_info = 3, logLevel_warn = 2, logLevel_error = 1; // The amount of logging in the javascript console. // 3 - Debug, information and errors // 2 - Information and errors // 1 - Errors // 0 - None // Defaults to 2 options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ? logLevel_info : logLevel_error); if (!options.loggers) { options.loggers = [{ debug: function(msg) { if (options.logLevel >= logLevel_debug) { console.log(msg); } }, info: function(msg) { if (options.logLevel >= logLevel_info) { console.log(msg); } }, warn: function(msg) { if (options.logLevel >= logLevel_warn) { console.warn(msg); } }, error: function(msg) { if (options.logLevel >= logLevel_error) { console.error(msg); } } }]; } for (var i = 0; i < options.loggers.length; i++) { less.logger.addListener(options.loggers[i]); } }; },{}],10:[function(require,module,exports){ // TODO: Add tests for browser @plugin /* global window */ var AbstractPluginLoader = require('../less/environment/abstract-plugin-loader.js'); /** * Browser Plugin Loader */ var PluginLoader = function(less) { this.less = less; // Should we shim this.require for browser? Probably not? }; PluginLoader.prototype = new AbstractPluginLoader(); PluginLoader.prototype.loadPlugin = function(filename, basePath, context, environment, fileManager) { return new Promise(function(fulfill, reject) { fileManager.loadFile(filename, basePath, context, environment) .then(fulfill).catch(reject); }); }; module.exports = PluginLoader; },{"../less/environment/abstract-plugin-loader.js":19}],11:[function(require,module,exports){ module.exports = { extractId: function(href) { return href.replace(/^[a-z-]+:\/+?[^\/]+/, '') // Remove protocol & domain .replace(/[\?\&]livereload=\w+/, '') // Remove LiveReload cachebuster .replace(/^\//, '') // Remove root / .replace(/\.[a-zA-Z]+$/, '') // Remove simple extension .replace(/[^\.\w-]+/g, '-') // Replace illegal characters .replace(/\./g, ':'); // Replace dots with colons(for valid id) }, addDataAttr: function(options, tag) { for (var opt in tag.dataset) { if (tag.dataset.hasOwnProperty(opt)) { if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') { options[opt] = tag.dataset[opt]; } else { try { options[opt] = JSON.parse(tag.dataset[opt]); } catch (_) {} } } } } }; },{}],12:[function(require,module,exports){ module.exports = { Math: { ALWAYS: 0, PARENS_DIVISION: 1, PARENS: 2, STRICT_LEGACY: 3 }, RewriteUrls: { OFF: 0, LOCAL: 1, ALL: 2 } }; },{}],13:[function(require,module,exports){ var contexts = {}; module.exports = contexts; var Constants = require('./constants'); var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) { if (!original) { return; } for (var i = 0; i < propertiesToCopy.length; i++) { if (original.hasOwnProperty(propertiesToCopy[i])) { destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; } } }; /* parse is used whilst parsing */ var parseCopyProperties = [ // options 'paths', // option - unmodified - paths to search for imports on 'rewriteUrls', // option - whether to adjust URL's to be relative 'rootpath', // option - rootpath to append to URL's 'strictImports', // option - 'insecure', // option - whether to allow imports from insecure ssl hosts 'dumpLineNumbers', // option - whether to dump line numbers 'compress', // option - whether to compress 'syncImport', // option - whether to import synchronously 'chunkInput', // option - whether to chunk input. more performant but causes parse issues. 'mime', // browser only - mime type for sheet import 'useFileCache', // browser only - whether to use the per file session cache // context 'processImports', // option & context - whether to process imports. if false then imports will not be imported. // Used by the import manager to stop multiple import visitors being created. 'pluginManager' // Used as the plugin manager for the session ]; contexts.Parse = function(options) { copyFromOriginal(options, this, parseCopyProperties); if (typeof this.paths === 'string') { this.paths = [this.paths]; } }; var evalCopyProperties = [ 'paths', // additional include paths 'compress', // whether to compress 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri) 'math', // whether math has to be within parenthesis 'strictUnits', // whether units need to evaluate correctly 'sourceMap', // whether to output a source map 'importMultiple', // whether we are currently importing multiple copies 'urlArgs', // whether to add args into url tokens 'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false 'pluginManager', // Used as the plugin manager for the session 'importantScope', // used to bubble up !important statements 'rewriteUrls' // option - whether to adjust URL's to be relative ]; contexts.Eval = function(options, frames) { copyFromOriginal(options, this, evalCopyProperties); if (typeof this.paths === 'string') { this.paths = [this.paths]; } this.frames = frames || []; this.importantScope = this.importantScope || []; }; contexts.Eval.prototype.enterCalc = function () { if (!this.calcStack) { this.calcStack = []; } this.calcStack.push(true); this.inCalc = true; }; contexts.Eval.prototype.exitCalc = function () { this.calcStack.pop(); if (!this.calcStack) { this.inCalc = false; } }; contexts.Eval.prototype.inParenthesis = function () { if (!this.parensStack) { this.parensStack = []; } this.parensStack.push(true); }; contexts.Eval.prototype.outOfParenthesis = function () { this.parensStack.pop(); }; contexts.Eval.prototype.inCalc = false; contexts.Eval.prototype.mathOn = true; contexts.Eval.prototype.isMathOn = function (op) { if (!this.mathOn) { return false; } if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) { return false; } if (this.math > Constants.Math.PARENS_DIVISION) { return this.parensStack && this.parensStack.length; } return true; }; contexts.Eval.prototype.pathRequiresRewrite = function (path) { var isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative; return isRelative(path); }; contexts.Eval.prototype.rewritePath = function (path, rootpath) { var newPath; rootpath = rootpath || ''; newPath = this.normalizePath(rootpath + path); // If a path was explicit relative and the rootpath was not an absolute path // we must ensure that the new path is also explicit relative. if (isPathLocalRelative(path) && isPathRelative(rootpath) && isPathLocalRelative(newPath) === false) { newPath = './' + newPath; } return newPath; }; contexts.Eval.prototype.normalizePath = function (path) { var segments = path.split('/').reverse(), segment; path = []; while (segments.length !== 0) { segment = segments.pop(); switch ( segment ) { case '.': break; case '..': if ((path.length === 0) || (path[path.length - 1] === '..')) { path.push( segment ); } else { path.pop(); } break; default: path.push(segment); break; } } return path.join('/'); }; function isPathRelative(path) { return !/^(?:[a-z-]+:|\/|#)/i.test(path); } function isPathLocalRelative(path) { return path.charAt(0) === '.'; } // todo - do the same for the toCSS ? },{"./constants":12}],14:[function(require,module,exports){ module.exports = { 'aliceblue':'#f0f8ff', 'antiquewhite':'#faebd7', 'aqua':'#00ffff', 'aquamarine':'#7fffd4', 'azure':'#f0ffff', 'beige':'#f5f5dc', 'bisque':'#ffe4c4', 'black':'#000000', 'blanchedalmond':'#ffebcd', 'blue':'#0000ff', 'blueviolet':'#8a2be2', 'brown':'#a52a2a', 'burlywood':'#deb887', 'cadetblue':'#5f9ea0', 'chartreuse':'#7fff00', 'chocolate':'#d2691e', 'coral':'#ff7f50', 'cornflowerblue':'#6495ed', 'cornsilk':'#fff8dc', 'crimson':'#dc143c', 'cyan':'#00ffff', 'darkblue':'#00008b', 'darkcyan':'#008b8b', 'darkgoldenrod':'#b8860b', 'darkgray':'#a9a9a9', 'darkgrey':'#a9a9a9', 'darkgreen':'#006400', 'darkkhaki':'#bdb76b', 'darkmagenta':'#8b008b', 'darkolivegreen':'#556b2f', 'darkorange':'#ff8c00', 'darkorchid':'#9932cc', 'darkred':'#8b0000', 'darksalmon':'#e9967a', 'darkseagreen':'#8fbc8f', 'darkslateblue':'#483d8b', 'darkslategray':'#2f4f4f', 'darkslategrey':'#2f4f4f', 'darkturquoise':'#00ced1', 'darkviolet':'#9400d3', 'deeppink':'#ff1493', 'deepskyblue':'#00bfff', 'dimgray':'#696969', 'dimgrey':'#696969', 'dodgerblue':'#1e90ff', 'firebrick':'#b22222', 'floralwhite':'#fffaf0', 'forestgreen':'#228b22', 'fuchsia':'#ff00ff', 'gainsboro':'#dcdcdc', 'ghostwhite':'#f8f8ff', 'gold':'#ffd700', 'goldenrod':'#daa520', 'gray':'#808080', 'grey':'#808080', 'green':'#008000', 'greenyellow':'#adff2f', 'honeydew':'#f0fff0', 'hotpink':'#ff69b4', 'indianred':'#cd5c5c', 'indigo':'#4b0082', 'ivory':'#fffff0', 'khaki':'#f0e68c', 'lavender':'#e6e6fa', 'lavenderblush':'#fff0f5', 'lawngreen':'#7cfc00', 'lemonchiffon':'#fffacd', 'lightblue':'#add8e6', 'lightcoral':'#f08080', 'lightcyan':'#e0ffff', 'lightgoldenrodyellow':'#fafad2', 'lightgray':'#d3d3d3', 'lightgrey':'#d3d3d3', 'lightgreen':'#90ee90', 'lightpink':'#ffb6c1', 'lightsalmon':'#ffa07a', 'lightseagreen':'#20b2aa', 'lightskyblue':'#87cefa', 'lightslategray':'#778899', 'lightslategrey':'#778899', 'lightsteelblue':'#b0c4de', 'lightyellow':'#ffffe0', 'lime':'#00ff00', 'limegreen':'#32cd32', 'linen':'#faf0e6', 'magenta':'#ff00ff', 'maroon':'#800000', 'mediumaquamarine':'#66cdaa', 'mediumblue':'#0000cd', 'mediumorchid':'#ba55d3', 'mediumpurple':'#9370d8', 'mediumseagreen':'#3cb371', 'mediumslateblue':'#7b68ee', 'mediumspringgreen':'#00fa9a', 'mediumturquoise':'#48d1cc', 'mediumvioletred':'#c71585', 'midnightblue':'#191970', 'mintcream':'#f5fffa', 'mistyrose':'#ffe4e1', 'moccasin':'#ffe4b5', 'navajowhite':'#ffdead', 'navy':'#000080', 'oldlace':'#fdf5e6', 'olive':'#808000', 'olivedrab':'#6b8e23', 'orange':'#ffa500', 'orangered':'#ff4500', 'orchid':'#da70d6', 'palegoldenrod':'#eee8aa', 'palegreen':'#98fb98', 'paleturquoise':'#afeeee', 'palevioletred':'#d87093', 'papayawhip':'#ffefd5', 'peachpuff':'#ffdab9', 'peru':'#cd853f', 'pink':'#ffc0cb', 'plum':'#dda0dd', 'powderblue':'#b0e0e6', 'purple':'#800080', 'rebeccapurple':'#663399', 'red':'#ff0000', 'rosybrown':'#bc8f8f', 'royalblue':'#4169e1', 'saddlebrown':'#8b4513', 'salmon':'#fa8072', 'sandybrown':'#f4a460', 'seagreen':'#2e8b57', 'seashell':'#fff5ee', 'sienna':'#a0522d', 'silver':'#c0c0c0', 'skyblue':'#87ceeb', 'slateblue':'#6a5acd', 'slategray':'#708090', 'slategrey':'#708090', 'snow':'#fffafa', 'springgreen':'#00ff7f', 'steelblue':'#4682b4', 'tan':'#d2b48c', 'teal':'#008080', 'thistle':'#d8bfd8', 'tomato':'#ff6347', 'turquoise':'#40e0d0', 'violet':'#ee82ee', 'wheat':'#f5deb3', 'white':'#ffffff', 'whitesmoke':'#f5f5f5', 'yellow':'#ffff00', 'yellowgreen':'#9acd32' }; },{}],15:[function(require,module,exports){ module.exports = { colors: require('./colors'), unitConversions: require('./unit-conversions') }; },{"./colors":14,"./unit-conversions":16}],16:[function(require,module,exports){ module.exports = { length: { 'm': 1, 'cm': 0.01, 'mm': 0.001, 'in': 0.0254, 'px': 0.0254 / 96, 'pt': 0.0254 / 72, 'pc': 0.0254 / 72 * 12 }, duration: { 's': 1, 'ms': 0.001 }, angle: { 'rad': 1 / (2 * Math.PI), 'deg': 1 / 360, 'grad': 1 / 400, 'turn': 1 } }; },{}],17:[function(require,module,exports){ // Export a new default each time module.exports = function() { return { /* Inline Javascript - @plugin still allowed */ javascriptEnabled: false, /* Outputs a makefile import dependency list to stdout. */ depends: false, /* (DEPRECATED) Compress using less built-in compression. * This does an okay job but does not utilise all the tricks of * dedicated css compression. */ compress: false, /* Runs the less parser and just reports errors without any output. */ lint: false, /* Sets available include paths. * If the file in an @import rule does not exist at that exact location, * less will look for it at the location(s) passed to this option. * You might use this for instance to specify a path to a library which * you want to be referenced simply and relatively in the less files. */ paths: [], /* color output in the terminal */ color: true, /* The strictImports controls whether the compiler will allow an @import inside of either * @media blocks or (a later addition) other selector blocks. * See: https://github.com/less/less.js/issues/656 */ strictImports: false, /* Allow Imports from Insecure HTTPS Hosts */ insecure: false, /* Allows you to add a path to every generated import and url in your css. * This does not affect less import statements that are processed, just ones * that are left in the output css. */ rootpath: '', /* By default URLs are kept as-is, so if you import a file in a sub-directory * that references an image, exactly the same URL will be output in the css. * This option allows you to re-write URL's in imported files so that the * URL is always relative to the base imported file */ rewriteUrls: false, /* Compatibility with IE8. Used for limiting data-uri length */ ieCompat: false, // true until 3.0 /* How to process math * 0 always - eagerly try to solve all operations * 1 parens-division - require parens for division "/" * 2 parens | strict - require parens for all operations * 3 strict-legacy - legacy strict behavior (super-strict) */ math: 0, /* Without this option, less attempts to guess at the output unit when it does maths. */ strictUnits: false, /* Effectively the declaration is put at the top of your base Less file, * meaning it can be used but it also can be overridden if this variable * is defined in the file. */ globalVars: null, /* As opposed to the global variable option, this puts the declaration at the * end of your base file, meaning it will override anything defined in your Less file. */ modifyVars: null, /* This option allows you to specify a argument to go on to every URL. */ urlArgs: '' } } },{}],18:[function(require,module,exports){ var abstractFileManager = function() { }; abstractFileManager.prototype.getPath = function (filename) { var j = filename.lastIndexOf('?'); if (j > 0) { filename = filename.slice(0, j); } j = filename.lastIndexOf('/'); if (j < 0) { j = filename.lastIndexOf('\\'); } if (j < 0) { return ''; } return filename.slice(0, j + 1); }; abstractFileManager.prototype.tryAppendExtension = function(path, ext) { return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext; }; abstractFileManager.prototype.tryAppendLessExtension = function(path) { return this.tryAppendExtension(path, '.less'); }; abstractFileManager.prototype.supportsSync = function() { return false; }; abstractFileManager.prototype.alwaysMakePathsAbsolute = function() { return false; }; abstractFileManager.prototype.isPathAbsolute = function(filename) { return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename); }; // TODO: pull out / replace? abstractFileManager.prototype.join = function(basePath, laterPath) { if (!basePath) { return laterPath; } return basePath + laterPath; }; abstractFileManager.prototype.pathDiff = function pathDiff(url, baseUrl) { // diff between two paths to create a relative path var urlParts = this.extractUrlParts(url), baseUrlParts = this.extractUrlParts(baseUrl), i, max, urlDirectories, baseUrlDirectories, diff = ''; if (urlParts.hostPart !== baseUrlParts.hostPart) { return ''; } max = Math.max(baseUrlParts.directories.length, urlParts.directories.length); for (i = 0; i < max; i++) { if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; } } baseUrlDirectories = baseUrlParts.directories.slice(i); urlDirectories = urlParts.directories.slice(i); for (i = 0; i < baseUrlDirectories.length - 1; i++) { diff += '../'; } for (i = 0; i < urlDirectories.length - 1; i++) { diff += urlDirectories[i] + '/'; } return diff; }; // helper function, not part of API abstractFileManager.prototype.extractUrlParts = function extractUrlParts(url, baseUrl) { // urlParts[1] = protocol://hostname/ OR / // urlParts[2] = / if path relative to host base // urlParts[3] = directories // urlParts[4] = filename // urlParts[5] = parameters var urlPartsRegex = /^((?:[a-z-]+:)?\/{2}(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\