167 lines
5.3 KiB
JavaScript
167 lines
5.3 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
var _warning = require('warning');
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _toCss = require('../utils/toCss');
|
|
|
|
var _toCss2 = _interopRequireDefault(_toCss);
|
|
|
|
var _toCssValue = require('../utils/toCssValue');
|
|
|
|
var _toCssValue2 = _interopRequireDefault(_toCssValue);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
var StyleRule = function () {
|
|
function StyleRule(key, style, options) {
|
|
_classCallCheck(this, StyleRule);
|
|
|
|
this.type = 'style';
|
|
this.isProcessed = false;
|
|
var sheet = options.sheet,
|
|
Renderer = options.Renderer,
|
|
selector = options.selector;
|
|
|
|
this.key = key;
|
|
this.options = options;
|
|
this.style = style;
|
|
if (selector) this.selectorText = selector;
|
|
this.renderer = sheet ? sheet.renderer : new Renderer();
|
|
}
|
|
|
|
/**
|
|
* Set selector string.
|
|
* Attention: use this with caution. Most browsers didn't implement
|
|
* selectorText setter, so this may result in rerendering of entire Style Sheet.
|
|
*/
|
|
|
|
|
|
_createClass(StyleRule, [{
|
|
key: 'prop',
|
|
|
|
|
|
/**
|
|
* Get or set a style property.
|
|
*/
|
|
value: function prop(name, value) {
|
|
// It's a getter.
|
|
if (value === undefined) return this.style[name];
|
|
|
|
// Don't do anything if the value has not changed.
|
|
if (this.style[name] === value) return this;
|
|
|
|
value = this.options.jss.plugins.onChangeValue(value, name, this);
|
|
|
|
var isEmpty = value == null || value === false;
|
|
var isDefined = name in this.style;
|
|
|
|
// Value is empty and wasn't defined before.
|
|
if (isEmpty && !isDefined) return this;
|
|
|
|
// We are going to remove this value.
|
|
var remove = isEmpty && isDefined;
|
|
|
|
if (remove) delete this.style[name];else this.style[name] = value;
|
|
|
|
// Renderable is defined if StyleSheet option `link` is true.
|
|
if (this.renderable) {
|
|
if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, value);
|
|
return this;
|
|
}
|
|
|
|
var sheet = this.options.sheet;
|
|
|
|
if (sheet && sheet.attached) {
|
|
(0, _warning2['default'])(false, 'Rule is not linked. Missing sheet option "link: true".');
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Apply rule to an element inline.
|
|
*/
|
|
|
|
}, {
|
|
key: 'applyTo',
|
|
value: function applyTo(renderable) {
|
|
var json = this.toJSON();
|
|
for (var prop in json) {
|
|
this.renderer.setProperty(renderable, prop, json[prop]);
|
|
}return this;
|
|
}
|
|
|
|
/**
|
|
* Returns JSON representation of the rule.
|
|
* Fallbacks are not supported.
|
|
* Useful for inline styles.
|
|
*/
|
|
|
|
}, {
|
|
key: 'toJSON',
|
|
value: function toJSON() {
|
|
var json = {};
|
|
for (var prop in this.style) {
|
|
var value = this.style[prop];
|
|
if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = (0, _toCssValue2['default'])(value);
|
|
}
|
|
return json;
|
|
}
|
|
|
|
/**
|
|
* Generates a CSS string.
|
|
*/
|
|
|
|
}, {
|
|
key: 'toString',
|
|
value: function toString(options) {
|
|
var sheet = this.options.sheet;
|
|
|
|
var link = sheet ? sheet.options.link : false;
|
|
var opts = link ? _extends({}, options, { allowEmpty: true }) : options;
|
|
return (0, _toCss2['default'])(this.selector, this.style, opts);
|
|
}
|
|
}, {
|
|
key: 'selector',
|
|
set: function set(selector) {
|
|
if (selector === this.selectorText) return;
|
|
|
|
this.selectorText = selector;
|
|
|
|
if (!this.renderable) return;
|
|
|
|
var hasChanged = this.renderer.setSelector(this.renderable, selector);
|
|
|
|
// If selector setter is not implemented, rerender the rule.
|
|
if (!hasChanged && this.renderable) {
|
|
var renderable = this.renderer.replaceRule(this.renderable, this);
|
|
if (renderable) this.renderable = renderable;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get selector string.
|
|
*/
|
|
,
|
|
get: function get() {
|
|
return this.selectorText;
|
|
}
|
|
}]);
|
|
|
|
return StyleRule;
|
|
}();
|
|
|
|
exports['default'] = StyleRule; |