1import { e as edr_remote_vue_components__loadShare__vue__loadShare__, _ as _export_sfc } from './_plugin-vue_export-helper-DvQ-EqJP.js'; 2import { f as formatDateTime } from './utils-CRB9uaPI.js'; 3import './edr_remote_vue_components__mf_v__runtimeInit__mf_v__-DcBObn8E.js'; 4 5const _hoisted_1$7 = { class: "card-item" }; 6const _hoisted_2$5 = { 7 key: 0, 8 class: "card-header" 9}; 10const _hoisted_3$4 = { 11 key: 1, 12 class: "card-content" 13}; 14const _hoisted_4$3 = { 15 key: 2, 16 class: "card-footer" 17}; 18const _sfc_main$8 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 19 __name: "Card", 20 setup(__props) { 21 return (_ctx, _cache) => { 22 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_1$7, [ 23 _ctx.$slots.header ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_2$5, [ 24 edr_remote_vue_components__loadShare__vue__loadShare__.renderSlot(_ctx.$slots, "header", {}, void 0, true) 25 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 26 _ctx.$slots.content ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_3$4, [ 27 edr_remote_vue_components__loadShare__vue__loadShare__.renderSlot(_ctx.$slots, "content", {}, void 0, true) 28 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 29 _ctx.$slots.footer ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_4$3, [ 30 edr_remote_vue_components__loadShare__vue__loadShare__.renderSlot(_ctx.$slots, "footer", {}, void 0, true) 31 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 32 ]); 33 }; 34 } 35}); 36 37const Card = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-6b5c3135"]]); 38 39const _hoisted_1$6 = { key: 5 }; 40const _sfc_main$7 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 41 __name: "TimelineIcon", 42 props: { 43 color: {}, 44 size: {}, 45 type: {}, 46 zIndex: {}, 47 count: {}, 48 textColor: {} 49 }, 50 setup(__props) { 51 return (_ctx, _cache) => { 52 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("svg", { 53 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ width: __props.size, height: __props.size, zIndex: __props.zIndex }),
54 viewBox: "0 0 24 24", 55 xmlns: "http://www.w3.org/2000/svg" 56 }, [ 57 __props.type === "start" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 58 key: 0, 59 "fill-rule": "evenodd", 60 "clip-rule": "evenodd", 61 d: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM9.5 8.05738C9.58629 8.05738 9.67111 8.07971 9.74622 8.1222L15.8397 11.5698C16.08 11.7058 16.1646 12.0109 16.0286 12.2512C15.9848 12.3287 15.921 12.3931 15.844 12.4377L9.75052 15.9655C9.51154 16.1038 9.20564 16.0223 9.06729 15.7833C9.02321 15.7072 9 15.6207 9 15.5328V8.55738C9 8.28123 9.22386 8.05738 9.5 8.05738Z", 62 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ fill: __props.color }) 63 }, null, 4)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 64 __props.type === "closed" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 65 key: 1, 66 "fill-rule": "evenodd", 67 "clip-rule": "evenodd", 68 d: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM9.17157 7.75736L12 10.586L14.8284 7.75736C15.219 7.36684 15.8521 7.36684 16.2426 7.75736C16.6332 8.14788 16.6332 8.78105 16.2426 9.17157L13.414 12L16.2426 14.8284C16.6332 15.219 16.6332 15.8521 16.2426 16.2426C15.8521 16.6332 15.219 16.6332 14.8284 16.2426L12 13.414L9.17157 16.2426C8.78105 16.6332 8.14788 16.6332 7.75736 16.2426C7.36684 15.8521 7.36684 15.219 7.75736 14.8284L10.586 12L7.75736 9.17157C7.36684 8.78105 7.36684 8.14788 7.75736 7.75736C8.14788 7.36684 8.78105 7.36684 9.17157 7.75736Z", 69 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ fill: __props.color }) 70 }, null, 4)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 71 ["isolation", "unlock"].includes(__props.type) ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 72 key: 2, 73 "fill-rule": "evenodd", 74 "clip-rule": "evenodd", 75 d: "M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2ZM12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4ZM12 7.26316C13.1627 7.26316 14.1053 8.20572 14.1053 9.36842C14.1053 10.229 13.589 10.9689 12.8492 11.2954L14.1053 16.7368H9.89474L11.1498 11.295C10.4106 10.9683 9.89474 10.2286 9.89474 9.36842C9.89474 8.20572 10.8373 7.26316 12 7.26316Z", 76 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ fill: __props.color }) 77 }, null, 4)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 78 ["remediate", "remediated"].includes(__props.type) ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 79 key: 3, 80 "fill-rule": "evenodd", 81 "clip-rule": "evenodd", 82 d: "M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22ZM12 20C7.58172 20 4 16.4183 4 12C4 7.58172 7.58172 4 12 4C16.4183 4 20 7.58172 20 12C20 16.4183 16.4183 20 12 20ZM11.1835 15.5279L16.4856 10.2417C16.8771 9.85136 16.8777 9.21766 16.4891 8.8253C16.1004 8.43381 15.4679 8.43158 15.0764 8.82031C15.076 8.82069 15.0756 8.82106 15.0753 8.82144L10.8248 13.0555L9.4189 11.6496C9.02837 11.259 8.39521 11.259 8.00468 11.6496C7.61416 12.0401 7.61416 12.6733 8.00468 13.0638L10.4683 15.5274C10.6657 15.7248 10.9857 15.725 11.1835 15.5279Z", 83 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ fill: __props.color }) 84 }, null, 4)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 85 __props.type === "opened" ? (edr_remote_vue_components__loadShare__vue__loadShare__.o
85penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 86 key: 4, 87 d: "M11.5 2C11.7761 2 12 2.22386 12 2.5V4.29289C16.97 4.29289 21 8.32289 21 13.2929C21 18.2629 16.97 22.2929 12 22.2929C7.03 22.2929 3 18.2629 3 13.2929C3 10.8029 4.01 8.56289 5.64 6.93289L7.06 8.35289C5.79 9.61289 5 11.3629 5 13.2929C5 17.1629 8.13 20.2929 12 20.2929C15.87 20.2929 19 17.1629 19 13.2929C19 9.42289 15.87 6.29289 12 6.29289V8.08579C12 8.2184 11.9473 8.34557 11.8536 8.43934C11.6583 8.6346 11.3417 8.6346 11.1464 8.43934L8.35355 5.64645C8.15829 5.45118 8.15829 5.1346 8.35355 4.93934L11.1464 2.14645C11.2402 2.05268 11.3674 2 11.5 2ZM13 9.29289V11.371L14.703 10.1794L15.8502 11.8177L13.743 13.293L15.8502 14.768L14.703 16.4064L13 15.214V17.2929H11V15.213L9.29697 16.4064L8.14982 14.768L10.256 13.293L8.14982 11.8177L9.29697 10.1794L11 11.372V9.29289H13Z", 88 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ fill: __props.color }) 89 }, null, 4)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 90 __props.type === "counter" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("g", _hoisted_1$6, [ 91 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("circle", { 92 cx: "12", 93 cy: "12", 94 r: "10", 95 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ fill: __props.color }) 96 }, null, 4), 97 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("text", { 98 x: "12", 99 y: "12", 100 "text-anchor": "middle", 101 "dominant-baseline": "central", 102 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle({ 103 fill: __props.textColor, 104 fontSize: __props.count && __props.count > 99 ? "10px" : "12px", 105 fontWeight: "Medium", 106 fontFamily: "sans-serif" 107 }) 108 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(__props.count), 5) 109 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 110 ], 4); 111 }; 112 } 113}); 114 115const _hoisted_1$5 = { class: "timeline-card-container" }; 116const _hoisted_2$4 = { class: "pre-header" }; 117const _hoisted_3$3 = { 118 key: 3, 119 class: "timeline-item-line" 120}; 121const _hoisted_4$2 = { class: "header" }; 122const _hoisted_5$1 = { key: 0 }; 123const _hoisted_6$1 = { key: 1 }; 124const _hoisted_7$1 = { class: "content" }; 125const _hoisted_8$1 = ["title"]; 126const _hoisted_9$1 = ["title"]; 127const _hoisted_10$1 = { key: 2 }; 128const _hoisted_11$1 = { 129 key: 0, 130 class: "ellipsis no-word-wrap" 131}; 132const _hoisted_12$1 = { 133 key: 1, 134 class: "ellipsis no-word-wrap capitalize" 135}; 136const _hoisted_13$1 = { 137 key: 2, 138 class: "ellipsis no-word-wrap" 139}; 140const _sfc_main$6 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 141 __name: "TimelineCard", 142 props: { 143 info: {}, 144 lastCard: { type: Boolean }, 145 osType: {} 146 }, 147 setup(__props) { 148 const props = __props; 149 const friendlySeverity = { 150 0: "Information", 151 1: "Low", 152 2: "Medium", 153 3: "High", 154 4: "Critical" 155 }; 156 const details = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "details" in props.info ? props.info.details : void 0); 157 const instances = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "instances" in props.info ? props.info.instances : []); 158 const instancesCount = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "instances_count" in props.info ? props.info.instances_count : 0); 159 const itemType = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => props.info.item_type); 160 const mode = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "mode" in props.info ? props.info.mode : void 0); 161 const path = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "path" in props.info ? props.info.path : void 0); 162 const ruleSeverity = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "rule_severity" in props.info ? props.info.rule_severity : void 0); 163 const ruleTag = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "rule_tag" in props.info ? props.info.rule_tag : void 0); 164 const startDate = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "start_date" in props.info ? props.info.start_date : void 0); 165 const timestamp = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "timestamp" in props.info ? props.info.timestamp : void 0); 166 const type = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "type" in props.info ? props.info.type : void 0); 167 const user = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "user" in props.info ? props.info.user : void 0); 168 const sortedInstances = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 169 if (!instances.value) return []; 170 return instances.value.map((instance) => instance.tactic_name).sort((a, b) => b.localeCompare(a)); 171 }); 172 const severity = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 173 if (ruleSeverity.value === void 0) return void 0; 174 return friendlySeverity[ruleSeverity.value]?.toLowerCase() || "low"; 175 }); 176 const actionType = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 177 return type.value?.split("_").pop()?.toLowerCase(); 178 }); 179 const actionIcon = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 180 switch (actionType.value) { 181 case "opened": 182 return "opened"; 183 case "closed": 184 return "closed"; 185 case "isolation": 186 return "isolation"; 187 case "unlock": 188 return "unlock"; 189 case "remediated": 190 case "remediate": 191 return "remediated"; 192 default: 193 return "none"; 194 } 195 }); 196 const actionTypeText = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 197 switch (actionType.value) { 198 case "opened": 199 return "Reopened"; 200 case "closed": 201 return "Closed"; 202 case "isolation":
203 if (!details.value?.desktop && !details.value?.network && !details.value?.process) { 204 return "Deisolation"; 205 } 206 return "Isolation"; 207 case "unlock": 208 return "Deisolation"; 209 case "remediated": 210 case "remediate": 211 return "Remediated"; 212 default: 213 return actionType.value; 214 } 215 }); 216 const processName = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 217 if (!path.value) return void 0; 218 if (props.osType?.toLowerCase() !== "windows") { 219 return path.value.split("/").pop(); 220 } 221 return path.value.split("\\").pop(); 222 }); 223 return (_ctx, _cache) => { 224 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_1$5, [ 225 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(Card, null, { 226 header: edr_remote_vue_components__loadShare__vue__loadShare__.withCtx(() => [ 227 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_2$4, [ 228 itemType.value === "info" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createBlock(_sfc_main$7, { 229 key: 0, 230 "z-index": 900, 231 class: "timeline-icon-wrapper", 232 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle(`margin-right:${props.lastCard ? "10px" : "0px"}`), 233 color: "var(--edr-module-timeline-icon-text-color)", 234 size: "var(--edr-module-timeline-icon-text-size)", 235 type: "start" 236 }, null, 8, ["style"])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 237 itemType.value === "detection" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createBlock(_sfc_main$7, { 238 key: 1, 239 "z-index": 900, 240 class: "timeline-icon-wrapper", 241 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle(`margin-right:${props.lastCard ? "10px" : "0px"}`), 242 color: `var(--edr-module-timeline-${severity.value}-background-color)`, 243 size: "var(--edr-module-timeline-icon-text-size)", 244 "text-color": `var(--edr-module-timeline-${severity.value}-text-color)`, 245 count: instancesCount.value, 246 type: "counter" 247 }, null, 8, ["style", "color", "text-color", "count"])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 248 itemType.value === "action" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createBlock(_sfc_main$7, { 249 key: 2, 250 "z-index": 900, 251 class: "timeline-icon-wrapper", 252 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle(`margin-right:${props.lastCard ? "10px" : "0px"}`), 253 color: "var(--edr-module-timeline-icon-text-color)", 254 size: "var(--edr-module-timeline-icon-text-size)", 255 type: actionIcon.value 256 }, null, 8, ["style", "type"])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 257 !props.lastCard ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_3$3)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 258 ]), 259 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_4$2, [ 260 itemType.value === "info" || itemType.value === "action" ? (edr_remote_vue_components__loadShare__vue__loadShare__.o
260penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_5$1, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(formatDateTime)(timestamp.value, "datetime")), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 261 itemType.value === "detection" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_6$1, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(formatDateTime)(startDate.value, "datetime")), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 262 ]) 263 ]), 264 content: edr_remote_vue_components__loadShare__vue__loadShare__.withCtx(() => [ 265 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_7$1, [ 266 itemType.value === "info" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 267 key: 0, 268 class: "ellipsis no-word-wrap", 269 title: user.value 270 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(user.value?.toUpperCase() || "--"), 9, _hoisted_8$1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 271 itemType.value === "detection" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 272 key: 1, 273 class: "no-word-wrap", 274 title: sortedInstances.value.join(", ") 275 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(sortedInstances.value[0]) + " " + edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(instances.value.length > 1 ? `+${instances.value.length - 1}` : ""), 9, _hoisted_9$1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 276 itemType.value === "action" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_10$1, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(actionTypeText.value), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 277 ]) 278 ]), 279 footer: edr_remote_vue_components__loadShare__vue__loadShare__.withCtx(() => [ 280 itemType.value === "info" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_11$1, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(processName.value || "--"), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 281 itemType.value === "detection" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_12$1, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(ruleTag.value), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 282 itemType.value === "action" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_13$1, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(`${type.value === "isolation" || type.value === "unlock" ? mode.value : "-"}`), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 283 ]), 284 _: 1 285 }) 286 ]); 287 }; 288 } 289}); 290 291const TimelineCard = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-8cb4355b"]]); 292 293/** 294 * Custom positioning reference element. 295 * @see https://floating-ui.com/docs/virtual-elements 296 */ 297 298const min = Math.min; 299const max = Math.max; 300const round = Math.round; 301const floor = Math.floor; 302const createCoords = v => ({ 303 x: v, 304 y: v 305}); 306const oppositeSideMap = { 307 left: 'right', 308 right: 'left', 309 bottom: 'top', 310 top: 'bottom' 311}; 312const oppositeAlignmentMap = { 313 start: 'end', 314 end: 'start' 315}; 316function clamp(start, value, end) { 317 return max(start, min(value, end)); 318} 319function evaluate(value, param) { 320 return typeof value === 'function' ? value(param) : value; 321} 322function getSide(placement) { 323 return placement.split('-')[0]; 324} 325function getAlignment(placement) { 326 return placement.split('-')[1]; 327} 328function getOppositeAxis(axis) { 329 return axis === 'x' ? 'y' : 'x'; 330} 331function getAxisLength(axis) { 332 return axis === 'y' ? 'height' : 'width'; 333} 334const yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']); 335function getSideAxis(placement) { 336 return yAxisSides.has(getSide(placement)) ? 'y' : 'x'; 337} 338function getAlignmentAxis(placement) { 339 return getOppositeAxis(getSideAxis(placement)); 340} 341function getAlignmentSides(placement, rects, rtl) { 342 if (rtl === void 0) { 343 rtl = false;
vendor: 8,700 bytes, lines 344-645
344 } 345 const alignment = getAlignment(placement); 346 const alignmentAxis = getAlignmentAxis(placement); 347 const length = getAxisLength(alignmentAxis); 348 let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top'; 349 if (rects.reference[length] > rects.floating[length]) { 350 mainAlignmentSide = getOppositePlacement(mainAlignmentSide); 351 } 352 return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; 353} 354function getExpandedPlacements(placement) { 355 const oppositePlacement = getOppositePlacement(placement); 356 return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; 357} 358function getOppositeAlignmentPlacement(placement) { 359 return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]); 360} 361const lrPlacement = ['left', 'right']; 362const rlPlacement = ['right', 'left']; 363const tbPlacement = ['top', 'bottom']; 364const btPlacement = ['bottom', 'top']; 365function getSideList(side, isStart, rtl) { 366 switch (side) { 367 case 'top': 368 case 'bottom': 369 if (rtl) return isStart ? rlPlacement : lrPlacement; 370 return isStart ? lrPlacement : rlPlacement; 371 case 'left': 372 case 'right': 373 return isStart ? tbPlacement : btPlacement; 374 default: 375 return []; 376 } 377} 378function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { 379 const alignment = getAlignment(placement); 380 let list = getSideList(getSide(placement), direction === 'start', rtl); 381 if (alignment) { 382 list = list.map(side => side + "-" + alignment); 383 if (flipAlignment) { 384 list = list.concat(list.map(getOppositeAlignmentPlacement)); 385 } 386 } 387 return list; 388} 389function getOppositePlacement(placement) { 390 return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]); 391} 392function expandPaddingObject(padding) { 393 return { 394 top: 0, 395 right: 0, 396 bottom: 0, 397 left: 0, 398 ...padding 399 }; 400} 401function getPaddingObject(padding) { 402 return typeof padding !== 'number' ? expandPaddingObject(padding) : { 403 top: padding, 404 right: padding, 405 bottom: padding, 406 left: padding 407 }; 408} 409function rectToClientRect(rect) { 410 const { 411 x, 412 y, 413 width, 414 height 415 } = rect; 416 return { 417 width, 418 height, 419 top: y, 420 left: x, 421 right: x + width, 422 bottom: y + height, 423 x, 424 y 425 }; 426} 427 428function computeCoordsFromPlacement(_ref, placement, rtl) { 429 let { 430 reference, 431 floating 432 } = _ref; 433 const sideAxis = getSideAxis(placement); 434 const alignmentAxis = getAlignmentAxis(placement); 435 const alignLength = getAxisLength(alignmentAxis); 436 const side = getSide(placement); 437 const isVertical = sideAxis === 'y'; 438 const commonX = reference.x + reference.width / 2 - floating.width / 2; 439 const commonY = reference.y + reference.height / 2 - floating.height / 2; 440 const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; 441 let coords; 442 switch (side) { 443 case 'top': 444 coords = { 445 x: commonX, 446 y: reference.y - floating.height 447 }; 448 break; 449 case 'bottom': 450 coords = { 451 x: commonX, 452 y: reference.y + reference.height 453 }; 454 break; 455 case 'right': 456 coords = { 457 x: reference.x + reference.width, 458 y: commonY 459 }; 460 break; 461 case 'left': 462 coords = { 463 x: reference.x - floating.width, 464 y: commonY 465 }; 466 break; 467 default: 468 coords = { 469 x: reference.x, 470 y: reference.y 471 }; 472 } 473 switch (getAlignment(placement)) { 474 case 'start': 475 coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); 476 break; 477 case 'end': 478 coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); 479 break; 480 } 481 return coords; 482} 483 484/** 485 * Computes the `x` and `y` coordinates that will place the floating element 486 * next to a given reference element. 487 * 488 * This export does not have any `platform` interface logic. You will need to 489 * write one for the platform you are using Floating UI with. 490 */ 491const computePosition$1 = async (reference, floating, config) => { 492 const { 493 placement = 'bottom', 494 strategy = 'absolute', 495 middleware = [], 496 platform 497 } = config; 498 const validMiddleware = middleware.filter(Boolean); 499 const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating)); 500 let rects = await platform.getElementRects({ 501 reference, 502 floating, 503 strategy 504 }); 505 let { 506 x, 507 y 508 } = computeCoordsFromPlacement(rects, placement, rtl); 509 let statefulPlacement = placement; 510 let middlewareData = {}; 511 let resetCount = 0; 512 for (let i = 0; i < validMiddleware.length; i++) { 513 const { 514 name, 515 fn 516 } = validMiddleware[i]; 517 const { 518 x: nextX, 519 y: nextY, 520 data, 521 reset 522 } = await fn({ 523 x, 524 y, 525 initialPlacement: placement, 526 placement: statefulPlacement, 527 strategy, 528 middlewareData, 529 rects, 530 platform, 531 elements: { 532 reference, 533 floating 534 } 535 }); 536 x = nextX != null ? nextX : x; 537 y = nextY != null ? nextY : y; 538 middlewareData = { 539 ...middlewareData, 540 [name]: { 541 ...middlewareData[name], 542 ...data 543 } 544 }; 545 if (reset && resetCount <= 50) { 546 resetCount++; 547 if (typeof reset === 'object') { 548 if (reset.placement) { 549 statefulPlacement = reset.placement; 550 } 551 if (reset.rects) { 552 rects = reset.rects === true ? await platform.getElementRects({ 553 reference, 554 floating, 555 strategy 556 }) : reset.rects; 557 } 558 ({ 559 x, 560 y 561 } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); 562 } 563 i = -1; 564 } 565 } 566 return { 567 x, 568 y, 569 placement: statefulPlacement, 570 strategy, 571 middlewareData 572 }; 573}; 574 575/** 576 * Resolves with an object of overflow side offsets that determine how much the 577 * element is overflowing a given clipping boundary on each side. 578 * - positive = overflowing the boundary by that number of pixels 579 * - negative = how many pixels left before it will overflow 580 * - 0 = lies flush with the boundary 581 * @see https://floating-ui.com/docs/detectOverflow 582 */ 583async function detectOverflow(state, options) { 584 var _await$platform$isEle; 585 if (options === void 0) { 586 options = {}; 587 } 588 const { 589 x, 590 y, 591 platform, 592 rects, 593 elements, 594 strategy 595 } = state; 596 const { 597 boundary = 'clippingAncestors', 598 rootBoundary = 'viewport', 599 elementContext = 'floating', 600 altBoundary = false, 601 padding = 0 602 } = evaluate(options, state); 603 const paddingObject = getPaddingObject(padding); 604 const altContext = elementContext === 'floating' ? 'reference' : 'floating'; 605 const element = elements[altBoundary ? altContext : elementContext]; 606 const clippingClientRect = rectToClientRect(await platform.getClippingRect({ 607 element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))), 608 boundary, 609 rootBoundary, 610 strategy 611 })); 612 const rect = elementContext === 'floating' ? { 613 x, 614 y, 615 width: rects.floating.width, 616 height: rects.floating.height 617 } : rects.reference; 618 const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)); 619 const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || { 620 x: 1, 621 y: 1 622 } : { 623 x: 1, 624 y: 1 625 }; 626 const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({ 627 elements, 628 rect, 629 offsetParent, 630 strategy 631 }) : rect); 632 return { 633 top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, 634 bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, 635 left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, 636 right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x 637 }; 638} 639 640/** 641 * Provides data to position an inner element of the floating element so that it 642 * appears centered to the reference element. 643 * @see https://floating-ui.com/docs/arrow 644 */ 645const arrow$2
vendor: 19,998 bytes, lines 645-1199
645 = options => ({ 646 name: 'arrow', 647 options, 648 async fn(state) { 649 const { 650 x, 651 y, 652 placement, 653 rects, 654 platform, 655 elements, 656 middlewareData 657 } = state; 658 // Since `element` is required, we don't Partial<> the type. 659 const { 660 element, 661 padding = 0 662 } = evaluate(options, state) || {}; 663 if (element == null) { 664 return {}; 665 } 666 const paddingObject = getPaddingObject(padding); 667 const coords = { 668 x, 669 y 670 }; 671 const axis = getAlignmentAxis(placement); 672 const length = getAxisLength(axis); 673 const arrowDimensions = await platform.getDimensions(element); 674 const isYAxis = axis === 'y'; 675 const minProp = isYAxis ? 'top' : 'left'; 676 const maxProp = isYAxis ? 'bottom' : 'right'; 677 const clientProp = isYAxis ? 'clientHeight' : 'clientWidth'; 678 const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; 679 const startDiff = coords[axis] - rects.reference[axis]; 680 const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element)); 681 let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; 682 683 // DOM platform can return `window` as the `offsetParent`. 684 if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) { 685 clientSize = elements.floating[clientProp] || rects.floating[length]; 686 } 687 const centerToReference = endDiff / 2 - startDiff / 2; 688 689 // If the padding is large enough that it causes the arrow to no longer be 690 // centered, modify the padding so that it is centered. 691 const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; 692 const minPadding = min(paddingObject[minProp], largestPossiblePadding); 693 const maxPadding = min(paddingObject[maxProp], largestPossiblePadding); 694 695 // Make sure the arrow doesn't overflow the floating element if the center 696 // point is outside the floating element's bounds. 697 const min$1 = minPadding; 698 const max = clientSize - arrowDimensions[length] - maxPadding; 699 const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; 700 const offset = clamp(min$1, center, max); 701 702 // If the reference is small enough that the arrow's padding causes it to 703 // to point to nothing for an aligned placement, adjust the offset of the 704 // floating element itself. To ensure `shift()` continues to take action, 705 // a single reset is performed when this is true. 706 const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; 707 const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0; 708 return { 709 [axis]: coords[axis] + alignmentOffset, 710 data: { 711 [axis]: offset, 712 centerOffset: center - offset - alignmentOffset, 713 ...(shouldAddOffset && { 714 alignmentOffset 715 }) 716 }, 717 reset: shouldAddOffset 718 }; 719 } 720}); 721 722/** 723 * Optimizes the visibility of the floating element by flipping the `placement` 724 * in order to keep it in view when the preferred placement(s) will overflow the 725 * clipping boundary. Alternative to `autoPlacement`. 726 * @see https://floating-ui.com/docs/flip 727 */ 728const flip$1 = function (options) { 729 if (options === void 0) { 730 options = {}; 731 } 732 return { 733 name: 'flip', 734 options, 735 async fn(state) { 736 var _middlewareData$arrow, _middlewareData$flip; 737 const { 738 placement, 739 middlewareData, 740 rects, 741 initialPlacement, 742 platform, 743 elements 744 } = state; 745 const { 746 mainAxis: checkMainAxis = true, 747 crossAxis: checkCrossAxis = true, 748 fallbackPlacements: specifiedFallbackPlacements, 749 fallbackStrategy = 'bestFit', 750 fallbackAxisSideDirection = 'none', 751 flipAlignment = true, 752 ...detectOverflowOptions 753 } = evaluate(options, state); 754 755 // If a reset by the arrow was caused due to an alignment offset being 756 // added, we should skip any logic now since `flip()` has already done its 757 // work. 758 // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643 759 if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { 760 return {}; 761 } 762 const side = getSide(placement); 763 const initialSideAxis = getSideAxis(initialPlacement); 764 const isBasePlacement = getSide(initialPlacement) === initialPlacement; 765 const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); 766 const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); 767 const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none'; 768 if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { 769 fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); 770 } 771 const placements = [initialPlacement, ...fallbackPlacements]; 772 const overflow = await detectOverflow(state, detectOverflowOptions); 773 const overflows = []; 774 let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; 775 if (checkMainAxis) { 776 overflows.push(overflow[side]); 777 } 778 if (checkCrossAxis) { 779 const sides = getAlignmentSides(placement, rects, rtl); 780 overflows.push(overflow[sides[0]], overflow[sides[1]]); 781 } 782 overflowsData = [...overflowsData, { 783 placement, 784 overflows 785 }]; 786 787 // One or more sides is overflowing. 788 if (!overflows.every(side => side <= 0)) { 789 var _middlewareData$flip2, _overflowsData$filter; 790 const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; 791 const nextPlacement = placements[nextIndex]; 792 if (nextPlacement) { 793 const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false; 794 if (!ignoreCrossAxisOverflow || 795 // We leave the current main axis only if every placement on that axis 796 // overflows the main axis. 797 overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) { 798 // Try next placement and re-run the lifecycle. 799 return { 800 data: { 801 index: nextIndex, 802 overflows: overflowsData 803 }, 804 reset: { 805 placement: nextPlacement 806 } 807 }; 808 } 809 } 810 811 // First, find the candidates that fit on the mainAxis side of overflow, 812 // then find the placement that fits the best on the main crossAxis side. 813 let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; 814 815 // Otherwise fallback. 816 if (!resetPlacement) { 817 switch (fallbackStrategy) { 818 case 'bestFit': 819 { 820 var _overflowsData$filter2; 821 const placement = (_overflowsData$filter2 = overflowsData.filter(d => { 822 if (hasFallbackAxisSideDirection) { 823 const currentSideAxis = getSideAxis(d.placement); 824 return currentSideAxis === initialSideAxis || 825 // Create a bias to the `y` side axis due to horizontal 826 // reading directions favoring greater width. 827 currentSideAxis === 'y'; 828 } 829 return true; 830 }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; 831 if (placement) { 832 resetPlacement = placement; 833 } 834 break; 835 } 836 case 'initialPlacement': 837 resetPlacement = initialPlacement; 838 break; 839 } 840 } 841 if (placement !== resetPlacement) { 842 return { 843 reset: { 844 placement: resetPlacement 845 } 846 }; 847 } 848 } 849 return {}; 850 } 851 }; 852}; 853 854const originSides = /*#__PURE__*/new Set(['left', 'top']); 855 856// For type backwards-compatibility, the `OffsetOptions` type was also 857// Derivable. 858 859async function convertValueToCoords(state, options) { 860 const { 861 placement, 862 platform, 863 elements 864 } = state; 865 const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); 866 const side = getSide(placement); 867 const alignment = getAlignment(placement); 868 const isVertical = getSideAxis(placement) === 'y'; 869 const mainAxisMulti = originSides.has(side) ? -1 : 1; 870 const crossAxisMulti = rtl && isVertical ? -1 : 1; 871 const rawValue = evaluate(options, state); 872 873 // eslint-disable-next-line prefer-const 874 let { 875 mainAxis, 876 crossAxis, 877 alignmentAxis 878 } = typeof rawValue === 'number' ? { 879 mainAxis: rawValue, 880 crossAxis: 0, 881 alignmentAxis: null 882 } : { 883 mainAxis: rawValue.mainAxis || 0, 884 crossAxis: rawValue.crossAxis || 0, 885 alignmentAxis: rawValue.alignmentAxis 886 }; 887 if (alignment && typeof alignmentAxis === 'number') { 888 crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis; 889 } 890 return isVertical ? { 891 x: crossAxis * crossAxisMulti, 892 y: mainAxis * mainAxisMulti 893 } : { 894 x: mainAxis * mainAxisMulti, 895 y: crossAxis * crossAxisMulti 896 }; 897} 898 899/** 900 * Modifies the placement by translating the floating element along the 901 * specified axes. 902 * A number (shorthand for `mainAxis` or distance), or an axes configuration 903 * object may be passed. 904 * @see https://floating-ui.com/docs/offset 905 */ 906const offset$1 = function (options) { 907 if (options === void 0) { 908 options = 0; 909 } 910 return { 911 name: 'offset', 912 options, 913 async fn(state) { 914 var _middlewareData$offse, _middlewareData$arrow; 915 const { 916 x, 917 y, 918 placement, 919 middlewareData 920 } = state; 921 const diffCoords = await convertValueToCoords(state, options); 922 923 // If the placement is the same and the arrow caused an alignment offset 924 // then we don't need to change the positioning coordinates. 925 if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { 926 return {}; 927 } 928 return { 929 x: x + diffCoords.x, 930 y: y + diffCoords.y, 931 data: { 932 ...diffCoords, 933 placement 934 } 935 }; 936 } 937 }; 938}; 939 940/** 941 * Optimizes the visibility of the floating element by shifting it in order to 942 * keep it in view when it will overflow the clipping boundary. 943 * @see https://floating-ui.com/docs/shift 944 */ 945const shift$1 = function (options) { 946 if (options === void 0) { 947 options = {}; 948 } 949 return { 950 name: 'shift', 951 options, 952 async fn(state) { 953 const { 954 x, 955 y, 956 placement 957 } = state; 958 const { 959 mainAxis: checkMainAxis = true, 960 crossAxis: checkCrossAxis = false, 961 limiter = { 962 fn: _ref => { 963 let { 964 x, 965 y 966 } = _ref; 967 return { 968 x, 969 y 970 }; 971 } 972 }, 973 ...detectOverflowOptions 974 } = evaluate(options, state); 975 const coords = { 976 x, 977 y 978 }; 979 const overflow = await detectOverflow(state, detectOverflowOptions); 980 const crossAxis = getSideAxis(getSide(placement)); 981 const mainAxis = getOppositeAxis(crossAxis); 982 let mainAxisCoord = coords[mainAxis]; 983 let crossAxisCoord = coords[crossAxis]; 984 if (checkMainAxis) { 985 const minSide = mainAxis === 'y' ? 'top' : 'left'; 986 const maxSide = mainAxis === 'y' ? 'bottom' : 'right'; 987 const min = mainAxisCoord + overflow[minSide]; 988 const max = mainAxisCoord - overflow[maxSide]; 989 mainAxisCoord = clamp(min, mainAxisCoord, max); 990 } 991 if (checkCrossAxis) { 992 const minSide = crossAxis === 'y' ? 'top' : 'left'; 993 const maxSide = crossAxis === 'y' ? 'bottom' : 'right'; 994 const min = crossAxisCoord + overflow[minSide]; 995 const max = crossAxisCoord - overflow[maxSide]; 996 crossAxisCoord = clamp(min, crossAxisCoord, max); 997 } 998 const limitedCoords = limiter.fn({ 999 ...state, 1000 [mainAxis]: mainAxisCoord, 1001 [crossAxis]: crossAxisCoord 1002 }); 1003 return { 1004 ...limitedCoords, 1005 data: { 1006 x: limitedCoords.x - x, 1007 y: limitedCoords.y - y, 1008 enabled: { 1009 [mainAxis]: checkMainAxis, 1010 [crossAxis]: checkCrossAxis 1011 } 1012 } 1013 }; 1014 } 1015 }; 1016}; 1017 1018function hasWindow() { 1019 return typeof window !== 'undefined'; 1020} 1021function getNodeName(node) { 1022 if (isNode(node)) { 1023 return (node.nodeName || '').toLowerCase(); 1024 } 1025 // Mocked nodes in testing environments may not be instances of Node. By 1026 // returning `#document` an infinite loop won't occur. 1027 // https://github.com/floating-ui/floating-ui/issues/2317 1028 return '#document'; 1029} 1030function getWindow(node) { 1031 var _node$ownerDocument; 1032 return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; 1033} 1034function getDocumentElement(node) { 1035 var _ref; 1036 return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; 1037} 1038function isNode(value) { 1039 if (!hasWindow()) { 1040 return false; 1041 } 1042 return value instanceof Node || value instanceof getWindow(value).Node; 1043} 1044function isElement(value) { 1045 if (!hasWindow()) { 1046 return false; 1047 } 1048 return value instanceof Element || value instanceof getWindow(value).Element; 1049} 1050function isHTMLElement(value) { 1051 if (!hasWindow()) { 1052 return false; 1053 } 1054 return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; 1055} 1056function isShadowRoot(value) { 1057 if (!hasWindow() || typeof ShadowRoot === 'undefined') { 1058 return false; 1059 } 1060 return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; 1061} 1062const invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']); 1063function isOverflowElement(element) { 1064 const { 1065 overflow, 1066 overflowX, 1067 overflowY, 1068 display 1069 } = getComputedStyle$1(element); 1070 return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display); 1071} 1072const tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']); 1073function isTableElement(element) { 1074 return tableElements.has(getNodeName(element)); 1075} 1076const topLayerSelectors = [':popover-open', ':modal']; 1077function isTopLayer(element) { 1078 return topLayerSelectors.some(selector => { 1079 try { 1080 return element.matches(selector); 1081 } catch (_e) { 1082 return false; 1083 } 1084 }); 1085} 1086const transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective']; 1087const willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter']; 1088const containValues = ['paint', 'layout', 'strict', 'content']; 1089function isContainingBlock(elementOrCss) { 1090 const webkit = isWebKit(); 1091 const css = isElement(elementOrCss) ? getComputedStyle$1(elementOrCss) : elementOrCss; 1092 1093 // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block 1094 // https://drafts.csswg.org/css-transforms-2/#individual-transforms 1095 return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value)); 1096} 1097function getContainingBlock(element) { 1098 let currentNode = getParentNode(element); 1099 while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { 1100 if (isContainingBlock(currentNode)) { 1101 return currentNode; 1102 } else if (isTopLayer(currentNode)) { 1103 return null; 1104 } 1105 currentNode = getParentNode(currentNode); 1106 } 1107 return null; 1108} 1109function isWebKit() { 1110 if (typeof CSS === 'undefined' || !CSS.supports) return false; 1111 return CSS.supports('-webkit-backdrop-filter', 'none'); 1112} 1113const lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']); 1114function isLastTraversableNode(node) { 1115 return lastTraversableNodeNames.has(getNodeName(node)); 1116} 1117function getComputedStyle$1(element) { 1118 return getWindow(element).getComputedStyle(element); 1119} 1120function getNodeScroll(element) { 1121 if (isElement(element)) { 1122 return { 1123 scrollLeft: element.scrollLeft, 1124 scrollTop: element.scrollTop 1125 }; 1126 } 1127 return { 1128 scrollLeft: element.scrollX, 1129 scrollTop: element.scrollY 1130 }; 1131} 1132function getParentNode(node) { 1133 if (getNodeName(node) === 'html') { 1134 return node; 1135 } 1136 const result = 1137 // Step into the shadow DOM of the parent of a slotted node. 1138 node.assignedSlot || 1139 // DOM Element detected. 1140 node.parentNode || 1141 // ShadowRoot detected. 1142 isShadowRoot(node) && node.host || 1143 // Fallback. 1144 getDocumentElement(node); 1145 return isShadowRoot(result) ? result.host : result; 1146} 1147function getNearestOverflowAncestor(node) { 1148 const parentNode = getParentNode(node); 1149 if (isLastTraversableNode(parentNode)) { 1150 return node.ownerDocument ? node.ownerDocument.body : node.body; 1151 } 1152 if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { 1153 return parentNode; 1154 } 1155 return getNearestOverflowAncestor(parentNode); 1156} 1157function getOverflowAncestors(node, list, traverseIframes) { 1158 var _node$ownerDocument2; 1159 if (list === void 0) { 1160 list = []; 1161 } 1162 if (traverseIframes === void 0) { 1163 traverseIframes = true; 1164 } 1165 const scrollableAncestor = getNearestOverflowAncestor(node); 1166 const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); 1167 const win = getWindow(scrollableAncestor); 1168 if (isBody) { 1169 const frameElement = getFrameElement(win); 1170 return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); 1171 } 1172 return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); 1173} 1174function getFrameElement(win) { 1175 return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; 1176} 1177 1178function getCssDimensions(element) { 1179 const css = getComputedStyle$1(element); 1180 // In testing environments, the `width` and `height` properties are empty 1181 // strings for SVG elements, returning NaN. Fallback to `0` in this case. 1182 let width = parseFloat(css.width) || 0; 1183 let height = parseFloat(css.height) || 0; 1184 const hasOffset = isHTMLElement(element); 1185 const offsetWidth = hasOffset ? element.offsetWidth : width; 1186 const offsetHeight = hasOffset ? element.offsetHeight : height; 1187 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; 1188 if (shouldFallback) { 1189 width = offsetWidth; 1190 height = offsetHeight; 1191 } 1192 return { 1193 width, 1194 height, 1195 $: shouldFallback 1196 }; 1197} 1198 1199function unwrapElement
vendor: 1,504 bytes, lines 1199-1260
1199$1(element) { 1200 return !isElement(element) ? element.contextElement : element; 1201} 1202 1203function getScale(element) { 1204 const domElement = unwrapElement$1(element); 1205 if (!isHTMLElement(domElement)) { 1206 return createCoords(1); 1207 } 1208 const rect = domElement.getBoundingClientRect(); 1209 const { 1210 width, 1211 height, 1212 $ 1213 } = getCssDimensions(domElement); 1214 let x = ($ ? round(rect.width) : rect.width) / width; 1215 let y = ($ ? round(rect.height) : rect.height) / height; 1216 1217 // 0, NaN, or Infinity should always fallback to 1. 1218 1219 if (!x || !Number.isFinite(x)) { 1220 x = 1; 1221 } 1222 if (!y || !Number.isFinite(y)) { 1223 y = 1; 1224 } 1225 return { 1226 x, 1227 y 1228 }; 1229} 1230 1231const noOffsets = /*#__PURE__*/createCoords(0); 1232function getVisualOffsets(element) { 1233 const win = getWindow(element); 1234 if (!isWebKit() || !win.visualViewport) { 1235 return noOffsets; 1236 } 1237 return { 1238 x: win.visualViewport.offsetLeft, 1239 y: win.visualViewport.offsetTop 1240 }; 1241} 1242function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { 1243 if (isFixed === void 0) { 1244 isFixed = false; 1245 } 1246 if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) { 1247 return false; 1248 } 1249 return isFixed; 1250} 1251 1252function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { 1253 if (includeScale === void 0) { 1254 includeScale = false; 1255 } 1256 if (isFixedStrategy === void 0) { 1257 isFixedStrategy = false; 1258 } 1259 const clientRect = element.getBoundingClientRect(); 1260 const domElement = unwrapElement$1
vendor: 18,971 bytes, lines 1260-1790
1260(element); 1261 let scale = createCoords(1); 1262 if (includeScale) { 1263 if (offsetParent) { 1264 if (isElement(offsetParent)) { 1265 scale = getScale(offsetParent); 1266 } 1267 } else { 1268 scale = getScale(element); 1269 } 1270 } 1271 const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); 1272 let x = (clientRect.left + visualOffsets.x) / scale.x; 1273 let y = (clientRect.top + visualOffsets.y) / scale.y; 1274 let width = clientRect.width / scale.x; 1275 let height = clientRect.height / scale.y; 1276 if (domElement) { 1277 const win = getWindow(domElement); 1278 const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; 1279 let currentWin = win; 1280 let currentIFrame = getFrameElement(currentWin); 1281 while (currentIFrame && offsetParent && offsetWin !== currentWin) { 1282 const iframeScale = getScale(currentIFrame); 1283 const iframeRect = currentIFrame.getBoundingClientRect(); 1284 const css = getComputedStyle$1(currentIFrame); 1285 const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; 1286 const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; 1287 x *= iframeScale.x; 1288 y *= iframeScale.y; 1289 width *= iframeScale.x; 1290 height *= iframeScale.y; 1291 x += left; 1292 y += top; 1293 currentWin = getWindow(currentIFrame); 1294 currentIFrame = getFrameElement(currentWin); 1295 } 1296 } 1297 return rectToClientRect({ 1298 width, 1299 height, 1300 x, 1301 y 1302 }); 1303} 1304 1305// If <html> has a CSS width greater than the viewport, then this will be 1306// incorrect for RTL. 1307function getWindowScrollBarX(element, rect) { 1308 const leftScroll = getNodeScroll(element).scrollLeft; 1309 if (!rect) { 1310 return getBoundingClientRect(getDocumentElement(element)).left + leftScroll; 1311 } 1312 return rect.left + leftScroll; 1313} 1314 1315function getHTMLOffset(documentElement, scroll) { 1316 const htmlRect = documentElement.getBoundingClientRect(); 1317 const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect); 1318 const y = htmlRect.top + scroll.scrollTop; 1319 return { 1320 x, 1321 y 1322 }; 1323} 1324 1325function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { 1326 let { 1327 elements, 1328 rect, 1329 offsetParent, 1330 strategy 1331 } = _ref; 1332 const isFixed = strategy === 'fixed'; 1333 const documentElement = getDocumentElement(offsetParent); 1334 const topLayer = elements ? isTopLayer(elements.floating) : false; 1335 if (offsetParent === documentElement || topLayer && isFixed) { 1336 return rect; 1337 } 1338 let scroll = { 1339 scrollLeft: 0, 1340 scrollTop: 0 1341 }; 1342 let scale = createCoords(1); 1343 const offsets = createCoords(0); 1344 const isOffsetParentAnElement = isHTMLElement(offsetParent); 1345 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 1346 if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { 1347 scroll = getNodeScroll(offsetParent); 1348 } 1349 if (isHTMLElement(offsetParent)) { 1350 const offsetRect = getBoundingClientRect(offsetParent); 1351 scale = getScale(offsetParent); 1352 offsets.x = offsetRect.x + offsetParent.clientLeft; 1353 offsets.y = offsetRect.y + offsetParent.clientTop; 1354 } 1355 } 1356 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); 1357 return { 1358 width: rect.width * scale.x, 1359 height: rect.height * scale.y, 1360 x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, 1361 y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y 1362 }; 1363} 1364 1365function getClientRects(element) { 1366 return Array.from(element.getClientRects()); 1367} 1368 1369// Gets the entire size of the scrollable document area, even extending outside 1370// of the `<html>` and `<body>` rect bounds if horizontally scrollable. 1371function getDocumentRect(element) { 1372 const html = getDocumentElement(element); 1373 const scroll = getNodeScroll(element); 1374 const body = element.ownerDocument.body; 1375 const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); 1376 const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); 1377 let x = -scroll.scrollLeft + getWindowScrollBarX(element); 1378 const y = -scroll.scrollTop; 1379 if (getComputedStyle$1(body).direction === 'rtl') { 1380 x += max(html.clientWidth, body.clientWidth) - width; 1381 } 1382 return { 1383 width, 1384 height, 1385 x, 1386 y 1387 }; 1388} 1389 1390// Safety check: ensure the scrollbar space is reasonable in case this 1391// calculation is affected by unusual styles. 1392// Most scrollbars leave 15-18px of space. 1393const SCROLLBAR_MAX = 25; 1394function getViewportRect(element, strategy) { 1395 const win = getWindow(element); 1396 const html = getDocumentElement(element); 1397 const visualViewport = win.visualViewport; 1398 let width = html.clientWidth; 1399 let height = html.clientHeight; 1400 let x = 0; 1401 let y = 0; 1402 if (visualViewport) { 1403 width = visualViewport.width; 1404 height = visualViewport.height; 1405 const visualViewportBased = isWebKit(); 1406 if (!visualViewportBased || visualViewportBased && strategy === 'fixed') { 1407 x = visualViewport.offsetLeft; 1408 y = visualViewport.offsetTop; 1409 } 1410 } 1411 const windowScrollbarX = getWindowScrollBarX(html); 1412 // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the 1413 // visual width of the <html> but this is not considered in the size 1414 // of `html.clientWidth`. 1415 if (windowScrollbarX <= 0) { 1416 const doc = html.ownerDocument; 1417 const body = doc.body; 1418 const bodyStyles = getComputedStyle(body); 1419 const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; 1420 const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); 1421 if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) { 1422 width -= clippingStableScrollbarWidth; 1423 } 1424 } else if (windowScrollbarX <= SCROLLBAR_MAX) { 1425 // If the <body> scrollbar is on the left, the width needs to be extended 1426 // by the scrollbar amount so there isn't extra space on the right. 1427 width += windowScrollbarX; 1428 } 1429 return { 1430 width, 1431 height, 1432 x, 1433 y 1434 }; 1435} 1436 1437const absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']); 1438// Returns the inner client rect, subtracting scrollbars if present. 1439function getInnerBoundingClientRect(element, strategy) { 1440 const clientRect = getBoundingClientRect(element, true, strategy === 'fixed'); 1441 const top = clientRect.top + element.clientTop; 1442 const left = clientRect.left + element.clientLeft; 1443 const scale = isHTMLElement(element) ? getScale(element) : createCoords(1); 1444 const width = element.clientWidth * scale.x; 1445 const height = element.clientHeight * scale.y; 1446 const x = left * scale.x; 1447 const y = top * scale.y; 1448 return { 1449 width, 1450 height, 1451 x, 1452 y 1453 }; 1454} 1455function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { 1456 let rect; 1457 if (clippingAncestor === 'viewport') { 1458 rect = getViewportRect(element, strategy); 1459 } else if (clippingAncestor === 'document') { 1460 rect = getDocumentRect(getDocumentElement(element)); 1461 } else if (isElement(clippingAncestor)) { 1462 rect = getInnerBoundingClientRect(clippingAncestor, strategy); 1463 } else { 1464 const visualOffsets = getVisualOffsets(element); 1465 rect = { 1466 x: clippingAncestor.x - visualOffsets.x, 1467 y: clippingAncestor.y - visualOffsets.y, 1468 width: clippingAncestor.width, 1469 height: clippingAncestor.height 1470 }; 1471 } 1472 return rectToClientRect(rect); 1473} 1474function hasFixedPositionAncestor(element, stopNode) { 1475 const parentNode = getParentNode(element); 1476 if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { 1477 return false; 1478 } 1479 return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode); 1480} 1481 1482// A "clipping ancestor" is an `overflow` element with the characteristic of 1483// clipping (or hiding) child elements. This returns all clipping ancestors 1484// of the given element up the tree. 1485function getClippingElementAncestors(element, cache) { 1486 const cachedResult = cache.get(element); 1487 if (cachedResult) { 1488 return cachedResult; 1489 } 1490 let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body'); 1491 let currentContainingBlockComputedStyle = null; 1492 const elementIsFixed = getComputedStyle$1(element).position === 'fixed'; 1493 let currentNode = elementIsFixed ? getParentNode(element) : element; 1494 1495 // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block 1496 while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { 1497 const computedStyle = getComputedStyle$1(currentNode); 1498 const currentNodeIsContaining = isContainingBlock(currentNode); 1499 if (!currentNodeIsContaining && computedStyle.position === 'fixed') { 1500 currentContainingBlockComputedStyle = null; 1501 } 1502 const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); 1503 if (shouldDropCurrentNode) { 1504 // Drop non-containing blocks. 1505 result = result.filter(ancestor => ancestor !== currentNode); 1506 } else { 1507 // Record last containing block for next iteration. 1508 currentContainingBlockComputedStyle = computedStyle; 1509 } 1510 currentNode = getParentNode(currentNode); 1511 } 1512 cache.set(element, result); 1513 return result; 1514} 1515 1516// Gets the maximum area that the element is visible in due to any number of 1517// clipping ancestors. 1518function getClippingRect(_ref) { 1519 let { 1520 element, 1521 boundary, 1522 rootBoundary, 1523 strategy 1524 } = _ref; 1525 const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); 1526 const clippingAncestors = [...elementClippingAncestors, rootBoundary]; 1527 const firstClippingAncestor = clippingAncestors[0]; 1528 const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { 1529 const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); 1530 accRect.top = max(rect.top, accRect.top); 1531 accRect.right = min(rect.right, accRect.right); 1532 accRect.bottom = min(rect.bottom, accRect.bottom); 1533 accRect.left = max(rect.left, accRect.left); 1534 return accRect; 1535 }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); 1536 return { 1537 width: clippingRect.right - clippingRect.left, 1538 height: clippingRect.bottom - clippingRect.top, 1539 x: clippingRect.left, 1540 y: clippingRect.top 1541 }; 1542} 1543 1544function getDimensions(element) { 1545 const { 1546 width, 1547 height 1548 } = getCssDimensions(element); 1549 return { 1550 width, 1551 height 1552 }; 1553} 1554 1555function getRectRelativeToOffsetParent(element, offsetParent, strategy) { 1556 const isOffsetParentAnElement = isHTMLElement(offsetParent); 1557 const documentElement = getDocumentElement(offsetParent); 1558 const isFixed = strategy === 'fixed'; 1559 const rect = getBoundingClientRect(element, true, isFixed, offsetParent); 1560 let scroll = { 1561 scrollLeft: 0, 1562 scrollTop: 0 1563 }; 1564 const offsets = createCoords(0); 1565 1566 // If the <body> scrollbar appears on the left (e.g. RTL systems). Use 1567 // Firefox with layout.scrollbar.side = 3 in about:config to test this. 1568 function setLeftRTLScrollbarOffset() { 1569 offsets.x = getWindowScrollBarX(documentElement); 1570 } 1571 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 1572 if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { 1573 scroll = getNodeScroll(offsetParent); 1574 } 1575 if (isOffsetParentAnElement) { 1576 const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); 1577 offsets.x = offsetRect.x + offsetParent.clientLeft; 1578 offsets.y = offsetRect.y + offsetParent.clientTop; 1579 } else if (documentElement) { 1580 setLeftRTLScrollbarOffset(); 1581 } 1582 } 1583 if (isFixed && !isOffsetParentAnElement && documentElement) { 1584 setLeftRTLScrollbarOffset(); 1585 } 1586 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); 1587 const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; 1588 const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; 1589 return { 1590 x, 1591 y, 1592 width: rect.width, 1593 height: rect.height 1594 }; 1595} 1596 1597function isStaticPositioned(element) { 1598 return getComputedStyle$1(element).position === 'static'; 1599} 1600 1601function getTrueOffsetParent(element, polyfill) { 1602 if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') { 1603 return null; 1604 } 1605 if (polyfill) { 1606 return polyfill(element); 1607 } 1608 let rawOffsetParent = element.offsetParent; 1609 1610 // Firefox returns the <html> element as the offsetParent if it's non-static, 1611 // while Chrome and Safari return the <body> element. The <body> element must 1612 // be used to perform the correct calculations even if the <html> element is 1613 // non-static. 1614 if (getDocumentElement(element) === rawOffsetParent) { 1615 rawOffsetParent = rawOffsetParent.ownerDocument.body; 1616 } 1617 return rawOffsetParent; 1618} 1619 1620// Gets the closest ancestor positioned element. Handles some edge cases, 1621// such as table ancestors and cross browser bugs. 1622function getOffsetParent(element, polyfill) { 1623 const win = getWindow(element); 1624 if (isTopLayer(element)) { 1625 return win; 1626 } 1627 if (!isHTMLElement(element)) { 1628 let svgOffsetParent = getParentNode(element); 1629 while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { 1630 if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { 1631 return svgOffsetParent; 1632 } 1633 svgOffsetParent = getParentNode(svgOffsetParent); 1634 } 1635 return win; 1636 } 1637 let offsetParent = getTrueOffsetParent(element, polyfill); 1638 while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) { 1639 offsetParent = getTrueOffsetParent(offsetParent, polyfill); 1640 } 1641 if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { 1642 return win; 1643 } 1644 return offsetParent || getContainingBlock(element) || win; 1645} 1646 1647const getElementRects = async function (data) { 1648 const getOffsetParentFn = this.getOffsetParent || getOffsetParent; 1649 const getDimensionsFn = this.getDimensions; 1650 const floatingDimensions = await getDimensionsFn(data.floating); 1651 return { 1652 reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), 1653 floating: { 1654 x: 0, 1655 y: 0, 1656 width: floatingDimensions.width, 1657 height: floatingDimensions.height 1658 } 1659 }; 1660}; 1661 1662function isRTL(element) { 1663 return getComputedStyle$1(element).direction === 'rtl'; 1664} 1665 1666const platform = { 1667 convertOffsetParentRelativeRectToViewportRelativeRect, 1668 getDocumentElement, 1669 getClippingRect, 1670 getOffsetParent, 1671 getElementRects, 1672 getClientRects, 1673 getDimensions, 1674 getScale, 1675 isElement, 1676 isRTL 1677}; 1678 1679function rectsAreEqual(a, b) { 1680 return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; 1681} 1682 1683// https://samthor.au/2021/observing-dom/ 1684function observeMove(element, onMove) { 1685 let io = null; 1686 let timeoutId; 1687 const root = getDocumentElement(element); 1688 function cleanup() { 1689 var _io; 1690 clearTimeout(timeoutId); 1691 (_io = io) == null || _io.disconnect(); 1692 io = null; 1693 } 1694 function refresh(skip, threshold) { 1695 if (skip === void 0) { 1696 skip = false; 1697 } 1698 if (threshold === void 0) { 1699 threshold = 1; 1700 } 1701 cleanup(); 1702 const elementRectForRootMargin = element.getBoundingClientRect(); 1703 const { 1704 left, 1705 top, 1706 width, 1707 height 1708 } = elementRectForRootMargin; 1709 if (!skip) { 1710 onMove(); 1711 } 1712 if (!width || !height) { 1713 return; 1714 } 1715 const insetTop = floor(top); 1716 const insetRight = floor(root.clientWidth - (left + width)); 1717 const insetBottom = floor(root.clientHeight - (top + height)); 1718 const insetLeft = floor(left); 1719 const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; 1720 const options = { 1721 rootMargin, 1722 threshold: max(0, min(1, threshold)) || 1 1723 }; 1724 let isFirstUpdate = true; 1725 function handleObserve(entries) { 1726 const ratio = entries[0].intersectionRatio; 1727 if (ratio !== threshold) { 1728 if (!isFirstUpdate) { 1729 return refresh(); 1730 } 1731 if (!ratio) { 1732 // If the reference is clipped, the ratio is 0. Throttle the refresh 1733 // to prevent an infinite loop of updates. 1734 timeoutId = setTimeout(() => { 1735 refresh(false, 1e-7); 1736 }, 1000); 1737 } else { 1738 refresh(false, ratio); 1739 } 1740 } 1741 if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { 1742 // It's possible that even though the ratio is reported as 1, the 1743 // element is not actually fully within the IntersectionObserver's root 1744 // area anymore. This can happen under performance constraints. This may 1745 // be a bug in the browser's IntersectionObserver implementation. To 1746 // work around this, we compare the element's bounding rect now with 1747 // what it was at the time we created the IntersectionObserver. If they 1748 // are not equal then the element moved, so we refresh. 1749 refresh(); 1750 } 1751 isFirstUpdate = false; 1752 } 1753 1754 // Older browsers don't support a `document` as the root and will throw an 1755 // error. 1756 try { 1757 io = new IntersectionObserver(handleObserve, { 1758 ...options, 1759 // Handle <iframe>s 1760 root: root.ownerDocument 1761 }); 1762 } catch (_e) { 1763 io = new IntersectionObserver(handleObserve, options); 1764 } 1765 io.observe(element); 1766 } 1767 refresh(true); 1768 return cleanup; 1769} 1770 1771/** 1772 * Automatically updates the position of the floating element when necessary. 1773 * Should only be called when the floating element is mounted on the DOM or 1774 * visible on the screen. 1775 * @returns cleanup function that should be invoked when the floating element is 1776 * removed from the DOM or hidden from the screen. 1777 * @see https://floating-ui.com/docs/autoUpdate 1778 */ 1779function autoUpdate(reference, floating, update, options) { 1780 if (options === void 0) { 1781 options = {}; 1782 } 1783 const { 1784 ancestorScroll = true, 1785 ancestorResize = true, 1786 elementResize = typeof ResizeObserver === 'function', 1787 layoutShift = typeof IntersectionObserver === 'function', 1788 animationFrame = false 1789 } = options; 1790 const referenceEl = unwrapElement
vendor: 1,727 bytes, lines 1790-1836
1790$1(reference); 1791 const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : []; 1792 ancestors.forEach(ancestor => { 1793 ancestorScroll && ancestor.addEventListener('scroll', update, { 1794 passive: true 1795 }); 1796 ancestorResize && ancestor.addEventListener('resize', update); 1797 }); 1798 const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null; 1799 let reobserveFrame = -1; 1800 let resizeObserver = null; 1801 if (elementResize) { 1802 resizeObserver = new ResizeObserver(_ref => { 1803 let [firstEntry] = _ref; 1804 if (firstEntry && firstEntry.target === referenceEl && resizeObserver) { 1805 // Prevent update loops when using the `size` middleware. 1806 // https://github.com/floating-ui/floating-ui/issues/1740 1807 resizeObserver.unobserve(floating); 1808 cancelAnimationFrame(reobserveFrame); 1809 reobserveFrame = requestAnimationFrame(() => { 1810 var _resizeObserver; 1811 (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating); 1812 }); 1813 } 1814 update(); 1815 }); 1816 if (referenceEl && !animationFrame) { 1817 resizeObserver.observe(referenceEl); 1818 } 1819 resizeObserver.observe(floating); 1820 } 1821 let frameId; 1822 let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null; 1823 if (animationFrame) { 1824 frameLoop(); 1825 } 1826 function frameLoop() { 1827 const nextRefRect = getBoundingClientRect(reference); 1828 if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) { 1829 update(); 1830 } 1831 prevRefRect = nextRefRect; 1832 frameId = requestAnimationFrame(frameLoop); 1833 } 1834 update(); 1835 return () => { 1836 var _resizeObserver2;
1837 ancestors.forEach(ancestor => { 1838 ancestorScroll && ancestor.removeEventListener('scroll', update); 1839 ancestorResize && ancestor.removeEventListener('resize', update); 1840 }); 1841 cleanupIo == null || cleanupIo(); 1842 (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect(); 1843 resizeObserver = null; 1844 if (animationFrame) { 1845 cancelAnimationFrame(frameId); 1846 } 1847 }; 1848} 1849 1850/** 1851 * Modifies the placement by translating the floating element along the 1852 * specified axes. 1853 * A number (shorthand for `mainAxis` or distance), or an axes configuration 1854 * object may be passed. 1855 * @see https://floating-ui.com/docs/offset 1856 */ 1857const offset = offset$1; 1858 1859/** 1860 * Optimizes the visibility of the floating element by shifting it in order to 1861 * keep it in view when it will overflow the clipping boundary. 1862 * @see https://floating-ui.com/docs/shift 1863 */ 1864const shift = shift$1; 1865 1866/** 1867 * Optimizes the visibility of the floating element by flipping the `placement` 1868 * in order to keep it in view when the preferred placement(s) will overflow the 1869 * clipping boundary. Alternative to `autoPlacement`. 1870 * @see https://floating-ui.com/docs/flip 1871 */ 1872const flip = flip$1; 1873 1874/** 1875 * Provides data to position an inner element of the floating element so that it 1876 * appears centered to the reference element. 1877 * @see https://floating-ui.com/docs/arrow 1878 */ 1879const arrow$1 = arrow$2; 1880 1881/** 1882 * Computes the `x` and `y` coordinates that will place the floating element 1883 * next to a given reference element. 1884 */ 1885const computePosition = (reference, floating, options) => { 1886 // This caches the expensive `getClippingElementAncestors` function so that 1887 // multiple lifecycle resets re-use the same result. It only lives for a 1888 // single call. If other functions become expensive, we can add them as well. 1889 const cache = new Map(); 1890 const mergedOptions = { 1891 platform, 1892 ...options 1893 }; 1894 const platformWithCache = { 1895 ...mergedOptions.platform, 1896 _c: cache 1897 }; 1898 return computePosition$1(reference, floating, { 1899 ...mergedOptions, 1900 platform: platformWithCache 1901 }); 1902}; 1903 1904function isComponentPublicInstance(target) { 1905 return target != null && typeof target === 'object' && '$el' in target; 1906} 1907function unwrapElement(target) { 1908 if (isComponentPublicInstance(target)) { 1909 const element = target.$el; 1910 return isNode(element) && getNodeName(element) === '#comment' ? null : element; 1911 } 1912 return target; 1913} 1914 1915function toValue(source) { 1916 return typeof source === 'function' ? source() : edr_remote_vue_components__loadShare__vue__loadShare__.unref(source); 1917} 1918 1919/** 1920 * Positions an inner element of the floating element such that it is centered to the reference element. 1921 * @param options The arrow options. 1922 * @see https://floating-ui.com/docs/arrow 1923 */ 1924function arrow(options) { 1925 return { 1926 name: 'arrow', 1927 options, 1928 fn(args) { 1929 const element = unwrapElement(toValue(options.element)); 1930 if (element == null) { 1931 return {}; 1932 } 1933 return arrow$1({ 1934 element, 1935 padding: options.padding 1936 }).fn(args); 1937 } 1938 }; 1939} 1940 1941function getDPR(element) { 1942 if (typeof window === 'undefined') { 1943 return 1; 1944 } 1945 const win = element.ownerDocument.defaultView || window; 1946 return win.devicePixelRatio || 1; 1947} 1948 1949function roundByDPR(element, value) { 1950 const dpr = getDPR(element); 1951 return Math.round(value * dpr) / dpr; 1952} 1953 1954/** 1955 * Computes the `x` and `y` coordinates that will place the floating element next to a reference element when it is given a certain CSS positioning strategy. 1956 * @param reference The reference template ref. 1957 * @param floating The floating template ref. 1958 * @param options The floating options. 1959 * @see https://floating-ui.com/docs/vue 1960 */ 1961function useFloating(reference, floating, options) { 1962 if (options === void 0) { 1963 options = {}; 1964 } 1965 const whileElementsMountedOption = options.whileElementsMounted; 1966 const openOption = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 1967 var _toValue; 1968 return (_toValue = toValue(options.open)) != null ? _toValue : true; 1969 }); 1970 const middlewareOption = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => toValue(options.middleware)); 1971 const placementOption = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 1972 var _toValue2; 1973 return (_toValue2 = toValue(options.placement)) != null ? _toValue2 : 'bottom'; 1974 }); 1975 const strategyOption = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 1976 var _toValue3; 1977 return (_toValue3 = toValue(options.strategy)) != null ? _toValue3 : 'absolute'; 1978 }); 1979 const transformOption = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 1980 var _toValue4; 1981 return (_toValue4 = toValue(options.transform)) != null ? _toValue4 : true; 1982 }); 1983 const referenceElement = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => unwrapElement(reference.value)); 1984 const floatingElement = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => unwrapElement(floating.value)); 1985 const x = edr_remote_vue_components__loadShare__vue__loadShare__.ref(0); 1986 const y = edr_remote_vue_components__loadShare__vue__loadShare__.ref(0); 1987 const strategy = edr_remote_vue_components__loadShare__vue__loadShare__.ref(strategyOption.value); 1988 const placement = edr_remote_vue_components__loadShare__vue__loadShare__.ref(placementOption.value); 1989 const middlewareData = edr_remote_vue_components__loadShare__vue__loadShare__.shallowRef({}); 1990 const isPositioned = edr_remote_vue_components__loadShare__vue__loadShare__.ref(false); 1991 const floatingStyles = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 1992 const initialStyles = { 1993 position: strategy.value, 1994 left: '0', 1995 top: '0' 1996 }; 1997 if (!floatingElement.value) { 1998 return initialStyles; 1999 } 2000 const xVal = roundByDPR(floatingElement.value, x.value); 2001 const yVal = roundByDPR(floatingElement.value, y.value); 2002 if (transformOption.value) { 2003 return { 2004 ...initialStyles, 2005 transform: "translate(" + xVal + "px, " + yVal + "px)", 2006 ...(getDPR(floatingElement.value) >= 1.5 && { 2007 willChange: 'transform' 2008 }) 2009 }; 2010 } 2011 return { 2012 position: strategy.value, 2013 left: xVal + "px", 2014 top: yVal + "px" 2015 }; 2016 }); 2017 let whileElementsMountedCleanup;
2018 function update() { 2019 if (referenceElement.value == null || floatingElement.value == null) { 2020 return; 2021 } 2022 const open = openOption.value; 2023 computePosition(referenceElement.value, floatingElement.value, { 2024 middleware: middlewareOption.value, 2025 placement: placementOption.value, 2026 strategy: strategyOption.value 2027 }).then(position => { 2028 x.value = position.x; 2029 y.value = position.y; 2030 strategy.value = position.strategy; 2031 placement.value = position.placement; 2032 middlewareData.value = position.middlewareData; 2033 /** 2034 * The floating element's position may be recomputed while it's closed 2035 * but still mounted (such as when transitioning out). To ensure 2036 * `isPositioned` will be `false` initially on the next open, avoid 2037 * setting it to `true` when `open === false` (must be specified). 2038 */ 2039 isPositioned.value = open !== false; 2040 }); 2041 } 2042 function cleanup() { 2043 if (typeof whileElementsMountedCleanup === 'function') { 2044 whileElementsMountedCleanup(); 2045 whileElementsMountedCleanup = undefined; 2046 } 2047 } 2048 function attach() { 2049 cleanup(); 2050 if (whileElementsMountedOption === undefined) { 2051 update(); 2052 return; 2053 } 2054 if (referenceElement.value != null && floatingElement.value != null) { 2055 whileElementsMountedCleanup = whileElementsMountedOption(referenceElement.value, floatingElement.value, update); 2056 return; 2057 } 2058 } 2059 function reset() { 2060 if (!openOption.value) { 2061 isPositioned.value = false; 2062 } 2063 } 2064 edr_remote_vue_components__loadShare__vue__loadShare__.watch([middlewareOption, placementOption, strategyOption, openOption], update, { 2065 flush: 'sync' 2066 }); 2067 edr_remote_vue_components__loadShare__vue__loadShare__.watch([referenceElement, floatingElement], attach, { 2068 flush: 'sync' 2069 }); 2070 edr_remote_vue_components__loadShare__vue__loadShare__.watch(openOption, reset, { 2071 flush: 'sync' 2072 }); 2073 if (edr_remote_vue_components__loadShare__vue__loadShare__.getCurrentScope()) { 2074 edr_remote_vue_components__loadShare__vue__loadShare__.onScopeDispose(cleanup); 2075 } 2076 return { 2077 x: edr_remote_vue_components__loadShare__vue__loadShare__.shallowReadonly(x), 2078 y: edr_remote_vue_components__loadShare__vue__loadShare__.shallowReadonly(y), 2079 strategy: edr_remote_vue_components__loadShare__vue__loadShare__.shallowReadonly(strategy), 2080 placement: edr_remote_vue_components__loadShare__vue__loadShare__.shallowReadonly(placement), 2081 middlewareData: edr_remote_vue_components__loadShare__vue__loadShare__.shallowReadonly(middlewareData), 2082 isPositioned: edr_remote_vue_components__loadShare__vue__loadShare__.shallowReadonly(isPositioned), 2083 floatingStyles, 2084 update 2085 }; 2086} 2087 2088const _sfc_main$5 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 2089 ...{ 2090 inheritAttrs: false 2091 }, 2092 __name: "Tooltip", 2093 props: { 2094 triggerOn: { default: "hover" }, 2095 hoverDelay: { default: 200 }, 2096 offset: { default: 10 }, 2097 teleportTo: {} 2098 }, 2099 setup(__props) { 2100 const props = __props; 2101 const isOpen = edr_remote_vue_components__loadShare__vue__loadShare__.ref(false); 2102 let hoverTimer = null; 2103 const triggerRef = edr_remote_vue_components__loadShare__vue__loadShare__.ref(null); 2104 const contentRef = edr_remote_vue_components__loadShare__vue__loadShare__.ref(null); 2105 const arrowRef = edr_remote_vue_components__loadShare__vue__loadShare__.ref(null); 2106 const teleportTarget = edr_remote_vue_components__loadShare__vue__loadShare__.ref(props.teleportTo || "body"); 2107 edr_remote_vue_components__loadShare__vue__loadShare__.watch(() => props.teleportTo, (newTarget) => { 2108 if (newTarget) { 2109 teleportTarget.value = newTarget; 2110 } 2111 }); 2112 const { floatingStyles, middlewareData, placement } = useFloating( 2113 triggerRef, 2114 contentRef, 2115 { 2116 whileElementsMounted: autoUpdate, 2117 placement: "top", 2118 middleware: [ 2119 offset(props.offset), 2120 flip(), 2121 shift({ padding: 5 }), 2122 arrow({ element: arrowRef }) 2123 ] 2124 } 2125 ); 2126 const arrowStyles = edr_remote_vue_components__loadShare__vue__loadShare__.ref({}); 2127 edr_remote_vue_components__loadShare__vue__loadShare__.watch([middlewareData, placement], () => { 2128 const { x, y } = middlewareData.value.arrow || {}; 2129 const currentPlacement = placement.value.split("-")[0]; 2130 const staticSide = { 2131 top: "bottom", 2132 right: "left", 2133 bottom: "top", 2134 left: "right" 2135 }[currentPlacement || "top"]; 2136 arrowStyles.value = { 2137 left: x != null ? `${x}px` : "", 2138 top: y != null ? `${y}px` : "", 2139 [staticSide]: "-4px" 2140 }; 2141 }, { immediate: true }); 2142 function onMouseEnter() { 2143 if (props.triggerOn !== "hover") return; 2144 if (hoverTimer) clearTimeout(hoverTimer); 2145 hoverTimer = window.setTimeout(() => { 2146 isOpen.value = true; 2147 }, props.hoverDelay); 2148 } 2149 function onMouseLeave() { 2150 if (props.triggerOn !== "hover") return; 2151 if (hoverTimer) clearTimeout(hoverTimer); 2152 hoverTimer = window.setTimeout(() => { 2153 isOpen.value = false;
2154 }, props.hoverDelay); 2155 } 2156 function onToggleClick() { 2157 if (props.triggerOn !== "click") return; 2158 isOpen.value = !isOpen.value; 2159 } 2160 function onClickOutside(event) { 2161 if (props.triggerOn !== "click" || !isOpen.value) return; 2162 const trigger = triggerRef.value; 2163 const content = contentRef.value; 2164 const path = event.composedPath(); 2165 const isClickInside = path.includes(trigger) || content && path.includes(content); 2166 if (isClickInside) return; 2167 isOpen.value = false; 2168 } 2169 edr_remote_vue_components__loadShare__vue__loadShare__.onMounted(() => { 2170 if (props.teleportTo) { 2171 teleportTarget.value = props.teleportTo; 2172 } else { 2173 const el = triggerRef.value; 2174 if (el) { 2175 const root = el.getRootNode(); 2176 if (root instanceof ShadowRoot) { 2177 const containerId = "tooltip-container"; 2178 let container = root.querySelector(`#${containerId}`); 2179 if (!container) { 2180 container = document.createElement("div"); 2181 container.id = containerId; 2182 Object.assign(container.style, { 2183 position: "absolute", 2184 top: "0", 2185 left: "0", 2186 width: "100%", 2187 height: "0px", 2188 // minimal height 2189 overflow: "visible", 2190 pointerEvents: "none" 2191 // Important: lets clicks pass through 2192 }); 2193 root.appendChild(container); 2194 } 2195 teleportTarget.value = container; 2196 } 2197 } 2198 } 2199 document.addEventListener("mousedown", onClickOutside); 2200 }); 2201 edr_remote_vue_components__loadShare__vue__loadShare__.onUnmounted(() => { 2202 document.removeEventListener("mousedown", onClickOutside); 2203 if (hoverTimer) clearTimeout(hoverTimer); 2204 }); 2205 return (_ctx, _cache) => { 2206 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, null, [ 2207 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", edr_remote_vue_components__loadShare__vue__loadShare__.mergeProps({ 2208 ref_key: "triggerRef", 2209 ref: triggerRef, 2210 class: "tooltip-trigger-wrapper" 2211 }, _ctx.$attrs, { 2212 onMouseenter: onMouseEnter, 2213 onMouseleave: onMouseLeave, 2214 onClick: onToggleClick 2215 }), [ 2216 edr_remote_vue_components__loadShare__vue__loadShare__.renderSlot(_ctx.$slots, "trigger", {}, void 0, true) 2217 ], 16), 2218 (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Teleport, { to: teleportTarget.value }, [ 2219 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(edr_remote_vue_components__loadShare__vue__loadShare__.Transition, { name: "tooltip-fade" }, { 2220 default: edr_remote_vue_components__loadShare__vue__loadShare__.withCtx(() => [ 2221 isOpen.value ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 2222 key: 0, 2223 ref_key: "contentRef", 2224 ref: contentRef, 2225 class: "tooltip-content", 2226 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle(edr_remote_vue_components__loadShare__vue__loadShare__.unref(floatingStyles)), 2227 onMouseenter: onMouseEnter, 2228 onMouseleave: onMouseLeave 2229 }, [ 2230 edr_remote_vue_components__loadShare__vue__loadShare__.renderSlot(_ctx.$slots, "default", {}, void 0, true), 2231 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { 2232 class: "tooltip-arrow", 2233 ref_key: "arrowRef", 2234 ref: arrowRef, 2235 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle(arrowStyles.value) 2236 }, null, 4) 2237 ], 36)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 2238 ]), 2239 _: 3 2240 }) 2241 ], 8, ["to"])) 2242 ], 64); 2243 }; 2244 } 2245}); 2246 2247const Tooltip = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-4b184700"]]); 2248 2249const _hoisted_1$4 = ["title"]; 2250const _hoisted_2$3 = { 2251 key: 0, 2252 class: "sa-badge-counter" 2253}; 2254const _sfc_main$4 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 2255 __name: "SaBadge", 2256 props: { 2257 classNames: {}, 2258 counter: {}, 2259 style: {}, 2260 text: {}, 2261 title: {} 2262 }, 2263 setup(__props) { 2264 const props = __props; 2265 const { classNames, counter, style, text, title } = props; 2266 return (_ctx, _cache) => { 2267 return edr_remote_vue_components__loadShare__vue__loadShare__.o
2267penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 2268 class: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass(["sa-badge", edr_remote_vue_components__loadShare__vue__loadShare__.unref(classNames)]), 2269 style: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeStyle(edr_remote_vue_components__loadShare__vue__loadShare__.unref(style)), 2270 title: edr_remote_vue_components__loadShare__vue__loadShare__.unref(title) 2271 }, [ 2272 edr_remote_vue_components__loadShare__vue__loadShare__.unref(counter) ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("span", _hoisted_2$3, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(counter)), 1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 2273 edr_remote_vue_components__loadShare__vue__loadShare__.createTextVNode(" " + edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(text)), 1) 2274 ], 14, _hoisted_1$4); 2275 }; 2276 } 2277}); 2278 2279const SaBadge = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-ed9cc8d7"]]); 2280 2281const _hoisted_1$3 = { class: "arrow-container" }; 2282const _hoisted_2$2 = ["width", "height"]; 2283const _hoisted_3$2 = ["fill"]; 2284const _hoisted_4$1 = ["fill"]; 2285const _sfc_main$3 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 2286 __name: "ArrowIcon", 2287 props: { 2288 color: {}, 2289 bgColor: {}, 2290 size: {}, 2291 type: {} 2292 }, 2293 setup(__props) { 2294 edr_remote_vue_components__loadShare__vue__loadShare__.useCssVars((_ctx) => ({ 2295 "v7f1575e2": _ctx.bgColor 2296 })); 2297 return (_ctx, _cache) => { 2298 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_1$3, [ 2299 (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("svg", { 2300 width: __props.size, 2301 height: __props.size,
2302 viewBox: "0 0 512 512", 2303 xmlns: "http://www.w3.org/2000/svg" 2304 }, [ 2305 __props.type === "left" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 2306 key: 0, 2307 fill: __props.color, 2308 d: "M50.2,169.6C97.9,56.3,228.5,3.1,341.8,50.9s166.4,178.3,118.7,291.6S282.2,508.9,168.9,461.1 C86.4,426.4,32.7,345.5,32.7,256C32.7,226.3,38.6,196.9,50.2,169.6z M254.7,448c106,0,192-86,192-192s-86-192-192-192 s-192,86-192,192S148.7,448,254.7,448z M226.7,140.7L111.4,256l115.3,115.3l21.2-21.2L168.7,271h208.2v-30H168.7l79.1-79.1 L226.7,140.7z" 2309 }, null, 8, _hoisted_3$2)) : __props.type === "right" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("path", { 2310 key: 1, 2311 d: "M460.54,169.58A222.6,222.6,0,1,0,478,256,221.16,221.16,0,0,0,460.54,169.58ZM256,448C150,448,64,362,64,256S150,64,256,64s192,86,192,192S362,448,256,448Zm28.06-307.33L399.39,256,284.06,371.33l-21.21-21.21L342,271H133.82V241H342l-79.12-79.12Z", 2312 fill: __props.color 2313 }, null, 8, _hoisted_4$1)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 2314 ], 8, _hoisted_2$2)) 2315 ]); 2316 }; 2317 } 2318}); 2319 2320const ArrowIcon = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-f6b6c734"]]); 2321 2322const _hoisted_1$2 = { 2323 key: 0, 2324 class: /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass(["timeline-card-detail-container", "timeline-card-detail-container-dim-large"]) 2325}; 2326const _hoisted_2$1 = { class: "info-first-card-large-container" }; 2327const _hoisted_3$1 = { class: "info-first-card-large" }; 2328const _hoisted_4 = { class: "info" }; 2329const _hoisted_5 = { class: "info-bold" }; 2330const _hoisted_6 = { class: "info" }; 2331const _hoisted_7 = { class: "info-date" }; 2332const _hoisted_8 = { class: "info-first-card-large" }; 2333const _hoisted_9 = { class: "info" }; 2334const _hoisted_10 = { class: "process-path-info-panel info-bold" }; 2335const _hoisted_11 = { 2336 key: 1, 2337 class: "timeline-card-detail-container detection-card" 2338}; 2339const _hoisted_12 = { class: "info-panel" }; 2340const _hoisted_13 = { class: "info" }; 2341const _hoisted_14 = { class: "info-panel-title" }; 2342const _hoisted_15 = { class: "info" }; 2343const _hoisted_16 = { class: "info-date" }; 2344const _hoisted_17 = { class: "info" }; 2345const _hoisted_18 = { class: "info-date" }; 2346const _hoisted_19 = { class: "info-section" }; 2347const _hoisted_20 = { class: "info-detection" }; 2348const _hoisted_21 = { class: "word-wrap" }; 2349const _hoisted_22 = { 2350 key: 0, 2351 class: "process-path-panel" 2352}; 2353const _hoisted_23 = { class: "process-path" }; 2354const _hoisted_24 = { 2355 key: 1, 2356 class: "info-section" 2357}; 2358const _hoisted_25 = { class: "info-detection" }; 2359const _hoisted_26 = { class: "capitalize" }; 2360const _hoisted_27 = { class: "info-section" }; 2361const _hoisted_28 = { class: "info-detection" }; 2362const _hoisted_29 = { 2363 class: /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass(["capitalize", "info-detection-rule-tag"]) 2364}; 2365const _hoisted_30 = { class: "info-section" }; 2366const _hoisted_31 = { class: "info-description" }; 2367const _hoisted_32 = { class: "data-manipulation" }; 2368const _hoisted_33 = { class: "bold" }; 2369const _hoisted_34 = { class: "slider-container" }; 2370const _hoisted_35 = { class: "slider-tactic-header" }; 2371const _hoisted_36 = { 2372 class: /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass(["bold", "underlined"]) 2373}; 2374const _hoisted_37 = ["href"]; 2375const _hoisted_38 = { 2376 key: 0, 2377 class: "techniques-container" 2378}; 2379const _hoisted_39 = { class: "techniques-list" }; 2380const _hoisted_40 = ["href"]; 2381const _hoisted_41 = { 2382 key: 1, 2383 class: "slider-footer" 2384}; 2385const _hoisted_42 = { class: "dots-container" }; 2386const _hoisted_43 = ["onClick"]; 2387const _hoisted_44 = { class: "info-action-card" }; 2388const _hoisted_45 = { class: "info" }; 2389const _hoisted_46 = { class: "info-date" }; 2390const _hoisted_47 = { class: "info" }; 2391const _hoisted_48 = { class: "info-bold" }; 2392const _hoisted_49 = { class: "info" }; 2393const _hoisted_50 = { class: "info-bold" }; 2394const link = "https://attack.mitre.org/"; 2395const policyLink = "/todo"; 2396const _sfc_main$2 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 2397 __name: "TimelineCardDetail", 2398 props: { 2399 info: {}, 2400 osType: {} 2401 }, 2402 setup(__props) { 2403 const props = __props; 2404 const friendlySeverity = { 2405 0: "Information", 2406 1: "Low", 2407 2: "Medium", 2408 3: "High", 2409 4: "Critical" 2410 }; 2411 const isProcessPathOpen = edr_remote_vue_components__loadShare__vue__loadShare__.ref(false); 2412 const currentSlide = edr_remote_vue_components__loadShare__vue__loadShare__.ref(0); 2413 const details = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "details" in props.info ? props.info.details : void 0); 2414 const endDate = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "end_date" in props.info ? props.info.end_date : void 0); 2415 const instances = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "instances" in props.info ? props.info.instances : []); 2416 const instancesCount = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "instances_count" in props.info ? props.info.instances_count : 0); 2417 const itemType = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => props.info.item_type); 2418 const path = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "path" in props.info ? props.info.path : void 0); 2419 const ruleDescription = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "rule_description" in props.info ? props.info.rule_description : void 0); 2420 const ruleSeverity = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "rule_severity" in props.info ? props.info.rule_severity : void 0); 2421 const ruleTag = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "rule_tag" in props.info ? props.info.rule_tag : void 0); 2422 const startDate = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "start_date" in props.info ? props.info.start_date : void 0); 2423 const timestamp = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "timestamp" in props.info ? props.info.timestamp : void 0); 2424 const user = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "user" in props.info ? props.info.user : void 0); 2425 const userName = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => "user_name" in props.info ? props.info.user_name : void 0); 2426 const severity = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 2427 if (ruleSeverity.value === void 0) return void 0; 2428 return friendlySeverity[ruleSeverity.value]?.toLowerCase(); 2429 }); 2430 const processName = edr_remote_vue_components__loadShare__vue__loadShare__.computed(() => { 2431 if (!path.value) return void 0; 2432 if (props.osType?.toLowerCase() !== "windows") { 2433 return path.value.split("/").pop(); 2434 } 2435 return path.value.split("\\").pop(); 2436 }); 2437 const toggleProcessPath = () => { 2438 isProcessPathOpen.value = !isProcessPathOpen.value; 2439 }; 2440 const goToSlide = (index) => { 2441 currentSlide.value = index; 2442 }; 2443 const previousSlide = () => { 2444 if (currentSlide.value !== 0) { 2445 currentSlide.value--; 2446 } 2447 }; 2448 const nextSlide = () => { 2449 if (currentSlide.value !== instances.value.length - 1) { 2450 currentSlide.value++; 2451 } 2452 }; 2453 return (_ctx, _cache) => { 2454 return itemType.value === "info" ? (edr_remote_vue_components__loadShare__vue__loadShare__.o
2454penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_1$2, [ 2455 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_2$1, [ 2456 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_3$1, [ 2457 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_4, [ 2458 _cache[0] || (_cache[0] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " User Account ", -1)), 2459 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_5, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(user.value || "--"), 1) 2460 ]), 2461 _cache[2] || (_cache[2] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "vertical-divider" }, null, -1)), 2462 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_6, [ 2463 _cache[1] || (_cache[1] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " Initial detection time ", -1)), 2464 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_7, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(formatDateTime)(timestamp.value, "datetime")), 1) 2465 ]) 2466 ]), 2467 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_8, [ 2468 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_9, [ 2469 _cache[3] || (_cache[3] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " Process path name ", -1)), 2470 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_10, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(path.value), 1) 2471 ]) 2472 ]) 2473 ]) 2474 ])) : itemType.value === "detection" ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_11, [ 2475 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_12, [ 2476 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_13, [ 2477 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_14, [ 2478 _cache[4] || (_cache[4] = edr_remote_vue_components__loadShare__vue__loadShare__.createTextVNode(" Total occurrences ", -1)), 2479 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { 2480 class: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass(["instances-circle", severity.value]) 2481 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(instancesCount.value), 3) 2482 ]) 2483 ]), 2484 _cache[7] || (_cache[7] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "vertical-divider" }, null, -1)), 2485 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_15, [ 2486 _cache[5] || (_cache[5] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " First time ", -1)), 2487 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_16, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(formatDateTime)(startDate.value, "datetime")), 1) 2488 ]), 2489 _cache[8] || (_cache[8] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "vertical-divider" }, null, -1)), 2490 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_17, [ 2491 _cache[6] || (_cache[6] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " Last time ", -1)), 2492 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_18, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(formatDateTime)(endDate.value, "datetime")), 1) 2493 ]) 2494 ]), 2495 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_19, [ 2496 _cache[9] || (_cache[9] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "info-section-header" }, "Process name", -1)), 2497 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_20, [ 2498 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_21, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(processName.value || "--"), 1), 2499 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { 2500 class: "process-name-span", 2501 onClick: toggleProcessPath 2502 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(isProcessPathOpen.value ? "Hide" : "Show") + " full process path ", 1), 2503 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { 2504 class: "clickable", 2505 onClick: toggleProcessPath 2506 }, "Â " + edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(isProcessPathOpen.value ? "â" : "â"), 1) 2507 ]) 2508 ]), 2509 isProcessPathOpen.value ? (edr_remote_vue_components__loadShare__vue__loadShare__.o
2509penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_22, [ 2510 _cache[10] || (_cache[10] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "process-name-header" }, "Full process path:", -1)), 2511 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_23, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(path.value), 1) 2512 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 2513 user.value && user.value.length > 0 ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_24, [ 2514 _cache[11] || (_cache[11] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "info-section-header" }, "User account", -1)), 2515 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_25, [ 2516 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_26, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(user.value), 1) 2517 ]) 2518 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 2519 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_27, [ 2520 _cache[12] || (_cache[12] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "info-section-header" }, "Behavior", -1)), 2521 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_28, [ 2522 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_29, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(ruleTag.value), 1), 2523 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(SaBadge, { 2524 classNames: severity.value, 2525 text: friendlySeverity[ruleSeverity.value] + " Severity" 2526 }, null, 8, ["classNames", "text"]) 2527 ]) 2528 ]), 2529 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_30, [ 2530 _cache[13] || (_cache[13] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "info-section-header" }, "Description", -1)), 2531 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_31, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(ruleDescription.value), 1) 2532 ]), 2533 _cache[16] || (_cache[16] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "divider" }, null, -1)), 2534 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_32, [ 2535 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_33, "Adversary Behavior Tactics (" + edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(instances.value.length) + ")", 1), 2536 _cache[14] || (_cache[14] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", null, " Sometimes a detection can demonstrate signs of more than one tactic. When this is the case we list all potential tactics. ", -1)) 2537 ]), 2538 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_34, [ 2539 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_35, [ 2540 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_36, [ 2541 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("a", { 2542 href: link + "tactics/" + instances.value[currentSlide.value]?.tactic_code, 2543 rel: "noreferrer", 2544 target: "_blank" 2545 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(instances.value[currentSlide.value]?.tactic_name) + " " + edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(instances.value.length > 1 ? `(${currentSlide.value + 1}/${instances.value.length})` : ""), 9, _hoisted_37) 2546 ]), 2547 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", null, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(instances.value[currentSlide.value]?.tactic_de
2547scription), 1) 2548 ]), 2549 instances.value[currentSlide.value]?.techniques && instances.value[currentSlide.value]?.techniques.length || 0 > 0 ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_38, [ 2550 _cache[15] || (_cache[15] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "bold" }, "Technique(s)", -1)), 2551 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_39, [ 2552 (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(true), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, null, edr_remote_vue_components__loadShare__vue__loadShare__.renderList(instances.value[currentSlide.value]?.techniques, (technique, idx) => { 2553 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, { key: idx }, [ 2554 (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(true), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, null, edr_remote_vue_components__loadShare__vue__loadShare__.renderList(Object.entries(technique), ([code, techData], i) => { 2555 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 2556 key: i, 2557 class: "technique-link" 2558 }, [ 2559 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("a", { 2560 href: techData.hyperlink, 2561 rel: "noreferrer", 2562 target: "_blank" 2563 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(code) + " - " + edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(techData.name), 9, _hoisted_40) 2564 ]); 2565 }), 128)) 2566 ], 64); 2567 }), 128)) 2568 ]) 2569 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true), 2570 instances.value.length > 1 ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_41, [ 2571 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { 2572 class: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass(["slider-go", { deactivated: currentSlide.value === 0 }]), 2573 onClick: previousSlide, 2574 style: { "margin-right": "24px" } 2575 }, [ 2576 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(ArrowIcon, { 2577 "bg-color": currentSlide.value === 0 ? "var(--edr-module-timeline-card-detail-slider-deactivated-color)" : "var(--edr-module-timeline-card-detail-slider-activated-color)", 2578 color: "var(--edr-module-timeline-card-detail-slider-arrow-color)", 2579 size: "30px", 2580 type: "left" 2581 }, null, 8, ["bg-color"]) 2582 ], 2), 2583 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_42, [ 2584 (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(true), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, null, edr_remote_vue_components__loadShare__vue__loadShare__.renderList(instances.value, (_, index) => { 2585 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 2586 key: index, 2587 class: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass([ 2588 "slider-dot", 2589 currentSlide.value === index ? "activated" : "deactivated" 2590 ]), 2591 onClick: ($event) => goToSlide(index) 2592 }, null, 10, _hoisted_43); 2593 }), 128)) 2594 ]), 2595 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { 2596 class: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass([ 2597 "slider-go", 2598 { deactivated: currentSlide.value === instances.value.length - 1 } 2599 ]), 2600 onClick: nextSlide, 2601 style: { "margin-left": "24px" } 2602 }, [ 2603 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(ArrowIcon, { 2604 "bg-color": currentSlide.value === instances.value.length - 1 ? "var(--edr-module-timeline-card-detail-slider-deactivated-color)" : "var(--edr-module-timeline-card-detail-slider-activated-color)", 2605 color: "var(--edr-module-timeline-card-detail-slider-arrow-color)", 2606 size: "30px", 2607 type: "right" 2608 }, null, 8, ["bg-color"]) 2609 ], 2) 2610 ])) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 2611 ]) 2612 ])) : itemType.value === "action" ? (edr_remote_vue_components__loadShare__vue__loadShare__.o
2612penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", { 2613 key: 2, 2614 class: edr_remote_vue_components__loadShare__vue__loadShare__.normalizeClass([ 2615 "timeline-card-detail-container", 2616 { "timeline-card-detail-container-dim": details.value?.policy_id } 2617 ]) 2618 }, [ 2619 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_44, [ 2620 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_45, [ 2621 _cache[17] || (_cache[17] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " Time ", -1)), 2622 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_46, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(edr_remote_vue_components__loadShare__vue__loadShare__.unref(formatDateTime)(timestamp.value, "datetime")), 1) 2623 ]), 2624 _cache[21] || (_cache[21] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "vertical-divider" }, null, -1)), 2625 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_47, [ 2626 _cache[18] || (_cache[18] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " Account name ", -1)), 2627 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_48, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(details.value?.rule_id ? "ThreatDown Automation" : details.value?.user_name || userName.value || "--"), 1) 2628 ]), 2629 details.value?.policy_id ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, { key: 0 }, [ 2630 _cache[20] || (_cache[20] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "vertical-divider" }, null, -1)), 2631 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_49, [ 2632 _cache[19] || (_cache[19] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("span", { class: "info-panel-title" }, " Policy ", -1)), 2633 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_50, [ 2634 details.value?.policy_id ? (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("a", { 2635 key: 0, 2636 href: policyLink, 2637 rel: "noreferrer", 2638 target: "_blank" 2639 }, edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(details.value?.policy_name || "--"), 1)) : (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, { key: 1 }, [ 2640 edr_remote_vue_components__loadShare__vue__loadShare__.createTextVNode(edr_remote_vue_components__loadShare__vue__loadShare__.toDisplayString(details.value?.policy_name || "--"), 1) 2641 ], 64)) 2642 ]) 2643 ]) 2644 ], 64)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true) 2645 ]) 2646 ], 2)) : edr_remote_vue_components__loadShare__vue__loadShare__.createCommentVNode("", true); 2647 }; 2648 } 2649}); 2650 2651const TimelineCardDetail = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-d6fd54df"]]); 2652 2653const _hoisted_1$1 = { class: "legends-container" }; 2654const _sfc_main$1 = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 2655 __name: "TimelineLegend", 2656 setup(__props) { 2657 return (_ctx, _cache) => { 2658 return edr_remote_vue_components__loadShare__vue__loadShare__.o
2658penBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_1$1, [..._cache[0] || (_cache[0] = [ 2659 edr_remote_vue_components__loadShare__vue__loadShare__.createStaticVNode('<div class="legend-container" data-v-37055161><span data-v-37055161>Severity:</span><div class="legend-item critical" data-v-37055161><div data-v-37055161></div><span data-v-37055161>Critical</span></div><div class="legend-item high" data-v-37055161><div data-v-37055161></div><span data-v-37055161>High</span></div><div class="legend-item medium" data-v-37055161><div data-v-37055161></div><span data-v-37055161>Medium</span></div><div class="legend-item low" data-v-37055161><div data-v-37055161></div><span data-v-37055161>Low</span></div></div>', 1) 2660 ])]); 2661 }; 2662 } 2663}); 2664 2665const TimelineLegend = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-37055161"]]); 2666 2667const _hoisted_1 = { class: "timeline-container" }; 2668const _hoisted_2 = { class: "timeline-header" }; 2669const _hoisted_3 = { class: "timeline-main" }; 2670const _sfc_main = /* @__PURE__ */ edr_remote_vue_components__loadShare__vue__loadShare__.defineComponent({ 2671 __name: "Timeline", 2672 props: { 2673 data: {}, 2674 osType: {} 2675 }, 2676 setup(__props) { 2677 const tooltipContainer = edr_remote_vue_components__loadShare__vue__loadShare__.ref(null); 2678 return (_ctx, _cache) => { 2679 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock("div", _hoisted_1, [ 2680 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { 2681 ref_key: "tooltipContainer", 2682 ref: tooltipContainer, 2683 class: "timeline-tooltip-overlay" 2684 }, null, 512), 2685 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_2, [ 2686 _cache[0] || (_cache[0] = edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", { class: "timeline-header-title" }, " Incident Timeline ", -1)), 2687 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(TimelineLegend) 2688 ]), 2689 edr_remote_vue_components__loadShare__vue__loadShare__.createElementVNode("div", _hoisted_3, [ 2690 (edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(true), edr_remote_vue_components__loadShare__vue__loadShare__.createElementBlock(edr_remote_vue_components__loadShare__vue__loadShare__.Fragment, null, edr_remote_vue_components__loadShare__vue__loadShare__.renderList(__props.data, (cardInfo, idx) => { 2691 return edr_remote_vue_components__loadShare__vue__loadShare__.openBlock(), edr_remote_vue_components__loadShare__vue__loadShare__.createBlock(Tooltip, { 2692 key: idx, 2693 class: "card-tooltip", 2694 triggerOn: "click", 2695 "teleport-to": tooltipContainer.value 2696 }, { 2697 trigger: edr_remote_vue_components__loadShare__vue__loadShare__.withCtx(() => [ 2698 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(TimelineCard, { 2699 "first-card": idx === 0, 2700 info: cardInfo, 2701 "last-card": idx === __props.data.length - 1, 2702 "os-type": __props.osType 2703 }, null, 8, ["first-card", "info", "last-card", "os-type"]) 2704 ]), 2705 default: edr_remote_vue_components__loadShare__vue__loadShare__.withCtx(() => [ 2706 edr_remote_vue_components__loadShare__vue__loadShare__.createVNode(TimelineCardDetail, { 2707 info: cardInfo, 2708 "os-type": __props.osType 2709 }, null, 8, ["info", "os-type"]) 2710 ]), 2711 _: 2 2712 }, 1032, ["teleport-to"]); 2713 }), 128)) 2714 ]) 2715 ]); 2716 }; 2717 } 2718}); 2719 2720const Timeline = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-5da37661"]]); 2721 2722export { Timeline as default };
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.