issue-sticker 0.9.1 → 0.11.0

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.
@@ -1,7 +1,7 @@
1
- import { t as getCanvasSource, v as onCanvasSourceRegistered, C as CANVAS_INTERACTION_TAG, w as gzip_1, R as REPLAY_EVENT_TYPE, x as record, a as cn, p as useCallbackRef$1, i as useComposedRefs, f as Primitive, P as Presence, j as Portal$1, g as composeEventHandlers, k as createContextScope, l as createSlot, D as DismissableLayer, y as Content, z as createPopperScope, m as useControllableState, A as Root2$1, n as useId, B as Anchor, E as Arrow, d as usePortalContainer, e as OVERLAY_LAYER, s as stopEscapePropagation, o as useLayoutEffect2, V as VISUALLY_HIDDEN_STYLES, c as createLucideIcon, F as clsx, S as Slot$2, O as OVERLAY_LAYER_INDEX, M as MousePointer2 } from "./three-_bdgDAmI.js";
1
+ import { t as getCanvasSource, v as onCanvasSourceRegistered, C as CANVAS_INTERACTION_TAG, w as gzip_1, R as REPLAY_EVENT_TYPE, x as record, a as cn, p as useCallbackRef$1, i as useComposedRefs, f as Primitive, P as Presence, j as Portal$1, g as composeEventHandlers, k as createContextScope, l as createSlot, D as DismissableLayer, y as Content, z as createPopperScope, A as Anchor, m as useControllableState, B as Root2$1, n as useId, E as Arrow, d as usePortalContainer, e as OVERLAY_LAYER, s as stopEscapePropagation, o as useLayoutEffect2, V as VISUALLY_HIDDEN_STYLES, c as createLucideIcon, F as clsx, S as Slot$2, O as OVERLAY_LAYER_INDEX, M as MousePointer2 } from "./three-DQdLNs7v.js";
2
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import React__default, { useState, createContext, useContext, useCallback, useRef, useLayoutEffect, useEffect, useMemo } from "react";
4
+ import React__default, { useState, useRef, useEffect, useCallback, createContext, useContext, useLayoutEffect, useMemo } from "react";
5
5
  import * as ReactDOM from "react-dom";
6
6
  const DEFAULT_MAX_DURATION_MS = 12e4;
7
7
  const MIME_TYPE_CANDIDATES = ["video/webm;codecs=vp9", "video/webm"];
