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.
- package/CHANGELOG.md +34 -0
- package/README.md +0 -1
- package/dist/{externalUserPayload-CVYSPfcx.js → externalUserPayload-BbOEmKZD.js} +1320 -61
- package/dist/issue-sticker-headless-react.js +3 -3
- package/dist/issue-sticker-headless.js +2 -2
- package/dist/issue-sticker-react.js +923 -228
- package/dist/{three-_bdgDAmI.js → three-DQdLNs7v.js} +2 -2
- package/dist/{tooltip-UijEbdDX.js → tooltip-DSCAsWIp.js} +1 -1
- package/headless.d.ts +22 -0
- package/package.json +2 -1
|
@@ -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-
|
|
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
|
|
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-
|
|
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
|
|
480
|
+
const handleKey = (event) => {
|
|
330
481
|
const keyboardEvent = event;
|
|
331
|
-
if (keyboardEvent.
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
337
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5722
|
-
|
|
5723
|
-
|
|
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
|
-
|
|
15314
|
+
return listenEscapeKeydown(shell, (e) => {
|
|
15002
15315
|
var _a;
|
|
15003
15316
|
if (e.defaultPrevented) {
|
|
15004
15317
|
return;
|
|
15005
15318
|
}
|
|
15006
|
-
|
|
15007
|
-
|
|
15008
|
-
|
|
15009
|
-
|
|
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
|
|
17358
|
-
|
|
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
|
|
17703
|
+
const { fields, exposedFields, issueTypes, defaultIssueTypeId } = useJiraIntegrationFields(integrationId);
|
|
17379
17704
|
const getSearchConfig = useJiraFieldSearchConfig(getAuthInfo().projectId);
|
|
17380
|
-
|
|
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(
|
|
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 ===
|
|
17398
|
-
appliedForRef.current =
|
|
17747
|
+
if (appliedForRef.current === applyKey) return;
|
|
17748
|
+
appliedForRef.current = applyKey;
|
|
17399
17749
|
onDefaultsResolved(getJiraFieldDefaultValues(exposedFields, fieldDefinitions));
|
|
17400
|
-
}, [
|
|
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-
|
|
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 [
|
|
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(
|
|
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(
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
36346
|
-
|
|
36347
|
-
|
|
36348
|
-
|
|
36349
|
-
|
|
36350
|
-
|
|
36351
|
-
|
|
36352
|
-
|
|
36353
|
-
|
|
36354
|
-
|
|
36355
|
-
|
|
36356
|
-
|
|
36357
|
-
|
|
36358
|
-
|
|
36359
|
-
|
|
36360
|
-
|
|
36361
|
-
|
|
36362
|
-
|
|
36363
|
-
|
|
36364
|
-
|
|
36365
|
-
|
|
36366
|
-
|
|
36367
|
-
|
|
36368
|
-
|
|
36369
|
-
|
|
36370
|
-
|
|
36371
|
-
|
|
36372
|
-
|
|
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
|
-
|
|
36376
|
-
|
|
36377
|
-
|
|
36378
|
-
|
|
36379
|
-
}
|
|
36380
|
-
|
|
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
|
|
36398
|
-
|
|
36399
|
-
const
|
|
36400
|
-
|
|
36401
|
-
|
|
36402
|
-
|
|
36403
|
-
|
|
36404
|
-
|
|
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
|
-
|
|
36407
|
-
|
|
36408
|
-
|
|
36409
|
-
|
|
36410
|
-
|
|
36411
|
-
|
|
36412
|
-
|
|
36413
|
-
|
|
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
|
-
|
|
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
|
-
|
|
36418
|
-
|
|
36419
|
-
|
|
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
|
|
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
|
|
36509
|
-
|
|
36510
|
-
|
|
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
|
-
|
|
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(
|
|
36994
|
-
|
|
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, {
|
|
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
|
-
|
|
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";
|