"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Theme = void 0; var _service = require("../service"); var ThemeUtils = _interopRequireWildcard(require("./utils")); var _vue = _interopRequireDefault(require("vue")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Theme = /*#__PURE__*/ function (_Service) { _inherits(Theme, _Service); function Theme() { var _this; var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Theme); _this = _possibleConstructorReturn(this, _getPrototypeOf(Theme).call(this)); _this.disabled = false; _this.themes = { light: { primary: '#1976D2', secondary: '#424242', accent: '#82B1FF', error: '#FF5252', info: '#2196F3', success: '#4CAF50', warning: '#FB8C00' }, dark: { primary: '#2196F3', secondary: '#424242', accent: '#FF4081', error: '#FF5252', info: '#2196F3', success: '#4CAF50', warning: '#FB8C00' } }; _this.defaults = _this.themes; _this.isDark = null; _this.vueInstance = null; if (options.disable) { _this.disabled = true; return _possibleConstructorReturn(_this); } _this.options = _objectSpread({}, _this.options, {}, options.options); _this.dark = Boolean(options.dark); var themes = options.themes || {}; _this.themes = { dark: _this.fillVariant(themes.dark, true), light: _this.fillVariant(themes.light, false) }; return _this; } // When setting css, check for element // and apply new values _createClass(Theme, [{ key: "applyTheme", // Apply current theme default // only called on client side value: function applyTheme() { if (this.disabled) return this.clearCss(); this.css = this.generatedStyles; } }, { key: "clearCss", value: function clearCss() { this.css = ''; } // Initialize theme for SSR and SPA // Attach to ssrContext head or // apply new theme to document }, { key: "init", value: function init(root, ssrContext) { if (this.disabled) return; var meta = Boolean(root.$meta); // TODO: don't import public types from /src var ssr = Boolean(ssrContext); /* istanbul ignore else */ if (meta) { this.initNuxt(root); } else if (ssr) { this.initSSR(ssrContext); } this.initTheme(); } // Allows for you to set target theme }, { key: "setTheme", value: function setTheme(theme, value) { this.themes[theme] = Object.assign(this.themes[theme], value); this.applyTheme(); } // Reset theme defaults }, { key: "resetThemes", value: function resetThemes() { this.themes.light = Object.assign({}, this.defaults.light); this.themes.dark = Object.assign({}, this.defaults.dark); this.applyTheme(); } // Check for existence of style element }, { key: "checkOrCreateStyleElement", value: function checkOrCreateStyleElement() { this.styleEl = document.getElementById('vuetify-theme-stylesheet'); /* istanbul ignore next */ if (this.styleEl) return true; this.genStyleElement(); // If doesn't have it, create it return Boolean(this.styleEl); } }, { key: "fillVariant", value: function fillVariant() { var theme = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var dark = arguments.length > 1 ? arguments[1] : undefined; var defaultTheme = this.themes[dark ? 'dark' : 'light']; return Object.assign({}, defaultTheme, theme); } // Generate the style element // if applicable }, { key: "genStyleElement", value: function genStyleElement() { if (typeof document === 'undefined') return; /* istanbul ignore next */ var options = this.options || {}; this.styleEl = document.createElement('style'); this.styleEl.type = 'text/css'; this.styleEl.id = 'vuetify-theme-stylesheet'; if (options.cspNonce) { this.styleEl.setAttribute('nonce', options.cspNonce); } document.head.appendChild(this.styleEl); } }, { key: "initNuxt", value: function initNuxt(root) { var options = this.options || {}; root.$children.push(new _vue.default({ head: { style: [{ cssText: this.generatedStyles, type: 'text/css', id: 'vuetify-theme-stylesheet', nonce: options.cspNonce }] } })); } }, { key: "initSSR", value: function initSSR(ssrContext) { var options = this.options || {}; // SSR var nonce = options.cspNonce ? " nonce=\"".concat(options.cspNonce, "\"") : ''; ssrContext.head = ssrContext.head || ''; ssrContext.head += ""); } }, { key: "initTheme", value: function initTheme() { var _this2 = this; // Only watch for reactivity on client side if (typeof document === 'undefined') return; // If we get here somehow, ensure // existing instance is removed if (this.vueInstance) this.vueInstance.$destroy(); // Use Vue instance to track reactivity // TODO: Update to use RFC if merged // https://github.com/vuejs/rfcs/blob/advanced-reactivity-api/active-rfcs/0000-advanced-reactivity-api.md this.vueInstance = new _vue.default({ data: { themes: this.themes }, watch: { themes: { immediate: true, deep: true, handler: function handler() { return _this2.applyTheme(); } } } }); } }, { key: "css", set: function set(val) { this.checkOrCreateStyleElement() && (this.styleEl.innerHTML = val); } }, { key: "dark", set: function set(val) { var oldDark = this.isDark; this.isDark = val; // Only apply theme after dark // has already been set before oldDark != null && this.applyTheme(); }, get: function get() { return Boolean(this.isDark); } }, { key: "currentTheme", get: function get() { var target = this.dark ? 'dark' : 'light'; return this.themes[target]; } }, { key: "generatedStyles", get: function get() { var theme = this.parsedTheme; /* istanbul ignore next */ var options = this.options || {}; var css; if (options.themeCache != null) { css = options.themeCache.get(theme); /* istanbul ignore if */ if (css != null) return css; } css = ThemeUtils.genStyles(theme, options.customProperties); if (options.minifyTheme != null) { css = options.minifyTheme(css); } if (options.themeCache != null) { options.themeCache.set(theme, css); } return css; } }, { key: "parsedTheme", get: function get() { /* istanbul ignore next */ var theme = this.currentTheme || {}; return ThemeUtils.parse(theme); } }]); return Theme; }(_service.Service); exports.Theme = Theme; Theme.property = 'theme'; //# sourceMappingURL=index.js.map