172 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { value: true }); | ||
|  | exports.parseStackingContexts = exports.ElementPaint = exports.StackingContext = void 0; | ||
|  | var bitwise_1 = require("../core/bitwise"); | ||
|  | var bound_curves_1 = require("./bound-curves"); | ||
|  | var effects_1 = require("./effects"); | ||
|  | var path_1 = require("./path"); | ||
|  | var ol_element_container_1 = require("../dom/elements/ol-element-container"); | ||
|  | var li_element_container_1 = require("../dom/elements/li-element-container"); | ||
|  | var counter_1 = require("../css/types/functions/counter"); | ||
|  | var StackingContext = /** @class */ (function () { | ||
|  |     function StackingContext(container) { | ||
|  |         this.element = container; | ||
|  |         this.inlineLevel = []; | ||
|  |         this.nonInlineLevel = []; | ||
|  |         this.negativeZIndex = []; | ||
|  |         this.zeroOrAutoZIndexOrTransformedOrOpacity = []; | ||
|  |         this.positiveZIndex = []; | ||
|  |         this.nonPositionedFloats = []; | ||
|  |         this.nonPositionedInlineLevel = []; | ||
|  |     } | ||
|  |     return StackingContext; | ||
|  | }()); | ||
|  | exports.StackingContext = StackingContext; | ||
|  | var ElementPaint = /** @class */ (function () { | ||
|  |     function ElementPaint(container, parent) { | ||
|  |         this.container = container; | ||
|  |         this.parent = parent; | ||
|  |         this.effects = []; | ||
|  |         this.curves = new bound_curves_1.BoundCurves(this.container); | ||
|  |         if (this.container.styles.opacity < 1) { | ||
|  |             this.effects.push(new effects_1.OpacityEffect(this.container.styles.opacity)); | ||
|  |         } | ||
|  |         if (this.container.styles.transform !== null) { | ||
|  |             var offsetX = this.container.bounds.left + this.container.styles.transformOrigin[0].number; | ||
|  |             var offsetY = this.container.bounds.top + this.container.styles.transformOrigin[1].number; | ||
|  |             var matrix = this.container.styles.transform; | ||
|  |             this.effects.push(new effects_1.TransformEffect(offsetX, offsetY, matrix)); | ||
|  |         } | ||
|  |         if (this.container.styles.overflowX !== 0 /* VISIBLE */) { | ||
|  |             var borderBox = bound_curves_1.calculateBorderBoxPath(this.curves); | ||
|  |             var paddingBox = bound_curves_1.calculatePaddingBoxPath(this.curves); | ||
|  |             if (path_1.equalPath(borderBox, paddingBox)) { | ||
|  |                 this.effects.push(new effects_1.ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */)); | ||
|  |             } | ||
|  |             else { | ||
|  |                 this.effects.push(new effects_1.ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */)); | ||
|  |                 this.effects.push(new effects_1.ClipEffect(paddingBox, 4 /* CONTENT */)); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     ElementPaint.prototype.getEffects = function (target) { | ||
|  |         var inFlow = [2 /* ABSOLUTE */, 3 /* FIXED */].indexOf(this.container.styles.position) === -1; | ||
|  |         var parent = this.parent; | ||
|  |         var effects = this.effects.slice(0); | ||
|  |         while (parent) { | ||
|  |             var croplessEffects = parent.effects.filter(function (effect) { return !effects_1.isClipEffect(effect); }); | ||
|  |             if (inFlow || parent.container.styles.position !== 0 /* STATIC */ || !parent.parent) { | ||
|  |                 effects.unshift.apply(effects, croplessEffects); | ||
|  |                 inFlow = [2 /* ABSOLUTE */, 3 /* FIXED */].indexOf(parent.container.styles.position) === -1; | ||
|  |                 if (parent.container.styles.overflowX !== 0 /* VISIBLE */) { | ||
|  |                     var borderBox = bound_curves_1.calculateBorderBoxPath(parent.curves); | ||
|  |                     var paddingBox = bound_curves_1.calculatePaddingBoxPath(parent.curves); | ||
|  |                     if (!path_1.equalPath(borderBox, paddingBox)) { | ||
|  |                         effects.unshift(new effects_1.ClipEffect(paddingBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */)); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |             else { | ||
|  |                 effects.unshift.apply(effects, croplessEffects); | ||
|  |             } | ||
|  |             parent = parent.parent; | ||
|  |         } | ||
|  |         return effects.filter(function (effect) { return bitwise_1.contains(effect.target, target); }); | ||
|  |     }; | ||
|  |     return ElementPaint; | ||
|  | }()); | ||
|  | exports.ElementPaint = ElementPaint; | ||
|  | var parseStackTree = function (parent, stackingContext, realStackingContext, listItems) { | ||
|  |     parent.container.elements.forEach(function (child) { | ||
|  |         var treatAsRealStackingContext = bitwise_1.contains(child.flags, 4 /* CREATES_REAL_STACKING_CONTEXT */); | ||
|  |         var createsStackingContext = bitwise_1.contains(child.flags, 2 /* CREATES_STACKING_CONTEXT */); | ||
|  |         var paintContainer = new ElementPaint(child, parent); | ||
|  |         if (bitwise_1.contains(child.styles.display, 2048 /* LIST_ITEM */)) { | ||
|  |             listItems.push(paintContainer); | ||
|  |         } | ||
|  |         var listOwnerItems = bitwise_1.contains(child.flags, 8 /* IS_LIST_OWNER */) ? [] : listItems; | ||
|  |         if (treatAsRealStackingContext || createsStackingContext) { | ||
|  |             var parentStack = treatAsRealStackingContext || child.styles.isPositioned() ? realStackingContext : stackingContext; | ||
|  |             var stack = new StackingContext(paintContainer); | ||
|  |             if (child.styles.isPositioned() || child.styles.opacity < 1 || child.styles.isTransformed()) { | ||
|  |                 var order_1 = child.styles.zIndex.order; | ||
|  |                 if (order_1 < 0) { | ||
|  |                     var index_1 = 0; | ||
|  |                     parentStack.negativeZIndex.some(function (current, i) { | ||
|  |                         if (order_1 > current.element.container.styles.zIndex.order) { | ||
|  |                             index_1 = i; | ||
|  |                             return false; | ||
|  |                         } | ||
|  |                         else if (index_1 > 0) { | ||
|  |                             return true; | ||
|  |                         } | ||
|  |                         return false; | ||
|  |                     }); | ||
|  |                     parentStack.negativeZIndex.splice(index_1, 0, stack); | ||
|  |                 } | ||
|  |                 else if (order_1 > 0) { | ||
|  |                     var index_2 = 0; | ||
|  |                     parentStack.positiveZIndex.some(function (current, i) { | ||
|  |                         if (order_1 >= current.element.container.styles.zIndex.order) { | ||
|  |                             index_2 = i + 1; | ||
|  |                             return false; | ||
|  |                         } | ||
|  |                         else if (index_2 > 0) { | ||
|  |                             return true; | ||
|  |                         } | ||
|  |                         return false; | ||
|  |                     }); | ||
|  |                     parentStack.positiveZIndex.splice(index_2, 0, stack); | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     parentStack.zeroOrAutoZIndexOrTransformedOrOpacity.push(stack); | ||
|  |                 } | ||
|  |             } | ||
|  |             else { | ||
|  |                 if (child.styles.isFloating()) { | ||
|  |                     parentStack.nonPositionedFloats.push(stack); | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     parentStack.nonPositionedInlineLevel.push(stack); | ||
|  |                 } | ||
|  |             } | ||
|  |             parseStackTree(paintContainer, stack, treatAsRealStackingContext ? stack : realStackingContext, listOwnerItems); | ||
|  |         } | ||
|  |         else { | ||
|  |             if (child.styles.isInlineLevel()) { | ||
|  |                 stackingContext.inlineLevel.push(paintContainer); | ||
|  |             } | ||
|  |             else { | ||
|  |                 stackingContext.nonInlineLevel.push(paintContainer); | ||
|  |             } | ||
|  |             parseStackTree(paintContainer, stackingContext, realStackingContext, listOwnerItems); | ||
|  |         } | ||
|  |         if (bitwise_1.contains(child.flags, 8 /* IS_LIST_OWNER */)) { | ||
|  |             processListItems(child, listOwnerItems); | ||
|  |         } | ||
|  |     }); | ||
|  | }; | ||
|  | var processListItems = function (owner, elements) { | ||
|  |     var numbering = owner instanceof ol_element_container_1.OLElementContainer ? owner.start : 1; | ||
|  |     var reversed = owner instanceof ol_element_container_1.OLElementContainer ? owner.reversed : false; | ||
|  |     for (var i = 0; i < elements.length; i++) { | ||
|  |         var item = elements[i]; | ||
|  |         if (item.container instanceof li_element_container_1.LIElementContainer && | ||
|  |             typeof item.container.value === 'number' && | ||
|  |             item.container.value !== 0) { | ||
|  |             numbering = item.container.value; | ||
|  |         } | ||
|  |         item.listValue = counter_1.createCounterText(numbering, item.container.styles.listStyleType, true); | ||
|  |         numbering += reversed ? -1 : 1; | ||
|  |     } | ||
|  | }; | ||
|  | var parseStackingContexts = function (container) { | ||
|  |     var paintContainer = new ElementPaint(container, null); | ||
|  |     var root = new StackingContext(paintContainer); | ||
|  |     var listItems = []; | ||
|  |     parseStackTree(paintContainer, root, root, listItems); | ||
|  |     processListItems(paintContainer.container, listItems); | ||
|  |     return root; | ||
|  | }; | ||
|  | exports.parseStackingContexts = parseStackingContexts; | ||
|  | //# sourceMappingURL=stacking-context.js.map
 |