@atlassian/aui
Version:
Atlassian User Interface Framework
160 lines (137 loc) • 5.05 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['skatejs', './underscore'], factory);
} else if (typeof exports !== "undefined") {
factory(require('skatejs'), require('./underscore'));
} else {
var mod = {
exports: {}
};
factory(global.skatejs, global.underscore);
global.spinner = mod.exports;
}
})(this, function (_skatejs, _underscore) {
'use strict';
var _skatejs2 = _interopRequireDefault(_skatejs);
var _underscore2 = _interopRequireDefault(_underscore);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
var SIZE = {
SMALL: {
name: 'small',
px: 20,
radius: 9
},
MEDIUM: {
name: 'medium',
px: 30,
radius: 13.5
},
LARGE: {
name: 'large',
px: 50,
radius: 22.5
}
};
var DEFAULTS = {
filled: false,
size: SIZE.MEDIUM.name
};
function setMiddleTop(element) {
var svg = element.querySelector('svg');
var parent = element.parentNode;
var svgDomRect = svg.getBoundingClientRect();
var parentDomRect = parent.getBoundingClientRect();
var currentSpinnerTop = svgDomRect.top - parentDomRect.top;
svg.style.top = (parentDomRect.height - svgDomRect.height) / 2 - currentSpinnerTop + 'px';
}
function removeMiddleTop(element) {
element.querySelector('svg').style.top = '0px';
}
function validateSize(size) {
var result = SIZE.MEDIUM.name;
size = size.toLowerCase();
var possibleSizes = Object.keys(SIZE).map(function (key) {
return key.toLowerCase();
});
if (possibleSizes.indexOf(size) > -1) {
result = size;
}
return result;
}
function setSize(element, size, radius) {
var svg = element.querySelector('svg');
var circle = element.querySelector('circle');
svg.setAttribute('size', size);
svg.setAttribute('height', size);
svg.setAttribute('width', size);
svg.setAttribute('viewBox', '0 0 ' + size + ' ' + size);
var circleSize = size / 2;
circle.setAttribute('cx', circleSize);
circle.setAttribute('cy', circleSize);
circle.setAttribute('r', radius);
}
function refresh(element) {
if (element._data.IS_COMPONENT_ATTACHED) {
var _ref = _underscore2.default.find(SIZE, function (s) {
return s.name === element._data.size;
}) || SIZE.MEDIUM,
px = _ref.px,
radius = _ref.radius;
setSize(element, px, radius);
if (element._data.filled) {
setMiddleTop(element);
} else {
removeMiddleTop(element);
}
}
}
(0, _skatejs2.default)('aui-spinner', {
template: function template(element) {
element._data.IS_COMPONENT_ATTACHED = false;
element.innerHTML = '<div class="aui-spinner spinner">\n <svg focusable="false" size="' + SIZE.MEDIUM.px + '" height="' + SIZE.MEDIUM.px + '" width="' + SIZE.MEDIUM.px + '" viewBox="0 0 ' + SIZE.MEDIUM.px + ' ' + SIZE.MEDIUM.px + '">\n <circle cx="' + SIZE.MEDIUM.px / 2 + '" cy="' + SIZE.MEDIUM.px / 2 + '" r="' + SIZE.MEDIUM.radius + '"></circle>\n </svg>\n </div>';
if (!element.hasAttribute('size')) {
element.setAttribute('size', SIZE.MEDIUM.name);
}
},
attached: function attached(element) {
element._data.IS_COMPONENT_ATTACHED = true;
refresh(element);
},
attributes: {
filled: {
created: function created(element) {
element._data.filled = true;
refresh(element);
},
removed: function removed(element) {
element._data.filled = false;
refresh(element);
}
},
size: function size(element, data) {
element._data.size = validateSize(data.newValue);
refresh(element);
}
},
prototype: {
get _data() {
return this.__data || (this._data = _underscore2.default.defaults({}, DEFAULTS));
},
set _data(data) {
return this.__data = data;
},
set filled(isFilled) {
!!isFilled ? this.setAttribute('filled', '') : this.removeAttribute('filled');
},
set size(newSize) {
var size = validateSize(newSize);
this.setAttribute('size', size);
}
}
});
});
//# sourceMappingURL=spinner.js.map