issue-sticker 0.9.0 → 0.10.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-CVp5Hz2L.js → externalUserPayload-DNGAp9bP.js} +4331 -3616
- package/dist/issue-sticker-headless-react.js +23 -17
- package/dist/issue-sticker-headless.js +7 -12
- package/dist/issue-sticker-react.js +696 -213
- package/dist/{three-B7nbYqGK.js → three-_bdgDAmI.js} +248 -794
- package/dist/{tooltip-BBukUPo_.js → tooltip-UijEbdDX.js} +1 -1
- package/package.json +1 -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,
|
|
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-_bdgDAmI.js";
|
|
19
|
+
import { A as trimLogBackupPayload, B as createSafeLogBackup, D as getLogBackupSessionId, N as NetworkCollector, C as ConsoleCollector, W as WebSocketCollector, E as createIndexedDbLogBackup, b as buildJiraCreateFields, P as Popover, F as PopoverTrigger, G as Input, H as PopoverContent, L as Label, J as Select, K as SelectTrigger, M as SelectValue, O as SelectContent, Q as SelectItem, R as 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, u as uploadScreenshotDataUrls, k as filterExcludeServiceRelatedLogs, l as filterExcludeServiceRelatedConsoleLogs, s as selectNetworkLogsForSubmit, m as compactNetworkLogsForTransport, n as CONSOLE_LOG_SUBMIT_LIMIT, g as getElementPosition, o as buildExternalUserPayload, v as serializeSocketTranscript, w as uploadSocketTranscript, q as shrinkNetworkLogsToFit, r as measureJsonBytes, i as buildIssueIntegrationsPayload, y as SessionReplayCaptureController, 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 findElementBySelector, as as findElementByXPath, S as ScreenRecordingController, h as composeIssueFilterGroups, at as OnboardingProvider, au as useOnboardingTarget, av as useOnboardingFlow, aw as PopoverAnchor } from "./externalUserPayload-DNGAp9bP.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-UijEbdDX.js";
|
|
26
26
|
function readReleaseMarker() {
|
|
27
27
|
try {
|
|
28
28
|
const g = globalThis.__ISSUE_STICKER_RELEASE__;
|
|
@@ -59,7 +59,7 @@ function bindLogBackup(options) {
|
|
|
59
59
|
async function flush() {
|
|
60
60
|
clearTimer();
|
|
61
61
|
if (stopped) return;
|
|
62
|
-
await store.save(sessionId, trimLogBackupPayload(snapshot()));
|
|
62
|
+
await store.save(sessionId, trimLogBackupPayload(snapshot(), options.budgetBytes));
|
|
63
63
|
}
|
|
64
64
|
function handlePageHiding() {
|
|
65
65
|
if (typeof document !== "undefined" && document.visibilityState === "visible") return;
|
|
@@ -152,21 +152,23 @@ function createCollectorSession(options = {}) {
|
|
|
152
152
|
const network = new NetworkCollector(options.apiBaseUrl ?? null, { onChange: scheduleBackup });
|
|
153
153
|
const consoleCollector = new ConsoleCollector({ onChange: scheduleBackup });
|
|
154
154
|
const socket = new WebSocketCollector(options.apiBaseUrl ?? null, { onChange: scheduleBackup });
|
|
155
|
-
|
|
155
|
+
network.bindSocketLogs(() => socket.getNetworkLogs());
|
|
156
156
|
const backup = bindLogBackup({
|
|
157
157
|
store,
|
|
158
158
|
sessionId,
|
|
159
159
|
snapshot: () => ({
|
|
160
|
-
network: network.
|
|
160
|
+
network: network.getBufferedLogs(),
|
|
161
161
|
console: consoleCollector.getLogs(),
|
|
162
162
|
socket: socket.getConnections()
|
|
163
163
|
}),
|
|
164
|
-
restoreInto:
|
|
165
|
-
|
|
166
|
-
consoleCollector.restore(payload.console);
|
|
167
|
-
socket.restore(payload.socket ?? []);
|
|
168
|
-
}
|
|
164
|
+
restoreInto: restore,
|
|
165
|
+
budgetBytes: options.backupBudgetBytes
|
|
169
166
|
});
|
|
167
|
+
function restore(payload) {
|
|
168
|
+
socket.restore(payload.socket ?? []);
|
|
169
|
+
network.restore(payload.network);
|
|
170
|
+
consoleCollector.restore(payload.console);
|
|
171
|
+
}
|
|
170
172
|
const performanceApi = options.performance ?? globalThis.performance;
|
|
171
173
|
let stopResourceObserver = null;
|
|
172
174
|
return {
|
|
@@ -190,6 +192,7 @@ function createCollectorSession(options = {}) {
|
|
|
190
192
|
await backup.restore();
|
|
191
193
|
void store.prune();
|
|
192
194
|
},
|
|
195
|
+
restore,
|
|
193
196
|
ensureInstrumented() {
|
|
194
197
|
network.ensurePatched();
|
|
195
198
|
socket.ensurePatched();
|
|
@@ -267,6 +270,79 @@ function createJiraFieldSearchConfig(source) {
|
|
|
267
270
|
return null;
|
|
268
271
|
};
|
|
269
272
|
}
|
|
273
|
+
function getDigitFromCode(code2) {
|
|
274
|
+
if (!code2) return null;
|
|
275
|
+
const match = code2.match(/^(Digit|Numpad)([1-9])$/);
|
|
276
|
+
return match ? parseInt(match[2], 10) : null;
|
|
277
|
+
}
|
|
278
|
+
function isModifierKeyCode(code2) {
|
|
279
|
+
if (!code2) return false;
|
|
280
|
+
return code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight";
|
|
281
|
+
}
|
|
282
|
+
function isAltKeyCode(code2) {
|
|
283
|
+
if (!code2) return false;
|
|
284
|
+
return code2 === "AltLeft" || code2 === "AltRight";
|
|
285
|
+
}
|
|
286
|
+
function isModifierPressed(event) {
|
|
287
|
+
const hasModifier = event.ctrlKey || event.metaKey;
|
|
288
|
+
const hasAlt = event.altKey;
|
|
289
|
+
return hasModifier && hasAlt;
|
|
290
|
+
}
|
|
291
|
+
function isIssueModeShortcut(event) {
|
|
292
|
+
if (event.isComposing === true) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
if (event.code) {
|
|
296
|
+
const digit = getDigitFromCode(event.code);
|
|
297
|
+
if (digit === 1 && !event.shiftKey) {
|
|
298
|
+
return isModifierPressed(event);
|
|
299
|
+
}
|
|
300
|
+
if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const isIssueModeKey = event.key === "1" && !event.shiftKey;
|
|
305
|
+
if (isIssueModeKey) {
|
|
306
|
+
return isModifierPressed(event);
|
|
307
|
+
}
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
function isRecordingShortcut(event) {
|
|
311
|
+
if (event.isComposing === true) {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
if (event.code) {
|
|
315
|
+
const digit = getDigitFromCode(event.code);
|
|
316
|
+
if (digit === 2 && !event.shiftKey) {
|
|
317
|
+
return isModifierPressed(event);
|
|
318
|
+
}
|
|
319
|
+
if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
const isRecordingKey = event.key === "2" && !event.shiftKey;
|
|
324
|
+
if (isRecordingKey) {
|
|
325
|
+
return isModifierPressed(event);
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
function isShortcutKey(event) {
|
|
330
|
+
return isIssueModeShortcut(event) || isRecordingShortcut(event);
|
|
331
|
+
}
|
|
332
|
+
function isShortcutReleaseKey(key, code2) {
|
|
333
|
+
if (code2) {
|
|
334
|
+
if (code2 === "Digit1" || code2 === "Numpad1") {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
if (code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight") {
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
if (code2 === "AltLeft" || code2 === "AltRight") {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return key === "1" || key === "Control" || key === "Meta" || key === "Alt";
|
|
345
|
+
}
|
|
270
346
|
const ISSUE_STICKER_HOST_ELEMENT_ID = "issue-sticker-host";
|
|
271
347
|
const ISSUE_STICKER_RUNTIME_OWNER_ATTRIBUTE = "data-issue-sticker-runtime";
|
|
272
348
|
const ISSUE_STICKER_EXTENSION_RUNTIME_READY_EVENT = "issue-sticker:extension-runtime-ready";
|
|
@@ -322,16 +398,43 @@ function isEditableTarget(target) {
|
|
|
322
398
|
if (!(target instanceof HTMLElement)) return false;
|
|
323
399
|
return target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable === true;
|
|
324
400
|
}
|
|
401
|
+
const HOST_KEY_GUARD_EVENTS = ["keydown", "keypress"];
|
|
402
|
+
const HOST_CLIPBOARD_GUARD_EVENTS = ["copy", "cut", "paste"];
|
|
325
403
|
function attachHostTypingGuard(shadowRoot) {
|
|
326
|
-
const
|
|
404
|
+
const handleKey = (event) => {
|
|
327
405
|
const keyboardEvent = event;
|
|
328
|
-
if (keyboardEvent.
|
|
329
|
-
|
|
330
|
-
|
|
406
|
+
if (keyboardEvent.key !== "Escape") {
|
|
407
|
+
if (isShortcutKey(keyboardEvent)) return;
|
|
408
|
+
if (!isEditableTarget(keyboardEvent.composedPath()[0])) return;
|
|
409
|
+
}
|
|
331
410
|
keyboardEvent.stopPropagation();
|
|
332
411
|
};
|
|
333
|
-
|
|
334
|
-
|
|
412
|
+
const stopLeakingToPage = (event) => {
|
|
413
|
+
event.stopPropagation();
|
|
414
|
+
};
|
|
415
|
+
HOST_KEY_GUARD_EVENTS.forEach((type) => {
|
|
416
|
+
shadowRoot.addEventListener(type, handleKey);
|
|
417
|
+
});
|
|
418
|
+
HOST_CLIPBOARD_GUARD_EVENTS.forEach((type) => {
|
|
419
|
+
shadowRoot.addEventListener(type, stopLeakingToPage);
|
|
420
|
+
});
|
|
421
|
+
return () => {
|
|
422
|
+
HOST_KEY_GUARD_EVENTS.forEach((type) => {
|
|
423
|
+
shadowRoot.removeEventListener(type, handleKey);
|
|
424
|
+
});
|
|
425
|
+
HOST_CLIPBOARD_GUARD_EVENTS.forEach((type) => {
|
|
426
|
+
shadowRoot.removeEventListener(type, stopLeakingToPage);
|
|
427
|
+
});
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
function listenEscapeKeydown(node2, handler) {
|
|
431
|
+
const handleKeyDown = (event) => {
|
|
432
|
+
if (event.key === "Escape") handler(event);
|
|
433
|
+
};
|
|
434
|
+
const root2 = node2 == null ? void 0 : node2.getRootNode();
|
|
435
|
+
const targets = root2 instanceof ShadowRoot ? [window, root2] : [window];
|
|
436
|
+
targets.forEach((target) => target.addEventListener("keydown", handleKeyDown));
|
|
437
|
+
return () => targets.forEach((target) => target.removeEventListener("keydown", handleKeyDown));
|
|
335
438
|
}
|
|
336
439
|
const HOST_POINTER_GUARD_EVENTS = [
|
|
337
440
|
"click",
|
|
@@ -949,7 +1052,7 @@ const TriangleAlert = createLucideIcon$1("TriangleAlert", [
|
|
|
949
1052
|
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
950
1053
|
]);
|
|
951
1054
|
const EMPTY_SELECT_VALUE$1 = "__ISSUE_STICKER_EMPTY__";
|
|
952
|
-
const JIRA_REQUIRED_FIELD_IDS = /* @__PURE__ */ new Set(["priority"]);
|
|
1055
|
+
const JIRA_REQUIRED_FIELD_IDS = /* @__PURE__ */ new Set(["priority", "issuetype"]);
|
|
953
1056
|
function JiraReadonlyField({ field }) {
|
|
954
1057
|
const displayValue = field.displayValue || "-";
|
|
955
1058
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
@@ -1006,6 +1109,7 @@ function JiraSelectFieldControl({ field, disabled, onUpdate }) {
|
|
|
1006
1109
|
{
|
|
1007
1110
|
value,
|
|
1008
1111
|
onValueChange: (nextValue) => {
|
|
1112
|
+
if (nextValue === "") return;
|
|
1009
1113
|
onUpdate(field.id, nextValue === EMPTY_SELECT_VALUE$1 ? null : nextValue);
|
|
1010
1114
|
},
|
|
1011
1115
|
disabled,
|
|
@@ -1101,6 +1205,19 @@ function JiraFieldList({
|
|
|
1101
1205
|
}) })
|
|
1102
1206
|
] });
|
|
1103
1207
|
}
|
|
1208
|
+
function buildIssueTypeView(issueTypes, issueTypeId) {
|
|
1209
|
+
const selected = issueTypes.find((type) => type.id === issueTypeId);
|
|
1210
|
+
return {
|
|
1211
|
+
id: JIRA_ISSUE_TYPE_VALUE_KEY,
|
|
1212
|
+
label: "이슈 타입",
|
|
1213
|
+
value: issueTypeId,
|
|
1214
|
+
displayValue: (selected == null ? void 0 : selected.name) ?? issueTypeId,
|
|
1215
|
+
editValue: issueTypeId,
|
|
1216
|
+
options: issueTypes.map((type) => ({ id: type.id, name: type.name })),
|
|
1217
|
+
editable: true,
|
|
1218
|
+
inputType: "select"
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1104
1221
|
function JiraFormFieldsSection({
|
|
1105
1222
|
exposedFields,
|
|
1106
1223
|
fieldDefinitions,
|
|
@@ -1108,19 +1225,30 @@ function JiraFormFieldsSection({
|
|
|
1108
1225
|
disabled = false,
|
|
1109
1226
|
title = "Jira 필드",
|
|
1110
1227
|
onFieldUpdate,
|
|
1111
|
-
getSearchConfig
|
|
1228
|
+
getSearchConfig,
|
|
1229
|
+
issueTypes = [],
|
|
1230
|
+
issueTypeId,
|
|
1231
|
+
onIssueTypeChange
|
|
1112
1232
|
}) {
|
|
1113
1233
|
const fields = buildJiraCreateFields(exposedFields, fieldDefinitions, values);
|
|
1114
|
-
|
|
1234
|
+
const showIssueType = issueTypes.length > 1 && Boolean(issueTypeId) && Boolean(onIssueTypeChange);
|
|
1235
|
+
const views = showIssueType ? [buildIssueTypeView(issueTypes, issueTypeId), ...fields] : fields;
|
|
1236
|
+
if (views.length === 0) {
|
|
1115
1237
|
return null;
|
|
1116
1238
|
}
|
|
1117
1239
|
return /* @__PURE__ */ jsx(
|
|
1118
1240
|
JiraFieldList,
|
|
1119
1241
|
{
|
|
1120
1242
|
title,
|
|
1121
|
-
fields,
|
|
1243
|
+
fields: views,
|
|
1122
1244
|
disabled,
|
|
1123
|
-
onFieldUpdate,
|
|
1245
|
+
onFieldUpdate: (fieldId, value) => {
|
|
1246
|
+
if (fieldId === JIRA_ISSUE_TYPE_VALUE_KEY) {
|
|
1247
|
+
if (typeof value === "string" && value) onIssueTypeChange == null ? void 0 : onIssueTypeChange(value);
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
onFieldUpdate(fieldId, value);
|
|
1251
|
+
},
|
|
1124
1252
|
getSearchConfig
|
|
1125
1253
|
}
|
|
1126
1254
|
);
|
|
@@ -1135,6 +1263,7 @@ function JiraIssueSection({
|
|
|
1135
1263
|
canSync = false,
|
|
1136
1264
|
title = "Jira 연동",
|
|
1137
1265
|
issueKeyLabel = "이슈 번호 (Jira)",
|
|
1266
|
+
issueTypeTitle = "이슈 타입",
|
|
1138
1267
|
syncTitle = "Jira에서 노출된 필드를 다시 가져옵니다",
|
|
1139
1268
|
syncIdleLabel = "Jira → 이슈스티커 동기화",
|
|
1140
1269
|
syncLoadingLabel = "동기화 중...",
|
|
@@ -1152,6 +1281,7 @@ function JiraIssueSection({
|
|
|
1152
1281
|
mapping.jira_field_definitions ?? [],
|
|
1153
1282
|
new Map(Object.entries(mapping.jira_field_display_labels ?? {}))
|
|
1154
1283
|
);
|
|
1284
|
+
const issueTypeLabel = getJiraIssueTypeLabel(mapping);
|
|
1155
1285
|
if (!meta || !integrationId) {
|
|
1156
1286
|
return null;
|
|
1157
1287
|
}
|
|
@@ -1188,7 +1318,11 @@ function JiraIssueSection({
|
|
|
1188
1318
|
children: jiraLinkLabel
|
|
1189
1319
|
}
|
|
1190
1320
|
) : null
|
|
1191
|
-
] })
|
|
1321
|
+
] }),
|
|
1322
|
+
issueTypeLabel ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1323
|
+
/* @__PURE__ */ jsx("h5", { className: "text-sm font-semibold text-text-primary", children: issueTypeTitle }),
|
|
1324
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-text-primary", children: issueTypeLabel })
|
|
1325
|
+
] }) : null
|
|
1192
1326
|
] }),
|
|
1193
1327
|
/* @__PURE__ */ jsx(
|
|
1194
1328
|
JiraFieldList,
|
|
@@ -4719,6 +4853,9 @@ function useSuspenseQuery(options, queryClient2) {
|
|
|
4719
4853
|
QueryObserver
|
|
4720
4854
|
);
|
|
4721
4855
|
}
|
|
4856
|
+
function queryOptions(options) {
|
|
4857
|
+
return options;
|
|
4858
|
+
}
|
|
4722
4859
|
function useMutation(options, queryClient2) {
|
|
4723
4860
|
const client = useQueryClient();
|
|
4724
4861
|
const [observer2] = React.useState(
|
|
@@ -5380,6 +5517,72 @@ function useNetworkLogs() {
|
|
|
5380
5517
|
networkLogs
|
|
5381
5518
|
};
|
|
5382
5519
|
}
|
|
5520
|
+
const ISSUE_FOCUS_PARAM = "issue-sticker-focus";
|
|
5521
|
+
const ISSUE_FOCUS_STORAGE_KEY = "issue-sticker:focus-issue-id";
|
|
5522
|
+
const ISSUE_FOCUS_TTL_MS = 5 * 60 * 1e3;
|
|
5523
|
+
function takeIssueFocusIssueId() {
|
|
5524
|
+
if (typeof window === "undefined") return null;
|
|
5525
|
+
const url = new URL(window.location.href);
|
|
5526
|
+
const issueId = url.searchParams.get(ISSUE_FOCUS_PARAM);
|
|
5527
|
+
if (!issueId) return null;
|
|
5528
|
+
url.searchParams.delete(ISSUE_FOCUS_PARAM);
|
|
5529
|
+
window.history.replaceState(window.history.state, "", `${url.pathname}${url.search}${url.hash}`);
|
|
5530
|
+
return issueId;
|
|
5531
|
+
}
|
|
5532
|
+
function currentAddressWithoutHash() {
|
|
5533
|
+
const url = new URL(window.location.href);
|
|
5534
|
+
url.hash = "";
|
|
5535
|
+
return url.toString();
|
|
5536
|
+
}
|
|
5537
|
+
function readStoredIssueFocus() {
|
|
5538
|
+
try {
|
|
5539
|
+
const raw = window.sessionStorage.getItem(ISSUE_FOCUS_STORAGE_KEY);
|
|
5540
|
+
if (!raw) return null;
|
|
5541
|
+
const parsed = JSON.parse(raw);
|
|
5542
|
+
if (typeof parsed.issueId !== "string" || typeof parsed.href !== "string" || typeof parsed.capturedAt !== "number") {
|
|
5543
|
+
return null;
|
|
5544
|
+
}
|
|
5545
|
+
return parsed;
|
|
5546
|
+
} catch {
|
|
5547
|
+
return null;
|
|
5548
|
+
}
|
|
5549
|
+
}
|
|
5550
|
+
function removeStoredIssueFocus() {
|
|
5551
|
+
try {
|
|
5552
|
+
window.sessionStorage.removeItem(ISSUE_FOCUS_STORAGE_KEY);
|
|
5553
|
+
} catch {
|
|
5554
|
+
}
|
|
5555
|
+
}
|
|
5556
|
+
let fallbackCapturedIssueId = null;
|
|
5557
|
+
function captureIssueFocusIssueId() {
|
|
5558
|
+
const issueId = takeIssueFocusIssueId();
|
|
5559
|
+
if (!issueId) return;
|
|
5560
|
+
try {
|
|
5561
|
+
const stored = {
|
|
5562
|
+
issueId,
|
|
5563
|
+
href: currentAddressWithoutHash(),
|
|
5564
|
+
capturedAt: Date.now()
|
|
5565
|
+
};
|
|
5566
|
+
window.sessionStorage.setItem(ISSUE_FOCUS_STORAGE_KEY, JSON.stringify(stored));
|
|
5567
|
+
} catch {
|
|
5568
|
+
fallbackCapturedIssueId = issueId;
|
|
5569
|
+
}
|
|
5570
|
+
}
|
|
5571
|
+
function peekIssueFocusIssueId() {
|
|
5572
|
+
const stored = readStoredIssueFocus();
|
|
5573
|
+
if (stored) {
|
|
5574
|
+
const sameAddress = stored.href === currentAddressWithoutHash();
|
|
5575
|
+
const fresh = Date.now() - stored.capturedAt < ISSUE_FOCUS_TTL_MS;
|
|
5576
|
+
if (sameAddress && fresh) return stored.issueId;
|
|
5577
|
+
removeStoredIssueFocus();
|
|
5578
|
+
return null;
|
|
5579
|
+
}
|
|
5580
|
+
return fallbackCapturedIssueId;
|
|
5581
|
+
}
|
|
5582
|
+
function clearIssueFocusIssueId() {
|
|
5583
|
+
removeStoredIssueFocus();
|
|
5584
|
+
fallbackCapturedIssueId = null;
|
|
5585
|
+
}
|
|
5383
5586
|
const injectCSS = (shadowRoot, cssText) => {
|
|
5384
5587
|
const style = document.createElement("style");
|
|
5385
5588
|
style.textContent = cssText;
|
|
@@ -5607,6 +5810,10 @@ const TOKEN_REFRESH_MARGIN_MS = 6e4;
|
|
|
5607
5810
|
const BRIDGE_TIMEOUT_MS = 15e3;
|
|
5608
5811
|
const SDK_HOST_ELEMENT_ID = "issue-sticker-host";
|
|
5609
5812
|
const SDK_SHADOW_ROOT_ID = "issue-sticker-shadow-root";
|
|
5813
|
+
function emitAuthEvent(event) {
|
|
5814
|
+
const manager = SDKManager.getInstance();
|
|
5815
|
+
if (manager.isInitialized()) manager.eventBus.emit(event);
|
|
5816
|
+
}
|
|
5610
5817
|
const AuthContext = createContext(null);
|
|
5611
5818
|
function buildBridgeUrl(bridgeUrl, params) {
|
|
5612
5819
|
const url = new URL(bridgeUrl);
|
|
@@ -5642,6 +5849,7 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5642
5849
|
const [authBridgeUrl, setAuthBridgeUrl] = useState(null);
|
|
5643
5850
|
const [showLoginFrame, setShowLoginFrame] = useState(false);
|
|
5644
5851
|
const stateRef = useRef(state);
|
|
5852
|
+
const isMemberRef = useRef(false);
|
|
5645
5853
|
const hiddenFrameRef = useRef(null);
|
|
5646
5854
|
const bridgeOriginRef = useRef(null);
|
|
5647
5855
|
const bridgeReadyRef = useRef(false);
|
|
@@ -5714,14 +5922,11 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5714
5922
|
};
|
|
5715
5923
|
}, [showLoginFrame]);
|
|
5716
5924
|
useEffect(() => {
|
|
5925
|
+
var _a;
|
|
5717
5926
|
if (!showLoginFrame) return;
|
|
5718
|
-
|
|
5719
|
-
|
|
5720
|
-
|
|
5721
|
-
}
|
|
5722
|
-
};
|
|
5723
|
-
window.addEventListener("keydown", handleKeyDown);
|
|
5724
|
-
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
5927
|
+
return listenEscapeKeydown((_a = document.getElementById(SDK_HOST_ELEMENT_ID)) == null ? void 0 : _a.shadowRoot, () => {
|
|
5928
|
+
closeLoginFrame();
|
|
5929
|
+
});
|
|
5725
5930
|
}, [closeLoginFrame, showLoginFrame]);
|
|
5726
5931
|
const getConfiguredUser = useCallback(() => {
|
|
5727
5932
|
try {
|
|
@@ -5761,6 +5966,10 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5761
5966
|
token: result.accessToken,
|
|
5762
5967
|
error: null
|
|
5763
5968
|
}));
|
|
5969
|
+
if (!isMemberRef.current) {
|
|
5970
|
+
isMemberRef.current = true;
|
|
5971
|
+
emitAuthEvent("auth:login");
|
|
5972
|
+
}
|
|
5764
5973
|
}, []);
|
|
5765
5974
|
const waitForBridgeReady = useCallback(async () => {
|
|
5766
5975
|
if (bridgeReadyRef.current) return;
|
|
@@ -5960,6 +6169,10 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5960
6169
|
await clearToken();
|
|
5961
6170
|
setShowLoginFrame(false);
|
|
5962
6171
|
setSdkMode("public");
|
|
6172
|
+
if (isMemberRef.current) {
|
|
6173
|
+
isMemberRef.current = false;
|
|
6174
|
+
emitAuthEvent("auth:logout");
|
|
6175
|
+
}
|
|
5963
6176
|
try {
|
|
5964
6177
|
(_b2 = (_a = hiddenFrameRef.current) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b2.postMessage(
|
|
5965
6178
|
{
|
|
@@ -14995,20 +15208,16 @@ function OverlayShell({
|
|
|
14995
15208
|
useOverlayFocus({ enabled: open, container: shell, initialFocus: "container" });
|
|
14996
15209
|
useEffect(() => {
|
|
14997
15210
|
if (!open) return;
|
|
14998
|
-
|
|
15211
|
+
return listenEscapeKeydown(shell, (e) => {
|
|
14999
15212
|
var _a;
|
|
15000
15213
|
if (e.defaultPrevented) {
|
|
15001
15214
|
return;
|
|
15002
15215
|
}
|
|
15003
|
-
|
|
15004
|
-
|
|
15005
|
-
|
|
15006
|
-
|
|
15007
|
-
|
|
15008
|
-
};
|
|
15009
|
-
window.addEventListener("keydown", handleKeyDown);
|
|
15010
|
-
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
15011
|
-
}, [open]);
|
|
15216
|
+
e.preventDefault();
|
|
15217
|
+
e.stopPropagation();
|
|
15218
|
+
(_a = onCloseRef.current) == null ? void 0 : _a.call(onCloseRef);
|
|
15219
|
+
});
|
|
15220
|
+
}, [open, shell]);
|
|
15012
15221
|
return /* @__PURE__ */ jsx(AnimatePresence, { onExitComplete, children: open ? /* @__PURE__ */ jsx(
|
|
15013
15222
|
motion.div,
|
|
15014
15223
|
{
|
|
@@ -15990,13 +16199,16 @@ class JiraService {
|
|
|
15990
16199
|
return result.url;
|
|
15991
16200
|
}
|
|
15992
16201
|
async loadIntegrationFields(integrationId) {
|
|
15993
|
-
var _a, _b2;
|
|
16202
|
+
var _a, _b2, _c2, _d2;
|
|
15994
16203
|
const response = await apiClient.getResponse(
|
|
15995
16204
|
`/api/jira/integration-fields/${encodeURIComponent(integrationId)}`
|
|
15996
16205
|
);
|
|
15997
16206
|
return {
|
|
15998
16207
|
fields: ((_a = response.data) == null ? void 0 : _a.fields) ?? [],
|
|
15999
|
-
exposedFields: normalizeExposedJiraFields((_b2 = response.data) == null ? void 0 : _b2.exposed_fields)
|
|
16208
|
+
exposedFields: normalizeExposedJiraFields((_b2 = response.data) == null ? void 0 : _b2.exposed_fields),
|
|
16209
|
+
// 옛 백엔드는 타입 정보를 주지 않는다. 비면 폼은 타입 셀렉트 없이 fields 로 동작한다.
|
|
16210
|
+
issueTypes: ((_c2 = response.data) == null ? void 0 : _c2.issue_types) ?? [],
|
|
16211
|
+
defaultIssueTypeId: ((_d2 = response.data) == null ? void 0 : _d2.default_issue_type_id) ?? null
|
|
16000
16212
|
};
|
|
16001
16213
|
}
|
|
16002
16214
|
async searchProjectUsers(projectId, query) {
|
|
@@ -17351,17 +17563,26 @@ function useJiraFieldSearchConfig(projectId) {
|
|
|
17351
17563
|
[projectId]
|
|
17352
17564
|
);
|
|
17353
17565
|
}
|
|
17354
|
-
function
|
|
17355
|
-
|
|
17566
|
+
function jiraIntegrationFieldsQueryOptions(integrationId) {
|
|
17567
|
+
return queryOptions({
|
|
17356
17568
|
queryKey: ["jiraIntegrationFields", integrationId],
|
|
17357
|
-
queryFn: () => jiraService.loadIntegrationFields(integrationId)
|
|
17569
|
+
queryFn: () => jiraService.loadIntegrationFields(integrationId),
|
|
17570
|
+
// admin 에서 바꾼 노출 필드·이슈 타입이 전역 기본값(5분) 동안 안 보이면 안 된다. 폼을 열
|
|
17571
|
+
// 때와 창에 포커스가 돌아올 때(admin 탭에서 돌아올 때) 다시 읽는다. 백엔드는 노출 필드를
|
|
17572
|
+
// DB 에서 읽고 Jira 필드 정의는 60초 캐시라 Jira 호출은 거의 늘지 않는다.
|
|
17573
|
+
staleTime: 0
|
|
17358
17574
|
});
|
|
17575
|
+
}
|
|
17576
|
+
function useJiraIntegrationFields(integrationId) {
|
|
17577
|
+
const { data } = useSuspenseQuery(jiraIntegrationFieldsQueryOptions(integrationId));
|
|
17359
17578
|
useEffect(() => {
|
|
17360
17579
|
jiraService.updateExposedFields(integrationId, data.exposedFields);
|
|
17361
17580
|
}, [data.exposedFields, integrationId]);
|
|
17362
17581
|
return {
|
|
17363
17582
|
fields: data.fields,
|
|
17364
|
-
exposedFields: data.exposedFields
|
|
17583
|
+
exposedFields: data.exposedFields,
|
|
17584
|
+
issueTypes: data.issueTypes,
|
|
17585
|
+
defaultIssueTypeId: data.defaultIssueTypeId
|
|
17365
17586
|
};
|
|
17366
17587
|
}
|
|
17367
17588
|
function IssueFormJiraFields({
|
|
@@ -17369,12 +17590,35 @@ function IssueFormJiraFields({
|
|
|
17369
17590
|
values,
|
|
17370
17591
|
disabled = false,
|
|
17371
17592
|
onChange,
|
|
17372
|
-
onDefaultsResolved
|
|
17593
|
+
onDefaultsResolved,
|
|
17594
|
+
onValuesReplace
|
|
17373
17595
|
}) {
|
|
17374
17596
|
const { getAuthInfo } = useAuthInfo();
|
|
17375
|
-
const { fields
|
|
17597
|
+
const { fields, exposedFields, issueTypes, defaultIssueTypeId } = useJiraIntegrationFields(integrationId);
|
|
17376
17598
|
const getSearchConfig = useJiraFieldSearchConfig(getAuthInfo().projectId);
|
|
17377
|
-
|
|
17599
|
+
const issueTypeId = resolveJiraIssueTypeId(
|
|
17600
|
+
issueTypes,
|
|
17601
|
+
values[JIRA_ISSUE_TYPE_VALUE_KEY],
|
|
17602
|
+
defaultIssueTypeId
|
|
17603
|
+
);
|
|
17604
|
+
const fieldDefinitions = pickJiraIssueTypeFields(fields, issueTypes, issueTypeId);
|
|
17605
|
+
useJiraFieldDefaults(
|
|
17606
|
+
`${integrationId}:${issueTypeId ?? ""}`,
|
|
17607
|
+
exposedFields,
|
|
17608
|
+
fieldDefinitions,
|
|
17609
|
+
onDefaultsResolved
|
|
17610
|
+
);
|
|
17611
|
+
const handleIssueTypeChange = (nextIssueTypeId) => {
|
|
17612
|
+
if (nextIssueTypeId === issueTypeId) return;
|
|
17613
|
+
onValuesReplace == null ? void 0 : onValuesReplace(
|
|
17614
|
+
(current) => switchJiraIssueType(current, {
|
|
17615
|
+
exposedFields,
|
|
17616
|
+
previousFields: fieldDefinitions,
|
|
17617
|
+
nextFields: pickJiraIssueTypeFields(fields, issueTypes, nextIssueTypeId),
|
|
17618
|
+
nextIssueTypeId
|
|
17619
|
+
})
|
|
17620
|
+
);
|
|
17621
|
+
};
|
|
17378
17622
|
return /* @__PURE__ */ jsx(
|
|
17379
17623
|
JiraFormFieldsSection,
|
|
17380
17624
|
{
|
|
@@ -17383,27 +17627,27 @@ function IssueFormJiraFields({
|
|
|
17383
17627
|
values,
|
|
17384
17628
|
disabled,
|
|
17385
17629
|
onFieldUpdate: onChange,
|
|
17386
|
-
getSearchConfig
|
|
17630
|
+
getSearchConfig,
|
|
17631
|
+
issueTypes,
|
|
17632
|
+
issueTypeId,
|
|
17633
|
+
onIssueTypeChange: handleIssueTypeChange
|
|
17387
17634
|
}
|
|
17388
17635
|
);
|
|
17389
17636
|
}
|
|
17390
|
-
function useJiraFieldDefaults(
|
|
17637
|
+
function useJiraFieldDefaults(applyKey, exposedFields, fieldDefinitions, onDefaultsResolved, ready = true) {
|
|
17391
17638
|
const appliedForRef = useRef(null);
|
|
17392
17639
|
useEffect(() => {
|
|
17393
17640
|
if (!onDefaultsResolved || !ready) return;
|
|
17394
|
-
if (appliedForRef.current ===
|
|
17395
|
-
appliedForRef.current =
|
|
17641
|
+
if (appliedForRef.current === applyKey) return;
|
|
17642
|
+
appliedForRef.current = applyKey;
|
|
17396
17643
|
onDefaultsResolved(getJiraFieldDefaultValues(exposedFields, fieldDefinitions));
|
|
17397
|
-
}, [
|
|
17644
|
+
}, [applyKey, exposedFields, fieldDefinitions, onDefaultsResolved, ready]);
|
|
17398
17645
|
}
|
|
17399
17646
|
function IssueFormJiraFieldDefaults({
|
|
17400
17647
|
integrationId,
|
|
17401
17648
|
onDefaultsResolved
|
|
17402
17649
|
}) {
|
|
17403
|
-
const { data } = useQuery(
|
|
17404
|
-
queryKey: ["jiraIntegrationFields", integrationId],
|
|
17405
|
-
queryFn: () => jiraService.loadIntegrationFields(integrationId)
|
|
17406
|
-
});
|
|
17650
|
+
const { data } = useQuery(jiraIntegrationFieldsQueryOptions(integrationId));
|
|
17407
17651
|
useEffect(() => {
|
|
17408
17652
|
if (!data) return;
|
|
17409
17653
|
jiraService.updateExposedFields(integrationId, data.exposedFields);
|
|
@@ -17772,7 +18016,8 @@ function IssueForm({
|
|
|
17772
18016
|
[fieldId]: value
|
|
17773
18017
|
}));
|
|
17774
18018
|
},
|
|
17775
|
-
onDefaultsResolved: (defaults) => setJiraFields((current) => ({ ...defaults, ...current }))
|
|
18019
|
+
onDefaultsResolved: (defaults) => setJiraFields((current) => ({ ...defaults, ...current })),
|
|
18020
|
+
onValuesReplace: setJiraFields
|
|
17776
18021
|
}
|
|
17777
18022
|
)
|
|
17778
18023
|
}
|
|
@@ -17890,7 +18135,7 @@ function getAdminIssueUrl(issueId) {
|
|
|
17890
18135
|
}
|
|
17891
18136
|
function BrowserInfo({ userAgent }) {
|
|
17892
18137
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
17893
|
-
/* @__PURE__ */ jsx("h4", { className: "mb-2 text-
|
|
18138
|
+
/* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-text-primary", children: "브라우저 정보" }),
|
|
17894
18139
|
/* @__PURE__ */ jsx("div", { className: "rounded-md bg-surface-2 p-2 font-mono text-xs leading-relaxed text-text-secondary break-all", children: userAgent })
|
|
17895
18140
|
] });
|
|
17896
18141
|
}
|
|
@@ -18453,16 +18698,17 @@ function ResizableSplitPane({
|
|
|
18453
18698
|
const minPercent = toPercent(minRatio);
|
|
18454
18699
|
const maxPercent = toPercent(maxRatio);
|
|
18455
18700
|
const currentPercent = toPercent(ratio);
|
|
18701
|
+
const hasEnd = end !== null && end !== void 0 && end !== false;
|
|
18456
18702
|
return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn$1("flex overflow-hidden", className), children: [
|
|
18457
18703
|
/* @__PURE__ */ jsx(
|
|
18458
18704
|
"div",
|
|
18459
18705
|
{
|
|
18460
18706
|
className: cn$1("flex min-w-0 flex-col overflow-hidden", startClassName),
|
|
18461
|
-
style: { width: formatRatioWidth(ratio) },
|
|
18707
|
+
style: { width: hasEnd ? formatRatioWidth(ratio) : "100%" },
|
|
18462
18708
|
children: start
|
|
18463
18709
|
}
|
|
18464
18710
|
),
|
|
18465
|
-
/* @__PURE__ */ jsx(
|
|
18711
|
+
hasEnd && /* @__PURE__ */ jsx(
|
|
18466
18712
|
"div",
|
|
18467
18713
|
{
|
|
18468
18714
|
role: "separator",
|
|
@@ -18481,7 +18727,7 @@ function ResizableSplitPane({
|
|
|
18481
18727
|
)
|
|
18482
18728
|
}
|
|
18483
18729
|
),
|
|
18484
|
-
/* @__PURE__ */ jsx("div", { className: cn$1("flex min-w-0 flex-1 flex-col overflow-hidden", endClassName), children: end })
|
|
18730
|
+
hasEnd && /* @__PURE__ */ jsx("div", { className: cn$1("flex min-w-0 flex-1 flex-col overflow-hidden", endClassName), children: end })
|
|
18485
18731
|
] });
|
|
18486
18732
|
}
|
|
18487
18733
|
function getPathname(url) {
|
|
@@ -18503,6 +18749,12 @@ function formatSocketCloseSummary(closeCode) {
|
|
|
18503
18749
|
function isAbnormalSocketClose(closeCode) {
|
|
18504
18750
|
return closeCode != null && closeCode !== 1e3;
|
|
18505
18751
|
}
|
|
18752
|
+
function formatBytes(bytes) {
|
|
18753
|
+
if (bytes == null || !Number.isFinite(bytes)) return "크기 알 수 없음";
|
|
18754
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
18755
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
18756
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
|
|
18757
|
+
}
|
|
18506
18758
|
function formatLogTime(timestamp) {
|
|
18507
18759
|
return new Date(timestamp).toLocaleTimeString("ko-KR", {
|
|
18508
18760
|
hour12: false,
|
|
@@ -18516,6 +18768,59 @@ function formatLogTimestamp(timestamp) {
|
|
|
18516
18768
|
const milliseconds = String(date.getMilliseconds()).padStart(3, "0");
|
|
18517
18769
|
return `${formatLogTime(timestamp)}.${milliseconds}`;
|
|
18518
18770
|
}
|
|
18771
|
+
function parseTruncatedJson(body) {
|
|
18772
|
+
const text2 = body.trimStart();
|
|
18773
|
+
const first = text2[0];
|
|
18774
|
+
if (first !== "{" && first !== "[") return void 0;
|
|
18775
|
+
for (const candidate of truncationCandidates(text2)) {
|
|
18776
|
+
const closed = closeOpenTokens(candidate);
|
|
18777
|
+
if (closed === null) continue;
|
|
18778
|
+
try {
|
|
18779
|
+
return JSON.parse(closed);
|
|
18780
|
+
} catch {
|
|
18781
|
+
}
|
|
18782
|
+
}
|
|
18783
|
+
return void 0;
|
|
18784
|
+
}
|
|
18785
|
+
function truncationCandidates(text2) {
|
|
18786
|
+
const { lastComma, lastOpen } = scanJson(text2);
|
|
18787
|
+
const candidates = [text2];
|
|
18788
|
+
if (lastComma > 0) candidates.push(text2.slice(0, lastComma));
|
|
18789
|
+
if (lastOpen >= 0) candidates.push(text2.slice(0, lastOpen + 1));
|
|
18790
|
+
return candidates;
|
|
18791
|
+
}
|
|
18792
|
+
function scanJson(text2) {
|
|
18793
|
+
const stack = [];
|
|
18794
|
+
let inString = false;
|
|
18795
|
+
let escaped = false;
|
|
18796
|
+
let lastComma = -1;
|
|
18797
|
+
for (let i = 0; i < text2.length; i += 1) {
|
|
18798
|
+
const char = text2[i];
|
|
18799
|
+
if (inString) {
|
|
18800
|
+
if (escaped) escaped = false;
|
|
18801
|
+
else if (char === "\\") escaped = true;
|
|
18802
|
+
else if (char === '"') inString = false;
|
|
18803
|
+
continue;
|
|
18804
|
+
}
|
|
18805
|
+
if (char === '"') inString = true;
|
|
18806
|
+
else if (char === "{") stack.push({ closer: "}", index: i });
|
|
18807
|
+
else if (char === "[") stack.push({ closer: "]", index: i });
|
|
18808
|
+
else if (char === "}" || char === "]") stack.pop();
|
|
18809
|
+
else if (char === "," && stack.length > 0) lastComma = i;
|
|
18810
|
+
}
|
|
18811
|
+
return {
|
|
18812
|
+
closers: stack.map((entry) => entry.closer).reverse(),
|
|
18813
|
+
inString,
|
|
18814
|
+
lastComma,
|
|
18815
|
+
lastOpen: stack.length > 0 ? stack[stack.length - 1].index : -1
|
|
18816
|
+
};
|
|
18817
|
+
}
|
|
18818
|
+
function closeOpenTokens(text2) {
|
|
18819
|
+
const { closers, inString } = scanJson(text2);
|
|
18820
|
+
if (inString) return null;
|
|
18821
|
+
if (closers.length === 0) return text2;
|
|
18822
|
+
return text2 + closers.join("");
|
|
18823
|
+
}
|
|
18519
18824
|
function parseLogBody(body) {
|
|
18520
18825
|
try {
|
|
18521
18826
|
return JSON.parse(body);
|
|
@@ -19536,13 +19841,13 @@ function ConsoleLogsSection({
|
|
|
19536
19841
|
logs.length,
|
|
19537
19842
|
")"
|
|
19538
19843
|
] }),
|
|
19539
|
-
|
|
19844
|
+
/* @__PURE__ */ jsx(
|
|
19540
19845
|
ResizableSplitPane,
|
|
19541
19846
|
{
|
|
19542
|
-
className: splitClassName ?? DEFAULT_SPLIT_CLASS_NAME$1,
|
|
19847
|
+
className: splitClassName ?? (selectedLog ? DEFAULT_SPLIT_CLASS_NAME$1 : DEFAULT_LIST_ONLY_CLASS_NAME$1),
|
|
19543
19848
|
separatorLabel: LOG_SPLIT_SEPARATOR_LABEL$1,
|
|
19544
19849
|
start: list2,
|
|
19545
|
-
end: /* @__PURE__ */ jsx(
|
|
19850
|
+
end: selectedLog ? /* @__PURE__ */ jsx(
|
|
19546
19851
|
ConsoleLogDetail,
|
|
19547
19852
|
{
|
|
19548
19853
|
log: selectedLog,
|
|
@@ -19550,9 +19855,9 @@ function ConsoleLogsSection({
|
|
|
19550
19855
|
onCopySuccess,
|
|
19551
19856
|
onCopyError
|
|
19552
19857
|
}
|
|
19553
|
-
)
|
|
19858
|
+
) : null
|
|
19554
19859
|
}
|
|
19555
|
-
)
|
|
19860
|
+
)
|
|
19556
19861
|
] });
|
|
19557
19862
|
}
|
|
19558
19863
|
return /* @__PURE__ */ jsx(Accordion, { type: "single", collapsible: true, children: /* @__PURE__ */ jsxs(AccordionItem, { value: "console-logs", children: [
|
|
@@ -34499,7 +34804,7 @@ function IssueDescription({
|
|
|
34499
34804
|
const isSaving = savingField === "description";
|
|
34500
34805
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
34501
34806
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
34502
|
-
/* @__PURE__ */ jsx("h4", { className: "text-
|
|
34807
|
+
/* @__PURE__ */ jsx("h4", { className: "text-sm font-semibold text-text-primary", children: "설명" }),
|
|
34503
34808
|
isEditing ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
34504
34809
|
/* @__PURE__ */ jsx(
|
|
34505
34810
|
Button,
|
|
@@ -35028,7 +35333,7 @@ function IssueScreenshot({ screenshot }) {
|
|
|
35028
35333
|
if (screenshotUrls.length === 0) return null;
|
|
35029
35334
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
35030
35335
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
35031
|
-
/* @__PURE__ */ jsx("h4", { className: "mb-2 text-
|
|
35336
|
+
/* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-text-primary", children: "스크린샷" }),
|
|
35032
35337
|
/* @__PURE__ */ jsx(
|
|
35033
35338
|
"img",
|
|
35034
35339
|
{
|
|
@@ -35071,7 +35376,7 @@ function IssueScreenshot({ screenshot }) {
|
|
|
35071
35376
|
}
|
|
35072
35377
|
function IssueVideo({ video, hideLabel }) {
|
|
35073
35378
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
35074
|
-
hideLabel ? null : /* @__PURE__ */ jsx("h4", { className: "mb-2 text-
|
|
35379
|
+
hideLabel ? null : /* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-text-primary", children: "영상" }),
|
|
35075
35380
|
/* @__PURE__ */ jsx(
|
|
35076
35381
|
"video",
|
|
35077
35382
|
{
|
|
@@ -35239,6 +35544,252 @@ function NotionIssueInfo({
|
|
|
35239
35544
|
}
|
|
35240
35545
|
);
|
|
35241
35546
|
}
|
|
35547
|
+
const MAX_HEARTBEAT_CHARS = 200;
|
|
35548
|
+
const RECORD_SEPARATOR = "";
|
|
35549
|
+
function parseJson(text2) {
|
|
35550
|
+
const first = text2[0];
|
|
35551
|
+
if (first !== "{" && first !== "[") return void 0;
|
|
35552
|
+
try {
|
|
35553
|
+
return JSON.parse(text2);
|
|
35554
|
+
} catch {
|
|
35555
|
+
return void 0;
|
|
35556
|
+
}
|
|
35557
|
+
}
|
|
35558
|
+
function asObject(text2) {
|
|
35559
|
+
const value = parseJson(text2);
|
|
35560
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
35561
|
+
}
|
|
35562
|
+
const PROTOCOLS = [
|
|
35563
|
+
{
|
|
35564
|
+
// Engine.IO(socket.io): `2` 핑, `3` 퐁, 업그레이드 `2probe`/`3probe`.
|
|
35565
|
+
// 확인되면 앱 메시지는 `42[...]` 로 오므로 한 글자 숫자는 핑·퐁이 맞다.
|
|
35566
|
+
name: "engine.io",
|
|
35567
|
+
matchesConnection: (connection) => /[?&]EIO=\d|\/(socket|engine)\.io\//i.test(connection.url ?? "") || connection.frames.some((frame2) => /^(0\{"sid"|40(\{|$))/.test(frame2.data ?? "")),
|
|
35568
|
+
isHeartbeat: (_frame, text2) => /^[23](probe)?$/.test(text2)
|
|
35569
|
+
},
|
|
35570
|
+
{
|
|
35571
|
+
// STOMP: 하트비트는 EOL 한 개다. 서브프로토콜이나 명령 프레임으로 확인한다.
|
|
35572
|
+
name: "stomp",
|
|
35573
|
+
matchesConnection: (connection) => /^v1[012]\.stomp$/i.test(connection.protocol ?? "") || connection.frames.some(
|
|
35574
|
+
(frame2) => /^(CONNECT|CONNECTED|SEND|MESSAGE|SUBSCRIBE|RECEIPT)\n/.test(frame2.data ?? "")
|
|
35575
|
+
),
|
|
35576
|
+
isHeartbeat: (_frame, text2) => text2 === "\n" || text2 === "\r\n"
|
|
35577
|
+
},
|
|
35578
|
+
{
|
|
35579
|
+
// MQTT: PINGREQ(`C0 00`)·PINGRESP(`D0 00`). 바이너리는 base64 로 저장된다.
|
|
35580
|
+
name: "mqtt",
|
|
35581
|
+
matchesConnection: (connection) => /^mqtt/i.test(connection.protocol ?? ""),
|
|
35582
|
+
isHeartbeat: (frame2, text2) => frame2.opcode === "binary" && (text2 === "wAA=" || text2 === "0AA=")
|
|
35583
|
+
},
|
|
35584
|
+
{
|
|
35585
|
+
// graphql-ws(ping·pong), subscriptions-transport-ws(ka), ActionCable(ping)
|
|
35586
|
+
name: "json-type",
|
|
35587
|
+
isHeartbeat: (_frame, text2) => {
|
|
35588
|
+
var _a;
|
|
35589
|
+
const type = (_a = asObject(text2)) == null ? void 0 : _a.type;
|
|
35590
|
+
return type === "ping" || type === "pong" || type === "ka";
|
|
35591
|
+
}
|
|
35592
|
+
},
|
|
35593
|
+
{
|
|
35594
|
+
// SignalR: `{"type":6}`. 숫자 6 만으로는 앱 메시지와 구분되지 않아 구분자를 함께 본다.
|
|
35595
|
+
name: "signalr",
|
|
35596
|
+
isHeartbeat: (_frame, text2) => {
|
|
35597
|
+
var _a;
|
|
35598
|
+
return text2.endsWith(RECORD_SEPARATOR) && ((_a = asObject(text2.slice(0, -1))) == null ? void 0 : _a.type) === 6;
|
|
35599
|
+
}
|
|
35600
|
+
},
|
|
35601
|
+
{
|
|
35602
|
+
// Phoenix·Supabase Realtime: v2 는 배열, v1 은 객체다. ref 는 매번 바뀐다.
|
|
35603
|
+
name: "phoenix",
|
|
35604
|
+
isHeartbeat: (_frame, text2) => {
|
|
35605
|
+
const value = parseJson(text2);
|
|
35606
|
+
if (Array.isArray(value)) return value[2] === "phoenix" && value[3] === "heartbeat";
|
|
35607
|
+
const message = value;
|
|
35608
|
+
return (message == null ? void 0 : message.topic) === "phoenix" && (message == null ? void 0 : message.event) === "heartbeat";
|
|
35609
|
+
}
|
|
35610
|
+
},
|
|
35611
|
+
{
|
|
35612
|
+
name: "pusher",
|
|
35613
|
+
isHeartbeat: (_frame, text2) => {
|
|
35614
|
+
var _a;
|
|
35615
|
+
const event = (_a = asObject(text2)) == null ? void 0 : _a.event;
|
|
35616
|
+
return event === "pusher:ping" || event === "pusher:pong";
|
|
35617
|
+
}
|
|
35618
|
+
}
|
|
35619
|
+
];
|
|
35620
|
+
function createHeartbeatTest(connection) {
|
|
35621
|
+
const active = PROTOCOLS.filter(
|
|
35622
|
+
(protocol) => !protocol.matchesConnection || protocol.matchesConnection(connection)
|
|
35623
|
+
);
|
|
35624
|
+
return (frame2) => {
|
|
35625
|
+
const text2 = frame2.data;
|
|
35626
|
+
if (text2 === void 0 || text2.length > MAX_HEARTBEAT_CHARS) return false;
|
|
35627
|
+
return active.some((protocol) => protocol.isHeartbeat(frame2, text2));
|
|
35628
|
+
};
|
|
35629
|
+
}
|
|
35630
|
+
async function fetchTranscript(url) {
|
|
35631
|
+
const response = await fetch(url);
|
|
35632
|
+
if (!response.ok) throw new Error(String(response.status));
|
|
35633
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
35634
|
+
const json = JSON.parse(new TextDecoder().decode(ungzip_1(bytes)));
|
|
35635
|
+
return Array.isArray(json.connections) ? json.connections : [];
|
|
35636
|
+
}
|
|
35637
|
+
function useSocketTranscript(url, options = {}) {
|
|
35638
|
+
return useQuery({
|
|
35639
|
+
queryKey: ["socketTranscript", (url == null ? void 0 : url.split("?")[0]) ?? null],
|
|
35640
|
+
queryFn: () => fetchTranscript(url),
|
|
35641
|
+
// fetch: false 는 이미 받아 둔 것만 본다. 탭 건수처럼 파일(최대 5MB)을 받을 이유가 없는 자리다.
|
|
35642
|
+
enabled: Boolean(url) && options.fetch !== false,
|
|
35643
|
+
staleTime: Infinity,
|
|
35644
|
+
retry: false
|
|
35645
|
+
});
|
|
35646
|
+
}
|
|
35647
|
+
const FRAME_PREVIEW_CHARS = 600;
|
|
35648
|
+
const PACKET_PREFIXED_JSON = /^(\d+)([[{][\s\S]*)$/;
|
|
35649
|
+
function parseFrameJson(frame2) {
|
|
35650
|
+
if (frame2.opcode !== "text" || frame2.data === void 0) return null;
|
|
35651
|
+
const match = PACKET_PREFIXED_JSON.exec(frame2.data);
|
|
35652
|
+
const [prefix, body] = match ? [match[1], match[2]] : ["", frame2.data];
|
|
35653
|
+
const first = body.trimStart()[0];
|
|
35654
|
+
if (first !== "{" && first !== "[") return null;
|
|
35655
|
+
try {
|
|
35656
|
+
return { prefix, json: JSON.parse(body), partial: false };
|
|
35657
|
+
} catch {
|
|
35658
|
+
if (!frame2.truncated) return null;
|
|
35659
|
+
const json = parseTruncatedJson(body);
|
|
35660
|
+
return json === void 0 ? null : { prefix, json, partial: true };
|
|
35661
|
+
}
|
|
35662
|
+
}
|
|
35663
|
+
function SocketFrameRow({ frame: frame2, openedAt }) {
|
|
35664
|
+
const [expanded, setExpanded] = useState(false);
|
|
35665
|
+
const text2 = frame2.data ?? "";
|
|
35666
|
+
const isText = frame2.opcode === "text";
|
|
35667
|
+
const parsed = useMemo(() => parseFrameJson(frame2), [frame2]);
|
|
35668
|
+
const collapsible = isText && !parsed && text2.length > FRAME_PREVIEW_CHARS;
|
|
35669
|
+
const shown = collapsible && !expanded ? `${text2.slice(0, FRAME_PREVIEW_CHARS)}…` : text2;
|
|
35670
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex gap-3 py-2 text-xs", children: [
|
|
35671
|
+
/* @__PURE__ */ jsxs("span", { className: "w-16 shrink-0 tabular-nums text-text-tertiary", children: [
|
|
35672
|
+
"+",
|
|
35673
|
+
((frame2.t - openedAt) / 1e3).toFixed(1),
|
|
35674
|
+
"s"
|
|
35675
|
+
] }),
|
|
35676
|
+
/* @__PURE__ */ jsx("span", { className: "w-6 shrink-0 text-text-secondary", children: frame2.dir === "send" ? "↑" : "↓" }),
|
|
35677
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
35678
|
+
parsed ? /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
|
|
35679
|
+
parsed.prefix && /* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-sm text-text-tertiary", children: parsed.prefix }),
|
|
35680
|
+
/* @__PURE__ */ jsx(
|
|
35681
|
+
JsonViewer,
|
|
35682
|
+
{
|
|
35683
|
+
data: parsed.json,
|
|
35684
|
+
defaultExpanded: text2.length <= FRAME_PREVIEW_CHARS,
|
|
35685
|
+
className: "min-w-0 flex-1"
|
|
35686
|
+
}
|
|
35687
|
+
)
|
|
35688
|
+
] }) : /* @__PURE__ */ jsx("p", { className: "break-all font-mono text-text-primary", children: isText ? shown : `바이너리 · ${formatBytes(frame2.size)}` }),
|
|
35689
|
+
(frame2.truncated || collapsible) && /* @__PURE__ */ jsxs("p", { className: "mt-1 flex gap-2 text-text-tertiary", children: [
|
|
35690
|
+
frame2.truncated && /* @__PURE__ */ jsxs("span", { children: [
|
|
35691
|
+
"전체 ",
|
|
35692
|
+
formatBytes(frame2.size),
|
|
35693
|
+
" 중 앞부분만 저장했습니다",
|
|
35694
|
+
(parsed == null ? void 0 : parsed.partial) && " · 끊긴 마지막 항목은 빼고 보여줍니다"
|
|
35695
|
+
] }),
|
|
35696
|
+
collapsible && /* @__PURE__ */ jsx(
|
|
35697
|
+
"button",
|
|
35698
|
+
{
|
|
35699
|
+
type: "button",
|
|
35700
|
+
className: "text-text-secondary underline-offset-2 hover:underline",
|
|
35701
|
+
onClick: () => setExpanded((value) => !value),
|
|
35702
|
+
children: expanded ? "접기" : "펼치기"
|
|
35703
|
+
}
|
|
35704
|
+
)
|
|
35705
|
+
] })
|
|
35706
|
+
] })
|
|
35707
|
+
] });
|
|
35708
|
+
}
|
|
35709
|
+
const ROW_PAGE_SIZE = 300;
|
|
35710
|
+
function toFrameRows(frames, isHeartbeat) {
|
|
35711
|
+
const rows = [];
|
|
35712
|
+
let run = [];
|
|
35713
|
+
const flush = (end) => {
|
|
35714
|
+
const start = end - run.length;
|
|
35715
|
+
if (run.length > 1) rows.push({ kind: "heartbeats", frames: run, index: start });
|
|
35716
|
+
else if (run.length === 1) rows.push({ kind: "frame", frame: run[0], index: start });
|
|
35717
|
+
run = [];
|
|
35718
|
+
};
|
|
35719
|
+
frames.forEach((frame2, index2) => {
|
|
35720
|
+
if (isHeartbeat(frame2)) {
|
|
35721
|
+
run.push(frame2);
|
|
35722
|
+
return;
|
|
35723
|
+
}
|
|
35724
|
+
flush(index2);
|
|
35725
|
+
rows.push({ kind: "frame", frame: frame2, index: index2 });
|
|
35726
|
+
});
|
|
35727
|
+
flush(frames.length);
|
|
35728
|
+
return rows;
|
|
35729
|
+
}
|
|
35730
|
+
function HeartbeatRow({ frames, openedAt }) {
|
|
35731
|
+
const [expanded, setExpanded] = useState(false);
|
|
35732
|
+
const at = (frame2) => `+${((frame2.t - openedAt) / 1e3).toFixed(1)}s`;
|
|
35733
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
35734
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 py-2 text-xs text-text-tertiary", children: [
|
|
35735
|
+
/* @__PURE__ */ jsx("span", { className: "w-16 shrink-0 tabular-nums", children: at(frames[0]) }),
|
|
35736
|
+
/* @__PURE__ */ jsx("span", { className: "w-6 shrink-0", children: "↕" }),
|
|
35737
|
+
/* @__PURE__ */ jsxs("p", { className: "flex min-w-0 flex-1 gap-2", children: [
|
|
35738
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
35739
|
+
"하트비트 ",
|
|
35740
|
+
frames.length,
|
|
35741
|
+
"건 · ",
|
|
35742
|
+
at(frames[0]),
|
|
35743
|
+
" ~ ",
|
|
35744
|
+
at(frames[frames.length - 1])
|
|
35745
|
+
] }),
|
|
35746
|
+
/* @__PURE__ */ jsx(
|
|
35747
|
+
"button",
|
|
35748
|
+
{
|
|
35749
|
+
type: "button",
|
|
35750
|
+
className: "text-text-secondary underline-offset-2 hover:underline",
|
|
35751
|
+
onClick: () => setExpanded((value) => !value),
|
|
35752
|
+
children: expanded ? "접기" : "펼치기"
|
|
35753
|
+
}
|
|
35754
|
+
)
|
|
35755
|
+
] })
|
|
35756
|
+
] }),
|
|
35757
|
+
expanded && frames.map((frame2, index2) => /* @__PURE__ */ jsx(SocketFrameRow, { frame: frame2, openedAt }, index2))
|
|
35758
|
+
] });
|
|
35759
|
+
}
|
|
35760
|
+
function SocketFrames({ connection }) {
|
|
35761
|
+
const [shownCount, setShownCount] = useState(ROW_PAGE_SIZE);
|
|
35762
|
+
const rows = useMemo(
|
|
35763
|
+
() => toFrameRows(connection.frames, createHeartbeatTest(connection)),
|
|
35764
|
+
[connection]
|
|
35765
|
+
);
|
|
35766
|
+
const hiddenCount = Math.max(0, rows.length - shownCount);
|
|
35767
|
+
const shownRows = hiddenCount > 0 ? rows.slice(hiddenCount) : rows;
|
|
35768
|
+
return /* @__PURE__ */ jsxs("div", { className: "divide-y divide-line-subtle", children: [
|
|
35769
|
+
connection.adopted && /* @__PURE__ */ jsx("p", { className: "py-2 text-xs text-text-tertiary", children: "이슈스티커가 기록을 시작하기 전에 열린 연결입니다. 기록을 시작한 뒤의 프레임만 있습니다." }),
|
|
35770
|
+
connection.droppedFrames > 0 && /* @__PURE__ */ jsxs("p", { className: "py-2 text-xs text-text-tertiary", children: [
|
|
35771
|
+
"이전 프레임 ",
|
|
35772
|
+
connection.droppedFrames,
|
|
35773
|
+
"건은 보관 상한을 넘어 저장하지 않았습니다."
|
|
35774
|
+
] }),
|
|
35775
|
+
hiddenCount > 0 && /* @__PURE__ */ jsxs(
|
|
35776
|
+
"button",
|
|
35777
|
+
{
|
|
35778
|
+
type: "button",
|
|
35779
|
+
className: "w-full py-2 text-xs text-text-secondary underline-offset-2 hover:underline",
|
|
35780
|
+
onClick: () => setShownCount((count) => count + ROW_PAGE_SIZE),
|
|
35781
|
+
children: [
|
|
35782
|
+
"이전 항목 ",
|
|
35783
|
+
Math.min(hiddenCount, ROW_PAGE_SIZE),
|
|
35784
|
+
"건 더 보기"
|
|
35785
|
+
]
|
|
35786
|
+
}
|
|
35787
|
+
),
|
|
35788
|
+
shownRows.map(
|
|
35789
|
+
(row) => row.kind === "heartbeats" ? /* @__PURE__ */ jsx(HeartbeatRow, { frames: row.frames, openedAt: connection.openedAt }, row.index) : /* @__PURE__ */ jsx(SocketFrameRow, { frame: row.frame, openedAt: connection.openedAt }, row.index)
|
|
35790
|
+
)
|
|
35791
|
+
] });
|
|
35792
|
+
}
|
|
35242
35793
|
const NO_TRANSCRIPT_MESSAGE = "이 연결의 전사가 없습니다.";
|
|
35243
35794
|
const LOADING_MESSAGE = "프레임을 불러오는 중입니다.";
|
|
35244
35795
|
const ERROR_MESSAGE = "프레임을 불러오지 못했습니다.";
|
|
@@ -35246,64 +35797,27 @@ function SocketFrameList({
|
|
|
35246
35797
|
connectionId,
|
|
35247
35798
|
transcriptUrl
|
|
35248
35799
|
}) {
|
|
35249
|
-
const [state, setState] = useState({ status: "idle" });
|
|
35250
|
-
useEffect(() => {
|
|
35251
|
-
if (!transcriptUrl) return;
|
|
35252
|
-
let cancelled = false;
|
|
35253
|
-
setState({ status: "loading" });
|
|
35254
|
-
void (async () => {
|
|
35255
|
-
try {
|
|
35256
|
-
const response = await fetch(transcriptUrl);
|
|
35257
|
-
if (!response.ok) throw new Error(String(response.status));
|
|
35258
|
-
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
35259
|
-
const json = JSON.parse(new TextDecoder().decode(ungzip_1(bytes)));
|
|
35260
|
-
if (cancelled) return;
|
|
35261
|
-
setState({
|
|
35262
|
-
status: "ready",
|
|
35263
|
-
connection: json.connections.find((c2) => c2.id === connectionId) ?? null
|
|
35264
|
-
});
|
|
35265
|
-
} catch {
|
|
35266
|
-
if (!cancelled) {
|
|
35267
|
-
setState({ status: "error", message: ERROR_MESSAGE });
|
|
35268
|
-
}
|
|
35269
|
-
}
|
|
35270
|
-
})();
|
|
35271
|
-
return () => {
|
|
35272
|
-
cancelled = true;
|
|
35273
|
-
};
|
|
35274
|
-
}, [connectionId, transcriptUrl]);
|
|
35275
35800
|
if (!transcriptUrl) {
|
|
35276
35801
|
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-text-tertiary", children: NO_TRANSCRIPT_MESSAGE });
|
|
35277
35802
|
}
|
|
35278
|
-
|
|
35803
|
+
return /* @__PURE__ */ jsx(LoadedSocketFrameList, { connectionId, transcriptUrl });
|
|
35804
|
+
}
|
|
35805
|
+
function LoadedSocketFrameList({
|
|
35806
|
+
connectionId,
|
|
35807
|
+
transcriptUrl
|
|
35808
|
+
}) {
|
|
35809
|
+
const transcript = useSocketTranscript(transcriptUrl);
|
|
35810
|
+
if (transcript.isPending) {
|
|
35279
35811
|
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-text-tertiary", children: LOADING_MESSAGE });
|
|
35280
35812
|
}
|
|
35281
|
-
if (
|
|
35282
|
-
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-danger", children:
|
|
35813
|
+
if (transcript.isError) {
|
|
35814
|
+
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-danger", children: ERROR_MESSAGE });
|
|
35283
35815
|
}
|
|
35284
|
-
|
|
35816
|
+
const connection = [...transcript.data].reverse().find((c2) => c2.id === connectionId);
|
|
35817
|
+
if (!connection) {
|
|
35285
35818
|
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-text-tertiary", children: NO_TRANSCRIPT_MESSAGE });
|
|
35286
35819
|
}
|
|
35287
|
-
|
|
35288
|
-
return /* @__PURE__ */ jsxs("div", { className: "divide-y divide-line-subtle", children: [
|
|
35289
|
-
connection.droppedFrames > 0 && /* @__PURE__ */ jsxs("p", { className: "py-2 text-xs text-text-tertiary", children: [
|
|
35290
|
-
"이전 프레임 ",
|
|
35291
|
-
connection.droppedFrames,
|
|
35292
|
-
"건은 보관 상한을 넘어 저장하지 않았습니다."
|
|
35293
|
-
] }),
|
|
35294
|
-
connection.frames.map((frame2, index2) => /* @__PURE__ */ jsxs("div", { className: "flex gap-3 py-2 text-xs", children: [
|
|
35295
|
-
/* @__PURE__ */ jsxs("span", { className: "w-16 shrink-0 tabular-nums text-text-tertiary", children: [
|
|
35296
|
-
"+",
|
|
35297
|
-
((frame2.t - connection.openedAt) / 1e3).toFixed(1),
|
|
35298
|
-
"s"
|
|
35299
|
-
] }),
|
|
35300
|
-
/* @__PURE__ */ jsx("span", { className: "w-6 shrink-0 text-text-secondary", children: frame2.dir === "send" ? "↑" : "↓" }),
|
|
35301
|
-
/* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1 break-all font-mono text-text-primary", children: [
|
|
35302
|
-
frame2.opcode === "binary" ? `바이너리 · ${frame2.size}B` : frame2.data,
|
|
35303
|
-
frame2.truncated && /* @__PURE__ */ jsx("span", { className: "ml-1 text-text-tertiary", children: "(잘림)" })
|
|
35304
|
-
] })
|
|
35305
|
-
] }, index2))
|
|
35306
|
-
] });
|
|
35820
|
+
return /* @__PURE__ */ jsx(SocketFrames, { connection });
|
|
35307
35821
|
}
|
|
35308
35822
|
function getHeaderValue(headers, headerName) {
|
|
35309
35823
|
if (!headers) return void 0;
|
|
@@ -35348,12 +35862,6 @@ function resolveResponseImageSrc(log, body) {
|
|
|
35348
35862
|
const legacyBase64 = binaryStringToBase64(body);
|
|
35349
35863
|
return legacyBase64 ? `data:${mimeType};base64,${legacyBase64}` : null;
|
|
35350
35864
|
}
|
|
35351
|
-
function formatBytes(bytes) {
|
|
35352
|
-
if (bytes == null || !Number.isFinite(bytes)) return "크기 알 수 없음";
|
|
35353
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
35354
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
35355
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
|
|
35356
|
-
}
|
|
35357
35865
|
function getBodyOmission(log, bodyType) {
|
|
35358
35866
|
if (!log) return null;
|
|
35359
35867
|
if (bodyType === "request" && log.requestBodyOmittedReason) {
|
|
@@ -35871,13 +36379,13 @@ function NetworkLogsSection({
|
|
|
35871
36379
|
logs.length,
|
|
35872
36380
|
")"
|
|
35873
36381
|
] }),
|
|
35874
|
-
|
|
36382
|
+
/* @__PURE__ */ jsx(
|
|
35875
36383
|
ResizableSplitPane,
|
|
35876
36384
|
{
|
|
35877
|
-
className: splitClassName ?? DEFAULT_SPLIT_CLASS_NAME,
|
|
36385
|
+
className: splitClassName ?? (selectedLog ? DEFAULT_SPLIT_CLASS_NAME : DEFAULT_LIST_ONLY_CLASS_NAME),
|
|
35878
36386
|
separatorLabel: LOG_SPLIT_SEPARATOR_LABEL,
|
|
35879
36387
|
start: list2,
|
|
35880
|
-
end: /* @__PURE__ */ jsx(
|
|
36388
|
+
end: selectedLog ? /* @__PURE__ */ jsx(
|
|
35881
36389
|
NetworkLogDetail,
|
|
35882
36390
|
{
|
|
35883
36391
|
log: selectedLog,
|
|
@@ -35886,9 +36394,9 @@ function NetworkLogsSection({
|
|
|
35886
36394
|
onCopySuccess,
|
|
35887
36395
|
onCopyError
|
|
35888
36396
|
}
|
|
35889
|
-
)
|
|
36397
|
+
) : null
|
|
35890
36398
|
}
|
|
35891
|
-
)
|
|
36399
|
+
)
|
|
35892
36400
|
] });
|
|
35893
36401
|
}
|
|
35894
36402
|
return /* @__PURE__ */ jsx(Accordion, { type: "single", collapsible: true, children: /* @__PURE__ */ jsxs(AccordionItem, { value: "network-logs", children: [
|
|
@@ -36962,6 +37470,29 @@ function IssueStickersContainer({
|
|
|
36962
37470
|
}
|
|
36963
37471
|
);
|
|
36964
37472
|
}
|
|
37473
|
+
function useIssueFocusFromUrl(issues, onFocus) {
|
|
37474
|
+
const [pendingIssueId, setPendingIssueId] = useState(null);
|
|
37475
|
+
useEffect(() => {
|
|
37476
|
+
const issueId = peekIssueFocusIssueId() ?? takeIssueFocusIssueId();
|
|
37477
|
+
if (issueId) setPendingIssueId(issueId);
|
|
37478
|
+
}, []);
|
|
37479
|
+
useEffect(() => {
|
|
37480
|
+
const handlePopState = () => {
|
|
37481
|
+
const issueId = takeIssueFocusIssueId();
|
|
37482
|
+
if (issueId) setPendingIssueId(issueId);
|
|
37483
|
+
};
|
|
37484
|
+
window.addEventListener("popstate", handlePopState);
|
|
37485
|
+
return () => window.removeEventListener("popstate", handlePopState);
|
|
37486
|
+
}, []);
|
|
37487
|
+
useEffect(() => {
|
|
37488
|
+
if (!pendingIssueId) return;
|
|
37489
|
+
const issue = issues.find((candidate) => candidate.id === pendingIssueId);
|
|
37490
|
+
if (!issue) return;
|
|
37491
|
+
setPendingIssueId(null);
|
|
37492
|
+
onFocus(issue);
|
|
37493
|
+
clearIssueFocusIssueId();
|
|
37494
|
+
}, [issues, pendingIssueId, onFocus]);
|
|
37495
|
+
}
|
|
36965
37496
|
function useDomainRestriction(currentUrl) {
|
|
36966
37497
|
const refresh = useCallback(() => {
|
|
36967
37498
|
}, []);
|
|
@@ -36999,15 +37530,29 @@ function normalizeComparableUrl(url) {
|
|
|
36999
37530
|
return null;
|
|
37000
37531
|
}
|
|
37001
37532
|
}
|
|
37002
|
-
function highlightIssue(issueId) {
|
|
37003
|
-
|
|
37533
|
+
function highlightIssue(issueId, position2) {
|
|
37534
|
+
var _a;
|
|
37535
|
+
const searchRoot = ((_a = getIssueStickerRuntimeHost()) == null ? void 0 : _a.shadowRoot) ?? document;
|
|
37536
|
+
const sticker = searchRoot.querySelector(`[data-issue-id="${issueId}"]`);
|
|
37004
37537
|
if (sticker) {
|
|
37005
37538
|
sticker.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
37006
37539
|
sticker.classList.add("highlight-animation");
|
|
37007
37540
|
setTimeout(() => {
|
|
37008
37541
|
sticker.classList.remove("highlight-animation");
|
|
37009
37542
|
}, 2e3);
|
|
37543
|
+
return;
|
|
37544
|
+
}
|
|
37545
|
+
scrollToIssuePosition(position2);
|
|
37546
|
+
}
|
|
37547
|
+
function scrollToIssuePosition(position2) {
|
|
37548
|
+
if (!position2 || !Number.isFinite(position2.x) || !Number.isFinite(position2.y)) {
|
|
37549
|
+
return;
|
|
37010
37550
|
}
|
|
37551
|
+
window.scrollTo({
|
|
37552
|
+
left: Math.max(0, position2.x - window.innerWidth / 2),
|
|
37553
|
+
top: Math.max(0, position2.y - window.innerHeight / 2),
|
|
37554
|
+
behavior: "smooth"
|
|
37555
|
+
});
|
|
37011
37556
|
}
|
|
37012
37557
|
function useExtensionEnabled() {
|
|
37013
37558
|
const [isEnabled] = useState(true);
|
|
@@ -37053,80 +37598,11 @@ function useIssueMode() {
|
|
|
37053
37598
|
}
|
|
37054
37599
|
const RECORDING_BLOCKED_BY_ISSUE_MODE = "이슈 생성 모드에서는 녹화를 시작할 수 없습니다. 이슈 생성을 종료한 뒤 다시 시도하세요.";
|
|
37055
37600
|
const ISSUE_MODE_BLOCKED_BY_RECORDING = "녹화 중에는 이슈 생성 모드를 시작할 수 없습니다. 녹화를 중지한 뒤 다시 시도하세요.";
|
|
37056
|
-
function getDigitFromCode(code2) {
|
|
37057
|
-
if (!code2) return null;
|
|
37058
|
-
const match = code2.match(/^(Digit|Numpad)([1-9])$/);
|
|
37059
|
-
return match ? parseInt(match[2], 10) : null;
|
|
37060
|
-
}
|
|
37061
|
-
function isModifierKeyCode(code2) {
|
|
37062
|
-
if (!code2) return false;
|
|
37063
|
-
return code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight";
|
|
37064
|
-
}
|
|
37065
|
-
function isAltKeyCode(code2) {
|
|
37066
|
-
if (!code2) return false;
|
|
37067
|
-
return code2 === "AltLeft" || code2 === "AltRight";
|
|
37068
|
-
}
|
|
37069
|
-
function isModifierPressed(event) {
|
|
37070
|
-
const hasModifier = event.ctrlKey || event.metaKey;
|
|
37071
|
-
const hasAlt = event.altKey;
|
|
37072
|
-
return hasModifier && hasAlt;
|
|
37073
|
-
}
|
|
37074
|
-
function isIssueModeShortcut(event) {
|
|
37075
|
-
if (event.isComposing === true) {
|
|
37076
|
-
return false;
|
|
37077
|
-
}
|
|
37078
|
-
if (event.code) {
|
|
37079
|
-
const digit = getDigitFromCode(event.code);
|
|
37080
|
-
if (digit === 1 && !event.shiftKey) {
|
|
37081
|
-
return isModifierPressed(event);
|
|
37082
|
-
}
|
|
37083
|
-
if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
|
|
37084
|
-
return false;
|
|
37085
|
-
}
|
|
37086
|
-
}
|
|
37087
|
-
const isIssueModeKey = event.key === "1" && !event.shiftKey;
|
|
37088
|
-
if (isIssueModeKey) {
|
|
37089
|
-
return isModifierPressed(event);
|
|
37090
|
-
}
|
|
37091
|
-
return false;
|
|
37092
|
-
}
|
|
37093
|
-
function isRecordingShortcut(event) {
|
|
37094
|
-
if (event.isComposing === true) {
|
|
37095
|
-
return false;
|
|
37096
|
-
}
|
|
37097
|
-
if (event.code) {
|
|
37098
|
-
const digit = getDigitFromCode(event.code);
|
|
37099
|
-
if (digit === 2 && !event.shiftKey) {
|
|
37100
|
-
return isModifierPressed(event);
|
|
37101
|
-
}
|
|
37102
|
-
if (isModifierKeyCode(event.code) || isAltKeyCode(event.code)) {
|
|
37103
|
-
return false;
|
|
37104
|
-
}
|
|
37105
|
-
}
|
|
37106
|
-
const isRecordingKey = event.key === "2" && !event.shiftKey;
|
|
37107
|
-
if (isRecordingKey) {
|
|
37108
|
-
return isModifierPressed(event);
|
|
37109
|
-
}
|
|
37110
|
-
return false;
|
|
37111
|
-
}
|
|
37112
|
-
function isShortcutReleaseKey(key, code2) {
|
|
37113
|
-
if (code2) {
|
|
37114
|
-
if (code2 === "Digit1" || code2 === "Numpad1") {
|
|
37115
|
-
return true;
|
|
37116
|
-
}
|
|
37117
|
-
if (code2 === "ControlLeft" || code2 === "ControlRight" || code2 === "MetaLeft" || code2 === "MetaRight") {
|
|
37118
|
-
return true;
|
|
37119
|
-
}
|
|
37120
|
-
if (code2 === "AltLeft" || code2 === "AltRight") {
|
|
37121
|
-
return true;
|
|
37122
|
-
}
|
|
37123
|
-
}
|
|
37124
|
-
return key === "1" || key === "Control" || key === "Meta" || key === "Alt";
|
|
37125
|
-
}
|
|
37126
37601
|
function useKeyboardShortcuts(isCreatingIssueRef, onToggleIssueMode, onToggleRecording, isIssueFormOpen = false, isRecordingRef) {
|
|
37127
37602
|
const keysPressedRef = useRef(/* @__PURE__ */ new Set());
|
|
37128
37603
|
const isProcessingRecordingRef = useRef(false);
|
|
37129
37604
|
useEffect(() => {
|
|
37605
|
+
var _a;
|
|
37130
37606
|
const handleKeyDown = (e) => {
|
|
37131
37607
|
if (e.isComposing === true) {
|
|
37132
37608
|
return;
|
|
@@ -37179,23 +37655,25 @@ function useKeyboardShortcuts(isCreatingIssueRef, onToggleIssueMode, onToggleRec
|
|
|
37179
37655
|
});
|
|
37180
37656
|
return;
|
|
37181
37657
|
}
|
|
37182
|
-
if (e.key === "Escape" || e.code === "Escape") {
|
|
37183
|
-
if (isCreatingIssueRef.current) {
|
|
37184
|
-
e.preventDefault();
|
|
37185
|
-
e.stopPropagation();
|
|
37186
|
-
void onToggleIssueMode(false);
|
|
37187
|
-
}
|
|
37188
|
-
return;
|
|
37189
|
-
}
|
|
37190
37658
|
};
|
|
37191
37659
|
const handleKeyUp = (e) => {
|
|
37192
37660
|
if (isShortcutReleaseKey(e.key, e.code)) {
|
|
37193
37661
|
keysPressedRef.current.delete("Ctrl/Cmd+Alt+1");
|
|
37194
37662
|
}
|
|
37195
37663
|
};
|
|
37664
|
+
const stopListeningEscape = listenEscapeKeydown(
|
|
37665
|
+
(_a = getIssueStickerRuntimeHost()) == null ? void 0 : _a.shadowRoot,
|
|
37666
|
+
(e) => {
|
|
37667
|
+
if (e.isComposing === true || !isCreatingIssueRef.current) return;
|
|
37668
|
+
e.preventDefault();
|
|
37669
|
+
e.stopPropagation();
|
|
37670
|
+
void onToggleIssueMode(false);
|
|
37671
|
+
}
|
|
37672
|
+
);
|
|
37196
37673
|
window.addEventListener("keydown", handleKeyDown);
|
|
37197
37674
|
window.addEventListener("keyup", handleKeyUp);
|
|
37198
37675
|
return () => {
|
|
37676
|
+
stopListeningEscape();
|
|
37199
37677
|
window.removeEventListener("keydown", handleKeyDown);
|
|
37200
37678
|
window.removeEventListener("keyup", handleKeyUp);
|
|
37201
37679
|
};
|
|
@@ -37337,6 +37815,10 @@ function useContentAppState() {
|
|
|
37337
37815
|
useCallback((issueId) => {
|
|
37338
37816
|
highlightIssue(issueId);
|
|
37339
37817
|
}, []);
|
|
37818
|
+
const handleFocusIssueFromUrl = useCallback((issue) => {
|
|
37819
|
+
highlightIssue(issue.id, issue.position);
|
|
37820
|
+
}, []);
|
|
37821
|
+
useIssueFocusFromUrl(filteredIssues, handleFocusIssueFromUrl);
|
|
37340
37822
|
useCallback(() => {
|
|
37341
37823
|
devLogger.log("ContentScript", "handleIssueCreatedOrUpdated 호출, 이슈 목록 재조회 시작");
|
|
37342
37824
|
void loadIssues();
|
|
@@ -38925,7 +39407,7 @@ function AuthGate() {
|
|
|
38925
39407
|
) })
|
|
38926
39408
|
] });
|
|
38927
39409
|
}
|
|
38928
|
-
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-1{margin-left:4px}.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))}`;
|
|
39410
|
+
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-\\[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))}`;
|
|
38929
39411
|
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}";
|
|
38930
39412
|
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}}`;
|
|
38931
39413
|
const PAGE_STYLE_ID = "issue-sticker-page-style";
|
|
@@ -38945,6 +39427,7 @@ function mountWidget(config) {
|
|
|
38945
39427
|
return;
|
|
38946
39428
|
}
|
|
38947
39429
|
}
|
|
39430
|
+
captureIssueFocusIssueId();
|
|
38948
39431
|
const existingHost = document.getElementById(ISSUE_STICKER_HOST_ELEMENT_ID);
|
|
38949
39432
|
if (root && mountContainer && existingHost) {
|
|
38950
39433
|
renderWidget(config);
|