From 15b054f6a7b3fa1765ec4c642925827afa56e55f Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Mon, 31 Dec 2018 20:15:22 -0500 Subject: [PATCH] refactor some stuff --- src/internal/animations.js | 8 ++---- src/internal/style_manager.js | 48 ++++++++++++++++++++--------------- src/internal/transitions.js | 14 ++-------- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/internal/animations.js b/src/internal/animations.js index bcefc9c069..2936b67f81 100644 --- a/src/internal/animations.js +++ b/src/internal/animations.js @@ -1,7 +1,6 @@ import { identity as linear } from './utils.js'; -import { hash } from './transitions.js'; import { loop } from './loop.js'; -import { add_rule, delete_rule, generate_rule } from './style_manager.js'; +import { create_rule, delete_rule } from './style_manager.js'; export function wrapAnimation(node, from, fn, params) { if (!from) return; @@ -38,10 +37,7 @@ export function wrapAnimation(node, from, fn, params) { if (info.css) { if (delay) node.style.cssText = cssText; - const rule = generate_rule(program, ease, info.css); - program.name = `__svelte_${hash(rule)}`; - - add_rule(rule, program.name); + program.name = create_rule(program, ease, info.css); node.style.animation = (node.style.animation || '') .split(', ') diff --git a/src/internal/style_manager.js b/src/internal/style_manager.js index f444b216d6..6af5c091ed 100644 --- a/src/internal/style_manager.js +++ b/src/internal/style_manager.js @@ -4,20 +4,40 @@ let stylesheet; let active = 0; let current_rules = {}; -export function add_rule(rule, name) { - if (!stylesheet) { - const style = createElement('style'); - document.head.appendChild(style); - stylesheet = style.sheet; +// https://github.com/darkskyapp/string-hash/blob/master/index.js +function hash(str) { + let hash = 5381; + let i = str.length; + + while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i); + return hash >>> 0; +} + +export function create_rule({ a, b, delta, duration }, ease, fn) { + const step = 16.666 / duration; + let keyframes = '{\n'; + + for (let p = 0; p <= 1; p += step) { + const t = a + delta * ease(p); + keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; } - active += 1; - console.log(`adding rule`, active); + const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; + const name = `__svelte_${hash(rule)}`; if (!current_rules[name]) { + if (!stylesheet) { + const style = createElement('style'); + document.head.appendChild(style); + stylesheet = style.sheet; + } + current_rules[name] = true; stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length); } + + active += 1; + return name; } export function delete_rule(node, name) { @@ -26,25 +46,11 @@ export function delete_rule(node, name) { .filter(anim => anim && anim.indexOf(name) === -1) .join(', '); - console.trace(`removing rule`, active - 1); if (--active <= 0) clear_rules(); } -export function generate_rule({ a, b, delta, duration }, ease, fn) { - const step = 16.666 / duration; - let keyframes = '{\n'; - - for (let p = 0; p <= 1; p += step) { - const t = a + delta * ease(p); - keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; - } - - return keyframes + `100% {${fn(b, 1 - b)}}\n}`; -} - export function clear_rules() { let i = stylesheet.cssRules.length; - console.log(`clearing ${i} rules`); while (i--) stylesheet.deleteRule(i); current_rules = {}; } \ No newline at end of file diff --git a/src/internal/transitions.js b/src/internal/transitions.js index b7f3be163d..9495e20fdc 100644 --- a/src/internal/transitions.js +++ b/src/internal/transitions.js @@ -1,15 +1,6 @@ import { identity as linear, noop, run } from './utils.js'; import { loop } from './loop.js'; -import { add_rule, delete_rule, generate_rule } from './style_manager.js'; - -// https://github.com/darkskyapp/string-hash/blob/master/index.js -export function hash(str) { - let hash = 5381; - let i = str.length; - - while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i); - return hash >>> 0; -} +import { create_rule, delete_rule } from './style_manager.js'; export function wrapTransition(component, node, fn, params, intro) { let obj = fn.call(component, node, params); @@ -100,8 +91,7 @@ export function wrapTransition(component, node, fn, params, intro) { if (obj.css) { if (obj.delay) node.style.cssText = cssText; - const rule = generate_rule(program, ease, obj.css); - add_rule(rule, program.name = '__svelte_' + hash(rule)); + program.name = create_rule(program, ease, obj.css); node.style.animation = (node.style.animation || '') .split(', ')