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.
@@ -15,14 +15,14 @@ var __privateWrapper = (obj, member, setter, getter) => ({
15
15
  }
16
16
  });
17
17
  var _focused, _cleanup, _setup, _b, _provider, _providerCalled, _c, _online, _cleanup2, _setup2, _d, _gcTimeout, _e, _queryType, _initialState, _revertState, _cache, _client, _retryer, _defaultOptions, _abortSignalConsumed, _Query_instances, isInitialPausedFetch_fn, dispatch_fn, _f, _client2, _currentQuery, _currentQueryInitialState, _currentResult, _currentResultState, _currentResultOptions, _currentThenable, _selectError, _selectFn, _selectResult, _lastQueryWithDefinedData, _staleTimeoutId, _refetchIntervalId, _currentRefetchInterval, _trackedProps, _QueryObserver_instances, executeFetch_fn, updateStaleTimeout_fn, computeRefetchInterval_fn, updateRefetchInterval_fn, updateTimers_fn, clearStaleTimeout_fn, clearRefetchInterval_fn, updateQuery_fn, notify_fn, _g, _client3, _observers, _mutationCache, _retryer2, _Mutation_instances, dispatch_fn2, _h, _mutations, _scopes, _mutationId, _i, _client4, _currentResult2, _currentMutation, _mutateOptions, _MutationObserver_instances, updateResult_fn, notify_fn2, _j, _queries, _k, _queryCache, _mutationCache2, _defaultOptions2, _queryDefaults, _mutationDefaults, _mountCount, _unsubscribeFocus, _unsubscribeOnline, _l, _m;
18
- import { O as OVERLAY_LAYER_INDEX, c as createLucideIcon$1, d as usePortalContainer, a as cn$1, e as OVERLAY_LAYER, s as stopEscapePropagation, P as Presence, f as Primitive, g as composeEventHandlers, h as useDismissableLayerSurface, i as useComposedRefs$1, j as Portal$1, k as createContextScope, l as createSlot, D as DismissableLayer, m as useControllableState, n as useId$1, o as useLayoutEffect2, p as useCallbackRef, u as ungzip_1, q as PortalContainerProvider, r as registerThree } from "./three-_bdgDAmI.js";
19
- import { A as trimLogBackupPayload, B as createSafeLogBackup, D as getLogBackupSessionId, N as NetworkCollector, C as ConsoleCollector, W as WebSocketCollector, E as createIndexedDbLogBackup, b as buildJiraCreateFields, P as Popover, F as PopoverTrigger, G as Input, H as PopoverContent, L as Label, J as Select, K as SelectTrigger, M as SelectValue, O as SelectContent, Q as SelectItem, R as getJiraMetadata, T as buildJiraIssueFields, U as Button, V as Root2$2, X as Trigger$2, Y as ChevronDown, Z as Portal, _ as Content2$1, $ as Check, a0 as X$1, a1 as DatePicker, e as buildNotionCreateFields, a2 as getNotionPageMetadata, a3 as buildNotionFieldViews, c as captureWithModernScreenshot, p as pristineFetch, d as directUploadToSignedUrl, a4 as DirectUploadError, a5 as toast, a6 as getSnapshot, a7 as subscribe$1, a as uploadSignedMediaWithApi, t as sanitizeString, a8 as getRegisteredUploadId, f as buildGuestOwnerQuery, j as devLogger, x as getCurrentPageUrl, a9 as ChevronRight, aa as ReactRemoveScroll, ab as hideOthers, ac as useFocusGuards, ad as FocusScope, ae as getExposedJiraFields, af as isJiraFieldExposed, ag as normalizeExposedJiraFields, z as preloadModernScreenshot, u as uploadScreenshotDataUrls, k as filterExcludeServiceRelatedLogs, l as filterExcludeServiceRelatedConsoleLogs, s as selectNetworkLogsForSubmit, m as compactNetworkLogsForTransport, n as CONSOLE_LOG_SUBMIT_LIMIT, g as getElementPosition, o as buildExternalUserPayload, v as serializeSocketTranscript, w as uploadSocketTranscript, q as shrinkNetworkLogsToFit, r as measureJsonBytes, i as buildIssueIntegrationsPayload, y as SessionReplayCaptureController, ah as getPrimaryJiraMapping, ai as createCollection, aj as useDirection, ak as getPrimaryNotionMapping, al as buttonVariants, am as findElementBySelector, an as findElementByXPath, S as ScreenRecordingController, h as composeIssueFilterGroups, ao as OnboardingProvider, ap as useOnboardingTarget, aq as useOnboardingFlow, ar as PopoverAnchor } from "./externalUserPayload-CVYSPfcx.js";
18
+ import { O as OVERLAY_LAYER_INDEX, c as createLucideIcon$1, d as usePortalContainer, a as cn$1, e as OVERLAY_LAYER, s as stopEscapePropagation, P as Presence, f as Primitive, g as composeEventHandlers, h as useDismissableLayerSurface, i as useComposedRefs$1, j as Portal$1, k as createContextScope, l as createSlot, D as DismissableLayer, m as useControllableState, n as useId$1, o as useLayoutEffect2, p as useCallbackRef, u as ungzip_1, q as PortalContainerProvider, r as registerThree } from "./three-DQdLNs7v.js";
19
+ import { A as trimLogBackupPayload, B as createSafeLogBackup, D as getLogBackupSessionId, N as NetworkCollector, C as ConsoleCollector, W as WebSocketCollector, E as createIndexedDbLogBackup, b as buildJiraCreateFields, P as Popover, F as PopoverTrigger, G as Input, H as PopoverContent, L as Label, J as Select, K as SelectTrigger, M as SelectValue, O as SelectContent, Q as SelectItem, R as JIRA_ISSUE_TYPE_VALUE_KEY, T as getJiraMetadata, U as buildJiraIssueFields, V as getJiraIssueTypeLabel, X as Button, Y as Root2$2, Z as Trigger$2, _ as ChevronDown, $ as Portal, a0 as Content2$1, a1 as Check, a2 as X$1, a3 as DatePicker, e as buildNotionCreateFields, a4 as getNotionPageMetadata, a5 as buildNotionFieldViews, c as captureWithModernScreenshot, p as pristineFetch, d as directUploadToSignedUrl, a6 as DirectUploadError, a7 as toast, a8 as getSnapshot, a9 as subscribe$1, a as uploadSignedMediaWithApi, t as sanitizeString, aa as getRegisteredUploadId, f as buildGuestOwnerQuery, j as devLogger, x as getCurrentPageUrl, ab as ChevronRight, ac as ReactRemoveScroll, ad as hideOthers, ae as useFocusGuards, af as FocusScope, ag as getExposedJiraFields, ah as isJiraFieldExposed, ai as normalizeExposedJiraFields, z as preloadModernScreenshot, g as getElementPosition, u as uploadScreenshotDataUrls, k as filterExcludeServiceRelatedLogs, l as filterExcludeServiceRelatedConsoleLogs, s as selectNetworkLogsForSubmit, m as compactNetworkLogsForTransport, n as CONSOLE_LOG_SUBMIT_LIMIT, o as buildExternalUserPayload, v as serializeSocketTranscript, w as uploadSocketTranscript, q as shrinkNetworkLogsToFit, r as measureJsonBytes, i as buildIssueIntegrationsPayload, y as SessionReplayCaptureController, aj as resolveJiraIssueTypeId, ak as pickJiraIssueTypeFields, al as switchJiraIssueType, am as getPrimaryJiraMapping, an as createCollection, ao as useDirection, ap as getPrimaryNotionMapping, aq as buttonVariants, ar as TEST_ATTR_KEYS, as as jaccard, at as textSimilarity, au as collectHeadings, av as buildElementLocator, aw as normalizeForCompare, ax as CONTAINER_SELECTOR, ay as safeRole, az as safeAccessibleName, aA as sameDigitGroups, aB as labelSimilarityKeepingDigits, aC as landmarkRole, aD as findElementBySelector, aE as findElementByXPath, S as ScreenRecordingController, h as composeIssueFilterGroups, aF as OnboardingProvider, aG as useOnboardingTarget, aH as useOnboardingFlow, aI as PopoverAnchor } from "./externalUserPayload-BbOEmKZD.js";
20
20
  import * as React from "react";
21
21
  import { useRef, useState, useEffect, useId, useLayoutEffect, useCallback, forwardRef, createElement, createContext, useContext, Component, Suspense, useInsertionEffect, useMemo, Children, isValidElement, Fragment as Fragment$1, useSyncExternalStore, useDeferredValue } from "react";
22
22
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
23
23
  import { createRoot } from "react-dom/client";
24
24
  import { createPortal } from "react-dom";
25
- import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from "./tooltip-UijEbdDX.js";
25
+ import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from "./tooltip-DSCAsWIp.js";
26
26
  function readReleaseMarker() {
27
27
  try {
28
28
  const g = globalThis.__ISSUE_STICKER_RELEASE__;
@@ -235,6 +235,82 @@ function getIntegrationFailureMessage(service) {
235
235
  const action = FAILED_ACTION_TEXT[service] ?? "연동 작업을 마치지 못했습니다.";
236
236
  return `이슈는 저장했지만 ${action}`;
237
237
  }
238
+ function debounce(func, debounceMs, { signal, edges } = {}) {
239
+ let pendingThis = void 0;
240
+ let pendingArgs = null;
241
+ const leading = edges != null && edges.includes("leading");
242
+ const trailing = edges == null || edges.includes("trailing");
243
+ const invoke = () => {
244
+ if (pendingArgs !== null) {
245
+ func.apply(pendingThis, pendingArgs);
246
+ pendingThis = void 0;
247
+ pendingArgs = null;
248
+ }
249
+ };
250
+ const onTimerEnd = () => {
251
+ if (trailing) invoke();
252
+ cancel();
253
+ };
254
+ let timeoutId = null;
255
+ const schedule = () => {
256
+ if (timeoutId != null) clearTimeout(timeoutId);
257
+ timeoutId = setTimeout(() => {
258
+ timeoutId = null;
259
+ onTimerEnd();
260
+ }, debounceMs);
261
+ };
262
+ const cancelTimer = () => {
263
+ if (timeoutId !== null) {
264
+ clearTimeout(timeoutId);
265
+ timeoutId = null;
266
+ }
267
+ };
268
+ const cancel = () => {
269
+ cancelTimer();
270
+ pendingThis = void 0;
271
+ pendingArgs = null;
272
+ };
273
+ const flush = () => {
274
+ invoke();
275
+ };
276
+ const debounced = function(...args) {
277
+ if (signal == null ? void 0 : signal.aborted) return;
278
+ pendingThis = this;
279
+ pendingArgs = args;
280
+ const isFirstCall = timeoutId == null;
281
+ schedule();
282
+ if (leading && isFirstCall) invoke();
283
+ };
284
+ debounced.schedule = schedule;
285
+ debounced.cancel = cancel;
286
+ debounced.flush = flush;
287
+ signal == null ? void 0 : signal.addEventListener("abort", cancel, { once: true });
288
+ return debounced;
289
+ }
290
+ function throttle(func, throttleMs, { signal, edges = ["leading", "trailing"] } = {}) {
291
+ let pendingAt = null;
292
+ const debounced = debounce(function(...args) {
293
+ pendingAt = Date.now();
294
+ func.apply(this, args);
295
+ }, throttleMs, {
296
+ signal,
297
+ edges
298
+ });
299
+ const throttled = function(...args) {
300
+ if (pendingAt == null) pendingAt = Date.now();
301
+ if (Date.now() - pendingAt >= throttleMs) {
302
+ pendingAt = Date.now();
303
+ func.apply(this, args);
304
+ debounced.cancel();
305
+ debounced.schedule();
306
+ return;
307
+ }
308
+ debounced.apply(this, args);
309
+ };
310
+ throttled.cancel = debounced.cancel;
311
+ throttled.flush = debounced.flush;
312
+ return throttled;
313
+ }
238
314
  function getJiraFieldDefaultValues(exposedFields, fieldDefinitions = []) {
239
315
  const values = {};
240
316
  for (const field of buildJiraCreateFields(exposedFields, fieldDefinitions)) {
@@ -270,6 +346,79 @@ function createJiraFieldSearchConfig(source) {
270
346
  return null;
271
347
  };
272
348
  }
349
+ function getDigitFromCode(code2) {
350
+ if (!code2) return null;
351
+ const match = code2.match(/^(Digit|Numpad)([1-9])$/);
352
+ return match ? parseInt(match[2], 10) : null;
353
+ }
354
+ function isModifierKeyCode(code2) {
355
+ if (!code2) return false;
356
+ return code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight";
357
+ }
358
+ function isAltKeyCode(code2) {
359
+ if (!code2) return false;
360
+ return code2 === "AltLeft" || code2 === "AltRight";
361
+ }
362
+ function isModifierPressed(event) {
363
+ const hasModifier = event.ctrlKey || event.metaKey;
364
+ const hasAlt = event.altKey;
365
+ return hasModifier && hasAlt;
366
+ }
367
+ function isIssueModeShortcut(event) {
368
+ if (event.isComposing === true) {
369
+ return false;
370
+ }
371
+ if (event.code) {
372
+ const digit = getDigitFromCode(event.code);
373
+ if (digit === 1 && !event.shiftKey) {
374
+ return isModifierPressed(event);
375
+ }
376
+ if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
377
+ return false;
378
+ }
379
+ }
380
+ const isIssueModeKey = event.key === "1" && !event.shiftKey;
381
+ if (isIssueModeKey) {
382
+ return isModifierPressed(event);
383
+ }
384
+ return false;
385
+ }
386
+ function isRecordingShortcut(event) {
387
+ if (event.isComposing === true) {
388
+ return false;
389
+ }
390
+ if (event.code) {
391
+ const digit = getDigitFromCode(event.code);
392
+ if (digit === 2 && !event.shiftKey) {
393
+ return isModifierPressed(event);
394
+ }
395
+ if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
396
+ return false;
397
+ }
398
+ }
399
+ const isRecordingKey = event.key === "2" && !event.shiftKey;
400
+ if (isRecordingKey) {
401
+ return isModifierPressed(event);
402
+ }
403
+ return false;
404
+ }
405
+ function isShortcutKey(event) {
406
+ return isIssueModeShortcut(event) || isRecordingShortcut(event);
407
+ }
408
+ function isShortcutReleaseKey(key, code2) {
409
+ if (code2) {
410
+ if (code2 === "Digit1" || code2 === "Numpad1") {
411
+ return true;
412
+ }
413
+ if (code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight") {
414
+ return true;
415
+ }
416
+ if (code2 === "AltLeft" || code2 === "AltRight") {
417
+ return true;
418
+ }
419
+ }
420
+ return key === "1" || key === "Control" || key === "Meta" || key === "Alt";
421
+ }
273
422
  const ISSUE_STICKER_HOST_ELEMENT_ID = "issue-sticker-host";
274
423
  const ISSUE_STICKER_RUNTIME_OWNER_ATTRIBUTE = "data-issue-sticker-runtime";
275
424
  const ISSUE_STICKER_EXTENSION_RUNTIME_READY_EVENT = "issue-sticker:extension-runtime-ready";
@@ -325,16 +474,43 @@ function isEditableTarget(target) {
325
474
  if (!(target instanceof HTMLElement)) return false;
326
475
  return target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable === true;
327
476
  }
477
+ const HOST_KEY_GUARD_EVENTS = ["keydown", "keypress"];
478
+ const HOST_CLIPBOARD_GUARD_EVENTS = ["copy", "cut", "paste"];
328
479
  function attachHostTypingGuard(shadowRoot) {
329
- const handleKeyDown = (event) => {
480
+ const handleKey = (event) => {
330
481
  const keyboardEvent = event;
331
- if (keyboardEvent.ctrlKey || keyboardEvent.metaKey || keyboardEvent.altKey) return;
332
- if (keyboardEvent.key === "Escape") return;
333
- if (!isEditableTarget(keyboardEvent.composedPath()[0])) return;
482
+ if (keyboardEvent.key !== "Escape") {
483
+ if (isShortcutKey(keyboardEvent)) return;
484
+ if (!isEditableTarget(keyboardEvent.composedPath()[0])) return;
485
+ }
334
486
  keyboardEvent.stopPropagation();
335
487
  };
336
- shadowRoot.addEventListener("keydown", handleKeyDown);
337
- return () => shadowRoot.removeEventListener("keydown", handleKeyDown);
488
+ const stopLeakingToPage = (event) => {
489
+ event.stopPropagation();
490
+ };
491
+ HOST_KEY_GUARD_EVENTS.forEach((type) => {
492
+ shadowRoot.addEventListener(type, handleKey);
493
+ });
494
+ HOST_CLIPBOARD_GUARD_EVENTS.forEach((type) => {
495
+ shadowRoot.addEventListener(type, stopLeakingToPage);
496
+ });
497
+ return () => {
498
+ HOST_KEY_GUARD_EVENTS.forEach((type) => {
499
+ shadowRoot.removeEventListener(type, handleKey);
500
+ });
501
+ HOST_CLIPBOARD_GUARD_EVENTS.forEach((type) => {
502
+ shadowRoot.removeEventListener(type, stopLeakingToPage);
503
+ });
504
+ };
505
+ }
506
+ function listenEscapeKeydown(node2, handler) {
507
+ const handleKeyDown = (event) => {
508
+ if (event.key === "Escape") handler(event);
509
+ };
510
+ const root2 = node2 == null ? void 0 : node2.getRootNode();
511
+ const targets = root2 instanceof ShadowRoot ? [window, root2] : [window];
512
+ targets.forEach((target) => target.addEventListener("keydown", handleKeyDown));
513
+ return () => targets.forEach((target) => target.removeEventListener("keydown", handleKeyDown));
338
514
  }
339
515
  const HOST_POINTER_GUARD_EVENTS = [
340
516
  "click",
@@ -360,6 +536,33 @@ function attachHostPointerGuard(shadowRoot) {
360
536
  });
361
537
  };
362
538
  }
539
+ const HOST_INTERACTION_GUARD_EVENTS = [
540
+ "focusin",
541
+ "focusout",
542
+ "input",
543
+ "beforeinput",
544
+ "wheel",
545
+ "touchmove",
546
+ "dragstart",
547
+ "dragenter",
548
+ "dragover",
549
+ "dragleave",
550
+ "drop",
551
+ "dragend"
552
+ ];
553
+ function attachHostInteractionGuard(shadowRoot) {
554
+ const stopLeakingToPage = (event) => {
555
+ event.stopPropagation();
556
+ };
557
+ HOST_INTERACTION_GUARD_EVENTS.forEach((type) => {
558
+ shadowRoot.addEventListener(type, stopLeakingToPage, { passive: true });
559
+ });
560
+ return () => {
561
+ HOST_INTERACTION_GUARD_EVENTS.forEach((type) => {
562
+ shadowRoot.removeEventListener(type, stopLeakingToPage);
563
+ });
564
+ };
565
+ }
363
566
  const RUNTIME_OWNER_MARKER_KEY = "__issueStickerRuntimeOwner";
364
567
  function markerHost() {
365
568
  return typeof window === "undefined" ? null : window;
@@ -952,7 +1155,7 @@ const TriangleAlert = createLucideIcon$1("TriangleAlert", [
952
1155
  ["path", { d: "M12 17h.01", key: "p32p05" }]
953
1156
  ]);
954
1157
  const EMPTY_SELECT_VALUE$1 = "__ISSUE_STICKER_EMPTY__";
955
- const JIRA_REQUIRED_FIELD_IDS = /* @__PURE__ */ new Set(["priority"]);
1158
+ const JIRA_REQUIRED_FIELD_IDS = /* @__PURE__ */ new Set(["priority", "issuetype"]);
956
1159
  function JiraReadonlyField({ field }) {
957
1160
  const displayValue = field.displayValue || "-";
958
1161
  return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
@@ -1009,6 +1212,7 @@ function JiraSelectFieldControl({ field, disabled, onUpdate }) {
1009
1212
  {
1010
1213
  value,
1011
1214
  onValueChange: (nextValue) => {
1215
+ if (nextValue === "") return;
1012
1216
  onUpdate(field.id, nextValue === EMPTY_SELECT_VALUE$1 ? null : nextValue);
1013
1217
  },
1014
1218
  disabled,
@@ -1104,6 +1308,19 @@ function JiraFieldList({
1104
1308
  }) })
1105
1309
  ] });
1106
1310
  }
