UNPKG

@ionic/core

Version:
226 lines (221 loc) • 11.8 kB
/*! * (C) Ionic http://ionicframework.com - MIT License */ import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client'; import { c as createColorClasses } from './theme.js'; import { c as config, b as getIonMode } from './ionic-global.js'; const spinners = { bubbles: { dur: 1000, circles: 9, fn: (dur, index, total) => { const animationDelay = `${(dur * index) / total - dur}ms`; const angle = (2 * Math.PI * index) / total; return { r: 5, style: { top: `${32 * Math.sin(angle)}%`, left: `${32 * Math.cos(angle)}%`, 'animation-delay': animationDelay, }, }; }, }, circles: { dur: 1000, circles: 8, fn: (dur, index, total) => { const step = index / total; const animationDelay = `${dur * step - dur}ms`; const angle = 2 * Math.PI * step; return { r: 5, style: { top: `${32 * Math.sin(angle)}%`, left: `${32 * Math.cos(angle)}%`, 'animation-delay': animationDelay, }, }; }, }, circular: { dur: 1400, elmDuration: true, circles: 1, fn: () => { return { r: 20, cx: 48, cy: 48, fill: 'none', viewBox: '24 24 48 48', transform: 'translate(0,0)', style: {}, }; }, }, crescent: { dur: 750, circles: 1, fn: () => { return { r: 26, style: {}, }; }, }, dots: { dur: 750, circles: 3, fn: (_, index) => { const animationDelay = -(110 * index) + 'ms'; return { r: 6, style: { left: `${32 - 32 * index}%`, 'animation-delay': animationDelay, }, }; }, }, lines: { dur: 1000, lines: 8, fn: (dur, index, total) => { const transform = `rotate(${(360 / total) * index + (index < total / 2 ? 180 : -180)}deg)`; const animationDelay = `${(dur * index) / total - dur}ms`; return { y1: 14, y2: 26, style: { transform: transform, 'animation-delay': animationDelay, }, }; }, }, 'lines-small': { dur: 1000, lines: 8, fn: (dur, index, total) => { const transform = `rotate(${(360 / total) * index + (index < total / 2 ? 180 : -180)}deg)`; const animationDelay = `${(dur * index) / total - dur}ms`; return { y1: 12, y2: 20, style: { transform: transform, 'animation-delay': animationDelay, }, }; }, }, 'lines-sharp': { dur: 1000, lines: 12, fn: (dur, index, total) => { const transform = `rotate(${30 * index + (index < 6 ? 180 : -180)}deg)`; const animationDelay = `${(dur * index) / total - dur}ms`; return { y1: 17, y2: 29, style: { transform: transform, 'animation-delay': animationDelay, }, }; }, }, 'lines-sharp-small': { dur: 1000, lines: 12, fn: (dur, index, total) => { const transform = `rotate(${30 * index + (index < 6 ? 180 : -180)}deg)`; const animationDelay = `${(dur * index) / total - dur}ms`; return { y1: 12, y2: 20, style: { transform: transform, 'animation-delay': animationDelay, }, }; }, }, }; const SPINNERS = spinners; const spinnerCss = ":host{display:inline-block;position:relative;width:28px;height:28px;color:var(--color);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:host(.ion-color){color:var(--ion-color-base)}svg{-webkit-transform-origin:center;transform-origin:center;position:absolute;top:0;left:0;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0)}:host-context([dir=rtl]) svg{-webkit-transform-origin:calc(100% - center);transform-origin:calc(100% - center)}[dir=rtl] svg{-webkit-transform-origin:calc(100% - center);transform-origin:calc(100% - center)}@supports selector(:dir(rtl)){svg:dir(rtl){-webkit-transform-origin:calc(100% - center);transform-origin:calc(100% - center)}}:host(.spinner-lines) line,:host(.spinner-lines-small) line{stroke-width:7px}:host(.spinner-lines-sharp) line,:host(.spinner-lines-sharp-small) line{stroke-width:4px}:host(.spinner-lines) line,:host(.spinner-lines-small) line,:host(.spinner-lines-sharp) line,:host(.spinner-lines-sharp-small) line{stroke-linecap:round;stroke:currentColor}:host(.spinner-lines) svg,:host(.spinner-lines-small) svg,:host(.spinner-lines-sharp) svg,:host(.spinner-lines-sharp-small) svg{-webkit-animation:spinner-fade-out 1s linear infinite;animation:spinner-fade-out 1s linear infinite}:host(.spinner-bubbles) svg{-webkit-animation:spinner-scale-out 1s linear infinite;animation:spinner-scale-out 1s linear infinite;fill:currentColor}:host(.spinner-circles) svg{-webkit-animation:spinner-fade-out 1s linear infinite;animation:spinner-fade-out 1s linear infinite;fill:currentColor}:host(.spinner-crescent) circle{fill:transparent;stroke-width:4px;stroke-dasharray:128px;stroke-dashoffset:82px;stroke:currentColor}:host(.spinner-crescent) svg{-webkit-animation:spinner-rotate 1s linear infinite;animation:spinner-rotate 1s linear infinite}:host(.spinner-dots) circle{stroke-width:0;fill:currentColor}:host(.spinner-dots) svg{-webkit-animation:spinner-dots 1s linear infinite;animation:spinner-dots 1s linear infinite}:host(.spinner-circular) svg{-webkit-animation:spinner-circular linear infinite;animation:spinner-circular linear infinite}:host(.spinner-circular) circle{-webkit-animation:spinner-circular-inner ease-in-out infinite;animation:spinner-circular-inner ease-in-out infinite;stroke:currentColor;stroke-dasharray:80px, 200px;stroke-dashoffset:0px;stroke-width:5.6;fill:none}:host(.spinner-paused),:host(.spinner-paused) svg,:host(.spinner-paused) circle{-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes spinner-fade-out{0%{opacity:1}100%{opacity:0}}@keyframes spinner-fade-out{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes spinner-scale-out{0%{-webkit-transform:scale(1, 1);transform:scale(1, 1)}100%{-webkit-transform:scale(0, 0);transform:scale(0, 0)}}@keyframes spinner-scale-out{0%{-webkit-transform:scale(1, 1);transform:scale(1, 1)}100%{-webkit-transform:scale(0, 0);transform:scale(0, 0)}}@-webkit-keyframes spinner-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes spinner-dots{0%{-webkit-transform:scale(1, 1);transform:scale(1, 1);opacity:0.9}50%{-webkit-transform:scale(0.4, 0.4);transform:scale(0.4, 0.4);opacity:0.3}100%{-webkit-transform:scale(1, 1);transform:scale(1, 1);opacity:0.9}}@keyframes spinner-dots{0%{-webkit-transform:scale(1, 1);transform:scale(1, 1);opacity:0.9}50%{-webkit-transform:scale(0.4, 0.4);transform:scale(0.4, 0.4);opacity:0.3}100%{-webkit-transform:scale(1, 1);transform:scale(1, 1);opacity:0.9}}@-webkit-keyframes spinner-circular{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-circular{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes spinner-circular-inner{0%{stroke-dasharray:1px, 200px;stroke-dashoffset:0px}50%{stroke-dasharray:100px, 200px;stroke-dashoffset:-15px}100%{stroke-dasharray:100px, 200px;stroke-dashoffset:-125px}}@keyframes spinner-circular-inner{0%{stroke-dasharray:1px, 200px;stroke-dashoffset:0px}50%{stroke-dasharray:100px, 200px;stroke-dashoffset:-15px}100%{stroke-dasharray:100px, 200px;stroke-dashoffset:-125px}}"; const IonSpinnerStyle0 = spinnerCss; const Spinner = /*@__PURE__*/ proxyCustomElement(class Spinner extends HTMLElement { constructor() { super(); this.__registerHost(); this.__attachShadow(); this.color = undefined; this.duration = undefined; this.name = undefined; this.paused = false; } getName() { const spinnerName = this.name || config.get('spinner'); const mode = getIonMode(this); if (spinnerName) { return spinnerName; } return mode === 'ios' ? 'lines' : 'circular'; } render() { var _a; const self = this; const mode = getIonMode(self); const spinnerName = self.getName(); const spinner = (_a = SPINNERS[spinnerName]) !== null && _a !== void 0 ? _a : SPINNERS['lines']; const duration = typeof self.duration === 'number' && self.duration > 10 ? self.duration : spinner.dur; const svgs = []; if (spinner.circles !== undefined) { for (let i = 0; i < spinner.circles; i++) { svgs.push(buildCircle(spinner, duration, i, spinner.circles)); } } else if (spinner.lines !== undefined) { for (let i = 0; i < spinner.lines; i++) { svgs.push(buildLine(spinner, duration, i, spinner.lines)); } } return (h(Host, { key: 'e0dfa8a3ee2a0469eb31323f506750bd77d65797', class: createColorClasses(self.color, { [mode]: true, [`spinner-${spinnerName}`]: true, 'spinner-paused': self.paused || config.getBoolean('_testing'), }), role: "progressbar", style: spinner.elmDuration ? { animationDuration: duration + 'ms' } : {} }, svgs)); } static get style() { return IonSpinnerStyle0; } }, [1, "ion-spinner", { "color": [513], "duration": [2], "name": [1], "paused": [4] }]); const buildCircle = (spinner, duration, index, total) => { const data = spinner.fn(duration, index, total); data.style['animation-duration'] = duration + 'ms'; return (h("svg", { viewBox: data.viewBox || '0 0 64 64', style: data.style }, h("circle", { transform: data.transform || 'translate(32,32)', cx: data.cx, cy: data.cy, r: data.r, style: spinner.elmDuration ? { animationDuration: duration + 'ms' } : {} }))); }; const buildLine = (spinner, duration, index, total) => { const data = spinner.fn(duration, index, total); data.style['animation-duration'] = duration + 'ms'; return (h("svg", { viewBox: data.viewBox || '0 0 64 64', style: data.style }, h("line", { transform: "translate(32,32)", y1: data.y1, y2: data.y2 }))); }; function defineCustomElement() { if (typeof customElements === "undefined") { return; } const components = ["ion-spinner"]; components.forEach(tagName => { switch (tagName) { case "ion-spinner": if (!customElements.get(tagName)) { customElements.define(tagName, Spinner); } break; } }); } export { SPINNERS as S, Spinner as a, defineCustomElement as d };