@appsurify-testmap/rrweb 2.1.3-alpha.3 → 3.1.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/rrweb.cjs CHANGED
@@ -300,6 +300,7 @@ function stringifyRule(rule2, sheetHref) {
300
300
  return importStringified;
301
301
  } else {
302
302
  let ruleStringified = rule2.cssText;
303
+ if (rule2.type === CSSRule.KEYFRAMES_RULE || rule2.type === CSSRule.KEYFRAME_RULE) ;
303
304
  if (isCSSStyleRule(rule2) && rule2.selectorText.includes(":")) {
304
305
  ruleStringified = fixSafariColons(ruleStringified);
305
306
  }
@@ -522,19 +523,19 @@ function splitCssText(cssText, style, _testNoPxNorm = false) {
522
523
  _testNoPxNorm
523
524
  );
524
525
  const jLimit = 100;
525
- let j = 3;
526
- for (; j < textContentNorm.length; j++) {
526
+ let j2 = 3;
527
+ for (; j2 < textContentNorm.length; j2++) {
527
528
  if (
528
529
  // keep consuming css identifiers (to get a decent chunk more quickly)
529
- textContentNorm[j].match(/[a-zA-Z0-9]/) || // substring needs to be unique to this section
530
- textContentNorm.indexOf(textContentNorm.substring(0, j), 1) !== -1
530
+ textContentNorm[j2].match(/[a-zA-Z0-9]/) || // substring needs to be unique to this section
531
+ textContentNorm.indexOf(textContentNorm.substring(0, j2), 1) !== -1
531
532
  ) {
532
533
  continue;
533
534
  }
534
535
  break;
535
536
  }
536
- for (; j < textContentNorm.length; j++) {
537
- let startSubstring = textContentNorm.substring(0, j);
537
+ for (; j2 < textContentNorm.length; j2++) {
538
+ let startSubstring = textContentNorm.substring(0, j2);
538
539
  let cssNormSplits = cssTextNorm.split(startSubstring);
539
540
  let splitNorm = -1;
540
541
  if (cssNormSplits.length === 2) {
@@ -551,11 +552,11 @@ function splitCssText(cssText, style, _testNoPxNorm = false) {
551
552
  splits.push(cssText);
552
553
  return splits;
553
554
  }
554
- j = jLimit + 1;
555
- } else if (j === textContentNorm.length - 1) {
555
+ j2 = jLimit + 1;
556
+ } else if (j2 === textContentNorm.length - 1) {
556
557
  splitNorm = cssTextNorm.indexOf(startSubstring);
557
558
  }
558
- if (cssNormSplits.length >= 2 && j > jLimit) {
559
+ if (cssNormSplits.length >= 2 && j2 > jLimit) {
559
560
  const prevTextContent = childNodes2[i2 - 1].textContent;
560
561
  if (prevTextContent && typeof prevTextContent === "string") {
561
562
  const prevMinLength = normalizeCssString(prevTextContent).length;
@@ -566,29 +567,29 @@ function splitCssText(cssText, style, _testNoPxNorm = false) {
566
567
  }
567
568
  }
568
569
  if (splitNorm !== -1) {
569
- let k = Math.floor(splitNorm / normFactor);
570
- for (; k > 0 && k < cssText.length; ) {
570
+ let k2 = Math.floor(splitNorm / normFactor);
571
+ for (; k2 > 0 && k2 < cssText.length; ) {
571
572
  iterCount += 1;
572
573
  if (iterCount > 50 * childNodes2.length) {
573
574
  splits.push(cssText);
574
575
  return splits;
575
576
  }
576
577
  const normPart = normalizeCssString(
577
- cssText.substring(0, k),
578
+ cssText.substring(0, k2),
578
579
  _testNoPxNorm
579
580
  );
580
581
  if (normPart.length === splitNorm) {
581
- splits.push(cssText.substring(0, k));
582
- cssText = cssText.substring(k);
582
+ splits.push(cssText.substring(0, k2));
583
+ cssText = cssText.substring(k2);
583
584
  cssTextNorm = cssTextNorm.substring(splitNorm);
584
585
  break;
585
586
  } else if (normPart.length < splitNorm) {
586
- k += Math.max(
587
+ k2 += Math.max(
587
588
  1,
588
589
  Math.floor((splitNorm - normPart.length) / normFactor)
589
590
  );
590
591
  } else {
591
- k -= Math.max(
592
+ k2 -= Math.max(
592
593
  1,
593
594
  Math.floor((normPart.length - splitNorm) * normFactor)
594
595
  );
@@ -606,96 +607,6 @@ function splitCssText(cssText, style, _testNoPxNorm = false) {
606
607
  function markCssSplits(cssText, style) {
607
608
  return splitCssText(cssText, style).join("/* rr_split */");
608
609
  }
609
- function isSelectorUnique(selector, target) {
610
- try {
611
- const matches = document.querySelectorAll(selector);
612
- return matches.length === 1 && matches[0] === target;
613
- } catch {
614
- return false;
615
- }
616
- }
617
- function buildSelector(node2) {
618
- if (!(node2 instanceof Element)) return null;
619
- if (node2.id) {
620
- return `#${CSS.escape(node2.id)}`;
621
- }
622
- const parts = [];
623
- const tag = node2.tagName.toLowerCase();
624
- if (node2.classList.length) {
625
- parts.push(...Array.from(node2.classList).map((cls) => `.${CSS.escape(cls)}`));
626
- }
627
- Array.from(node2.attributes).forEach((attr) => {
628
- if (attr.name.startsWith("data-")) {
629
- parts.push(`[${attr.name}="${CSS.escape(attr.value)}"]`);
630
- }
631
- });
632
- const shortSelector = `${tag}${parts.join("")}`;
633
- if (isSelectorUnique(shortSelector, node2)) {
634
- return shortSelector;
635
- }
636
- const pathParts = [];
637
- let current = node2;
638
- while (current && current.nodeType === Node.ELEMENT_NODE) {
639
- const parent = current.parentElement;
640
- const tagName = current.tagName.toLowerCase();
641
- let nth = "";
642
- if (parent) {
643
- const siblings = Array.from(parent.children).filter(
644
- (el) => el.tagName.toLowerCase() === tagName
645
- );
646
- if (siblings.length > 1) {
647
- nth = `:nth-of-type(${siblings.indexOf(current) + 1})`;
648
- }
649
- }
650
- pathParts.unshift(`${tagName}${nth}`);
651
- current = parent;
652
- }
653
- return pathParts.join(" > ") || null;
654
- }
655
- function buildXPath(node2) {
656
- switch (node2.nodeType) {
657
- case Node.DOCUMENT_NODE:
658
- return "/";
659
- case Node.DOCUMENT_TYPE_NODE:
660
- return "/html/doctype";
661
- case Node.ELEMENT_NODE: {
662
- const element = node2;
663
- if (element.id) {
664
- return `//*[@id="${CSS.escape(element.id)}"]`;
665
- }
666
- if (element.tagName.toLowerCase() === "html") return "/html";
667
- if (element === document.head) return "/html/head";
668
- if (element === document.body) return "/html/body";
669
- const parent = element.parentNode;
670
- if (!parent) return "";
671
- const tag = element.tagName.toLowerCase();
672
- const siblings = Array.from(parent.children).filter(
673
- (el) => el.tagName.toLowerCase() === tag
674
- );
675
- const index2 = siblings.length > 1 ? `[${siblings.indexOf(element) + 1}]` : "";
676
- return `${buildXPath(parent)}/${tag}${index2}`;
677
- }
678
- case Node.TEXT_NODE:
679
- case Node.CDATA_SECTION_NODE:
680
- case Node.COMMENT_NODE: {
681
- const parent = node2.parentNode;
682
- if (!parent) return "";
683
- const typeMap = {
684
- [Node.TEXT_NODE]: "text()",
685
- [Node.CDATA_SECTION_NODE]: "text()",
686
- // CDATA ≡ text() в XPath
687
- [Node.COMMENT_NODE]: "comment()"
688
- };
689
- const sameTypeSiblings = Array.from(parent.childNodes).filter(
690
- (sibling) => sibling.nodeType === node2.nodeType
691
- );
692
- const index2 = sameTypeSiblings.length > 1 ? `[${sameTypeSiblings.indexOf(node2)}]` : "";
693
- return `${buildXPath(parent)}/${typeMap[node2.nodeType]}${index2}`;
694
- }
695
- default:
696
- return "";
697
- }
698
- }
699
610
  function isTextVisible(n2) {
700
611
  var _a2;
701
612
  const parent = index$1.parentNode(n2);
@@ -828,6 +739,1274 @@ try {
828
739
  }
829
740
  } catch (error) {
830
741
  }
742
+ const L = {
743
+ ANCHOR: 0.4,
744
+ PATH: 0.3,
745
+ TARGET: 0.2,
746
+ UNIQUENESS: 0.1
747
+ }, I = {
748
+ SEMANTIC_TAG: 0.5,
749
+ ROLE: 0.3,
750
+ ARIA_LABEL: 0.1,
751
+ STABLE_ID: 0.1,
752
+ TEST_MARKER: 0.05,
753
+ DEPTH_PENALTY_THRESHOLD: 5,
754
+ DEPTH_PENALTY_FACTOR: 0.05,
755
+ DEGRADED_SCORE: 0.3
756
+ }, ct = {
757
+ MIN_CONFIDENCE_FOR_SKIP: 0.7
758
+ }, X = [
759
+ "form",
760
+ "main",
761
+ "nav",
762
+ "section",
763
+ "article",
764
+ "footer",
765
+ "header"
766
+ ], K = [
767
+ "form",
768
+ "navigation",
769
+ "main",
770
+ "region",
771
+ "contentinfo",
772
+ "complementary",
773
+ "banner",
774
+ "search"
775
+ ], lt = [
776
+ // HTML5 Semantic
777
+ "article",
778
+ "aside",
779
+ "details",
780
+ "figcaption",
781
+ "figure",
782
+ "footer",
783
+ "header",
784
+ "main",
785
+ "mark",
786
+ "nav",
787
+ "section",
788
+ "summary",
789
+ "time",
790
+ // Form elements
791
+ "button",
792
+ "datalist",
793
+ "fieldset",
794
+ "form",
795
+ "input",
796
+ "label",
797
+ "legend",
798
+ "meter",
799
+ "optgroup",
800
+ "option",
801
+ "output",
802
+ "progress",
803
+ "select",
804
+ "textarea",
805
+ // Interactive
806
+ "a",
807
+ "audio",
808
+ "video",
809
+ "canvas",
810
+ "dialog",
811
+ "menu",
812
+ // Text content
813
+ "blockquote",
814
+ "dd",
815
+ "dl",
816
+ "dt",
817
+ "hr",
818
+ "li",
819
+ "ol",
820
+ "ul",
821
+ "p",
822
+ "pre",
823
+ "h1",
824
+ "h2",
825
+ "h3",
826
+ "h4",
827
+ "h5",
828
+ "h6",
829
+ // Table
830
+ "caption",
831
+ "col",
832
+ "colgroup",
833
+ "table",
834
+ "tbody",
835
+ "td",
836
+ "tfoot",
837
+ "th",
838
+ "thead",
839
+ "tr",
840
+ // SVG
841
+ "svg",
842
+ "path",
843
+ "circle",
844
+ "rect",
845
+ "line",
846
+ "polyline",
847
+ "polygon",
848
+ "ellipse",
849
+ "g",
850
+ "text",
851
+ "use"
852
+ ], w = {
853
+ // Test attributes (highest priority)
854
+ "data-testid": 100,
855
+ "data-qa": 99,
856
+ "data-cy": 98,
857
+ "data-test": 97,
858
+ "data-test-id": 96,
859
+ // ARIA (accessibility semantics)
860
+ "aria-label": 90,
861
+ "aria-labelledby": 85,
862
+ "aria-describedby": 80,
863
+ // Semantic HTML attributes
864
+ name: 75,
865
+ href: 70,
866
+ // for <a>
867
+ src: 70,
868
+ // for <img>, <script>, etc.
869
+ type: 65,
870
+ role: 60,
871
+ alt: 55,
872
+ title: 50,
873
+ for: 45,
874
+ placeholder: 40,
875
+ // Any data-* attribute (if not above)
876
+ "data-*": 30,
877
+ // Any aria-* attribute (if not above)
878
+ "aria-*": 25
879
+ }, B = /* @__PURE__ */ new Set([
880
+ "id",
881
+ // handled separately
882
+ "class",
883
+ // handled separately
884
+ "style",
885
+ // unstable
886
+ "xmlns",
887
+ // service attribute for SVG
888
+ "tabindex",
889
+ // can change
890
+ "contenteditable"
891
+ ]), ut = {
892
+ maxPathDepth: 10,
893
+ enableSvgFingerprint: true,
894
+ confidenceThreshold: 0.1,
895
+ fallbackToBody: true,
896
+ includeUtilityClasses: false,
897
+ source: "dom-dsl"
898
+ };
899
+ function D(n2) {
900
+ return !!(/^[a-z]+-\d+$/i.test(n2) || /^[a-z]+(-[a-z]+)+-\d+$/i.test(n2) || /^[a-z]+(_[a-z]+)*_\d+$/i.test(n2) || /^\d+$/.test(n2) || /^:[a-z0-9]+:$/i.test(n2) || /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(n2) || /^[a-z]{1,3}[A-Za-z0-9]{8,}$/.test(n2) && (/\d/.test(n2) || /[A-Z]/.test(n2)) || /^radix-/.test(n2) || /^mui-\d+$/.test(n2));
901
+ }
902
+ const G = /* @__PURE__ */ new Set([
903
+ "aria-labelledby",
904
+ "aria-describedby",
905
+ "aria-controls",
906
+ "aria-owns",
907
+ "aria-activedescendant",
908
+ "for",
909
+ "form",
910
+ "list",
911
+ "headers",
912
+ "aria-details",
913
+ "aria-errormessage",
914
+ "aria-flowto"
915
+ ]);
916
+ function V(n2) {
917
+ return n2.trim().split(/\s+/).some((e2) => D(e2));
918
+ }
919
+ class ft {
920
+ constructor(t2, e2) {
921
+ this.maxDepth = t2.maxPathDepth ?? 10, this.cache = e2;
922
+ }
923
+ /**
924
+ * Finds the best anchor element for the target
925
+ * @param target - Target element to find anchor for
926
+ * @returns Anchor result or null if not found
927
+ */
928
+ findAnchor(t2) {
929
+ if (this.cache) {
930
+ const i2 = this.cache.getAnchor(t2);
931
+ if (i2 !== void 0)
932
+ return i2;
933
+ }
934
+ let e2 = t2.parentElement, s2 = 0, r2 = null;
935
+ for (; e2 && s2 < this.maxDepth; ) {
936
+ if (e2.tagName.toLowerCase() === "body")
937
+ return r2 || {
938
+ element: e2,
939
+ score: I.DEGRADED_SCORE,
940
+ tier: "C",
941
+ depth: s2
942
+ };
943
+ const i2 = this.scoreAnchor(e2);
944
+ if (i2 > 0) {
945
+ const o2 = this.applyDepthPenalty(i2, s2), l2 = this.getTier(e2), u2 = { element: e2, score: o2, tier: l2, depth: s2 };
946
+ if (l2 === "A")
947
+ return u2;
948
+ (!r2 || o2 > r2.score) && (r2 = u2);
949
+ }
950
+ e2 = e2.parentElement, s2++;
951
+ }
952
+ const a2 = r2;
953
+ return this.cache && this.cache.setAnchor(t2, a2), a2;
954
+ }
955
+ /**
956
+ * Scores an element as anchor candidate (without depth penalty)
957
+ * @param element - Element to score
958
+ * @returns Raw score from 0 to 1
959
+ */
960
+ scoreAnchor(t2) {
961
+ let e2 = 0;
962
+ const s2 = t2.tagName.toLowerCase();
963
+ X.includes(s2) && (e2 += I.SEMANTIC_TAG);
964
+ const r2 = t2.getAttribute("role");
965
+ r2 && K.includes(r2) && (e2 += I.ROLE), (t2.hasAttribute("aria-label") || t2.hasAttribute("aria-labelledby")) && (e2 += I.ARIA_LABEL);
966
+ const a2 = t2.id;
967
+ return a2 && !D(a2) && (e2 += I.STABLE_ID), (t2.hasAttribute("data-testid") || t2.hasAttribute("data-qa") || t2.hasAttribute("data-test")) && (e2 += I.TEST_MARKER), Math.min(e2, 1);
968
+ }
969
+ /**
970
+ * Applies depth penalty to score
971
+ * Following SPECIFICATION.md §7: depthPenalty = (depth - threshold) * factor
972
+ */
973
+ applyDepthPenalty(t2, e2) {
974
+ if (e2 <= I.DEPTH_PENALTY_THRESHOLD)
975
+ return t2;
976
+ const s2 = (e2 - I.DEPTH_PENALTY_THRESHOLD) * I.DEPTH_PENALTY_FACTOR;
977
+ return Math.max(0, t2 - s2);
978
+ }
979
+ /**
980
+ * Determines the tier of an anchor element
981
+ */
982
+ getTier(t2) {
983
+ const e2 = t2.tagName.toLowerCase();
984
+ if (X.includes(e2))
985
+ return "A";
986
+ const s2 = t2.getAttribute("role");
987
+ return s2 && K.includes(s2) ? "B" : "C";
988
+ }
989
+ }
990
+ const gt = [
991
+ // CSS-in-JS
992
+ /^css-[a-z0-9]+$/i,
993
+ /^sc-[a-z0-9]+-\d+$/i,
994
+ /^[a-z]{5,8}$/i,
995
+ // Short generated classes (abcdef)
996
+ // Material-UI / MUI
997
+ /^Mui[A-Z]\w+-\w+-\w+/,
998
+ /^makeStyles-\w+-\d+$/,
999
+ // JSS
1000
+ /^jss\d+$/,
1001
+ // Emotion / Linaria
1002
+ /^(emotion|linaria)-[a-z0-9]+/i,
1003
+ // Component libraries with hashes
1004
+ /^(chakra|tw-|ant-)[a-z0-9]+-\w+/i,
1005
+ // Hash-based (hashes in classes)
1006
+ /-[a-f0-9]{6,}$/i,
1007
+ /^_[a-z0-9]{5,}$/i,
1008
+ /\d{5,}/
1009
+ // 5+ digits in a row
1010
+ ], pt = [
1011
+ // === FIX 4: Tailwind arbitrary values and variants (highest priority) ===
1012
+ /^\[/,
1013
+ // Any arbitrary value or variant starting with [ (e.g., [&_svg]:..., [mask-type:luminance])
1014
+ // === FIX 4: Pseudo-class variants (must be before specific patterns) ===
1015
+ /^(first|last|odd|even|only|first-of-type|last-of-type|only-of-type):/,
1016
+ // first:, last:, etc.
1017
+ /^(hover|focus|active|disabled|enabled|checked|indeterminate|default|required|valid|invalid|in-range|out-of-range|placeholder-shown|autofill|read-only):/,
1018
+ // State pseudo-classes
1019
+ /^(focus-within|focus-visible|visited|target|open):/,
1020
+ // Advanced pseudo-classes
1021
+ // === FIX 4: Responsive variants (must be before specific patterns) ===
1022
+ /^(sm|md|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl):/,
1023
+ // === FIX 4: Dark mode and directional variants ===
1024
+ /^dark:/,
1025
+ /^(rtl|ltr):/,
1026
+ // === FIX 4: Group and peer variants ===
1027
+ /^(group|peer)(-hover|-focus|-active)?:/,
1028
+ // === FIX 4: Tailwind utilities with fraction values ===
1029
+ /\/([\d.]+|full|auto|screen)$/,
1030
+ // /50, /100, /full, /auto, /screen
1031
+ // === FIX 4: Positioning utilities ===
1032
+ /^(inset|top|right|bottom|left)(-|$)/,
1033
+ // inset-0, top-0, left-0
1034
+ // === Layout & Display ===
1035
+ /^(flex|inline-flex|grid|block|inline|inline-block|hidden|visible)$/,
1036
+ /^(absolute|relative|fixed|sticky|static)$/,
1037
+ // === Flexbox & Grid ===
1038
+ /^(items|justify|content|self|place)-/,
1039
+ /^flex-(row|col|wrap|nowrap|1|auto|initial|none)/,
1040
+ /^grid-(cols|rows|flow)/,
1041
+ // === Spacing (Tailwind) ===
1042
+ /^(gap|space)-/,
1043
+ /^[mp][trblxy]?-(\d+|auto|px)$/,
1044
+ // === Negative Tailwind utilities (margins, positioning, transforms) ===
1045
+ /^-[mp][trblxy]?-\d+$/,
1046
+ // -m-4, -mt-2, -mx-4, -px-4, -py-2
1047
+ /^-(top|right|bottom|left|inset)-\d+$/,
1048
+ // -top-4, -bottom-6, -left-6, -inset-0
1049
+ /^-z-\d+$/,
1050
+ // -z-10, -z-20
1051
+ /^-space-[xy]-\d+$/,
1052
+ // -space-x-2, -space-y-4
1053
+ /^-translate-[xy]-\d+$/,
1054
+ // -translate-x-4, -translate-y-2
1055
+ /^-rotate-\d+$/,
1056
+ // -rotate-45, -rotate-90
1057
+ /^-scale-\d+$/,
1058
+ // -scale-50, -scale-75
1059
+ /^-skew-[xy]-\d+$/,
1060
+ // -skew-x-12, -skew-y-6
1061
+ // === Sizing ===
1062
+ /^(w|h|min-w|min-h|max-w|max-h|size)-/,
1063
+ // === Colors & Styling ===
1064
+ // Note: text-* can be semantic (text-muted, text-primary) or utility (text-center, text-lg)
1065
+ // More specific patterns for utility text-* classes
1066
+ /^text-(center|left|right|justify|start|end|xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/,
1067
+ /^text-(uppercase|lowercase|capitalize|normal-case|underline|line-through|no-underline)$/,
1068
+ /^text-(truncate|ellipsis|clip)$/,
1069
+ /^(bg|border|ring|shadow|outline)-/,
1070
+ /^rounded(-|$)/,
1071
+ // === Typography ===
1072
+ /^(font|leading|tracking|whitespace|break|truncate)-/,
1073
+ /^(uppercase|lowercase|capitalize|normal-case)$/,
1074
+ // === Transform & Animation (IMPORTANT!) ===
1075
+ /^(transform|transition|duration|delay|ease|animate)-/,
1076
+ /^(scale|rotate|translate|skew)-/,
1077
+ /^transform$/,
1078
+ /^backdrop-blur-/,
1079
+ /^motion-/,
1080
+ // Framer Motion
1081
+ /^(fade|slide|zoom|bounce|pulse|spin|ping)-/,
1082
+ // animations
1083
+ // === Overflow & Scrolling ===
1084
+ /^(overflow|overscroll|scroll)-/,
1085
+ /^object-(contain|cover|fill|none|scale-down)$/,
1086
+ // === Interactivity ===
1087
+ /^(cursor|pointer-events|select|resize)-/,
1088
+ // === Visibility & Opacity ===
1089
+ /^(opacity|z)-/,
1090
+ /^(visible|invisible|collapse)$/,
1091
+ // === Bootstrap utilities ===
1092
+ /^d-(none|inline|inline-block|block|grid|table|flex)$/,
1093
+ /^(float|clearfix|text)-(left|right|center|justify|start|end)$/,
1094
+ /^(m|p)[trblxy]?-[0-5]$/,
1095
+ /^(w|h)-(25|50|75|100|auto)$/,
1096
+ // Note: btn-* classes are semantic (component classes), not utility
1097
+ // /^btn-(primary|secondary|success|danger|warning|info|light|dark|link)$/,
1098
+ /^btn-(sm|lg|block)$/,
1099
+ // Only size modifiers are utility
1100
+ /^text-(muted|primary|success|danger|warning|info|light|dark|white)$/,
1101
+ /^bg-(primary|secondary|success|danger|warning|info|light|dark|white|transparent)$/,
1102
+ /^border(-top|-bottom|-left|-right)?(-0)?$/,
1103
+ /^rounded(-top|-bottom|-left|-right|-circle|-pill|-0)?$/,
1104
+ /^shadow(-sm|-lg|-none)?$/,
1105
+ /^(align|justify|order|flex)-(start|end|center|between|around|fill|grow|shrink)$/,
1106
+ /^col(-sm|-md|-lg|-xl)?(-\d+|-auto)?$/,
1107
+ /^row(-cols)?(-\d+)?$/,
1108
+ /^g[xy]?-[0-5]$/,
1109
+ /^(show|hide|invisible|visible)$/,
1110
+ /^(position|top|bottom|start|end)-(static|relative|absolute|fixed|sticky|-\d+)$/,
1111
+ // === Common utility patterns ===
1112
+ /^(row|col)$/,
1113
+ /^clearfix$/,
1114
+ /^pull-(left|right)$/,
1115
+ /^float-(left|right|none)$/
1116
+ ];
1117
+ function _(n2) {
1118
+ return gt.some((t2) => t2.test(n2));
1119
+ }
1120
+ function q(n2) {
1121
+ return n2.length <= 2 || /^\d/.test(n2) ? true : pt.some((t2) => t2.test(n2));
1122
+ }
1123
+ function St(n2) {
1124
+ return !_(n2) && !q(n2);
1125
+ }
1126
+ function N(n2) {
1127
+ return n2.filter((t2) => St(t2));
1128
+ }
1129
+ function At(n2) {
1130
+ const t2 = [], e2 = [];
1131
+ for (const s2 of n2)
1132
+ q(s2) || _(s2) ? e2.push(s2) : t2.push(s2);
1133
+ return { semantic: t2, utility: e2 };
1134
+ }
1135
+ function J(n2) {
1136
+ return q(n2) || _(n2);
1137
+ }
1138
+ const tt = (n2) => n2.replace(/([#:.[\]@])/g, "\\$1");
1139
+ class xt {
1140
+ constructor(t2, e2) {
1141
+ this.maxDepth = t2.maxPathDepth ?? 10, this.cache = e2;
1142
+ }
1143
+ /**
1144
+ * Builds path from anchor to target (excluding both)
1145
+ * @param anchor - Anchor element (start)
1146
+ * @param target - Target element (end)
1147
+ * @param extractor - Semantic extractor instance
1148
+ * @returns Path build result with nodes and degradation info
1149
+ */
1150
+ buildPath(t2, e2, s2) {
1151
+ const r2 = [];
1152
+ let a2 = e2.parentElement;
1153
+ for (; a2 && a2 !== t2 && r2.length < this.maxDepth; )
1154
+ r2.unshift(a2), a2 = a2.parentElement;
1155
+ const i2 = r2.length >= this.maxDepth && a2 !== t2;
1156
+ let o2 = this.filterNoise(r2);
1157
+ return o2 = this.ensureUniqueness(r2, o2, t2, e2, s2), {
1158
+ path: o2.map((u2) => {
1159
+ const d = u2.parentElement;
1160
+ let c2;
1161
+ if (d) {
1162
+ const g = Array.from(d.children).indexOf(u2);
1163
+ g !== -1 && (c2 = g + 1);
1164
+ }
1165
+ return {
1166
+ tag: u2.tagName.toLowerCase(),
1167
+ semantics: s2.extract(u2),
1168
+ score: s2.scoreElement(u2),
1169
+ nthChild: c2
1170
+ };
1171
+ }),
1172
+ degraded: i2,
1173
+ degradationReason: i2 ? "path-depth-overflow" : void 0
1174
+ };
1175
+ }
1176
+ /**
1177
+ * Legacy method for backward compatibility
1178
+ */
1179
+ buildPathNodes(t2, e2, s2) {
1180
+ return this.buildPath(t2, e2, s2).path;
1181
+ }
1182
+ /**
1183
+ * Ensures path uniqueness by adding nodes if needed
1184
+ * Following SPECIFICATION.md §8 Disambiguation Algorithm
1185
+ */
1186
+ ensureUniqueness(t2, e2, s2, r2, a2) {
1187
+ const i2 = this.buildTestSelector(s2, e2, r2);
1188
+ try {
1189
+ const o2 = r2.ownerDocument;
1190
+ if (!o2) return e2;
1191
+ let l2;
1192
+ if (this.cache) {
1193
+ const d = this.cache.getSelectorResults(i2);
1194
+ d !== void 0 ? l2 = d : (l2 = Array.from(o2.querySelectorAll(i2)), this.cache.setSelectorResults(i2, l2));
1195
+ } else
1196
+ l2 = o2.querySelectorAll(i2);
1197
+ if (l2.length <= 1)
1198
+ return e2;
1199
+ const u2 = t2.filter((d) => !e2.includes(d));
1200
+ for (const d of u2) {
1201
+ if (a2.scoreElement(d) < ct.MIN_CONFIDENCE_FOR_SKIP)
1202
+ continue;
1203
+ const h = this.insertNodeInOrder(e2, d, t2), g = this.buildTestSelector(s2, h, r2);
1204
+ try {
1205
+ let f2;
1206
+ if (this.cache) {
1207
+ const p = this.cache.getSelectorResults(g);
1208
+ p !== void 0 ? f2 = p : (f2 = Array.from(o2.querySelectorAll(g)), this.cache.setSelectorResults(g, f2));
1209
+ } else
1210
+ f2 = o2.querySelectorAll(g);
1211
+ if (f2.length === 1)
1212
+ return h;
1213
+ f2.length < l2.length && (e2 = h);
1214
+ } catch {
1215
+ }
1216
+ }
1217
+ return e2;
1218
+ } catch {
1219
+ return e2;
1220
+ }
1221
+ }
1222
+ /**
1223
+ * Inserts node into path maintaining original order
1224
+ */
1225
+ insertNodeInOrder(t2, e2, s2) {
1226
+ const r2 = s2.indexOf(e2), a2 = [...t2];
1227
+ let i2 = 0;
1228
+ for (let o2 = 0; o2 < a2.length && !(s2.indexOf(a2[o2]) > r2); o2++)
1229
+ i2 = o2 + 1;
1230
+ return a2.splice(i2, 0, e2), a2;
1231
+ }
1232
+ /**
1233
+ * Builds a test CSS selector from path
1234
+ */
1235
+ buildTestSelector(t2, e2, s2) {
1236
+ const r2 = [];
1237
+ r2.push(this.elementToSelector(t2));
1238
+ for (const a2 of e2)
1239
+ r2.push(this.elementToSelector(a2));
1240
+ return r2.push(this.elementToSelector(s2)), r2.join(" ");
1241
+ }
1242
+ /**
1243
+ * Converts element to basic CSS selector
1244
+ */
1245
+ elementToSelector(t2) {
1246
+ let e2 = t2.tagName.toLowerCase();
1247
+ t2.id && !D(t2.id) && (e2 += `#${tt(t2.id)}`);
1248
+ for (const s2 of Array.from(t2.classList))
1249
+ J(s2) || (e2 += `.${tt(s2)}`);
1250
+ return e2;
1251
+ }
1252
+ /**
1253
+ * Filters out noise/layout elements
1254
+ */
1255
+ filterNoise(t2) {
1256
+ return t2.filter((e2) => this.shouldInclude(e2));
1257
+ }
1258
+ /**
1259
+ * Determines if element should be included in path
1260
+ */
1261
+ shouldInclude(t2) {
1262
+ const e2 = t2.tagName.toLowerCase();
1263
+ return lt.includes(e2) ? true : e2 === "div" || e2 === "span" ? this.hasSemanticFeatures(t2) : false;
1264
+ }
1265
+ /**
1266
+ * Checks if element has meaningful semantic features
1267
+ */
1268
+ hasSemanticFeatures(t2) {
1269
+ if (t2.hasAttribute("role")) return true;
1270
+ for (const s2 of Array.from(t2.attributes))
1271
+ if (s2.name.startsWith("aria-")) return true;
1272
+ if (t2.classList.length > 0) {
1273
+ for (const s2 of Array.from(t2.classList))
1274
+ if (!J(s2)) return true;
1275
+ }
1276
+ if (t2.hasAttribute("data-testid") || t2.hasAttribute("data-qa") || t2.hasAttribute("data-test"))
1277
+ return true;
1278
+ const e2 = t2.id;
1279
+ return !!(e2 && !D(e2));
1280
+ }
1281
+ }
1282
+ function Q(n2) {
1283
+ return n2 ? n2.trim().replace(/[\n\t\r]/g, " ").replace(/\s+/g, " ") : "";
1284
+ }
1285
+ const Ct = {
1286
+ preserveQueryForAbsolute: true,
1287
+ removeDynamicHashes: true
1288
+ };
1289
+ function Tt(n2) {
1290
+ return n2 ? [
1291
+ /\d{5,}/,
1292
+ // 5+ digits
1293
+ /[a-f0-9]{8,}/i,
1294
+ // hex hash 8+ characters
1295
+ /(session|token|temp|random|timestamp|nonce|cache)/i,
1296
+ // dynamic words
1297
+ /^\d+$/,
1298
+ // only digits
1299
+ /^[a-f0-9-]{32,}$/i
1300
+ // UUID-like
1301
+ ].some((e2) => e2.test(n2)) : false;
1302
+ }
1303
+ function Et(n2, t2) {
1304
+ if (!n2) return n2;
1305
+ const e2 = n2.startsWith("http://") || n2.startsWith("https://"), [s2, r2] = n2.split("#"), [a2, i2] = s2.split("?");
1306
+ let o2 = a2;
1307
+ return e2 && t2.preserveQueryForAbsolute && i2 && (o2 += `?${i2}`), r2 && (t2.removeDynamicHashes && Tt(r2) || (o2 += `#${r2}`)), o2;
1308
+ }
1309
+ function k(n2, t2, e2 = {}) {
1310
+ if (!t2) return t2;
1311
+ const s2 = { ...Ct, ...e2 };
1312
+ return n2 === "href" || n2 === "src" ? Et(t2, s2) : t2;
1313
+ }
1314
+ const wt = [
1315
+ "role",
1316
+ "aria-label",
1317
+ "aria-labelledby",
1318
+ "aria-describedby",
1319
+ "aria-controls",
1320
+ "aria-owns",
1321
+ "aria-level",
1322
+ "aria-posinset",
1323
+ "aria-setsize",
1324
+ "aria-haspopup"
1325
+ ], vt = [
1326
+ "aria-selected",
1327
+ "aria-checked",
1328
+ "aria-pressed",
1329
+ "aria-expanded",
1330
+ "aria-hidden",
1331
+ "aria-disabled",
1332
+ "aria-current",
1333
+ "aria-busy",
1334
+ "aria-invalid",
1335
+ "aria-grabbed",
1336
+ "aria-live",
1337
+ "aria-atomic"
1338
+ ], $t = [
1339
+ "data-state",
1340
+ "data-active",
1341
+ "data-inactive",
1342
+ "data-selected",
1343
+ "data-open",
1344
+ "data-closed",
1345
+ "data-visible",
1346
+ "data-hidden",
1347
+ "data-disabled",
1348
+ "data-enabled",
1349
+ "data-loading",
1350
+ "data-error",
1351
+ "data-success",
1352
+ "data-highlighted",
1353
+ "data-focused",
1354
+ "data-hover",
1355
+ "data-orientation",
1356
+ "data-theme"
1357
+ ], Mt = [
1358
+ "data-radix-",
1359
+ "data-headlessui-",
1360
+ "data-reach-",
1361
+ "data-mui-",
1362
+ "data-chakra-",
1363
+ "data-mantine-",
1364
+ "data-tw-"
1365
+ ], It = [
1366
+ "data-testid",
1367
+ "data-test-id",
1368
+ "data-test",
1369
+ "data-cy",
1370
+ "data-qa",
1371
+ "data-automation-id",
1372
+ "data-id",
1373
+ "data-component",
1374
+ "data-entity-id",
1375
+ "data-product-id",
1376
+ "data-user-id"
1377
+ ], Rt = [
1378
+ "id",
1379
+ "name",
1380
+ "type",
1381
+ "placeholder",
1382
+ "title",
1383
+ "for",
1384
+ "alt",
1385
+ "href"
1386
+ ], Nt = [
1387
+ "disabled",
1388
+ "checked",
1389
+ "selected",
1390
+ "hidden",
1391
+ "readonly",
1392
+ "required",
1393
+ "value"
1394
+ ], Dt = [
1395
+ /^radix-/,
1396
+ /^headlessui-/,
1397
+ /^mui-/,
1398
+ /:\w+:/
1399
+ // matches :ru:, :r1:, etc.
1400
+ ];
1401
+ function Ht(n2, t2) {
1402
+ return wt.includes(n2) ? true : vt.includes(n2) || $t.includes(n2) || Mt.some((e2) => n2.startsWith(e2)) ? false : It.includes(n2) || n2.startsWith("data-") && n2.endsWith("-id") ? true : n2 === "id" ? !Dt.some((e2) => e2.test(t2)) : Rt.includes(n2) ? true : Nt.includes(n2) ? false : !!n2.startsWith("data-");
1403
+ }
1404
+ class Pt {
1405
+ constructor(t2, e2) {
1406
+ this.includeUtilityClasses = t2.includeUtilityClasses ?? false, this.cache = e2;
1407
+ }
1408
+ /**
1409
+ * Extracts semantic features from element
1410
+ * @param element - DOM element to extract from
1411
+ * @returns Semantic features object
1412
+ */
1413
+ extract(t2) {
1414
+ if (this.cache) {
1415
+ const i2 = this.cache.getSemantics(t2);
1416
+ if (i2 !== void 0)
1417
+ return i2;
1418
+ }
1419
+ const e2 = {}, s2 = t2.id;
1420
+ if (s2 && !D(s2) && (e2.id = s2), t2.classList.length > 0) {
1421
+ const i2 = Array.from(t2.classList);
1422
+ if (this.includeUtilityClasses)
1423
+ e2.classes = i2;
1424
+ else {
1425
+ const { semantic: o2 } = At(i2);
1426
+ o2.length > 0 && (e2.classes = o2);
1427
+ }
1428
+ }
1429
+ const r2 = this.extractAttributes(t2);
1430
+ Object.keys(r2).length > 0 && (e2.attributes = r2);
1431
+ const a2 = t2.getAttribute("role");
1432
+ if (a2 && (e2.role = a2), this.shouldExtractText(t2)) {
1433
+ const i2 = this.extractText(t2);
1434
+ i2 && (e2.text = i2);
1435
+ }
1436
+ return this.cache && this.cache.setSemantics(t2, e2), e2;
1437
+ }
1438
+ /**
1439
+ * Scores element based on semantic richness
1440
+ * @param element - Element to score
1441
+ * @returns Score from 0 to 1
1442
+ */
1443
+ scoreElement(t2) {
1444
+ let e2 = 0.5;
1445
+ const s2 = this.extract(t2);
1446
+ return s2.id && (e2 += 0.15), s2.classes && s2.classes.length > 0 && (e2 += 0.1), s2.attributes && Object.keys(s2.attributes).length > 0 && (e2 += 0.1), s2.role && (e2 += 0.1), s2.text && (e2 += 0.05), Math.min(e2, 1);
1447
+ }
1448
+ /**
1449
+ * Checks if attribute should be ignored
1450
+ * @param attrName - Attribute name
1451
+ * @returns True if should be ignored
1452
+ */
1453
+ shouldIgnoreAttribute(t2) {
1454
+ return !!(B.has(t2) || t2.startsWith("on") || t2.startsWith("ng-") || t2.startsWith("_ng") || t2.startsWith("data-reactid") || t2.startsWith("data-react") || t2.startsWith("data-v-"));
1455
+ }
1456
+ /**
1457
+ * Gets attribute priority
1458
+ * @param attrName - Attribute name
1459
+ * @returns Priority number (higher = more priority)
1460
+ */
1461
+ getAttributePriority(t2) {
1462
+ return w[t2] !== void 0 ? w[t2] : t2.startsWith("data-") ? w["data-*"] : t2.startsWith("aria-") ? w["aria-*"] : 0;
1463
+ }
1464
+ /**
1465
+ * Checks if attribute value is dynamic (should be ignored)
1466
+ * @param value - Attribute value
1467
+ * @returns True if value is dynamic
1468
+ */
1469
+ isDynamicValue(t2) {
1470
+ return [
1471
+ /^[a-f0-9]{32,}$/i,
1472
+ // Long hashes
1473
+ /^\d{10,}$/,
1474
+ // Timestamp
1475
+ /^(undefined|null|\[object)/,
1476
+ // JS artifacts
1477
+ /^{{.*}}$/
1478
+ // Template literals
1479
+ ].some((s2) => s2.test(t2));
1480
+ }
1481
+ /**
1482
+ * Extracts relevant semantic attributes from element
1483
+ * Iterates through all attributes and filters by priority
1484
+ */
1485
+ extractAttributes(t2) {
1486
+ const e2 = {};
1487
+ for (const s2 of Array.from(t2.attributes)) {
1488
+ const r2 = s2.name;
1489
+ if (this.shouldIgnoreAttribute(r2) || !Ht(r2, s2.value) || G.has(r2) && V(s2.value) || this.getAttributePriority(r2) === 0) continue;
1490
+ const i2 = r2 === "href" || r2 === "src" ? k(r2, s2.value) : s2.value;
1491
+ !i2 || i2.trim() === "" || this.isDynamicValue(i2) || (e2[r2] = i2);
1492
+ }
1493
+ return e2;
1494
+ }
1495
+ /**
1496
+ * Extracts and normalizes text content
1497
+ */
1498
+ extractText(t2) {
1499
+ const e2 = this.getDirectTextContent(t2);
1500
+ if (!e2) return null;
1501
+ const s2 = Q(e2);
1502
+ if (!s2) return null;
1503
+ const r2 = 100, a2 = e2.length > r2 ? e2.slice(0, r2) + "..." : e2, i2 = s2.length > r2 ? s2.slice(0, r2) + "..." : s2;
1504
+ return {
1505
+ raw: a2,
1506
+ normalized: i2
1507
+ };
1508
+ }
1509
+ /**
1510
+ * Gets direct text content excluding child elements
1511
+ */
1512
+ getDirectTextContent(t2) {
1513
+ const e2 = [];
1514
+ for (const s2 of Array.from(t2.childNodes))
1515
+ if (s2.nodeType === Node.TEXT_NODE && s2.textContent) {
1516
+ const r2 = s2.textContent.trim();
1517
+ r2 && e2.push(r2);
1518
+ }
1519
+ return e2.length > 0 ? e2.join(" ") : t2.textContent ?? null;
1520
+ }
1521
+ /**
1522
+ * Determines if text should be extracted for this element
1523
+ */
1524
+ shouldExtractText(t2) {
1525
+ const e2 = t2.tagName.toLowerCase();
1526
+ return [
1527
+ "button",
1528
+ "a",
1529
+ "label",
1530
+ "h1",
1531
+ "h2",
1532
+ "h3",
1533
+ "h4",
1534
+ "h5",
1535
+ "h6",
1536
+ "p",
1537
+ "span",
1538
+ "li",
1539
+ "th",
1540
+ "td",
1541
+ "dt",
1542
+ "dd",
1543
+ "legend",
1544
+ "figcaption",
1545
+ "summary"
1546
+ ].includes(e2);
1547
+ }
1548
+ }
1549
+ class kt {
1550
+ /**
1551
+ * Generates fingerprint for SVG element
1552
+ * @param element - SVG element to fingerprint
1553
+ * @returns SVG fingerprint object
1554
+ */
1555
+ fingerprint(t2) {
1556
+ const e2 = t2.tagName.toLowerCase(), s2 = this.getShape(e2), r2 = {
1557
+ shape: s2,
1558
+ hasAnimation: this.hasAnimation(t2)
1559
+ };
1560
+ if (s2 === "path") {
1561
+ const o2 = t2.getAttribute("d");
1562
+ o2 && (r2.dHash = this.computePathHash(o2));
1563
+ } else ["circle", "rect", "ellipse", "line"].includes(s2) && (r2.geomHash = this.computeGeomHash(t2, s2));
1564
+ const a2 = t2.getAttribute("role");
1565
+ a2 && (r2.role = a2);
1566
+ const i2 = t2.querySelector("title");
1567
+ return (i2 == null ? void 0 : i2.textContent) && (r2.titleText = i2.textContent.trim()), r2;
1568
+ }
1569
+ /**
1570
+ * Computes hash from path data (first N commands)
1571
+ * @param d - SVG path d attribute value
1572
+ * @returns Hash string
1573
+ */
1574
+ computePathHash(t2) {
1575
+ const e2 = this.normalizePathData(t2);
1576
+ return this.simpleHash(e2);
1577
+ }
1578
+ /**
1579
+ * Gets the shape type from tag name
1580
+ */
1581
+ getShape(t2) {
1582
+ return [
1583
+ "path",
1584
+ "circle",
1585
+ "rect",
1586
+ "line",
1587
+ "polyline",
1588
+ "polygon",
1589
+ "ellipse",
1590
+ "g",
1591
+ "text",
1592
+ "use",
1593
+ "svg"
1594
+ ].find((s2) => s2 === t2) ?? "path";
1595
+ }
1596
+ /**
1597
+ * Normalizes path data for consistent hashing
1598
+ */
1599
+ normalizePathData(t2) {
1600
+ return (t2.match(/[MLHVCSQTAZ][^MLHVCSQTAZ]*/gi) ?? []).slice(0, 5).map((r2) => r2.trim().replace(/(-?\d+\.?\d*)/g, (a2) => parseFloat(a2).toFixed(1))).join(" ");
1601
+ }
1602
+ /**
1603
+ * Computes geometry hash for non-path shapes
1604
+ */
1605
+ computeGeomHash(t2, e2) {
1606
+ const s2 = [];
1607
+ switch (e2) {
1608
+ case "circle":
1609
+ s2.push(`r=${t2.getAttribute("r") ?? "0"}`);
1610
+ break;
1611
+ case "rect":
1612
+ {
1613
+ const r2 = parseFloat(t2.getAttribute("width") ?? "0"), a2 = parseFloat(t2.getAttribute("height") ?? "0");
1614
+ r2 > 0 && a2 > 0 && s2.push(`ratio=${(r2 / a2).toFixed(2)}`);
1615
+ }
1616
+ break;
1617
+ case "ellipse":
1618
+ {
1619
+ const r2 = parseFloat(t2.getAttribute("rx") ?? "0"), a2 = parseFloat(t2.getAttribute("ry") ?? "0");
1620
+ r2 > 0 && a2 > 0 && s2.push(`ratio=${(r2 / a2).toFixed(2)}`);
1621
+ }
1622
+ break;
1623
+ case "line":
1624
+ {
1625
+ const r2 = parseFloat(t2.getAttribute("x1") ?? "0"), a2 = parseFloat(t2.getAttribute("y1") ?? "0"), i2 = parseFloat(t2.getAttribute("x2") ?? "0"), o2 = parseFloat(t2.getAttribute("y2") ?? "0"), l2 = Math.atan2(o2 - a2, i2 - r2);
1626
+ s2.push(`angle=${l2.toFixed(2)}`);
1627
+ }
1628
+ break;
1629
+ }
1630
+ return this.simpleHash(s2.join(";"));
1631
+ }
1632
+ /**
1633
+ * Detects animations on SVG element
1634
+ */
1635
+ hasAnimation(t2) {
1636
+ if (t2.querySelector("animate, animateTransform, animateMotion"))
1637
+ return true;
1638
+ const e2 = t2.ownerDocument;
1639
+ if (e2 == null ? void 0 : e2.defaultView)
1640
+ try {
1641
+ const s2 = e2.defaultView.getComputedStyle(t2);
1642
+ if (s2.animationName !== "none" || s2.transitionProperty !== "all" && s2.transitionProperty !== "none")
1643
+ return true;
1644
+ } catch {
1645
+ }
1646
+ return false;
1647
+ }
1648
+ /**
1649
+ * Simple hash function for fingerprinting (not cryptographic)
1650
+ */
1651
+ simpleHash(t2) {
1652
+ let e2 = 0;
1653
+ for (let s2 = 0; s2 < t2.length; s2++) {
1654
+ const r2 = t2.charCodeAt(s2);
1655
+ e2 = (e2 << 5) - e2 + r2, e2 = e2 & e2;
1656
+ }
1657
+ return Math.abs(e2).toString(16).padStart(8, "0");
1658
+ }
1659
+ }
1660
+ function _t(n2, t2 = 0) {
1661
+ const e2 = n2.anchor.score, s2 = n2.path.length > 0 ? n2.path.reduce((o2, l2) => o2 + l2.score, 0) / n2.path.length : 0.5, r2 = n2.target.score, a2 = e2 * L.ANCHOR + s2 * L.PATH + r2 * L.TARGET + t2 * L.UNIQUENESS, i2 = n2.anchor.degraded ? 0.2 : 0;
1662
+ return Math.max(0, Math.min(1, a2 - i2));
1663
+ }
1664
+ class qt {
1665
+ constructor(t2) {
1666
+ this.cache = /* @__PURE__ */ new Map(), this.maxSize = t2;
1667
+ }
1668
+ get(t2) {
1669
+ const e2 = this.cache.get(t2);
1670
+ if (e2 !== void 0)
1671
+ return this.cache.delete(t2), this.cache.set(t2, e2), e2;
1672
+ }
1673
+ set(t2, e2) {
1674
+ if (this.cache.has(t2))
1675
+ this.cache.delete(t2);
1676
+ else if (this.cache.size >= this.maxSize) {
1677
+ const s2 = this.cache.keys().next().value;
1678
+ s2 !== void 0 && this.cache.delete(s2);
1679
+ }
1680
+ this.cache.set(t2, e2);
1681
+ }
1682
+ has(t2) {
1683
+ return this.cache.has(t2);
1684
+ }
1685
+ delete(t2) {
1686
+ this.cache.delete(t2);
1687
+ }
1688
+ clear() {
1689
+ this.cache.clear();
1690
+ }
1691
+ get size() {
1692
+ return this.cache.size;
1693
+ }
1694
+ }
1695
+ class Lt {
1696
+ constructor(t2 = {}) {
1697
+ this.eidCache = /* @__PURE__ */ new WeakMap(), this.selectorResultCache = new qt(
1698
+ t2.maxSelectorCacheSize ?? 1e3
1699
+ ), this.anchorCache = /* @__PURE__ */ new WeakMap(), this.semanticsCache = /* @__PURE__ */ new WeakMap(), this.stats = {
1700
+ eidHits: 0,
1701
+ eidMisses: 0,
1702
+ selectorHits: 0,
1703
+ selectorMisses: 0,
1704
+ anchorHits: 0,
1705
+ anchorMisses: 0,
1706
+ semanticsHits: 0,
1707
+ semanticsMisses: 0,
1708
+ selectorCacheSize: 0,
1709
+ maxSelectorCacheSize: t2.maxSelectorCacheSize ?? 1e3
1710
+ };
1711
+ }
1712
+ /**
1713
+ * Get cached EID for element
1714
+ */
1715
+ getEID(t2) {
1716
+ const e2 = this.eidCache.get(t2);
1717
+ if (e2 !== void 0)
1718
+ return this.stats.eidHits++, e2;
1719
+ this.stats.eidMisses++;
1720
+ }
1721
+ /**
1722
+ * Cache EID for element
1723
+ */
1724
+ setEID(t2, e2) {
1725
+ this.eidCache.set(t2, e2);
1726
+ }
1727
+ /**
1728
+ * Get cached selector results
1729
+ */
1730
+ getSelectorResults(t2) {
1731
+ const e2 = this.selectorResultCache.get(t2);
1732
+ if (e2 !== void 0)
1733
+ return this.stats.selectorHits++, this.stats.selectorCacheSize = this.selectorResultCache.size, e2;
1734
+ this.stats.selectorMisses++, this.stats.selectorCacheSize = this.selectorResultCache.size;
1735
+ }
1736
+ /**
1737
+ * Cache selector results
1738
+ */
1739
+ setSelectorResults(t2, e2) {
1740
+ this.selectorResultCache.set(t2, e2), this.stats.selectorCacheSize = this.selectorResultCache.size;
1741
+ }
1742
+ /**
1743
+ * Get cached anchor result
1744
+ */
1745
+ getAnchor(t2) {
1746
+ if (this.anchorCache.has(t2))
1747
+ return this.stats.anchorHits++, this.anchorCache.get(t2);
1748
+ this.stats.anchorMisses++;
1749
+ }
1750
+ /**
1751
+ * Cache anchor result
1752
+ */
1753
+ setAnchor(t2, e2) {
1754
+ this.anchorCache.set(t2, e2);
1755
+ }
1756
+ /**
1757
+ * Get cached semantics
1758
+ */
1759
+ getSemantics(t2) {
1760
+ const e2 = this.semanticsCache.get(t2);
1761
+ if (e2 !== void 0)
1762
+ return this.stats.semanticsHits++, e2;
1763
+ this.stats.semanticsMisses++;
1764
+ }
1765
+ /**
1766
+ * Cache semantics
1767
+ */
1768
+ setSemantics(t2, e2) {
1769
+ this.semanticsCache.set(t2, e2);
1770
+ }
1771
+ /**
1772
+ * Clear all caches
1773
+ */
1774
+ clear() {
1775
+ this.selectorResultCache.clear(), this.stats.selectorCacheSize = 0, this.stats = {
1776
+ eidHits: 0,
1777
+ eidMisses: 0,
1778
+ selectorHits: 0,
1779
+ selectorMisses: 0,
1780
+ anchorHits: 0,
1781
+ anchorMisses: 0,
1782
+ semanticsHits: 0,
1783
+ semanticsMisses: 0,
1784
+ selectorCacheSize: 0,
1785
+ maxSelectorCacheSize: this.stats.maxSelectorCacheSize
1786
+ };
1787
+ }
1788
+ /**
1789
+ * Invalidate cache for a specific element
1790
+ * Note: WeakMaps don't support deletion, but we can clear selector cache
1791
+ * if needed. This method is mainly for future extensibility.
1792
+ */
1793
+ invalidateElement(t2) {
1794
+ }
1795
+ /**
1796
+ * Invalidate a specific selector from cache
1797
+ */
1798
+ invalidateSelector(t2) {
1799
+ this.selectorResultCache.delete(t2), this.stats.selectorCacheSize = this.selectorResultCache.size;
1800
+ }
1801
+ /**
1802
+ * Get cache statistics
1803
+ */
1804
+ getStats() {
1805
+ return {
1806
+ ...this.stats,
1807
+ selectorCacheSize: this.selectorResultCache.size
1808
+ };
1809
+ }
1810
+ /**
1811
+ * Get cache hit rate for EID cache
1812
+ */
1813
+ getEIDHitRate() {
1814
+ const t2 = this.stats.eidHits + this.stats.eidMisses;
1815
+ return t2 > 0 ? this.stats.eidHits / t2 : 0;
1816
+ }
1817
+ /**
1818
+ * Get cache hit rate for selector cache
1819
+ */
1820
+ getSelectorHitRate() {
1821
+ const t2 = this.stats.selectorHits + this.stats.selectorMisses;
1822
+ return t2 > 0 ? this.stats.selectorHits / t2 : 0;
1823
+ }
1824
+ /**
1825
+ * Get cache hit rate for anchor cache
1826
+ */
1827
+ getAnchorHitRate() {
1828
+ const t2 = this.stats.anchorHits + this.stats.anchorMisses;
1829
+ return t2 > 0 ? this.stats.anchorHits / t2 : 0;
1830
+ }
1831
+ /**
1832
+ * Get cache hit rate for semantics cache
1833
+ */
1834
+ getSemanticsHitRate() {
1835
+ const t2 = this.stats.semanticsHits + this.stats.semanticsMisses;
1836
+ return t2 > 0 ? this.stats.semanticsHits / t2 : 0;
1837
+ }
1838
+ /**
1839
+ * Get overall cache hit rate
1840
+ */
1841
+ getOverallHitRate() {
1842
+ const t2 = this.stats.eidHits + this.stats.selectorHits + this.stats.anchorHits + this.stats.semanticsHits, e2 = this.stats.eidMisses + this.stats.selectorMisses + this.stats.anchorMisses + this.stats.semanticsMisses, s2 = t2 + e2;
1843
+ return s2 > 0 ? t2 / s2 : 0;
1844
+ }
1845
+ }
1846
+ function Ot(n2) {
1847
+ return new Lt(n2);
1848
+ }
1849
+ let O = null;
1850
+ function Z() {
1851
+ return O || (O = Ot()), O;
1852
+ }
1853
+ function Y(n2, t2 = {}) {
1854
+ var _a2;
1855
+ if (!n2 || !n2.ownerDocument || !n2.isConnected)
1856
+ return null;
1857
+ const e2 = { ...ut, ...t2 }, s2 = e2.cache ?? Z(), r2 = s2.getEID(n2);
1858
+ if (r2 !== void 0)
1859
+ return r2;
1860
+ const a2 = new ft(e2, s2), i2 = new xt(e2, s2), o2 = new Pt(e2, s2), l2 = new kt(), u2 = a2.findAnchor(n2);
1861
+ if (!u2 && !e2.fallbackToBody)
1862
+ return null;
1863
+ const d = (u2 == null ? void 0 : u2.element) ?? ((_a2 = n2.ownerDocument) == null ? void 0 : _a2.body) ?? null;
1864
+ if (!d) return null;
1865
+ const c2 = !u2 || u2.tier === "C", h = d.tagName.toLowerCase(), g = d.parentElement;
1866
+ let f2;
1867
+ if (g && h !== "body" && h !== "html") {
1868
+ const T = Array.from(g.children).indexOf(d);
1869
+ T !== -1 && (f2 = T + 1);
1870
+ }
1871
+ const p = o2.extract(d), m = {
1872
+ tag: d.tagName.toLowerCase(),
1873
+ semantics: p,
1874
+ score: (u2 == null ? void 0 : u2.score) ?? I.DEGRADED_SCORE,
1875
+ degraded: c2,
1876
+ nthChild: f2
1877
+ }, b = i2.buildPath(d, n2, o2), y = o2.extract(n2);
1878
+ e2.enableSvgFingerprint && zt(n2) && (y.svg = l2.fingerprint(n2));
1879
+ const v2 = n2.parentElement;
1880
+ let A;
1881
+ if (v2) {
1882
+ const T = Array.from(v2.children).indexOf(n2);
1883
+ T !== -1 && (A = T + 1);
1884
+ }
1885
+ const S = {
1886
+ tag: n2.tagName.toLowerCase(),
1887
+ semantics: y,
1888
+ score: o2.scoreElement(n2),
1889
+ nthChild: A
1890
+ }, $ = [], M = {
1891
+ onMultiple: "best-score",
1892
+ onMissing: "anchor-only",
1893
+ maxDepth: 3
1894
+ }, H = m.degraded || b.degraded, E = Ut(m.degraded, b), x2 = {
1895
+ version: "1.0",
1896
+ anchor: m,
1897
+ path: b.path,
1898
+ target: S,
1899
+ constraints: $,
1900
+ fallback: M,
1901
+ meta: {
1902
+ confidence: 0,
1903
+ // Calculated below
1904
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
1905
+ generator: "dom-eid@1.0",
1906
+ source: e2.source,
1907
+ degraded: H,
1908
+ degradationReason: E
1909
+ }
1910
+ };
1911
+ return x2.meta.confidence = _t(x2), x2.meta.confidence < e2.confidenceThreshold ? null : (s2.setEID(n2, x2), x2);
1912
+ }
1913
+ function zt(n2) {
1914
+ return n2.namespaceURI === "http://www.w3.org/2000/svg" || n2.tagName.toLowerCase() === "svg" || n2 instanceof SVGElement;
1915
+ }
1916
+ function Ut(n2, t2) {
1917
+ if (n2 && t2.degraded)
1918
+ return "anchor-and-path-degraded";
1919
+ if (n2)
1920
+ return "no-semantic-anchor";
1921
+ if (t2.degraded)
1922
+ return t2.degradationReason;
1923
+ }
1924
+ const rt = {
1925
+ maxClasses: 2,
1926
+ maxAttributes: 5,
1927
+ includeText: true,
1928
+ maxTextLength: 50,
1929
+ simplifyTarget: true,
1930
+ includeConstraints: true
1931
+ };
1932
+ function et(n2) {
1933
+ return n2 === "id" ? 101 : w[n2] !== void 0 ? w[n2] : n2.startsWith("data-") ? w["data-*"] : n2.startsWith("aria-") ? w["aria-*"] : 0;
1934
+ }
1935
+ function Vt(n2) {
1936
+ return ["id", "data-testid", "data-qa", "data-cy", "href", "text", "role"].includes(n2);
1937
+ }
1938
+ function Qt(n2) {
1939
+ return !!(/@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/.test(n2) || /(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}/.test(n2) || /\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}/.test(n2));
1940
+ }
1941
+ function Zt(n2, t2) {
1942
+ const e2 = { ...rt, ...t2 }, s2 = `v${n2.version}`, r2 = U(n2.anchor, false, e2), a2 = n2.path.length > 0 ? n2.path.map((l2) => U(l2, false, e2)).join(" > ") + " > " : "", i2 = U(n2.target, true, e2), o2 = e2.includeConstraints ? Xt(n2) : "";
1943
+ return `${s2}: ${r2} :: ${a2}${i2}${o2}`;
1944
+ }
1945
+ function U(n2, t2 = false, e2 = rt) {
1946
+ const { tag: s2, semantics: r2 } = n2;
1947
+ let a2 = s2;
1948
+ const i2 = [], o2 = { ...r2.attributes };
1949
+ r2.id && (o2.id = r2.id), r2.role && !o2.role && (o2.role = r2.role);
1950
+ const l2 = Object.entries(o2).map(([c2, h]) => {
1951
+ const g = et(c2), f2 = c2 === "href" || c2 === "src" ? k(c2, h) : h;
1952
+ return { name: c2, value: f2, priority: g };
1953
+ }).filter((c2) => c2.name !== "id" && c2.name !== "class" && B.has(c2.name) || G.has(c2.name) && V(c2.value) ? false : c2.priority > 0 || c2.name === "role" || c2.name === "id");
1954
+ l2.sort((c2, h) => h.priority - c2.priority);
1955
+ const u2 = l2.slice(0, e2.maxAttributes);
1956
+ u2.sort((c2, h) => c2.name.localeCompare(h.name));
1957
+ for (const { name: c2, value: h } of u2)
1958
+ i2.push(`${c2}="${j(h)}"`);
1959
+ if (e2.includeText && r2.text && !Qt(r2.text.normalized)) {
1960
+ const c2 = r2.text.normalized;
1961
+ c2.length > 0 && c2.length <= e2.maxTextLength && i2.push(`text="${j(c2)}"`);
1962
+ }
1963
+ let d = i2;
1964
+ if (i2.length > 0 && (t2 && e2.simplifyTarget && r2.id && (d = i2.filter((c2) => {
1965
+ const h = c2.split("=")[0];
1966
+ return et(h) >= 60 || h === "text" || h === "id" || h === "role";
1967
+ })), d.length > 0 && d.sort((c2, h) => c2.localeCompare(h))), r2.classes && r2.classes.length > 0) {
1968
+ const c2 = N(r2.classes), h = !!r2.id || i2.some(
1969
+ (f2) => f2.startsWith("href=") || f2.startsWith("data-testid=") || f2.startsWith("text=") || f2.startsWith("role=")
1970
+ );
1971
+ if (!(t2 && e2.simplifyTarget && h) && c2.length > 0) {
1972
+ const f2 = c2.sort().slice(0, e2.maxClasses);
1973
+ a2 += f2.map((p) => `.${p}`).join("");
1974
+ }
1975
+ }
1976
+ if (d.length > 0 && (a2 += `[${d.join(",")}]`), "nthChild" in n2 && n2.nthChild) {
1977
+ const c2 = !!r2.id || r2.attributes && Object.keys(r2.attributes).some(Vt);
1978
+ t2 && e2.simplifyTarget && c2 || (a2 += `#${n2.nthChild}`);
1979
+ }
1980
+ return a2;
1981
+ }
1982
+ function Xt(n2) {
1983
+ if (!n2.constraints || n2.constraints.length === 0)
1984
+ return "";
1985
+ const t2 = [];
1986
+ for (const e2 of n2.constraints)
1987
+ switch (e2.type) {
1988
+ case "uniqueness":
1989
+ t2.push("unique=true");
1990
+ break;
1991
+ case "position":
1992
+ e2.params && e2.params.strategy && t2.push(`pos=${e2.params.strategy}`);
1993
+ break;
1994
+ case "text-proximity":
1995
+ if (e2.params && e2.params.reference) {
1996
+ const s2 = j(String(e2.params.reference));
1997
+ t2.push(`text="${s2}"`);
1998
+ }
1999
+ break;
2000
+ }
2001
+ return t2.length === 0 ? "" : ` {${t2.join(",")}}`;
2002
+ }
2003
+ function j(n2) {
2004
+ return n2.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/>/g, "\\>").replace(/:/g, "\\:");
2005
+ }
2006
+ function le(n2, t2, e2) {
2007
+ const s2 = Y(n2, t2);
2008
+ return s2 ? Zt(s2, e2) : null;
2009
+ }
831
2010
  let _id = 1;
832
2011
  const tagNameRegex = new RegExp("[^a-z0-9-_:]");
833
2012
  const IGNORED_NODE = -2;
@@ -949,6 +2128,7 @@ function ignoreAttribute(tagName, name, _value) {
949
2128
  return (tagName === "video" || tagName === "audio") && name === "autoplay";
950
2129
  }
951
2130
  function isExcludeAttribute(name, exclude) {
2131
+ if (!exclude) return false;
952
2132
  return typeof exclude === "string" ? name.includes(exclude) : exclude.test(name);
953
2133
  }
954
2134
  function _isBlockedElement(element, blockClass, blockSelector) {
@@ -1445,7 +2625,8 @@ function serializeNodeWithId(n2, options) {
1445
2625
  stylesheetLoadTimeout = 5e3,
1446
2626
  keepIframeSrcFn = () => false,
1447
2627
  newlyAddedElement = false,
1448
- cssCaptured = false
2628
+ cssCaptured = false,
2629
+ selectorOptions
1449
2630
  } = options;
1450
2631
  let { needsMask } = options;
1451
2632
  let { preserveWhiteSpace = true } = options;
@@ -1490,11 +2671,20 @@ function serializeNodeWithId(n2, options) {
1490
2671
  }
1491
2672
  const serializedNode = Object.assign(_serializedNode, { id });
1492
2673
  if (isElement(n2) || n2.nodeType === Node.TEXT_NODE) {
1493
- serializedNode.xpath = buildXPath(n2);
1494
- if (isElement(n2)) {
1495
- const selector = buildSelector(n2);
1496
- if (selector) {
1497
- serializedNode.selector = selector;
2674
+ if (isElement(n2) && selectorOptions !== null && selectorOptions !== void 0) {
2675
+ try {
2676
+ const seqlGeneratorOptions = {
2677
+ maxPathDepth: selectorOptions.maxPathDepth,
2678
+ enableSvgFingerprint: selectorOptions.enableSvgFingerprint,
2679
+ confidenceThreshold: selectorOptions.confidenceThreshold,
2680
+ fallbackToBody: selectorOptions.fallbackToBody
2681
+ };
2682
+ const selector = le(n2, seqlGeneratorOptions);
2683
+ if (selector) {
2684
+ serializedNode.selector = selector;
2685
+ }
2686
+ } catch (error) {
2687
+ console.warn("Failed to generate SEQL selector:", error);
1498
2688
  }
1499
2689
  }
1500
2690
  if (n2.nodeType === Node.TEXT_NODE) {
@@ -1549,7 +2739,8 @@ function serializeNodeWithId(n2, options) {
1549
2739
  onStylesheetLoad,
1550
2740
  stylesheetLoadTimeout,
1551
2741
  keepIframeSrcFn,
1552
- cssCaptured: false
2742
+ cssCaptured: false,
2743
+ selectorOptions
1553
2744
  };
1554
2745
  if (serializedNode.type === NodeType$3.Element && serializedNode.tagName === "textarea" && serializedNode.attributes.value !== void 0) ;
1555
2746
  else {
@@ -1608,7 +2799,8 @@ function serializeNodeWithId(n2, options) {
1608
2799
  iframeLoadTimeout,
1609
2800
  onStylesheetLoad,
1610
2801
  stylesheetLoadTimeout,
1611
- keepIframeSrcFn
2802
+ keepIframeSrcFn,
2803
+ selectorOptions
1612
2804
  });
1613
2805
  if (serializedIframeNode) {
1614
2806
  onIframeLoad(
@@ -1650,7 +2842,8 @@ function serializeNodeWithId(n2, options) {
1650
2842
  iframeLoadTimeout,
1651
2843
  onStylesheetLoad,
1652
2844
  stylesheetLoadTimeout,
1653
- keepIframeSrcFn
2845
+ keepIframeSrcFn,
2846
+ selectorOptions
1654
2847
  });
1655
2848
  if (serializedLinkNode) {
1656
2849
  onStylesheetLoad(
@@ -1687,7 +2880,8 @@ function snapshot(n2, options) {
1687
2880
  iframeLoadTimeout,
1688
2881
  onStylesheetLoad,
1689
2882
  stylesheetLoadTimeout,
1690
- keepIframeSrcFn = () => false
2883
+ keepIframeSrcFn = () => false,
2884
+ selector
1691
2885
  } = options || {};
1692
2886
  const maskInputOptions = maskAllInputs === true ? {
1693
2887
  color: true,
@@ -1725,6 +2919,22 @@ function snapshot(n2, options) {
1725
2919
  headMetaVerification: true
1726
2920
  }
1727
2921
  ) : slimDOM === false ? {} : slimDOM;
2922
+ const selectorOptions = selector === false ? null : selector === true ? {
2923
+ maxPathDepth: 10,
2924
+ enableSvgFingerprint: true,
2925
+ confidenceThreshold: 0.3,
2926
+ fallbackToBody: true
2927
+ } : selector === void 0 ? {
2928
+ maxPathDepth: 10,
2929
+ enableSvgFingerprint: true,
2930
+ confidenceThreshold: 0.3,
2931
+ fallbackToBody: true
2932
+ } : {
2933
+ maxPathDepth: selector.maxPathDepth ?? 10,
2934
+ enableSvgFingerprint: selector.enableSvgFingerprint ?? true,
2935
+ confidenceThreshold: selector.confidenceThreshold ?? 0.3,
2936
+ fallbackToBody: selector.fallbackToBody ?? true
2937
+ };
1728
2938
  return serializeNodeWithId(n2, {
1729
2939
  doc: n2,
1730
2940
  mirror: mirror2,
@@ -1749,7 +2959,8 @@ function snapshot(n2, options) {
1749
2959
  onStylesheetLoad,
1750
2960
  stylesheetLoadTimeout,
1751
2961
  keepIframeSrcFn,
1752
- newlyAddedElement: false
2962
+ newlyAddedElement: false,
2963
+ selectorOptions
1753
2964
  });
1754
2965
  }
1755
2966
  const MEDIA_SELECTOR = /(max|min)-device-(width|height)/;
@@ -1786,6 +2997,33 @@ const pseudoClassPlugin = {
1786
2997
  };
1787
2998
  }
1788
2999
  };
3000
+ const animationFillModePlugin = {
3001
+ postcssPlugin: "postcss-animation-fill-mode",
3002
+ prepare: function() {
3003
+ return {
3004
+ Rule: function(rule2) {
3005
+ let hasAnimation = false;
3006
+ let hasAnimationFillMode = false;
3007
+ let animationDeclaration = null;
3008
+ rule2.walkDecls((decl) => {
3009
+ if (decl.prop === "animation") {
3010
+ hasAnimation = true;
3011
+ animationDeclaration = decl;
3012
+ }
3013
+ if (decl.prop === "animation-fill-mode") {
3014
+ hasAnimationFillMode = true;
3015
+ }
3016
+ });
3017
+ if (hasAnimation && !hasAnimationFillMode && animationDeclaration) {
3018
+ rule2.insertAfter(animationDeclaration, {
3019
+ prop: "animation-fill-mode",
3020
+ value: "forwards"
3021
+ });
3022
+ }
3023
+ }
3024
+ };
3025
+ }
3026
+ };
1789
3027
  function getDefaultExportFromCjs$1(x2) {
1790
3028
  return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2;
1791
3029
  }
@@ -1802,12 +3040,12 @@ function getAugmentedNamespace$1(n2) {
1802
3040
  a2.prototype = f2.prototype;
1803
3041
  } else a2 = {};
1804
3042
  Object.defineProperty(a2, "__esModule", { value: true });
1805
- Object.keys(n2).forEach(function(k) {
1806
- var d = Object.getOwnPropertyDescriptor(n2, k);
1807
- Object.defineProperty(a2, k, d.get ? d : {
3043
+ Object.keys(n2).forEach(function(k2) {
3044
+ var d = Object.getOwnPropertyDescriptor(n2, k2);
3045
+ Object.defineProperty(a2, k2, d.get ? d : {
1808
3046
  enumerable: true,
1809
3047
  get: function() {
1810
- return n2[k];
3048
+ return n2[k2];
1811
3049
  }
1812
3050
  });
1813
3051
  });
@@ -2231,7 +3469,7 @@ function cloneNode$1(obj, parent) {
2231
3469
  } else if (i2 === "source") {
2232
3470
  cloned[i2] = value;
2233
3471
  } else if (Array.isArray(value)) {
2234
- cloned[i2] = value.map((j) => cloneNode$1(j, cloned));
3472
+ cloned[i2] = value.map((j2) => cloneNode$1(j2, cloned));
2235
3473
  } else {
2236
3474
  if (type === "object" && value !== null) value = cloneNode$1(value);
2237
3475
  cloned[i2] = value;
@@ -2466,7 +3704,7 @@ let Node$5$1 = class Node2 {
2466
3704
  }
2467
3705
  return result2;
2468
3706
  }
2469
- toJSON(_, inputs) {
3707
+ toJSON(_2, inputs) {
2470
3708
  let fixed = {};
2471
3709
  let emitInputs = inputs == null;
2472
3710
  inputs = inputs || /* @__PURE__ */ new Map();
@@ -4111,8 +5349,8 @@ let Parser$1$1 = class Parser {
4111
5349
  if (colon === false) return;
4112
5350
  let founded = 0;
4113
5351
  let token;
4114
- for (let j = colon - 1; j >= 0; j--) {
4115
- token = tokens[j];
5352
+ for (let j2 = colon - 1; j2 >= 0; j2--) {
5353
+ token = tokens[j2];
4116
5354
  if (token[0] !== "space") {
4117
5355
  founded += 1;
4118
5356
  if (founded === 2) break;
@@ -4230,8 +5468,8 @@ let Parser$1$1 = class Parser {
4230
5468
  } else if (token[1].toLowerCase() === "important") {
4231
5469
  let cache = tokens.slice(0);
4232
5470
  let str = "";
4233
- for (let j = i2; j > 0; j--) {
4234
- let type = cache[j][0];
5471
+ for (let j2 = i2; j2 > 0; j2--) {
5472
+ let type = cache[j2][0];
4235
5473
  if (str.trim().indexOf("!") === 0 && type !== "space") {
4236
5474
  break;
4237
5475
  }
@@ -5389,7 +6627,8 @@ function adaptCssForReplay(cssText, cache) {
5389
6627
  try {
5390
6628
  const ast = postcss$1$1([
5391
6629
  mediaSelectorPlugin,
5392
- pseudoClassPlugin
6630
+ pseudoClassPlugin,
6631
+ animationFillModePlugin
5393
6632
  ]).process(cssText);
5394
6633
  result2 = ast.css;
5395
6634
  } catch (error) {
@@ -5914,12 +7153,12 @@ function getAugmentedNamespace(n2) {
5914
7153
  a2.prototype = f2.prototype;
5915
7154
  } else a2 = {};
5916
7155
  Object.defineProperty(a2, "__esModule", { value: true });
5917
- Object.keys(n2).forEach(function(k) {
5918
- var d = Object.getOwnPropertyDescriptor(n2, k);
5919
- Object.defineProperty(a2, k, d.get ? d : {
7156
+ Object.keys(n2).forEach(function(k2) {
7157
+ var d = Object.getOwnPropertyDescriptor(n2, k2);
7158
+ Object.defineProperty(a2, k2, d.get ? d : {
5920
7159
  enumerable: true,
5921
7160
  get: function() {
5922
- return n2[k];
7161
+ return n2[k2];
5923
7162
  }
5924
7163
  });
5925
7164
  });
@@ -6343,7 +7582,7 @@ function cloneNode(obj, parent) {
6343
7582
  } else if (i2 === "source") {
6344
7583
  cloned[i2] = value;
6345
7584
  } else if (Array.isArray(value)) {
6346
- cloned[i2] = value.map((j) => cloneNode(j, cloned));
7585
+ cloned[i2] = value.map((j2) => cloneNode(j2, cloned));
6347
7586
  } else {
6348
7587
  if (type === "object" && value !== null) value = cloneNode(value);
6349
7588
  cloned[i2] = value;
@@ -6578,7 +7817,7 @@ let Node$5 = class Node22 {
6578
7817
  }
6579
7818
  return result2;
6580
7819
  }
6581
- toJSON(_, inputs) {
7820
+ toJSON(_2, inputs) {
6582
7821
  let fixed = {};
6583
7822
  let emitInputs = inputs == null;
6584
7823
  inputs = inputs || /* @__PURE__ */ new Map();
@@ -8223,8 +9462,8 @@ let Parser$1 = class Parser2 {
8223
9462
  if (colon === false) return;
8224
9463
  let founded = 0;
8225
9464
  let token;
8226
- for (let j = colon - 1; j >= 0; j--) {
8227
- token = tokens[j];
9465
+ for (let j2 = colon - 1; j2 >= 0; j2--) {
9466
+ token = tokens[j2];
8228
9467
  if (token[0] !== "space") {
8229
9468
  founded += 1;
8230
9469
  if (founded === 2) break;
@@ -8342,8 +9581,8 @@ let Parser$1 = class Parser2 {
8342
9581
  } else if (token[1].toLowerCase() === "important") {
8343
9582
  let cache = tokens.slice(0);
8344
9583
  let str = "";
8345
- for (let j = i2; j > 0; j--) {
8346
- let type = cache[j][0];
9584
+ for (let j2 = i2; j2 > 0; j2--) {
9585
+ let type = cache[j2][0];
8347
9586
  if (str.trim().indexOf("!") === 0 && type !== "space") {
8348
9587
  break;
8349
9588
  }
@@ -9483,7 +10722,7 @@ const camelizeRE = /-([a-z])/g;
9483
10722
  const CUSTOM_PROPERTY_REGEX = /^--[a-zA-Z0-9-]+$/;
9484
10723
  const camelize = (str) => {
9485
10724
  if (CUSTOM_PROPERTY_REGEX.test(str)) return str;
9486
- return str.replace(camelizeRE, (_, c2) => c2 ? c2.toUpperCase() : "");
10725
+ return str.replace(camelizeRE, (_2, c2) => c2 ? c2.toUpperCase() : "");
9487
10726
  };
9488
10727
  const hyphenateRE = /\B([A-Z])/g;
9489
10728
  const hyphenate = (str) => {
@@ -14536,7 +15775,7 @@ class VisibilityManager {
14536
15775
  }
14537
15776
  }
14538
15777
  }
14539
- const version$1 = "2.1.3-alpha.3";
15778
+ const version$1 = "3.1.1-alpha.1";
14540
15779
  let wrappedEmit;
14541
15780
  let takeFullSnapshot$1;
14542
15781
  let canvasManager;
@@ -14698,13 +15937,27 @@ function record(options = {}) {
14698
15937
  }
14699
15938
  return e2;
14700
15939
  };
15940
+ let lastMetaHref = null;
15941
+ let navSnapshotInProgress = false;
14701
15942
  wrappedEmit = (r2, isCheckout) => {
14702
- var _a2;
15943
+ var _a2, _b;
14703
15944
  const e2 = r2;
14704
15945
  e2.timestamp = nowTimestamp();
15946
+ let navTriggeredFS = false;
14705
15947
  if (((_a2 = mutationBuffers[0]) == null ? void 0 : _a2.isFrozen()) && e2.type !== EventType.FullSnapshot && !(e2.type === EventType.IncrementalSnapshot && e2.data.source === IncrementalSource.Mutation)) {
14706
15948
  mutationBuffers.forEach((buf) => buf.unfreeze());
14707
15949
  }
15950
+ if (!navSnapshotInProgress && e2.type !== EventType.Meta && e2.type !== EventType.FullSnapshot && lastMetaHref && window.location.href !== lastMetaHref) {
15951
+ navSnapshotInProgress = true;
15952
+ try {
15953
+ recentVisibilityChanges = 0;
15954
+ incrementalSnapshotCount = 0;
15955
+ navTriggeredFS = true;
15956
+ takeFullSnapshot$1(true);
15957
+ } finally {
15958
+ navSnapshotInProgress = false;
15959
+ }
15960
+ }
14708
15961
  if (inEmittingFrame) {
14709
15962
  emit == null ? void 0 : emit(eventProcessor(e2), isCheckout);
14710
15963
  } else if (passEmitsToParent) {
@@ -14716,6 +15969,9 @@ function record(options = {}) {
14716
15969
  };
14717
15970
  window.parent.postMessage(message, "*");
14718
15971
  }
15972
+ if (e2.type === EventType.Meta) {
15973
+ lastMetaHref = ((_b = e2.data) == null ? void 0 : _b.href) || window.location.href;
15974
+ }
14719
15975
  if (e2.type === EventType.FullSnapshot) {
14720
15976
  lastFullSnapshotEvent = e2;
14721
15977
  incrementalSnapshotCount = 0;
@@ -14724,14 +15980,16 @@ function record(options = {}) {
14724
15980
  return;
14725
15981
  }
14726
15982
  incrementalSnapshotCount++;
14727
- const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;
14728
- const exceedTime = checkoutEveryNms && e2.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;
14729
- const exceedVisibility = checkoutEveryNvm && recentVisibilityChanges >= checkoutEveryNvm;
14730
- if (exceedCount || exceedTime || exceedVisibility) {
14731
- if (exceedVisibility) {
14732
- recentVisibilityChanges = 0;
15983
+ if (!navTriggeredFS) {
15984
+ const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;
15985
+ const exceedTime = checkoutEveryNms && e2.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;
15986
+ const exceedVisibility = checkoutEveryNvm && recentVisibilityChanges >= checkoutEveryNvm;
15987
+ if (exceedCount || exceedTime || exceedVisibility) {
15988
+ if (exceedVisibility) {
15989
+ recentVisibilityChanges = 0;
15990
+ }
15991
+ takeFullSnapshot$1(true);
14733
15992
  }
14734
- takeFullSnapshot$1(true);
14735
15993
  }
14736
15994
  }
14737
15995
  };
@@ -15170,30 +16428,30 @@ const mittProxy = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
15170
16428
  __proto__: null,
15171
16429
  default: mitt$1
15172
16430
  }, Symbol.toStringTag, { value: "Module" }));
15173
- function polyfill(w = window, d = document) {
15174
- if ("scrollBehavior" in d.documentElement.style && w.__forceSmoothScrollPolyfill__ !== true) {
16431
+ function polyfill(w2 = window, d = document) {
16432
+ if ("scrollBehavior" in d.documentElement.style && w2.__forceSmoothScrollPolyfill__ !== true) {
15175
16433
  return;
15176
16434
  }
15177
- const Element2 = w.HTMLElement || w.Element;
16435
+ const Element2 = w2.HTMLElement || w2.Element;
15178
16436
  const SCROLL_TIME = 468;
15179
16437
  const original = {
15180
- scroll: w.scroll || w.scrollTo,
15181
- scrollBy: w.scrollBy,
16438
+ scroll: w2.scroll || w2.scrollTo,
16439
+ scrollBy: w2.scrollBy,
15182
16440
  elementScroll: Element2.prototype.scroll || scrollElement,
15183
16441
  scrollIntoView: Element2.prototype.scrollIntoView
15184
16442
  };
15185
- const now = w.performance && w.performance.now ? w.performance.now.bind(w.performance) : Date.now;
16443
+ const now = w2.performance && w2.performance.now ? w2.performance.now.bind(w2.performance) : Date.now;
15186
16444
  function isMicrosoftBrowser(userAgent) {
15187
16445
  const userAgentPatterns = ["MSIE ", "Trident/", "Edge/"];
15188
16446
  return new RegExp(userAgentPatterns.join("|")).test(userAgent);
15189
16447
  }
15190
- const ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;
16448
+ const ROUNDING_TOLERANCE = isMicrosoftBrowser(w2.navigator.userAgent) ? 1 : 0;
15191
16449
  function scrollElement(x2, y) {
15192
16450
  this.scrollLeft = x2;
15193
16451
  this.scrollTop = y;
15194
16452
  }
15195
- function ease(k) {
15196
- return 0.5 * (1 - Math.cos(Math.PI * k));
16453
+ function ease(k2) {
16454
+ return 0.5 * (1 - Math.cos(Math.PI * k2));
15197
16455
  }
15198
16456
  function shouldBailOut(firstArg) {
15199
16457
  if (firstArg === null || typeof firstArg !== "object" || firstArg.behavior === void 0 || firstArg.behavior === "auto" || firstArg.behavior === "instant") {
@@ -15215,7 +16473,7 @@ function polyfill(w = window, d = document) {
15215
16473
  }
15216
16474
  }
15217
16475
  function canOverflow(el, axis) {
15218
- const overflowValue = w.getComputedStyle(el, null)["overflow" + axis];
16476
+ const overflowValue = w2.getComputedStyle(el, null)["overflow" + axis];
15219
16477
  return overflowValue === "auto" || overflowValue === "scroll";
15220
16478
  }
15221
16479
  function isScrollable(el) {
@@ -15241,7 +16499,7 @@ function polyfill(w = window, d = document) {
15241
16499
  currentY = context.startY + (context.y - context.startY) * value;
15242
16500
  context.method.call(context.scrollable, currentX, currentY);
15243
16501
  if (currentX !== context.x || currentY !== context.y) {
15244
- w.requestAnimationFrame(step.bind(w, context));
16502
+ w2.requestAnimationFrame(step.bind(w2, context));
15245
16503
  }
15246
16504
  }
15247
16505
  function smoothScroll(el, x2, y) {
@@ -15251,9 +16509,9 @@ function polyfill(w = window, d = document) {
15251
16509
  let method;
15252
16510
  const startTime = now();
15253
16511
  if (el === d.body) {
15254
- scrollable = w;
15255
- startX = w.scrollX || w.pageXOffset;
15256
- startY = w.scrollY || w.pageYOffset;
16512
+ scrollable = w2;
16513
+ startX = w2.scrollX || w2.pageXOffset;
16514
+ startY = w2.scrollY || w2.pageYOffset;
15257
16515
  method = original.scroll;
15258
16516
  } else {
15259
16517
  scrollable = el;
@@ -15271,43 +16529,43 @@ function polyfill(w = window, d = document) {
15271
16529
  y
15272
16530
  });
15273
16531
  }
15274
- w.scroll = w.scrollTo = function() {
16532
+ w2.scroll = w2.scrollTo = function() {
15275
16533
  if (arguments[0] === void 0) {
15276
16534
  return;
15277
16535
  }
15278
16536
  if (shouldBailOut(arguments[0]) === true) {
15279
16537
  original.scroll.call(
15280
- w,
15281
- arguments[0].left !== void 0 ? arguments[0].left : typeof arguments[0] !== "object" ? arguments[0] : w.scrollX || w.pageXOffset,
16538
+ w2,
16539
+ arguments[0].left !== void 0 ? arguments[0].left : typeof arguments[0] !== "object" ? arguments[0] : w2.scrollX || w2.pageXOffset,
15282
16540
  // use top prop, second argument if present or fallback to scrollY
15283
- arguments[0].top !== void 0 ? arguments[0].top : arguments[1] !== void 0 ? arguments[1] : w.scrollY || w.pageYOffset
16541
+ arguments[0].top !== void 0 ? arguments[0].top : arguments[1] !== void 0 ? arguments[1] : w2.scrollY || w2.pageYOffset
15284
16542
  );
15285
16543
  return;
15286
16544
  }
15287
16545
  smoothScroll.call(
15288
- w,
16546
+ w2,
15289
16547
  d.body,
15290
- arguments[0].left !== void 0 ? ~~arguments[0].left : w.scrollX || w.pageXOffset,
15291
- arguments[0].top !== void 0 ? ~~arguments[0].top : w.scrollY || w.pageYOffset
16548
+ arguments[0].left !== void 0 ? ~~arguments[0].left : w2.scrollX || w2.pageXOffset,
16549
+ arguments[0].top !== void 0 ? ~~arguments[0].top : w2.scrollY || w2.pageYOffset
15292
16550
  );
15293
16551
  };
15294
- w.scrollBy = function() {
16552
+ w2.scrollBy = function() {
15295
16553
  if (arguments[0] === void 0) {
15296
16554
  return;
15297
16555
  }
15298
16556
  if (shouldBailOut(arguments[0])) {
15299
16557
  original.scrollBy.call(
15300
- w,
16558
+ w2,
15301
16559
  arguments[0].left !== void 0 ? arguments[0].left : typeof arguments[0] !== "object" ? arguments[0] : 0,
15302
16560
  arguments[0].top !== void 0 ? arguments[0].top : arguments[1] !== void 0 ? arguments[1] : 0
15303
16561
  );
15304
16562
  return;
15305
16563
  }
15306
16564
  smoothScroll.call(
15307
- w,
16565
+ w2,
15308
16566
  d.body,
15309
- ~~arguments[0].left + (w.scrollX || w.pageXOffset),
15310
- ~~arguments[0].top + (w.scrollY || w.pageYOffset)
16567
+ ~~arguments[0].left + (w2.scrollX || w2.pageXOffset),
16568
+ ~~arguments[0].top + (w2.scrollY || w2.pageYOffset)
15311
16569
  );
15312
16570
  };
15313
16571
  Element2.prototype.scroll = Element2.prototype.scrollTo = function() {
@@ -15372,15 +16630,15 @@ function polyfill(w = window, d = document) {
15372
16630
  scrollableParent.scrollLeft + clientRects.left - parentRects.left,
15373
16631
  scrollableParent.scrollTop + clientRects.top - parentRects.top
15374
16632
  );
15375
- if (w.getComputedStyle(scrollableParent).position !== "fixed") {
15376
- w.scrollBy({
16633
+ if (w2.getComputedStyle(scrollableParent).position !== "fixed") {
16634
+ w2.scrollBy({
15377
16635
  left: parentRects.left,
15378
16636
  top: parentRects.top,
15379
16637
  behavior: "smooth"
15380
16638
  });
15381
16639
  }
15382
16640
  } else {
15383
- w.scrollBy({
16641
+ w2.scrollBy({
15384
16642
  left: clientRects.left,
15385
16643
  top: clientRects.top,
15386
16644
  behavior: "smooth"
@@ -15566,16 +16824,16 @@ function s(n2, o2) {
15566
16824
  }(m), b = h.next(); !b.done; b = h.next()) {
15567
16825
  var S = b.value;
15568
16826
  if (void 0 === S) return c(p, g);
15569
- var w = "string" == typeof S ? { target: S } : S, j = w.target, E = w.actions, R = void 0 === E ? [] : E, N = w.cond, O = void 0 === N ? function() {
16827
+ var w2 = "string" == typeof S ? { target: S } : S, j2 = w2.target, E = w2.actions, R = void 0 === E ? [] : E, N2 = w2.cond, O2 = void 0 === N2 ? function() {
15570
16828
  return true;
15571
- } : N, _ = void 0 === j, k = null != j ? j : p, T = n2.states[k];
15572
- if (O(g, d)) {
15573
- var q = t(f((_ ? r(R) : [].concat(x2.exit, R, T.entry).filter(function(t2) {
16829
+ } : N2, _2 = void 0 === j2, k2 = null != j2 ? j2 : p, T = n2.states[k2];
16830
+ if (O2(g, d)) {
16831
+ var q2 = t(f((_2 ? r(R) : [].concat(x2.exit, R, T.entry).filter(function(t2) {
15574
16832
  return t2;
15575
16833
  })).map(function(t2) {
15576
16834
  return i(t2, y._options.actions);
15577
- }), g, d), 3), z = q[0], A = q[1], B = q[2], C = null != j ? j : p;
15578
- return { value: C, context: A, actions: z, changed: j !== p || z.length > 0 || B, matches: a(C) };
16835
+ }), g, d), 3), z = q2[0], A = q2[1], B2 = q2[2], C = null != j2 ? j2 : p;
16836
+ return { value: C, context: A, actions: z, changed: j2 !== p || z.length > 0 || B2, matches: a(C) };
15579
16837
  }
15580
16838
  }
15581
16839
  } catch (t2) {
@@ -18035,7 +19293,7 @@ class Replayer {
18035
19293
  this.config.logger.log(REPLAY_CONSOLE_PREFIX, ...args);
18036
19294
  }
18037
19295
  }
18038
- const version = "2.1.3-alpha.3";
19296
+ const version = "3.1.1-alpha.1";
18039
19297
  const { getVersion } = record;
18040
19298
  const { isRecording } = record;
18041
19299
  const { flushCustomEventQueue } = record;