1311
+ function buildIssueTypeView(issueTypes, issueTypeId) {
1312
+ const selected = issueTypes.find((type) => type.id === issueTypeId);
1313
+ return {
1314
+ id: JIRA_ISSUE_TYPE_VALUE_KEY,
1315
+ label: "이슈 타입",
1316
+ value: issueTypeId,
1317
+ displayValue: (selected == null ? void 0 : selected.name) ?? issueTypeId,
1318
+ editValue: issueTypeId,
1319
+ options: issueTypes.map((type) => ({ id: type.id, name: type.name })),
1320
+ editable: true,
1321
+ inputType: "select"
1322
+ };
1323
+ }
1107
1324
  function JiraFormFieldsSection({
1108
1325
  exposedFields,
1109
1326
  fieldDefinitions,
@@ -1111,19 +1328,30 @@ function JiraFormFieldsSection({
1111
1328
  disabled = false,
1112
1329
  title = "Jira 필드",
1113
1330
  onFieldUpdate,
1114
- getSearchConfig
1331
+ getSearchConfig,
1332
+ issueTypes = [],
1333
+ issueTypeId,
1334
+ onIssueTypeChange
1115
1335
  }) {
1116
1336
  const fields = buildJiraCreateFields(exposedFields, fieldDefinitions, values);
1117
- if (fields.length === 0) {
1337
+ const showIssueType = issueTypes.length > 1 && Boolean(issueTypeId) && Boolean(onIssueTypeChange);
1338
+ const views = showIssueType ? [buildIssueTypeView(issueTypes, issueTypeId), ...fields] : fields;
1339
+ if (views.length === 0) {
1118
1340
  return null;
1119
1341
  }
1120
1342
  return /* @__PURE__ */ jsx(
1121
1343
  JiraFieldList,
1122
1344
  {
1123
1345
  title,
1124
- fields,
1346
+ fields: views,
1125
1347
  disabled,
1126
- onFieldUpdate,
1348
+ onFieldUpdate: (fieldId, value) => {
1349
+ if (fieldId === JIRA_ISSUE_TYPE_VALUE_KEY) {
1350
+ if (typeof value === "string" && value) onIssueTypeChange == null ? void 0 : onIssueTypeChange(value);
1351
+ return;
1352
+ }
1353
+ onFieldUpdate(fieldId, value);
1354
+ },
1127
1355
  getSearchConfig
1128
1356
  }
1129
1357
  );
@@ -1138,6 +1366,7 @@ function JiraIssueSection({
1138
1366
  canSync = false,
1139
1367
  title = "Jira 연동",
1140
1368
  issueKeyLabel = "이슈 번호 (Jira)",
1369
+ issueTypeTitle = "이슈 타입",
1141
1370
  syncTitle = "Jira에서 노출된 필드를 다시 가져옵니다",
1142
1371
  syncIdleLabel = "Jira → 이슈스티커 동기화",
1143
1372
  syncLoadingLabel = "동기화 중...",
@@ -1155,6 +1384,7 @@ function JiraIssueSection({
1155
1384
  mapping.jira_field_definitions ?? [],
1156
1385
  new Map(Object.entries(mapping.jira_field_display_labels ?? {}))
1157
1386
  );
1387
+ const issueTypeLabel = getJiraIssueTypeLabel(mapping);
1158
1388
  if (!meta || !integrationId) {
1159
1389
  return null;
1160
1390
  }
@@ -1191,7 +1421,11 @@ function JiraIssueSection({
1191
1421
  children: jiraLinkLabel
1192
1422
  }
1193
1423
  ) : null
1194
- ] })
1424
+ ] }),
1425
+ issueTypeLabel ? /* @__PURE__ */ jsxs(Fragment, { children: [
1426
+ /* @__PURE__ */ jsx("h5", { className: "text-sm font-semibold text-text-primary", children: issueTypeTitle }),
1427
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-primary", children: issueTypeLabel })
1428
+ ] }) : null
1195
1429
  ] }),
1196
1430
  /* @__PURE__ */ jsx(
1197
1431
  JiraFieldList,
@@ -4722,6 +4956,9 @@ function useSuspenseQuery(options, queryClient2) {
4722
4956
  QueryObserver
4723
4957
  );
4724
4958
  }
