|
179 | 179 | rule.cssText = output;
|
180 | 180 | },
|
181 | 181 |
|
| 182 | + applyKeyframeTransforms: function(rule, keyframeTransforms) { |
| 183 | + var output = rule.cssText; |
| 184 | + if (this.rx.ANIMATION_MATCH.test(output)) { |
| 185 | + for (var keyframe in keyframeTransforms) { |
| 186 | + var transform = keyframeTransforms[keyframe]; |
| 187 | + output = transform(output); |
| 188 | + } |
| 189 | + } |
| 190 | + rule.cssText = output; |
| 191 | + }, |
| 192 | + |
182 | 193 | // Test if the rules in these styles matches the given `element` and if so,
|
183 | 194 | // collect any custom properties into `props`.
|
184 | 195 | propertyDataFromStyles: function(styles, element) {
|
|
254 | 265 | hostSelector;
|
255 | 266 | var hostRx = new RegExp(this.rx.HOST_PREFIX + rxHostSelector +
|
256 | 267 | this.rx.HOST_SUFFIX);
|
| 268 | + var keyframeTransforms = {}; |
| 269 | + |
257 | 270 | return styleTransformer.elementStyles(element, function(rule) {
|
258 | 271 | self.applyProperties(rule, properties);
|
259 |
| - if (rule.cssText && !nativeShadow) { |
260 |
| - self._scopeSelector(rule, hostRx, hostSelector, |
261 |
| - element._scopeCssViaAttr, scopeSelector); |
| 272 | + self.applyKeyframeTransforms(rule, keyframeTransforms); |
| 273 | + if (!nativeShadow) { |
| 274 | + if (Polymer.StyleUtil.isKeyframesSelector(rule)) { |
| 275 | + var keyframesNameRx = new RegExp(rule.parent.keyframesName, 'g'); |
| 276 | + self._scopeKeyframes(rule.parent, scopeSelector); |
| 277 | + keyframeTransforms[rule.parent.keyframesName] = function(cssText) { |
| 278 | + return cssText.replace( |
| 279 | + keyframesNameRx, rule.parent.transformedKeyframesName); |
| 280 | + }; |
| 281 | + } else if (rule.cssText) { |
| 282 | + self._scopeSelector(rule, hostRx, hostSelector, |
| 283 | + element._scopeCssViaAttr, scopeSelector); |
| 284 | + } |
262 | 285 | }
|
263 | 286 | });
|
264 | 287 | },
|
265 | 288 |
|
| 289 | + // Transforms `@keyframes` names to be unique for the current host. |
| 290 | + // Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0 |
| 291 | + _scopeKeyframes: function(rule, scopeId) { |
| 292 | + rule.transformedKeyframesName = rule.keyframesName + '-' + scopeId; |
| 293 | + rule.selector = '@keyframes ' + rule.transformedKeyframesName; |
| 294 | + }, |
| 295 | + |
266 | 296 | // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):
|
267 | 297 | // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo
|
268 | 298 | // host selector: x-foo.wide -> x-foo.x-foo-42.wide
|
|
357 | 387 | // var(--a, fallback-literal(with-one-nested-parentheses))
|
358 | 388 | VAR_MATCH: /(^|\W+)var\([\s]*([^,)]*)[\s]*,?[\s]*((?:[^,)]*)|(?:[^;]*\([^;)]*\)))[\s]*?\)/gi,
|
359 | 389 | VAR_CAPTURE: /\([\s]*(--[^,\s)]*)(?:,[\s]*(--[^,\s)]*))?(?:\)|,)/gi,
|
| 390 | + ANIMATION_MATCH: /animation|animation-name/g, |
360 | 391 | IS_VAR: /^--/,
|
361 | 392 | BRACKETED: /\{[^}]*\}/g,
|
362 | 393 | HOST_PREFIX: '(?:^|[^.#[:])',
|
|
0 commit comments