issue-sticker 0.8.1 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/README.md +33 -0
- package/dist/{externalUserPayload-D-P1-QaW.js → externalUserPayload-CVYSPfcx.js} +1778 -737
- package/dist/issue-sticker-headless-react.js +175 -33
- package/dist/issue-sticker-headless.js +38 -10
- package/dist/issue-sticker-react.js +732 -133
- package/dist/{mouse-pointer-2-BR00y3ir.js → three-_bdgDAmI.js} +325 -28
- package/dist/{tooltip-DH02R32-.js → tooltip-UijEbdDX.js} +1 -1
- package/headless-react.d.ts +26 -0
- package/headless.d.ts +28 -0
- package/package.json +6 -2
- package/react.d.ts +28 -0
|
@@ -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 {
|
|
18
|
+
import { O as OVERLAY_LAYER_INDEX, c as createLucideIcon$1, d as usePortalContainer, a as cn$1, e as OVERLAY_LAYER, s as stopEscapePropagation, P as Presence, f as Primitive, g as composeEventHandlers, h as useDismissableLayerSurface, i as useComposedRefs$1, j as Portal$1, k as createContextScope, l as createSlot, D as DismissableLayer, m as useControllableState, n as useId$1, o as useLayoutEffect2, p as useCallbackRef, u as ungzip_1, q as PortalContainerProvider, r as registerThree } from "./three-_bdgDAmI.js";
|
|
19
|
+
import { A as trimLogBackupPayload, B as createSafeLogBackup, D as getLogBackupSessionId, N as NetworkCollector, C as ConsoleCollector, W as WebSocketCollector, E as createIndexedDbLogBackup, b as buildJiraCreateFields, P as Popover, F as PopoverTrigger, G as Input, H as PopoverContent, L as Label, J as Select, K as SelectTrigger, M as SelectValue, O as SelectContent, Q as SelectItem, R as getJiraMetadata, T as buildJiraIssueFields, U as Button, V as Root2$2, X as Trigger$2, Y as ChevronDown, Z as Portal, _ as Content2$1, $ as Check, a0 as X$1, a1 as DatePicker, e as buildNotionCreateFields, a2 as getNotionPageMetadata, a3 as buildNotionFieldViews, c as captureWithModernScreenshot, p as pristineFetch, d as directUploadToSignedUrl, a4 as DirectUploadError, a5 as toast, a6 as getSnapshot, a7 as subscribe$1, a as uploadSignedMediaWithApi, t as sanitizeString, a8 as getRegisteredUploadId, f as buildGuestOwnerQuery, j as devLogger, x as getCurrentPageUrl, a9 as ChevronRight, aa as ReactRemoveScroll, ab as hideOthers, ac as useFocusGuards, ad as FocusScope, ae as getExposedJiraFields, af as isJiraFieldExposed, ag as normalizeExposedJiraFields, z as preloadModernScreenshot, u as uploadScreenshotDataUrls, k as filterExcludeServiceRelatedLogs, l as filterExcludeServiceRelatedConsoleLogs, s as selectNetworkLogsForSubmit, m as compactNetworkLogsForTransport, n as CONSOLE_LOG_SUBMIT_LIMIT, g as getElementPosition, o as buildExternalUserPayload, v as serializeSocketTranscript, w as uploadSocketTranscript, q as shrinkNetworkLogsToFit, r as measureJsonBytes, i as buildIssueIntegrationsPayload, y as SessionReplayCaptureController, ah as getPrimaryJiraMapping, ai as createCollection, aj as useDirection, ak as getPrimaryNotionMapping, al as buttonVariants, am as findElementBySelector, an as findElementByXPath, S as ScreenRecordingController, h as composeIssueFilterGroups, ao as OnboardingProvider, ap as useOnboardingTarget, aq as useOnboardingFlow, ar as PopoverAnchor } from "./externalUserPayload-CVYSPfcx.js";
|
|
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;
|
|
@@ -151,24 +151,35 @@ function createCollectorSession(options = {}) {
|
|
|
151
151
|
};
|
|
152
152
|
const network = new NetworkCollector(options.apiBaseUrl ?? null, { onChange: scheduleBackup });
|
|
153
153
|
const consoleCollector = new ConsoleCollector({ onChange: scheduleBackup });
|
|
154
|
+
const socket = new WebSocketCollector(options.apiBaseUrl ?? null, { onChange: scheduleBackup });
|
|
155
|
+
network.bindSocketLogs(() => socket.getNetworkLogs());
|
|
154
156
|
const backup = bindLogBackup({
|
|
155
157
|
store,
|
|
156
158
|
sessionId,
|
|
157
|
-
snapshot: () => ({
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
159
|
+
snapshot: () => ({
|
|
160
|
+
network: network.getBufferedLogs(),
|
|
161
|
+
console: consoleCollector.getLogs(),
|
|
162
|
+
socket: socket.getConnections()
|
|
163
|
+
}),
|
|
164
|
+
restoreInto: restore,
|
|
165
|
+
budgetBytes: options.backupBudgetBytes
|
|
162
166
|
});
|
|
167
|
+
function restore(payload) {
|
|
168
|
+
socket.restore(payload.socket ?? []);
|
|
169
|
+
network.restore(payload.network);
|
|
170
|
+
consoleCollector.restore(payload.console);
|
|
171
|
+
}
|
|
163
172
|
const performanceApi = options.performance ?? globalThis.performance;
|
|
164
173
|
let stopResourceObserver = null;
|
|
165
174
|
return {
|
|
166
175
|
network,
|
|
167
176
|
console: consoleCollector,
|
|
177
|
+
socket,
|
|
168
178
|
backup,
|
|
169
179
|
async start() {
|
|
170
180
|
var _a, _b2;
|
|
171
181
|
network.start();
|
|
182
|
+
socket.start();
|
|
172
183
|
consoleCollector.start();
|
|
173
184
|
const navigationEntry = (_b2 = (_a = performanceApi == null ? void 0 : performanceApi.getEntriesByType) == null ? void 0 : _a.call(performanceApi, "navigation")) == null ? void 0 : _b2[0];
|
|
174
185
|
const navigationLog = createNavigationLog(navigationEntry, (performanceApi == null ? void 0 : performanceApi.timeOrigin) ?? 0);
|
|
@@ -181,13 +192,16 @@ function createCollectorSession(options = {}) {
|
|
|
181
192
|
await backup.restore();
|
|
182
193
|
void store.prune();
|
|
183
194
|
},
|
|
195
|
+
restore,
|
|
184
196
|
ensureInstrumented() {
|
|
185
197
|
network.ensurePatched();
|
|
198
|
+
socket.ensurePatched();
|
|
186
199
|
},
|
|
187
200
|
stop() {
|
|
188
201
|
stopResourceObserver == null ? void 0 : stopResourceObserver();
|
|
189
202
|
stopResourceObserver = null;
|
|
190
203
|
network.stop();
|
|
204
|
+
socket.stop();
|
|
191
205
|
consoleCollector.stop();
|
|
192
206
|
backup.stop();
|
|
193
207
|
}
|
|
@@ -322,6 +336,30 @@ function attachHostTypingGuard(shadowRoot) {
|
|
|
322
336
|
shadowRoot.addEventListener("keydown", handleKeyDown);
|
|
323
337
|
return () => shadowRoot.removeEventListener("keydown", handleKeyDown);
|
|
324
338
|
}
|
|
339
|
+
const HOST_POINTER_GUARD_EVENTS = [
|
|
340
|
+
"click",
|
|
341
|
+
"dblclick",
|
|
342
|
+
"auxclick",
|
|
343
|
+
"contextmenu",
|
|
344
|
+
"pointerdown",
|
|
345
|
+
"mousedown",
|
|
346
|
+
"mouseup",
|
|
347
|
+
"touchstart",
|
|
348
|
+
"touchend"
|
|
349
|
+
];
|
|
350
|
+
function attachHostPointerGuard(shadowRoot) {
|
|
351
|
+
const stopLeakingToPage = (event) => {
|
|
352
|
+
event.stopPropagation();
|
|
353
|
+
};
|
|
354
|
+
HOST_POINTER_GUARD_EVENTS.forEach((type) => {
|
|
355
|
+
shadowRoot.addEventListener(type, stopLeakingToPage);
|
|
356
|
+
});
|
|
357
|
+
return () => {
|
|
358
|
+
HOST_POINTER_GUARD_EVENTS.forEach((type) => {
|
|
359
|
+
shadowRoot.removeEventListener(type, stopLeakingToPage);
|
|
360
|
+
});
|
|
361
|
+
};
|
|
362
|
+
}
|
|
325
363
|
const RUNTIME_OWNER_MARKER_KEY = "__issueStickerRuntimeOwner";
|
|
326
364
|
function markerHost() {
|
|
327
365
|
return typeof window === "undefined" ? null : window;
|
|
@@ -819,6 +857,25 @@ const RefreshCw = createLucideIcon$1("RefreshCw", [
|
|
|
819
857
|
["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
|
|
820
858
|
["path", { d: "M8 16H3v5", key: "1cv678" }]
|
|
821
859
|
]);
|
|
860
|
+
/**
|
|
861
|
+
* @license lucide-react v0.468.0 - ISC
|
|
862
|
+
*
|
|
863
|
+
* This source code is licensed under the ISC license.
|
|
864
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
865
|
+
*/
|
|
866
|
+
const Ruler = createLucideIcon$1("Ruler", [
|
|
867
|
+
[
|
|
868
|
+
"path",
|
|
869
|
+
{
|
|
870
|
+
d: "M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z",
|
|
871
|
+
key: "icamh8"
|
|
872
|
+
}
|
|
873
|
+
],
|
|
874
|
+
["path", { d: "m14.5 12.5 2-2", key: "inckbg" }],
|
|
875
|
+
["path", { d: "m11.5 9.5 2-2", key: "fmmyf7" }],
|
|
876
|
+
["path", { d: "m8.5 6.5 2-2", key: "vc6u1g" }],
|
|
877
|
+
["path", { d: "m17.5 15.5 2-2", key: "wo5hmg" }]
|
|
878
|
+
]);
|
|
822
879
|
/**
|
|
823
880
|
* @license lucide-react v0.468.0 - ISC
|
|
824
881
|
*
|
|
@@ -4972,8 +5029,8 @@ function removePendingSdkEventListener(event, callback) {
|
|
|
4972
5029
|
}
|
|
4973
5030
|
}
|
|
4974
5031
|
function flushPendingSdkEventListeners(eventBus) {
|
|
4975
|
-
pendingListeners.forEach((
|
|
4976
|
-
|
|
5032
|
+
pendingListeners.forEach((listeners2, event) => {
|
|
5033
|
+
listeners2.forEach((callback) => eventBus.on(event, callback));
|
|
4977
5034
|
});
|
|
4978
5035
|
pendingListeners.clear();
|
|
4979
5036
|
}
|
|
@@ -5768,9 +5825,9 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5768
5825
|
);
|
|
5769
5826
|
const getValidMemberToken = useCallback(
|
|
5770
5827
|
async (options) => {
|
|
5771
|
-
const
|
|
5772
|
-
if (!(options == null ? void 0 : options.forceRefresh) &&
|
|
5773
|
-
return
|
|
5828
|
+
const cached2 = tokenRef.current;
|
|
5829
|
+
if (!(options == null ? void 0 : options.forceRefresh) && cached2 && cached2.expiresAtMs - Date.now() > TOKEN_REFRESH_MARGIN_MS) {
|
|
5830
|
+
return cached2.accessToken;
|
|
5774
5831
|
}
|
|
5775
5832
|
if (!pendingMemberTokenRef.current) {
|
|
5776
5833
|
pendingMemberTokenRef.current = (async () => {
|
|
@@ -12203,7 +12260,7 @@ function checkNodeWasScrollRoot(node2) {
|
|
|
12203
12260
|
return node2 !== node2.root && ((_a = node2.scroll) == null ? void 0 : _a.wasRoot);
|
|
12204
12261
|
}
|
|
12205
12262
|
const DocumentProjectionNode = createProjectionNode$1({
|
|
12206
|
-
attachResizeListener: (ref,
|
|
12263
|
+
attachResizeListener: (ref, notify2) => addDomEvent(ref, "resize", notify2),
|
|
12207
12264
|
measureScroll: () => {
|
|
12208
12265
|
var _a, _b2;
|
|
12209
12266
|
return {
|
|
@@ -14315,7 +14372,7 @@ const ToastItem = forwardRef(function ToastItem2({ t, behindCount, onDismiss },
|
|
|
14315
14372
|
);
|
|
14316
14373
|
});
|
|
14317
14374
|
function ToastContainer({ position: position2 = "top-right" }) {
|
|
14318
|
-
const toasts = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
14375
|
+
const toasts = useSyncExternalStore(subscribe$1, getSnapshot, getSnapshot);
|
|
14319
14376
|
const portalContainer = usePortalContainer();
|
|
14320
14377
|
const positionClass = {
|
|
14321
14378
|
"top-right": "top-4 right-4 items-end",
|
|
@@ -16345,19 +16402,19 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
16345
16402
|
e.preventDefault();
|
|
16346
16403
|
e.stopImmediatePropagation();
|
|
16347
16404
|
};
|
|
16348
|
-
|
|
16405
|
+
window.addEventListener("click", handleDocumentClick, {
|
|
16349
16406
|
capture: true,
|
|
16350
16407
|
passive: false
|
|
16351
16408
|
});
|
|
16352
16409
|
BLOCKED_PAGE_EVENTS.forEach((type) => {
|
|
16353
|
-
|
|
16410
|
+
window.addEventListener(type, blockPageEvent, { capture: true, passive: false });
|
|
16354
16411
|
});
|
|
16355
16412
|
return () => {
|
|
16356
|
-
|
|
16413
|
+
window.removeEventListener("click", handleDocumentClick, {
|
|
16357
16414
|
capture: true
|
|
16358
16415
|
});
|
|
16359
16416
|
BLOCKED_PAGE_EVENTS.forEach((type) => {
|
|
16360
|
-
|
|
16417
|
+
window.removeEventListener(type, blockPageEvent, {
|
|
16361
16418
|
capture: true
|
|
16362
16419
|
});
|
|
16363
16420
|
});
|
|
@@ -16562,6 +16619,22 @@ function useIssueSubmission({
|
|
|
16562
16619
|
);
|
|
16563
16620
|
}
|
|
16564
16621
|
}
|
|
16622
|
+
try {
|
|
16623
|
+
const socketSnapshot = await serializeSocketTranscript(
|
|
16624
|
+
getCollectorSession().socket.getConnections()
|
|
16625
|
+
);
|
|
16626
|
+
if (socketSnapshot) {
|
|
16627
|
+
const uploaded = await uploadSocketTranscript(
|
|
16628
|
+
{ post: (endpoint, body) => apiClient.post(endpoint, body), directUpload },
|
|
16629
|
+
socketSnapshot
|
|
16630
|
+
);
|
|
16631
|
+
if (uploaded) {
|
|
16632
|
+
issueData.socket_log_upload_id = uploaded.uploadId;
|
|
16633
|
+
}
|
|
16634
|
+
}
|
|
16635
|
+
} catch (socketError) {
|
|
16636
|
+
devLogger.error("useIssueSubmission", "소켓 전사 첨부 실패 (이슈 생성 계속):", socketError);
|
|
16637
|
+
}
|
|
16565
16638
|
const { networkLogs: fittedNetworkLogs, stillOverBudget } = shrinkNetworkLogsToFit(
|
|
16566
16639
|
issueData.network_logs ?? [],
|
|
16567
16640
|
measureJsonBytes({ ...issueData, network_logs: void 0 })
|
|
@@ -18383,16 +18456,17 @@ function ResizableSplitPane({
|
|
|
18383
18456
|
const minPercent = toPercent(minRatio);
|
|
18384
18457
|
const maxPercent = toPercent(maxRatio);
|
|
18385
18458
|
const currentPercent = toPercent(ratio);
|
|
18459
|
+
const hasEnd = end !== null && end !== void 0 && end !== false;
|
|
18386
18460
|
return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn$1("flex overflow-hidden", className), children: [
|
|
18387
18461
|
/* @__PURE__ */ jsx(
|
|
18388
18462
|
"div",
|
|
18389
18463
|
{
|
|
18390
18464
|
className: cn$1("flex min-w-0 flex-col overflow-hidden", startClassName),
|
|
18391
|
-
style: { width: formatRatioWidth(ratio) },
|
|
18465
|
+
style: { width: hasEnd ? formatRatioWidth(ratio) : "100%" },
|
|
18392
18466
|
children: start
|
|
18393
18467
|
}
|
|
18394
18468
|
),
|
|
18395
|
-
/* @__PURE__ */ jsx(
|
|
18469
|
+
hasEnd && /* @__PURE__ */ jsx(
|
|
18396
18470
|
"div",
|
|
18397
18471
|
{
|
|
18398
18472
|
role: "separator",
|
|
@@ -18411,7 +18485,7 @@ function ResizableSplitPane({
|
|
|
18411
18485
|
)
|
|
18412
18486
|
}
|
|
18413
18487
|
),
|
|
18414
|
-
/* @__PURE__ */ jsx("div", { className: cn$1("flex min-w-0 flex-1 flex-col overflow-hidden", endClassName), children: end })
|
|
18488
|
+
hasEnd && /* @__PURE__ */ jsx("div", { className: cn$1("flex min-w-0 flex-1 flex-col overflow-hidden", endClassName), children: end })
|
|
18415
18489
|
] });
|
|
18416
18490
|
}
|
|
18417
18491
|
function getPathname(url) {
|
|
@@ -18426,6 +18500,19 @@ function getStatusColorClass(statusCode) {
|
|
|
18426
18500
|
if (statusCode >= 400) return "text-warning";
|
|
18427
18501
|
return "text-success";
|
|
18428
18502
|
}
|
|
18503
|
+
function formatSocketCloseSummary(closeCode) {
|
|
18504
|
+
if (closeCode == null) return "연결 중";
|
|
18505
|
+
return closeCode === 1e3 ? `정상 종료 (${closeCode})` : `비정상 종료 (${closeCode})`;
|
|
18506
|
+
}
|
|
18507
|
+
function isAbnormalSocketClose(closeCode) {
|
|
18508
|
+
return closeCode != null && closeCode !== 1e3;
|
|
18509
|
+
}
|
|
18510
|
+
function formatBytes(bytes) {
|
|
18511
|
+
if (bytes == null || !Number.isFinite(bytes)) return "크기 알 수 없음";
|
|
18512
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
18513
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
18514
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
|
|
18515
|
+
}
|
|
18429
18516
|
function formatLogTime(timestamp) {
|
|
18430
18517
|
return new Date(timestamp).toLocaleTimeString("ko-KR", {
|
|
18431
18518
|
hour12: false,
|
|
@@ -18439,6 +18526,59 @@ function formatLogTimestamp(timestamp) {
|
|
|
18439
18526
|
const milliseconds = String(date.getMilliseconds()).padStart(3, "0");
|
|
18440
18527
|
return `${formatLogTime(timestamp)}.${milliseconds}`;
|
|
18441
18528
|
}
|
|
18529
|
+
function parseTruncatedJson(body) {
|
|
18530
|
+
const text2 = body.trimStart();
|
|
18531
|
+
const first = text2[0];
|
|
18532
|
+
if (first !== "{" && first !== "[") return void 0;
|
|
18533
|
+
for (const candidate of truncationCandidates(text2)) {
|
|
18534
|
+
const closed = closeOpenTokens(candidate);
|
|
18535
|
+
if (closed === null) continue;
|
|
18536
|
+
try {
|
|
18537
|
+
return JSON.parse(closed);
|
|
18538
|
+
} catch {
|
|
18539
|
+
}
|
|
18540
|
+
}
|
|
18541
|
+
return void 0;
|
|
18542
|
+
}
|
|
18543
|
+
function truncationCandidates(text2) {
|
|
18544
|
+
const { lastComma, lastOpen } = scanJson(text2);
|
|
18545
|
+
const candidates = [text2];
|
|
18546
|
+
if (lastComma > 0) candidates.push(text2.slice(0, lastComma));
|
|
18547
|
+
if (lastOpen >= 0) candidates.push(text2.slice(0, lastOpen + 1));
|
|
18548
|
+
return candidates;
|
|
18549
|
+
}
|
|
18550
|
+
function scanJson(text2) {
|
|
18551
|
+
const stack = [];
|
|
18552
|
+
let inString = false;
|
|
18553
|
+
let escaped = false;
|
|
18554
|
+
let lastComma = -1;
|
|
18555
|
+
for (let i = 0; i < text2.length; i += 1) {
|
|
18556
|
+
const char = text2[i];
|
|
18557
|
+
if (inString) {
|
|
18558
|
+
if (escaped) escaped = false;
|
|
18559
|
+
else if (char === "\\") escaped = true;
|
|
18560
|
+
else if (char === '"') inString = false;
|
|
18561
|
+
continue;
|
|
18562
|
+
}
|
|
18563
|
+
if (char === '"') inString = true;
|
|
18564
|
+
else if (char === "{") stack.push({ closer: "}", index: i });
|
|
18565
|
+
else if (char === "[") stack.push({ closer: "]", index: i });
|
|
18566
|
+
else if (char === "}" || char === "]") stack.pop();
|
|
18567
|
+
else if (char === "," && stack.length > 0) lastComma = i;
|
|
18568
|
+
}
|
|
18569
|
+
return {
|
|
18570
|
+
closers: stack.map((entry) => entry.closer).reverse(),
|
|
18571
|
+
inString,
|
|
18572
|
+
lastComma,
|
|
18573
|
+
lastOpen: stack.length > 0 ? stack[stack.length - 1].index : -1
|
|
18574
|
+
};
|
|
18575
|
+
}
|
|
18576
|
+
function closeOpenTokens(text2) {
|
|
18577
|
+
const { closers, inString } = scanJson(text2);
|
|
18578
|
+
if (inString) return null;
|
|
18579
|
+
if (closers.length === 0) return text2;
|
|
18580
|
+
return text2 + closers.join("");
|
|
18581
|
+
}
|
|
18442
18582
|
function parseLogBody(body) {
|
|
18443
18583
|
try {
|
|
18444
18584
|
return JSON.parse(body);
|
|
@@ -19459,13 +19599,13 @@ function ConsoleLogsSection({
|
|
|
19459
19599
|
logs.length,
|
|
19460
19600
|
")"
|
|
19461
19601
|
] }),
|
|
19462
|
-
|
|
19602
|
+
/* @__PURE__ */ jsx(
|
|
19463
19603
|
ResizableSplitPane,
|
|
19464
19604
|
{
|
|
19465
|
-
className: splitClassName ?? DEFAULT_SPLIT_CLASS_NAME$1,
|
|
19605
|
+
className: splitClassName ?? (selectedLog ? DEFAULT_SPLIT_CLASS_NAME$1 : DEFAULT_LIST_ONLY_CLASS_NAME$1),
|
|
19466
19606
|
separatorLabel: LOG_SPLIT_SEPARATOR_LABEL$1,
|
|
19467
19607
|
start: list2,
|
|
19468
|
-
end: /* @__PURE__ */ jsx(
|
|
19608
|
+
end: selectedLog ? /* @__PURE__ */ jsx(
|
|
19469
19609
|
ConsoleLogDetail,
|
|
19470
19610
|
{
|
|
19471
19611
|
log: selectedLog,
|
|
@@ -19473,9 +19613,9 @@ function ConsoleLogsSection({
|
|
|
19473
19613
|
onCopySuccess,
|
|
19474
19614
|
onCopyError
|
|
19475
19615
|
}
|
|
19476
|
-
)
|
|
19616
|
+
) : null
|
|
19477
19617
|
}
|
|
19478
|
-
)
|
|
19618
|
+
)
|
|
19479
19619
|
] });
|
|
19480
19620
|
}
|
|
19481
19621
|
return /* @__PURE__ */ jsx(Accordion, { type: "single", collapsible: true, children: /* @__PURE__ */ jsxs(AccordionItem, { value: "console-logs", children: [
|
|
@@ -35162,6 +35302,281 @@ function NotionIssueInfo({
|
|
|
35162
35302
|
}
|
|
35163
35303
|
);
|
|
35164
35304
|
}
|
|
35305
|
+
const MAX_HEARTBEAT_CHARS = 200;
|
|
35306
|
+
const RECORD_SEPARATOR = "";
|
|
35307
|
+
function parseJson(text2) {
|
|
35308
|
+
const first = text2[0];
|
|
35309
|
+
if (first !== "{" && first !== "[") return void 0;
|
|
35310
|
+
try {
|
|
35311
|
+
return JSON.parse(text2);
|
|
35312
|
+
} catch {
|
|
35313
|
+
return void 0;
|
|
35314
|
+
}
|
|
35315
|
+
}
|
|
35316
|
+
function asObject(text2) {
|
|
35317
|
+
const value = parseJson(text2);
|
|
35318
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
35319
|
+
}
|
|
35320
|
+
const PROTOCOLS = [
|
|
35321
|
+
{
|
|
35322
|
+
// Engine.IO(socket.io): `2` 핑, `3` 퐁, 업그레이드 `2probe`/`3probe`.
|
|
35323
|
+
// 확인되면 앱 메시지는 `42[...]` 로 오므로 한 글자 숫자는 핑·퐁이 맞다.
|
|
35324
|
+
name: "engine.io",
|
|
35325
|
+
matchesConnection: (connection) => /[?&]EIO=\d|\/(socket|engine)\.io\//i.test(connection.url ?? "") || connection.frames.some((frame2) => /^(0\{"sid"|40(\{|$))/.test(frame2.data ?? "")),
|
|
35326
|
+
isHeartbeat: (_frame, text2) => /^[23](probe)?$/.test(text2)
|
|
35327
|
+
},
|
|
35328
|
+
{
|
|
35329
|
+
// STOMP: 하트비트는 EOL 한 개다. 서브프로토콜이나 명령 프레임으로 확인한다.
|
|
35330
|
+
name: "stomp",
|
|
35331
|
+
matchesConnection: (connection) => /^v1[012]\.stomp$/i.test(connection.protocol ?? "") || connection.frames.some(
|
|
35332
|
+
(frame2) => /^(CONNECT|CONNECTED|SEND|MESSAGE|SUBSCRIBE|RECEIPT)\n/.test(frame2.data ?? "")
|
|
35333
|
+
),
|
|
35334
|
+
isHeartbeat: (_frame, text2) => text2 === "\n" || text2 === "\r\n"
|
|
35335
|
+
},
|
|
35336
|
+
{
|
|
35337
|
+
// MQTT: PINGREQ(`C0 00`)·PINGRESP(`D0 00`). 바이너리는 base64 로 저장된다.
|
|
35338
|
+
name: "mqtt",
|
|
35339
|
+
matchesConnection: (connection) => /^mqtt/i.test(connection.protocol ?? ""),
|
|
35340
|
+
isHeartbeat: (frame2, text2) => frame2.opcode === "binary" && (text2 === "wAA=" || text2 === "0AA=")
|
|
35341
|
+
},
|
|
35342
|
+
{
|
|
35343
|
+
// graphql-ws(ping·pong), subscriptions-transport-ws(ka), ActionCable(ping)
|
|
35344
|
+
name: "json-type",
|
|
35345
|
+
isHeartbeat: (_frame, text2) => {
|
|
35346
|
+
var _a;
|
|
35347
|
+
const type = (_a = asObject(text2)) == null ? void 0 : _a.type;
|
|
35348
|
+
return type === "ping" || type === "pong" || type === "ka";
|
|
35349
|
+
}
|
|
35350
|
+
},
|
|
35351
|
+
{
|
|
35352
|
+
// SignalR: `{"type":6}`. 숫자 6 만으로는 앱 메시지와 구분되지 않아 구분자를 함께 본다.
|
|
35353
|
+
name: "signalr",
|
|
35354
|
+
isHeartbeat: (_frame, text2) => {
|
|
35355
|
+
var _a;
|
|
35356
|
+
return text2.endsWith(RECORD_SEPARATOR) && ((_a = asObject(text2.slice(0, -1))) == null ? void 0 : _a.type) === 6;
|
|
35357
|
+
}
|
|
35358
|
+
},
|
|
35359
|
+
{
|
|
35360
|
+
// Phoenix·Supabase Realtime: v2 는 배열, v1 은 객체다. ref 는 매번 바뀐다.
|
|
35361
|
+
name: "phoenix",
|
|
35362
|
+
isHeartbeat: (_frame, text2) => {
|
|
35363
|
+
const value = parseJson(text2);
|
|
35364
|
+
if (Array.isArray(value)) return value[2] === "phoenix" && value[3] === "heartbeat";
|
|
35365
|
+
const message = value;
|
|
35366
|
+
return (message == null ? void 0 : message.topic) === "phoenix" && (message == null ? void 0 : message.event) === "heartbeat";
|
|
35367
|
+
}
|
|
35368
|
+
},
|
|
35369
|
+
{
|
|
35370
|
+
name: "pusher",
|
|
35371
|
+
isHeartbeat: (_frame, text2) => {
|
|
35372
|
+
var _a;
|
|
35373
|
+
const event = (_a = asObject(text2)) == null ? void 0 : _a.event;
|
|
35374
|
+
return event === "pusher:ping" || event === "pusher:pong";
|
|
35375
|
+
}
|
|
35376
|
+
}
|
|
35377
|
+
];
|
|
35378
|
+
function createHeartbeatTest(connection) {
|
|
35379
|
+
const active = PROTOCOLS.filter(
|
|
35380
|
+
(protocol) => !protocol.matchesConnection || protocol.matchesConnection(connection)
|
|
35381
|
+
);
|
|
35382
|
+
return (frame2) => {
|
|
35383
|
+
const text2 = frame2.data;
|
|
35384
|
+
if (text2 === void 0 || text2.length > MAX_HEARTBEAT_CHARS) return false;
|
|
35385
|
+
return active.some((protocol) => protocol.isHeartbeat(frame2, text2));
|
|
35386
|
+
};
|
|
35387
|
+
}
|
|
35388
|
+
async function fetchTranscript(url) {
|
|
35389
|
+
const response = await fetch(url);
|
|
35390
|
+
if (!response.ok) throw new Error(String(response.status));
|
|
35391
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
35392
|
+
const json = JSON.parse(new TextDecoder().decode(ungzip_1(bytes)));
|
|
35393
|
+
return Array.isArray(json.connections) ? json.connections : [];
|
|
35394
|
+
}
|
|
35395
|
+
function useSocketTranscript(url, options = {}) {
|
|
35396
|
+
return useQuery({
|
|
35397
|
+
queryKey: ["socketTranscript", (url == null ? void 0 : url.split("?")[0]) ?? null],
|
|
35398
|
+
queryFn: () => fetchTranscript(url),
|
|
35399
|
+
// fetch: false 는 이미 받아 둔 것만 본다. 탭 건수처럼 파일(최대 5MB)을 받을 이유가 없는 자리다.
|
|
35400
|
+
enabled: Boolean(url) && options.fetch !== false,
|
|
35401
|
+
staleTime: Infinity,
|
|
35402
|
+
retry: false
|
|
35403
|
+
});
|
|
35404
|
+
}
|
|
35405
|
+
const FRAME_PREVIEW_CHARS = 600;
|
|
35406
|
+
const PACKET_PREFIXED_JSON = /^(\d+)([[{][\s\S]*)$/;
|
|
35407
|
+
function parseFrameJson(frame2) {
|
|
35408
|
+
if (frame2.opcode !== "text" || frame2.data === void 0) return null;
|
|
35409
|
+
const match = PACKET_PREFIXED_JSON.exec(frame2.data);
|
|
35410
|
+
const [prefix, body] = match ? [match[1], match[2]] : ["", frame2.data];
|
|
35411
|
+
const first = body.trimStart()[0];
|
|
35412
|
+
if (first !== "{" && first !== "[") return null;
|
|
35413
|
+
try {
|
|
35414
|
+
return { prefix, json: JSON.parse(body), partial: false };
|
|
35415
|
+
} catch {
|
|
35416
|
+
if (!frame2.truncated) return null;
|
|
35417
|
+
const json = parseTruncatedJson(body);
|
|
35418
|
+
return json === void 0 ? null : { prefix, json, partial: true };
|
|
35419
|
+
}
|
|
35420
|
+
}
|
|
35421
|
+
function SocketFrameRow({ frame: frame2, openedAt }) {
|
|
35422
|
+
const [expanded, setExpanded] = useState(false);
|
|
35423
|
+
const text2 = frame2.data ?? "";
|
|
35424
|
+
const isText = frame2.opcode === "text";
|
|
35425
|
+
const parsed = useMemo(() => parseFrameJson(frame2), [frame2]);
|
|
35426
|
+
const collapsible = isText && !parsed && text2.length > FRAME_PREVIEW_CHARS;
|
|
35427
|
+
const shown = collapsible && !expanded ? `${text2.slice(0, FRAME_PREVIEW_CHARS)}…` : text2;
|
|
35428
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex gap-3 py-2 text-xs", children: [
|
|
35429
|
+
/* @__PURE__ */ jsxs("span", { className: "w-16 shrink-0 tabular-nums text-text-tertiary", children: [
|
|
35430
|
+
"+",
|
|
35431
|
+
((frame2.t - openedAt) / 1e3).toFixed(1),
|
|
35432
|
+
"s"
|
|
35433
|
+
] }),
|
|
35434
|
+
/* @__PURE__ */ jsx("span", { className: "w-6 shrink-0 text-text-secondary", children: frame2.dir === "send" ? "↑" : "↓" }),
|
|
35435
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
35436
|
+
parsed ? /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
|
|
35437
|
+
parsed.prefix && /* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-sm text-text-tertiary", children: parsed.prefix }),
|
|
35438
|
+
/* @__PURE__ */ jsx(
|
|
35439
|
+
JsonViewer,
|
|
35440
|
+
{
|
|
35441
|
+
data: parsed.json,
|
|
35442
|
+
defaultExpanded: text2.length <= FRAME_PREVIEW_CHARS,
|
|
35443
|
+
className: "min-w-0 flex-1"
|
|
35444
|
+
}
|
|
35445
|
+
)
|
|
35446
|
+
] }) : /* @__PURE__ */ jsx("p", { className: "break-all font-mono text-text-primary", children: isText ? shown : `바이너리 · ${formatBytes(frame2.size)}` }),
|
|
35447
|
+
(frame2.truncated || collapsible) && /* @__PURE__ */ jsxs("p", { className: "mt-1 flex gap-2 text-text-tertiary", children: [
|
|
35448
|
+
frame2.truncated && /* @__PURE__ */ jsxs("span", { children: [
|
|
35449
|
+
"전체 ",
|
|
35450
|
+
formatBytes(frame2.size),
|
|
35451
|
+
" 중 앞부분만 저장했습니다",
|
|
35452
|
+
(parsed == null ? void 0 : parsed.partial) && " · 끊긴 마지막 항목은 빼고 보여줍니다"
|
|
35453
|
+
] }),
|
|
35454
|
+
collapsible && /* @__PURE__ */ jsx(
|
|
35455
|
+
"button",
|
|
35456
|
+
{
|
|
35457
|
+
type: "button",
|
|
35458
|
+
className: "text-text-secondary underline-offset-2 hover:underline",
|
|
35459
|
+
onClick: () => setExpanded((value) => !value),
|
|
35460
|
+
children: expanded ? "접기" : "펼치기"
|
|
35461
|
+
}
|
|
35462
|
+
)
|
|
35463
|
+
] })
|
|
35464
|
+
] })
|
|
35465
|
+
] });
|
|
35466
|
+
}
|
|
35467
|
+
const ROW_PAGE_SIZE = 300;
|
|
35468
|
+
function toFrameRows(frames, isHeartbeat) {
|
|
35469
|
+
const rows = [];
|
|
35470
|
+
let run = [];
|
|
35471
|
+
const flush = (end) => {
|
|
35472
|
+
const start = end - run.length;
|
|
35473
|
+
if (run.length > 1) rows.push({ kind: "heartbeats", frames: run, index: start });
|
|
35474
|
+
else if (run.length === 1) rows.push({ kind: "frame", frame: run[0], index: start });
|
|
35475
|
+
run = [];
|
|
35476
|
+
};
|
|
35477
|
+
frames.forEach((frame2, index2) => {
|
|
35478
|
+
if (isHeartbeat(frame2)) {
|
|
35479
|
+
run.push(frame2);
|
|
35480
|
+
return;
|
|
35481
|
+
}
|
|
35482
|
+
flush(index2);
|
|
35483
|
+
rows.push({ kind: "frame", frame: frame2, index: index2 });
|
|
35484
|
+
});
|
|
35485
|
+
flush(frames.length);
|
|
35486
|
+
return rows;
|
|
35487
|
+
}
|
|
35488
|
+
function HeartbeatRow({ frames, openedAt }) {
|
|
35489
|
+
const [expanded, setExpanded] = useState(false);
|
|
35490
|
+
const at = (frame2) => `+${((frame2.t - openedAt) / 1e3).toFixed(1)}s`;
|
|
35491
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
35492
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 py-2 text-xs text-text-tertiary", children: [
|
|
35493
|
+
/* @__PURE__ */ jsx("span", { className: "w-16 shrink-0 tabular-nums", children: at(frames[0]) }),
|
|
35494
|
+
/* @__PURE__ */ jsx("span", { className: "w-6 shrink-0", children: "↕" }),
|
|
35495
|
+
/* @__PURE__ */ jsxs("p", { className: "flex min-w-0 flex-1 gap-2", children: [
|
|
35496
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
35497
|
+
"하트비트 ",
|
|
35498
|
+
frames.length,
|
|
35499
|
+
"건 · ",
|
|
35500
|
+
at(frames[0]),
|
|
35501
|
+
" ~ ",
|
|
35502
|
+
at(frames[frames.length - 1])
|
|
35503
|
+
] }),
|
|
35504
|
+
/* @__PURE__ */ jsx(
|
|
35505
|
+
"button",
|
|
35506
|
+
{
|
|
35507
|
+
type: "button",
|
|
35508
|
+
className: "text-text-secondary underline-offset-2 hover:underline",
|
|
35509
|
+
onClick: () => setExpanded((value) => !value),
|
|
35510
|
+
children: expanded ? "접기" : "펼치기"
|
|
35511
|
+
}
|
|
35512
|
+
)
|
|
35513
|
+
] })
|
|
35514
|
+
] }),
|
|
35515
|
+
expanded && frames.map((frame2, index2) => /* @__PURE__ */ jsx(SocketFrameRow, { frame: frame2, openedAt }, index2))
|
|
35516
|
+
] });
|
|
35517
|
+
}
|
|
35518
|
+
function SocketFrames({ connection }) {
|
|
35519
|
+
const [shownCount, setShownCount] = useState(ROW_PAGE_SIZE);
|
|
35520
|
+
const rows = useMemo(
|
|
35521
|
+
() => toFrameRows(connection.frames, createHeartbeatTest(connection)),
|
|
35522
|
+
[connection]
|
|
35523
|
+
);
|
|
35524
|
+
const hiddenCount = Math.max(0, rows.length - shownCount);
|
|
35525
|
+
const shownRows = hiddenCount > 0 ? rows.slice(hiddenCount) : rows;
|
|
35526
|
+
return /* @__PURE__ */ jsxs("div", { className: "divide-y divide-line-subtle", children: [
|
|
35527
|
+
connection.adopted && /* @__PURE__ */ jsx("p", { className: "py-2 text-xs text-text-tertiary", children: "이슈스티커가 기록을 시작하기 전에 열린 연결입니다. 기록을 시작한 뒤의 프레임만 있습니다." }),
|
|
35528
|
+
connection.droppedFrames > 0 && /* @__PURE__ */ jsxs("p", { className: "py-2 text-xs text-text-tertiary", children: [
|
|
35529
|
+
"이전 프레임 ",
|
|
35530
|
+
connection.droppedFrames,
|
|
35531
|
+
"건은 보관 상한을 넘어 저장하지 않았습니다."
|
|
35532
|
+
] }),
|
|
35533
|
+
hiddenCount > 0 && /* @__PURE__ */ jsxs(
|
|
35534
|
+
"button",
|
|
35535
|
+
{
|
|
35536
|
+
type: "button",
|
|
35537
|
+
className: "w-full py-2 text-xs text-text-secondary underline-offset-2 hover:underline",
|
|
35538
|
+
onClick: () => setShownCount((count) => count + ROW_PAGE_SIZE),
|
|
35539
|
+
children: [
|
|
35540
|
+
"이전 항목 ",
|
|
35541
|
+
Math.min(hiddenCount, ROW_PAGE_SIZE),
|
|
35542
|
+
"건 더 보기"
|
|
35543
|
+
]
|
|
35544
|
+
}
|
|
35545
|
+
),
|
|
35546
|
+
shownRows.map(
|
|
35547
|
+
(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)
|
|
35548
|
+
)
|
|
35549
|
+
] });
|
|
35550
|
+
}
|
|
35551
|
+
const NO_TRANSCRIPT_MESSAGE = "이 연결의 전사가 없습니다.";
|
|
35552
|
+
const LOADING_MESSAGE = "프레임을 불러오는 중입니다.";
|
|
35553
|
+
const ERROR_MESSAGE = "프레임을 불러오지 못했습니다.";
|
|
35554
|
+
function SocketFrameList({
|
|
35555
|
+
connectionId,
|
|
35556
|
+
transcriptUrl
|
|
35557
|
+
}) {
|
|
35558
|
+
if (!transcriptUrl) {
|
|
35559
|
+
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-text-tertiary", children: NO_TRANSCRIPT_MESSAGE });
|
|
35560
|
+
}
|
|
35561
|
+
return /* @__PURE__ */ jsx(LoadedSocketFrameList, { connectionId, transcriptUrl });
|
|
35562
|
+
}
|
|
35563
|
+
function LoadedSocketFrameList({
|
|
35564
|
+
connectionId,
|
|
35565
|
+
transcriptUrl
|
|
35566
|
+
}) {
|
|
35567
|
+
const transcript = useSocketTranscript(transcriptUrl);
|
|
35568
|
+
if (transcript.isPending) {
|
|
35569
|
+
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-text-tertiary", children: LOADING_MESSAGE });
|
|
35570
|
+
}
|
|
35571
|
+
if (transcript.isError) {
|
|
35572
|
+
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-danger", children: ERROR_MESSAGE });
|
|
35573
|
+
}
|
|
35574
|
+
const connection = [...transcript.data].reverse().find((c2) => c2.id === connectionId);
|
|
35575
|
+
if (!connection) {
|
|
35576
|
+
return /* @__PURE__ */ jsx("p", { className: "py-3 text-xs text-text-tertiary", children: NO_TRANSCRIPT_MESSAGE });
|
|
35577
|
+
}
|
|
35578
|
+
return /* @__PURE__ */ jsx(SocketFrames, { connection });
|
|
35579
|
+
}
|
|
35165
35580
|
function getHeaderValue(headers, headerName) {
|
|
35166
35581
|
if (!headers) return void 0;
|
|
35167
35582
|
const normalizedHeaderName = headerName.toLowerCase();
|
|
@@ -35205,12 +35620,6 @@ function resolveResponseImageSrc(log, body) {
|
|
|
35205
35620
|
const legacyBase64 = binaryStringToBase64(body);
|
|
35206
35621
|
return legacyBase64 ? `data:${mimeType};base64,${legacyBase64}` : null;
|
|
35207
35622
|
}
|
|
35208
|
-
function formatBytes(bytes) {
|
|
35209
|
-
if (bytes == null || !Number.isFinite(bytes)) return "크기 알 수 없음";
|
|
35210
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
35211
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
35212
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
|
|
35213
|
-
}
|
|
35214
35623
|
function getBodyOmission(log, bodyType) {
|
|
35215
35624
|
if (!log) return null;
|
|
35216
35625
|
if (bodyType === "request" && log.requestBodyOmittedReason) {
|
|
@@ -35299,7 +35708,18 @@ function SummaryTab({ log, onCopySuccess, onCopyError }) {
|
|
|
35299
35708
|
/* @__PURE__ */ jsx(SummaryField, { label: "Method", value: log.method || "-" }),
|
|
35300
35709
|
/* @__PURE__ */ jsx(SummaryField, { label: "Duration", value: log.duration != null ? `${log.duration}ms` : "-" }),
|
|
35301
35710
|
/* @__PURE__ */ jsx(SummaryField, { label: "Type", value: log.type }),
|
|
35302
|
-
/* @__PURE__ */ jsx(SummaryField, { label: "Time", value: formatLogTimestamp(log.timestamp) })
|
|
35711
|
+
/* @__PURE__ */ jsx(SummaryField, { label: "Time", value: formatLogTimestamp(log.timestamp) }),
|
|
35712
|
+
log.type === "websocket" && /* @__PURE__ */ jsx(
|
|
35713
|
+
SummaryField,
|
|
35714
|
+
{
|
|
35715
|
+
label: "종료 코드",
|
|
35716
|
+
value: formatSocketCloseSummary(log.socketCloseCode),
|
|
35717
|
+
className: cn$1(
|
|
35718
|
+
"font-semibold",
|
|
35719
|
+
isAbnormalSocketClose(log.socketCloseCode) ? "text-danger" : void 0
|
|
35720
|
+
)
|
|
35721
|
+
}
|
|
35722
|
+
)
|
|
35303
35723
|
] }),
|
|
35304
35724
|
log.requestBody && /* @__PURE__ */ jsx(
|
|
35305
35725
|
BodySection,
|
|
@@ -35485,56 +35905,74 @@ function BodyContent({
|
|
|
35485
35905
|
}
|
|
35486
35906
|
function NetworkLogDetail({
|
|
35487
35907
|
log,
|
|
35488
|
-
defaultTab
|
|
35908
|
+
defaultTab,
|
|
35489
35909
|
className,
|
|
35910
|
+
socketLogUrl,
|
|
35490
35911
|
onCopySuccess,
|
|
35491
35912
|
onCopyError
|
|
35492
35913
|
}) {
|
|
35493
35914
|
const copyCallbacks = { onCopySuccess, onCopyError };
|
|
35915
|
+
const isSocket = log.type === "websocket";
|
|
35494
35916
|
const tabs = [
|
|
35495
35917
|
{
|
|
35496
35918
|
label: "요약",
|
|
35497
35919
|
value: "summary",
|
|
35498
35920
|
content: /* @__PURE__ */ jsx(SummaryTab, { log, ...copyCallbacks })
|
|
35499
35921
|
},
|
|
35500
|
-
|
|
35501
|
-
|
|
35502
|
-
|
|
35503
|
-
|
|
35504
|
-
|
|
35505
|
-
|
|
35506
|
-
|
|
35507
|
-
|
|
35508
|
-
|
|
35509
|
-
|
|
35510
|
-
|
|
35511
|
-
|
|
35512
|
-
|
|
35513
|
-
|
|
35514
|
-
|
|
35515
|
-
|
|
35516
|
-
|
|
35517
|
-
|
|
35518
|
-
|
|
35519
|
-
|
|
35520
|
-
|
|
35521
|
-
|
|
35522
|
-
|
|
35523
|
-
|
|
35524
|
-
|
|
35525
|
-
|
|
35526
|
-
|
|
35527
|
-
|
|
35528
|
-
|
|
35529
|
-
|
|
35530
|
-
|
|
35531
|
-
|
|
35532
|
-
|
|
35922
|
+
// 핸드셰이크는 페이지 안에서 헤더도 바디도 볼 수 없다. 세 탭을 웹소켓 줄에 붙이면
|
|
35923
|
+
// 무엇을 열어도 "없습니다" 만 나와, 수집이 깨진 것처럼 보인다.
|
|
35924
|
+
...isSocket ? [
|
|
35925
|
+
{
|
|
35926
|
+
label: "프레임",
|
|
35927
|
+
value: "frames",
|
|
35928
|
+
content: /* @__PURE__ */ jsx(
|
|
35929
|
+
SocketFrameList,
|
|
35930
|
+
{
|
|
35931
|
+
connectionId: log.socketConnectionId ?? "",
|
|
35932
|
+
transcriptUrl: socketLogUrl ?? null
|
|
35933
|
+
}
|
|
35934
|
+
)
|
|
35935
|
+
}
|
|
35936
|
+
] : [
|
|
35937
|
+
{
|
|
35938
|
+
label: "Headers",
|
|
35939
|
+
value: "headers",
|
|
35940
|
+
content: /* @__PURE__ */ jsx(HeadersTab, { log })
|
|
35941
|
+
},
|
|
35942
|
+
{
|
|
35943
|
+
label: "Payload",
|
|
35944
|
+
value: "payload",
|
|
35945
|
+
content: /* @__PURE__ */ jsx(
|
|
35946
|
+
BodyTab,
|
|
35947
|
+
{
|
|
35948
|
+
body: log.requestBody,
|
|
35949
|
+
bodyType: "request",
|
|
35950
|
+
emptyMessage: "요청 바디 없음",
|
|
35951
|
+
log,
|
|
35952
|
+
...copyCallbacks
|
|
35953
|
+
}
|
|
35954
|
+
)
|
|
35955
|
+
},
|
|
35956
|
+
{
|
|
35957
|
+
label: "Response",
|
|
35958
|
+
value: "response",
|
|
35959
|
+
content: /* @__PURE__ */ jsx(
|
|
35960
|
+
BodyTab,
|
|
35961
|
+
{
|
|
35962
|
+
body: log.responseBody,
|
|
35963
|
+
bodyType: "response",
|
|
35964
|
+
emptyMessage: "응답 바디 없음",
|
|
35965
|
+
log,
|
|
35966
|
+
...copyCallbacks
|
|
35967
|
+
}
|
|
35968
|
+
)
|
|
35969
|
+
}
|
|
35970
|
+
]
|
|
35533
35971
|
];
|
|
35534
35972
|
return (
|
|
35535
35973
|
// 높이를 물려주지 않으면 안쪽 `h-full` 이 auto 로 풀려 탭이 컨테이너 밖으로 자란다.
|
|
35536
35974
|
// 그러면 스크롤바 대신 상위의 overflow-hidden 에 잘린 화면이 보인다.
|
|
35537
|
-
/* @__PURE__ */ jsx("div", { className: cn$1("flex h-full min-h-0 flex-col", className), children: /* @__PURE__ */ jsx(LogDetailTabs, { tabs, defaultTab }) })
|
|
35975
|
+
/* @__PURE__ */ jsx("div", { className: cn$1("flex h-full min-h-0 flex-col", className), children: /* @__PURE__ */ jsx(LogDetailTabs, { tabs, defaultTab: defaultTab ?? (isSocket ? "frames" : "summary") }) })
|
|
35538
35976
|
);
|
|
35539
35977
|
}
|
|
35540
35978
|
function NetworkLogListItem({
|
|
@@ -35665,6 +36103,7 @@ function NetworkLogsSection({
|
|
|
35665
36103
|
layout: layout2 = "accordion",
|
|
35666
36104
|
splitClassName,
|
|
35667
36105
|
onDetailActiveChange,
|
|
36106
|
+
socketLogUrl,
|
|
35668
36107
|
onCopySuccess,
|
|
35669
36108
|
onCopyError
|
|
35670
36109
|
}) {
|
|
@@ -35698,23 +36137,24 @@ function NetworkLogsSection({
|
|
|
35698
36137
|
logs.length,
|
|
35699
36138
|
")"
|
|
35700
36139
|
] }),
|
|
35701
|
-
|
|
36140
|
+
/* @__PURE__ */ jsx(
|
|
35702
36141
|
ResizableSplitPane,
|
|
35703
36142
|
{
|
|
35704
|
-
className: splitClassName ?? DEFAULT_SPLIT_CLASS_NAME,
|
|
36143
|
+
className: splitClassName ?? (selectedLog ? DEFAULT_SPLIT_CLASS_NAME : DEFAULT_LIST_ONLY_CLASS_NAME),
|
|
35705
36144
|
separatorLabel: LOG_SPLIT_SEPARATOR_LABEL,
|
|
35706
36145
|
start: list2,
|
|
35707
|
-
end: /* @__PURE__ */ jsx(
|
|
36146
|
+
end: selectedLog ? /* @__PURE__ */ jsx(
|
|
35708
36147
|
NetworkLogDetail,
|
|
35709
36148
|
{
|
|
35710
36149
|
log: selectedLog,
|
|
35711
36150
|
className: "h-full",
|
|
36151
|
+
socketLogUrl,
|
|
35712
36152
|
onCopySuccess,
|
|
35713
36153
|
onCopyError
|
|
35714
36154
|
}
|
|
35715
|
-
)
|
|
36155
|
+
) : null
|
|
35716
36156
|
}
|
|
35717
|
-
)
|
|
36157
|
+
)
|
|
35718
36158
|
] });
|
|
35719
36159
|
}
|
|
35720
36160
|
return /* @__PURE__ */ jsx(Accordion, { type: "single", collapsible: true, children: /* @__PURE__ */ jsxs(AccordionItem, { value: "network-logs", children: [
|
|
@@ -35729,6 +36169,7 @@ function NetworkLogsSection({
|
|
|
35729
36169
|
NetworkLogDetail,
|
|
35730
36170
|
{
|
|
35731
36171
|
log: selectedLog,
|
|
36172
|
+
socketLogUrl,
|
|
35732
36173
|
onCopySuccess,
|
|
35733
36174
|
onCopyError
|
|
35734
36175
|
}
|
|
@@ -35849,7 +36290,8 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
35849
36290
|
{
|
|
35850
36291
|
logs: issue.network_logs || [],
|
|
35851
36292
|
layout: "split",
|
|
35852
|
-
onDetailActiveChange: handleNetworkDetailActiveChange
|
|
36293
|
+
onDetailActiveChange: handleNetworkDetailActiveChange,
|
|
36294
|
+
socketLogUrl: issue.socket_log_url
|
|
35853
36295
|
}
|
|
35854
36296
|
),
|
|
35855
36297
|
/* @__PURE__ */ jsx(
|
|
@@ -36143,8 +36585,8 @@ function getPlacementSortKey(placement) {
|
|
|
36143
36585
|
function comparePlacement(a, b) {
|
|
36144
36586
|
return getPlacementSortKey(a).localeCompare(getPlacementSortKey(b));
|
|
36145
36587
|
}
|
|
36146
|
-
function getHitbox(placement) {
|
|
36147
|
-
const half =
|
|
36588
|
+
function getHitbox(placement, markerSize) {
|
|
36589
|
+
const half = markerSize / 2 + MARKER_OVERLAP_PADDING;
|
|
36148
36590
|
return {
|
|
36149
36591
|
left: placement.x - half,
|
|
36150
36592
|
top: placement.y - half,
|
|
@@ -36175,11 +36617,11 @@ class DisjointSet {
|
|
|
36175
36617
|
}
|
|
36176
36618
|
}
|
|
36177
36619
|
}
|
|
36178
|
-
function clusterStickerPlacements(placements) {
|
|
36620
|
+
function clusterStickerPlacements(placements, markerSize = MARKER_SIZE) {
|
|
36179
36621
|
if (placements.length === 0) return [];
|
|
36180
36622
|
const sets = new DisjointSet(placements.length);
|
|
36181
|
-
const hitboxes = placements.map(getHitbox);
|
|
36182
|
-
const cell =
|
|
36623
|
+
const hitboxes = placements.map((placement) => getHitbox(placement, markerSize));
|
|
36624
|
+
const cell = markerSize + 2 * MARKER_OVERLAP_PADDING;
|
|
36183
36625
|
const keyOf = (cx, cy) => `${cx}:${cy}`;
|
|
36184
36626
|
const cellIndex = (value) => Math.floor(value / cell);
|
|
36185
36627
|
const grid = /* @__PURE__ */ new Map();
|
|
@@ -36226,11 +36668,11 @@ function clusterStickerPlacements(placements) {
|
|
|
36226
36668
|
};
|
|
36227
36669
|
}).filter((cluster) => Boolean(cluster)).sort((a, b) => comparePlacement(a.representative, b.representative));
|
|
36228
36670
|
}
|
|
36229
|
-
function getExpandedClusterStack(cluster, metrics = getWindowMetrics()) {
|
|
36230
|
-
const itemHeight =
|
|
36231
|
-
const totalHeight = cluster.placements.length *
|
|
36671
|
+
function getExpandedClusterStack(cluster, metrics = getWindowMetrics(), markerSize = MARKER_SIZE) {
|
|
36672
|
+
const itemHeight = markerSize + STACK_GAP;
|
|
36673
|
+
const totalHeight = cluster.placements.length * markerSize + (cluster.placements.length - 1) * STACK_GAP;
|
|
36232
36674
|
const viewportY = cluster.representative.y - metrics.scrollY;
|
|
36233
|
-
const direction = viewportY + totalHeight > metrics.viewport.height -
|
|
36675
|
+
const direction = viewportY + totalHeight > metrics.viewport.height - markerSize ? -1 : 1;
|
|
36234
36676
|
return cluster.placements.map((placement, index2) => ({
|
|
36235
36677
|
placement,
|
|
36236
36678
|
x: cluster.representative.x,
|
|
@@ -36240,6 +36682,68 @@ function getExpandedClusterStack(cluster, metrics = getWindowMetrics()) {
|
|
|
36240
36682
|
function getCurrentStickerDocumentMetrics() {
|
|
36241
36683
|
return getWindowMetrics();
|
|
36242
36684
|
}
|
|
36685
|
+
const STICKER_BASE_SIZE = 32;
|
|
36686
|
+
const STICKER_MIN_SIZE = 6;
|
|
36687
|
+
const STICKER_MAX_SIZE = 48;
|
|
36688
|
+
const STICKER_SIZE_STEP = 2;
|
|
36689
|
+
const STICKER_DOT_THRESHOLD = 18;
|
|
36690
|
+
function getStickerHitInset(size) {
|
|
36691
|
+
return Math.max(0, (STICKER_DOT_THRESHOLD - size) / 2);
|
|
36692
|
+
}
|
|
36693
|
+
const STICKER_SIZE_STORAGE_KEY = "issue-sticker-marker-size";
|
|
36694
|
+
function normalizeStickerSize(value) {
|
|
36695
|
+
const numeric = typeof value === "string" ? Number.parseInt(value, 10) : Number(value);
|
|
36696
|
+
if (!Number.isFinite(numeric)) return STICKER_BASE_SIZE;
|
|
36697
|
+
return Math.min(STICKER_MAX_SIZE, Math.max(STICKER_MIN_SIZE, Math.round(numeric)));
|
|
36698
|
+
}
|
|
36699
|
+
let cached = null;
|
|
36700
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
36701
|
+
function readStored() {
|
|
36702
|
+
if (typeof window === "undefined") return STICKER_BASE_SIZE;
|
|
36703
|
+
try {
|
|
36704
|
+
const raw = window.localStorage.getItem(STICKER_SIZE_STORAGE_KEY);
|
|
36705
|
+
return raw === null ? STICKER_BASE_SIZE : normalizeStickerSize(raw);
|
|
36706
|
+
} catch {
|
|
36707
|
+
return STICKER_BASE_SIZE;
|
|
36708
|
+
}
|
|
36709
|
+
}
|
|
36710
|
+
function notify() {
|
|
36711
|
+
listeners.forEach((listener) => listener());
|
|
36712
|
+
}
|
|
36713
|
+
function getStickerSize() {
|
|
36714
|
+
if (cached === null) cached = readStored();
|
|
36715
|
+
return cached;
|
|
36716
|
+
}
|
|
36717
|
+
function setStickerSize(value) {
|
|
36718
|
+
const next = normalizeStickerSize(value);
|
|
36719
|
+
if (next === getStickerSize()) return;
|
|
36720
|
+
cached = next;
|
|
36721
|
+
try {
|
|
36722
|
+
window.localStorage.setItem(STICKER_SIZE_STORAGE_KEY, String(next));
|
|
36723
|
+
} catch {
|
|
36724
|
+
}
|
|
36725
|
+
notify();
|
|
36726
|
+
}
|
|
36727
|
+
function handleStorage(event) {
|
|
36728
|
+
if (event.key !== STICKER_SIZE_STORAGE_KEY) return;
|
|
36729
|
+
cached = readStored();
|
|
36730
|
+
notify();
|
|
36731
|
+
}
|
|
36732
|
+
function subscribe(listener) {
|
|
36733
|
+
if (listeners.size === 0 && typeof window !== "undefined") {
|
|
36734
|
+
window.addEventListener("storage", handleStorage);
|
|
36735
|
+
}
|
|
36736
|
+
listeners.add(listener);
|
|
36737
|
+
return () => {
|
|
36738
|
+
listeners.delete(listener);
|
|
36739
|
+
if (listeners.size === 0 && typeof window !== "undefined") {
|
|
36740
|
+
window.removeEventListener("storage", handleStorage);
|
|
36741
|
+
}
|
|
36742
|
+
};
|
|
36743
|
+
}
|
|
36744
|
+
function useStickerSize() {
|
|
36745
|
+
return useSyncExternalStore(subscribe, getStickerSize, () => STICKER_BASE_SIZE);
|
|
36746
|
+
}
|
|
36243
36747
|
const STICKER_PALETTE_WHITE = "#FFFFFF";
|
|
36244
36748
|
const STICKER_PALETTE_INK = "#111827";
|
|
36245
36749
|
const STICKER_PALETTE_BLACK = "#000000";
|
|
@@ -36335,6 +36839,11 @@ function IssueSticker$1({
|
|
|
36335
36839
|
}) {
|
|
36336
36840
|
var _a, _b2, _c2;
|
|
36337
36841
|
const position2 = documentPosition;
|
|
36842
|
+
const storedSize = useStickerSize();
|
|
36843
|
+
const collapsedSize = alwaysExpanded ? STICKER_BASE_SIZE : storedSize;
|
|
36844
|
+
const hoverSize = Math.max(collapsedSize, STICKER_BASE_SIZE);
|
|
36845
|
+
const isDot = collapsedSize < STICKER_DOT_THRESHOLD;
|
|
36846
|
+
const hitInset = getStickerHitInset(collapsedSize);
|
|
36338
36847
|
const resolvedClusterCount = clusterCount ?? 0;
|
|
36339
36848
|
const isCluster = resolvedClusterCount > 1;
|
|
36340
36849
|
const clusterBackground = isCluster ? buildClusterBackground(clusterColorNames ?? []) : null;
|
|
@@ -36349,16 +36858,19 @@ function IssueSticker$1({
|
|
|
36349
36858
|
const viewportX = position2.x - scrollX;
|
|
36350
36859
|
const shouldExpandLeft = !alwaysExpanded && viewportX + expandedWidth > viewportWidth - 12;
|
|
36351
36860
|
const expandSide = shouldExpandLeft ? "left" : "right";
|
|
36861
|
+
const anchorOffset = collapsedSize / 2 + hitInset;
|
|
36352
36862
|
const style = alwaysExpanded ? { position: "relative" } : {
|
|
36353
36863
|
position: "absolute",
|
|
36354
36864
|
left: `${position2.x}px`,
|
|
36355
36865
|
top: `${position2.y}px`,
|
|
36356
|
-
|
|
36357
|
-
|
|
36358
|
-
|
|
36359
|
-
const
|
|
36360
|
-
const
|
|
36361
|
-
const
|
|
36866
|
+
padding: isDot ? `${hitInset}px` : void 0,
|
|
36867
|
+
transform: shouldExpandLeft ? `translate3d(calc(-100% + ${anchorOffset}px), -50%, 0)` : `translate3d(-${anchorOffset}px, -50%, 0)`
|
|
36868
|
+
};
|
|
36869
|
+
const hitAreaClassName = isDot ? "pointer-events-auto" : "";
|
|
36870
|
+
const wrapperClassName = isPopoverOpen ? `group/marker z-[10001] ${hitAreaClassName}` : `group/marker z-[9999] hover:z-[10001] focus-within:z-[10001] ${hitAreaClassName}`;
|
|
36871
|
+
const colorClassName = designColor ? "" : "bg-brand group-hover/marker:bg-brand-hover";
|
|
36872
|
+
const expandClassName = alwaysExpanded ? "max-w-[480px]" : "max-w-[var(--issue-sticker-size)] group-hover/marker:max-w-[480px] group-hover/marker:shadow-xl focus-visible:max-w-[480px]";
|
|
36873
|
+
const buttonClassName = `issue-sticker-marker ${generating || alwaysExpanded ? "" : "issue-marker-breathe"} group flex h-[var(--issue-sticker-size)] w-max cursor-pointer items-center overflow-hidden rounded-full border text-white shadow-lg outline-none transition-[max-width,height,box-shadow,background-color,border-color,transform,opacity] duration-[var(--issue-marker-expand-duration)] ease-out group-hover/marker:h-[var(--issue-sticker-hover-size)] focus-visible:h-[var(--issue-sticker-hover-size)] focus-visible:ring-4 ${isCluster ? `max-w-[var(--issue-sticker-size)] border-white/80 ${clusterBackground ? "" : "bg-brand group-hover/marker:bg-brand-hover"} shadow-lg ring-2 ring-brand-subtle group-hover/marker:max-w-[160px] group-hover/marker:shadow-xl focus-visible:max-w-[160px] focus-visible:ring-brand-subtle` : `${expandClassName} ${colorClassName} focus-visible:ring-brand-subtle ${generating ? "border-dashed border-white/70" : "border-white/80"}`} ${shouldExpandLeft ? "flex-row-reverse" : ""} ${isPopoverOpen ? "shadow-xl ring-4 ring-brand-subtle" : ""}`;
|
|
36362
36874
|
const backgroundStyle = clusterBackground ? clusterBackground.startsWith("linear-gradient") ? { background: clusterBackground } : { backgroundColor: clusterBackground } : designColor ? { backgroundColor: designColor } : {};
|
|
36363
36875
|
const buttonStyle = {
|
|
36364
36876
|
...backgroundStyle,
|
|
@@ -36366,6 +36878,8 @@ function IssueSticker$1({
|
|
|
36366
36878
|
// inline 으로 추가해 text-white 클래스를 덮는다.
|
|
36367
36879
|
...designForeground ? { color: designForeground } : {},
|
|
36368
36880
|
["--issue-sticker-expanded-width"]: `${expandedWidth}px`,
|
|
36881
|
+
["--issue-sticker-size"]: `${collapsedSize}px`,
|
|
36882
|
+
["--issue-sticker-hover-size"]: `${hoverSize}px`,
|
|
36369
36883
|
...clusterStackAnimation ? {
|
|
36370
36884
|
animation: clusterStackAnimation === "enter" ? "issue-sticker-cluster-sticker-enter 240ms cubic-bezier(0.34, 1.2, 0.64, 1) both" : "issue-sticker-cluster-sticker-exit 220ms ease-in both",
|
|
36371
36885
|
animationDelay: clusterStackAnimation === "enter" ? `${clusterStackIndex * 24}ms` : void 0
|
|
@@ -36378,44 +36892,54 @@ function IssueSticker$1({
|
|
|
36378
36892
|
}
|
|
36379
36893
|
onStickerClick(issue.id);
|
|
36380
36894
|
};
|
|
36381
|
-
return /* @__PURE__ */ jsx(
|
|
36382
|
-
"
|
|
36895
|
+
return /* @__PURE__ */ jsx(
|
|
36896
|
+
"div",
|
|
36383
36897
|
{
|
|
36384
|
-
|
|
36385
|
-
|
|
36386
|
-
|
|
36387
|
-
|
|
36388
|
-
|
|
36389
|
-
|
|
36390
|
-
|
|
36391
|
-
|
|
36392
|
-
|
|
36393
|
-
|
|
36394
|
-
|
|
36395
|
-
|
|
36396
|
-
|
|
36397
|
-
|
|
36398
|
-
|
|
36399
|
-
}
|
|
36400
|
-
|
|
36401
|
-
|
|
36402
|
-
|
|
36403
|
-
|
|
36404
|
-
|
|
36405
|
-
|
|
36406
|
-
|
|
36407
|
-
|
|
36408
|
-
|
|
36409
|
-
|
|
36410
|
-
|
|
36411
|
-
|
|
36412
|
-
|
|
36413
|
-
|
|
36414
|
-
|
|
36415
|
-
|
|
36416
|
-
|
|
36898
|
+
className: wrapperClassName,
|
|
36899
|
+
style,
|
|
36900
|
+
onClick: isDot ? (event) => {
|
|
36901
|
+
if (event.target === event.currentTarget) handleClick();
|
|
36902
|
+
} : void 0,
|
|
36903
|
+
children: /* @__PURE__ */ jsxs(
|
|
36904
|
+
"button",
|
|
36905
|
+
{
|
|
36906
|
+
type: "button",
|
|
36907
|
+
className: buttonClassName,
|
|
36908
|
+
style: buttonStyle,
|
|
36909
|
+
"data-issue-id": issue.id,
|
|
36910
|
+
"data-cluster-count": isCluster ? resolvedClusterCount : void 0,
|
|
36911
|
+
"data-expand-side": expandSide,
|
|
36912
|
+
onClick: handleClick,
|
|
36913
|
+
"aria-label": ariaLabel ?? (isCluster ? `겹친 스티커 ${resolvedClusterCount}개 펼치기` : `이슈 열기: ${visibleTitle}`),
|
|
36914
|
+
children: [
|
|
36915
|
+
/* @__PURE__ */ jsx(
|
|
36916
|
+
"span",
|
|
36917
|
+
{
|
|
36918
|
+
className: `flex aspect-square h-full shrink-0 items-center justify-center text-sm font-black leading-none ${isDot ? "opacity-0 transition-opacity duration-[var(--issue-marker-expand-duration)] ease-out group-hover/marker:opacity-100 group-focus-visible:opacity-100" : ""}`,
|
|
36919
|
+
"aria-hidden": "true",
|
|
36920
|
+
children: isCluster ? `+${resolvedClusterCount}` : generating ? /* @__PURE__ */ jsx(LoaderCircle, { className: "h-4 w-4 animate-spin" }) : "!"
|
|
36921
|
+
}
|
|
36922
|
+
),
|
|
36923
|
+
/* @__PURE__ */ jsx(
|
|
36924
|
+
"span",
|
|
36925
|
+
{
|
|
36926
|
+
className: `min-w-0 max-w-[428px] flex-1 truncate whitespace-nowrap text-xs font-semibold leading-none transition-[opacity,transform] duration-[var(--issue-marker-expand-duration)] ease-out ${alwaysExpanded ? "translate-x-0 opacity-100" : "opacity-0 group-hover/marker:translate-x-0 group-hover/marker:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100"} ${shouldExpandLeft ? `${alwaysExpanded ? "" : "translate-x-1"} pl-3 text-right` : `${alwaysExpanded ? "" : "-translate-x-1"} pr-3 text-left`}`,
|
|
36927
|
+
children: visibleTitle
|
|
36928
|
+
}
|
|
36929
|
+
),
|
|
36930
|
+
badgeLabel ? /* @__PURE__ */ jsx(
|
|
36931
|
+
"span",
|
|
36932
|
+
{
|
|
36933
|
+
"data-sticker-badge": "",
|
|
36934
|
+
className: `mx-3 shrink-0 whitespace-nowrap rounded-sm px-1.5 py-0.5 text-[10px] font-bold leading-none transition-opacity duration-[var(--issue-marker-expand-duration)] ease-out ${designForeground === STICKER_PALETTE_WHITE ? "bg-white/25" : "bg-black/10"} ${alwaysExpanded ? "opacity-100" : "opacity-0 group-hover/marker:opacity-100 group-focus-visible:opacity-100"}`,
|
|
36935
|
+
children: badgeLabel
|
|
36936
|
+
}
|
|
36937
|
+
) : null
|
|
36938
|
+
]
|
|
36939
|
+
}
|
|
36940
|
+
)
|
|
36417
36941
|
}
|
|
36418
|
-
)
|
|
36942
|
+
);
|
|
36419
36943
|
}
|
|
36420
36944
|
function useDocumentLayerScrollVars(ref, enabled) {
|
|
36421
36945
|
useEffect(() => {
|
|
@@ -36522,6 +37046,7 @@ function IssueStickersContainer$1({
|
|
|
36522
37046
|
const [closingClusterId, setClosingClusterId] = useState(null);
|
|
36523
37047
|
const closeTimerRef = useRef(null);
|
|
36524
37048
|
const mode = normalizeStickerRenderMode(renderMode);
|
|
37049
|
+
const markerSize = useStickerSize();
|
|
36525
37050
|
const layoutVersion = useDocumentLayoutVersion(visible, mode);
|
|
36526
37051
|
useDocumentLayerScrollVars(layerRef, visible);
|
|
36527
37052
|
const metrics = useMemo(() => getCurrentStickerDocumentMetrics(), [layoutVersion, visible]);
|
|
@@ -36531,10 +37056,10 @@ function IssueStickersContainer$1({
|
|
|
36531
37056
|
}
|
|
36532
37057
|
const resolved = resolveStickerPlacements(issues, mode, { metrics });
|
|
36533
37058
|
return {
|
|
36534
|
-
clusters: clusterStickerPlacements(resolved.placements),
|
|
37059
|
+
clusters: clusterStickerPlacements(resolved.placements, markerSize),
|
|
36535
37060
|
unrendered: resolved.unrendered
|
|
36536
37061
|
};
|
|
36537
|
-
}, [issues, layoutVersion, metrics, mode, visible]);
|
|
37062
|
+
}, [issues, layoutVersion, markerSize, metrics, mode, visible]);
|
|
36538
37063
|
const unrenderedSignature = useMemo(
|
|
36539
37064
|
() => unrendered.map((item) => `${item.issue.id}:${item.status}:${item.reason}`).sort().join("|"),
|
|
36540
37065
|
[unrendered]
|
|
@@ -36642,7 +37167,7 @@ function IssueStickersContainer$1({
|
|
|
36642
37167
|
);
|
|
36643
37168
|
}
|
|
36644
37169
|
if (isExpanded || isClosing) {
|
|
36645
|
-
return getExpandedClusterStack(cluster).map((item, index2) => /* @__PURE__ */ jsx(
|
|
37170
|
+
return getExpandedClusterStack(cluster, void 0, markerSize).map((item, index2) => /* @__PURE__ */ jsx(
|
|
36646
37171
|
IssueSticker$1,
|
|
36647
37172
|
{
|
|
36648
37173
|
issue: item.placement.issue,
|
|
@@ -37592,6 +38117,7 @@ function MoreMenu({
|
|
|
37592
38117
|
const renderModeTargetRef = useOnboardingTarget(targets.menuRenderMode);
|
|
37593
38118
|
const unrenderedTargetRef = useOnboardingTarget(targets.menuUnrendered);
|
|
37594
38119
|
const sessionTargetRef = useOnboardingTarget(targets.menuSession);
|
|
38120
|
+
const stickerSize = useStickerSize();
|
|
37595
38121
|
const renderModeLabel = stickerRenderMode === "absolute" ? "생성 위치" : "캡처 대상 요소";
|
|
37596
38122
|
const nextRenderModeLabel = stickerRenderMode === "absolute" ? "캡처 대상 요소" : "생성 위치";
|
|
37597
38123
|
const primary = [
|
|
@@ -37687,6 +38213,25 @@ function MoreMenu({
|
|
|
37687
38213
|
children: [
|
|
37688
38214
|
(account == null ? void 0 : account.error) ? /* @__PURE__ */ jsx("div", { className: "toolbar-menu-error", children: account.error }) : null,
|
|
37689
38215
|
visiblePrimary.map(renderEntry),
|
|
38216
|
+
/* @__PURE__ */ jsxs("div", { className: "toolbar-menu-slider", children: [
|
|
38217
|
+
/* @__PURE__ */ jsxs("div", { className: "toolbar-menu-slider-head", children: [
|
|
38218
|
+
/* @__PURE__ */ jsx("span", { className: "toolbar-menu-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Ruler, { size: ICON_SIZE }) }),
|
|
38219
|
+
/* @__PURE__ */ jsx("span", { className: "toolbar-menu-text", children: `스티커 크기 ${stickerSize}px` })
|
|
38220
|
+
] }),
|
|
38221
|
+
/* @__PURE__ */ jsx(
|
|
38222
|
+
"input",
|
|
38223
|
+
{
|
|
38224
|
+
type: "range",
|
|
38225
|
+
className: "toolbar-menu-range",
|
|
38226
|
+
min: STICKER_MIN_SIZE,
|
|
38227
|
+
max: STICKER_MAX_SIZE,
|
|
38228
|
+
step: STICKER_SIZE_STEP,
|
|
38229
|
+
value: stickerSize,
|
|
38230
|
+
"aria-label": "스티커 크기",
|
|
38231
|
+
onChange: (event) => setStickerSize(Number(event.target.value))
|
|
38232
|
+
}
|
|
38233
|
+
)
|
|
38234
|
+
] }),
|
|
37690
38235
|
visiblePrimary.length > 0 && visibleSession.length > 0 ? /* @__PURE__ */ jsx("div", { className: "toolbar-menu-divider" }) : null,
|
|
37691
38236
|
visibleSession.map(renderEntry)
|
|
37692
38237
|
]
|
|
@@ -37899,6 +38444,48 @@ const TOOLBAR_STYLES = `
|
|
|
37899
38444
|
background: hsl(var(--danger));
|
|
37900
38445
|
flex: none;
|
|
37901
38446
|
}
|
|
38447
|
+
.toolbar-menu-slider {
|
|
38448
|
+
display: flex;
|
|
38449
|
+
flex-direction: column;
|
|
38450
|
+
gap: 6px;
|
|
38451
|
+
padding: 8px 9px;
|
|
38452
|
+
}
|
|
38453
|
+
.toolbar-menu-slider-head {
|
|
38454
|
+
display: flex;
|
|
38455
|
+
align-items: center;
|
|
38456
|
+
gap: 9px;
|
|
38457
|
+
font-size: 12.5px;
|
|
38458
|
+
color: hsl(var(--text-primary));
|
|
38459
|
+
}
|
|
38460
|
+
.toolbar-menu-range {
|
|
38461
|
+
width: 100%;
|
|
38462
|
+
height: 3px;
|
|
38463
|
+
margin: 4px 0;
|
|
38464
|
+
padding: 0;
|
|
38465
|
+
appearance: none;
|
|
38466
|
+
-webkit-appearance: none;
|
|
38467
|
+
border-radius: 999px;
|
|
38468
|
+
background: hsl(var(--border-subtle));
|
|
38469
|
+
cursor: pointer;
|
|
38470
|
+
outline: none;
|
|
38471
|
+
}
|
|
38472
|
+
.toolbar-menu-range:focus-visible { box-shadow: var(--shadow-focus); }
|
|
38473
|
+
.toolbar-menu-range::-webkit-slider-thumb {
|
|
38474
|
+
appearance: none;
|
|
38475
|
+
-webkit-appearance: none;
|
|
38476
|
+
width: 13px;
|
|
38477
|
+
height: 13px;
|
|
38478
|
+
border-radius: 999px;
|
|
38479
|
+
border: none;
|
|
38480
|
+
background: var(--brand);
|
|
38481
|
+
}
|
|
38482
|
+
.toolbar-menu-range::-moz-range-thumb {
|
|
38483
|
+
width: 13px;
|
|
38484
|
+
height: 13px;
|
|
38485
|
+
border-radius: 999px;
|
|
38486
|
+
border: none;
|
|
38487
|
+
background: var(--brand);
|
|
38488
|
+
}
|
|
37902
38489
|
.toolbar-menu-divider {
|
|
37903
38490
|
height: 1px;
|
|
37904
38491
|
margin: 4px 8px;
|
|
@@ -38164,13 +38751,15 @@ function Toolbar({
|
|
|
38164
38751
|
return () => window.removeEventListener("resize", handleResize);
|
|
38165
38752
|
}, [getSize2]);
|
|
38166
38753
|
useEffect(() => {
|
|
38754
|
+
var _a;
|
|
38167
38755
|
if (!isOpen || onboardingOpen) return;
|
|
38168
38756
|
const handleClickOutside = (e) => {
|
|
38169
38757
|
if (!rootRef.current) return;
|
|
38170
38758
|
if (!e.composedPath().includes(rootRef.current)) setIsOpen(false);
|
|
38171
38759
|
};
|
|
38172
|
-
|
|
38173
|
-
|
|
38760
|
+
const scope = ((_a = rootRef.current) == null ? void 0 : _a.getRootNode()) ?? document;
|
|
38761
|
+
scope.addEventListener("mousedown", handleClickOutside);
|
|
38762
|
+
return () => scope.removeEventListener("mousedown", handleClickOutside);
|
|
38174
38763
|
}, [isOpen, onboardingOpen, setIsOpen]);
|
|
38175
38764
|
useEffect(() => {
|
|
38176
38765
|
if (state === "idle") return;
|
|
@@ -38602,7 +39191,7 @@ function AuthGate() {
|
|
|
38602
39191
|
) })
|
|
38603
39192
|
] });
|
|
38604
39193
|
}
|
|
38605
|
-
const globalsCSS = `:root,:host{color-scheme:light;--brand-h: 150;--brand-s: 100%;--brand-l: 34%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-subtle: hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14);--brand-border: hsl(var(--brand-h) calc(var(--brand-s) + 8%) calc(var(--brand-l) + 8%) / .34);--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22);--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-display: var(--font-sans);--font-mono: var(--font-sans);--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--text-disabled: 145 4% 70%;--text-inverse: 0 0% 100%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--border-focus: var(--brand-h) var(--brand-s) var(--brand-l);--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 52%;--warning-subtle: 34 82% 52% / .14;--danger: 3 68% 56%;--danger-subtle: 3 68% 56% / .12;--danger-deep: 3 62% 40%;--info: 202 52% 44%;--info-subtle: 202 52% 44% / .12;--accent-terra: 13 52% 47%;--accent-terra-subtle: 13 52% 47% / .1;--accent-terra-deep: 13 48% 44%;--accent-blue: 213 86% 56%;--accent-blue-subtle: 213 92% 56% / .12;--accent-blue-deep: 216 78% 40%;--accent-blue-border: 213 86% 62% / .36;--accent-cream: 38 52% 88%;--accent-cream-warm: 40 56% 95%;--accent-cream-deep: 38 48% 82%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 11%;--radius-xs: 4px;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 16px;--radius-xl: 20px;--radius-2xl: 24px;--radius-pill: 9999px;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 3px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 14%) / .24), 0 6px 20px hsl(var(--brand-h) calc(var(--brand-s) - 70%) calc(var(--brand-l) - 19%) / .16);--duration-instant: 90ms;--duration-fast: .16s;--duration-base: .26s;--duration-out: .18s;--duration-slow: .36s;--ease-out: cubic-bezier(.23, 1, .32, 1);--ease-in-out: cubic-bezier(.45, 0, .15, 1);--ease-spring: cubic-bezier(.18, .94, .32, 1.08);--grid-line: 0 0% 92%}.dark,:host(.dark){color-scheme:dark;--brand-l: 34%;--brand-fg: hsl(0 0% 100%);--surface-0: 150 8% 7%;--surface-1: 150 6% 10%;--surface-2: 150 5% 14%;--surface-3: 150 4% 18%;--surface-inset: 150 6% 6%;--overlay-backdrop: hsl(0 0% 0% / .56);--overlay-backdrop-strong: hsl(0 0% 0% / .8);--text-primary: 40 16% 93%;--text-secondary: 36 8% 68%;--text-tertiary: 34 6% 50%;--text-disabled: 30 5% 34%;--text-inverse: 150 8% 10%;--border-subtle: 150 6% 16%;--border-default: 150 5% 22%;--border-strong: 150 4% 34%;--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 62%;--danger: 2 70% 64%;--danger-deep: 2 80% 76%;--info: 202 54% 62%;--accent-terra: 13 56% 62%;--accent-terra-subtle: 13 56% 62% / .14;--accent-terra-deep: 13 52% 56%;--accent-blue: 210 92% 68%;--accent-blue-subtle: 210 92% 68% / .18;--accent-blue-deep: 209 100% 78%;--accent-blue-border: 210 92% 72% / .44;--accent-cream: 38 30% 26%;--accent-cream-warm: 38 22% 18%;--accent-cream-deep: 38 26% 32%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 8%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .2);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .3), 0 1px 2px -1px hsl(0 0% 0% / .24);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .34), 0 2px 4px -2px hsl(0 0% 0% / .2);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .38), 0 4px 6px -4px hsl(0 0% 0% / .24);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .44), 0 8px 10px -6px hsl(0 0% 0% / .28);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .16);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 24%) / .44), 0 6px 20px hsl(0 0% 0% / .32);--grid-line: 150 6% 14%}*{border-color:hsl(var(--border-default))}html{font-family:var(--font-sans),ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-feature-settings:"cv11","ss01","ss03";background-color:hsl(var(--surface-0))}body{margin:0;min-height:100vh;color:hsl(var(--text-primary));background-color:hsl(var(--surface-0))}::-moz-selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}::selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:"ss01","ss02","cv11"}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border-strong) / .52);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:hsl(var(--border-strong) / .9);background-clip:padding-box;border:2px solid transparent}.app-canvas,.grid-canvas{background-color:hsl(var(--surface-0))}.onboarding-canvas{word-break:keep-all;overflow-wrap:break-word;--surface-0: var(--brand-h) var(--brand-s) var(--brand-l);--surface-1: 0 0% 100%;--surface-2: var(--brand-h) 62% 28%;--surface-3: var(--brand-h) 60% 25%;--surface-inset: var(--brand-h) 62% 28%;--text-primary: 0 0% 100%;--text-secondary: var(--brand-h) 46% 90%;--text-tertiary: var(--brand-h) 34% 84%;--text-disabled: var(--brand-h) 20% 72%;--border-subtle: var(--brand-h) 44% 52%;--border-default: var(--brand-h) 40% 58%;--border-strong: var(--brand-h) 36% 70%;--border-focus: 0 0% 100%;--brand-hsl: 0 0% 100%;--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) 24% 94%);--brand-active: hsl(var(--brand-h) 20% 88%);--brand-fg: hsl(var(--brand-h) var(--brand-s) 24%);--brand-ring: hsl(0 0% 100% / .4);--danger: 6 96% 86%;--danger-subtle: 6 96% 86% / .18;--danger-deep: 6 96% 92%;--warning: 42 96% 82%;--warning-subtle: 42 96% 82% / .18}.onboarding-canvas .bg-surface-1,.onboarding-canvas input,.onboarding-canvas textarea,.onboarding-canvas [role=combobox]{--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--surface-2: 144 8% 96%;--surface-inset: 144 6% 95%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22)}@keyframes onboarding-step-in{0%{opacity:0;transform:translate(96px)}to{opacity:1;transform:translate(0)}}.onboarding-step-in{animation:onboarding-step-in var(--duration-slow) var(--ease-out) forwards}@keyframes onboarding-enter-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.onboarding-enter{position:fixed;top:0;right:0;bottom:0;left:0;overflow-x:hidden;overflow-y:auto;animation:onboarding-enter-up var(--duration-base) var(--ease-out) forwards}body:has(.onboarding-canvas){background-color:hsl(var(--brand-h) var(--brand-s) var(--brand-l))}.panel-shell,.surface-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-sm)}.panel-shell-muted,.surface-shell-muted{background:hsl(var(--surface-2));box-shadow:var(--shadow-xs)}.panel-shell-subtle{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.panel-shell-elevated{border:1px solid hsl(var(--border-default));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.utility-chip,.floating-chip{display:inline-flex;align-items:center;gap:8px;border:1px solid hsl(var(--border-default));border-radius:var(--radius-pill);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.hairline{border-bottom:1px solid hsl(var(--border-subtle))}.mono-label{font-family:var(--font-mono),ui-monospace,monospace;font-size:11px;text-transform:uppercase;color:hsl(var(--text-tertiary))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,:host{--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-mono: var(--font-sans);--issue-marker-expand-duration: .52s;--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 52%;--text-disabled: 145 4% 70%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--grid-line: 0 0% 92%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 4px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04)}*{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}#issue-sticker-shadow-root{all:initial;display:block;background-color:transparent;--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1));font-family:var(--font-sans);line-height:1.5}.\\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-1{left:4px;right:4px}.inset-y-0{top:0;bottom:0}.-bottom-px{bottom:-1px}.bottom-0{bottom:0}.bottom-4{bottom:16px}.bottom-6{bottom:24px}.left-0{left:0}.left-1\\/2{left:50%}.left-2{left:8px}.left-4{left:16px}.left-\\[50\\%\\]{left:50%}.right-0{right:0}.right-2{right:8px}.right-3{right:12px}.right-4{right:16px}.right-5{right:20px}.right-6{right:24px}.top-0{top:0}.top-1{top:4px}.top-1\\/2{top:50%}.top-2{top:8px}.top-3{top:12px}.top-4{top:16px}.top-5{top:20px}.top-\\[50\\%\\]{top:50%}.top-\\[calc\\(\\(3\\.5rem-1\\.75rem\\)\\/2\\)\\]{top:14px}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-\\[1000000\\]{z-index:1000000}.z-\\[1000003\\]{z-index:1000003}.z-\\[1000004\\]{z-index:1000004}.z-\\[1000005\\]{z-index:1000005}.z-\\[1000006\\]{z-index:1000006}.z-\\[1000007\\]{z-index:1000007}.z-\\[1000008\\]{z-index:1000008}.z-\\[1000010\\]{z-index:1000010}.z-\\[1000011\\]{z-index:1000011}.z-\\[10001\\]{z-index:10001}.z-\\[999999\\]{z-index:999999}.z-\\[9999\\]{z-index:9999}.m-0{margin:0}.-mx-2{margin-left:-8px;margin-right:-8px}.mx-3{margin-left:12px;margin-right:12px}.my-1{margin-top:4px;margin-bottom:4px}.my-2{margin-top:8px;margin-bottom:8px}.my-2\\.5{margin-top:10px;margin-bottom:10px}.my-3{margin-top:12px;margin-bottom:12px}.my-4{margin-top:16px;margin-bottom:16px}.mb-0\\.5{margin-bottom:2px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-5{margin-bottom:20px}.ml-0\\.5{margin-left:2px}.ml-4{margin-left:16px}.mr-1\\.5{margin-right:6px}.mt-0{margin-top:0}.mt-0\\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.\\!h-auto{height:auto!important}.h-1\\.5{height:6px}.h-10{height:40px}.h-11{height:44px}.h-2{height:8px}.h-24{height:96px}.h-3{height:12px}.h-3\\.5{height:14px}.h-4{height:16px}.h-5{height:20px}.h-6{height:24px}.h-7{height:28px}.h-8{height:32px}.h-9{height:36px}.h-\\[1\\.4rem\\]{height:22.4px}.h-\\[100vh\\]{height:100vh}.h-\\[18px\\]{height:18px}.h-\\[220px\\]{height:220px}.h-\\[22px\\]{height:22px}.h-\\[30px\\]{height:30px}.h-\\[min\\(36vh\\,320px\\)\\]{height:min(36vh,320px)}.h-\\[min\\(480px\\,calc\\(100vh-64px\\)\\)\\]{height:min(480px,calc(100vh - 64px))}.h-\\[min\\(54vh\\,520px\\)\\]{height:min(54vh,520px)}.h-\\[min\\(560px\\,calc\\(100vh-32px\\)\\)\\]{height:min(560px,calc(100vh - 32px))}.h-\\[var\\(--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-14{width:56px}.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-8{max-width:32px}.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-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\\,box-shadow\\,background-color\\,border-color\\,transform\\,opacity\\]{transition-property:max-width,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\\:max-w-\\[160px\\]:hover{max-width:160px}.hover\\:max-w-\\[480px\\]:hover{max-width:480px}.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}.hover\\:shadow-xl:hover{--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)}.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\\: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:hover .group-hover\\: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:hover .group-hover\\:opacity-100{opacity:1}.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))}`;
|
|
39194
|
+
const globalsCSS = `:root,:host{color-scheme:light;--brand-h: 150;--brand-s: 100%;--brand-l: 34%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-subtle: hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14);--brand-border: hsl(var(--brand-h) calc(var(--brand-s) + 8%) calc(var(--brand-l) + 8%) / .34);--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22);--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-display: var(--font-sans);--font-mono: var(--font-sans);--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--text-disabled: 145 4% 70%;--text-inverse: 0 0% 100%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--border-focus: var(--brand-h) var(--brand-s) var(--brand-l);--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 52%;--warning-subtle: 34 82% 52% / .14;--danger: 3 68% 56%;--danger-subtle: 3 68% 56% / .12;--danger-deep: 3 62% 40%;--info: 202 52% 44%;--info-subtle: 202 52% 44% / .12;--accent-terra: 13 52% 47%;--accent-terra-subtle: 13 52% 47% / .1;--accent-terra-deep: 13 48% 44%;--accent-blue: 213 86% 56%;--accent-blue-subtle: 213 92% 56% / .12;--accent-blue-deep: 216 78% 40%;--accent-blue-border: 213 86% 62% / .36;--accent-cream: 38 52% 88%;--accent-cream-warm: 40 56% 95%;--accent-cream-deep: 38 48% 82%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 11%;--radius-xs: 4px;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 16px;--radius-xl: 20px;--radius-2xl: 24px;--radius-pill: 9999px;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 3px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 14%) / .24), 0 6px 20px hsl(var(--brand-h) calc(var(--brand-s) - 70%) calc(var(--brand-l) - 19%) / .16);--duration-instant: 90ms;--duration-fast: .16s;--duration-base: .26s;--duration-out: .18s;--duration-slow: .36s;--ease-out: cubic-bezier(.23, 1, .32, 1);--ease-in-out: cubic-bezier(.45, 0, .15, 1);--ease-spring: cubic-bezier(.18, .94, .32, 1.08);--grid-line: 0 0% 92%}.dark,:host(.dark){color-scheme:dark;--brand-l: 34%;--brand-fg: hsl(0 0% 100%);--surface-0: 150 8% 7%;--surface-1: 150 6% 10%;--surface-2: 150 5% 14%;--surface-3: 150 4% 18%;--surface-inset: 150 6% 6%;--overlay-backdrop: hsl(0 0% 0% / .56);--overlay-backdrop-strong: hsl(0 0% 0% / .8);--text-primary: 40 16% 93%;--text-secondary: 36 8% 68%;--text-tertiary: 34 6% 50%;--text-disabled: 30 5% 34%;--text-inverse: 150 8% 10%;--border-subtle: 150 6% 16%;--border-default: 150 5% 22%;--border-strong: 150 4% 34%;--success: var(--brand-h) var(--brand-s) var(--brand-l);--success-subtle: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .14;--success-surface: var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 14%) / .24;--warning: 34 82% 62%;--danger: 2 70% 64%;--danger-deep: 2 80% 76%;--info: 202 54% 62%;--accent-terra: 13 56% 62%;--accent-terra-subtle: 13 56% 62% / .14;--accent-terra-deep: 13 52% 56%;--accent-blue: 210 92% 68%;--accent-blue-subtle: 210 92% 68% / .18;--accent-blue-deep: 209 100% 78%;--accent-blue-border: 210 92% 72% / .44;--accent-cream: 38 30% 26%;--accent-cream-warm: 38 22% 18%;--accent-cream-deep: 38 26% 32%;--accent-highlight: 55 96% 70%;--accent-ink: 32 13% 8%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .2);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .3), 0 1px 2px -1px hsl(0 0% 0% / .24);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .34), 0 2px 4px -2px hsl(0 0% 0% / .2);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .38), 0 4px 6px -4px hsl(0 0% 0% / .24);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .44), 0 8px 10px -6px hsl(0 0% 0% / .28);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .16);--shadow-brand: 0 2px 8px hsl(var(--brand-h) calc(var(--brand-s) - 60%) calc(var(--brand-l) - 24%) / .44), 0 6px 20px hsl(0 0% 0% / .32);--grid-line: 150 6% 14%}*{border-color:hsl(var(--border-default))}html{font-family:var(--font-sans),ui-sans-serif,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-feature-settings:"cv11","ss01","ss03";background-color:hsl(var(--surface-0))}body{margin:0;min-height:100vh;color:hsl(var(--text-primary));background-color:hsl(var(--surface-0))}::-moz-selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}::selection{background-color:hsl(var(--brand-h) calc(var(--brand-s) + 6%) calc(var(--brand-l) + 16%) / .22);color:hsl(var(--text-primary))}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:"ss01","ss02","cv11"}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border-strong) / .52);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:hsl(var(--border-strong) / .9);background-clip:padding-box;border:2px solid transparent}.app-canvas,.grid-canvas{background-color:hsl(var(--surface-0))}.onboarding-canvas{word-break:keep-all;overflow-wrap:break-word;--surface-0: var(--brand-h) var(--brand-s) var(--brand-l);--surface-1: 0 0% 100%;--surface-2: var(--brand-h) 62% 28%;--surface-3: var(--brand-h) 60% 25%;--surface-inset: var(--brand-h) 62% 28%;--text-primary: 0 0% 100%;--text-secondary: var(--brand-h) 46% 90%;--text-tertiary: var(--brand-h) 34% 84%;--text-disabled: var(--brand-h) 20% 72%;--border-subtle: var(--brand-h) 44% 52%;--border-default: var(--brand-h) 40% 58%;--border-strong: var(--brand-h) 36% 70%;--border-focus: 0 0% 100%;--brand-hsl: 0 0% 100%;--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) 24% 94%);--brand-active: hsl(var(--brand-h) 20% 88%);--brand-fg: hsl(var(--brand-h) var(--brand-s) 24%);--brand-ring: hsl(0 0% 100% / .4);--danger: 6 96% 86%;--danger-subtle: 6 96% 86% / .18;--danger-deep: 6 96% 92%;--warning: 42 96% 82%;--warning-subtle: 42 96% 82% / .18}.onboarding-canvas .bg-surface-1,.onboarding-canvas input,.onboarding-canvas textarea,.onboarding-canvas [role=combobox]{--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 42%;--surface-2: 144 8% 96%;--surface-inset: 144 6% 95%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--brand-hsl: var(--brand-h) var(--brand-s) var(--brand-l);--brand: hsl(var(--brand-hsl));--brand-hover: hsl(var(--brand-h) calc(var(--brand-s) + 3%) calc(var(--brand-l) - 4%));--brand-active: hsl(var(--brand-h) calc(var(--brand-s) + 2%) calc(var(--brand-l) - 8%));--brand-fg: hsl(0 0% 100%);--brand-ring: hsl(var(--brand-h) calc(var(--brand-s) + 12%) calc(var(--brand-l) + 10%) / .22)}@keyframes onboarding-step-in{0%{opacity:0;transform:translate(96px)}to{opacity:1;transform:translate(0)}}.onboarding-step-in{animation:onboarding-step-in var(--duration-slow) var(--ease-out) forwards}@keyframes onboarding-enter-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.onboarding-enter{position:fixed;top:0;right:0;bottom:0;left:0;overflow-x:hidden;overflow-y:auto;animation:onboarding-enter-up var(--duration-base) var(--ease-out) forwards}body:has(.onboarding-canvas){background-color:hsl(var(--brand-h) var(--brand-s) var(--brand-l))}.panel-shell,.surface-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-sm)}.panel-shell-muted,.surface-shell-muted{background:hsl(var(--surface-2));box-shadow:var(--shadow-xs)}.panel-shell-subtle{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.panel-shell-elevated{border:1px solid hsl(var(--border-default));border-radius:var(--radius-xl);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.utility-chip,.floating-chip{display:inline-flex;align-items:center;gap:8px;border:1px solid hsl(var(--border-default));border-radius:var(--radius-pill);background:hsl(var(--surface-1));box-shadow:var(--shadow-xs)}.hairline{border-bottom:1px solid hsl(var(--border-subtle))}.mono-label{font-family:var(--font-mono),ui-monospace,monospace;font-size:11px;text-transform:uppercase;color:hsl(var(--text-tertiary))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,:host{--font-sans: "Pretendard", -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-mono: var(--font-sans);--issue-marker-expand-duration: .52s;--surface-0: 0 0% 99%;--surface-1: 0 0% 100%;--surface-2: 144 8% 96%;--surface-3: 144 6% 93%;--surface-inset: 144 6% 95%;--overlay-backdrop: hsl(0 0% 0% / .24);--overlay-backdrop-strong: hsl(0 0% 0% / .48);--text-primary: 150 10% 12%;--text-secondary: 148 6% 36%;--text-tertiary: 145 5% 52%;--text-disabled: 145 4% 70%;--border-subtle: 144 8% 91%;--border-default: 144 6% 85%;--border-strong: 144 5% 72%;--grid-line: 0 0% 92%;--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / .04);--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / .06), 0 1px 2px -1px hsl(0 0% 0% / .06);--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / .06), 0 2px 4px -2px hsl(0 0% 0% / .04);--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / .06), 0 4px 6px -4px hsl(0 0% 0% / .04);--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / .06), 0 8px 10px -6px hsl(0 0% 0% / .04);--shadow-focus: 0 0 0 4px var(--brand-ring);--shadow-inset: inset 0 1px 2px 0 hsl(0 0% 0% / .04)}*{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}#issue-sticker-shadow-root{all:initial;display:block;background-color:transparent;--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1));font-family:var(--font-sans);line-height:1.5}.\\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-1{left:4px;right:4px}.inset-y-0{top:0;bottom:0}.-bottom-px{bottom:-1px}.bottom-0{bottom:0}.bottom-4{bottom:16px}.bottom-6{bottom:24px}.left-0{left:0}.left-1\\/2{left:50%}.left-2{left:8px}.left-4{left:16px}.left-\\[50\\%\\]{left:50%}.right-0{right:0}.right-2{right:8px}.right-3{right:12px}.right-4{right:16px}.right-5{right:20px}.right-6{right:24px}.top-0{top:0}.top-1{top:4px}.top-1\\/2{top:50%}.top-2{top:8px}.top-3{top:12px}.top-4{top:16px}.top-5{top:20px}.top-\\[50\\%\\]{top:50%}.top-\\[calc\\(\\(3\\.5rem-1\\.75rem\\)\\/2\\)\\]{top:14px}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-\\[1000000\\]{z-index:1000000}.z-\\[1000003\\]{z-index:1000003}.z-\\[1000004\\]{z-index:1000004}.z-\\[1000005\\]{z-index:1000005}.z-\\[1000006\\]{z-index:1000006}.z-\\[1000007\\]{z-index:1000007}.z-\\[1000008\\]{z-index:1000008}.z-\\[1000010\\]{z-index:1000010}.z-\\[1000011\\]{z-index:1000011}.z-\\[10001\\]{z-index:10001}.z-\\[999999\\]{z-index:999999}.z-\\[9999\\]{z-index:9999}.m-0{margin:0}.-mx-2{margin-left:-8px;margin-right:-8px}.mx-3{margin-left:12px;margin-right:12px}.my-1{margin-top:4px;margin-bottom:4px}.my-2{margin-top:8px;margin-bottom:8px}.my-2\\.5{margin-top:10px;margin-bottom:10px}.my-3{margin-top:12px;margin-bottom:12px}.my-4{margin-top:16px;margin-bottom:16px}.mb-0\\.5{margin-bottom:2px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-5{margin-bottom:20px}.ml-0\\.5{margin-left:2px}.ml-4{margin-left:16px}.mr-1\\.5{margin-right:6px}.mt-0{margin-top:0}.mt-0\\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.\\!h-auto{height:auto!important}.h-1\\.5{height:6px}.h-10{height:40px}.h-11{height:44px}.h-2{height:8px}.h-24{height:96px}.h-3{height:12px}.h-3\\.5{height:14px}.h-4{height:16px}.h-5{height:20px}.h-6{height:24px}.h-7{height:28px}.h-8{height:32px}.h-9{height:36px}.h-\\[1\\.4rem\\]{height:22.4px}.h-\\[100vh\\]{height:100vh}.h-\\[18px\\]{height:18px}.h-\\[220px\\]{height:220px}.h-\\[22px\\]{height:22px}.h-\\[30px\\]{height:30px}.h-\\[min\\(36vh\\,320px\\)\\]{height:min(36vh,320px)}.h-\\[min\\(480px\\,calc\\(100vh-64px\\)\\)\\]{height:min(480px,calc(100vh - 64px))}.h-\\[min\\(54vh\\,520px\\)\\]{height:min(54vh,520px)}.h-\\[min\\(560px\\,calc\\(100vh-32px\\)\\)\\]{height:min(560px,calc(100vh - 32px))}.h-\\[var\\(--issue-sticker-size\\)\\]{height:var(--issue-sticker-size)}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-24{max-height:96px}.max-h-40{max-height:160px}.max-h-56{max-height:224px}.max-h-80{max-height:320px}.max-h-96{max-height:384px}.max-h-\\[150px\\]{max-height:150px}.max-h-\\[220px\\]{max-height:220px}.max-h-\\[320px\\]{max-height:320px}.max-h-\\[420px\\]{max-height:420px}.max-h-\\[90vh\\]{max-height:90vh}.max-h-\\[calc\\(100vh-3rem\\)\\]{max-height:calc(100vh - 48px)}.max-h-\\[min\\(80vh\\,640px\\)\\]{max-height:min(80vh,640px)}.min-h-0{min-height:0px}.min-h-11{min-height:44px}.min-h-\\[108px\\]{min-height:108px}.min-h-\\[120px\\]{min-height:120px}.min-h-\\[140px\\]{min-height:140px}.min-h-\\[220px\\]{min-height:220px}.w-0\\.5{width:2px}.w-1{width:4px}.w-1\\.5{width:6px}.w-1\\/2{width:50%}.w-10{width:40px}.w-12{width:48px}.w-14{width:56px}.w-16{width:64px}.w-2{width:8px}.w-3{width:12px}.w-3\\.5{width:14px}.w-4{width:16px}.w-5{width:20px}.w-6{width:24px}.w-7{width:28px}.w-72{width:288px}.w-8{width:32px}.w-80{width:320px}.w-9{width:36px}.w-\\[1\\.4rem\\]{width:22.4px}.w-\\[18px\\]{width:18px}.w-\\[22\\.5rem\\]{width:360px}.w-\\[22rem\\]{width:352px}.w-\\[30px\\]{width:30px}.w-\\[38px\\]{width:38px}.w-\\[calc\\(100vw-32px\\)\\]{width:calc(100vw - 32px)}.w-\\[min\\(20rem\\,calc\\(100vw_-_1\\.5rem\\)\\)\\]{width:min(320px,calc(100vw - 24px))}.w-\\[min\\(560px\\,calc\\(100vw-32px\\)\\)\\]{width:min(560px,calc(100vw - 32px))}.w-\\[var\\(--radix-popover-trigger-width\\)\\]{width:var(--radix-popover-trigger-width)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0px}.min-w-9{min-width:36px}.min-w-\\[12rem\\]{min-width:192px}.min-w-\\[200px\\]{min-width:200px}.min-w-\\[var\\(--radix-popover-trigger-width\\)\\]{min-width:var(--radix-popover-trigger-width)}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.max-w-\\[10rem\\]{max-width:160px}.max-w-\\[120px\\]{max-width:120px}.max-w-\\[160px\\]{max-width:160px}.max-w-\\[280px\\]{max-width:280px}.max-w-\\[28rem\\]{max-width:448px}.max-w-\\[300px\\]{max-width:300px}.max-w-\\[360px\\]{max-width:360px}.max-w-\\[36rem\\]{max-width:576px}.max-w-\\[400px\\]{max-width:400px}.max-w-\\[420px\\]{max-width:420px}.max-w-\\[428px\\]{max-width:428px}.max-w-\\[480px\\]{max-width:480px}.max-w-\\[62ch\\]{max-width:62ch}.max-w-\\[640px\\]{max-width:640px}.max-w-\\[70ch\\]{max-width:70ch}.max-w-\\[90vw\\]{max-width:90vw}.max-w-\\[960px\\]{max-width:960px}.max-w-\\[calc\\(100vw-24px\\)\\]{max-width:calc(100vw - 24px)}.max-w-\\[var\\(--issue-sticker-size\\)\\]{max-width:var(--issue-sticker-size)}.max-w-full{max-width:100%}.max-w-md{max-width:448px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1{--tw-translate-x: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[-50\\%\\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[18px\\]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[2px\\]{--tw-translate-x: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\\[-50\\%\\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse-ring{0%,to{box-shadow:0 0 0 0 var(--brand-ring)}50%{box-shadow:0 0 0 8px transparent}}.animate-pulse-ring{animation:pulse-ring 1.8s var(--ease-in-out) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\\.5{gap:2px}.gap-1{gap:4px}.gap-1\\.5{gap:6px}.gap-2{gap:8px}.gap-2\\.5{gap:10px}.gap-3{gap:12px}.gap-3\\.5{gap:14px}.gap-4{gap:16px}.gap-5{gap:20px}.gap-6{gap:24px}.gap-x-5{-moz-column-gap:20px;column-gap:20px}.gap-y-2{row-gap:8px}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(6px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(20px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20px * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(24px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-line-subtle>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.\\!rounded-none{border-radius:0!important}.rounded{border-radius:4px}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\[18px\\]{border-radius:18px}.rounded-\\[20px\\]{border-radius:20px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-dashed{border-style:dashed}.border-\\[hsl\\(144_8\\%_91\\%\\)\\]{--tw-border-opacity: 1;border-color:hsl(144 8% 91% / var(--tw-border-opacity, 1))}.border-brand{--tw-border-opacity: 1;border-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.border-brand-border{border-color:var(--brand-border)}.border-brand\\/30{border-color:hsl(var(--brand-hsl) / .3)}.border-brand\\/40{border-color:hsl(var(--brand-hsl) / .4)}.border-danger\\/20{border-color:hsl(var(--danger) / .2)}.border-danger\\/30{border-color:hsl(var(--danger) / .3)}.border-info\\/20{border-color:hsl(var(--info) / .2)}.border-info\\/30{border-color:hsl(var(--info) / .3)}.border-line{--tw-border-opacity: 1;border-color:hsl(var(--border-default) / var(--tw-border-opacity, 1))}.border-line-focus{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.border-line-strong{--tw-border-opacity: 1;border-color:hsl(var(--border-strong) / var(--tw-border-opacity, 1))}.border-line-subtle{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.border-line-subtle\\/50{border-color:hsl(var(--border-subtle) / .5)}.border-line-subtle\\/90{border-color:hsl(var(--border-subtle) / .9)}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-success{--tw-border-opacity: 1;border-color:hsl(var(--success) / var(--tw-border-opacity, 1))}.border-success\\/20{border-color:hsl(var(--success) / .2)}.border-success\\/30{border-color:hsl(var(--success) / .3)}.border-text-primary{--tw-border-opacity: 1;border-color:hsl(var(--text-primary) / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-warning\\/20{border-color:hsl(var(--warning) / .2)}.border-warning\\/30{border-color:hsl(var(--warning) / .3)}.border-white\\/70{border-color:#ffffffb3}.border-white\\/80{border-color:#fffc}.border-white\\/90{border-color:#ffffffe6}.border-l-brand{--tw-border-opacity: 1;border-left-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.\\!bg-success-surface{background-color:hsl(var(--success-surface))!important}.bg-\\[var\\(--overlay-backdrop-strong\\)\\]{background-color:var(--overlay-backdrop-strong)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\\/10{background-color:#0000001a}.bg-black\\/40{background-color:#0006}.bg-black\\/80{background-color:#000c}.bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.bg-brand-subtle{background-color:var(--brand-subtle)}.bg-brand\\/10{background-color:hsl(var(--brand-hsl) / .1)}.bg-brand\\/5{background-color:hsl(var(--brand-hsl) / .05)}.bg-danger{--tw-bg-opacity: 1;background-color:hsl(var(--danger) / var(--tw-bg-opacity, 1))}.bg-danger-subtle{background-color:hsl(var(--danger-subtle))}.bg-danger\\/10{background-color:hsl(var(--danger) / .1)}.bg-info-subtle{background-color:hsl(var(--info-subtle))}.bg-line{--tw-bg-opacity: 1;background-color:hsl(var(--border-default) / var(--tw-bg-opacity, 1))}.bg-line-subtle{--tw-bg-opacity: 1;background-color:hsl(var(--border-subtle) / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:hsl(var(--success) / var(--tw-bg-opacity, 1))}.bg-success-subtle{background-color:hsl(var(--success-subtle))}.bg-success-surface{background-color:hsl(var(--success-surface))}.bg-surface-0{--tw-bg-opacity: 1;background-color:hsl(var(--surface-0) / var(--tw-bg-opacity, 1))}.bg-surface-1{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.bg-surface-2{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.bg-surface-3{--tw-bg-opacity: 1;background-color:hsl(var(--surface-3) / var(--tw-bg-opacity, 1))}.bg-surface-inset{--tw-bg-opacity: 1;background-color:hsl(var(--surface-inset) / var(--tw-bg-opacity, 1))}.bg-text-primary{--tw-bg-opacity: 1;background-color:hsl(var(--text-primary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:hsl(var(--text-tertiary) / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:hsl(var(--warning) / var(--tw-bg-opacity, 1))}.bg-warning-subtle{background-color:hsl(var(--warning-subtle))}.bg-warning\\/10{background-color:hsl(var(--warning) / .1)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\\/10{background-color:#ffffff1a}.bg-white\\/25{background-color:#ffffff40}.fill-text-primary{fill:hsl(var(--text-primary) / 1)}.stroke-\\[3\\]{stroke-width:3}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.\\!p-0{padding:0!important}.p-0{padding:0}.p-0\\.5{padding:2px}.p-1{padding:4px}.p-1\\.5{padding:6px}.p-2{padding:8px}.p-3{padding:12px}.p-3\\.5{padding:14px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.p-7{padding:28px}.p-8{padding:32px}.p-\\[18px\\]{padding:18px}.px-0{padding-left:0;padding-right:0}.px-1\\.5{padding-left:6px;padding-right:6px}.px-2{padding-left:8px;padding-right:8px}.px-2\\.5{padding-left:10px;padding-right:10px}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.px-6{padding-left:24px;padding-right:24px}.px-9{padding-left:36px;padding-right:36px}.py-0\\.5{padding-top:2px;padding-bottom:2px}.py-1{padding-top:4px;padding-bottom:4px}.py-1\\.5{padding-top:6px;padding-bottom:6px}.py-10{padding-top:40px;padding-bottom:40px}.py-16{padding-top:64px;padding-bottom:64px}.py-2{padding-top:8px;padding-bottom:8px}.py-2\\.5{padding-top:10px;padding-bottom:10px}.py-3{padding-top:12px;padding-bottom:12px}.py-3\\.5{padding-top:14px;padding-bottom:14px}.py-4{padding-top:16px;padding-bottom:16px}.py-5{padding-top:20px;padding-bottom:20px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:32px;padding-bottom:32px}.pb-1{padding-bottom:4px}.pb-3{padding-bottom:12px}.pb-4{padding-bottom:16px}.pl-3{padding-left:12px}.pl-4{padding-left:16px}.pl-5{padding-left:20px}.pl-8{padding-left:32px}.pr-10{padding-right:40px}.pr-3{padding-right:12px}.pr-4{padding-right:16px}.pt-0{padding-top:0}.pt-1{padding-top:4px}.pt-2\\.5{padding-top:10px}.pt-4{padding-top:16px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-display{font-family:var(--font-display),ui-sans-serif,system-ui,sans-serif}.font-mono{font-family:var(--font-mono),ui-monospace,SFMono-Regular,Menlo,monospace}.font-sans{font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif}.text-2xs{font-size:clamp(10.5px,10.19px + .082vw,11.5px);line-height:1.333}.text-\\[0\\.72rem\\]{font-size:11.52px}.text-\\[1\\.45rem\\]{font-size:23.2px}.text-\\[1\\.75rem\\]{font-size:28px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-base{font-size:clamp(14px,13.39px + .163vw,16px);line-height:1.5}.text-lg{font-size:clamp(17px,16.39px + .163vw,19px);line-height:1.471}.text-sm{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.text-xl{font-size:clamp(20px,19.08px + .245vw,23px);line-height:1.45}.text-xs{font-size:clamp(12px,11.69px + .082vw,13px);line-height:1.333}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:16px}.leading-5{line-height:20px}.leading-8{line-height:32px}.leading-\\[1\\.55\\]{line-height:1.55}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.text-\\[hsl\\(145_5\\%_42\\%\\)\\]{--tw-text-opacity: 1;color:hsl(145 5% 42% / var(--tw-text-opacity, 1))}.text-brand{--tw-text-opacity: 1;color:hsl(var(--brand-hsl) / var(--tw-text-opacity, 1))}.text-brand-fg{color:var(--brand-fg)}.text-brand\\/50{color:hsl(var(--brand-hsl) / .5)}.text-danger{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.text-danger\\/80{color:hsl(var(--danger) / .8)}.text-info{--tw-text-opacity: 1;color:hsl(var(--info) / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:hsl(var(--success) / var(--tw-text-opacity, 1))}.text-text-disabled{--tw-text-opacity: 1;color:hsl(var(--text-disabled) / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:hsl(var(--text-inverse) / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-warning{--tw-text-opacity: 1;color:hsl(var(--warning) / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\\/90{color:#ffffffe6}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-brand{accent-color:hsl(var(--brand-hsl) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.\\!shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1) !important;--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_24px_70px_-28px_rgba\\(16\\,24\\,18\\,0\\.45\\)\\]{--tw-shadow: 0 24px 70px -28px rgba(16,24,18,.45);--tw-shadow-colored: 0 24px 70px -28px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--shadow-lg);--tw-shadow-colored: var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--shadow-md);--tw-shadow-colored: var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: var(--shadow-xl);--tw-shadow-colored: var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xs{--tw-shadow: var(--shadow-xs);--tw-shadow-colored: var(--shadow-xs);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-2{outline-width:2px}.outline-offset-0{outline-offset:0px}.outline-transparent{outline-color:transparent}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-brand{--tw-ring-opacity: 1;--tw-ring-color: hsl(var(--brand-hsl) / var(--tw-ring-opacity, 1))}.ring-brand-subtle{--tw-ring-color: var(--brand-subtle)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,border-color\\,color\\,box-shadow\\]{transition-property:background-color,border-color,color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,border-color\\,box-shadow\\,opacity\\]{transition-property:background-color,color,border-color,box-shadow,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,border-color\\,box-shadow\\]{transition-property:background-color,color,border-color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\,box-shadow\\]{transition-property:background-color,color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[background-color\\,color\\]{transition-property:background-color,color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[border-color\\,box-shadow\\,background-color\\]{transition-property:border-color,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[border-color\\,outline-color\\,box-shadow\\,background-color\\,transform\\]{transition-property:border-color,outline-color,box-shadow,background-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[max-width\\,height\\,box-shadow\\,background-color\\,border-color\\,transform\\,opacity\\]{transition-property:max-width,height,box-shadow,background-color,border-color,transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[max-width\\]{transition-property:max-width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-\\[var\\(--issue-marker-expand-duration\\)\\]{transition-duration:var(--issue-marker-expand-duration)}.duration-fast{transition-duration:var(--duration-fast)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:var(--ease-in-out)}.ease-out{transition-timing-function:var(--ease-out)}@keyframes float-gentle{0%,to{transform:translateY(0)}50%{transform:translateY(-2px)}}@keyframes toast-slide{0%{opacity:0;transform:translateY(-14px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gradient-shift{0%,to{background-position:0% 50%}50%{background-position:100% 50%}}.issue-overlay-shell{border:1px solid hsl(var(--border-subtle));border-radius:var(--radius-lg);background:hsl(var(--surface-1));box-shadow:var(--shadow-md)}.issue-marker-breathe{animation:float-gentle 4.8s var(--ease-in-out) infinite}.issue-marker-breathe:hover,.issue-marker-breathe:focus-visible,.issue-marker-breathe:focus-within{animation-play-state:paused}.\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}.marker\\:text-text-tertiary *::marker{color:hsl(var(--text-tertiary))}.marker\\:text-text-tertiary::marker{color:hsl(var(--text-tertiary))}.file\\:border-0::file-selector-button{border-width:0px}.file\\:bg-transparent::file-selector-button{background-color:transparent}.file\\:text-sm::file-selector-button{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.file\\:font-medium::file-selector-button{font-weight:500}.file\\:text-text-primary::file-selector-button{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.placeholder\\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.first\\:mt-0:first-child{margin-top:0}.first\\:border-t-0:first-child{border-top-width:0px}.first\\:pt-0:first-child{padding-top:0}.focus-within\\:z-\\[10001\\]:focus-within{z-index:10001}.focus-within\\:border-line-focus:focus-within{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.hover\\:z-\\[10001\\]:hover{z-index:10001}.hover\\:border-line:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-default) / var(--tw-border-opacity, 1))}.hover\\:border-line-strong:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-strong) / var(--tw-border-opacity, 1))}.hover\\:border-line-subtle:hover{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.hover\\:bg-\\[hsl\\(144_8\\%_96\\%\\)\\]:hover{--tw-bg-opacity: 1;background-color:hsl(144 8% 96% / var(--tw-bg-opacity, 1))}.hover\\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\\:bg-brand-hover:hover{background-color:var(--brand-hover)}.hover\\:bg-brand\\/40:hover{background-color:hsl(var(--brand-hsl) / .4)}.hover\\:bg-danger-subtle:hover{background-color:hsl(var(--danger-subtle))}.hover\\:bg-danger\\/10:hover{background-color:hsl(var(--danger) / .1)}.hover\\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-2:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-2\\/60:hover{background-color:hsl(var(--surface-2) / .6)}.hover\\:bg-surface-3:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-3) / var(--tw-bg-opacity, 1))}.hover\\:bg-surface-inset:hover{--tw-bg-opacity: 1;background-color:hsl(var(--surface-inset) / var(--tw-bg-opacity, 1))}.hover\\:bg-transparent:hover{background-color:transparent}.hover\\:bg-white\\/20:hover{background-color:#fff3}.hover\\:text-\\[hsl\\(150_10\\%_12\\%\\)\\]:hover{--tw-text-opacity: 1;color:hsl(150 10% 12% / var(--tw-text-opacity, 1))}.hover\\:text-brand-hover:hover{color:var(--brand-hover)}.hover\\:text-danger:hover{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.hover\\:text-slate-900:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.hover\\:text-text-primary:hover{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.hover\\:text-text-secondary:hover{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-90:hover{opacity:.9}.focus\\:border-brand:focus{--tw-border-opacity: 1;border-color:hsl(var(--brand-hsl) / var(--tw-border-opacity, 1))}.focus\\:bg-surface-2:focus{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.focus\\:text-text-primary:focus{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:h-\\[var\\(--issue-sticker-hover-size\\)\\]:focus-visible{height:var(--issue-sticker-hover-size)}.focus-visible\\:max-w-\\[160px\\]:focus-visible{max-width:160px}.focus-visible\\:max-w-\\[480px\\]:focus-visible{max-width:480px}.focus-visible\\:border-line-focus:focus-visible{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.focus-visible\\:border-transparent:focus-visible{border-color:transparent}.focus-visible\\:bg-slate-50:focus-visible{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.focus-visible\\:bg-surface-1:focus-visible{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.focus-visible\\:bg-surface-2:focus-visible{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.focus-visible\\:text-text-primary:focus-visible{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.focus-visible\\:shadow-focus:focus-visible{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:outline-line-focus:focus-visible{outline-color:hsl(var(--border-focus) / 1)}.focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-4:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-brand-subtle:focus-visible{--tw-ring-color: var(--brand-subtle)}.focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color: rgb(255 255 255 / .4)}.active\\:bg-brand-active:active{background-color:var(--brand-active)}.active\\:bg-brand\\/60:active{background-color:hsl(var(--brand-hsl) / .6)}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}.group\\/marker:hover .group-hover\\/marker\\:h-\\[var\\(--issue-sticker-hover-size\\)\\]{height:var(--issue-sticker-hover-size)}.group\\/marker:hover .group-hover\\/marker\\:max-w-\\[160px\\]{max-width:160px}.group\\/marker:hover .group-hover\\/marker\\:max-w-\\[480px\\]{max-width:480px}.group\\/marker:hover .group-hover\\/marker\\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\\/marker:hover .group-hover\\/marker\\:bg-brand-hover{background-color:var(--brand-hover)}.group\\/marker:hover .group-hover\\/marker\\:opacity-100{opacity:1}.group\\/marker:hover .group-hover\\/marker\\:shadow-xl{--tw-shadow: var(--shadow-xl);--tw-shadow-colored: var(--shadow-xl);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group:focus-visible .group-focus-visible\\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:focus-visible .group-focus-visible\\:opacity-100{opacity:1}.group.toaster .group-\\[\\.toaster\\]\\:isolate{isolation:isolate}.group.toast .group-\\[\\.toast\\]\\:rounded-md,.group.toaster .group-\\[\\.toaster\\]\\:rounded-md{border-radius:var(--radius-md)}.group.toaster .group-\\[\\.toaster\\]\\:border{border-width:1px}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-danger\\/30{border-color:hsl(var(--danger) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-info\\/30{border-color:hsl(var(--info) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-success\\/30{border-color:hsl(var(--success) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!border-warning\\/30{border-color:hsl(var(--warning) / .3)!important}.group.toaster .group-\\[\\.toaster\\]\\:border-line-subtle{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:bg-surface-2{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-danger-subtle{background-color:hsl(var(--danger-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-info-subtle{background-color:hsl(var(--info-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-success-surface{background-color:hsl(var(--success-surface))!important}.group.toaster .group-\\[\\.toaster\\]\\:\\!bg-warning-subtle{background-color:hsl(var(--warning-subtle))!important}.group.toaster .group-\\[\\.toaster\\]\\:bg-surface-1{--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:px-4{padding-left:16px;padding-right:16px}.group.toaster .group-\\[\\.toaster\\]\\:py-3{padding-top:12px;padding-bottom:12px}.group.toast .group-\\[\\.toast\\]\\:text-sm{font-size:clamp(13px,12.54px + .122vw,14.5px);line-height:1.462}.group.toast .group-\\[\\.toast\\]\\:text-xs{font-size:clamp(12px,11.69px + .082vw,13px);line-height:1.333}.group.toast .group-\\[\\.toast\\]\\:font-medium{font-weight:500}.group.toast .group-\\[\\.toast\\]\\:text-brand-fg{color:var(--brand-fg)}.group.toast .group-\\[\\.toast\\]\\:text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.group.toast .group-\\[\\.toast\\]\\:text-text-secondary{--tw-text-opacity: 1;color:hsl(var(--text-secondary) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:text-text-primary{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:shadow-sm{--tw-shadow: var(--shadow-sm);--tw-shadow-colored: var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group.toaster .group-\\[\\.toaster\\]\\:before\\:absolute:before{content:var(--tw-content);position:absolute}.group.toaster .group-\\[\\.toaster\\]\\:before\\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.group.toaster .group-\\[\\.toaster\\]\\:before\\:-z-10:before{content:var(--tw-content);z-index:-10}.group.toaster .group-\\[\\.toaster\\]\\:before\\:rounded-md:before{content:var(--tw-content);border-radius:var(--radius-md)}.group.toaster .group-\\[\\.toaster\\]\\:before\\:bg-surface-1:before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:hsl(var(--surface-1) / var(--tw-bg-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:before\\:content-\\[\\'\\'\\]:before{--tw-content: "";content:var(--tw-content)}.peer:focus-visible~.peer-focus-visible\\:shadow-focus{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer:disabled~.peer-disabled\\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\\:opacity-60{opacity:.6}.aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\\:opacity-40[aria-disabled=true]{opacity:.4}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}@keyframes dialog-out{0%{opacity:1;transform:translate(-50%,-50%) scale(1)}to{opacity:0;transform:translate(-50%,calc(-50% + 8px)) scale(.985)}}.data-\\[state\\=closed\\]\\:animate-dialog-out[data-state=closed]{animation:dialog-out var(--duration-out) var(--ease-out) forwards}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.data-\\[state\\=closed\\]\\:animate-fade-out[data-state=closed]{animation:fade-out var(--duration-out) var(--ease-out) forwards}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.97)}}.data-\\[state\\=closed\\]\\:animate-scale-out[data-state=closed]{animation:scale-out var(--duration-out) var(--ease-out) forwards}@keyframes sheet-out-left{0%{transform:translate(0)}to{transform:translate(-100%);opacity:.6}}.data-\\[state\\=closed\\]\\:animate-sheet-out-left[data-state=closed]{animation:sheet-out-left var(--duration-base) var(--ease-out) forwards}@keyframes sheet-out-right{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:.6}}.data-\\[state\\=closed\\]\\:animate-sheet-out-right[data-state=closed]{animation:sheet-out-right var(--duration-base) var(--ease-out) forwards}.data-\\[state\\=delayed-open\\]\\:animate-scale-in[data-state=delayed-open]{animation:scale-in var(--duration-base) var(--ease-out) forwards}@keyframes dialog-in{0%{opacity:0;transform:translate(-50%,calc(-50% + 12px)) scale(.985)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.data-\\[state\\=open\\]\\:animate-dialog-in[data-state=open]{animation:dialog-in var(--duration-base) var(--ease-out) forwards}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.data-\\[state\\=open\\]\\:animate-fade-in[data-state=open]{animation:fade-in var(--duration-base) var(--ease-out) forwards}@keyframes scale-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.data-\\[state\\=open\\]\\:animate-scale-in[data-state=open]{animation:scale-in var(--duration-base) var(--ease-out) forwards}@keyframes sheet-in-left{0%{transform:translate(-100%);opacity:.6}to{transform:translate(0);opacity:1}}.data-\\[state\\=open\\]\\:animate-sheet-in-left[data-state=open]{animation:sheet-in-left var(--duration-base) var(--ease-out) forwards}@keyframes sheet-in-right{0%{transform:translate(100%);opacity:.6}to{transform:translate(0)}}.data-\\[state\\=open\\]\\:animate-sheet-in-right[data-state=open]{animation:sheet-in-right var(--duration-base) var(--ease-out) forwards}.data-\\[range-end\\=true\\]\\:rounded-md[data-range-end=true]{border-radius:var(--radius-md)}.data-\\[range-middle\\=true\\]\\:rounded-none[data-range-middle=true]{border-radius:0}.data-\\[range-start\\=true\\]\\:rounded-md[data-range-start=true]{border-radius:var(--radius-md)}.data-\\[state\\=open\\]\\:border-line-focus[data-state=open]{--tw-border-opacity: 1;border-color:hsl(var(--border-focus) / var(--tw-border-opacity, 1))}.data-\\[highlighted\\]\\:bg-surface-2[data-highlighted]{--tw-bg-opacity: 1;background-color:hsl(var(--surface-2) / var(--tw-bg-opacity, 1))}.data-\\[range-end\\=true\\]\\:bg-brand[data-range-end=true]{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.data-\\[range-middle\\=true\\]\\:bg-transparent[data-range-middle=true]{background-color:transparent}.data-\\[range-start\\=true\\]\\:bg-brand[data-range-start=true],.data-\\[selected-single\\=true\\]\\:bg-brand[data-selected-single=true]{--tw-bg-opacity: 1;background-color:hsl(var(--brand-hsl) / var(--tw-bg-opacity, 1))}.data-\\[state\\=selected\\]\\:bg-brand-subtle[data-state=selected]{background-color:var(--brand-subtle)}.data-\\[today\\=true\\]\\:font-semibold[data-today=true]{font-weight:600}.data-\\[highlighted\\]\\:text-text-primary[data-highlighted]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[placeholder\\]\\:text-text-tertiary[data-placeholder]{--tw-text-opacity: 1;color:hsl(var(--text-tertiary) / var(--tw-text-opacity, 1))}.data-\\[range-end\\=true\\]\\:text-brand-fg[data-range-end=true]{color:var(--brand-fg)}.data-\\[range-middle\\=true\\]\\:text-text-primary[data-range-middle=true]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[range-start\\=true\\]\\:text-brand-fg[data-range-start=true],.data-\\[selected-single\\=true\\]\\:text-brand-fg[data-selected-single=true]{color:var(--brand-fg)}.data-\\[state\\=active\\]\\:text-text-primary[data-state=active],.data-\\[state\\=checked\\]\\:text-text-primary[data-state=checked]{--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.data-\\[today\\=true\\]\\:text-brand[data-today=true]{--tw-text-opacity: 1;color:hsl(var(--brand-hsl) / var(--tw-text-opacity, 1))}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[state\\=open\\]\\:shadow-focus[data-state=open]{--tw-shadow: var(--shadow-focus);--tw-shadow-colored: var(--shadow-focus);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\\[range-end\\=true\\]\\:hover\\:bg-brand-hover:hover[data-range-end=true],.data-\\[range-start\\=true\\]\\:hover\\:bg-brand-hover:hover[data-range-start=true],.data-\\[selected-single\\=true\\]\\:hover\\:bg-brand-hover:hover[data-selected-single=true]{background-color:var(--brand-hover)}.data-\\[range-end\\=true\\]\\:hover\\:text-brand-fg:hover[data-range-end=true],.data-\\[range-start\\=true\\]\\:hover\\:text-brand-fg:hover[data-range-start=true],.data-\\[selected-single\\=true\\]\\:hover\\:text-brand-fg:hover[data-selected-single=true]{color:var(--brand-fg)}@media(prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@media(min-width:640px){.sm\\:flex-row{flex-direction:row}.sm\\:items-start{align-items:flex-start}.sm\\:items-center{align-items:center}.sm\\:justify-end{justify-content:flex-end}.sm\\:justify-between{justify-content:space-between}.sm\\:gap-2\\.5{gap:10px}.sm\\:p-5{padding:20px}.sm\\:p-6{padding:24px}.sm\\:text-2xl{font-size:clamp(26px,24.78px + .327vw,30px);line-height:1.308}.sm\\:text-\\[2\\.1rem\\]{font-size:33.6px}}@media(min-width:768px){.md\\:flex{display:flex}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-\\[minmax\\(0\\,1fr\\)_minmax\\(260px\\,340px\\)\\]{grid-template-columns:minmax(0,1fr) minmax(260px,340px)}}.\\[\\&\\>\\*\\:not\\(summary\\)\\]\\:pl-4>*:not(summary){padding-left:16px}.\\[\\&\\>span\\]\\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\\[\\&\\>tr\\]\\:last\\:border-b-0:last-child>tr{border-bottom-width:0px}.\\[\\&\\[data-state\\=open\\]\\>span\\[data-chevron\\]\\]\\:rotate-180[data-state=open]>span[data-chevron]{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-danger [data-icon]{--tw-text-opacity: 1;color:hsl(var(--danger) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-info [data-icon]{--tw-text-opacity: 1;color:hsl(var(--info) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-success [data-icon]{--tw-text-opacity: 1;color:hsl(var(--success) / var(--tw-text-opacity, 1))}.group.toaster .group-\\[\\.toaster\\]\\:\\[\\&_\\[data-icon\\]\\]\\:text-warning [data-icon]{--tw-text-opacity: 1;color:hsl(var(--warning) / var(--tw-text-opacity, 1))}.\\[\\&_tr\\]\\:border-b tr{border-bottom-width:1px}.\\[\\&_tr\\]\\:border-line-subtle tr{--tw-border-opacity: 1;border-color:hsl(var(--border-subtle) / var(--tw-border-opacity, 1))}`;
|
|
38606
39195
|
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}";
|
|
38607
39196
|
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}}`;
|
|
38608
39197
|
const PAGE_STYLE_ID = "issue-sticker-page-style";
|
|
@@ -38638,6 +39227,7 @@ function mountWidget(config) {
|
|
|
38638
39227
|
document.body.appendChild(hostElement);
|
|
38639
39228
|
const shadow = createShadowRoot(hostElement, [globalsCSS, sdkShadowCSS]);
|
|
38640
39229
|
attachHostTypingGuard(shadow.shadowRoot);
|
|
39230
|
+
attachHostPointerGuard(shadow.shadowRoot);
|
|
38641
39231
|
mountContainer = shadow.mountContainer;
|
|
38642
39232
|
mountContainer.style.width = "0";
|
|
38643
39233
|
mountContainer.style.height = "0";
|
|
@@ -38740,6 +39330,14 @@ const IssueSticker = {
|
|
|
38740
39330
|
destroy() {
|
|
38741
39331
|
destroySdkRuntime();
|
|
38742
39332
|
},
|
|
39333
|
+
/**
|
|
39334
|
+
* three.js 렌더러를 스크린샷 캡처에 등록한다. 반환값을 부르면 해제된다.
|
|
39335
|
+
*
|
|
39336
|
+
* 변경이 있을 때만 그리는 앱은 이 등록 없이는 WebGL 화면이 빈 채로 찍힌다.
|
|
39337
|
+
*/
|
|
39338
|
+
registerThree(handle2) {
|
|
39339
|
+
return registerThree(handle2);
|
|
39340
|
+
},
|
|
38743
39341
|
on(event, callback) {
|
|
38744
39342
|
const sdk = SDKManager.getInstance();
|
|
38745
39343
|
if (sdk.isInitialized()) {
|
|
@@ -38834,5 +39432,6 @@ function useIssueSticker(config) {
|
|
|
38834
39432
|
export {
|
|
38835
39433
|
IssueSticker,
|
|
38836
39434
|
IssueSticker as default,
|
|
39435
|
+
registerThree,
|
|
38837
39436
|
useIssueSticker
|
|
38838
39437
|
};
|