@@ -894,7 +894,7 @@ function settleFrame() {
894
894
  async function resolveNodeId(canvas) {
895
895
  var _a;
896
896
  try {
897
- const { record: record2 } = await import("./three-_bdgDAmI.js").then((n) => n.I);
897
+ const { record: record2 } = await import("./three-DQdLNs7v.js").then((n) => n.I);
898
898
  const id = (_a = record2.mirror) == null ? void 0 : _a.getId(canvas);
899
899
  return typeof id === "number" && id > 0 ? id : null;
900
900
  } catch {
@@ -913,7 +913,7 @@ function startCanvasInteractionTracking(options = {}) {
913
913
  const lastSnapshot = /* @__PURE__ */ new WeakMap();
914
914
  let pending = null;
915
915
  const emit2 = options.emit ?? ((tag, payload) => {
916
- void import("./three-_bdgDAmI.js").then((n) => n.I).then(({ addCustomEvent }) => addCustomEvent(tag, payload));
916
+ void import("./three-DQdLNs7v.js").then((n) => n.I).then(({ addCustomEvent }) => addCustomEvent(tag, payload));
917
917
  });
918
918
  const pointerOf = (started, rect) => [
919
919
  (started.x - rect.left) / rect.width * 2 - 1,
@@ -6169,14 +6169,844 @@ function composeIssueFilterGroups(integrations, customFields) {
6169
6169
  }
6170
6170
  return Array.from(groups.values()).sort((a2, b) => a2.label.localeCompare(b.label));
6171
6171
  }
6172
- const STABLE_ATTR_KEYS = [
6173
- "data-testid",
6174
- "data-test",
6175
- "data-qa",
6176
- "data-cy",
6177
- "name",
6178
- "aria-label"
6179
- ];
6172
+ const IGNORED_NAME = /^(Primitive\.|Slot|Presence|Portal|Fragment|Suspense|StrictMode)|(Provider|Context|Consumer)$/;
6173
+ const MAX_DEPTH = 300;
6174
+ function fiberOf(element) {
6175
+ for (const key of Object.keys(element)) {
6176
+ if (key.startsWith("__reactFiber$") || key.startsWith("__reactInternalInstance$")) {
6177
+ return element[key] ?? null;
6178
+ }
6179
+ }
6180
+ return null;
6181
+ }
6182
+ function nameOf(type) {
6183
+ if (typeof type === "function") {
6184
+ const fn = type;
6185
+ return fn.displayName ?? fn.name ?? null;
6186
+ }
6187
+ if (type && typeof type === "object") {
6188
+ const wrapper = type;
6189
+ return wrapper.displayName ?? nameOf(wrapper.render) ?? nameOf(wrapper.type);
6190
+ }
6191
+ return null;
6192
+ }
6193
+ const reactAdapter = {
6194
+ framework: "react",
6195
+ collect(element) {
6196
+ let fiber = fiberOf(element);
6197
+ if (!fiber) return null;
6198
+ const names = [];
6199
+ for (let depth = 0; fiber && depth < MAX_DEPTH; depth += 1) {
6200
+ const name = nameOf(fiber.type);
6201
+ if (typeof name === "string" && name && !IGNORED_NAME.test(name)) names.unshift(name);
6202
+ fiber = fiber.return;
6203
+ }
6204
+ return names;
6205
+ }
6206
+ };
6207
+ const ADAPTERS = [reactAdapter];
6208
+ const MIN_NAME_LENGTH = 3;
6209
+ const MAX_NAME_LENGTH = 60;
6210
+ function cleanPath(names) {
6211
+ if (!names) return [];
6212
+ const kept = names.filter((name) => typeof name === "string").map(
6213
+ (name) => name.replace(/\s+/g, " ").trim().slice(0, MAX_NAME_LENGTH).replace(/[\uD800-\uDBFF]$/, "")
6214
+ ).filter((name) => name.length >= MIN_NAME_LENGTH);
6215
+ const deduped = kept.filter((name, index) => name !== kept[index - 1]);
6216
+ return deduped.slice(-8);
6217
+ }
6218
+ function collectComponentPath(element, adapters = ADAPTERS) {
6219
+ for (const adapter of adapters) {
6220
+ let path = [];
6221
+ try {
6222
+ path = cleanPath(adapter.collect(element));
6223
+ } catch {
6224
+ path = [];
6225
+ }
6226
+ if (path.length) return { framework: adapter.framework, path };
6227
+ }
6228
+ return null;
6229
+ }
6230
+ var toStr = Object.prototype.toString;
6231
+ function isCallable(fn) {
6232
+ return typeof fn === "function" || toStr.call(fn) === "[object Function]";
6233
+ }
6234
+ function toInteger(value) {
6235
+ var number = Number(value);
6236
+ if (isNaN(number)) {
6237
+ return 0;
6238
+ }
6239
+ if (number === 0 || !isFinite(number)) {
6240
+ return number;
6241
+ }
6242
+ return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
6243
+ }
6244
+ var maxSafeInteger = Math.pow(2, 53) - 1;
6245
+ function toLength(value) {
6246
+ var len = toInteger(value);
6247
+ return Math.min(Math.max(len, 0), maxSafeInteger);
6248
+ }
6249
+ function arrayFrom(arrayLike, mapFn) {
6250
+ var C = Array;
6251
+ var items = Object(arrayLike);
6252
+ if (arrayLike == null) {
6253
+ throw new TypeError("Array.from requires an array-like object - not null or undefined");
6254
+ }
6255
+ var len = toLength(items.length);
6256
+ var A = isCallable(C) ? Object(new C(len)) : new Array(len);
6257
+ var k = 0;
6258
+ var kValue;
6259
+ while (k < len) {
6260
+ kValue = items[k];
6261
+ {
6262
+ A[k] = kValue;
6263
+ }
6264
+ k += 1;
6265
+ }
6266
+ A.length = len;
6267
+ return A;
6268
+ }
6269
+ function _typeof(o2) {
6270
+ "@babel/helpers - typeof";
6271
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o3) {
6272
+ return typeof o3;
6273
+ } : function(o3) {
6274
+ return o3 && "function" == typeof Symbol && o3.constructor === Symbol && o3 !== Symbol.prototype ? "symbol" : typeof o3;
6275
+ }, _typeof(o2);
6276
+ }
6277
+ function _classCallCheck(instance, Constructor) {
6278
+ if (!(instance instanceof Constructor)) {
6279
+ throw new TypeError("Cannot call a class as a function");
6280
+ }
6281
+ }
6282
+ function _defineProperties(target, props) {
6283
+ for (var i2 = 0; i2 < props.length; i2++) {
6284
+ var descriptor = props[i2];
6285
+ descriptor.enumerable = descriptor.enumerable || false;
6286
+ descriptor.configurable = true;
6287
+ if ("value" in descriptor) descriptor.writable = true;
6288
+ Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
6289
+ }
6290
+ }
6291
+ function _createClass(Constructor, protoProps, staticProps) {
6292
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
6293
+ Object.defineProperty(Constructor, "prototype", { writable: false });
6294
+ return Constructor;
6295
+ }
6296
+ function _defineProperty(obj, key, value) {
6297
+ key = _toPropertyKey(key);
6298
+ if (key in obj) {
6299
+ Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
6300
+ } else {
6301
+ obj[key] = value;
6302
+ }
6303
+ return obj;
6304
+ }
6305
+ function _toPropertyKey(t2) {
6306
+ var i2 = _toPrimitive(t2, "string");
6307
+ return "symbol" == _typeof(i2) ? i2 : i2 + "";
6308
+ }
6309
+ function _toPrimitive(t2, r2) {
6310
+ if ("object" != _typeof(t2) || !t2) return t2;
6311
+ var e2 = t2[Symbol.toPrimitive];
6312
+ if (void 0 !== e2) {
6313
+ var i2 = e2.call(t2, r2);
6314
+ if ("object" != _typeof(i2)) return i2;
6315
+ throw new TypeError("@@toPrimitive must return a primitive value.");
6316
+ }
6317
+ return String(t2);
6318
+ }
6319
+ var SetLike = /* @__PURE__ */ (function() {
6320
+ function SetLike2() {
6321
+ var items = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
6322
+ _classCallCheck(this, SetLike2);
6323
+ _defineProperty(this, "items", void 0);
6324
+ this.items = items;
6325
+ }
6326
+ return _createClass(SetLike2, [{
6327
+ key: "add",
6328
+ value: function add(value) {
6329
+ if (this.has(value) === false) {
6330
+ this.items.push(value);
6331
+ }
6332
+ return this;
6333
+ }
6334
+ }, {
6335
+ key: "clear",
6336
+ value: function clear() {
6337
+ this.items = [];
6338
+ }
6339
+ }, {
6340
+ key: "delete",
6341
+ value: function _delete(value) {
6342
+ var previousLength = this.items.length;
6343
+ this.items = this.items.filter(function(item) {
6344
+ return item !== value;
6345
+ });
6346
+ return previousLength !== this.items.length;
6347
+ }
6348
+ }, {
6349
+ key: "forEach",
6350
+ value: function forEach(callbackfn) {
6351
+ var _this = this;
6352
+ this.items.forEach(function(item) {
6353
+ callbackfn(item, item, _this);
6354
+ });
6355
+ }
6356
+ }, {
6357
+ key: "has",
6358
+ value: function has(value) {
6359
+ return this.items.indexOf(value) !== -1;
6360
+ }
6361
+ }, {
6362
+ key: "size",
6363
+ get: function get() {
6364
+ return this.items.length;
6365
+ }
6366
+ }]);
6367
+ })();
6368
+ const SetLike$1 = typeof Set === "undefined" ? Set : SetLike;
6369
+ function getLocalName(element) {
6370
+ var _element$localName;
6371
+ return (
6372
+ // eslint-disable-next-line no-restricted-properties -- actual guard for environments without localName
6373
+ (_element$localName = element.localName) !== null && _element$localName !== void 0 ? _element$localName : (
6374
+ // eslint-disable-next-line no-restricted-properties -- required for the fallback
6375
+ element.tagName.toLowerCase()
6376
+ )
6377
+ );
6378
+ }
6379
+ var localNameToRoleMappings = {
6380
+ article: "article",
6381
+ aside: "complementary",
6382
+ button: "button",
6383
+ datalist: "listbox",
6384
+ dd: "definition",
6385
+ details: "group",
6386
+ dialog: "dialog",
6387
+ dt: "term",
6388
+ fieldset: "group",
6389
+ figure: "figure",
6390
+ // WARNING: Only with an accessible name
6391
+ form: "form",
6392
+ footer: "contentinfo",
6393
+ h1: "heading",
6394
+ h2: "heading",
6395
+ h3: "heading",
6396
+ h4: "heading",
6397
+ h5: "heading",
6398
+ h6: "heading",
6399
+ header: "banner",
6400
+ hr: "separator",
6401
+ html: "document",
6402
+ legend: "legend",
6403
+ li: "listitem",
6404
+ math: "math",
6405
+ main: "main",
6406
+ menu: "list",
6407
+ nav: "navigation",
6408
+ ol: "list",
6409
+ optgroup: "group",
6410
+ // WARNING: Only in certain context
6411
+ option: "option",
6412
+ output: "status",
6413
+ progress: "progressbar",
6414
+ // WARNING: Only with an accessible name
6415
+ section: "region",
6416
+ summary: "button",
6417
+ table: "table",
6418
+ tbody: "rowgroup",
6419
+ textarea: "textbox",
6420
+ tfoot: "rowgroup",
6421
+ // WARNING: Only in certain context
6422
+ td: "cell",
6423
+ th: "columnheader",
6424
+ thead: "rowgroup",
6425
+ tr: "row",
6426
+ ul: "list"
6427
+ };
6428
+ var prohibitedAttributes = {
6429
+ caption: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6430
+ code: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6431
+ deletion: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6432
+ emphasis: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6433
+ generic: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby", "aria-roledescription"]),
6434
+ insertion: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6435
+ none: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6436
+ paragraph: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6437
+ presentation: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6438
+ strong: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6439
+ subscript: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"]),
6440
+ superscript: /* @__PURE__ */ new Set(["aria-label", "aria-labelledby"])
6441
+ };
6442
+ function hasGlobalAriaAttributes(element, role) {
6443
+ return [
6444
+ "aria-atomic",
6445
+ "aria-busy",
6446
+ "aria-controls",
6447
+ "aria-current",
6448
+ "aria-description",
6449
+ "aria-describedby",
6450
+ "aria-details",
6451
+ // "disabled",
6452
+ "aria-dropeffect",
6453
+ // "errormessage",
6454
+ "aria-flowto",
6455
+ "aria-grabbed",
6456
+ // "haspopup",
6457
+ "aria-hidden",
6458
+ // "invalid",
6459
+ "aria-keyshortcuts",
6460
+ "aria-label",
6461
+ "aria-labelledby",
6462
+ "aria-live",
6463
+ "aria-owns",
6464
+ "aria-relevant",
6465
+ "aria-roledescription"
6466
+ ].some(function(attributeName) {
6467
+ var _prohibitedAttributes;
6468
+ return element.hasAttribute(attributeName) && !((_prohibitedAttributes = prohibitedAttributes[role]) !== null && _prohibitedAttributes !== void 0 && _prohibitedAttributes.has(attributeName));
6469
+ });
6470
+ }
6471
+ function ignorePresentationalRole(element, implicitRole) {
6472
+ return hasGlobalAriaAttributes(element, implicitRole);
6473
+ }
6474
+ function getRole(element) {
6475
+ var explicitRole = getExplicitRole(element);
6476
+ if (explicitRole === null || presentationRoles.indexOf(explicitRole) !== -1) {
6477
+ var implicitRole = getImplicitRole(element);
6478
+ if (presentationRoles.indexOf(explicitRole || "") === -1 || ignorePresentationalRole(element, implicitRole || "")) {
6479
+ return implicitRole;
6480
+ }
6481
+ }
6482
+ return explicitRole;
6483
+ }
6484
+ function getImplicitRole(element) {
6485
+ var mappedByTag = localNameToRoleMappings[getLocalName(element)];
6486
+ if (mappedByTag !== void 0) {
6487
+ return mappedByTag;
6488
+ }
6489
+ switch (getLocalName(element)) {
6490
+ case "a":
6491
+ case "area":
6492
+ case "link":
6493
+ if (element.hasAttribute("href")) {
6494
+ return "link";
6495
+ }
6496
+ break;
6497
+ case "img":
6498
+ if (element.getAttribute("alt") === "" && !ignorePresentationalRole(element, "img")) {
6499
+ return "presentation";
6500
+ }
6501
+ return "img";
6502
+ case "input": {
6503
+ var _ref = element, type = _ref.type;
6504
+ switch (type) {
6505
+ case "button":
6506
+ case "image":
6507
+ case "reset":
6508
+ case "submit":
6509
+ return "button";
6510
+ case "checkbox":
6511
+ case "radio":
6512
+ return type;
6513
+ case "range":
6514
+ return "slider";
6515
+ case "email":
6516
+ case "tel":
6517
+ case "text":
6518
+ case "url":
6519
+ if (element.hasAttribute("list")) {
6520
+ return "combobox";
6521
+ }
6522
+ return "textbox";
6523
+ case "search":
6524
+ if (element.hasAttribute("list")) {
6525
+ return "combobox";
6526
+ }
6527
+ return "searchbox";
6528
+ case "number":
6529
+ return "spinbutton";
6530
+ default:
6531
+ return null;
6532
+ }
6533
+ }
6534
+ case "select":
6535
+ if (element.hasAttribute("multiple") || element.size > 1) {
6536
+ return "listbox";
6537
+ }
6538
+ return "combobox";
6539
+ }
6540
+ return null;
6541
+ }
6542
+ function getExplicitRole(element) {
6543
+ var role = element.getAttribute("role");
6544
+ if (role !== null) {
6545
+ var explicitRole = role.trim().split(" ")[0];
6546
+ if (explicitRole.length > 0) {
6547
+ return explicitRole;
6548
+ }
6549
+ }
6550
+ return null;
6551
+ }
6552
+ var presentationRoles = ["presentation", "none"];
6553
+ function isElement(node) {
6554
+ return node !== null && node.nodeType === node.ELEMENT_NODE;
6555
+ }
6556
+ function isHTMLTableCaptionElement(node) {
6557
+ return isElement(node) && getLocalName(node) === "caption";
6558
+ }
6559
+ function isHTMLInputElement(node) {
6560
+ return isElement(node) && getLocalName(node) === "input";
6561
+ }
6562
+ function isHTMLOptGroupElement(node) {
6563
+ return isElement(node) && getLocalName(node) === "optgroup";
6564
+ }
6565
+ function isHTMLSelectElement(node) {
6566
+ return isElement(node) && getLocalName(node) === "select";
6567
+ }
6568
+ function isHTMLTableElement(node) {
6569
+ return isElement(node) && getLocalName(node) === "table";
6570
+ }
6571
+ function isHTMLTextAreaElement(node) {
6572
+ return isElement(node) && getLocalName(node) === "textarea";
6573
+ }
6574
+ function safeWindow(node) {
6575
+ var _ref = node.ownerDocument === null ? node : node.ownerDocument, defaultView = _ref.defaultView;
6576
+ if (defaultView === null) {
6577
+ throw new TypeError("no window available");
6578
+ }
6579
+ return defaultView;
6580
+ }
6581
+ function isHTMLFieldSetElement(node) {
6582
+ return isElement(node) && getLocalName(node) === "fieldset";
6583
+ }
6584
+ function isHTMLLegendElement(node) {
6585
+ return isElement(node) && getLocalName(node) === "legend";
6586
+ }
6587
+ function isHTMLSlotElement(node) {
6588
+ return isElement(node) && getLocalName(node) === "slot";
6589
+ }
6590
+ function isSVGElement(node) {
6591
+ return isElement(node) && node.ownerSVGElement !== void 0;
6592
+ }
6593
+ function isSVGSVGElement(node) {
6594
+ return isElement(node) && getLocalName(node) === "svg";
6595
+ }
6596
+ function isSVGTitleElement(node) {
6597
+ return isSVGElement(node) && getLocalName(node) === "title";
6598
+ }
6599
+ function queryIdRefs(node, attributeName) {
6600
+ if (isElement(node) && node.hasAttribute(attributeName)) {
6601
+ var ids = node.getAttribute(attributeName).split(" ");
6602
+ var root = node.getRootNode ? node.getRootNode() : node.ownerDocument;
6603
+ return ids.map(function(id) {
6604
+ return root.getElementById(id);
6605
+ }).filter(
6606
+ function(element) {
6607
+ return element !== null;
6608
+ }
6609
+ // TODO: why does this not narrow?
6610
+ );
6611
+ }
6612
+ return [];
6613
+ }
6614
+ function hasAnyConcreteRoles(node, roles) {
6615
+ if (isElement(node)) {
6616
+ return roles.indexOf(getRole(node)) !== -1;
6617
+ }
6618
+ return false;
6619
+ }
6620
+ function asFlatString(s2) {
6621
+ return s2.trim().replace(/\s\s+/g, " ");
6622
+ }
6623
+ function isHidden$1(node, getComputedStyleImplementation) {
6624
+ if (!isElement(node)) {
6625
+ return false;
6626
+ }
6627
+ if (node.hasAttribute("hidden") || node.getAttribute("aria-hidden") === "true") {
6628
+ return true;
6629
+ }
6630
+ var style = getComputedStyleImplementation(node);
6631
+ return style.getPropertyValue("display") === "none" || style.getPropertyValue("visibility") === "hidden";
6632
+ }
6633
+ function isControl(node) {
6634
+ return hasAnyConcreteRoles(node, ["button", "combobox", "listbox", "textbox"]) || hasAbstractRole(node, "range");
6635
+ }
6636
+ function hasAbstractRole(node, role) {
6637
+ if (!isElement(node)) {
6638
+ return false;
6639
+ }
6640
+ switch (role) {
6641
+ case "range":
6642
+ return hasAnyConcreteRoles(node, ["meter", "progressbar", "scrollbar", "slider", "spinbutton"]);
6643
+ default:
6644
+ throw new TypeError("No knowledge about abstract role '".concat(role, "'. This is likely a bug :("));
6645
+ }
6646
+ }
6647
+ function querySelectorAllSubtree(element, selectors) {
6648
+ var elements = arrayFrom(element.querySelectorAll(selectors));
6649
+ queryIdRefs(element, "aria-owns").forEach(function(root) {
6650
+ elements.push.apply(elements, arrayFrom(root.querySelectorAll(selectors)));
6651
+ });
6652
+ return elements;
6653
+ }
6654
+ function querySelectedOptions(listbox) {
6655
+ if (isHTMLSelectElement(listbox)) {
6656
+ return listbox.selectedOptions || querySelectorAllSubtree(listbox, "[selected]");
6657
+ }
6658
+ return querySelectorAllSubtree(listbox, '[aria-selected="true"]');
6659
+ }
6660
+ function isMarkedPresentational(node) {
6661
+ return hasAnyConcreteRoles(node, presentationRoles);
6662
+ }
6663
+ function isNativeHostLanguageTextAlternativeElement(node) {
6664
+ return isHTMLTableCaptionElement(node);
6665
+ }
6666
+ function allowsNameFromContent(node) {
6667
+ return hasAnyConcreteRoles(node, ["button", "cell", "checkbox", "columnheader", "gridcell", "heading", "label", "legend", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "row", "rowheader", "switch", "tab", "tooltip", "treeitem"]);
6668
+ }
6669
+ function isDescendantOfNativeHostLanguageTextAlternativeElement(node) {
6670
+ return false;
6671
+ }
6672
+ function getValueOfTextbox(element) {
6673
+ if (isHTMLInputElement(element) || isHTMLTextAreaElement(element)) {
6674
+ return element.value;
6675
+ }
6676
+ return element.textContent || "";
6677
+ }
6678
+ function getTextualContent(declaration) {
6679
+ var content = declaration.getPropertyValue("content");
6680
+ if (/^["'].*["']$/.test(content)) {
6681
+ return content.slice(1, -1);
6682
+ }
6683
+ return "";
6684
+ }
6685
+ function isLabelableElement(element) {
6686
+ var localName = getLocalName(element);
6687
+ return localName === "button" || localName === "input" && element.getAttribute("type") !== "hidden" || localName === "meter" || localName === "output" || localName === "progress" || localName === "select" || localName === "textarea";
6688
+ }
6689
+ function findLabelableElement(element) {
6690
+ if (isLabelableElement(element)) {
6691
+ return element;
6692
+ }
6693
+ var labelableElement = null;
6694
+ element.childNodes.forEach(function(childNode) {
6695
+ if (labelableElement === null && isElement(childNode)) {
6696
+ var descendantLabelableElement = findLabelableElement(childNode);
6697
+ if (descendantLabelableElement !== null) {
6698
+ labelableElement = descendantLabelableElement;
6699
+ }
6700
+ }
6701
+ });
6702
+ return labelableElement;
6703
+ }
6704
+ function getControlOfLabel(label) {
6705
+ if (label.control !== void 0) {
6706
+ return label.control;
6707
+ }
6708
+ var htmlFor = label.getAttribute("for");
6709
+ if (htmlFor !== null) {
6710
+ return label.ownerDocument.getElementById(htmlFor);
6711
+ }
6712
+ return findLabelableElement(label);
6713
+ }
6714
+ function getLabels$1(element) {
6715
+ var labelsProperty = element.labels;
6716
+ if (labelsProperty === null) {
6717
+ return labelsProperty;
6718
+ }
6719
+ if (labelsProperty !== void 0) {
6720
+ return arrayFrom(labelsProperty);
6721
+ }
6722
+ if (!isLabelableElement(element)) {
6723
+ return null;
6724
+ }
6725
+ var document2 = element.ownerDocument;
6726
+ return arrayFrom(document2.querySelectorAll("label")).filter(function(label) {
6727
+ return getControlOfLabel(label) === element;
6728
+ });
6729
+ }
6730
+ function getSlotContents(slot) {
6731
+ var assignedNodes = slot.assignedNodes();
6732
+ if (assignedNodes.length === 0) {
6733
+ return arrayFrom(slot.childNodes);
6734
+ }
6735
+ return assignedNodes;
6736
+ }
6737
+ function computeTextAlternative(root) {
6738
+ var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
6739
+ var consultedNodes = new SetLike$1();
6740
+ var computedStyles = typeof Map === "undefined" ? void 0 : /* @__PURE__ */ new Map();
6741
+ var window2 = safeWindow(root);
6742
+ var _options$compute = options.compute, compute = _options$compute === void 0 ? "name" : _options$compute, _options$computedStyl = options.computedStyleSupportsPseudoElements, computedStyleSupportsPseudoElements = _options$computedStyl === void 0 ? options.getComputedStyle !== void 0 : _options$computedStyl, _options$getComputedS = options.getComputedStyle, uncachedGetComputedStyle = _options$getComputedS === void 0 ? window2.getComputedStyle.bind(window2) : _options$getComputedS, _options$hidden = options.hidden, hidden = _options$hidden === void 0 ? false : _options$hidden;
6743
+ var getComputedStyle2 = function getComputedStyle3(el, pseudoElement) {
6744
+ if (pseudoElement !== void 0) {
6745
+ throw new Error("use uncachedGetComputedStyle directly for pseudo elements");
6746
+ }
6747
+ if (computedStyles === void 0) {
6748
+ return uncachedGetComputedStyle(el);
6749
+ }
6750
+ var cachedStyles = computedStyles.get(el);
6751
+ if (cachedStyles) {
6752
+ return cachedStyles;
6753
+ }
6754
+ var style = uncachedGetComputedStyle(el, pseudoElement);
6755
+ computedStyles.set(el, style);
6756
+ return style;
6757
+ };
6758
+ function computeMiscTextAlternative(node, context) {
6759
+ var accumulatedText = "";
6760
+ if (isElement(node) && computedStyleSupportsPseudoElements) {
6761
+ var pseudoBefore = uncachedGetComputedStyle(node, "::before");
6762
+ var beforeContent = getTextualContent(pseudoBefore);
6763
+ accumulatedText = "".concat(beforeContent, " ").concat(accumulatedText);
6764
+ }
6765
+ var childNodes = isHTMLSlotElement(node) ? getSlotContents(node) : arrayFrom(node.childNodes).concat(queryIdRefs(node, "aria-owns"));
6766
+ childNodes.forEach(function(child) {
6767
+ var result = computeTextAlternative2(child, {
6768
+ isEmbeddedInLabel: context.isEmbeddedInLabel,
6769
+ isReferenced: false,
6770
+ recursion: true
6771
+ });
6772
+ var display = isElement(child) ? getComputedStyle2(child).getPropertyValue("display") : "inline";
6773
+ var separator = display !== "inline" ? " " : "";
6774
+ accumulatedText += "".concat(separator).concat(result).concat(separator);
6775
+ });
6776
+ if (isElement(node) && computedStyleSupportsPseudoElements) {
6777
+ var pseudoAfter = uncachedGetComputedStyle(node, "::after");
6778
+ var afterContent = getTextualContent(pseudoAfter);
6779
+ accumulatedText = "".concat(accumulatedText, " ").concat(afterContent);
6780
+ }
6781
+ return accumulatedText.trim();
6782
+ }
6783
+ function useAttribute(element, attributeName) {
6784
+ var attribute = element.getAttributeNode(attributeName);
6785
+ if (attribute !== null && !consultedNodes.has(attribute) && attribute.value.trim() !== "") {
6786
+ consultedNodes.add(attribute);
6787
+ return attribute.value;
6788
+ }
6789
+ return null;
6790
+ }
6791
+ function computeTooltipAttributeValue(node) {
6792
+ if (!isElement(node)) {
6793
+ return null;
6794
+ }
6795
+ return useAttribute(node, "title");
6796
+ }
6797
+ function computeElementTextAlternative(node) {
6798
+ if (!isElement(node)) {
6799
+ return null;
6800
+ }
6801
+ if (isHTMLFieldSetElement(node)) {
6802
+ consultedNodes.add(node);
6803
+ var children = arrayFrom(node.childNodes);
6804
+ for (var i2 = 0; i2 < children.length; i2 += 1) {
6805
+ var child = children[i2];
6806
+ if (isHTMLLegendElement(child)) {
6807
+ return computeTextAlternative2(child, {
6808
+ isEmbeddedInLabel: false,
6809
+ isReferenced: false,
6810
+ recursion: false
6811
+ });
6812
+ }
6813
+ }
6814
+ } else if (isHTMLTableElement(node)) {
6815
+ consultedNodes.add(node);
6816
+ var _children = arrayFrom(node.childNodes);
6817
+ for (var _i = 0; _i < _children.length; _i += 1) {
6818
+ var _child = _children[_i];
6819
+ if (isHTMLTableCaptionElement(_child)) {
6820
+ return computeTextAlternative2(_child, {
6821
+ isEmbeddedInLabel: false,
6822
+ isReferenced: false,
6823
+ recursion: false
6824
+ });
6825
+ }
6826
+ }
6827
+ } else if (isSVGSVGElement(node)) {
6828
+ consultedNodes.add(node);
6829
+ var _children2 = arrayFrom(node.childNodes);
6830
+ for (var _i2 = 0; _i2 < _children2.length; _i2 += 1) {
6831
+ var _child2 = _children2[_i2];
6832
+ if (isSVGTitleElement(_child2)) {
6833
+ return _child2.textContent;
6834
+ }
6835
+ }
6836
+ return null;
6837
+ } else if (getLocalName(node) === "img" || getLocalName(node) === "area") {
6838
+ var nameFromAlt = useAttribute(node, "alt");
6839
+ if (nameFromAlt !== null) {
6840
+ return nameFromAlt;
6841
+ }
6842
+ } else if (isHTMLOptGroupElement(node)) {
6843
+ var nameFromLabel = useAttribute(node, "label");
6844
+ if (nameFromLabel !== null) {
6845
+ return nameFromLabel;
6846
+ }
6847
+ }
6848
+ if (isHTMLInputElement(node) && (node.type === "button" || node.type === "submit" || node.type === "reset")) {
6849
+ var nameFromValue = useAttribute(node, "value");
6850
+ if (nameFromValue !== null) {
6851
+ return nameFromValue;
6852
+ }
6853
+ if (node.type === "submit") {
6854
+ return "Submit";
6855
+ }
6856
+ if (node.type === "reset") {
6857
+ return "Reset";
6858
+ }
6859
+ }
6860
+ var labels = getLabels$1(node);
6861
+ if (labels !== null && labels.length !== 0) {
6862
+ consultedNodes.add(node);
6863
+ return arrayFrom(labels).map(function(element) {
6864
+ return computeTextAlternative2(element, {
6865
+ isEmbeddedInLabel: true,
6866
+ isReferenced: false,
6867
+ recursion: true
6868
+ });
6869
+ }).filter(function(label) {
6870
+ return label.length > 0;
6871
+ }).join(" ");
6872
+ }
6873
+ if (isHTMLInputElement(node) && node.type === "image") {
6874
+ var _nameFromAlt = useAttribute(node, "alt");
6875
+ if (_nameFromAlt !== null) {
6876
+ return _nameFromAlt;
6877
+ }
6878
+ var nameFromTitle = useAttribute(node, "title");
6879
+ if (nameFromTitle !== null) {
6880
+ return nameFromTitle;
6881
+ }
6882
+ return "Submit Query";
6883
+ }
6884
+ if (hasAnyConcreteRoles(node, ["button"])) {
6885
+ var nameFromSubTree = computeMiscTextAlternative(node, {
6886
+ isEmbeddedInLabel: false
6887
+ });
6888
+ if (nameFromSubTree !== "") {
6889
+ return nameFromSubTree;
6890
+ }
6891
+ }
6892
+ return null;
6893
+ }
6894
+ function computeTextAlternative2(current, context) {
6895
+ if (consultedNodes.has(current)) {
6896
+ return "";
6897
+ }
6898
+ if (!hidden && isHidden$1(current, getComputedStyle2) && !context.isReferenced) {
6899
+ consultedNodes.add(current);
6900
+ return "";
6901
+ }
6902
+ var labelAttributeNode = isElement(current) ? current.getAttributeNode("aria-labelledby") : null;
6903
+ var labelElements = labelAttributeNode !== null && !consultedNodes.has(labelAttributeNode) ? queryIdRefs(current, "aria-labelledby") : [];
6904
+ if (compute === "name" && !context.isReferenced && labelElements.length > 0) {
6905
+ consultedNodes.add(labelAttributeNode);
6906
+ return labelElements.map(function(element) {
6907
+ return computeTextAlternative2(element, {
6908
+ isEmbeddedInLabel: context.isEmbeddedInLabel,
6909
+ isReferenced: true,
6910
+ // this isn't recursion as specified, otherwise we would skip
6911
+ // `aria-label` in
6912
+ // <input id="myself" aria-label="foo" aria-labelledby="myself"
6913
+ recursion: false
6914
+ });
6915
+ }).join(" ");
6916
+ }
6917
+ var skipToStep2E = context.recursion && isControl(current) && compute === "name";
6918
+ if (!skipToStep2E) {
6919
+ var ariaLabel = (isElement(current) && current.getAttribute("aria-label") || "").trim();
6920
+ if (ariaLabel !== "" && compute === "name") {
6921
+ consultedNodes.add(current);
6922
+ return ariaLabel;
6923
+ }
6924
+ if (!isMarkedPresentational(current)) {
6925
+ var elementTextAlternative = computeElementTextAlternative(current);
6926
+ if (elementTextAlternative !== null) {
6927
+ consultedNodes.add(current);
6928
+ return elementTextAlternative;
6929
+ }
6930
+ }
6931
+ }
6932
+ if (hasAnyConcreteRoles(current, ["menu"])) {
6933
+ consultedNodes.add(current);
6934
+ return "";
6935
+ }
6936
+ if (skipToStep2E || context.isEmbeddedInLabel || context.isReferenced) {
6937
+ if (hasAnyConcreteRoles(current, ["combobox", "listbox"])) {
6938
+ consultedNodes.add(current);
6939
+ var selectedOptions = querySelectedOptions(current);
6940
+ if (selectedOptions.length === 0) {
6941
+ return isHTMLInputElement(current) ? current.value : "";
6942
+ }
6943
+ return arrayFrom(selectedOptions).map(function(selectedOption) {
6944
+ return computeTextAlternative2(selectedOption, {
6945
+ isEmbeddedInLabel: context.isEmbeddedInLabel,
6946
+ isReferenced: false,
6947
+ recursion: true
6948
+ });
6949
+ }).join(" ");
6950
+ }
6951
+ if (hasAbstractRole(current, "range")) {
6952
+ consultedNodes.add(current);
6953
+ if (current.hasAttribute("aria-valuetext")) {
6954
+ return current.getAttribute("aria-valuetext");
6955
+ }
6956
+ if (current.hasAttribute("aria-valuenow")) {
6957
+ return current.getAttribute("aria-valuenow");
6958
+ }
6959
+ return current.getAttribute("value") || "";
6960
+ }
6961
+ if (hasAnyConcreteRoles(current, ["textbox"])) {
6962
+ consultedNodes.add(current);
6963
+ return getValueOfTextbox(current);
6964
+ }
6965
+ }
6966
+ if (allowsNameFromContent(current) || isElement(current) && context.isReferenced || isNativeHostLanguageTextAlternativeElement(current) || isDescendantOfNativeHostLanguageTextAlternativeElement()) {
6967
+ var accumulatedText2F = computeMiscTextAlternative(current, {
6968
+ isEmbeddedInLabel: context.isEmbeddedInLabel
6969
+ });
6970
+ if (accumulatedText2F !== "") {
6971
+ consultedNodes.add(current);
6972
+ return accumulatedText2F;
6973
+ }
6974
+ }
6975
+ if (current.nodeType === current.TEXT_NODE) {
6976
+ consultedNodes.add(current);
6977
+ return current.textContent || "";
6978
+ }
6979
+ if (context.recursion) {
6980
+ consultedNodes.add(current);
6981
+ return computeMiscTextAlternative(current, {
6982
+ isEmbeddedInLabel: context.isEmbeddedInLabel
6983
+ });
6984
+ }
6985
+ var tooltipAttributeValue = computeTooltipAttributeValue(current);
6986
+ if (tooltipAttributeValue !== null) {
6987
+ consultedNodes.add(current);
6988
+ return tooltipAttributeValue;
6989
+ }
6990
+ consultedNodes.add(current);
6991
+ return "";
6992
+ }
6993
+ return asFlatString(computeTextAlternative2(root, {
6994
+ isEmbeddedInLabel: false,
6995
+ // by spec computeAccessibleDescription starts with the referenced elements as roots
6996
+ isReferenced: compute === "description",
6997
+ recursion: false
6998
+ }));
6999
+ }
7000
+ function prohibitsNaming(node) {
7001
+ return hasAnyConcreteRoles(node, ["caption", "code", "deletion", "emphasis", "generic", "insertion", "none", "paragraph", "presentation", "strong", "subscript", "superscript"]);
7002
+ }
7003
+ function computeAccessibleName(root) {
7004
+ var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
7005
+ if (prohibitsNaming(root)) {
7006
+ return "";
7007
+ }
7008
+ return computeTextAlternative(root, options);
7009
+ }
6180
7010
  const STATE_CLASS_RE = /^(is-|has-|js-)|^(active|open|selected|disabled|focus|hover|show|hidden|loading|dragging)$/i;
6181
7011
  function looksHashed(segment) {
6182
7012
  if (segment.includes("-")) return false;
@@ -6188,17 +7018,35 @@ function looksHashed(segment) {
6188
7018
  }
6189
7019
  return false;
6190
7020
  }
7021
+ const GENERATED_CLASS_PATTERNS = [
7022
+ /^css-[a-z0-9]+(-|$)/i,
7023
+ // emotion / MUI. 라벨이 붙으면 css-1e6y48t-MuiButtonBase-root
7024
+ /^sc-[a-z0-9]+$/i,
7025
+ // styled-components
7026
+ /^makeStyles-.+-\d+$/,
7027
+ // JSS makeStyles
7028
+ /^jss\d+$/,
7029
+ // JSS 기본 생성기
7030
+ /^ng-tns-c\d+-\d+$/,
7031
+ // Angular 애니메이션
7032
+ /^_[\w-]+_[a-z0-9]{5}_\d+$/
7033
+ // Vite CSS Modules 기본값: _로컬_해시(base36 5자)_줄번호
7034
+ ];
7035
+ function hasCssModulesHash(token) {
7036
+ const index = token.lastIndexOf("__");
7037
+ if (index <= 0) return false;
7038
+ const suffix = token.slice(index + 2);
7039
+ return suffix.length === 5 && /^[\w-]+$/.test(suffix) && /[A-Z0-9_-]/.test(suffix);
7040
+ }
6191
7041
  function isUnstableToken(token) {
6192
7042
  if (!token) return true;
6193
7043
  if (token.includes(":") || token.includes("/")) return true;
6194
7044
  if (token.includes("--")) return true;
6195
- if (/^css-[a-z0-9]+$/i.test(token)) return true;
6196
- if (/^sc-[a-z0-9]+$/i.test(token)) return true;
6197
7045
  if (STATE_CLASS_RE.test(token)) return true;
6198
- const segments = token.split("__");
6199
- if (segments.length > 1 && looksHashed(segments[segments.length - 1] ?? "")) return true;
7046
+ if (GENERATED_CLASS_PATTERNS.some((pattern) => pattern.test(token))) return true;
7047
+ if (hasCssModulesHash(token)) return true;
6200
7048
  if (looksHashed(token)) return true;
6201
- return false;
7049
+ return token.split(/[-_]+/).some(looksHashed);
6202
7050
  }
6203
7051
  function isStableClassName(cls) {
6204
7052
  return !isUnstableToken(cls);
@@ -6211,6 +7059,297 @@ function isUnstableId(id) {
6211
7059
  if (looksHashed(id)) return true;
6212
7060
  return false;
6213
7061
  }
7062
+ function intersection(firstArr, secondArr) {
7063
+ const secondSet = new Set(secondArr);
7064
+ return firstArr.filter((item) => secondSet.has(item));
7065
+ }
7066
+ function uniq(arr) {
7067
+ return [...new Set(arr)];
7068
+ }
7069
+ function union(arr1, arr2) {
7070
+ return uniq(arr1.concat(arr2));
7071
+ }
7072
+ const LOCATOR_TEXT_MAX = 80;
7073
+ const RAW_SLICE_FACTOR = 8;
7074
+ const LOCATOR_RAW_TEXT_MAX = LOCATOR_TEXT_MAX * RAW_SLICE_FACTOR;
7075
+ function dropTrailingLoneSurrogate(value) {
7076
+ return /[\uD800-\uDBFF]$/.test(value) ? value.slice(0, -1) : value;
7077
+ }
7078
+ function cleanLocatorText(value, max2 = LOCATOR_TEXT_MAX) {
7079
+ if (!value) return void 0;
7080
+ const bounded = value.slice(0, max2 * RAW_SLICE_FACTOR);
7081
+ const cleaned = dropTrailingLoneSurrogate(
7082
+ redactSensitiveValues(bounded.replace(/\s+/g, " ").trim()).slice(0, max2)
7083
+ ).trim();
7084
+ return cleaned || void 0;
7085
+ }
7086
+ function normalizeForCompare(value) {
7087
+ return value.toLowerCase().replace(/\d+/g, "#");
7088
+ }
7089
+ function jaccard(a2, b) {
7090
+ const all = union(uniq(a2), uniq(b));
7091
+ if (all.length === 0) return 0;
7092
+ return intersection(uniq(a2), uniq(b)).length / all.length;
7093
+ }
7094
+ function textSimilarity(a2, b) {
7095
+ const left = normalizeForCompare(a2);
7096
+ const right = normalizeForCompare(b);
7097
+ if (left === right) return 1;
7098
+ const [shorter, longer] = left.length <= right.length ? [left, right] : [right, left];
7099
+ const containment = shorter && longer.startsWith(shorter) ? shorter.length / longer.length : 0;
7100
+ return Math.max(jaccard(left.split(" "), right.split(" ")), containment);
7101
+ }
7102
+ function labelSimilarity(stored, observed) {
7103
+ const storedWords = new Set(normalizeForCompare(stored).split(" "));
7104
+ const observedWords = new Set(normalizeForCompare(observed).split(" "));
7105
+ const [smaller, larger] = storedWords.size <= observedWords.size ? [storedWords, observedWords] : [observedWords, storedWords];
7106
+ const isStrictSubset = larger.size > smaller.size && [...smaller].every((w) => larger.has(w));
7107
+ return isStrictSubset ? 0 : textSimilarity(stored, observed);
7108
+ }
7109
+ function digitGroups(value) {
7110
+ return (value.match(/\d+/g) ?? []).join(" ");
7111
+ }
7112
+ function sameDigitGroups(a2, b) {
7113
+ return digitGroups(a2) === digitGroups(b);
7114
+ }
7115
+ function labelSimilarityKeepingDigits(stored, observed) {
7116
+ const left = stored.replace(/\s+/g, " ").trim();
7117
+ const right = observed.replace(/\s+/g, " ").trim();
7118
+ return sameDigitGroups(left, right) ? labelSimilarity(left, right) : 0;
7119
+ }
7120
+ const TEST_ATTR_KEYS = ["data-testid", "data-test", "data-qa", "data-cy"];
7121
+ const OTHER_ATTR_KEYS = ["name", "type", "placeholder", "alt", "title", "href", "src"];
7122
+ const URL_ATTR_KEYS = /* @__PURE__ */ new Set(["href", "src"]);
7123
+ const ATTR_VALUE_MAX = 120;
7124
+ const CLASS_LIMIT = 5;
7125
+ const LOCATOR_SIZE_MAX = 1024;
7126
+ const CONTAINER_ROLES = /* @__PURE__ */ new Set(["dialog", "alertdialog", "menu", "listbox", "tooltip"]);
7127
+ const CONTAINER_SELECTOR = 'dialog, [role="dialog"], [role="alertdialog"], [role="menu"], [role="listbox"], [role="tooltip"]';
7128
+ const LANDMARK_ROLES = /* @__PURE__ */ new Set([
7129
+ "banner",
7130
+ "navigation",
7131
+ "main",
7132
+ "complementary",
7133
+ "contentinfo",
7134
+ "region",
7135
+ "form",
7136
+ "search"
7137
+ ]);
7138
+ const NAMED_ONLY_LANDMARKS = /* @__PURE__ */ new Set(["region", "form"]);
7139
+ const ROW_SELECTOR = 'li, tr, [role="row"], [role="listitem"], [role="option"]';
7140
+ const HEADING_SELECTOR = 'h1, h2, h3, h4, h5, h6, [role="heading"]';
7141
+ function safeRole(element) {
7142
+ try {
7143
+ return getRole(element) ?? void 0;
7144
+ } catch {
7145
+ return void 0;
7146
+ }
7147
+ }
7148
+ function safeAccessibleName(element) {
7149
+ try {
7150
+ return cleanLocatorText(computeAccessibleName(element));
7151
+ } catch {
7152
+ return void 0;
7153
+ }
7154
+ }
7155
+ function landmarkRole(node) {
7156
+ const role = safeRole(node);
7157
+ if (role === void 0 || !LANDMARK_ROLES.has(role)) return void 0;
7158
+ if (NAMED_ONLY_LANDMARKS.has(role) && !safeAccessibleName(node)) return void 0;
7159
+ return role;
7160
+ }
7161
+ function collectHeadings(doc) {
7162
+ return Array.from(doc.querySelectorAll(HEADING_SELECTOR));
7163
+ }
7164
+ function matchesMask(element) {
7165
+ try {
7166
+ return element.matches(SESSION_REPLAY_FULL_MASK_SELECTOR);
7167
+ } catch {
7168
+ return true;
7169
+ }
7170
+ }
7171
+ function hasMaskedDescendant(root) {
7172
+ try {
7173
+ return root.querySelector(SESSION_REPLAY_FULL_MASK_SELECTOR) !== null;
7174
+ } catch {
7175
+ return true;
7176
+ }
7177
+ }
7178
+ function visibleText(root) {
7179
+ if (!hasMaskedDescendant(root)) return root.textContent ?? "";
7180
+ const walker = root.ownerDocument.createTreeWalker(
7181
+ root,
7182
+ NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,
7183
+ (node) => node.nodeType === Node.ELEMENT_NODE && matchesMask(node) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT
7184
+ );
7185
+ let text = "";
7186
+ for (let node = walker.nextNode(); node && text.length < LOCATOR_RAW_TEXT_MAX; ) {
7187
+ if (node.nodeType === Node.TEXT_NODE) text += node.nodeValue ?? "";
7188
+ node = walker.nextNode();
7189
+ }
7190
+ return text;
7191
+ }
7192
+ function closestAncestor(element, matches) {
7193
+ let current = element.parentElement;
7194
+ while (current) {
7195
+ if (matches(current)) return current;
7196
+ current = current.parentElement;
7197
+ }
7198
+ return null;
7199
+ }
7200
+ function nearestPrecedingHeading(element, headings) {
7201
+ let found = null;
7202
+ for (const heading of headings) {
7203
+ if (heading === element || heading.contains(element)) continue;
7204
+ if (heading.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING) {
7205
+ found = heading;
7206
+ } else {
7207
+ break;
7208
+ }
7209
+ }
7210
+ return found;
7211
+ }
7212
+ function rowTextOf(element) {
7213
+ const row = element.closest(ROW_SELECTOR);
7214
+ if (!row) return void 0;
7215
+ const label = Array.from(row.children).find(
7216
+ (cell) => !cell.contains(element) && visibleText(cell).trim()
7217
+ );
7218
+ const source = label ?? row;
7219
+ if (isElementFullyMasked(source)) return void 0;
7220
+ return cleanLocatorText(visibleText(source));
7221
+ }
7222
+ function urlPath(value, doc) {
7223
+ try {
7224
+ const url = new URL(value, doc.baseURI);
7225
+ return url.protocol === "http:" || url.protocol === "https:" ? url.pathname : void 0;
7226
+ } catch {
7227
+ return void 0;
7228
+ }
7229
+ }
7230
+ function attrValue(element, key) {
7231
+ const raw = element.getAttribute(key);
7232
+ if (!raw) return void 0;
7233
+ return cleanLocatorText(
7234
+ URL_ATTR_KEYS.has(key) ? urlPath(raw, element.ownerDocument) : raw,
7235
+ ATTR_VALUE_MAX
7236
+ );
7237
+ }
7238
+ function sharesUrlPath(element, key, value) {
7239
+ return Array.from(element.ownerDocument.getElementsByTagName(element.tagName)).some(
7240
+ (other) => other !== element && attrValue(other, key) === value
7241
+ );
7242
+ }
7243
+ function collectAttrs(element, masked, uniqueUrlAttrs) {
7244
+ const attrs = {};
7245
+ const keys = masked ? TEST_ATTR_KEYS : [...TEST_ATTR_KEYS, ...OTHER_ATTR_KEYS];
7246
+ for (const key of keys) {
7247
+ const value = attrValue(element, key);
7248
+ if (!value) continue;
7249
+ if (uniqueUrlAttrs && URL_ATTR_KEYS.has(key) && sharesUrlPath(element, key, value)) continue;
7250
+ attrs[key] = value;
7251
+ }
7252
+ return Object.keys(attrs).length ? attrs : void 0;
7253
+ }
7254
+ function collectClasses(element) {
7255
+ const classes = Array.from(element.classList).filter(isStableClassName).slice(0, CLASS_LIMIT);
7256
+ return classes.length ? classes : void 0;
7257
+ }
7258
+ function tagIndex(element, scope) {
7259
+ return Array.from(scope.getElementsByTagName(element.tagName)).indexOf(element);
7260
+ }
7261
+ function labelSources(element) {
7262
+ var _a;
7263
+ const doc = element.ownerDocument;
7264
+ const ids = ((_a = element.getAttribute("aria-labelledby")) == null ? void 0 : _a.split(/\s+/).filter(Boolean)) ?? [];
7265
+ const sources = ids.map((id) => doc.getElementById(id)).filter((node) => node !== null);
7266
+ const labels = element.labels;
7267
+ if (labels) sources.push(...Array.from(labels));
7268
+ const wrapping = element.closest("label");
7269
+ if (wrapping) sources.push(wrapping);
7270
+ return sources;
7271
+ }
7272
+ function labelSourceMasked(element) {
7273
+ return labelSources(element).some(
7274
+ (node) => isElementFullyMasked(node) || hasMaskedDescendant(node)
7275
+ );
7276
+ }
7277
+ function capSize(locator) {
7278
+ const size = () => JSON.stringify(locator).length;
7279
+ if (size() <= LOCATOR_SIZE_MAX) return locator;
7280
+ delete locator.classes;
7281
+ if (size() <= LOCATOR_SIZE_MAX) return locator;
7282
+ if (locator.context) delete locator.context.heading;
7283
+ if (size() <= LOCATOR_SIZE_MAX) return locator;
7284
+ if (locator.attrs) {
7285
+ for (const key of OTHER_ATTR_KEYS) delete locator.attrs[key];
7286
+ }
7287
+ if (size() <= LOCATOR_SIZE_MAX) return locator;
7288
+ delete locator.context;
7289
+ if (size() <= LOCATOR_SIZE_MAX) return locator;
7290
+ delete locator.text;
7291
+ return locator;
7292
+ }
7293
+ function buildElementLocator(element, options = {}) {
7294
+ try {
7295
+ return buildLocatorUnsafe(element, options);
7296
+ } catch {
7297
+ return { v: 1, tag: element.localName || element.tagName.toLowerCase() };
7298
+ }
7299
+ }
7300
+ function buildLocatorUnsafe(element, options) {
7301
+ const doc = element.ownerDocument;
7302
+ const masked = isElementFullyMasked(element);
7303
+ const locator = { v: 1, tag: element.tagName.toLowerCase() };
7304
+ const role = safeRole(element);
7305
+ if (role) locator.role = role;
7306
+ if (!masked) {
7307
+ const nameMasked = hasMaskedDescendant(element) || labelSourceMasked(element);
7308
+ if (options.includeName !== false && !nameMasked) {
7309
+ const name = safeAccessibleName(element);
7310
+ if (name) locator.name = name;
7311
+ }
7312
+ const text = cleanLocatorText(visibleText(element));
7313
+ if (text) locator.text = text;
7314
+ }
7315
+ const attrs = collectAttrs(element, masked, options.uniqueUrlAttrs !== false);
7316
+ if (attrs) locator.attrs = attrs;
7317
+ const classes = collectClasses(element);
7318
+ if (classes) locator.classes = classes;
7319
+ const container = closestAncestor(element, (node) => {
7320
+ const nodeRole = safeRole(node);
7321
+ return nodeRole !== void 0 && CONTAINER_ROLES.has(nodeRole);
7322
+ });
7323
+ const landmark = closestAncestor(element, (node) => landmarkRole(node) !== void 0);
7324
+ const heading = nearestPrecedingHeading(element, options.headings ?? collectHeadings(doc));
7325
+ const rowText = masked ? void 0 : rowTextOf(element);
7326
+ const context = {};
7327
+ if (container) {
7328
+ const containerName = isElementFullyMasked(container) || hasMaskedDescendant(container) || labelSourceMasked(container) ? void 0 : safeAccessibleName(container);
7329
+ context.container = {
7330
+ role: safeRole(container),
7331
+ ...containerName ? { name: containerName } : {}
7332
+ };
7333
+ }
7334
+ if (landmark) context.landmark = landmarkRole(landmark);
7335
+ const headingText = heading && !isElementFullyMasked(heading) ? cleanLocatorText(visibleText(heading)) : void 0;
7336
+ if (headingText) context.heading = headingText;
7337
+ if (rowText) context.rowText = rowText;
7338
+ if (Object.keys(context).length) locator.context = context;
7339
+ if (options.includeRoleIndex !== false) {
7340
+ const index = tagIndex(element, container ?? doc);
7341
+ if (index >= 0) locator.roleIndex = index;
7342
+ }
7343
+ return capSize(locator);
7344
+ }
7345
+ const STABLE_ATTR_KEYS = [
7346
+ "data-testid",
7347
+ "data-test",
7348
+ "data-qa",
7349
+ "data-cy",
7350
+ "name",
7351
+ "aria-label"
7352
+ ];
6214
7353
  function cssAttrValue(value) {
6215
7354
  return value.replace(/(["\\])/g, "\\$1");
6216
7355
  }
@@ -6279,8 +7418,8 @@ function getElementSelector(element) {
6279
7418
  const segments = [];
6280
7419
  let current = element;
6281
7420
  let depth = 0;
6282
- const MAX_DEPTH = 5;
6283
- while (current && current.nodeType === Node.ELEMENT_NODE && depth < MAX_DEPTH) {
7421
+ const MAX_DEPTH2 = 5;
7422
+ while (current && current.nodeType === Node.ELEMENT_NODE && depth < MAX_DEPTH2) {
6284
7423
  segments.unshift(structuralSegment(current));
6285
7424
  const candidate = segments.join(" > ");
6286
7425
  if (matchesUniquely(candidate, element)) return candidate;
@@ -6320,9 +7459,15 @@ function getXPath(element) {
6320
7459
  }
6321
7460
  return parts.length ? `/html/body/${parts.join("/")}` : "/html/body";
6322
7461
  }
6323
- function getElementPosition(element, event) {
7462
+ function getElementPosition(element, event, options = {}) {
6324
7463
  const rect = element.getBoundingClientRect();
6325
7464
  const scroll = getScrollPosition();
7465
+ let component = null;
7466
+ try {
7467
+ component = (options.collectComponent ?? collectComponentPath)(element);
7468
+ } catch {
7469
+ component = null;
7470
+ }
6326
7471
  return {
6327
7472
  x: event ? event.clientX + scroll.x : rect.left + scroll.x,
6328
7473
  y: event ? event.clientY + scroll.y : rect.top + scroll.y,
@@ -6334,7 +7479,9 @@ function getElementPosition(element, event) {
6334
7479
  top: rect.top + scroll.y,
6335
7480
  width: rect.width,
6336
7481
  height: rect.height
6337
- }
7482
+ },
7483
+ locator: buildElementLocator(element),
7484
+ ...component ? { component } : {}
6338
7485
  };
6339
7486
  }
6340
7487
  function findElementByXPath(xpath) {
@@ -6368,6 +7515,42 @@ function findElementBySelector(selector) {
6368
7515
  }
6369
7516
  return null;
6370
7517
  }
7518
+ const JIRA_ISSUE_TYPE_VALUE_KEY = "issuetype";
7519
+ function resolveJiraIssueTypeId(issueTypes, selected, defaultId) {
7520
+ if (typeof selected === "string" && issueTypes.some((type) => type.id === selected)) {
7521
+ return selected;
7522
+ }
7523
+ return defaultId ?? null;
7524
+ }
7525
+ function pickJiraIssueTypeFields(fallbackFields, issueTypes, issueTypeId) {
7526
+ var _a;
7527
+ const picked = (_a = issueTypes.find((type) => type.id === issueTypeId)) == null ? void 0 : _a.fields;
7528
+ return picked && picked.length > 0 ? picked : [...fallbackFields];
7529
+ }
7530
+ function switchJiraIssueType(values, {
7531
+ exposedFields,
7532
+ previousFields,
7533
+ nextFields,
7534
+ nextIssueTypeId
7535
+ }) {
7536
+ const nextFieldIds = new Set(
7537
+ buildJiraCreateFields(exposedFields, nextFields).map((field) => field.id)
7538
+ );
7539
+ const previousDefaults = new Map(
7540
+ previousFields.map((field) => [field.id, field.defaultValue])
7541
+ );
7542
+ const kept = Object.entries(values).filter(
7543
+ ([fieldId, value]) => nextFieldIds.has(fieldId) && !(previousDefaults.get(fieldId) !== void 0 && previousDefaults.get(fieldId) === value)
7544
+ );
7545
+ return { ...Object.fromEntries(kept), [JIRA_ISSUE_TYPE_VALUE_KEY]: nextIssueTypeId };
7546
+ }
7547
+ function getJiraIssueTypeLabel(mapping) {
7548
+ var _a;
7549
+ const issueTypeId = (_a = getJiraMetadata(mapping)) == null ? void 0 : _a.issue_type;
7550
+ if (typeof issueTypeId !== "string" || issueTypeId.length === 0) return null;
7551
+ const labels = (mapping == null ? void 0 : mapping.jira_field_display_labels) ?? {};
7552
+ return labels[getJiraFieldDisplayLabelKey("issuetype", issueTypeId)] ?? issueTypeId;
7553
+ }
6371
7554
  const ISSUE_PAYLOAD_LIMIT_BYTES = 3 * 1024 * 1024;
6372
7555
  const ISSUE_PAYLOAD_SAFETY_MARGIN_BYTES = 128 * 1024;
6373
7556
  const ISSUE_PAYLOAD_BUDGET_BYTES = ISSUE_PAYLOAD_LIMIT_BYTES - ISSUE_PAYLOAD_SAFETY_MARGIN_BYTES;
@@ -7928,15 +9111,68 @@ var Anchor2 = PopoverAnchor$1;
7928
9111
  var Trigger = PopoverTrigger$1;
7929
9112
  var Portal = PopoverPortal;
7930
9113
  var Content2 = PopoverContent$1;
7931
- const Popover = Root2;
9114
+ const FLOATING_LAYER_SELECTOR = "[data-radix-popper-content-wrapper]";
9115
+ function isInsideLayer(path, content) {
9116
+ return path.some((node) => {
9117
+ if (!(node instanceof Element)) return false;
9118
+ if (node === content) return true;
9119
+ if (content.id && node.getAttribute("aria-controls") === content.id) return true;
9120
+ return node.matches(FLOATING_LAYER_SELECTOR) && !node.contains(content);
9121
+ });
9122
+ }
9123
+ function useShadowOutsideDismiss(onDismiss) {
9124
+ const onDismissRef = useRef(onDismiss);
9125
+ const detachRef = useRef(null);
9126
+ useEffect(() => {
9127
+ onDismissRef.current = onDismiss;
9128
+ }, [onDismiss]);
9129
+ useEffect(() => () => {
9130
+ var _a;
9131
+ return (_a = detachRef.current) == null ? void 0 : _a.call(detachRef);
9132
+ }, []);
9133
+ return useCallback((content) => {
9134
+ var _a;
9135
+ (_a = detachRef.current) == null ? void 0 : _a.call(detachRef);
9136
+ detachRef.current = null;
9137
+ if (!content) return;
9138
+ const root = content.getRootNode();
9139
+ if (!(root instanceof ShadowRoot)) return;
9140
+ const handle = (event) => {
9141
+ var _a2;
9142
+ if (isInsideLayer(event.composedPath(), content)) return;
9143
+ (_a2 = onDismissRef.current) == null ? void 0 : _a2.call(onDismissRef);
9144
+ };
9145
+ const types = ["pointerdown", "focusin"];
9146
+ types.forEach((type) => root.addEventListener(type, handle));
9147
+ detachRef.current = () => types.forEach((type) => root.removeEventListener(type, handle));
9148
+ }, []);
9149
+ }
9150
+ const PopoverOpenChangeContext = React.createContext(
9151
+ void 0
9152
+ );
9153
+ function Popover(props) {
9154
+ return /* @__PURE__ */ jsx(PopoverOpenChangeContext.Provider, { value: props.onOpenChange, children: /* @__PURE__ */ jsx(Root2, { ...props }) });
9155
+ }
7932
9156
  const PopoverTrigger = Trigger;
7933
9157
  const PopoverAnchor = Anchor2;
7934
9158
  const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 6, onEscapeKeyDown, ...props }, ref) => {
7935
9159
  const portalContainer = usePortalContainer();
9160
+ const onOpenChange = React.useContext(PopoverOpenChangeContext);
9161
+ const dismissRef = useShadowOutsideDismiss(
9162
+ React.useCallback(() => onOpenChange == null ? void 0 : onOpenChange(false), [onOpenChange])
9163
+ );
9164
+ const contentRef = React.useCallback(
9165
+ (node) => {
9166
+ dismissRef(node);
9167
+ if (typeof ref === "function") ref(node);
9168
+ else if (ref) ref.current = node;
9169
+ },
9170
+ [dismissRef, ref]
9171
+ );
7936
9172
  return /* @__PURE__ */ jsx(Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
7937
9173
  Content2,
7938
9174
  {
7939
- ref,
9175
+ ref: contentRef,
7940
9176
  align,
7941
9177
  sideOffset,
7942
9178
  onEscapeKeyDown: stopEscapePropagation(onEscapeKeyDown),
@@ -13941,6 +15177,7 @@ function DatePicker({
13941
15177
  };
13942
15178
  const showClear = clearable && Boolean(value) && !disabled;
13943
15179
  const selectedDate = fromIso(value);
15180
+ const dismissRef = useShadowOutsideDismiss(React.useCallback(() => setOpen(false), []));
13944
15181
  return /* @__PURE__ */ jsxs(Root2, { open, onOpenChange: setOpen, children: [
13945
15182
  /* @__PURE__ */ jsx(
13946
15183
  DatePickerTriggerField,
@@ -13958,6 +15195,7 @@ function DatePicker({
13958
15195
  /* @__PURE__ */ jsx(Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
13959
15196
  Content2,
13960
15197
  {
15198
+ ref: dismissRef,
13961
15199
  align,
13962
15200
  side: "bottom",
13963
15201
  sideOffset: 6,
@@ -15128,7 +16366,11 @@ function buildIssueIntegrationsPayload({
15128
16366
  }) {
15129
16367
  const payload = {};
15130
16368
  if (jiraEnabled && jiraFields) {
15131
- payload.jira = { fields: jiraFields };
16369
+ const { [JIRA_ISSUE_TYPE_VALUE_KEY]: issueTypeId, ...fields } = jiraFields;
16370
+ payload.jira = {
16371
+ fields,
16372
+ ...typeof issueTypeId === "string" && issueTypeId ? { issue_type_id: issueTypeId } : {}
16373
+ };
15132
16374
  }
15133
16375
  if (notionEnabled) {
15134
16376
  payload.notion = {
@@ -15276,7 +16518,7 @@ function buildExternalUserPayload(user) {
15276
16518
  };
15277
16519
  }
15278
16520
  export {
15279
- Check as $,
16521
+ Portal as $,
15280
16522
  trimLogBackupPayload as A,
15281
16523
  createSafeLogBackup as B,
15282
16524
  ConsoleCollector as C,
@@ -15294,45 +16536,62 @@ export {
15294
16536
  SelectContent as O,
15295
16537
  Popover as P,
15296
16538
  SelectItem as Q,
15297
- getJiraMetadata as R,
16539
+ JIRA_ISSUE_TYPE_VALUE_KEY as R,
15298
16540
  ScreenRecordingController as S,
15299
- buildJiraIssueFields as T,
15300
- Button$1 as U,
15301
- Root2 as V,
16541
+ getJiraMetadata as T,
16542
+ buildJiraIssueFields as U,
16543
+ getJiraIssueTypeLabel as V,
15302
16544
  WebSocketCollector as W,
15303
- Trigger as X,
15304
- ChevronDown as Y,
15305
- Portal as Z,
15306
- Content2 as _,
16545
+ Button$1 as X,
16546
+ Root2 as Y,
16547
+ Trigger as Z,
16548
+ ChevronDown as _,
15307
16549
  uploadSignedMediaWithApi as a,
15308
- X as a0,
15309
- DatePicker as a1,
15310
- getNotionPageMetadata as a2,
15311
- buildNotionFieldViews as a3,
15312
- DirectUploadError as a4,
15313
- toast as a5,
15314
- getSnapshot as a6,
15315
- subscribe as a7,
15316
- getRegisteredUploadId as a8,
15317
- ChevronRight as a9,
15318
- ReactRemoveScroll as aa,
15319
- hideOthers as ab,
15320
- useFocusGuards as ac,
15321
- FocusScope as ad,
15322
- getExposedJiraFields as ae,
15323
- isJiraFieldExposed as af,
15324
- normalizeExposedJiraFields as ag,
15325
- getPrimaryJiraMapping as ah,
15326
- createCollection as ai,
15327
- useDirection as aj,
15328
- getPrimaryNotionMapping as ak,
15329
- buttonVariants as al,
15330
- findElementBySelector as am,
15331
- findElementByXPath as an,
15332
- OnboardingProvider as ao,
15333
- useOnboardingTarget as ap,
15334
- useOnboardingFlow as aq,
15335
- PopoverAnchor as ar,
16550
+ Content2 as a0,
16551
+ Check as a1,
16552
+ X as a2,
16553
+ DatePicker as a3,
16554
+ getNotionPageMetadata as a4,
16555
+ buildNotionFieldViews as a5,
16556
+ DirectUploadError as a6,
16557
+ toast as a7,
16558
+ getSnapshot as a8,
16559
+ subscribe as a9,
16560
+ sameDigitGroups as aA,
16561
+ labelSimilarityKeepingDigits as aB,
16562
+ landmarkRole as aC,
16563
+ findElementBySelector as aD,
16564
+ findElementByXPath as aE,
16565
+ OnboardingProvider as aF,
16566
+ useOnboardingTarget as aG,
16567
+ useOnboardingFlow as aH,
16568
+ PopoverAnchor as aI,
16569
+ getRegisteredUploadId as aa,
16570
+ ChevronRight as ab,
16571
+ ReactRemoveScroll as ac,
16572
+ hideOthers as ad,
16573
+ useFocusGuards as ae,
16574
+ FocusScope as af,
16575
+ getExposedJiraFields as ag,
16576
+ isJiraFieldExposed as ah,
16577
+ normalizeExposedJiraFields as ai,
16578
+ resolveJiraIssueTypeId as aj,
16579
+ pickJiraIssueTypeFields as ak,
16580
+ switchJiraIssueType as al,
16581
+ getPrimaryJiraMapping as am,
16582
+ createCollection as an,
16583
+ useDirection as ao,
16584
+ getPrimaryNotionMapping as ap,
16585
+ buttonVariants as aq,
16586
+ TEST_ATTR_KEYS as ar,
16587
+ jaccard as as,
16588
+ textSimilarity as at,
16589
+ collectHeadings as au,
16590
+ buildElementLocator as av,
16591
+ normalizeForCompare as aw,
16592
+ CONTAINER_SELECTOR as ax,
16593
+ safeRole as ay,
16594
+ safeAccessibleName as az,
15336
16595
  buildJiraCreateFields as b,
15337
16596
  captureWithModernScreenshot as c,
15338
16597
  directUploadToSignedUrl as d,