4959
+ function queryOptions(options) {
4960
+ return options;
4961
+ }
4725
4962
  function useMutation(options, queryClient2) {
4726
4963
  const client = useQueryClient();
4727
4964
  const [observer2] = React.useState(
@@ -5383,6 +5620,72 @@ function useNetworkLogs() {
5383
5620
  networkLogs
5384
5621
  };
5385
5622
  }
5623
+ const ISSUE_FOCUS_PARAM = "issue-sticker-focus";
5624
+ const ISSUE_FOCUS_STORAGE_KEY = "issue-sticker:focus-issue-id";
5625
+ const ISSUE_FOCUS_TTL_MS = 5 * 60 * 1e3;
5626
+ function takeIssueFocusIssueId() {
5627
+ if (typeof window === "undefined") return null;
5628
+ const url = new URL(window.location.href);
5629
+ const issueId = url.searchParams.get(ISSUE_FOCUS_PARAM);
5630
+ if (!issueId) return null;
5631
+ url.searchParams.delete(ISSUE_FOCUS_PARAM);
5632
+ window.history.replaceState(window.history.state, "", `${url.pathname}${url.search}${url.hash}`);
5633
+ return issueId;
5634
+ }
5635
+ function currentAddressWithoutHash() {
5636
+ const url = new URL(window.location.href);
5637
+ url.hash = "";
5638
+ return url.toString();
5639
+ }
5640
+ function readStoredIssueFocus() {
5641
+ try {
5642
+ const raw = window.sessionStorage.getItem(ISSUE_FOCUS_STORAGE_KEY);
5643
+ if (!raw) return null;
5644
+ const parsed = JSON.parse(raw);
5645
+ if (typeof parsed.issueId !== "string" || typeof parsed.href !== "string" || typeof parsed.capturedAt !== "number") {
5646
+ return null;
5647
+ }
5648
+ return parsed;
5649
+ } catch {
5650
+ return null;
5651
+ }
5652
+ }
5653
+ function removeStoredIssueFocus() {
5654
+ try {
5655
+ window.sessionStorage.removeItem(ISSUE_FOCUS_STORAGE_KEY);
5656
+ } catch {
5657
+ }
5658
+ }
5659
+ let fallbackCapturedIssueId = null;
5660
+ function captureIssueFocusIssueId() {
5661
+ const issueId = takeIssueFocusIssueId();
5662
+ if (!issueId) return;
5663
+ try {
5664
+ const stored = {
5665
+ issueId,
5666
+ href: currentAddressWithoutHash(),
5667
+ capturedAt: Date.now()
5668
+ };
5669
+ window.sessionStorage.setItem(ISSUE_FOCUS_STORAGE_KEY, JSON.stringify(stored));
5670
+ } catch {
5671
+ fallbackCapturedIssueId = issueId;
5672
+ }
5673
+ }
5674
+ function peekIssueFocusIssueId() {
5675
+ const stored = readStoredIssueFocus();
5676
+ if (stored) {
5677
+ const sameAddress = stored.href === currentAddressWithoutHash();
5678
+ const fresh = Date.now() - stored.capturedAt < ISSUE_FOCUS_TTL_MS;
5679
+ if (sameAddress && fresh) return stored.issueId;
5680
+ removeStoredIssueFocus();
5681
+ return null;
5682
+ }
5683
+ return fallbackCapturedIssueId;
5684
+ }
5685
+ function clearIssueFocusIssueId() {
5686
+ removeStoredIssueFocus();
5687
+ fallbackCapturedIssueId = null;
5688
+ }
5386
5689
  const injectCSS = (shadowRoot, cssText) => {
5387
5690
  const style = document.createElement("style");
5388
5691
  style.textContent = cssText;
@@ -5610,6 +5913,10 @@ const TOKEN_REFRESH_MARGIN_MS = 6e4;
5610
5913
  const BRIDGE_TIMEOUT_MS = 15e3;
5611
5914
  const SDK_HOST_ELEMENT_ID = "issue-sticker-host";
5612
5915
  const SDK_SHADOW_ROOT_ID = "issue-sticker-shadow-root";
5916
+ function emitAuthEvent(event) {
5917
+ const manager = SDKManager.getInstance();
5918
+ if (manager.isInitialized()) manager.eventBus.emit(event);
5919
+ }
5613
5920
  const AuthContext = createContext(null);
5614
5921
  function buildBridgeUrl(bridgeUrl, params) {
5615
5922
  const url = new URL(bridgeUrl);
@@ -5645,6 +5952,7 @@ function AuthProvider({ apiKey, children }) {
5645
5952
  const [authBridgeUrl, setAuthBridgeUrl] = useState(null);
5646
5953
  const [showLoginFrame, setShowLoginFrame] = useState(false);
5647
5954
  const stateRef = useRef(state);
5955
+ const isMemberRef = useRef(false);
5648
5956
  const hiddenFrameRef = useRef(null);
5649
5957
  const bridgeOriginRef = useRef(null);
5650
5958
  const bridgeReadyRef = useRef(false);
@@ -5717,14 +6025,11 @@ function AuthProvider({ apiKey, children }) {
5717
6025
  };
5718
6026
  }, [showLoginFrame]);
5719
6027
  useEffect(() => {
6028
+ var _a;
5720
6029
  if (!showLoginFrame) return;
5721
- const handleKeyDown = (event) => {
5722
- if (event.key === "Escape") {
5723
- closeLoginFrame();
5724
- }
5725
- };
5726
- window.addEventListener("keydown", handleKeyDown);
5727
- return () => window.removeEventListener("keydown", handleKeyDown);
6030
+ return listenEscapeKeydown((_a = document.getElementById(SDK_HOST_ELEMENT_ID)) == null ? void 0 : _a.shadowRoot, () => {
6031
+ closeLoginFrame();
6032
+ });
5728
6033
  }, [closeLoginFrame, showLoginFrame]);
5729
6034
  const getConfiguredUser = useCallback(() => {
5730
6035
  try {
@@ -5764,6 +6069,10 @@ function AuthProvider({ apiKey, children }) {
5764
6069
  token: result.accessToken,
5765
6070
  error: null
5766
6071
  }));
6072
+ if (!isMemberRef.current) {
6073
+ isMemberRef.current = true;
6074
+ emitAuthEvent("auth:login");
6075
+ }
5767
6076
  }, []);
5768
6077
  const waitForBridgeReady = useCallback(async () => {
5769
6078
  if (bridgeReadyRef.current) return;
@@ -5963,6 +6272,10 @@ function AuthProvider({ apiKey, children }) {
5963
6272
  await clearToken();
5964
6273
  setShowLoginFrame(false);
5965
6274
  setSdkMode("public");
6275
+ if (isMemberRef.current) {
6276
+ isMemberRef.current = false;
6277
+ emitAuthEvent("auth:logout");
6278
+ }
5966
6279
  try {
5967
6280
  (_b2 = (_a = hiddenFrameRef.current) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b2.postMessage(
5968
6281
  {
@@ -14931,7 +15244,7 @@ const FOCUSABLE_SELECTOR = [
14931
15244
  "textarea:not([disabled])",
14932
15245
  '[tabindex]:not([tabindex="-1"])'
14933
15246
  ].join(",");
14934
- function isVisible(element2, container) {
15247
+ function isVisible$1(element2, container) {
14935
15248
  if (getComputedStyle(element2).visibility === "hidden") return false;
14936
15249
  let node2 = element2;
14937
15250
  while (node2) {
@@ -14943,7 +15256,7 @@ function isVisible(element2, container) {
14943
15256
  }
14944
15257
  function tabbables(container) {
14945
15258
  return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter(
14946
- (element2) => element2.tabIndex >= 0 && isVisible(element2, container)
15259
+ (element2) => element2.tabIndex >= 0 && isVisible$1(element2, container)
14947
15260
  );
14948
15261
  }
14949
15262
  function useOverlayFocus({
@@ -14998,20 +15311,16 @@ function OverlayShell({
14998
15311
  useOverlayFocus({ enabled: open, container: shell, initialFocus: "container" });
14999
15312
  useEffect(() => {
15000
15313
  if (!open) return;
15001
- const handleKeyDown = (e) => {
15314
+ return listenEscapeKeydown(shell, (e) => {
15002
15315
  var _a;
15003
15316
  if (e.defaultPrevented) {
15004
15317
  return;
15005
15318
  }
15006
- if (e.key === "Escape") {
15007
- e.preventDefault();
15008
- e.stopPropagation();
15009
- (_a = onCloseRef.current) == null ? void 0 : _a.call(onCloseRef);
15010
- }
15011
- };
15012
- window.addEventListener("keydown", handleKeyDown);
15013
- return () => window.removeEventListener("keydown", handleKeyDown);
15014
- }, [open]);
15319
+ e.preventDefault();
15320
+ e.stopPropagation();
15321
+ (_a = onCloseRef.current) == null ? void 0 : _a.call(onCloseRef);
15322
+ });
15323
+ }, [open, shell]);
15015
15324
  return /* @__PURE__ */ jsx(AnimatePresence, { onExitComplete, children: open ? /* @__PURE__ */ jsx(
15016
15325
  motion.div,
15017
15326
  {
@@ -15993,13 +16302,16 @@ class JiraService {
15993
16302
  return result.url;
15994
16303
  }
15995
16304
  async loadIntegrationFields(integrationId) {
15996
- var _a, _b2;
16305
+ var _a, _b2, _c2, _d2;
15997
16306
  const response = await apiClient.getResponse(
15998
16307
  `/api/jira/integration-fields/${encodeURIComponent(integrationId)}`
15999
16308
  );
16000
16309
  return {
16001
16310
  fields: ((_a = response.data) == null ? void 0 : _a.fields) ?? [],
16002
- exposedFields: normalizeExposedJiraFields((_b2 = response.data) == null ? void 0 : _b2.exposed_fields)
16311
+ exposedFields: normalizeExposedJiraFields((_b2 = response.data) == null ? void 0 : _b2.exposed_fields),
16312
+ // 옛 백엔드는 타입 정보를 주지 않는다. 비면 폼은 타입 셀렉트 없이 fields 로 동작한다.
16313
+ issueTypes: ((_c2 = response.data) == null ? void 0 : _c2.issue_types) ?? [],
16314
+ defaultIssueTypeId: ((_d2 = response.data) == null ? void 0 : _d2.default_issue_type_id) ?? null
16003
16315
  };
16004
16316
  }
16005
16317
  async searchProjectUsers(projectId, query) {
@@ -16388,6 +16700,7 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
16388
16700
  x: e.clientX + window.scrollX,
16389
16701
  y: e.clientY + window.scrollY,
16390
16702
  element: selectedElement,
16703
+ tracked: getElementPosition(selectedElement, e),
16391
16704
  videoFile: recordedVideoFile ?? void 0
16392
16705
  };
16393
16706
  if (!newClickPosition.videoFile) {
@@ -16565,7 +16878,7 @@ function useIssueSubmission({
16565
16878
  const limitedNetworkLogs = selectNetworkLogsForSubmit(filteredNetworkLogs);
16566
16879
  const networkLogs = compactNetworkLogsForTransport(limitedNetworkLogs) ?? [];
16567
16880
  const consoleLogs = filteredConsoleLogs.slice(-CONSOLE_LOG_SUBMIT_LIMIT);
16568
- const positionData = getElementPosition(data.position.element, {
16881
+ const positionData = data.position.tracked ?? getElementPosition(data.position.element, {
16569
16882
  clientX: data.position.x - window.scrollX,
16570
16883
  clientY: data.position.y - window.scrollY
16571
16884
  });
@@ -16583,7 +16896,9 @@ function useIssueSubmission({
16583
16896
  selector: positionData.selector,
16584
16897
  xpath: positionData.xpath,
16585
16898
  viewport: positionData.viewport,
16586
- elementRect: positionData.elementRect
16899
+ elementRect: positionData.elementRect,
16900
+ locator: positionData.locator,
16901
+ component: positionData.component
16587
16902
  },
16588
16903
  screenshot: screenshotUrls && screenshotUrls.length > 0 ? screenshotUrls : void 0,
16589
16904
  video: videoUrl,
@@ -17354,17 +17669,26 @@ function useJiraFieldSearchConfig(projectId) {
17354
17669
  [projectId]
17355
17670
  );
17356
17671
  }
17357
- function useJiraIntegrationFields(integrationId) {
17358
- const { data } = useSuspenseQuery({
17672
+ function jiraIntegrationFieldsQueryOptions(integrationId) {
17673
+ return queryOptions({
17359
17674
  queryKey: ["jiraIntegrationFields", integrationId],
17360
- queryFn: () => jiraService.loadIntegrationFields(integrationId)
17675
+ queryFn: () => jiraService.loadIntegrationFields(integrationId),
17676
+ // admin 에서 바꾼 노출 필드·이슈 타입이 전역 기본값(5분) 동안 안 보이면 안 된다. 폼을 열
17677
+ // 때와 창에 포커스가 돌아올 때(admin 탭에서 돌아올 때) 다시 읽는다. 백엔드는 노출 필드를
17678
+ // DB 에서 읽고 Jira 필드 정의는 60초 캐시라 Jira 호출은 거의 늘지 않는다.
17679
+ staleTime: 0
17361
17680
  });
17681
+ }
17682
+ function useJiraIntegrationFields(integrationId) {
17683
+ const { data } = useSuspenseQuery(jiraIntegrationFieldsQueryOptions(integrationId));
17362
17684
  useEffect(() => {
17363
17685
  jiraService.updateExposedFields(integrationId, data.exposedFields);
17364
17686
  }, [data.exposedFields, integrationId]);
17365
17687
  return {
17366
17688
  fields: data.fields,
17367
- exposedFields: data.exposedFields
17689
+ exposedFields: data.exposedFields,
17690
+ issueTypes: data.issueTypes,
17691
+ defaultIssueTypeId: data.defaultIssueTypeId
17368
17692
  };
17369
17693
  }
17370
17694
  function IssueFormJiraFields({
@@ -17372,12 +17696,35 @@ function IssueFormJiraFields({
17372
17696
  values,
17373
17697
  disabled = false,
17374
17698
  onChange,
17375
- onDefaultsResolved
17699
+ onDefaultsResolved,
17700
+ onValuesReplace
17376
17701
  }) {
17377
17702
  const { getAuthInfo } = useAuthInfo();
17378
- const { fields: fieldDefinitions, exposedFields } = useJiraIntegrationFields(integrationId);
17703
+ const { fields, exposedFields, issueTypes, defaultIssueTypeId } = useJiraIntegrationFields(integrationId);
17379
17704
  const getSearchConfig = useJiraFieldSearchConfig(getAuthInfo().projectId);
17380
- useJiraFieldDefaults(integrationId, exposedFields, fieldDefinitions, onDefaultsResolved);
17705
+ const issueTypeId = resolveJiraIssueTypeId(
17706
+ issueTypes,
17707
+ values[JIRA_ISSUE_TYPE_VALUE_KEY],
17708
+ defaultIssueTypeId
17709
+ );
17710
+ const fieldDefinitions = pickJiraIssueTypeFields(fields, issueTypes, issueTypeId);
17711
+ useJiraFieldDefaults(
17712
+ `${integrationId}:${issueTypeId ?? ""}`,
17713
+ exposedFields,
17714
+ fieldDefinitions,
17715
+ onDefaultsResolved
17716
+ );
17717
+ const handleIssueTypeChange = (nextIssueTypeId) => {
17718
+ if (nextIssueTypeId === issueTypeId) return;
17719
+ onValuesReplace == null ? void 0 : onValuesReplace(
17720
+ (current) => switchJiraIssueType(current, {
17721
+ exposedFields,
17722
+ previousFields: fieldDefinitions,
17723
+ nextFields: pickJiraIssueTypeFields(fields, issueTypes, nextIssueTypeId),
17724
+ nextIssueTypeId
17725
+ })
17726
+ );
17727
+ };
17381
17728
  return /* @__PURE__ */ jsx(
17382
17729
  JiraFormFieldsSection,
17383
17730
  {
@@ -17386,27 +17733,27 @@ function IssueFormJiraFields({
17386
17733
  values,
17387
17734
  disabled,
17388
17735
  onFieldUpdate: onChange,
17389
- getSearchConfig
17736
+ getSearchConfig,
17737
+ issueTypes,
17738
+ issueTypeId,
17739
+ onIssueTypeChange: handleIssueTypeChange
17390
17740
  }
17391
17741
  );
17392
17742
  }
17393
- function useJiraFieldDefaults(integrationId, exposedFields, fieldDefinitions, onDefaultsResolved, ready = true) {
17743
+ function useJiraFieldDefaults(applyKey, exposedFields, fieldDefinitions, onDefaultsResolved, ready = true) {
17394
17744
  const appliedForRef = useRef(null);
17395
17745
  useEffect(() => {
17396
17746
  if (!onDefaultsResolved || !ready) return;
17397
- if (appliedForRef.current === integrationId) return;
17398
- appliedForRef.current = integrationId;
17747
+ if (appliedForRef.current === applyKey) return;
17748
+ appliedForRef.current = applyKey;
17399
17749
  onDefaultsResolved(getJiraFieldDefaultValues(exposedFields, fieldDefinitions));
17400
- }, [integrationId, exposedFields, fieldDefinitions, onDefaultsResolved, ready]);
17750
+ }, [applyKey, exposedFields, fieldDefinitions, onDefaultsResolved, ready]);
17401
17751
  }
17402
17752
  function IssueFormJiraFieldDefaults({
17403
17753
  integrationId,
17404
17754
  onDefaultsResolved
17405
17755
  }) {
17406
- const { data } = useQuery({
17407
- queryKey: ["jiraIntegrationFields", integrationId],
17408
- queryFn: () => jiraService.loadIntegrationFields(integrationId)
17409
- });
17756
+ const { data } = useQuery(jiraIntegrationFieldsQueryOptions(integrationId));
17410
17757
  useEffect(() => {
17411
17758
  if (!data) return;
17412
17759
  jiraService.updateExposedFields(integrationId, data.exposedFields);
@@ -17775,7 +18122,8 @@ function IssueForm({
17775
18122
  [fieldId]: value
17776
18123
  }));
17777
18124
  },
17778
- onDefaultsResolved: (defaults) => setJiraFields((current) => ({ ...defaults, ...current }))
18125
+ onDefaultsResolved: (defaults) => setJiraFields((current) => ({ ...defaults, ...current })),
18126
+ onValuesReplace: setJiraFields
17779
18127
  }
17780
18128
  )
17781
18129
  }
@@ -17893,7 +18241,7 @@ function getAdminIssueUrl(issueId) {
17893
18241
  }
17894
18242
  function BrowserInfo({ userAgent }) {
17895
18243
  return /* @__PURE__ */ jsxs("div", { children: [
17896
- /* @__PURE__ */ jsx("h4", { className: "mb-2 text-base font-medium text-text-secondary", children: "브라우저 정보" }),
18244
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-text-primary", children: "브라우저 정보" }),
17897
18245
  /* @__PURE__ */ jsx("div", { className: "rounded-md bg-surface-2 p-2 font-mono text-xs leading-relaxed text-text-secondary break-all", children: userAgent })
17898
18246
  ] });
17899
18247
  }
@@ -18398,7 +18746,7 @@ function ResizableSplitPane({
18398
18746
  dividerClassName,
18399
18747
  separatorLabel = "패널 크기 조절"
18400
18748
  }) {
18401
- const [ratio, setRatio] = React.useState(() => clamp$1(defaultRatio, minRatio, maxRatio));
18749
+ const [ratio2, setRatio] = React.useState(() => clamp$1(defaultRatio, minRatio, maxRatio));
18402
18750
  const containerRef = React.useRef(null);
18403
18751
  const dragCleanupRef = React.useRef(null);
18404
18752
  const updateRatio = React.useCallback(
@@ -18455,14 +18803,14 @@ function ResizableSplitPane({
18455
18803
  );
18456
18804
  const minPercent = toPercent(minRatio);
18457
18805
  const maxPercent = toPercent(maxRatio);
18458
- const currentPercent = toPercent(ratio);
18806
+ const currentPercent = toPercent(ratio2);
18459
18807
  const hasEnd = end !== null && end !== void 0 && end !== false;
18460
18808
  return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn$1("flex overflow-hidden", className), children: [
18461
18809
  /* @__PURE__ */ jsx(
18462
18810
  "div",
18463
18811
  {
18464
18812
  className: cn$1("flex min-w-0 flex-col overflow-hidden", startClassName),
18465
- style: { width: hasEnd ? formatRatioWidth(ratio) : "100%" },
18813
+ style: { width: hasEnd ? formatRatioWidth(ratio2) : "100%" },
18466
18814
  children: start
18467
18815
  }
18468
18816
  ),
@@ -34562,7 +34910,7 @@ function IssueDescription({
34562
34910
  const isSaving = savingField === "description";
34563
34911
  return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
34564
34912
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
34565
- /* @__PURE__ */ jsx("h4", { className: "text-base font-medium text-text-secondary", children: "설명" }),
34913
+ /* @__PURE__ */ jsx("h4", { className: "text-sm font-semibold text-text-primary", children: "설명" }),
34566
34914
  isEditing ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
34567
34915
  /* @__PURE__ */ jsx(
34568
34916
  Button,
@@ -35091,7 +35439,7 @@ function IssueScreenshot({ screenshot }) {
35091
35439
  if (screenshotUrls.length === 0) return null;
35092
35440
  return /* @__PURE__ */ jsxs(Fragment, { children: [
35093
35441
  /* @__PURE__ */ jsxs("div", { children: [
35094
- /* @__PURE__ */ jsx("h4", { className: "mb-2 text-base font-medium text-text-secondary", children: "스크린샷" }),
35442
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-text-primary", children: "스크린샷" }),
35095
35443
  /* @__PURE__ */ jsx(
35096
35444
  "img",
35097
35445
  {
@@ -35134,7 +35482,7 @@ function IssueScreenshot({ screenshot }) {
35134
35482
  }
35135
35483
  function IssueVideo({ video, hideLabel }) {
35136
35484
  return /* @__PURE__ */ jsxs("div", { children: [
35137
- hideLabel ? null : /* @__PURE__ */ jsx("h4", { className: "mb-2 text-base font-medium text-text-secondary", children: "영상" }),
35485
+ hideLabel ? null : /* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-text-primary", children: "영상" }),
35138
35486
  /* @__PURE__ */ jsx(
35139
35487
  "video",
35140
35488
  {
@@ -36342,81 +36690,372 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
36342
36690
  getPortalContainer()
36343
36691
  );
36344
36692
  }
36345
- function debounce(func, debounceMs, { signal, edges } = {}) {
36346
- let pendingThis = void 0;
36347
- let pendingArgs = null;
36348
- const leading = edges != null && edges.includes("leading");
36349
- const trailing = edges == null || edges.includes("trailing");
36350
- const invoke = () => {
36351
- if (pendingArgs !== null) {
36352
- func.apply(pendingThis, pendingArgs);
36353
- pendingThis = void 0;
36354
- pendingArgs = null;
36355
- }
36356
- };
36357
- const onTimerEnd = () => {
36358
- if (trailing) invoke();
36359
- cancel();
36360
- };
36361
- let timeoutId = null;
36362
- const schedule = () => {
36363
- if (timeoutId != null) clearTimeout(timeoutId);
36364
- timeoutId = setTimeout(() => {
36365
- timeoutId = null;
36366
- onTimerEnd();
36367
- }, debounceMs);
36368
- };
36369
- const cancelTimer = () => {
36370
- if (timeoutId !== null) {
36371
- clearTimeout(timeoutId);
36372
- timeoutId = null;
36693
+ const LOCATOR_WEIGHTS = {
36694
+ testAttr: 3,
36695
+ role: 1.5,
36696
+ name: 1.5,
36697
+ text: 1.5,
36698
+ rowText: 1.5,
36699
+ tag: 1,
36700
+ heading: 1,
36701
+ landmark: 1,
36702
+ attrs: 1,
36703
+ roleIndex: 0.5,
36704
+ classes: 0.5,
36705
+ structural: 0.5,
36706
+ location: 0.5,
36707
+ size: 0.5
36708
+ };
36709
+ const LOCATION_RANGE_PX = 100;
36710
+ function textScore(stored, observed) {
36711
+ return observed ? textSimilarity(stored, observed) : 0;
36712
+ }
36713
+ function locationScore(stored, observed) {
36714
+ const dx = stored.left + stored.width / 2 - (observed.left + observed.width / 2);
36715
+ const dy = stored.top + stored.height / 2 - (observed.top + observed.height / 2);
36716
+ const distance2 = Math.hypot(dx, dy);
36717
+ return distance2 >= LOCATION_RANGE_PX ? 0 : 1 - distance2 / LOCATION_RANGE_PX;
36718
+ }
36719
+ function ratio(a, b) {
36720
+ if (a <= 0 || b <= 0) return a === b ? 1 : 0;
36721
+ return Math.min(a, b) / Math.max(a, b);
36722
+ }
36723
+ function sizeScore(stored, observed) {
36724
+ return ratio(stored.width, observed.width) * ratio(stored.height, observed.height);
36725
+ }
36726
+ function scoreLocator(stored, storedRect, observed) {
36727
+ var _a, _b2, _c2, _d2, _e2, _f2, _g2;
36728
+ const seen = observed.locator;
36729
+ let weighted = 0;
36730
+ let total = 0;
36731
+ const add = (weight, similarity) => {
36732
+ weighted += weight * similarity;
36733
+ total += weight;
36734
+ };
36735
+ const testKey = TEST_ATTR_KEYS.find((key) => {
36736
+ var _a2;
36737
+ return ((_a2 = stored.attrs) == null ? void 0 : _a2[key]) !== void 0;
36738
+ });
36739
+ if (testKey)
36740
+ add(LOCATOR_WEIGHTS.testAttr, ((_a = seen.attrs) == null ? void 0 : _a[testKey]) === ((_b2 = stored.attrs) == null ? void 0 : _b2[testKey]) ? 1 : 0);
36741
+ add(LOCATOR_WEIGHTS.tag, seen.tag === stored.tag ? 1 : 0);
36742
+ if (stored.role) add(LOCATOR_WEIGHTS.role, seen.role === stored.role ? 1 : 0);
36743
+ if (stored.name) add(LOCATOR_WEIGHTS.name, textScore(stored.name, seen.name));
36744
+ if (stored.text) add(LOCATOR_WEIGHTS.text, textScore(stored.text, seen.text));
36745
+ const context = stored.context;
36746
+ if (context == null ? void 0 : context.rowText) {
36747
+ add(
36748
+ LOCATOR_WEIGHTS.rowText,
36749
+ context.rowText.toLowerCase() === ((_d2 = (_c2 = seen.context) == null ? void 0 : _c2.rowText) == null ? void 0 : _d2.toLowerCase()) ? 1 : 0
36750
+ );
36751
+ }
36752
+ if (context == null ? void 0 : context.heading)
36753
+ add(LOCATOR_WEIGHTS.heading, context.heading === ((_e2 = seen.context) == null ? void 0 : _e2.heading) ? 1 : 0);
36754
+ if (context == null ? void 0 : context.landmark)
36755
+ add(LOCATOR_WEIGHTS.landmark, context.landmark === ((_f2 = seen.context) == null ? void 0 : _f2.landmark) ? 1 : 0);
36756
+ const otherKeys = Object.keys(stored.attrs ?? {}).filter(
36757
+ (key) => !TEST_ATTR_KEYS.includes(key)
36758
+ );
36759
+ if (otherKeys.length) {
36760
+ const matched = otherKeys.filter((key) => {
36761
+ var _a2, _b3;
36762
+ return ((_a2 = seen.attrs) == null ? void 0 : _a2[key]) === ((_b3 = stored.attrs) == null ? void 0 : _b3[key]);
36763
+ }).length;
36764
+ add(LOCATOR_WEIGHTS.attrs, matched / otherKeys.length);
36765
+ }
36766
+ if (stored.roleIndex !== void 0 && seen.roleIndex !== void 0) {
36767
+ const gap = Math.abs(stored.roleIndex - seen.roleIndex);
36768
+ add(LOCATOR_WEIGHTS.roleIndex, gap === 0 ? 1 : gap === 1 ? 0.5 : 0);
36769
+ }
36770
+ if ((_g2 = stored.classes) == null ? void 0 : _g2.length)
36771
+ add(LOCATOR_WEIGHTS.classes, jaccard(stored.classes, seen.classes ?? []));
36772
+ if (observed.structuralHit !== void 0)
36773
+ add(LOCATOR_WEIGHTS.structural, observed.structuralHit ? 1 : 0);
36774
+ if (storedRect) {
36775
+ add(LOCATOR_WEIGHTS.location, locationScore(storedRect, observed.rect));
36776
+ add(LOCATOR_WEIGHTS.size, sizeScore(storedRect, observed.rect));
36777
+ }
36778
+ return total === 0 ? 0 : weighted / total;
36779
+ }
36780
+ const LOCATOR_ACCEPT_SCORE = 0.65;
36781
+ const LOCATOR_MIN_MARGIN = 0.1;
36782
+ const CANDIDATE_LIMIT = 300;
36783
+ const NAME_EVAL_LIMIT = 20;
36784
+ const TEXT_PROBE_LENGTH = 640;
36785
+ const LABEL_MIN_SIMILARITY = 0.5;
36786
+ const LOCATOR_MISS_RETRY_MS = 1e3;
36787
+ function documentRect(element2) {
36788
+ const rect = element2.getBoundingClientRect();
36789
+ const view = element2.ownerDocument.defaultView;
36790
+ return {
36791
+ left: rect.left + ((view == null ? void 0 : view.scrollX) ?? 0),
36792
+ top: rect.top + ((view == null ? void 0 : view.scrollY) ?? 0),
36793
+ width: rect.width,
36794
+ height: rect.height
36795
+ };
36796
+ }
36797
+ const HIDDEN_ANCESTOR_LIMIT = 50;
36798
+ function isVisible(element2) {
36799
+ return typeof element2.checkVisibility !== "function" || element2.checkVisibility();
36800
+ }
36801
+ function isRendered(node2) {
36802
+ if (!isVisible(node2)) return false;
36803
+ const view = node2.ownerDocument.defaultView;
36804
+ let current = node2;
36805
+ for (let depth = 0; current && depth < HIDDEN_ANCESTOR_LIMIT; depth += 1) {
36806
+ if (current.hasAttribute("hidden") || current.getAttribute("aria-hidden") === "true") {
36807
+ return false;
36373
36808
  }
36374
- };
36375
- const cancel = () => {
36376
- cancelTimer();
36377
- pendingThis = void 0;
36378
- pendingArgs = null;
36379
- };
36380
- const flush = () => {
36381
- invoke();
36382
- };
36383
- const debounced = function(...args) {
36384
- if (signal == null ? void 0 : signal.aborted) return;
36385
- pendingThis = this;
36386
- pendingArgs = args;
36387
- const isFirstCall = timeoutId == null;
36388
- schedule();
36389
- if (leading && isFirstCall) invoke();
36390
- };
36391
- debounced.schedule = schedule;
36392
- debounced.cancel = cancel;
36393
- debounced.flush = flush;
36394
- signal == null ? void 0 : signal.addEventListener("abort", cancel, { once: true });
36395
- return debounced;
36809
+ if (current.localName === "dialog" && !current.hasAttribute("open")) return false;
36810
+ const style = view == null ? void 0 : view.getComputedStyle(current);
36811
+ if ((style == null ? void 0 : style.display) === "none") return false;
36812
+ if (current === node2 && (style == null ? void 0 : style.visibility) === "hidden") return false;
36813
+ current = current.parentElement;
36814
+ }
36815
+ return true;
36396
36816
  }
36397
- function throttle(func, throttleMs, { signal, edges = ["leading", "trailing"] } = {}) {
36398
- let pendingAt = null;
36399
- const debounced = debounce(function(...args) {
36400
- pendingAt = Date.now();
36401
- func.apply(this, args);
36402
- }, throttleMs, {
36403
- signal,
36404
- edges
36817
+ function findScopes(locator, doc) {
36818
+ var _a;
36819
+ const container = (_a = locator.context) == null ? void 0 : _a.container;
36820
+ if (!container) return [doc];
36821
+ const wanted = container.name ? normalizeForCompare(container.name) : null;
36822
+ const scopes = Array.from(doc.querySelectorAll(CONTAINER_SELECTOR)).filter((node2) => {
36823
+ if (safeRole(node2) !== container.role) return false;
36824
+ if (!isRendered(node2)) return false;
36825
+ if (!wanted) return true;
36826
+ const name2 = safeAccessibleName(node2);
36827
+ return name2 !== void 0 && normalizeForCompare(name2) === wanted;
36405
36828
  });
36406
- const throttled = function(...args) {
36407
- if (pendingAt == null) pendingAt = Date.now();
36408
- if (Date.now() - pendingAt >= throttleMs) {
36409
- pendingAt = Date.now();
36410
- func.apply(this, args);
36411
- debounced.cancel();
36412
- debounced.schedule();
36413
- return;
36829
+ return scopes.length ? scopes : null;
36830
+ }
36831
+ function collectCandidates(locator, scopes) {
36832
+ const found = /* @__PURE__ */ new Set();
36833
+ const role = locator.role && /^[a-z]+$/.test(locator.role) ? locator.role : void 0;
36834
+ for (const scope of scopes) {
36835
+ for (const el of Array.from(scope.getElementsByTagName(locator.tag))) {
36836
+ found.add(el);
36837
+ }
36838
+ if (role) {
36839
+ scope.querySelectorAll(`[role="${role}"]`).forEach((el) => found.add(el));
36840
+ }
36841
+ }
36842
+ const candidates = Array.from(found);
36843
+ if (candidates.length <= CANDIDATE_LIMIT) return candidates;
36844
+ const label = locator.text ?? locator.name;
36845
+ if (!label) return null;
36846
+ const firstWord = normalizeForCompare(label).split(" ")[0] ?? "";
36847
+ const narrowed = candidates.filter(
36848
+ (el) => normalizeForCompare((el.textContent ?? "").slice(0, TEXT_PROBE_LENGTH)).includes(firstWord)
36849
+ );
36850
+ return narrowed.length <= CANDIDATE_LIMIT ? narrowed : null;
36851
+ }
36852
+ function isInScopes(element2, scopes) {
36853
+ return scopes.some((scope) => scope === element2.ownerDocument || scope.contains(element2));
36854
+ }
36855
+ function testAttrKey(stored) {
36856
+ return TEST_ATTR_KEYS.find((key) => {
36857
+ var _a;
36858
+ return ((_a = stored.attrs) == null ? void 0 : _a[key]) !== void 0;
36859
+ });
36860
+ }
36861
+ const IDENTITY_ATTR_KEYS = ["href", "src", "alt", "placeholder", "name"];
36862
+ const URL_ATTR_KEYS = ["href", "src"];
36863
+ function sameAttrs(stored, seen, keys2) {
36864
+ return keys2.every((key) => {
36865
+ var _a, _b2;
36866
+ const wanted = (_a = stored.attrs) == null ? void 0 : _a[key];
36867
+ return wanted === void 0 || ((_b2 = seen.attrs) == null ? void 0 : _b2[key]) === wanted;
36868
+ });
36869
+ }
36870
+ function sameRowText(stored, seen) {
36871
+ var _a, _b2, _c2;
36872
+ const wanted = (_a = stored.context) == null ? void 0 : _a.rowText;
36873
+ return !wanted || wanted.toLowerCase() === ((_c2 = (_b2 = seen.context) == null ? void 0 : _b2.rowText) == null ? void 0 : _c2.toLowerCase());
36874
+ }
36875
+ function sameLandmark(stored, seen) {
36876
+ var _a, _b2;
36877
+ const wanted = (_a = stored.context) == null ? void 0 : _a.landmark;
36878
+ return !wanted || wanted === ((_b2 = seen.context) == null ? void 0 : _b2.landmark);
36879
+ }
36880
+ function sameHeading(stored, seen, exact) {
36881
+ var _a, _b2;
36882
+ const wanted = (_a = stored.context) == null ? void 0 : _a.heading;
36883
+ if (!wanted) return true;
36884
+ const got = (_b2 = seen.context) == null ? void 0 : _b2.heading;
36885
+ if (got === void 0) return false;
36886
+ return exact ? got.toLowerCase() === wanted.toLowerCase() : normalizeForCompare(got) === normalizeForCompare(wanted);
36887
+ }
36888
+ const WRAPPER_LANDMARKS = /* @__PURE__ */ new Set(["region", "form"]);
36889
+ function withinStoredLandmark(stored, element2) {
36890
+ var _a;
36891
+ const wanted = (_a = stored.context) == null ? void 0 : _a.landmark;
36892
+ if (!wanted) return true;
36893
+ for (let node2 = element2.parentElement; node2; node2 = node2.parentElement) {
36894
+ const role = landmarkRole(node2);
36895
+ if (role === wanted) return true;
36896
+ if (role !== void 0 && !WRAPPER_LANDMARKS.has(role)) return false;
36897
+ }
36898
+ return false;
36899
+ }
36900
+ function matchesContainerPresence(stored, element2) {
36901
+ var _a, _b2;
36902
+ return Boolean((_a = stored.context) == null ? void 0 : _a.container) || !((_b2 = element2.parentElement) == null ? void 0 : _b2.closest(CONTAINER_SELECTOR));
36903
+ }
36904
+ function sameFastIdentity(stored, seen) {
36905
+ var _a, _b2;
36906
+ const testKey = testAttrKey(stored);
36907
+ if (testKey && ((_a = seen.attrs) == null ? void 0 : _a[testKey]) !== ((_b2 = stored.attrs) == null ? void 0 : _b2[testKey])) return false;
36908
+ for (const field of ["name", "text"]) {
36909
+ const wanted = stored[field];
36910
+ if (wanted === void 0) continue;
36911
+ const got = seen[field];
36912
+ if (got === void 0 || normalizeForCompare(got) !== normalizeForCompare(wanted)) return false;
36913
+ }
36914
+ return sameAttrs(stored, seen, URL_ATTR_KEYS) && sameHeading(stored, seen, false) && sameRowText(stored, seen);
36915
+ }
36916
+ function acceptsKnownElement(target, element2, observed) {
36917
+ const { locator, elementRect } = target;
36918
+ return matchesContainerPresence(locator, element2) && withinStoredLandmark(locator, element2) && sameFastIdentity(locator, observed.locator) && scoreLocator(locator, elementRect, observed) >= LOCATOR_ACCEPT_SCORE;
36919
+ }
36920
+ function passesScoredIdentity(stored, seen, nameKnown) {
36921
+ var _a, _b2;
36922
+ const testKey = testAttrKey(stored);
36923
+ if (testKey && ((_a = seen.attrs) == null ? void 0 : _a[testKey]) !== ((_b2 = stored.attrs) == null ? void 0 : _b2[testKey])) return false;
36924
+ if (!sameRowText(stored, seen) || !sameLandmark(stored, seen)) return false;
36925
+ if (!sameHeading(stored, seen, true) || !sameAttrs(stored, seen, IDENTITY_ATTR_KEYS))
36926
+ return false;
36927
+ for (const field of ["name", "text"]) {
36928
+ const wanted = stored[field];
36929
+ const got = seen[field];
36930
+ if (wanted && got && !sameDigitGroups(wanted, got)) return false;
36931
+ }
36932
+ if (stored.name && !nameKnown) return true;
36933
+ const similarities = [];
36934
+ for (const field of ["name", "text"]) {
36935
+ const wanted = stored[field];
36936
+ if (!wanted) continue;
36937
+ const got = seen[field];
36938
+ similarities.push(got ? labelSimilarityKeepingDigits(wanted, got) : 0);
36939
+ }
36940
+ return similarities.length === 0 || Math.max(...similarities) >= LABEL_MIN_SIMILARITY;
36941
+ }
36942
+ function hasContextIdentity(stored) {
36943
+ const context = stored.context;
36944
+ return Boolean(
36945
+ testAttrKey(stored) || (context == null ? void 0 : context.rowText) || (context == null ? void 0 : context.heading) || (context == null ? void 0 : context.landmark) || (context == null ? void 0 : context.container)
36946
+ );
36947
+ }
36948
+ function hasElementIdentity(stored) {
36949
+ var _a;
36950
+ return Boolean(
36951
+ testAttrKey(stored) || stored.name || stored.text || ((_a = stored.context) == null ? void 0 : _a.rowText) || IDENTITY_ATTR_KEYS.some((key) => {
36952
+ var _a2;
36953
+ return ((_a2 = stored.attrs) == null ? void 0 : _a2[key]) !== void 0;
36954
+ })
36955
+ );
36956
+ }
36957
+ function resolveByLocator(target, structuralElement, doc = document, options = {}) {
36958
+ var _a, _b2;
36959
+ try {
36960
+ const { locator, elementRect } = target;
36961
+ const scopes = findScopes(locator, doc);
36962
+ if (!scopes) {
36963
+ return { kind: "container-closed", containerName: (_b2 = (_a = locator.context) == null ? void 0 : _a.container) == null ? void 0 : _b2.name };
36964
+ }
36965
+ const headings = options.headings ?? collectHeadings(doc);
36966
+ const observe = (element2, includeName) => ({
36967
+ locator: buildElementLocator(element2, { includeName, headings, uniqueUrlAttrs: false }),
36968
+ rect: documentRect(element2),
36969
+ structuralHit: structuralElement ? element2 === structuralElement : void 0
36970
+ });
36971
+ if (structuralElement && isInScopes(structuralElement, scopes)) {
36972
+ if (acceptsKnownElement(target, structuralElement, observe(structuralElement, true))) {
36973
+ return { kind: "found", element: structuralElement, via: "fast" };
36974
+ }
36414
36975
  }
36415
- debounced.apply(this, args);
36976
+ if (!hasElementIdentity(locator)) return { kind: "not-found" };
36977
+ const collected = collectCandidates(locator, scopes);
36978
+ if (!collected) return { kind: "not-found" };
36979
+ const candidates = collected.filter((el) => matchesContainerPresence(locator, el));
36980
+ const withoutName = { ...locator, name: void 0 };
36981
+ const shortlist = candidates.map((element2) => ({ element: element2, observed: observe(element2, false) })).filter(({ observed }) => passesScoredIdentity(locator, observed.locator, false)).map(({ element: element2, observed }) => ({
36982
+ element: element2,
36983
+ score: scoreLocator(withoutName, elementRect, observed)
36984
+ })).sort((a, b) => b.score - a.score).slice(0, NAME_EVAL_LIMIT);
36985
+ const identified = shortlist.map(({ element: element2 }) => ({ element: element2, observed: observe(element2, true) })).filter(({ observed }) => passesScoredIdentity(locator, observed.locator, true));
36986
+ if (identified.some(({ element: element2 }) => !isVisible(element2))) return { kind: "not-found" };
36987
+ const ranked = identified.map(({ element: element2, observed }) => ({
36988
+ element: element2,
36989
+ score: scoreLocator(locator, elementRect, observed)
36990
+ })).sort((a, b) => b.score - a.score);
36991
+ const [first, second] = ranked;
36992
+ if (!first || first.score < LOCATOR_ACCEPT_SCORE) return { kind: "not-found" };
36993
+ if (second && first.score - second.score < LOCATOR_MIN_MARGIN) return { kind: "ambiguous" };
36994
+ if (!hasContextIdentity(locator)) return { kind: "not-found" };
36995
+ return { kind: "found", element: first.element, via: "scored" };
36996
+ } catch {
36997
+ return { kind: "not-found" };
36998
+ }
36999
+ }
37000
+ function acceptsCachedElement(target, element2, doc, headings) {
37001
+ if (!element2.isConnected || !isVisible(element2)) return false;
37002
+ const scopes = findScopes(target.locator, doc);
37003
+ if (!scopes || !isInScopes(element2, scopes)) return false;
37004
+ const observed = {
37005
+ locator: buildElementLocator(element2, {
37006
+ includeName: Boolean(target.locator.name),
37007
+ includeRoleIndex: false,
37008
+ uniqueUrlAttrs: false,
37009
+ headings
37010
+ }),
37011
+ rect: documentRect(element2)
36416
37012
  };
36417
- throttled.cancel = debounced.cancel;
36418
- throttled.flush = debounced.flush;
36419
- return throttled;
37013
+ return acceptsKnownElement(target, element2, observed);
37014
+ }
37015
+ function createLocatorResolverCache() {
37016
+ return { found: /* @__PURE__ */ new Map(), missed: /* @__PURE__ */ new Map() };
37017
+ }
37018
+ function pruneLocatorCache(cache, liveKeys) {
37019
+ for (const [key, element2] of cache.found) {
37020
+ if (!liveKeys.has(key) || !element2.isConnected) cache.found.delete(key);
37021
+ }
37022
+ for (const key of cache.missed.keys()) {
37023
+ if (!liveKeys.has(key)) cache.missed.delete(key);
37024
+ }
37025
+ }
37026
+ function reusableMiss(cache, key, childListVersion, now2) {
37027
+ const missed = cache.missed.get(key);
37028
+ if (!missed) return void 0;
37029
+ if (missed.version === childListVersion) return missed.result;
37030
+ const due = missed.at + LOCATOR_MISS_RETRY_MS;
37031
+ if (now2 >= due) return void 0;
37032
+ cache.retryAt = Math.min(cache.retryAt ?? due, due);
37033
+ return missed.result;
37034
+ }
37035
+ function resolveByLocatorCached(key, target, structural, cache, childListVersion, doc = document, options = {}) {
37036
+ try {
37037
+ const cached2 = cache.found.get(key);
37038
+ if (cached2 && acceptsCachedElement(target, cached2, doc, options.headings)) {
37039
+ return { kind: "found", element: cached2, via: "fast" };
37040
+ }
37041
+ cache.found.delete(key);
37042
+ const now2 = Date.now();
37043
+ const reused = reusableMiss(cache, key, childListVersion, now2);
37044
+ if (reused) return reused;
37045
+ const structuralElement = typeof structural === "function" ? structural() : structural;
37046
+ const result = resolveByLocator(target, structuralElement, doc, options);
37047
+ if (result.kind === "found") {
37048
+ cache.found.set(key, result.element);
37049
+ cache.missed.delete(key);
37050
+ } else if (result.kind === "container-closed") {
37051
+ cache.missed.delete(key);
37052
+ } else {
37053
+ cache.missed.set(key, { version: childListVersion, at: now2, result });
37054
+ }
37055
+ return result;
37056
+ } catch {
37057
+ return { kind: "not-found" };
37058
+ }
36420
37059
  }
36421
37060
  const STICKER_RENDER_MODE_SETTING_KEY = "sticker_render_mode";
36422
37061
  const DEFAULT_STICKER_RENDER_MODE = "absolute";
@@ -36493,7 +37132,7 @@ function isUniqueSelectorMatch(selector, element2) {
36493
37132
  return false;
36494
37133
  }
36495
37134
  }
36496
- function resolveTargetElement(position2) {
37135
+ function resolveStructuralElement(position2) {
36497
37136
  const selectorElement = position2.selector ? findElementBySelector(position2.selector) : null;
36498
37137
  if (selectorElement && position2.selector && isUniqueSelectorMatch(position2.selector, selectorElement)) {
36499
37138
  return selectorElement;
@@ -36505,10 +37144,30 @@ function resolveTargetElement(position2) {
36505
37144
  if (selectorElement) return selectorElement;
36506
37145
  return null;
36507
37146
  }
36508
- function resolveTargetStickerPoint(position2, metrics) {
36509
- const element2 = resolveTargetElement(position2);
36510
- if (!element2) return null;
37147
+ function locatorOf(position2) {
37148
+ var _a;
37149
+ return ((_a = position2.locator) == null ? void 0 : _a.v) === 1 ? position2.locator : void 0;
37150
+ }
37151
+ function resolveTarget(issueId, position2, cache, childListVersion, options) {
37152
+ const locator = locatorOf(position2);
37153
+ if (!locator) {
37154
+ const structural = resolveStructuralElement(position2);
37155
+ return structural ? { kind: "found", element: structural } : { kind: "not-found" };
37156
+ }
37157
+ const target = { locator, elementRect: position2.elementRect };
37158
+ return cache ? resolveByLocatorCached(
37159
+ issueId,
37160
+ target,
37161
+ () => resolveStructuralElement(position2),
37162
+ cache,
37163
+ childListVersion,
37164
+ document,
37165
+ options
37166
+ ) : resolveByLocator(target, resolveStructuralElement(position2), document, options);
37167
+ }
37168
+ function pointOfElement(element2, metrics) {
36511
37169
  const rect = element2.getBoundingClientRect();
37170
+ if (rect.width === 0 && rect.height === 0) return null;
36512
37171
  return {
36513
37172
  x: metrics.scrollX + rect.right,
36514
37173
  y: metrics.scrollY + rect.top
@@ -36533,6 +37192,12 @@ function resolveStickerPlacements(issues, mode, options = {}) {
36533
37192
  const limit = options.limit ?? DEFAULT_STICKER_LIMIT;
36534
37193
  const placements = [];
36535
37194
  const unrendered = [];
37195
+ const cache = options.resolverCache;
37196
+ if (cache) {
37197
+ cache.retryAt = void 0;
37198
+ pruneLocatorCache(cache, new Set(issues.map((issue) => issue.id)));
37199
+ }
37200
+ const resolveOptions = mode === "target" && typeof document !== "undefined" && issues.some((issue) => issue.position && locatorOf(issue.position)) ? { headings: collectHeadings(document) } : {};
36536
37201
  for (const issue of issues) {
36537
37202
  if (placements.length >= limit) {
36538
37203
  unrendered.push({
@@ -36550,7 +37215,35 @@ function resolveStickerPlacements(issues, mode, options = {}) {
36550
37215
  });
36551
37216
  continue;
36552
37217
  }
36553
- const point2 = mode === "target" ? resolveTargetStickerPoint(issue.position, metrics) : resolveAbsoluteStickerPoint(issue.position, metrics.viewport);
37218
+ let point2;
37219
+ if (mode === "target") {
37220
+ const resolution = resolveTarget(
37221
+ issue.id,
37222
+ issue.position,
37223
+ cache,
37224
+ options.childListVersion ?? 0,
37225
+ resolveOptions
37226
+ );
37227
+ if (resolution.kind === "container-closed") {
37228
+ unrendered.push({
37229
+ issue,
37230
+ status: "container-closed",
37231
+ reason: resolution.containerName ? `'${resolution.containerName}' 팝업을 열면 표시됩니다.` : "팝업을 열면 표시됩니다."
37232
+ });
37233
+ continue;
37234
+ }
37235
+ if (resolution.kind === "ambiguous") {
37236
+ unrendered.push({
37237
+ issue,
37238
+ status: "ambiguous",
37239
+ reason: "비슷한 요소가 여러 개라 위치를 정할 수 없습니다."
37240
+ });
37241
+ continue;
37242
+ }
37243
+ point2 = resolution.kind === "found" ? pointOfElement(resolution.element, metrics) : null;
37244
+ } else {
37245
+ point2 = resolveAbsoluteStickerPoint(issue.position, metrics.viewport);
37246
+ }
36554
37247
  if (!point2 || !isFinitePoint(point2)) {
36555
37248
  unrendered.push({
36556
37249
  issue,
@@ -36577,7 +37270,7 @@ function resolveStickerPlacements(issues, mode, options = {}) {
36577
37270
  hash: buildPlacementHash(issue, point2, mode)
36578
37271
  });
36579
37272
  }
36580
- return { placements, unrendered };
37273
+ return { placements, unrendered, retryAt: cache == null ? void 0 : cache.retryAt };
36581
37274
  }
36582
37275
  function getPlacementSortKey(placement) {
36583
37276
  return `${placement.issue.created_at || ""}:${placement.issue.id}`;
@@ -36974,6 +37667,7 @@ function useDocumentLayerScrollVars(ref, enabled) {
36974
37667
  }
36975
37668
  function useDocumentLayoutVersion(enabled, mode) {
36976
37669
  const [version, setVersion] = useState(0);
37670
+ const contentVersionRef = useRef(0);
36977
37671
  useEffect(() => {
36978
37672
  if (!enabled || typeof window === "undefined" || typeof document === "undefined") {
36979
37673
  return void 0;
@@ -36990,8 +37684,18 @@ function useDocumentLayoutVersion(enabled, mode) {
36990
37684
  const scheduleThrottled = throttle(scheduleFrame, LAYOUT_RECALC_THROTTLE_MS);
36991
37685
  window.addEventListener("resize", scheduleThrottled);
36992
37686
  window.addEventListener("orientationchange", scheduleThrottled);
36993
- const observer2 = new MutationObserver(scheduleThrottled);
36994
- observer2.observe(document.body, { attributes: true, childList: true, subtree: true });
37687
+ const observer2 = new MutationObserver((records) => {
37688
+ if (records.some((record) => record.type === "childList" || record.type === "characterData")) {
37689
+ contentVersionRef.current += 1;
37690
+ }
37691
+ scheduleThrottled();
37692
+ });
37693
+ observer2.observe(document.body, {
37694
+ attributes: true,
37695
+ childList: true,
37696
+ characterData: true,
37697
+ subtree: true
37698
+ });
36995
37699
  const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(scheduleThrottled);
36996
37700
  if (resizeObserver) {
36997
37701
  resizeObserver.observe(document.documentElement);
@@ -37011,7 +37715,7 @@ function useDocumentLayoutVersion(enabled, mode) {
37011
37715
  if (frame2) window.cancelAnimationFrame(frame2);
37012
37716
  };
37013
37717
  }, [enabled, mode]);
37014
- return version;
37718
+ return { version, contentVersion: contentVersionRef.current };
37015
37719
  }
37016
37720
  function getClusterDocumentPoint(cluster) {
37017
37721
  return {
@@ -37047,19 +37751,34 @@ function IssueStickersContainer$1({
37047
37751
  const closeTimerRef = useRef(null);
37048
37752
  const mode = normalizeStickerRenderMode(renderMode);
37049
37753
  const markerSize = useStickerSize();
37050
- const layoutVersion = useDocumentLayoutVersion(visible, mode);
37754
+ const { version: layoutVersion, contentVersion } = useDocumentLayoutVersion(visible, mode);
37755
+ const resolverCacheRef = useRef(createLocatorResolverCache());
37756
+ const [retryVersion, setRetryVersion] = useState(0);
37051
37757
  useDocumentLayerScrollVars(layerRef, visible);
37052
37758
  const metrics = useMemo(() => getCurrentStickerDocumentMetrics(), [layoutVersion, visible]);
37053
- const { clusters, unrendered } = useMemo(() => {
37759
+ const { clusters, unrendered, retryAt } = useMemo(() => {
37054
37760
  if (!visible) {
37055
- return { clusters: [], unrendered: [] };
37761
+ return { clusters: [], unrendered: [], retryAt: void 0 };
37056
37762
  }
37057
- const resolved = resolveStickerPlacements(issues, mode, { metrics });
37763
+ const resolved = resolveStickerPlacements(issues, mode, {
37764
+ metrics,
37765
+ resolverCache: resolverCacheRef.current,
37766
+ childListVersion: contentVersion
37767
+ });
37058
37768
  return {
37059
37769
  clusters: clusterStickerPlacements(resolved.placements, markerSize),
37060
- unrendered: resolved.unrendered
37770
+ unrendered: resolved.unrendered,
37771
+ retryAt: resolved.retryAt
37061
37772
  };
37062
- }, [issues, layoutVersion, markerSize, metrics, mode, visible]);
37773
+ }, [contentVersion, issues, layoutVersion, markerSize, metrics, mode, retryVersion, visible]);
37774
+ useEffect(() => {
37775
+ if (retryAt === void 0) return void 0;
37776
+ const timer = window.setTimeout(
37777
+ () => setRetryVersion((current) => current + 1),
37778
+ Math.max(0, retryAt - Date.now()) + 1
37779
+ );
37780
+ return () => window.clearTimeout(timer);
37781
+ }, [retryAt, retryVersion]);
37063
37782
  const unrenderedSignature = useMemo(
37064
37783
  () => unrendered.map((item) => `${item.issue.id}:${item.status}:${item.reason}`).sort().join("|"),
37065
37784
  [unrendered]
@@ -37228,6 +37947,29 @@ function IssueStickersContainer({
37228
37947
  }
37229
37948
  );
37230
37949
  }
37950
+ function useIssueFocusFromUrl(issues, onFocus) {
37951
+ const [pendingIssueId, setPendingIssueId] = useState(null);
37952
+ useEffect(() => {
37953
+ const issueId = peekIssueFocusIssueId() ?? takeIssueFocusIssueId();
37954
+ if (issueId) setPendingIssueId(issueId);
37955
+ }, []);
37956
+ useEffect(() => {
37957
+ const handlePopState = () => {
37958
+ const issueId = takeIssueFocusIssueId();
37959
+ if (issueId) setPendingIssueId(issueId);
37960
+ };
37961
+ window.addEventListener("popstate", handlePopState);
37962
+ return () => window.removeEventListener("popstate", handlePopState);
37963
+ }, []);
37964
+ useEffect(() => {
37965
+ if (!pendingIssueId) return;
37966
+ const issue = issues.find((candidate) => candidate.id === pendingIssueId);
37967
+ if (!issue) return;
37968
+ setPendingIssueId(null);
37969
+ onFocus(issue);
37970
+ clearIssueFocusIssueId();
37971
+ }, [issues, pendingIssueId, onFocus]);
37972
+ }
37231
37973
  function useDomainRestriction(currentUrl) {
37232
37974
  const refresh = useCallback(() => {
37233
37975
  }, []);
@@ -37265,15 +38007,29 @@ function normalizeComparableUrl(url) {
37265
38007
  return null;
37266
38008
  }
37267
38009
  }
37268
- function highlightIssue(issueId) {
37269
- const sticker = document.querySelector(`[data-issue-id="${issueId}"]`);
38010
+ function highlightIssue(issueId, position2) {
38011
+ var _a;
38012
+ const searchRoot = ((_a = getIssueStickerRuntimeHost()) == null ? void 0 : _a.shadowRoot) ?? document;
38013
+ const sticker = searchRoot.querySelector(`[data-issue-id="${issueId}"]`);
37270
38014
  if (sticker) {
37271
38015
  sticker.scrollIntoView({ behavior: "smooth", block: "center" });
37272
38016
  sticker.classList.add("highlight-animation");
37273
38017
  setTimeout(() => {
37274
38018
  sticker.classList.remove("highlight-animation");
37275
38019
  }, 2e3);
38020
+ return;
37276
38021
  }
38022
+ scrollToIssuePosition(position2);
38023
+ }
38024
+ function scrollToIssuePosition(position2) {
38025
+ if (!position2 || !Number.isFinite(position2.x) || !Number.isFinite(position2.y)) {
38026
+ return;
38027
+ }
38028
+ window.scrollTo({
38029
+ left: Math.max(0, position2.x - window.innerWidth / 2),
38030
+ top: Math.max(0, position2.y - window.innerHeight / 2),
38031
+ behavior: "smooth"
38032
+ });
37277
38033
  }
37278
38034
  function useExtensionEnabled() {
37279
38035
  const [isEnabled] = useState(true);
@@ -37319,80 +38075,11 @@ function useIssueMode() {
37319
38075
  }
37320
38076
  const RECORDING_BLOCKED_BY_ISSUE_MODE = "이슈 생성 모드에서는 녹화를 시작할 수 없습니다. 이슈 생성을 종료한 뒤 다시 시도하세요.";
37321
38077
  const ISSUE_MODE_BLOCKED_BY_RECORDING = "녹화 중에는 이슈 생성 모드를 시작할 수 없습니다. 녹화를 중지한 뒤 다시 시도하세요.";
37322
- function getDigitFromCode(code2) {
37323
- if (!code2) return null;
37324
- const match = code2.match(/^(Digit|Numpad)([1-9])$/);
37325
- return match ? parseInt(match[2], 10) : null;
37326
- }
37327
- function isModifierKeyCode(code2) {
37328
- if (!code2) return false;
37329
- return code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight";
37330
- }
37331
- function isAltKeyCode(code2) {
37332
- if (!code2) return false;
37333
- return code2 === "AltLeft" || code2 === "AltRight";
37334
- }
37335
- function isModifierPressed(event) {
37336
- const hasModifier = event.ctrlKey || event.metaKey;
37337
- const hasAlt = event.altKey;
37338
- return hasModifier && hasAlt;
37339
- }
37340
- function isIssueModeShortcut(event) {
37341
- if (event.isComposing === true) {
37342
- return false;
37343
- }
37344
- if (event.code) {
37345
- const digit = getDigitFromCode(event.code);
37346
- if (digit === 1 && !event.shiftKey) {
37347
- return isModifierPressed(event);
37348
- }
37349
- if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
37350
- return false;
37351
- }
37352
- }
37353
- const isIssueModeKey = event.key === "1" && !event.shiftKey;
37354
- if (isIssueModeKey) {
37355
- return isModifierPressed(event);
37356
- }
37357
- return false;
37358
- }
37359
- function isRecordingShortcut(event) {
37360
- if (event.isComposing === true) {
37361
- return false;
37362
- }
37363
- if (event.code) {
37364
- const digit = getDigitFromCode(event.code);
37365
- if (digit === 2 && !event.shiftKey) {
37366
- return isModifierPressed(event);
37367
- }
37368
- if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
37369
- return false;
37370
- }
37371
- }
37372
- const isRecordingKey = event.key === "2" && !event.shiftKey;
37373
- if (isRecordingKey) {
37374
- return isModifierPressed(event);
37375
- }
37376
- return false;
37377
- }
37378
- function isShortcutReleaseKey(key, code2) {
37379
- if (code2) {
37380
- if (code2 === "Digit1" || code2 === "Numpad1") {
37381
- return true;
37382
- }
37383
- if (code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight") {
37384
- return true;
37385
- }
37386
- if (code2 === "AltLeft" || code2 === "AltRight") {
37387
- return true;
37388
- }
37389
- }
37390
- return key === "1" || key === "Control" || key === "Meta" || key === "Alt";
37391
- }
37392
38078
  function useKeyboardShortcuts(isCreatingIssueRef, onToggleIssueMode, onToggleRecording, isIssueFormOpen = false, isRecordingRef) {
37393
38079
  const keysPressedRef = useRef(/* @__PURE__ */ new Set());
37394
38080
  const isProcessingRecordingRef = useRef(false);
37395
38081
  useEffect(() => {
38082
+ var _a;
37396
38083
  const handleKeyDown = (e) => {
37397
38084
  if (e.isComposing === true) {
37398
38085
  return;
@@ -37445,23 +38132,25 @@ function useKeyboardShortcuts(isCreatingIssueRef, onToggleIssueMode, onToggleRec
37445
38132
  });
37446
38133
  return;
37447
38134
  }
37448
- if (e.key === "Escape" || e.code === "Escape") {
37449
- if (isCreatingIssueRef.current) {
37450
- e.preventDefault();
37451
- e.stopPropagation();
37452
- void onToggleIssueMode(false);
37453
- }
37454
- return;
37455
- }
37456
38135
  };
37457
38136
  const handleKeyUp = (e) => {
37458
38137
  if (isShortcutReleaseKey(e.key, e.code)) {
37459
38138
  keysPressedRef.current.delete("Ctrl/Cmd+Alt+1");
37460
38139
  }
37461
38140
  };
38141
+ const stopListeningEscape = listenEscapeKeydown(
38142
+ (_a = getIssueStickerRuntimeHost()) == null ? void 0 : _a.shadowRoot,
38143
+ (e) => {
38144
+ if (e.isComposing === true || !isCreatingIssueRef.current) return;
38145
+ e.preventDefault();
38146
+ e.stopPropagation();
38147
+ void onToggleIssueMode(false);
38148
+ }
38149
+ );
37462
38150
  window.addEventListener("keydown", handleKeyDown);
37463
38151
  window.addEventListener("keyup", handleKeyUp);
37464
38152
  return () => {
38153
+ stopListeningEscape();
37465
38154
  window.removeEventListener("keydown", handleKeyDown);
37466
38155
  window.removeEventListener("keyup", handleKeyUp);
37467
38156
  };
@@ -37603,6 +38292,10 @@ function useContentAppState() {
37603
38292
  useCallback((issueId) => {
37604
38293
  highlightIssue(issueId);
37605
38294
  }, []);
38295
+ const handleFocusIssueFromUrl = useCallback((issue) => {
38296
+ highlightIssue(issue.id, issue.position);
38297
+ }, []);
38298
+ useIssueFocusFromUrl(filteredIssues, handleFocusIssueFromUrl);
37606
38299
  useCallback(() => {
37607
38300
  devLogger.log("ContentScript", "handleIssueCreatedOrUpdated 호출, 이슈 목록 재조회 시작");
37608
38301
  void loadIssues();
@@ -39191,7 +39884,7 @@ function AuthGate() {
39191
39884
  ) })
39192
39885
  ] });
39193
39886
  }
39194
- const globalsCSS = `:root,:host{color-scheme:light;--brand-h: 150;--brand-s: 100%;--brand-l: 34%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-subtle: hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14);--brand-border: hsl(var(--brand-h) calc(var(--brand-s) + 8%) calc(var(--brand-l) + 8%) / .34);--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22);--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-display: var(--font-sans);--font-mono: var(--font-sans);--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--text-disabled: 145 4% 70%;--text-inverse: 0 0% 100%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--border-focus: var(--brand-h) var(--brand-s) var(--brand-l);--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 52%;--warning-subtle: 34 82% 52% / .14;--danger: 3 68% 56%;--danger-subtle: 3 68% 56% / .12;--danger-deep: 3 62% 40%;--info: 202 52% 44%;--info-subtle: 202 52% 44% / .12;--accent-terra: 13 52% 47%;--accent-terra-subtle: 13 52% 47% / .1;--accent-terra-deep: 13 48% 44%;--accent-blue: 213 86% 56%;--accent-blue-subtle: 213 92% 56% / .12;--accent-blue-deep: 216 78% 40%;--accent-blue-border: 213 86% 62% / .36;--accent-cream: 38 52% 88%;--accent-cream-warm: 40 56% 95%;--accent-cream-deep: 38 48% 82%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 11%;--radius-xs: 4px;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 16px;--radius-xl: 20px;--radius-2xl: 24px;--radius-pill: 9999px;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 3px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 14%) / .24), 0 6px 20px hsl(var(--brand-h) calc(var(--brand-s) - 70%) calc(var(--brand-l) - 19%) / .16);--duration-instant: 90ms;--duration-fast: .16s;--duration-base: .26s;--duration-out: .18s;--duration-slow: .36s;--ease-out: cubic-bezier(.23, 1, .32, 1);--ease-in-out: cubic-bezier(.45, 0, .15, 1);--ease-spring: cubic-bezier(.18, .94, .32, 1.08);--grid-line: 0 0% 92%}.dark,:host(.dark){color-scheme:dark;--brand-l: 34%;--brand-fg: hsl(0 0% 100%);--surface-0: 150 8% 7%;--surface-1: 150 6% 10%;--surface-2: 150 5% 14%;--surface-3: 150 4% 18%;--surface-inset: 150 6% 6%;--overlay-backdrop: hsl(0 0% 0% / .56);--overlay-backdrop-strong: hsl(0 0% 0% / .8);--text-primary: 40 16% 93%;--text-secondary: 36 8% 68%;--text-tertiary: 34 6% 50%;--text-disabled: 30 5% 34%;--text-inverse: 150 8% 10%;--border-subtle: 150 6% 16%;--border-default: 150 5% 22%;--border-strong: 150 4% 34%;--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 62%;--danger: 2 70% 64%;--danger-deep: 2 80% 76%;--info: 202 54% 62%;--accent-terra: 13 56% 62%;--accent-terra-subtle: 13 56% 62% / .14;--accent-terra-deep: 13 52% 56%;--accent-blue: 210 92% 68%;--accent-blue-subtle: 210 92% 68% / .18;--accent-blue-deep: 209 100% 78%;--accent-blue-border: 210 92% 72% / .44;--accent-cream: 38 30% 26%;--accent-cream-warm: 38 22% 18%;--accent-cream-deep: 38 26% 32%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 8%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .2);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .3), 0 1px 2px -1px hsl(0 0% 0% / .24);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .34), 0 2px 4px -2px hsl(0 0% 0% / .2);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .38), 0 4px 6px -4px hsl(0 0% 0% / .24);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .44), 0 8px 10px -6px hsl(0 0% 0% / .28);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .16);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 24%) / .44), 0 6px 20px hsl(0 0% 0% / .32);--grid-line: 150 6% 14%}*{border-color:hsl(var(--border-default))}html{font-family:var(--font-sans),ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-feature-settings:"cv11","ss01","ss03";background-color:hsl(var(--surface-0))}body{margin:0;min-height:100vh;color:hsl(var(--text-primary));background-color:hsl(var(--surface-0))}::-moz-selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}::selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:"ss01","ss02","cv11"}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border-strong) / .52);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:hsl(var(--border-strong) / .9);background-clip:padding-box;border:2px solid transparent}.app-canvas,.grid-canvas{background-color:hsl(var(--surface-0))}.onboarding-canvas{word-break:keep-all;overflow-wrap:break-word;--surface-0: var(--brand-h) var(--brand-s) var(--brand-l);--surface-1: 0 0% 100%;--surface-2: var(--brand-h) 62% 28%;--surface-3: var(--brand-h) 60% 25%;--surface-inset: var(--brand-h) 62% 28%;--text-primary: 0 0% 100%;--text-secondary: var(--brand-h) 46% 90%;--text-tertiary: var(--brand-h) 34% 84%;--text-disabled: var(--brand-h) 20% 72%;--border-subtle: var(--brand-h) 44% 52%;--border-default: var(--brand-h) 40% 58%;--border-strong: var(--brand-h) 36% 70%;--border-focus: 0 0% 100%;--brand-hsl: 0 0% 100%;--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) 24% 94%);--brand-active: hsl(var(--brand-h) 20% 88%);--brand-fg: hsl(var(--brand-h) var(--brand-s) 24%);--brand-ring: hsl(0 0% 100% / .4);--danger: 6 96% 86%;--danger-subtle: 6 96% 86% / .18;--danger-deep: 6 96% 92%;--warning: 42 96% 82%;--warning-subtle: 42 96% 82% / .18}.onboarding-canvas .bg-surface-1,.onboarding-canvas input,.onboarding-canvas textarea,.onboarding-canvas [role=combobox]{--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--surface-2: 144 8% 96%;--surface-inset: 144 6% 95%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22)}@keyframes onboarding-step-in{0%{opacity:0;transform:translate(96px)}to{opacity:1;transform:translate(0)}}.onboarding-step-in{animation:onboarding-step-in var(--duration-slow) var(--ease-out) forwards}@keyframes onboarding-enter-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.onboarding-enter{position:fixed;top:0;right:0;bottom:0;left:0;overflow-x:hidden;overflow-y:auto;animation:onboarding-enter-up var(--duration-base) var(--ease-out) forwards}body:has(.onboarding-canvas){background-color:hsl(var(--brand-h) var(--brand-s) var(--brand-l))}.panel-shell,.surface-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-sm)}.panel-shell-muted,.surface-shell-muted{background:hsl(var(--surface-2));box-shadow:var(--shadow-xs)}.panel-shell-subtle{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.panel-shell-elevated{border:1px solid hsl(var(--border-default));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.utility-chip,.floating-chip{display:inline-flex;align-items:center;gap:8px;border:1px solid hsl(var(--border-default));border-radius:var(--radius-pill);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.hairline{border-bottom:1px solid hsl(var(--border-subtle))}.mono-label{font-family:var(--font-mono),ui-monospace,monospace;font-size:11px;text-transform:uppercase;color:hsl(var(--text-tertiary))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,:host{--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-mono: var(--font-sans);--issue-marker-expand-duration: .52s;--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 52%;--text-disabled: 145 4% 70%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--grid-line: 0 0% 92%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 4px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04)}*{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}#issue-sticker-shadow-root{all:initial;display:block;background-color:transparent;--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1));font-family:var(--font-sans);line-height:1.5}.\\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-1{left:4px;right:4px}.inset-y-0{top:0;bottom:0}.-bottom-px{bottom:-1px}.bottom-0{bottom:0}.bottom-4{bottom:16px}.bottom-6{bottom:24px}.left-0{left:0}.left-1\\/2{left:50%}.left-2{left:8px}.left-4{left:16px}.left-\\[50\\%\\]{left:50%}.right-0{right:0}.right-2{right:8px}.right-3{right:12px}.right-4{right:16px}.right-5{right:20px}.right-6{right:24px}.top-0{top:0}.top-1{top:4px}.top-1\\/2{top:50%}.top-2{top:8px}.top-3{top:12px}.top-4{top:16px}.top-5{top:20px}.top-\\[50\\%\\]{top:50%}.top-\\[calc\\(\\(3\\.5rem-1\\.75rem\\)\\/2\\)\\]{top:14px}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-\\[1000000\\]{z-index:1000000}.z-\\[1000003\\]{z-index:1000003}.z-\\[1000004\\]{z-index:1000004}.z-\\[1000005\\]{z-index:1000005}.z-\\[1000006\\]{z-index:1000006}.z-\\[1000007\\]{z-index:1000007}.z-\\[1000008\\]{z-index:1000008}.z-\\[1000010\\]{z-index:1000010}.z-\\[1000011\\]{z-index:1000011}.z-\\[10001\\]{z-index:10001}.z-\\[999999\\]{z-index:999999}.z-\\[9999\\]{z-index:9999}.m-0{margin:0}.-mx-2{margin-left:-8px;margin-right:-8px}.mx-3{margin-left:12px;margin-right:12px}.my-1{margin-top:4px;margin-bottom:4px}.my-2{margin-top:8px;margin-bottom:8px}.my-2\\.5{margin-top:10px;margin-bottom:10px}.my-3{margin-top:12px;margin-bottom:12px}.my-4{margin-top:16px;margin-bottom:16px}.mb-0\\.5{margin-bottom:2px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-5{margin-bottom:20px}.ml-0\\.5{margin-left:2px}.ml-4{margin-left:16px}.mr-1\\.5{margin-right:6px}.mt-0{margin-top:0}.mt-0\\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.\\!h-auto{height:auto!important}.h-1\\.5{height:6px}.h-10{height:40px}.h-11{height:44px}.h-2{height:8px}.h-24{height:96px}.h-3{height:12px}.h-3\\.5{height:14px}.h-4{height:16px}.h-5{height:20px}.h-6{height:24px}.h-7{height:28px}.h-8{height:32px}.h-9{height:36px}.h-\\[1\\.4rem\\]{height:22.4px}.h-\\[100vh\\]{height:100vh}.h-\\[18px\\]{height:18px}.h-\\[220px\\]{height:220px}.h-\\[22px\\]{height:22px}.h-\\[30px\\]{height:30px}.h-\\[min\\(36vh\\,320px\\)\\]{height:min(36vh,320px)}.h-\\[min\\(480px\\,calc\\(100vh-64px\\)\\)\\]{height:min(480px,calc(100vh - 64px))}.h-\\[min\\(54vh\\,520px\\)\\]{height:min(54vh,520px)}.h-\\[min\\(560px\\,calc\\(100vh-32px\\)\\)\\]{height:min(560px,calc(100vh - 32px))}.h-\\[var\\(--issue-sticker-size\\)\\]{height:var(--issue-sticker-size)}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-24{max-height:96px}.max-h-40{max-height:160px}.max-h-56{max-height:224px}.max-h-80{max-height:320px}.max-h-96{max-height:384px}.max-h-\\[150px\\]{max-height:150px}.max-h-\\[220px\\]{max-height:220px}.max-h-\\[320px\\]{max-height:320px}.max-h-\\[420px\\]{max-height:420px}.max-h-\\[90vh\\]{max-height:90vh}.max-h-\\[calc\\(100vh-3rem\\)\\]{max-height:calc(100vh - 48px)}.max-h-\\[min\\(80vh\\,640px\\)\\]{max-height:min(80vh,640px)}.min-h-0{min-height:0px}.min-h-11{min-height:44px}.min-h-\\[108px\\]{min-height:108px}.min-h-\\[120px\\]{min-height:120px}.min-h-\\[140px\\]{min-height:140px}.min-h-\\[220px\\]{min-height:220px}.w-0\\.5{width:2px}.w-1{width:4px}.w-1\\.5{width:6px}.w-1\\/2{width:50%}.w-10{width:40px}.w-12{width:48px}.w-14{width:56px}.w-16{width:64px}.w-2{width:8px}.w-3{width:12px}.w-3\\.5{width:14px}.w-4{width:16px}.w-5{width:20px}.w-6{width:24px}.w-7{width:28px}.w-72{width:288px}.w-8{width:32px}.w-80{width:320px}.w-9{width:36px}.w-\\[1\\.4rem\\]{width:22.4px}.w-\\[18px\\]{width:18px}.w-\\[22\\.5rem\\]{width:360px}.w-\\[22rem\\]{width:352px}.w-\\[30px\\]{width:30px}.w-\\[38px\\]{width:38px}.w-\\[calc\\(100vw-32px\\)\\]{width:calc(100vw - 32px)}.w-\\[min\\(20rem\\,calc\\(100vw_-_1\\.5rem\\)\\)\\]{width:min(320px,calc(100vw - 24px))}.w-\\[min\\(560px\\,calc\\(100vw-32px\\)\\)\\]{width:min(560px,calc(100vw - 32px))}.w-\\[var\\(--radix-popover-trigger-width\\)\\]{width:var(--radix-popover-trigger-width)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0px}.min-w-9{min-width:36px}.min-w-\\[12rem\\]{min-width:192px}.min-w-\\[200px\\]{min-width:200px}.min-w-\\[var\\(--radix-popover-trigger-width\\)\\]{min-width:var(--radix-popover-trigger-width)}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.max-w-\\[10rem\\]{max-width:160px}.max-w-\\[120px\\]{max-width:120px}.max-w-\\[160px\\]{max-width:160px}.max-w-\\[280px\\]{max-width:280px}.max-w-\\[28rem\\]{max-width:448px}.max-w-\\[300px\\]{max-width:300px}.max-w-\\[360px\\]{max-width:360px}.max-w-\\[36rem\\]{max-width:576px}.max-w-\\[400px\\]{max-width:400px}.max-w-\\[420px\\]{max-width:420px}.max-w-\\[428px\\]{max-width:428px}.max-w-\\[480px\\]{max-width:480px}.max-w-\\[62ch\\]{max-width:62ch}.max-w-\\[640px\\]{max-width:640px}.max-w-\\[70ch\\]{max-width:70ch}.max-w-\\[90vw\\]{max-width:90vw}.max-w-\\[960px\\]{max-width:960px}.max-w-\\[calc\\(100vw-24px\\)\\]{max-width:calc(100vw - 24px)}.max-w-\\[var\\(--issue-sticker-size\\)\\]{max-width:var(--issue-sticker-size)}.max-w-full{max-width:100%}.max-w-md{max-width:448px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1{--tw-translate-x: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[-50\\%\\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[18px\\]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[2px\\]{--tw-translate-x: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\\[-50\\%\\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse-ring{0%,to{box-shadow:0 0 0 0 var(--brand-ring)}50%{box-shadow:0 0 0 8px transparent}}.animate-pulse-ring{animation:pulse-ring 1.8s var(--ease-in-out) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\\.5{gap:2px}.gap-1{gap:4px}.gap-1\\.5{gap:6px}.gap-2{gap:8px}.gap-2\\.5{gap:10px}.gap-3{gap:12px}.gap-3\\.5{gap:14px}.gap-4{gap:16px}.gap-5{gap:20px}.gap-6{gap:24px}.gap-x-5{-moz-column-gap:20px;column-gap:20px}.gap-y-2{row-gap:8px}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(6px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(20px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20px * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(24px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-line-subtle>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.\\!rounded-none{border-radius:0!important}.rounded{border-radius:4px}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\[18px\\]{border-radius:18px}.rounded-\\[20px\\]{border-radius:20px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-dashed{border-style:dashed}.border-\\[hsl\\(144_8\\%_91\\%\\)\\]{--tw-border-opacity: 1;border-color:hsl(144 8% 91% / var(--tw-border-opacity, 1))}.border-brand{--tw-border-opacity: 1;border-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.border-brand-border{border-color:var(--brand-border)}.border-brand\\/30{border-color:hsl(var(--brand-hsl) / .3)}.border-brand\\/40{border-color:hsl(var(--brand-hsl) / .4)}.border-danger\\/20{border-color:hsl(var(--danger) / .2)}.border-danger\\/30{border-color:hsl(var(--danger) / .3)}.border-info\\/20{border-color:hsl(var(--info) / .2)}.border-info\\/30{border-color:hsl(var(--info) / .3)}.border-line{--tw-border-opacity: 1;border-color:hsl(var(--border-default) / var(--tw-border-opacity, 1))}.border-line-focus{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.border-line-strong{--tw-border-opacity: 1;border-color:hsl(var(--border-strong) / var(--tw-border-opacity, 1))}.border-line-subtle{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.border-line-subtle\\/50{border-color:hsl(var(--border-subtle) / .5)}.border-line-subtle\\/90{border-color:hsl(var(--border-subtle) / .9)}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-success{--tw-border-opacity: 1;border-color:hsl(var(--success) / var(--tw-border-opacity, 1))}.border-success\\/20{border-color:hsl(var(--success) / .2)}.border-success\\/30{border-color:hsl(var(--success) / .3)}.border-text-primary{--tw-border-opacity: 1;border-color:hsl(var(--text-primary) / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-warning\\/20{border-color:hsl(var(--warning) / .2)}.border-warning\\/30{border-color:hsl(var(--warning) / .3)}.border-white\\/70{border-color:#ffffffb3}.border-white\\/80{border-color:#fffc}.border-white\\/90{border-color:#ffffffe6}.border-l-brand{--tw-border-opacity: 1;border-left-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.\\!bg-success-surface{background-color:hsl(var(--success-surface))!important}.bg-\\[var\\(--overlay-backdrop-strong\\)\\]{background-color:var(--overlay-backdrop-strong)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\\/10{background-color:#0000001a}.bg-black\\/40{background-color:#0006}.bg-black\\/80{background-color:#000c}.bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.bg-brand-subtle{background-color:var(--brand-subtle)}.bg-brand\\/10{background-color:hsl(var(--brand-hsl) / .1)}.bg-brand\\/5{background-color:hsl(var(--brand-hsl) / .05)}.bg-danger{--tw-bg-opacity: 1;background-color:hsl(var(--danger) / var(--tw-bg-opacity, 1))}.bg-danger-subtle{background-color:hsl(var(--danger-subtle))}.bg-danger\\/10{background-color:hsl(var(--danger) / .1)}.bg-info-subtle{background-color:hsl(var(--info-subtle))}.bg-line{--tw-bg-opacity: 1;background-color:hsl(var(--border-default) / var(--tw-bg-opacity, 1))}.bg-line-subtle{--tw-bg-opacity: 1;background-color:hsl(var(--border-subtle) / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:hsl(var(--success) / var(--tw-bg-opacity, 1))}.bg-success-subtle{background-color:hsl(var(--success-subtle))}.bg-success-surface{background-color:hsl(var(--success-surface))}.bg-surface-0{--tw-bg-opacity: 1;background-color:hsl(var(--surface-0) / var(--tw-bg-opacity, 1))}.bg-surface-1{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.bg-surface-2{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.bg-surface-3{--tw-bg-opacity: 1;background-color:hsl(var(--surface-3) / var(--tw-bg-opacity, 1))}.bg-surface-inset{--tw-bg-opacity: 1;background-color:hsl(var(--surface-inset) / var(--tw-bg-opacity, 1))}.bg-text-primary{--tw-bg-opacity: 1;background-color:hsl(var(--text-primary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:hsl(var(--text-tertiary) / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:hsl(var(--warning) / var(--tw-bg-opacity, 1))}.bg-warning-subtle{background-color:hsl(var(--warning-subtle))}.bg-warning\\/10{background-color:hsl(var(--warning) / .1)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\\/10{background-color:#ffffff1a}.bg-white\\/25{background-color:#ffffff40}.fill-text-primary{fill:hsl(var(--text-primary) / 1)}.stroke-\\[3\\]{stroke-width:3}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.\\!p-0{padding:0!important}.p-0{padding:0}.p-0\\.5{padding:2px}.p-1{padding:4px}.p-1\\.5{padding:6px}.p-2{padding:8px}.p-3{padding:12px}.p-3\\.5{padding:14px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.p-7{padding:28px}.p-8{padding:32px}.p-\\[18px\\]{padding:18px}.px-0{padding-left:0;padding-right:0}.px-1\\.5{padding-left:6px;padding-right:6px}.px-2{padding-left:8px;padding-right:8px}.px-2\\.5{padding-left:10px;padding-right:10px}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.px-6{padding-left:24px;padding-right:24px}.px-9{padding-left:36px;padding-right:36px}.py-0\\.5{padding-top:2px;padding-bottom:2px}.py-1{padding-top:4px;padding-bottom:4px}.py-1\\.5{padding-top:6px;padding-bottom:6px}.py-10{padding-top:40px;padding-bottom:40px}.py-16{padding-top:64px;padding-bottom:64px}.py-2{padding-top:8px;padding-bottom:8px}.py-2\\.5{padding-top:10px;padding-bottom:10px}.py-3{padding-top:12px;padding-bottom:12px}.py-3\\.5{padding-top:14px;padding-bottom:14px}.py-4{padding-top:16px;padding-bottom:16px}.py-5{padding-top:20px;padding-bottom:20px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:32px;padding-bottom:32px}.pb-1{padding-bottom:4px}.pb-3{padding-bottom:12px}.pb-4{padding-bottom:16px}.pl-3{padding-left:12px}.pl-4{padding-left:16px}.pl-5{padding-left:20px}.pl-8{padding-left:32px}.pr-10{padding-right:40px}.pr-3{padding-right:12px}.pr-4{padding-right:16px}.pt-0{padding-top:0}.pt-1{padding-top:4px}.pt-2\\.5{padding-top:10px}.pt-4{padding-top:16px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-display{font-family:var(--font-display),ui-sans-serif,system-ui,sans-serif}.font-mono{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace}.font-sans{font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif}.text-2xs{font-size:clamp(10.5px,10.19px + .082vw,11.5px);line-height:1.333}.text-\\[0\\.72rem\\]{font-size:11.52px}.text-\\[1\\.45rem\\]{font-size:23.2px}.text-\\[1\\.75rem\\]{font-size:28px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-base{font-size:clamp(14px,13.39px + .163vw,16px);line-height:1.5}.text-lg{font-size:clamp(17px,16.39px + .163vw,19px);line-height:1.471}.text-sm{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.text-xl{font-size:clamp(20px,19.08px + .245vw,23px);line-height:1.45}.text-xs{font-size:clamp(12px,11.69px + .082vw,13px);line-height:1.333}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:16px}.leading-5{line-height:20px}.leading-8{line-height:32px}.leading-\\[1\\.55\\]{line-height:1.55}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.text-\\[hsl\\(145_5\\%_42\\%\\)\\]{--tw-text-opacity: 1;color:hsl(145 5% 42% / var(--tw-text-opacity, 1))}.text-brand{--tw-text-opacity: 1;color:hsl(var(--brand-hsl) / var(--tw-text-opacity, 1))}.text-brand-fg{color:var(--brand-fg)}.text-brand\\/50{color:hsl(var(--brand-hsl) / .5)}.text-danger{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.text-danger\\/80{color:hsl(var(--danger) / .8)}.text-info{--tw-text-opacity: 1;color:hsl(var(--info) / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:hsl(var(--success) / var(--tw-text-opacity, 1))}.text-text-disabled{--tw-text-opacity: 1;color:hsl(var(--text-disabled) / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:hsl(var(--text-inverse) / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-warning{--tw-text-opacity: 1;color:hsl(var(--warning) / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\\/90{color:#ffffffe6}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-brand{accent-color:hsl(var(--brand-hsl) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.\\!shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1) !important;--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_24px_70px_-28px_rgba\\(16\\,24\\,18\\,0\\.45\\)\\]{--tw-shadow: 0 24px 70px -28px rgba(16,24,18,.45);--tw-shadow-colored: 0 24px 70px -28px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--shadow-lg);--tw-shadow-colored: var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--shadow-md);--tw-shadow-colored: var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: var(--shadow-xl);--tw-shadow-colored: var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xs{--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-2{outline-width:2px}.outline-offset-0{outline-offset:0px}.outline-transparent{outline-color:transparent}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-brand{--tw-ring-opacity: 1;--tw-ring-color: hsl(var(--brand-hsl) / var(--tw-ring-opacity, 1))}.ring-brand-subtle{--tw-ring-color: var(--brand-subtle)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,border-color\\,color\\,box-shadow\\]{transition-property:background-color,border-color,color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,border-color\\,box-shadow\\,opacity\\]{transition-property:background-color,color,border-color,box-shadow,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,border-color\\,box-shadow\\]{transition-property:background-color,color,border-color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,box-shadow\\]{transition-property:background-color,color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\]{transition-property:background-color,color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[border-color\\,box-shadow\\,background-color\\]{transition-property:border-color,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[border-color\\,outline-color\\,box-shadow\\,background-color\\,transform\\]{transition-property:border-color,outline-color,box-shadow,background-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[max-width\\,height\\,box-shadow\\,background-color\\,border-color\\,transform\\,opacity\\]{transition-property:max-width,height,box-shadow,background-color,border-color,transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[max-width\\]{transition-property:max-width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-\\[var\\(--issue-marker-expand-duration\\)\\]{transition-duration:var(--issue-marker-expand-duration)}.duration-fast{transition-duration:var(--duration-fast)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:var(--ease-in-out)}.ease-out{transition-timing-function:var(--ease-out)}@keyframes float-gentle{0%,to{transform:translateY(0)}50%{transform:translateY(-2px)}}@keyframes toast-slide{0%{opacity:0;transform:translateY(-14px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gradient-shift{0%,to{background-position:0% 50%}50%{background-position:100% 50%}}.issue-overlay-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.issue-marker-breathe{animation:float-gentle 4.8s var(--ease-in-out) infinite}.issue-marker-breathe:hover,.issue-marker-breathe:focus-visible,.issue-marker-breathe:focus-within{animation-play-state:paused}.\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}.marker\\:text-text-tertiary *::marker{color:hsl(var(--text-tertiary))}.marker\\:text-text-tertiary::marker{color:hsl(var(--text-tertiary))}.file\\:border-0::file-selector-button{border-width:0px}.file\\:bg-transparent::file-selector-button{background-color:transparent}.file\\:text-sm::file-selector-button{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.file\\:font-medium::file-selector-button{font-weight:500}.file\\:text-text-primary::file-selector-button{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.placeholder\\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.first\\:mt-0:first-child{margin-top:0}.first\\:border-t-0:first-child{border-top-width:0px}.first\\:pt-0:first-child{padding-top:0}.focus-within\\:z-\\[10001\\]:focus-within{z-index:10001}.focus-within\\:border-line-focus:focus-within{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.hover\\:z-\\[10001\\]:hover{z-index:10001}.hover\\:border-line:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-default) / var(--tw-border-opacity, 1))}.hover\\:border-line-strong:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-strong) / var(--tw-border-opacity, 1))}.hover\\:border-line-subtle:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.hover\\:bg-\\[hsl\\(144_8\\%_96\\%\\)\\]:hover{--tw-bg-opacity: 1;background-color:hsl(144 8% 96% / var(--tw-bg-opacity, 1))}.hover\\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\\:bg-brand-hover:hover{background-color:var(--brand-hover)}.hover\\:bg-brand\\/40:hover{background-color:hsl(var(--brand-hsl) / .4)}.hover\\:bg-danger-subtle:hover{background-color:hsl(var(--danger-subtle))}.hover\\:bg-danger\\/10:hover{background-color:hsl(var(--danger) / .1)}.hover\\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-2:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-2\\/60:hover{background-color:hsl(var(--surface-2) / .6)}.hover\\:bg-surface-3:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-3) / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-inset:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-inset) / var(--tw-bg-opacity, 1))}.hover\\:bg-transparent:hover{background-color:transparent}.hover\\:bg-white\\/20:hover{background-color:#fff3}.hover\\:text-\\[hsl\\(150_10\\%_12\\%\\)\\]:hover{--tw-text-opacity: 1;color:hsl(150 10% 12% / var(--tw-text-opacity, 1))}.hover\\:text-brand-hover:hover{color:var(--brand-hover)}.hover\\:text-danger:hover{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.hover\\:text-slate-900:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.hover\\:text-text-primary:hover{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.hover\\:text-text-secondary:hover{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-90:hover{opacity:.9}.focus\\:border-brand:focus{--tw-border-opacity: 1;border-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.focus\\:bg-surface-2:focus{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.focus\\:text-text-primary:focus{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:h-\\[var\\(--issue-sticker-hover-size\\)\\]:focus-visible{height:var(--issue-sticker-hover-size)}.focus-visible\\:max-w-\\[160px\\]:focus-visible{max-width:160px}.focus-visible\\:max-w-\\[480px\\]:focus-visible{max-width:480px}.focus-visible\\:border-line-focus:focus-visible{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.focus-visible\\:border-transparent:focus-visible{border-color:transparent}.focus-visible\\:bg-slate-50:focus-visible{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.focus-visible\\:bg-surface-1:focus-visible{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.focus-visible\\:bg-surface-2:focus-visible{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.focus-visible\\:text-text-primary:focus-visible{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.focus-visible\\:shadow-focus:focus-visible{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:outline-line-focus:focus-visible{outline-color:hsl(var(--border-focus) / 1)}.focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-4:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-brand-subtle:focus-visible{--tw-ring-color: var(--brand-subtle)}.focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color: rgb(255 255 255 / .4)}.active\\:bg-brand-active:active{background-color:var(--brand-active)}.active\\:bg-brand\\/60:active{background-color:hsl(var(--brand-hsl) / .6)}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}.group\\/marker:hover .group-hover\\/marker\\:h-\\[var\\(--issue-sticker-hover-size\\)\\]{height:var(--issue-sticker-hover-size)}.group\\/marker:hover .group-hover\\/marker\\:max-w-\\[160px\\]{max-width:160px}.group\\/marker:hover .group-hover\\/marker\\:max-w-\\[480px\\]{max-width:480px}.group\\/marker:hover .group-hover\\/marker\\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\\/marker:hover .group-hover\\/marker\\:bg-brand-hover{background-color:var(--brand-hover)}.group\\/marker:hover .group-hover\\/marker\\:opacity-100{opacity:1}.group\\/marker:hover .group-hover\\/marker\\:shadow-xl{--tw-shadow: var(--shadow-xl);--tw-shadow-colored: var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group:focus-visible .group-focus-visible\\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:focus-visible .group-focus-visible\\:opacity-100{opacity:1}.group.toaster .group-\\[\\.toaster\\]\\:isolate{isolation:isolate}.group.toast .group-\\[\\.toast\\]\\:rounded-md,.group.toaster .group-\\[\\.toaster\\]\\:rounded-md{border-radius:var(--radius-md)}.group.toaster .group-\\[\\.toaster\\]\\:border{border-width:1px}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-danger\\/30{border-color:hsl(var(--danger) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-info\\/30{border-color:hsl(var(--info) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-success\\/30{border-color:hsl(var(--success) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-warning\\/30{border-color:hsl(var(--warning) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:border-line-subtle{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:bg-surface-2{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-danger-subtle{background-color:hsl(var(--danger-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-info-subtle{background-color:hsl(var(--info-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-success-surface{background-color:hsl(var(--success-surface))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-warning-subtle{background-color:hsl(var(--warning-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:bg-surface-1{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:px-4{padding-left:16px;padding-right:16px}.group.toaster .group-\\[\\.toaster\\]\\:py-3{padding-top:12px;padding-bottom:12px}.group.toast .group-\\[\\.toast\\]\\:text-sm{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.group.toast .group-\\[\\.toast\\]\\:text-xs{font-size:clamp(12px,11.69px + .082vw,13px);line-height:1.333}.group.toast .group-\\[\\.toast\\]\\:font-medium{font-weight:500}.group.toast .group-\\[\\.toast\\]\\:text-brand-fg{color:var(--brand-fg)}.group.toast .group-\\[\\.toast\\]\\:text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:text-text-secondary{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group.toaster .group-\\[\\.toaster\\]\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.group.toaster .group-\\[\\.toaster\\]\\:before\\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.group.toaster .group-\\[\\.toaster\\]\\:before\\:-z-10:before{content:var(--tw-content);z-index:-10}.group.toaster .group-\\[\\.toaster\\]\\:before\\:rounded-md:before{content:var(--tw-content);border-radius:var(--radius-md)}.group.toaster .group-\\[\\.toaster\\]\\:before\\:bg-surface-1:before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:before\\:content-\\[\\'\\'\\]:before{--tw-content: "";content:var(--tw-content)}.peer:focus-visible~.peer-focus-visible\\:shadow-focus{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer:disabled~.peer-disabled\\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\\:opacity-60{opacity:.6}.aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\\:opacity-40[aria-disabled=true]{opacity:.4}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}@keyframes dialog-out{0%{opacity:1;transform:translate(-50%,-50%) scale(1)}to{opacity:0;transform:translate(-50%,calc(-50% + 8px)) scale(.985)}}.data-\\[state\\=closed\\]\\:animate-dialog-out[data-state=closed]{animation:dialog-out var(--duration-out) var(--ease-out) forwards}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.data-\\[state\\=closed\\]\\:animate-fade-out[data-state=closed]{animation:fade-out var(--duration-out) var(--ease-out) forwards}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.97)}}.data-\\[state\\=closed\\]\\:animate-scale-out[data-state=closed]{animation:scale-out var(--duration-out) var(--ease-out) forwards}@keyframes sheet-out-left{0%{transform:translate(0)}to{transform:translate(-100%);opacity:.6}}.data-\\[state\\=closed\\]\\:animate-sheet-out-left[data-state=closed]{animation:sheet-out-left var(--duration-base) var(--ease-out) forwards}@keyframes sheet-out-right{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:.6}}.data-\\[state\\=closed\\]\\:animate-sheet-out-right[data-state=closed]{animation:sheet-out-right var(--duration-base) var(--ease-out) forwards}.data-\\[state\\=delayed-open\\]\\:animate-scale-in[data-state=delayed-open]{animation:scale-in var(--duration-base) var(--ease-out) forwards}@keyframes dialog-in{0%{opacity:0;transform:translate(-50%,calc(-50% + 12px)) scale(.985)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.data-\\[state\\=open\\]\\:animate-dialog-in[data-state=open]{animation:dialog-in var(--duration-base) var(--ease-out) forwards}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.data-\\[state\\=open\\]\\:animate-fade-in[data-state=open]{animation:fade-in var(--duration-base) var(--ease-out) forwards}@keyframes scale-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.data-\\[state\\=open\\]\\:animate-scale-in[data-state=open]{animation:scale-in var(--duration-base) var(--ease-out) forwards}@keyframes sheet-in-left{0%{transform:translate(-100%);opacity:.6}to{transform:translate(0);opacity:1}}.data-\\[state\\=open\\]\\:animate-sheet-in-left[data-state=open]{animation:sheet-in-left var(--duration-base) var(--ease-out) forwards}@keyframes sheet-in-right{0%{transform:translate(100%);opacity:.6}to{transform:translate(0)}}.data-\\[state\\=open\\]\\:animate-sheet-in-right[data-state=open]{animation:sheet-in-right var(--duration-base) var(--ease-out) forwards}.data-\\[range-end\\=true\\]\\:rounded-md[data-range-end=true]{border-radius:var(--radius-md)}.data-\\[range-middle\\=true\\]\\:rounded-none[data-range-middle=true]{border-radius:0}.data-\\[range-start\\=true\\]\\:rounded-md[data-range-start=true]{border-radius:var(--radius-md)}.data-\\[state\\=open\\]\\:border-line-focus[data-state=open]{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.data-\\[highlighted\\]\\:bg-surface-2[data-highlighted]{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.data-\\[range-end\\=true\\]\\:bg-brand[data-range-end=true]{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.data-\\[range-middle\\=true\\]\\:bg-transparent[data-range-middle=true]{background-color:transparent}.data-\\[range-start\\=true\\]\\:bg-brand[data-range-start=true],.data-\\[selected-single\\=true\\]\\:bg-brand[data-selected-single=true]{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.data-\\[state\\=selected\\]\\:bg-brand-subtle[data-state=selected]{background-color:var(--brand-subtle)}.data-\\[today\\=true\\]\\:font-semibold[data-today=true]{font-weight:600}.data-\\[highlighted\\]\\:text-text-primary[data-highlighted]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[placeholder\\]\\:text-text-tertiary[data-placeholder]{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.data-\\[range-end\\=true\\]\\:text-brand-fg[data-range-end=true]{color:var(--brand-fg)}.data-\\[range-middle\\=true\\]\\:text-text-primary[data-range-middle=true]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[range-start\\=true\\]\\:text-brand-fg[data-range-start=true],.data-\\[selected-single\\=true\\]\\:text-brand-fg[data-selected-single=true]{color:var(--brand-fg)}.data-\\[state\\=active\\]\\:text-text-primary[data-state=active],.data-\\[state\\=checked\\]\\:text-text-primary[data-state=checked]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[today\\=true\\]\\:text-brand[data-today=true]{--tw-text-opacity: 1;color:hsl(var(--brand-hsl) / var(--tw-text-opacity, 1))}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[state\\=open\\]\\:shadow-focus[data-state=open]{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\\[range-end\\=true\\]\\:hover\\:bg-brand-hover:hover[data-range-end=true],.data-\\[range-start\\=true\\]\\:hover\\:bg-brand-hover:hover[data-range-start=true],.data-\\[selected-single\\=true\\]\\:hover\\:bg-brand-hover:hover[data-selected-single=true]{background-color:var(--brand-hover)}.data-\\[range-end\\=true\\]\\:hover\\:text-brand-fg:hover[data-range-end=true],.data-\\[range-start\\=true\\]\\:hover\\:text-brand-fg:hover[data-range-start=true],.data-\\[selected-single\\=true\\]\\:hover\\:text-brand-fg:hover[data-selected-single=true]{color:var(--brand-fg)}@media(prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@media(min-width:640px){.sm\\:flex-row{flex-direction:row}.sm\\:items-start{align-items:flex-start}.sm\\:items-center{align-items:center}.sm\\:justify-end{justify-content:flex-end}.sm\\:justify-between{justify-content:space-between}.sm\\:gap-2\\.5{gap:10px}.sm\\:p-5{padding:20px}.sm\\:p-6{padding:24px}.sm\\:text-2xl{font-size:clamp(26px,24.78px + .327vw,30px);line-height:1.308}.sm\\:text-\\[2\\.1rem\\]{font-size:33.6px}}@media(min-width:768px){.md\\:flex{display:flex}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-\\[minmax\\(0\\,1fr\\)_minmax\\(260px\\,340px\\)\\]{grid-template-columns:minmax(0,1fr) minmax(260px,340px)}}.\\[\\&\\>\\*\\:not\\(summary\\)\\]\\:pl-4>*:not(summary){padding-left:16px}.\\[\\&\\>span\\]\\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\\[\\&\\>tr\\]\\:last\\:border-b-0:last-child>tr{border-bottom-width:0px}.\\[\\&\\[data-state\\=open\\]\\>span\\[data-chevron\\]\\]\\:rotate-180[data-state=open]>span[data-chevron]{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-danger [data-icon]{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-info [data-icon]{--tw-text-opacity: 1;color:hsl(var(--info) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-success [data-icon]{--tw-text-opacity: 1;color:hsl(var(--success) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-warning [data-icon]{--tw-text-opacity: 1;color:hsl(var(--warning) / var(--tw-text-opacity, 1))}.\\[\\&_tr\\]\\:border-b tr{border-bottom-width:1px}.\\[\\&_tr\\]\\:border-line-subtle tr{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}`;
39887
+ const globalsCSS = `:root,:host{color-scheme:light;--brand-h: 150;--brand-s: 100%;--brand-l: 34%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-subtle: hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14);--brand-border: hsl(var(--brand-h) calc(var(--brand-s) + 8%) calc(var(--brand-l) + 8%) / .34);--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22);--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-display: var(--font-sans);--font-mono: var(--font-sans);--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--text-disabled: 145 4% 70%;--text-inverse: 0 0% 100%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--border-focus: var(--brand-h) var(--brand-s) var(--brand-l);--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 52%;--warning-subtle: 34 82% 52% / .14;--danger: 3 68% 56%;--danger-subtle: 3 68% 56% / .12;--danger-deep: 3 62% 40%;--info: 202 52% 44%;--info-subtle: 202 52% 44% / .12;--accent-terra: 13 52% 47%;--accent-terra-subtle: 13 52% 47% / .1;--accent-terra-deep: 13 48% 44%;--accent-blue: 213 86% 56%;--accent-blue-subtle: 213 92% 56% / .12;--accent-blue-deep: 216 78% 40%;--accent-blue-border: 213 86% 62% / .36;--accent-cream: 38 52% 88%;--accent-cream-warm: 40 56% 95%;--accent-cream-deep: 38 48% 82%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 11%;--radius-xs: 4px;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 16px;--radius-xl: 20px;--radius-2xl: 24px;--radius-pill: 9999px;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 3px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 14%) / .24), 0 6px 20px hsl(var(--brand-h) calc(var(--brand-s) - 70%) calc(var(--brand-l) - 19%) / .16);--duration-instant: 90ms;--duration-fast: .16s;--duration-base: .26s;--duration-out: .18s;--duration-slow: .36s;--ease-out: cubic-bezier(.23, 1, .32, 1);--ease-in-out: cubic-bezier(.45, 0, .15, 1);--ease-spring: cubic-bezier(.18, .94, .32, 1.08);--grid-line: 0 0% 92%}.dark,:host(.dark){color-scheme:dark;--brand-l: 34%;--brand-fg: hsl(0 0% 100%);--surface-0: 150 8% 7%;--surface-1: 150 6% 10%;--surface-2: 150 5% 14%;--surface-3: 150 4% 18%;--surface-inset: 150 6% 6%;--overlay-backdrop: hsl(0 0% 0% / .56);--overlay-backdrop-strong: hsl(0 0% 0% / .8);--text-primary: 40 16% 93%;--text-secondary: 36 8% 68%;--text-tertiary: 34 6% 50%;--text-disabled: 30 5% 34%;--text-inverse: 150 8% 10%;--border-subtle: 150 6% 16%;--border-default: 150 5% 22%;--border-strong: 150 4% 34%;--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 62%;--danger: 2 70% 64%;--danger-deep: 2 80% 76%;--info: 202 54% 62%;--accent-terra: 13 56% 62%;--accent-terra-subtle: 13 56% 62% / .14;--accent-terra-deep: 13 52% 56%;--accent-blue: 210 92% 68%;--accent-blue-subtle: 210 92% 68% / .18;--accent-blue-deep: 209 100% 78%;--accent-blue-border: 210 92% 72% / .44;--accent-cream: 38 30% 26%;--accent-cream-warm: 38 22% 18%;--accent-cream-deep: 38 26% 32%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 8%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .2);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .3), 0 1px 2px -1px hsl(0 0% 0% / .24);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .34), 0 2px 4px -2px hsl(0 0% 0% / .2);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .38), 0 4px 6px -4px hsl(0 0% 0% / .24);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .44), 0 8px 10px -6px hsl(0 0% 0% / .28);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .16);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 24%) / .44), 0 6px 20px hsl(0 0% 0% / .32);--grid-line: 150 6% 14%}*{border-color:hsl(var(--border-default))}html{font-family:var(--font-sans),ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-feature-settings:"cv11","ss01","ss03";background-color:hsl(var(--surface-0))}body{margin:0;min-height:100vh;color:hsl(var(--text-primary));background-color:hsl(var(--surface-0))}::-moz-selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}::selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:"ss01","ss02","cv11"}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border-strong) / .52);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:hsl(var(--border-strong) / .9);background-clip:padding-box;border:2px solid transparent}.app-canvas,.grid-canvas{background-color:hsl(var(--surface-0))}.onboarding-canvas{word-break:keep-all;overflow-wrap:break-word;--surface-0: var(--brand-h) var(--brand-s) var(--brand-l);--surface-1: 0 0% 100%;--surface-2: var(--brand-h) 62% 28%;--surface-3: var(--brand-h) 60% 25%;--surface-inset: var(--brand-h) 62% 28%;--text-primary: 0 0% 100%;--text-secondary: var(--brand-h) 46% 90%;--text-tertiary: var(--brand-h) 34% 84%;--text-disabled: var(--brand-h) 20% 72%;--border-subtle: var(--brand-h) 44% 52%;--border-default: var(--brand-h) 40% 58%;--border-strong: var(--brand-h) 36% 70%;--border-focus: 0 0% 100%;--brand-hsl: 0 0% 100%;--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) 24% 94%);--brand-active: hsl(var(--brand-h) 20% 88%);--brand-fg: hsl(var(--brand-h) var(--brand-s) 24%);--brand-ring: hsl(0 0% 100% / .4);--danger: 6 96% 86%;--danger-subtle: 6 96% 86% / .18;--danger-deep: 6 96% 92%;--warning: 42 96% 82%;--warning-subtle: 42 96% 82% / .18}.onboarding-canvas .bg-surface-1,.onboarding-canvas input,.onboarding-canvas textarea,.onboarding-canvas [role=combobox]{--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--surface-2: 144 8% 96%;--surface-inset: 144 6% 95%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22);--warning: 34 82% 52%;--warning-subtle: 34 82% 52% / .14;--danger: 3 68% 56%;--danger-subtle: 3 68% 56% / .12;--danger-deep: 3 62% 40%}@keyframes onboarding-step-in{0%{opacity:0;transform:translate(96px)}to{opacity:1;transform:translate(0)}}.onboarding-step-in{animation:onboarding-step-in var(--duration-slow) var(--ease-out) forwards}@keyframes onboarding-enter-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.onboarding-enter{position:fixed;top:0;right:0;bottom:0;left:0;overflow-x:hidden;overflow-y:auto;animation:onboarding-enter-up var(--duration-base) var(--ease-out) forwards}body:has(.onboarding-canvas){background-color:hsl(var(--brand-h) var(--brand-s) var(--brand-l))}.panel-shell,.surface-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-sm)}.panel-shell-muted,.surface-shell-muted{background:hsl(var(--surface-2));box-shadow:var(--shadow-xs)}.panel-shell-subtle{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.panel-shell-elevated{border:1px solid hsl(var(--border-default));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.utility-chip,.floating-chip{display:inline-flex;align-items:center;gap:8px;border:1px solid hsl(var(--border-default));border-radius:var(--radius-pill);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.hairline{border-bottom:1px solid hsl(var(--border-subtle))}.mono-label{font-family:var(--font-mono),ui-monospace,monospace;font-size:11px;text-transform:uppercase;color:hsl(var(--text-tertiary))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,:host{--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-mono: var(--font-sans);--issue-marker-expand-duration: .52s;--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 52%;--text-disabled: 145 4% 70%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--grid-line: 0 0% 92%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 4px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04)}*{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}#issue-sticker-shadow-root{all:initial;display:block;background-color:transparent;--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1));font-family:var(--font-sans);line-height:1.5}.\\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-1{left:4px;right:4px}.inset-y-0{top:0;bottom:0}.-bottom-px{bottom:-1px}.bottom-0{bottom:0}.bottom-4{bottom:16px}.bottom-6{bottom:24px}.left-0{left:0}.left-1\\/2{left:50%}.left-2{left:8px}.left-4{left:16px}.left-\\[50\\%\\]{left:50%}.right-0{right:0}.right-2{right:8px}.right-3{right:12px}.right-4{right:16px}.right-5{right:20px}.right-6{right:24px}.top-0{top:0}.top-1{top:4px}.top-1\\/2{top:50%}.top-2{top:8px}.top-3{top:12px}.top-4{top:16px}.top-5{top:20px}.top-\\[50\\%\\]{top:50%}.top-\\[calc\\(\\(3\\.5rem-1\\.75rem\\)\\/2\\)\\]{top:14px}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-\\[1000000\\]{z-index:1000000}.z-\\[1000003\\]{z-index:1000003}.z-\\[1000004\\]{z-index:1000004}.z-\\[1000005\\]{z-index:1000005}.z-\\[1000006\\]{z-index:1000006}.z-\\[1000007\\]{z-index:1000007}.z-\\[1000008\\]{z-index:1000008}.z-\\[1000010\\]{z-index:1000010}.z-\\[1000011\\]{z-index:1000011}.z-\\[10001\\]{z-index:10001}.z-\\[999999\\]{z-index:999999}.z-\\[9999\\]{z-index:9999}.m-0{margin:0}.-mx-2{margin-left:-8px;margin-right:-8px}.mx-3{margin-left:12px;margin-right:12px}.my-1{margin-top:4px;margin-bottom:4px}.my-2{margin-top:8px;margin-bottom:8px}.my-2\\.5{margin-top:10px;margin-bottom:10px}.my-3{margin-top:12px;margin-bottom:12px}.my-4{margin-top:16px;margin-bottom:16px}.mb-0\\.5{margin-bottom:2px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-5{margin-bottom:20px}.ml-0\\.5{margin-left:2px}.ml-4{margin-left:16px}.mr-1\\.5{margin-right:6px}.mt-0{margin-top:0}.mt-0\\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.\\!h-auto{height:auto!important}.h-1\\.5{height:6px}.h-10{height:40px}.h-11{height:44px}.h-2{height:8px}.h-24{height:96px}.h-3{height:12px}.h-3\\.5{height:14px}.h-4{height:16px}.h-5{height:20px}.h-6{height:24px}.h-7{height:28px}.h-8{height:32px}.h-9{height:36px}.h-\\[1\\.4rem\\]{height:22.4px}.h-\\[100vh\\]{height:100vh}.h-\\[18px\\]{height:18px}.h-\\[220px\\]{height:220px}.h-\\[22px\\]{height:22px}.h-\\[30px\\]{height:30px}.h-\\[min\\(36vh\\,320px\\)\\]{height:min(36vh,320px)}.h-\\[min\\(480px\\,calc\\(100vh-64px\\)\\)\\]{height:min(480px,calc(100vh - 64px))}.h-\\[min\\(54vh\\,520px\\)\\]{height:min(54vh,520px)}.h-\\[min\\(560px\\,calc\\(100vh-32px\\)\\)\\]{height:min(560px,calc(100vh - 32px))}.h-\\[var\\(--issue-sticker-size\\)\\]{height:var(--issue-sticker-size)}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-24{max-height:96px}.max-h-40{max-height:160px}.max-h-56{max-height:224px}.max-h-80{max-height:320px}.max-h-96{max-height:384px}.max-h-\\[150px\\]{max-height:150px}.max-h-\\[220px\\]{max-height:220px}.max-h-\\[320px\\]{max-height:320px}.max-h-\\[420px\\]{max-height:420px}.max-h-\\[90vh\\]{max-height:90vh}.max-h-\\[calc\\(100vh-3rem\\)\\]{max-height:calc(100vh - 48px)}.max-h-\\[min\\(80vh\\,640px\\)\\]{max-height:min(80vh,640px)}.min-h-0{min-height:0px}.min-h-11{min-height:44px}.min-h-\\[108px\\]{min-height:108px}.min-h-\\[120px\\]{min-height:120px}.min-h-\\[140px\\]{min-height:140px}.min-h-\\[220px\\]{min-height:220px}.w-0\\.5{width:2px}.w-1{width:4px}.w-1\\.5{width:6px}.w-1\\/2{width:50%}.w-10{width:40px}.w-12{width:48px}.w-14{width:56px}.w-16{width:64px}.w-2{width:8px}.w-3{width:12px}.w-3\\.5{width:14px}.w-4{width:16px}.w-5{width:20px}.w-6{width:24px}.w-7{width:28px}.w-72{width:288px}.w-8{width:32px}.w-80{width:320px}.w-9{width:36px}.w-\\[1\\.4rem\\]{width:22.4px}.w-\\[18px\\]{width:18px}.w-\\[22\\.5rem\\]{width:360px}.w-\\[22rem\\]{width:352px}.w-\\[30px\\]{width:30px}.w-\\[38px\\]{width:38px}.w-\\[calc\\(100vw-32px\\)\\]{width:calc(100vw - 32px)}.w-\\[min\\(20rem\\,calc\\(100vw_-_1\\.5rem\\)\\)\\]{width:min(320px,calc(100vw - 24px))}.w-\\[min\\(560px\\,calc\\(100vw-32px\\)\\)\\]{width:min(560px,calc(100vw - 32px))}.w-\\[var\\(--radix-popover-trigger-width\\)\\]{width:var(--radix-popover-trigger-width)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0px}.min-w-9{min-width:36px}.min-w-\\[12rem\\]{min-width:192px}.min-w-\\[200px\\]{min-width:200px}.min-w-\\[var\\(--radix-popover-trigger-width\\)\\]{min-width:var(--radix-popover-trigger-width)}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.max-w-\\[10rem\\]{max-width:160px}.max-w-\\[120px\\]{max-width:120px}.max-w-\\[160px\\]{max-width:160px}.max-w-\\[260px\\]{max-width:260px}.max-w-\\[280px\\]{max-width:280px}.max-w-\\[28rem\\]{max-width:448px}.max-w-\\[300px\\]{max-width:300px}.max-w-\\[360px\\]{max-width:360px}.max-w-\\[36rem\\]{max-width:576px}.max-w-\\[400px\\]{max-width:400px}.max-w-\\[420px\\]{max-width:420px}.max-w-\\[428px\\]{max-width:428px}.max-w-\\[480px\\]{max-width:480px}.max-w-\\[62ch\\]{max-width:62ch}.max-w-\\[640px\\]{max-width:640px}.max-w-\\[70ch\\]{max-width:70ch}.max-w-\\[90vw\\]{max-width:90vw}.max-w-\\[960px\\]{max-width:960px}.max-w-\\[calc\\(100vw-24px\\)\\]{max-width:calc(100vw - 24px)}.max-w-\\[var\\(--issue-sticker-size\\)\\]{max-width:var(--issue-sticker-size)}.max-w-full{max-width:100%}.max-w-md{max-width:448px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1{--tw-translate-x: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[-50\\%\\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[18px\\]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[2px\\]{--tw-translate-x: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\\[-50\\%\\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse-ring{0%,to{box-shadow:0 0 0 0 var(--brand-ring)}50%{box-shadow:0 0 0 8px transparent}}.animate-pulse-ring{animation:pulse-ring 1.8s var(--ease-in-out) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\\.5{gap:2px}.gap-1{gap:4px}.gap-1\\.5{gap:6px}.gap-2{gap:8px}.gap-2\\.5{gap:10px}.gap-3{gap:12px}.gap-3\\.5{gap:14px}.gap-4{gap:16px}.gap-5{gap:20px}.gap-6{gap:24px}.gap-x-5{-moz-column-gap:20px;column-gap:20px}.gap-y-2{row-gap:8px}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(6px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(20px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20px * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(24px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-line-subtle>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.\\!rounded-none{border-radius:0!important}.rounded{border-radius:4px}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\[18px\\]{border-radius:18px}.rounded-\\[20px\\]{border-radius:20px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-dashed{border-style:dashed}.border-\\[hsl\\(144_8\\%_91\\%\\)\\]{--tw-border-opacity: 1;border-color:hsl(144 8% 91% / var(--tw-border-opacity, 1))}.border-brand{--tw-border-opacity: 1;border-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.border-brand-border{border-color:var(--brand-border)}.border-brand\\/30{border-color:hsl(var(--brand-hsl) / .3)}.border-brand\\/40{border-color:hsl(var(--brand-hsl) / .4)}.border-danger\\/20{border-color:hsl(var(--danger) / .2)}.border-danger\\/30{border-color:hsl(var(--danger) / .3)}.border-info\\/20{border-color:hsl(var(--info) / .2)}.border-info\\/30{border-color:hsl(var(--info) / .3)}.border-line{--tw-border-opacity: 1;border-color:hsl(var(--border-default) / var(--tw-border-opacity, 1))}.border-line-focus{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.border-line-strong{--tw-border-opacity: 1;border-color:hsl(var(--border-strong) / var(--tw-border-opacity, 1))}.border-line-subtle{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.border-line-subtle\\/50{border-color:hsl(var(--border-subtle) / .5)}.border-line-subtle\\/90{border-color:hsl(var(--border-subtle) / .9)}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-success{--tw-border-opacity: 1;border-color:hsl(var(--success) / var(--tw-border-opacity, 1))}.border-success\\/20{border-color:hsl(var(--success) / .2)}.border-success\\/30{border-color:hsl(var(--success) / .3)}.border-text-primary{--tw-border-opacity: 1;border-color:hsl(var(--text-primary) / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-warning\\/20{border-color:hsl(var(--warning) / .2)}.border-warning\\/30{border-color:hsl(var(--warning) / .3)}.border-white\\/70{border-color:#ffffffb3}.border-white\\/80{border-color:#fffc}.border-white\\/90{border-color:#ffffffe6}.border-l-brand{--tw-border-opacity: 1;border-left-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.\\!bg-success-surface{background-color:hsl(var(--success-surface))!important}.bg-\\[var\\(--overlay-backdrop-strong\\)\\]{background-color:var(--overlay-backdrop-strong)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\\/10{background-color:#0000001a}.bg-black\\/40{background-color:#0006}.bg-black\\/80{background-color:#000c}.bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.bg-brand-subtle{background-color:var(--brand-subtle)}.bg-brand\\/10{background-color:hsl(var(--brand-hsl) / .1)}.bg-brand\\/5{background-color:hsl(var(--brand-hsl) / .05)}.bg-danger{--tw-bg-opacity: 1;background-color:hsl(var(--danger) / var(--tw-bg-opacity, 1))}.bg-danger-subtle{background-color:hsl(var(--danger-subtle))}.bg-danger\\/10{background-color:hsl(var(--danger) / .1)}.bg-info-subtle{background-color:hsl(var(--info-subtle))}.bg-line{--tw-bg-opacity: 1;background-color:hsl(var(--border-default) / var(--tw-bg-opacity, 1))}.bg-line-subtle{--tw-bg-opacity: 1;background-color:hsl(var(--border-subtle) / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:hsl(var(--success) / var(--tw-bg-opacity, 1))}.bg-success-subtle{background-color:hsl(var(--success-subtle))}.bg-success-surface{background-color:hsl(var(--success-surface))}.bg-surface-0{--tw-bg-opacity: 1;background-color:hsl(var(--surface-0) / var(--tw-bg-opacity, 1))}.bg-surface-1{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.bg-surface-2{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.bg-surface-3{--tw-bg-opacity: 1;background-color:hsl(var(--surface-3) / var(--tw-bg-opacity, 1))}.bg-surface-inset{--tw-bg-opacity: 1;background-color:hsl(var(--surface-inset) / var(--tw-bg-opacity, 1))}.bg-text-primary{--tw-bg-opacity: 1;background-color:hsl(var(--text-primary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:hsl(var(--text-tertiary) / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:hsl(var(--warning) / var(--tw-bg-opacity, 1))}.bg-warning-subtle{background-color:hsl(var(--warning-subtle))}.bg-warning\\/10{background-color:hsl(var(--warning) / .1)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\\/10{background-color:#ffffff1a}.bg-white\\/25{background-color:#ffffff40}.fill-text-primary{fill:hsl(var(--text-primary) / 1)}.stroke-\\[3\\]{stroke-width:3}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.\\!p-0{padding:0!important}.p-0{padding:0}.p-0\\.5{padding:2px}.p-1{padding:4px}.p-1\\.5{padding:6px}.p-2{padding:8px}.p-3{padding:12px}.p-3\\.5{padding:14px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.p-7{padding:28px}.p-8{padding:32px}.p-\\[18px\\]{padding:18px}.px-0{padding-left:0;padding-right:0}.px-1\\.5{padding-left:6px;padding-right:6px}.px-2{padding-left:8px;padding-right:8px}.px-2\\.5{padding-left:10px;padding-right:10px}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.px-6{padding-left:24px;padding-right:24px}.px-9{padding-left:36px;padding-right:36px}.py-0\\.5{padding-top:2px;padding-bottom:2px}.py-1{padding-top:4px;padding-bottom:4px}.py-1\\.5{padding-top:6px;padding-bottom:6px}.py-10{padding-top:40px;padding-bottom:40px}.py-16{padding-top:64px;padding-bottom:64px}.py-2{padding-top:8px;padding-bottom:8px}.py-2\\.5{padding-top:10px;padding-bottom:10px}.py-3{padding-top:12px;padding-bottom:12px}.py-3\\.5{padding-top:14px;padding-bottom:14px}.py-4{padding-top:16px;padding-bottom:16px}.py-5{padding-top:20px;padding-bottom:20px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:32px;padding-bottom:32px}.pb-1{padding-bottom:4px}.pb-3{padding-bottom:12px}.pb-4{padding-bottom:16px}.pl-3{padding-left:12px}.pl-4{padding-left:16px}.pl-5{padding-left:20px}.pl-8{padding-left:32px}.pr-10{padding-right:40px}.pr-3{padding-right:12px}.pr-4{padding-right:16px}.pt-0{padding-top:0}.pt-1{padding-top:4px}.pt-2\\.5{padding-top:10px}.pt-4{padding-top:16px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-display{font-family:var(--font-display),ui-sans-serif,system-ui,sans-serif}.font-mono{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace}.font-sans{font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif}.text-2xs{font-size:clamp(10.5px,10.19px + .082vw,11.5px);line-height:1.333}.text-\\[0\\.72rem\\]{font-size:11.52px}.text-\\[1\\.45rem\\]{font-size:23.2px}.text-\\[1\\.75rem\\]{font-size:28px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-base{font-size:clamp(14px,13.39px + .163vw,16px);line-height:1.5}.text-lg{font-size:clamp(17px,16.39px + .163vw,19px);line-height:1.471}.text-sm{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.text-xl{font-size:clamp(20px,19.08px + .245vw,23px);line-height:1.45}.text-xs{font-size:clamp(12px,11.69px + .082vw,13px);line-height:1.333}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:16px}.leading-5{line-height:20px}.leading-8{line-height:32px}.leading-\\[1\\.55\\]{line-height:1.55}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.text-\\[hsl\\(145_5\\%_42\\%\\)\\]{--tw-text-opacity: 1;color:hsl(145 5% 42% / var(--tw-text-opacity, 1))}.text-brand{--tw-text-opacity: 1;color:hsl(var(--brand-hsl) / var(--tw-text-opacity, 1))}.text-brand-fg{color:var(--brand-fg)}.text-brand\\/50{color:hsl(var(--brand-hsl) / .5)}.text-danger{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.text-danger\\/80{color:hsl(var(--danger) / .8)}.text-info{--tw-text-opacity: 1;color:hsl(var(--info) / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:hsl(var(--success) / var(--tw-text-opacity, 1))}.text-text-disabled{--tw-text-opacity: 1;color:hsl(var(--text-disabled) / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:hsl(var(--text-inverse) / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-warning{--tw-text-opacity: 1;color:hsl(var(--warning) / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\\/90{color:#ffffffe6}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-brand{accent-color:hsl(var(--brand-hsl) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.\\!shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1) !important;--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_24px_70px_-28px_rgba\\(16\\,24\\,18\\,0\\.45\\)\\]{--tw-shadow: 0 24px 70px -28px rgba(16,24,18,.45);--tw-shadow-colored: 0 24px 70px -28px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--shadow-lg);--tw-shadow-colored: var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--shadow-md);--tw-shadow-colored: var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: var(--shadow-xl);--tw-shadow-colored: var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xs{--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-2{outline-width:2px}.outline-offset-0{outline-offset:0px}.outline-transparent{outline-color:transparent}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-brand{--tw-ring-opacity: 1;--tw-ring-color: hsl(var(--brand-hsl) / var(--tw-ring-opacity, 1))}.ring-brand-subtle{--tw-ring-color: var(--brand-subtle)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,border-color\\,color\\,box-shadow\\]{transition-property:background-color,border-color,color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,border-color\\,box-shadow\\,opacity\\]{transition-property:background-color,color,border-color,box-shadow,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,border-color\\,box-shadow\\]{transition-property:background-color,color,border-color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,box-shadow\\]{transition-property:background-color,color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\]{transition-property:background-color,color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[border-color\\,box-shadow\\,background-color\\]{transition-property:border-color,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[border-color\\,outline-color\\,box-shadow\\,background-color\\,transform\\]{transition-property:border-color,outline-color,box-shadow,background-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[max-width\\,height\\,box-shadow\\,background-color\\,border-color\\,transform\\,opacity\\]{transition-property:max-width,height,box-shadow,background-color,border-color,transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[max-width\\]{transition-property:max-width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-\\[var\\(--issue-marker-expand-duration\\)\\]{transition-duration:var(--issue-marker-expand-duration)}.duration-fast{transition-duration:var(--duration-fast)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:var(--ease-in-out)}.ease-out{transition-timing-function:var(--ease-out)}@keyframes float-gentle{0%,to{transform:translateY(0)}50%{transform:translateY(-2px)}}@keyframes toast-slide{0%{opacity:0;transform:translateY(-14px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gradient-shift{0%,to{background-position:0% 50%}50%{background-position:100% 50%}}.issue-overlay-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.issue-marker-breathe{animation:float-gentle 4.8s var(--ease-in-out) infinite}.issue-marker-breathe:hover,.issue-marker-breathe:focus-visible,.issue-marker-breathe:focus-within{animation-play-state:paused}.\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}.marker\\:text-text-tertiary *::marker{color:hsl(var(--text-tertiary))}.marker\\:text-text-tertiary::marker{color:hsl(var(--text-tertiary))}.file\\:border-0::file-selector-button{border-width:0px}.file\\:bg-transparent::file-selector-button{background-color:transparent}.file\\:text-sm::file-selector-button{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.file\\:font-medium::file-selector-button{font-weight:500}.file\\:text-text-primary::file-selector-button{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.placeholder\\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.first\\:mt-0:first-child{margin-top:0}.first\\:border-t-0:first-child{border-top-width:0px}.first\\:pt-0:first-child{padding-top:0}.focus-within\\:z-\\[10001\\]:focus-within{z-index:10001}.focus-within\\:border-line-focus:focus-within{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.hover\\:z-\\[10001\\]:hover{z-index:10001}.hover\\:border-line:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-default) / var(--tw-border-opacity, 1))}.hover\\:border-line-strong:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-strong) / var(--tw-border-opacity, 1))}.hover\\:border-line-subtle:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.hover\\:bg-\\[hsl\\(144_8\\%_96\\%\\)\\]:hover{--tw-bg-opacity: 1;background-color:hsl(144 8% 96% / var(--tw-bg-opacity, 1))}.hover\\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\\:bg-brand-hover:hover{background-color:var(--brand-hover)}.hover\\:bg-brand\\/40:hover{background-color:hsl(var(--brand-hsl) / .4)}.hover\\:bg-danger-subtle:hover{background-color:hsl(var(--danger-subtle))}.hover\\:bg-danger\\/10:hover{background-color:hsl(var(--danger) / .1)}.hover\\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-2:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-2\\/60:hover{background-color:hsl(var(--surface-2) / .6)}.hover\\:bg-surface-3:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-3) / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-inset:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-inset) / var(--tw-bg-opacity, 1))}.hover\\:bg-transparent:hover{background-color:transparent}.hover\\:bg-white\\/20:hover{background-color:#fff3}.hover\\:text-\\[hsl\\(150_10\\%_12\\%\\)\\]:hover{--tw-text-opacity: 1;color:hsl(150 10% 12% / var(--tw-text-opacity, 1))}.hover\\:text-brand-hover:hover{color:var(--brand-hover)}.hover\\:text-danger:hover{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.hover\\:text-slate-900:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.hover\\:text-text-primary:hover{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.hover\\:text-text-secondary:hover{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-90:hover{opacity:.9}.focus\\:border-brand:focus{--tw-border-opacity: 1;border-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.focus\\:bg-surface-2:focus{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.focus\\:text-text-primary:focus{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:h-\\[var\\(--issue-sticker-hover-size\\)\\]:focus-visible{height:var(--issue-sticker-hover-size)}.focus-visible\\:max-w-\\[160px\\]:focus-visible{max-width:160px}.focus-visible\\:max-w-\\[480px\\]:focus-visible{max-width:480px}.focus-visible\\:border-line-focus:focus-visible{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.focus-visible\\:border-transparent:focus-visible{border-color:transparent}.focus-visible\\:bg-slate-50:focus-visible{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.focus-visible\\:bg-surface-1:focus-visible{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.focus-visible\\:bg-surface-2:focus-visible{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.focus-visible\\:text-text-primary:focus-visible{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.focus-visible\\:shadow-focus:focus-visible{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:outline-line-focus:focus-visible{outline-color:hsl(var(--border-focus) / 1)}.focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-4:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-brand-subtle:focus-visible{--tw-ring-color: var(--brand-subtle)}.focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color: rgb(255 255 255 / .4)}.active\\:bg-brand-active:active{background-color:var(--brand-active)}.active\\:bg-brand\\/60:active{background-color:hsl(var(--brand-hsl) / .6)}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}.group\\/marker:hover .group-hover\\/marker\\:h-\\[var\\(--issue-sticker-hover-size\\)\\]{height:var(--issue-sticker-hover-size)}.group\\/marker:hover .group-hover\\/marker\\:max-w-\\[160px\\]{max-width:160px}.group\\/marker:hover .group-hover\\/marker\\:max-w-\\[480px\\]{max-width:480px}.group\\/marker:hover .group-hover\\/marker\\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\\/marker:hover .group-hover\\/marker\\:bg-brand-hover{background-color:var(--brand-hover)}.group\\/marker:hover .group-hover\\/marker\\:opacity-100{opacity:1}.group\\/marker:hover .group-hover\\/marker\\:shadow-xl{--tw-shadow: var(--shadow-xl);--tw-shadow-colored: var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group:focus-visible .group-focus-visible\\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:focus-visible .group-focus-visible\\:opacity-100{opacity:1}.group.toaster .group-\\[\\.toaster\\]\\:isolate{isolation:isolate}.group.toast .group-\\[\\.toast\\]\\:rounded-md,.group.toaster .group-\\[\\.toaster\\]\\:rounded-md{border-radius:var(--radius-md)}.group.toaster .group-\\[\\.toaster\\]\\:border{border-width:1px}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-danger\\/30{border-color:hsl(var(--danger) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-info\\/30{border-color:hsl(var(--info) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-success\\/30{border-color:hsl(var(--success) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-warning\\/30{border-color:hsl(var(--warning) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:border-line-subtle{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:bg-surface-2{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-danger-subtle{background-color:hsl(var(--danger-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-info-subtle{background-color:hsl(var(--info-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-success-surface{background-color:hsl(var(--success-surface))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-warning-subtle{background-color:hsl(var(--warning-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:bg-surface-1{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:px-4{padding-left:16px;padding-right:16px}.group.toaster .group-\\[\\.toaster\\]\\:py-3{padding-top:12px;padding-bottom:12px}.group.toast .group-\\[\\.toast\\]\\:text-sm{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.group.toast .group-\\[\\.toast\\]\\:text-xs{font-size:clamp(12px,11.69px + .082vw,13px);line-height:1.333}.group.toast .group-\\[\\.toast\\]\\:font-medium{font-weight:500}.group.toast .group-\\[\\.toast\\]\\:text-brand-fg{color:var(--brand-fg)}.group.toast .group-\\[\\.toast\\]\\:text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:text-text-secondary{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group.toaster .group-\\[\\.toaster\\]\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.group.toaster .group-\\[\\.toaster\\]\\:before\\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.group.toaster .group-\\[\\.toaster\\]\\:before\\:-z-10:before{content:var(--tw-content);z-index:-10}.group.toaster .group-\\[\\.toaster\\]\\:before\\:rounded-md:before{content:var(--tw-content);border-radius:var(--radius-md)}.group.toaster .group-\\[\\.toaster\\]\\:before\\:bg-surface-1:before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:before\\:content-\\[\\'\\'\\]:before{--tw-content: "";content:var(--tw-content)}.peer:focus-visible~.peer-focus-visible\\:shadow-focus{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer:disabled~.peer-disabled\\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\\:opacity-60{opacity:.6}.aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\\:opacity-40[aria-disabled=true]{opacity:.4}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}@keyframes dialog-out{0%{opacity:1;transform:translate(-50%,-50%) scale(1)}to{opacity:0;transform:translate(-50%,calc(-50% + 8px)) scale(.985)}}.data-\\[state\\=closed\\]\\:animate-dialog-out[data-state=closed]{animation:dialog-out var(--duration-out) var(--ease-out) forwards}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.data-\\[state\\=closed\\]\\:animate-fade-out[data-state=closed]{animation:fade-out var(--duration-out) var(--ease-out) forwards}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.97)}}.data-\\[state\\=closed\\]\\:animate-scale-out[data-state=closed]{animation:scale-out var(--duration-out) var(--ease-out) forwards}@keyframes sheet-out-left{0%{transform:translate(0)}to{transform:translate(-100%);opacity:.6}}.data-\\[state\\=closed\\]\\:animate-sheet-out-left[data-state=closed]{animation:sheet-out-left var(--duration-base) var(--ease-out) forwards}@keyframes sheet-out-right{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:.6}}.data-\\[state\\=closed\\]\\:animate-sheet-out-right[data-state=closed]{animation:sheet-out-right var(--duration-base) var(--ease-out) forwards}.data-\\[state\\=delayed-open\\]\\:animate-scale-in[data-state=delayed-open]{animation:scale-in var(--duration-base) var(--ease-out) forwards}@keyframes dialog-in{0%{opacity:0;transform:translate(-50%,calc(-50% + 12px)) scale(.985)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.data-\\[state\\=open\\]\\:animate-dialog-in[data-state=open]{animation:dialog-in var(--duration-base) var(--ease-out) forwards}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.data-\\[state\\=open\\]\\:animate-fade-in[data-state=open]{animation:fade-in var(--duration-base) var(--ease-out) forwards}@keyframes scale-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.data-\\[state\\=open\\]\\:animate-scale-in[data-state=open]{animation:scale-in var(--duration-base) var(--ease-out) forwards}@keyframes sheet-in-left{0%{transform:translate(-100%);opacity:.6}to{transform:translate(0);opacity:1}}.data-\\[state\\=open\\]\\:animate-sheet-in-left[data-state=open]{animation:sheet-in-left var(--duration-base) var(--ease-out) forwards}@keyframes sheet-in-right{0%{transform:translate(100%);opacity:.6}to{transform:translate(0)}}.data-\\[state\\=open\\]\\:animate-sheet-in-right[data-state=open]{animation:sheet-in-right var(--duration-base) var(--ease-out) forwards}.data-\\[range-end\\=true\\]\\:rounded-md[data-range-end=true]{border-radius:var(--radius-md)}.data-\\[range-middle\\=true\\]\\:rounded-none[data-range-middle=true]{border-radius:0}.data-\\[range-start\\=true\\]\\:rounded-md[data-range-start=true]{border-radius:var(--radius-md)}.data-\\[state\\=open\\]\\:border-line-focus[data-state=open]{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.data-\\[highlighted\\]\\:bg-surface-2[data-highlighted]{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.data-\\[range-end\\=true\\]\\:bg-brand[data-range-end=true]{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.data-\\[range-middle\\=true\\]\\:bg-transparent[data-range-middle=true]{background-color:transparent}.data-\\[range-start\\=true\\]\\:bg-brand[data-range-start=true],.data-\\[selected-single\\=true\\]\\:bg-brand[data-selected-single=true]{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.data-\\[state\\=selected\\]\\:bg-brand-subtle[data-state=selected]{background-color:var(--brand-subtle)}.data-\\[today\\=true\\]\\:font-semibold[data-today=true]{font-weight:600}.data-\\[highlighted\\]\\:text-text-primary[data-highlighted]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[placeholder\\]\\:text-text-tertiary[data-placeholder]{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.data-\\[range-end\\=true\\]\\:text-brand-fg[data-range-end=true]{color:var(--brand-fg)}.data-\\[range-middle\\=true\\]\\:text-text-primary[data-range-middle=true]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[range-start\\=true\\]\\:text-brand-fg[data-range-start=true],.data-\\[selected-single\\=true\\]\\:text-brand-fg[data-selected-single=true]{color:var(--brand-fg)}.data-\\[state\\=active\\]\\:text-text-primary[data-state=active],.data-\\[state\\=checked\\]\\:text-text-primary[data-state=checked]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[today\\=true\\]\\:text-brand[data-today=true]{--tw-text-opacity: 1;color:hsl(var(--brand-hsl) / var(--tw-text-opacity, 1))}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[state\\=open\\]\\:shadow-focus[data-state=open]{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\\[range-end\\=true\\]\\:hover\\:bg-brand-hover:hover[data-range-end=true],.data-\\[range-start\\=true\\]\\:hover\\:bg-brand-hover:hover[data-range-start=true],.data-\\[selected-single\\=true\\]\\:hover\\:bg-brand-hover:hover[data-selected-single=true]{background-color:var(--brand-hover)}.data-\\[range-end\\=true\\]\\:hover\\:text-brand-fg:hover[data-range-end=true],.data-\\[range-start\\=true\\]\\:hover\\:text-brand-fg:hover[data-range-start=true],.data-\\[selected-single\\=true\\]\\:hover\\:text-brand-fg:hover[data-selected-single=true]{color:var(--brand-fg)}@media(prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@media(min-width:640px){.sm\\:flex-row{flex-direction:row}.sm\\:items-start{align-items:flex-start}.sm\\:items-center{align-items:center}.sm\\:justify-end{justify-content:flex-end}.sm\\:justify-between{justify-content:space-between}.sm\\:gap-2\\.5{gap:10px}.sm\\:p-5{padding:20px}.sm\\:p-6{padding:24px}.sm\\:text-2xl{font-size:clamp(26px,24.78px + .327vw,30px);line-height:1.308}.sm\\:text-\\[2\\.1rem\\]{font-size:33.6px}}@media(min-width:768px){.md\\:flex{display:flex}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-\\[minmax\\(0\\,1fr\\)_minmax\\(260px\\,340px\\)\\]{grid-template-columns:minmax(0,1fr) minmax(260px,340px)}}.\\[\\&\\>\\*\\:not\\(summary\\)\\]\\:pl-4>*:not(summary){padding-left:16px}.\\[\\&\\>span\\]\\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\\[\\&\\>tr\\]\\:last\\:border-b-0:last-child>tr{border-bottom-width:0px}.\\[\\&\\[data-state\\=open\\]\\>span\\[data-chevron\\]\\]\\:rotate-180[data-state=open]>span[data-chevron]{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-danger [data-icon]{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-info [data-icon]{--tw-text-opacity: 1;color:hsl(var(--info) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-success [data-icon]{--tw-text-opacity: 1;color:hsl(var(--success) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-warning [data-icon]{--tw-text-opacity: 1;color:hsl(var(--warning) / var(--tw-text-opacity, 1))}.\\[\\&_tr\\]\\:border-b tr{border-bottom-width:1px}.\\[\\&_tr\\]\\:border-line-subtle tr{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}`;
39195
39888
  const sdkShadowCSS = ".issue-sticker-marker{pointer-events:auto}@keyframes highlight-pulse{0%,to{transform:scale(1);box-shadow:var(--shadow-md)}50%{transform:scale(1.3);box-shadow:var(--shadow-focus),var(--shadow-lg)}}.issue-sticker-marker.highlight-animation{animation:highlight-pulse .7s ease-in-out 3}";
39196
39889
  const contentPageCSS = `@layer issue-sticker-mode{html:has(>body.issue-sticker-mode-active),body.issue-sticker-mode-active,body.issue-sticker-mode-active *{cursor:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cpath d='M3 29 C3 22 3 20 3 15 a12 12 0 0 1 12-12 h2 a12 12 0 0 1 12 12 a12 12 0 0 1-12 12 H12 Z' fill='%231C221F' fill-opacity='0.35' stroke='%23ffffff' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E") 3 29,crosshair!important}body.issue-sticker-mode-active iframe{pointer-events:none!important}body.issue-sticker-mode-active .issue-sticker-mode-highlight{outline:2px solid hsl(160 64% 34%)!important;outline-offset:2px!important;background-color:#1f8e691f!important;transition:outline .1s ease,background-color .1s ease!important}}`;
39197
39890
  const PAGE_STYLE_ID = "issue-sticker-page-style";
@@ -39211,6 +39904,7 @@ function mountWidget(config) {
39211
39904
  return;
39212
39905
  }
39213
39906
  }
39907
+ captureIssueFocusIssueId();
39214
39908
  const existingHost = document.getElementById(ISSUE_STICKER_HOST_ELEMENT_ID);
39215
39909
  if (root && mountContainer && existingHost) {
39216
39910
  renderWidget(config);
@@ -39228,6 +39922,7 @@ function mountWidget(config) {
39228
39922
  const shadow = createShadowRoot(hostElement, [globalsCSS, sdkShadowCSS]);
39229
39923
  attachHostTypingGuard(shadow.shadowRoot);
39230
39924
  attachHostPointerGuard(shadow.shadowRoot);
39925
+ attachHostInteractionGuard(shadow.shadowRoot);
39231
39926
  mountContainer = shadow.mountContainer;
39232
39927
  mountContainer.style.width = "0";
39233
39928
  mountContainer.style.height = "0";