issue-sticker 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -3
- package/dist/{externalUserPayload-B7zThnol.js → externalUserPayload-k9LSBeMB.js} +574 -292
- package/dist/issue-sticker-headless-react.js +2 -17
- package/dist/issue-sticker-headless.js +2 -186
- package/dist/issue-sticker-react.js +864 -336
- package/dist/{createLucideIcon-BzRMP02h.js → mouse-pointer-2-BR00y3ir.js} +35 -19
- package/dist/{tooltip-B6UPO-U8.js → tooltip-DH02R32-.js} +1 -1
- package/headless.d.ts +1 -3
- package/package.json +2 -3
|
@@ -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 {
|
|
18
|
+
import { O as OVERLAY_LAYER_INDEX, c as createLucideIcon$1, b as usePortalContainer, a as cn$1, d as OVERLAY_LAYER, s as stopEscapePropagation, P as Presence, e as Primitive, f as composeEventHandlers, g as useDismissableLayerSurface, h as useComposedRefs$1, i as Portal$1, j as createContextScope, k as createSlot, D as DismissableLayer, l as useControllableState, m as useId$1, n as useLayoutEffect2, o as useCallbackRef, p as PortalContainerProvider } from "./mouse-pointer-2-BR00y3ir.js";
|
|
19
|
+
import { y as trimLogBackupPayload, z as createSafeLogBackup, A as getLogBackupSessionId, N as NetworkCollector, C as ConsoleCollector, B as createIndexedDbLogBackup, b as buildJiraCreateFields, P as Popover, D as PopoverTrigger, E as Input, F as PopoverContent, L as Label, G as Select, H as SelectTrigger, J as SelectValue, K as SelectContent, M as SelectItem, O as getJiraMetadata, Q as buildJiraIssueFields, R as Button, T as Root2$2, U as Trigger$2, V as ChevronDown, W as Portal, X as Content2$1, Y as Check, Z as X$1, _ as DatePicker, e as buildNotionCreateFields, $ as getNotionPageMetadata, a0 as buildNotionFieldViews, c as captureWithModernScreenshot, p as pristineFetch, d as directUploadToSignedUrl, a1 as DirectUploadError, a2 as toast, a3 as getSnapshot, a4 as subscribe, a as uploadSignedMediaWithApi, t as sanitizeString, a5 as getRegisteredUploadId, f as buildGuestOwnerQuery, j as devLogger, v as getCurrentPageUrl, a6 as ChevronRight, a7 as ReactRemoveScroll, a8 as hideOthers, a9 as useFocusGuards, aa as FocusScope, ab as getExposedJiraFields, ac as isJiraFieldExposed, ad as normalizeExposedJiraFields, x 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, q as shrinkNetworkLogsToFit, r as measureJsonBytes, i as buildIssueIntegrationsPayload, w as SessionReplayCaptureController, ae as getPrimaryJiraMapping, af as createCollection, ag as useDirection, ah as getPrimaryNotionMapping, ai as buttonVariants, aj as findElementBySelector, ak as findElementByXPath, S as ScreenRecordingController, h as composeIssueFilterGroups, al as OnboardingProvider, am as useOnboardingTarget, an as useOnboardingFlow, ao as PopoverAnchor } from "./externalUserPayload-k9LSBeMB.js";
|
|
19
20
|
import * as React from "react";
|
|
20
|
-
import { useRef, useState, useEffect, useId, useLayoutEffect, useCallback, forwardRef, createElement, createContext, useContext, Component, Suspense, useInsertionEffect, useMemo, Children, isValidElement, Fragment as Fragment$1, useSyncExternalStore } from "react";
|
|
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";
|
|
21
22
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
22
|
-
import { c as createLucideIcon$1, b as usePortalContainer, a as cn$1, O as OVERLAY_LAYER, s as stopEscapePropagation, d as OVERLAY_LAYER_INDEX, P as Presence, e as Primitive, f as composeEventHandlers, g as useDismissableLayerSurface, h as useComposedRefs$1, i as Portal$1, j as createContextScope, k as createSlot, D as DismissableLayer, l as useControllableState, m as useId$1, n as useLayoutEffect2, o as useCallbackRef, p as PortalContainerProvider } from "./createLucideIcon-BzRMP02h.js";
|
|
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-DH02R32-.js";
|
|
26
26
|
function readReleaseMarker() {
|
|
27
27
|
try {
|
|
28
28
|
const g = globalThis.__ISSUE_STICKER_RELEASE__;
|
|
@@ -256,6 +256,86 @@ function createJiraFieldSearchConfig(source) {
|
|
|
256
256
|
return null;
|
|
257
257
|
};
|
|
258
258
|
}
|
|
259
|
+
const ISSUE_STICKER_HOST_ELEMENT_ID = "issue-sticker-host";
|
|
260
|
+
const ISSUE_STICKER_RUNTIME_OWNER_ATTRIBUTE = "data-issue-sticker-runtime";
|
|
261
|
+
const ISSUE_STICKER_EXTENSION_RUNTIME_READY_EVENT = "issue-sticker:extension-runtime-ready";
|
|
262
|
+
const ISSUE_STICKER_RUNTIME_OWNER = {
|
|
263
|
+
extension: "extension",
|
|
264
|
+
sdk: "sdk"
|
|
265
|
+
};
|
|
266
|
+
function resolveDocument(doc) {
|
|
267
|
+
return typeof document === "undefined" ? null : document;
|
|
268
|
+
}
|
|
269
|
+
function getIssueStickerRuntimeHost(doc) {
|
|
270
|
+
var _a;
|
|
271
|
+
return ((_a = resolveDocument()) == null ? void 0 : _a.getElementById(ISSUE_STICKER_HOST_ELEMENT_ID)) ?? null;
|
|
272
|
+
}
|
|
273
|
+
function getIssueStickerRuntimeOwner(element2) {
|
|
274
|
+
const owner = element2 == null ? void 0 : element2.getAttribute(ISSUE_STICKER_RUNTIME_OWNER_ATTRIBUTE);
|
|
275
|
+
if (owner === ISSUE_STICKER_RUNTIME_OWNER.extension || owner === ISSUE_STICKER_RUNTIME_OWNER.sdk) {
|
|
276
|
+
return owner;
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
function markIssueStickerRuntimeHost(element2, owner) {
|
|
281
|
+
element2.setAttribute(ISSUE_STICKER_RUNTIME_OWNER_ATTRIBUTE, owner);
|
|
282
|
+
}
|
|
283
|
+
function createRuntimeHostElement(owner, doc) {
|
|
284
|
+
const targetDocument = resolveDocument();
|
|
285
|
+
if (!targetDocument) {
|
|
286
|
+
throw new Error("createRuntimeHostElement: document 를 찾을 수 없습니다.");
|
|
287
|
+
}
|
|
288
|
+
const hostElement = targetDocument.createElement("div");
|
|
289
|
+
hostElement.id = ISSUE_STICKER_HOST_ELEMENT_ID;
|
|
290
|
+
markIssueStickerRuntimeHost(hostElement, owner);
|
|
291
|
+
hostElement.style.all = "initial";
|
|
292
|
+
const frame2 = {
|
|
293
|
+
position: "fixed",
|
|
294
|
+
top: "0",
|
|
295
|
+
left: "0",
|
|
296
|
+
width: "0",
|
|
297
|
+
height: "0",
|
|
298
|
+
overflow: "visible",
|
|
299
|
+
background: "transparent",
|
|
300
|
+
"pointer-events": "none",
|
|
301
|
+
"z-index": String(OVERLAY_LAYER_INDEX.runtimeHost),
|
|
302
|
+
display: "block",
|
|
303
|
+
isolation: "isolate"
|
|
304
|
+
};
|
|
305
|
+
Object.entries(frame2).forEach(([property, value]) => {
|
|
306
|
+
hostElement.style.setProperty(property, value, "important");
|
|
307
|
+
});
|
|
308
|
+
return hostElement;
|
|
309
|
+
}
|
|
310
|
+
function isEditableTarget(target) {
|
|
311
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
312
|
+
return target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable === true;
|
|
313
|
+
}
|
|
314
|
+
function attachHostTypingGuard(shadowRoot) {
|
|
315
|
+
const handleKeyDown = (event) => {
|
|
316
|
+
const keyboardEvent = event;
|
|
317
|
+
if (keyboardEvent.ctrlKey || keyboardEvent.metaKey || keyboardEvent.altKey) return;
|
|
318
|
+
if (keyboardEvent.key === "Escape") return;
|
|
319
|
+
if (!isEditableTarget(keyboardEvent.composedPath()[0])) return;
|
|
320
|
+
keyboardEvent.stopPropagation();
|
|
321
|
+
};
|
|
322
|
+
shadowRoot.addEventListener("keydown", handleKeyDown);
|
|
323
|
+
return () => shadowRoot.removeEventListener("keydown", handleKeyDown);
|
|
324
|
+
}
|
|
325
|
+
const RUNTIME_OWNER_MARKER_KEY = "__issueStickerRuntimeOwner";
|
|
326
|
+
function markerHost() {
|
|
327
|
+
return typeof window === "undefined" ? null : window;
|
|
328
|
+
}
|
|
329
|
+
function getClaimedIssueStickerRuntimeOwner() {
|
|
330
|
+
var _a;
|
|
331
|
+
return ((_a = markerHost()) == null ? void 0 : _a[RUNTIME_OWNER_MARKER_KEY]) ?? null;
|
|
332
|
+
}
|
|
333
|
+
function isIssueStickerExtensionRuntimeActive(doc) {
|
|
334
|
+
if (getClaimedIssueStickerRuntimeOwner() === ISSUE_STICKER_RUNTIME_OWNER.extension) {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
return getIssueStickerRuntimeOwner(getIssueStickerRuntimeHost()) === ISSUE_STICKER_RUNTIME_OWNER.extension;
|
|
338
|
+
}
|
|
259
339
|
const SEARCH_DEBOUNCE_MS = 250;
|
|
260
340
|
function AsyncSearchSelect({
|
|
261
341
|
value,
|
|
@@ -711,6 +791,22 @@ const PenLine = createLucideIcon$1("PenLine", [
|
|
|
711
791
|
}
|
|
712
792
|
]
|
|
713
793
|
]);
|
|
794
|
+
/**
|
|
795
|
+
* @license lucide-react v0.468.0 - ISC
|
|
796
|
+
*
|
|
797
|
+
* This source code is licensed under the ISC license.
|
|
798
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
799
|
+
*/
|
|
800
|
+
const Pin = createLucideIcon$1("Pin", [
|
|
801
|
+
["path", { d: "M12 17v5", key: "bb1du9" }],
|
|
802
|
+
[
|
|
803
|
+
"path",
|
|
804
|
+
{
|
|
805
|
+
d: "M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z",
|
|
806
|
+
key: "1nkz8b"
|
|
807
|
+
}
|
|
808
|
+
]
|
|
809
|
+
]);
|
|
714
810
|
/**
|
|
715
811
|
* @license lucide-react v0.468.0 - ISC
|
|
716
812
|
*
|
|
@@ -723,6 +819,23 @@ const RefreshCw = createLucideIcon$1("RefreshCw", [
|
|
|
723
819
|
["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
|
|
724
820
|
["path", { d: "M8 16H3v5", key: "1cv678" }]
|
|
725
821
|
]);
|
|
822
|
+
/**
|
|
823
|
+
* @license lucide-react v0.468.0 - ISC
|
|
824
|
+
*
|
|
825
|
+
* This source code is licensed under the ISC license.
|
|
826
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
827
|
+
*/
|
|
828
|
+
const SlidersHorizontal = createLucideIcon$1("SlidersHorizontal", [
|
|
829
|
+
["line", { x1: "21", x2: "14", y1: "4", y2: "4", key: "obuewd" }],
|
|
830
|
+
["line", { x1: "10", x2: "3", y1: "4", y2: "4", key: "1q6298" }],
|
|
831
|
+
["line", { x1: "21", x2: "12", y1: "12", y2: "12", key: "1iu8h1" }],
|
|
832
|
+
["line", { x1: "8", x2: "3", y1: "12", y2: "12", key: "ntss68" }],
|
|
833
|
+
["line", { x1: "21", x2: "16", y1: "20", y2: "20", key: "14d8ph" }],
|
|
834
|
+
["line", { x1: "12", x2: "3", y1: "20", y2: "20", key: "m0wm8r" }],
|
|
835
|
+
["line", { x1: "14", x2: "14", y1: "2", y2: "6", key: "14e1ph" }],
|
|
836
|
+
["line", { x1: "8", x2: "8", y1: "10", y2: "14", key: "1i6ji0" }],
|
|
837
|
+
["line", { x1: "16", x2: "16", y1: "18", y2: "22", key: "1lctlv" }]
|
|
838
|
+
]);
|
|
726
839
|
/**
|
|
727
840
|
* @license lucide-react v0.468.0 - ISC
|
|
728
841
|
*
|
|
@@ -14213,6 +14326,7 @@ function ToastContainer({ position: position2 = "top-right" }) {
|
|
|
14213
14326
|
const content2 = /* @__PURE__ */ jsx(
|
|
14214
14327
|
"div",
|
|
14215
14328
|
{
|
|
14329
|
+
"data-issue-sticker-toast-layer": "",
|
|
14216
14330
|
className: cn$1(
|
|
14217
14331
|
`pointer-events-none fixed ${OVERLAY_LAYER.toast} flex flex-col-reverse`,
|
|
14218
14332
|
positionClass
|
|
@@ -14259,6 +14373,28 @@ function useIssueListGenerationPolling({
|
|
|
14259
14373
|
onRefetch
|
|
14260
14374
|
});
|
|
14261
14375
|
}
|
|
14376
|
+
const EMPTY_ISSUE_FIELD_FILTERS = {
|
|
14377
|
+
dateFrom: null,
|
|
14378
|
+
dateTo: null,
|
|
14379
|
+
customFieldValues: {},
|
|
14380
|
+
jiraFieldValues: {},
|
|
14381
|
+
notionFieldValues: {}
|
|
14382
|
+
};
|
|
14383
|
+
function countRecord(record) {
|
|
14384
|
+
return Object.values(record).filter((values) => values.length > 0).length;
|
|
14385
|
+
}
|
|
14386
|
+
function countActiveIssueFieldFilters(filters) {
|
|
14387
|
+
return (filters.dateFrom || filters.dateTo ? 1 : 0) + countRecord(filters.customFieldValues) + countRecord(filters.jiraFieldValues) + countRecord(filters.notionFieldValues);
|
|
14388
|
+
}
|
|
14389
|
+
function toIssueFilterParams(filters) {
|
|
14390
|
+
return {
|
|
14391
|
+
...filters.dateFrom ? { dateFrom: filters.dateFrom } : {},
|
|
14392
|
+
...filters.dateTo ? { dateTo: filters.dateTo } : {},
|
|
14393
|
+
...countRecord(filters.customFieldValues) ? { customFieldValues: filters.customFieldValues } : {},
|
|
14394
|
+
...countRecord(filters.jiraFieldValues) ? { jiraFieldValues: filters.jiraFieldValues } : {},
|
|
14395
|
+
...countRecord(filters.notionFieldValues) ? { notionFieldValues: filters.notionFieldValues } : {}
|
|
14396
|
+
};
|
|
14397
|
+
}
|
|
14262
14398
|
async function uploadSignedMedia(file, mediaType, issueId) {
|
|
14263
14399
|
return uploadSignedMediaWithApi(
|
|
14264
14400
|
{
|
|
@@ -14324,7 +14460,7 @@ function recordToFilterArray(record, keyFieldName) {
|
|
|
14324
14460
|
([key, values]) => ({ [keyFieldName]: key, values })
|
|
14325
14461
|
);
|
|
14326
14462
|
}
|
|
14327
|
-
function buildFilterQueryParams(filters
|
|
14463
|
+
function buildFilterQueryParams(filters) {
|
|
14328
14464
|
var _a;
|
|
14329
14465
|
const params = new URLSearchParams();
|
|
14330
14466
|
if (filters.projectId) {
|
|
@@ -14337,29 +14473,27 @@ function buildFilterQueryParams(filters, options = {}) {
|
|
|
14337
14473
|
params.set("url", filters.url);
|
|
14338
14474
|
}
|
|
14339
14475
|
}
|
|
14340
|
-
|
|
14341
|
-
|
|
14342
|
-
|
|
14343
|
-
|
|
14344
|
-
|
|
14345
|
-
|
|
14346
|
-
|
|
14347
|
-
|
|
14348
|
-
|
|
14349
|
-
|
|
14350
|
-
|
|
14351
|
-
|
|
14352
|
-
|
|
14353
|
-
|
|
14354
|
-
|
|
14355
|
-
|
|
14356
|
-
|
|
14357
|
-
|
|
14358
|
-
|
|
14359
|
-
|
|
14360
|
-
|
|
14361
|
-
params.set("notion_field_filters", JSON.stringify(notionArr));
|
|
14362
|
-
}
|
|
14476
|
+
const search2 = (_a = filters.search) == null ? void 0 : _a.trim();
|
|
14477
|
+
if (search2) {
|
|
14478
|
+
params.set("search", search2);
|
|
14479
|
+
}
|
|
14480
|
+
if (filters.dateFrom) {
|
|
14481
|
+
params.set("date_from", filters.dateFrom);
|
|
14482
|
+
}
|
|
14483
|
+
if (filters.dateTo) {
|
|
14484
|
+
params.set("date_to", filters.dateTo);
|
|
14485
|
+
}
|
|
14486
|
+
const customArr = recordToFilterArray(filters.customFieldValues, "fieldDefinitionId");
|
|
14487
|
+
if (customArr) {
|
|
14488
|
+
params.set("custom_field_filters", JSON.stringify(customArr));
|
|
14489
|
+
}
|
|
14490
|
+
const jiraArr = recordToFilterArray(filters.jiraFieldValues, "fieldName");
|
|
14491
|
+
if (jiraArr) {
|
|
14492
|
+
params.set("jira_field_filters", JSON.stringify(jiraArr));
|
|
14493
|
+
}
|
|
14494
|
+
const notionArr = recordToFilterArray(filters.notionFieldValues, "fieldName");
|
|
14495
|
+
if (notionArr) {
|
|
14496
|
+
params.set("notion_field_filters", JSON.stringify(notionArr));
|
|
14363
14497
|
}
|
|
14364
14498
|
if (filters.externalUserId) {
|
|
14365
14499
|
params.set("external_user_id", filters.externalUserId);
|
|
@@ -14400,7 +14534,7 @@ const issueService = {
|
|
|
14400
14534
|
if (!options.forceRefresh && issuesCache && issuesCache.filterKey === filterKey && now2 - issuesCache.timestamp < CACHE_DURATION_MS) {
|
|
14401
14535
|
return issuesCache.data;
|
|
14402
14536
|
}
|
|
14403
|
-
const queryParams = buildFilterQueryParams(filters
|
|
14537
|
+
const queryParams = buildFilterQueryParams(filters);
|
|
14404
14538
|
const { items: issues = [] } = await apiClient.get(
|
|
14405
14539
|
`${issuesEndpoint()}${queryParams}`
|
|
14406
14540
|
);
|
|
@@ -14447,7 +14581,7 @@ const issueService = {
|
|
|
14447
14581
|
invalidateCache() {
|
|
14448
14582
|
invalidateIssuesCache();
|
|
14449
14583
|
},
|
|
14450
|
-
// 계약
|
|
14584
|
+
// 계약 기준: 백엔드 GET /api/sdk/issues/:id 는 back#101부터 읽기-시점-스크럽된
|
|
14451
14585
|
// llm_prompt 를 상세 응답에 포함한다(목록 응답에는 없음) — 스코프를 이 반환 타입에만 한정한다.
|
|
14452
14586
|
async getIssue(id2) {
|
|
14453
14587
|
return apiClient.get(
|
|
@@ -14464,7 +14598,7 @@ const issueService = {
|
|
|
14464
14598
|
return issue;
|
|
14465
14599
|
},
|
|
14466
14600
|
/**
|
|
14467
|
-
* 재생성. 스펙상 세
|
|
14601
|
+
* 재생성. 스펙상 세 채널 모두에서 되고 역할과 무관하다 — 검사는 역할이 아니라
|
|
14468
14602
|
* 그 이슈에 접근할 수 있는지다(백엔드가 판정한다).
|
|
14469
14603
|
*
|
|
14470
14604
|
* 응답으로 갱신된 이슈가 오지만 상태는 다시 pending 이다. 호출부는 응답을
|
|
@@ -14490,14 +14624,15 @@ const issueService = {
|
|
|
14490
14624
|
invalidateIssuesCache();
|
|
14491
14625
|
}
|
|
14492
14626
|
};
|
|
14493
|
-
async function loadIssuesFromServer(url, projectId, externalUserId, options = {}) {
|
|
14627
|
+
async function loadIssuesFromServer(url, projectId, externalUserId, filters, options = {}) {
|
|
14494
14628
|
if (!projectId) return [];
|
|
14495
14629
|
try {
|
|
14496
14630
|
return await issueService.getIssueStickers(
|
|
14497
14631
|
{
|
|
14498
14632
|
url,
|
|
14499
14633
|
projectId,
|
|
14500
|
-
...externalUserId ? { externalUserId } : {}
|
|
14634
|
+
...externalUserId ? { externalUserId } : {},
|
|
14635
|
+
...toIssueFilterParams(filters)
|
|
14501
14636
|
},
|
|
14502
14637
|
options
|
|
14503
14638
|
) || [];
|
|
@@ -14512,24 +14647,38 @@ function contentIssuesQueryKey({
|
|
|
14512
14647
|
currentUrl,
|
|
14513
14648
|
projectId,
|
|
14514
14649
|
isMember,
|
|
14515
|
-
externalUserId
|
|
14650
|
+
externalUserId,
|
|
14651
|
+
filters = EMPTY_ISSUE_FIELD_FILTERS
|
|
14516
14652
|
}) {
|
|
14517
|
-
return [
|
|
14653
|
+
return [
|
|
14654
|
+
...contentIssuesQueryRoot,
|
|
14655
|
+
currentUrl,
|
|
14656
|
+
projectId,
|
|
14657
|
+
isMember,
|
|
14658
|
+
externalUserId,
|
|
14659
|
+
toIssueFilterParams(filters)
|
|
14660
|
+
];
|
|
14518
14661
|
}
|
|
14519
14662
|
function fetchContentIssues({
|
|
14520
14663
|
currentUrl,
|
|
14521
14664
|
projectId,
|
|
14522
14665
|
isMember,
|
|
14523
14666
|
externalUserId,
|
|
14667
|
+
filters = EMPTY_ISSUE_FIELD_FILTERS,
|
|
14524
14668
|
forceRefresh
|
|
14525
14669
|
}) {
|
|
14526
|
-
return loadIssuesFromServer(
|
|
14527
|
-
|
|
14528
|
-
|
|
14670
|
+
return loadIssuesFromServer(
|
|
14671
|
+
currentUrl,
|
|
14672
|
+
projectId,
|
|
14673
|
+
isMember ? void 0 : externalUserId,
|
|
14674
|
+
isMember ? filters : EMPTY_ISSUE_FIELD_FILTERS,
|
|
14675
|
+
{ forceRefresh }
|
|
14676
|
+
);
|
|
14529
14677
|
}
|
|
14530
|
-
function useIssues(currentUrl) {
|
|
14678
|
+
function useIssues(currentUrl, filters = EMPTY_ISSUE_FIELD_FILTERS) {
|
|
14531
14679
|
var _a;
|
|
14532
14680
|
const { isMember } = useAuthContext();
|
|
14681
|
+
const appliedFilters = isMember ? filters : EMPTY_ISSUE_FIELD_FILTERS;
|
|
14533
14682
|
const config = SDKManager.getInstance().config;
|
|
14534
14683
|
const sessionIssuesRef = useRef([]);
|
|
14535
14684
|
const projectIdQuery = useSuspenseQuery({
|
|
@@ -14545,7 +14694,8 @@ function useIssues(currentUrl) {
|
|
|
14545
14694
|
currentUrl,
|
|
14546
14695
|
projectId,
|
|
14547
14696
|
isMember,
|
|
14548
|
-
externalUserId: (_a = config.user) == null ? void 0 : _a.id
|
|
14697
|
+
externalUserId: (_a = config.user) == null ? void 0 : _a.id,
|
|
14698
|
+
filters: appliedFilters
|
|
14549
14699
|
}),
|
|
14550
14700
|
queryFn: () => {
|
|
14551
14701
|
var _a2;
|
|
@@ -14553,7 +14703,8 @@ function useIssues(currentUrl) {
|
|
|
14553
14703
|
currentUrl,
|
|
14554
14704
|
projectId,
|
|
14555
14705
|
isMember,
|
|
14556
|
-
externalUserId: (_a2 = config.user) == null ? void 0 : _a2.id
|
|
14706
|
+
externalUserId: (_a2 = config.user) == null ? void 0 : _a2.id,
|
|
14707
|
+
filters: appliedFilters
|
|
14557
14708
|
});
|
|
14558
14709
|
}
|
|
14559
14710
|
});
|
|
@@ -14845,6 +14996,7 @@ const ISSUE_DRAFT_DISABLED_MESSAGE = "지금은 AI 작성을 사용할 수 없
|
|
|
14845
14996
|
const LABEL = "기대한 동작";
|
|
14846
14997
|
const PLACEHOLDER = "예: 할인 쿠폰을 적용하면 결제 금액에서 즉시 차감되어야 합니다";
|
|
14847
14998
|
const SWITCH_TO_MANUAL = "직접 작성";
|
|
14999
|
+
const SWITCH_TO_MANUAL_TOOLTIP = "제목, 설명 등 이슈 필드를 직접 작성합니다";
|
|
14848
15000
|
const SUBMIT = "보내기";
|
|
14849
15001
|
const MAX_INPUT_HEIGHT = 160;
|
|
14850
15002
|
const FOCUS_RETRY_BUDGET_MS = 1e3;
|
|
@@ -14858,7 +15010,8 @@ function IssueIntentBubble({
|
|
|
14858
15010
|
onSubmit,
|
|
14859
15011
|
onSwitchToManual,
|
|
14860
15012
|
submitting = false,
|
|
14861
|
-
error = null
|
|
15013
|
+
error = null,
|
|
15014
|
+
toolbar
|
|
14862
15015
|
}) {
|
|
14863
15016
|
const inputRef = useRef(null);
|
|
14864
15017
|
const canSubmit = !submitting && value.trim().length > 0;
|
|
@@ -14907,7 +15060,7 @@ function IssueIntentBubble({
|
|
|
14907
15060
|
/* @__PURE__ */ jsxs(
|
|
14908
15061
|
"div",
|
|
14909
15062
|
{
|
|
14910
|
-
className: `${ISSUE_STICKER_REPORT_FORM_CLASS} w-
|
|
15063
|
+
className: `${ISSUE_STICKER_REPORT_FORM_CLASS} w-[min(20rem,calc(100vw_-_1.5rem))] space-y-1.5 rounded-md border border-line-subtle bg-surface-1 p-1.5 transition-colors duration-fast ease-out focus-within:border-line-focus`,
|
|
14911
15064
|
children: [
|
|
14912
15065
|
/* @__PURE__ */ jsxs("div", { className: "flex items-end gap-1.5", children: [
|
|
14913
15066
|
/* @__PURE__ */ jsx(
|
|
@@ -14936,9 +15089,23 @@ function IssueIntentBubble({
|
|
|
14936
15089
|
)
|
|
14937
15090
|
] }),
|
|
14938
15091
|
error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-danger", children: error }) : null,
|
|
14939
|
-
/* @__PURE__ */ jsxs(
|
|
14940
|
-
/* @__PURE__ */ jsx(
|
|
14941
|
-
|
|
15092
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
15093
|
+
/* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 240, skipDelayDuration: 120, disableHoverableContent: true, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
15094
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
15095
|
+
Button,
|
|
15096
|
+
{
|
|
15097
|
+
type: "button",
|
|
15098
|
+
variant: "secondary",
|
|
15099
|
+
size: "icon",
|
|
15100
|
+
className: "h-7 w-7",
|
|
15101
|
+
"aria-label": SWITCH_TO_MANUAL,
|
|
15102
|
+
onClick: onSwitchToManual,
|
|
15103
|
+
children: /* @__PURE__ */ jsx(PenLine, { className: "h-3.5 w-3.5" })
|
|
15104
|
+
}
|
|
15105
|
+
) }),
|
|
15106
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", sideOffset: 10, children: SWITCH_TO_MANUAL_TOOLTIP })
|
|
15107
|
+
] }) }),
|
|
15108
|
+
toolbar ?? null
|
|
14942
15109
|
] })
|
|
14943
15110
|
]
|
|
14944
15111
|
}
|
|
@@ -15505,6 +15672,180 @@ function IssueIntentBubbleAnchor({
|
|
|
15505
15672
|
)
|
|
15506
15673
|
] });
|
|
15507
15674
|
}
|
|
15675
|
+
function appendSnippet(base, body) {
|
|
15676
|
+
const trimmedBody = body.trim();
|
|
15677
|
+
if (!trimmedBody) return base;
|
|
15678
|
+
const trimmedBase = base.trimEnd();
|
|
15679
|
+
if (!trimmedBase) return trimmedBody;
|
|
15680
|
+
return `${trimmedBase}
|
|
15681
|
+
|
|
15682
|
+
${trimmedBody}`;
|
|
15683
|
+
}
|
|
15684
|
+
const TRIGGER_LABEL = "고정 문구 선택";
|
|
15685
|
+
const CLEAR_OPTION_LABEL = "선택 안 함";
|
|
15686
|
+
const GROUP_LABEL = {
|
|
15687
|
+
project: "공용 문구",
|
|
15688
|
+
personal: "내 문구"
|
|
15689
|
+
};
|
|
15690
|
+
function SnippetPicker({
|
|
15691
|
+
snippets,
|
|
15692
|
+
selectedId,
|
|
15693
|
+
onSelect,
|
|
15694
|
+
disabled = false
|
|
15695
|
+
}) {
|
|
15696
|
+
const [open, setOpen] = useState(false);
|
|
15697
|
+
const listRef = useRef(null);
|
|
15698
|
+
const optionRefs = useRef([]);
|
|
15699
|
+
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
15700
|
+
const selected = snippets.find((snippet) => snippet.id === selectedId) ?? null;
|
|
15701
|
+
const isEmpty = snippets.length === 0;
|
|
15702
|
+
const projectSnippets = snippets.filter((snippet) => snippet.scope === "project");
|
|
15703
|
+
const personalSnippets = snippets.filter((snippet) => snippet.scope === "personal");
|
|
15704
|
+
const orderedSnippets = [...projectSnippets, ...personalSnippets];
|
|
15705
|
+
useEffect(() => {
|
|
15706
|
+
if (!open) return;
|
|
15707
|
+
const selectedIndex = selectedId ? orderedSnippets.findIndex((snippet) => snippet.id === selectedId) + 1 : 0;
|
|
15708
|
+
setFocusedIndex(Math.max(selectedIndex, 0));
|
|
15709
|
+
}, [open]);
|
|
15710
|
+
useEffect(() => {
|
|
15711
|
+
var _a;
|
|
15712
|
+
if (!open) return;
|
|
15713
|
+
(_a = optionRefs.current[focusedIndex]) == null ? void 0 : _a.focus();
|
|
15714
|
+
}, [open, focusedIndex]);
|
|
15715
|
+
function selectAndClose(id2) {
|
|
15716
|
+
onSelect(id2);
|
|
15717
|
+
setOpen(false);
|
|
15718
|
+
}
|
|
15719
|
+
function handleListKeyDown(event) {
|
|
15720
|
+
const lastIndex = orderedSnippets.length;
|
|
15721
|
+
switch (event.key) {
|
|
15722
|
+
case "ArrowDown":
|
|
15723
|
+
event.preventDefault();
|
|
15724
|
+
setFocusedIndex((index2) => Math.min(index2 + 1, lastIndex));
|
|
15725
|
+
break;
|
|
15726
|
+
case "ArrowUp":
|
|
15727
|
+
event.preventDefault();
|
|
15728
|
+
setFocusedIndex((index2) => Math.max(index2 - 1, 0));
|
|
15729
|
+
break;
|
|
15730
|
+
case "Home":
|
|
15731
|
+
event.preventDefault();
|
|
15732
|
+
setFocusedIndex(0);
|
|
15733
|
+
break;
|
|
15734
|
+
case "End":
|
|
15735
|
+
event.preventDefault();
|
|
15736
|
+
setFocusedIndex(lastIndex);
|
|
15737
|
+
break;
|
|
15738
|
+
}
|
|
15739
|
+
}
|
|
15740
|
+
function optionClassName(isSelected) {
|
|
15741
|
+
return cn$1(
|
|
15742
|
+
"flex w-full flex-col items-start gap-0.5 rounded-sm border border-transparent px-2.5 py-1.5 text-left outline-none",
|
|
15743
|
+
"hover:bg-surface-2 focus-visible:border-line-focus",
|
|
15744
|
+
isSelected && "bg-surface-2"
|
|
15745
|
+
);
|
|
15746
|
+
}
|
|
15747
|
+
let optionIndex = 0;
|
|
15748
|
+
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: disabled ? void 0 : setOpen, children: [
|
|
15749
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
15750
|
+
"button",
|
|
15751
|
+
{
|
|
15752
|
+
type: "button",
|
|
15753
|
+
disabled: disabled || isEmpty,
|
|
15754
|
+
className: cn$1(
|
|
15755
|
+
"inline-flex max-w-[10rem] items-center gap-1 rounded-sm border border-transparent px-2 py-1 text-xs text-text-secondary outline-none",
|
|
15756
|
+
"hover:bg-surface-2 focus-visible:border-line-focus disabled:cursor-not-allowed disabled:opacity-40"
|
|
15757
|
+
),
|
|
15758
|
+
children: [
|
|
15759
|
+
/* @__PURE__ */ jsx(Pin, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
15760
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: selected ? selected.label : TRIGGER_LABEL }),
|
|
15761
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3 shrink-0" })
|
|
15762
|
+
]
|
|
15763
|
+
}
|
|
15764
|
+
) }),
|
|
15765
|
+
/* @__PURE__ */ jsx(
|
|
15766
|
+
PopoverContent,
|
|
15767
|
+
{
|
|
15768
|
+
align: "start",
|
|
15769
|
+
sideOffset: 4,
|
|
15770
|
+
onEscapeKeyDown: stopEscapePropagation(),
|
|
15771
|
+
className: cn$1(`panel-shell-subtle w-72 p-1.5 shadow-lg ${OVERLAY_LAYER.floating}`),
|
|
15772
|
+
children: /* @__PURE__ */ jsxs(
|
|
15773
|
+
"div",
|
|
15774
|
+
{
|
|
15775
|
+
ref: listRef,
|
|
15776
|
+
role: "listbox",
|
|
15777
|
+
"aria-label": TRIGGER_LABEL,
|
|
15778
|
+
onKeyDown: handleListKeyDown,
|
|
15779
|
+
className: "flex max-h-80 flex-col gap-0.5 overflow-y-auto",
|
|
15780
|
+
children: [
|
|
15781
|
+
/* @__PURE__ */ jsx(
|
|
15782
|
+
"button",
|
|
15783
|
+
{
|
|
15784
|
+
ref: (node2) => {
|
|
15785
|
+
optionRefs.current[0] = node2;
|
|
15786
|
+
},
|
|
15787
|
+
type: "button",
|
|
15788
|
+
role: "option",
|
|
15789
|
+
"aria-selected": selectedId === null,
|
|
15790
|
+
tabIndex: focusedIndex === 0 ? 0 : -1,
|
|
15791
|
+
onClick: () => selectAndClose(null),
|
|
15792
|
+
className: optionClassName(selectedId === null),
|
|
15793
|
+
children: /* @__PURE__ */ jsx("span", { className: "text-sm text-text-secondary", children: CLEAR_OPTION_LABEL })
|
|
15794
|
+
}
|
|
15795
|
+
),
|
|
15796
|
+
[["project", projectSnippets], ["personal", personalSnippets]].map(
|
|
15797
|
+
([scope, groupSnippets]) => groupSnippets.length === 0 ? null : /* @__PURE__ */ jsxs(
|
|
15798
|
+
"div",
|
|
15799
|
+
{
|
|
15800
|
+
className: "border-t border-line-subtle pt-1 mt-1 first:mt-0 first:border-t-0 first:pt-0",
|
|
15801
|
+
children: [
|
|
15802
|
+
/* @__PURE__ */ jsx(
|
|
15803
|
+
"div",
|
|
15804
|
+
{
|
|
15805
|
+
role: "presentation",
|
|
15806
|
+
className: "px-2.5 pb-1 pt-1 text-[11px] font-medium text-text-tertiary",
|
|
15807
|
+
children: GROUP_LABEL[scope]
|
|
15808
|
+
}
|
|
15809
|
+
),
|
|
15810
|
+
groupSnippets.map((snippet) => {
|
|
15811
|
+
optionIndex += 1;
|
|
15812
|
+
const index2 = optionIndex;
|
|
15813
|
+
const isSelected = snippet.id === selectedId;
|
|
15814
|
+
return /* @__PURE__ */ jsxs(
|
|
15815
|
+
"button",
|
|
15816
|
+
{
|
|
15817
|
+
ref: (node2) => {
|
|
15818
|
+
optionRefs.current[index2] = node2;
|
|
15819
|
+
},
|
|
15820
|
+
type: "button",
|
|
15821
|
+
role: "option",
|
|
15822
|
+
"aria-selected": isSelected,
|
|
15823
|
+
tabIndex: focusedIndex === index2 ? 0 : -1,
|
|
15824
|
+
onClick: () => selectAndClose(snippet.id),
|
|
15825
|
+
className: optionClassName(isSelected),
|
|
15826
|
+
children: [
|
|
15827
|
+
/* @__PURE__ */ jsxs("span", { className: "flex w-full items-center justify-between gap-2", children: [
|
|
15828
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-sm text-text-primary", children: snippet.label }),
|
|
15829
|
+
isSelected ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 shrink-0 text-brand" }) : null
|
|
15830
|
+
] }),
|
|
15831
|
+
/* @__PURE__ */ jsx("span", { className: "line-clamp-2 text-xs text-text-tertiary", children: snippet.body })
|
|
15832
|
+
]
|
|
15833
|
+
},
|
|
15834
|
+
snippet.id
|
|
15835
|
+
);
|
|
15836
|
+
})
|
|
15837
|
+
]
|
|
15838
|
+
},
|
|
15839
|
+
scope
|
|
15840
|
+
)
|
|
15841
|
+
)
|
|
15842
|
+
]
|
|
15843
|
+
}
|
|
15844
|
+
)
|
|
15845
|
+
}
|
|
15846
|
+
)
|
|
15847
|
+
] });
|
|
15848
|
+
}
|
|
15508
15849
|
function useProject() {
|
|
15509
15850
|
const auth = useAuthContext();
|
|
15510
15851
|
return {
|
|
@@ -15684,20 +16025,15 @@ function useJiraConnectNudge(projectId, enabled) {
|
|
|
15684
16025
|
const isResolving = isEnabled && !isFetched;
|
|
15685
16026
|
return { needsConnect, connect, isResolving };
|
|
15686
16027
|
}
|
|
15687
|
-
function useIssueFormState(
|
|
16028
|
+
function useIssueFormState() {
|
|
15688
16029
|
const [title, setTitle] = useState("");
|
|
15689
|
-
const [description, setDescription] = useState(
|
|
16030
|
+
const [description, setDescription] = useState("");
|
|
15690
16031
|
const [mode, setMode] = useState("ai");
|
|
15691
16032
|
const [renderedMode, setRenderedMode] = useState("ai");
|
|
15692
16033
|
const [intent, setIntent] = useState("");
|
|
15693
16034
|
const modeRef = useRef(mode);
|
|
15694
16035
|
modeRef.current = mode;
|
|
15695
16036
|
const finishModeTransition = useCallback(() => setRenderedMode(modeRef.current), []);
|
|
15696
|
-
useEffect(() => {
|
|
15697
|
-
if (initialDescription !== void 0) {
|
|
15698
|
-
setDescription(initialDescription);
|
|
15699
|
-
}
|
|
15700
|
-
}, [initialDescription]);
|
|
15701
16037
|
return {
|
|
15702
16038
|
title,
|
|
15703
16039
|
description,
|
|
@@ -15853,6 +16189,26 @@ function waitForFormOpen() {
|
|
|
15853
16189
|
setTimeout(resolve, CAPTURE_START_DELAY_MS);
|
|
15854
16190
|
});
|
|
15855
16191
|
}
|
|
16192
|
+
const BLOCKED_PAGE_EVENTS = [
|
|
16193
|
+
"pointerdown",
|
|
16194
|
+
"pointerup",
|
|
16195
|
+
"mousedown",
|
|
16196
|
+
"mouseup",
|
|
16197
|
+
"dblclick",
|
|
16198
|
+
"auxclick",
|
|
16199
|
+
"contextmenu"
|
|
16200
|
+
];
|
|
16201
|
+
function isOwnRuntimeTarget(target) {
|
|
16202
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
16203
|
+
return target.closest(".issue-sticker-marker") !== null || target.closest("#issue-sticker-host") !== null;
|
|
16204
|
+
}
|
|
16205
|
+
const HIGHLIGHT_CLASS = "issue-sticker-mode-highlight";
|
|
16206
|
+
function highlightElement(element2) {
|
|
16207
|
+
element2.classList.add(HIGHLIGHT_CLASS);
|
|
16208
|
+
}
|
|
16209
|
+
function unhighlightElement(element2) {
|
|
16210
|
+
element2 == null ? void 0 : element2.classList.remove(HIGHLIGHT_CLASS);
|
|
16211
|
+
}
|
|
15856
16212
|
function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
15857
16213
|
const [clickPosition, setClickPosition] = useState(null);
|
|
15858
16214
|
const clickPositionRef = useRef(null);
|
|
@@ -15863,6 +16219,8 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15863
16219
|
useEffect(() => {
|
|
15864
16220
|
const handleMouseOver = (e) => {
|
|
15865
16221
|
if (!isCreatingIssueRef.current) {
|
|
16222
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16223
|
+
highlightedElementRef.current = null;
|
|
15866
16224
|
return;
|
|
15867
16225
|
}
|
|
15868
16226
|
preloadModernScreenshot();
|
|
@@ -15876,14 +16234,14 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15876
16234
|
if (target.closest(".issue-sticker-marker") || target.closest(".issue-form-overlay") || target.closest(".issue-popover") || target.closest("#issue-sticker-host")) {
|
|
15877
16235
|
return;
|
|
15878
16236
|
}
|
|
15879
|
-
|
|
15880
|
-
|
|
15881
|
-
}
|
|
15882
|
-
target.classList.add("issue-sticker-mode-highlight");
|
|
16237
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16238
|
+
highlightElement(target);
|
|
15883
16239
|
highlightedElementRef.current = target;
|
|
15884
16240
|
};
|
|
15885
16241
|
const handleMouseOut = (e) => {
|
|
15886
16242
|
if (!isCreatingIssueRef.current) {
|
|
16243
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16244
|
+
highlightedElementRef.current = null;
|
|
15887
16245
|
return;
|
|
15888
16246
|
}
|
|
15889
16247
|
const target = e.target;
|
|
@@ -15891,7 +16249,7 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15891
16249
|
return;
|
|
15892
16250
|
}
|
|
15893
16251
|
if (highlightedElementRef.current === target) {
|
|
15894
|
-
target
|
|
16252
|
+
unhighlightElement(target);
|
|
15895
16253
|
highlightedElementRef.current = null;
|
|
15896
16254
|
}
|
|
15897
16255
|
};
|
|
@@ -15904,10 +16262,8 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15904
16262
|
passive: true
|
|
15905
16263
|
});
|
|
15906
16264
|
return () => {
|
|
15907
|
-
|
|
15908
|
-
|
|
15909
|
-
highlightedElementRef.current = null;
|
|
15910
|
-
}
|
|
16265
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16266
|
+
highlightedElementRef.current = null;
|
|
15911
16267
|
document.removeEventListener("mouseover", handleMouseOver, {
|
|
15912
16268
|
capture: true
|
|
15913
16269
|
});
|
|
@@ -15969,10 +16325,8 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15969
16325
|
e.preventDefault();
|
|
15970
16326
|
e.stopImmediatePropagation();
|
|
15971
16327
|
const selectedElement = highlightedElementRef.current ?? clickTarget;
|
|
15972
|
-
|
|
15973
|
-
|
|
15974
|
-
highlightedElementRef.current = null;
|
|
15975
|
-
}
|
|
16328
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16329
|
+
highlightedElementRef.current = null;
|
|
15976
16330
|
const newClickPosition = {
|
|
15977
16331
|
x: e.clientX + window.scrollX,
|
|
15978
16332
|
y: e.clientY + window.scrollY,
|
|
@@ -15985,23 +16339,35 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15985
16339
|
setClickPosition(newClickPosition);
|
|
15986
16340
|
clickPositionRef.current = newClickPosition;
|
|
15987
16341
|
};
|
|
16342
|
+
const blockPageEvent = (e) => {
|
|
16343
|
+
if (!isCreatingIssueRef.current) return;
|
|
16344
|
+
if (isOwnRuntimeTarget(e.target)) return;
|
|
16345
|
+
e.preventDefault();
|
|
16346
|
+
e.stopImmediatePropagation();
|
|
16347
|
+
};
|
|
15988
16348
|
document.addEventListener("click", handleDocumentClick, {
|
|
15989
16349
|
capture: true,
|
|
15990
16350
|
passive: false
|
|
15991
16351
|
});
|
|
16352
|
+
BLOCKED_PAGE_EVENTS.forEach((type) => {
|
|
16353
|
+
document.addEventListener(type, blockPageEvent, { capture: true, passive: false });
|
|
16354
|
+
});
|
|
15992
16355
|
return () => {
|
|
15993
16356
|
document.removeEventListener("click", handleDocumentClick, {
|
|
15994
16357
|
capture: true
|
|
15995
16358
|
});
|
|
16359
|
+
BLOCKED_PAGE_EVENTS.forEach((type) => {
|
|
16360
|
+
document.removeEventListener(type, blockPageEvent, {
|
|
16361
|
+
capture: true
|
|
16362
|
+
});
|
|
16363
|
+
});
|
|
15996
16364
|
};
|
|
15997
16365
|
}, [isCreatingIssueRef, recordedVideoFile]);
|
|
15998
16366
|
const clearClickPosition = () => {
|
|
15999
16367
|
setClickPosition(null);
|
|
16000
16368
|
clickPositionRef.current = null;
|
|
16001
|
-
|
|
16002
|
-
|
|
16003
|
-
highlightedElementRef.current = null;
|
|
16004
|
-
}
|
|
16369
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16370
|
+
highlightedElementRef.current = null;
|
|
16005
16371
|
};
|
|
16006
16372
|
const setClickPositionManually = (position2) => {
|
|
16007
16373
|
setClickPosition(position2);
|
|
@@ -16105,7 +16471,8 @@ function useIssueSubmission({
|
|
|
16105
16471
|
activeIntegrationType,
|
|
16106
16472
|
notionIntegrationId,
|
|
16107
16473
|
videoFile,
|
|
16108
|
-
sessionReplay
|
|
16474
|
+
sessionReplay,
|
|
16475
|
+
snippetId
|
|
16109
16476
|
}) {
|
|
16110
16477
|
const failedServicesRef = useRef([]);
|
|
16111
16478
|
const { fetchNetworkLogs } = useNetworkLogs();
|
|
@@ -16169,6 +16536,7 @@ function useIssueSubmission({
|
|
|
16169
16536
|
tenant_id: authInfo.tenantId,
|
|
16170
16537
|
project_id: authInfo.projectId,
|
|
16171
16538
|
account_id: authInfo.accountId || void 0,
|
|
16539
|
+
snippet_id: snippetId ?? void 0,
|
|
16172
16540
|
...buildExternalUserPayload(SDKManager.getInstance().config.user),
|
|
16173
16541
|
// 비어 있는 값은 보내지 않는다 — 저장해봐야 값 없음과 같고 요청만 커진다.
|
|
16174
16542
|
custom_field_values: Object.entries(customFieldValues ?? {}).filter(([, value]) => value !== null && value !== void 0 && value !== "").map(([field_definition_id, value]) => ({ field_definition_id, value }))
|
|
@@ -16256,6 +16624,141 @@ function useIssueSubmission({
|
|
|
16256
16624
|
error: createIssueMutation.error ? `이슈 생성에 실패했습니다: ${createIssueMutation.error instanceof Error ? createIssueMutation.error.message : "알 수 없는 오류"}` : null
|
|
16257
16625
|
};
|
|
16258
16626
|
}
|
|
16627
|
+
async function fetchSnippets(projectId) {
|
|
16628
|
+
try {
|
|
16629
|
+
return await apiClient.get(
|
|
16630
|
+
`/api/snippets?projectId=${encodeURIComponent(projectId)}`
|
|
16631
|
+
);
|
|
16632
|
+
} catch (error) {
|
|
16633
|
+
devLogger.error("snippetService", "고정 문구 조회 실패:", error);
|
|
16634
|
+
return [];
|
|
16635
|
+
}
|
|
16636
|
+
}
|
|
16637
|
+
function buildSettingsQuery(settingKey, projectId, serviceType) {
|
|
16638
|
+
const params = new URLSearchParams({ setting_key: settingKey });
|
|
16639
|
+
if (projectId) {
|
|
16640
|
+
params.set("project_id", projectId);
|
|
16641
|
+
}
|
|
16642
|
+
{
|
|
16643
|
+
params.set("service_type", serviceType);
|
|
16644
|
+
}
|
|
16645
|
+
return `/api/settings?${params.toString()}`;
|
|
16646
|
+
}
|
|
16647
|
+
async function getSetting(settingKey, defaultValue, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
16648
|
+
try {
|
|
16649
|
+
const data = await apiClient.get(
|
|
16650
|
+
buildSettingsQuery(settingKey, projectId, serviceType)
|
|
16651
|
+
);
|
|
16652
|
+
if (!data) {
|
|
16653
|
+
if (defaultValue !== null && defaultValue !== void 0 && defaultValue !== "") {
|
|
16654
|
+
await initializeSetting(settingKey, defaultValue, projectId, serviceType);
|
|
16655
|
+
}
|
|
16656
|
+
return defaultValue;
|
|
16657
|
+
}
|
|
16658
|
+
return data.setting_value ?? defaultValue;
|
|
16659
|
+
} catch (error) {
|
|
16660
|
+
devLogger.error("settingsService", `설정 로드 실패 (${settingKey}):`, error);
|
|
16661
|
+
return defaultValue;
|
|
16662
|
+
}
|
|
16663
|
+
}
|
|
16664
|
+
async function initializeSetting(settingKey, value, projectId, serviceType) {
|
|
16665
|
+
try {
|
|
16666
|
+
await apiClient.put("/api/settings", {
|
|
16667
|
+
setting_key: settingKey,
|
|
16668
|
+
setting_value: value,
|
|
16669
|
+
project_id: projectId ?? null,
|
|
16670
|
+
service_type: serviceType ?? null
|
|
16671
|
+
});
|
|
16672
|
+
} catch (error) {
|
|
16673
|
+
devLogger.error("settingsService", `설정 초기화 실패 (${settingKey}):`, error);
|
|
16674
|
+
}
|
|
16675
|
+
}
|
|
16676
|
+
async function setSetting(settingKey, value, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
16677
|
+
try {
|
|
16678
|
+
await apiClient.put("/api/settings", {
|
|
16679
|
+
setting_key: settingKey,
|
|
16680
|
+
setting_value: value,
|
|
16681
|
+
project_id: projectId ?? null,
|
|
16682
|
+
service_type: serviceType ?? null
|
|
16683
|
+
});
|
|
16684
|
+
} catch (error) {
|
|
16685
|
+
devLogger.error("settingsService", `설정 저장 실패 (${settingKey}):`, error);
|
|
16686
|
+
throw error;
|
|
16687
|
+
}
|
|
16688
|
+
}
|
|
16689
|
+
function useAuth() {
|
|
16690
|
+
const ctx = useAuthContext();
|
|
16691
|
+
return {
|
|
16692
|
+
isAuthenticated: ctx.isAuthenticated,
|
|
16693
|
+
isMember: ctx.isMember,
|
|
16694
|
+
isLoading: ctx.isLoading,
|
|
16695
|
+
user: ctx.accountId ? { id: ctx.accountId, email: "" } : null,
|
|
16696
|
+
tenant: ctx.tenantId ? { id: ctx.tenantId, name: "", slug: "" } : null,
|
|
16697
|
+
accountId: ctx.accountId
|
|
16698
|
+
};
|
|
16699
|
+
}
|
|
16700
|
+
const EMPTY$1 = [];
|
|
16701
|
+
const SETTING_KEY = "lastIssueSnippetId";
|
|
16702
|
+
function useSnippets(projectId) {
|
|
16703
|
+
const { isMember } = useAuth();
|
|
16704
|
+
const [manualSelectedId, setManualSelectedId] = useState(void 0);
|
|
16705
|
+
useEffect(() => {
|
|
16706
|
+
setManualSelectedId(void 0);
|
|
16707
|
+
}, [projectId]);
|
|
16708
|
+
const enabled = Boolean(projectId) && isMember;
|
|
16709
|
+
const { data: snippets = EMPTY$1 } = useQuery({
|
|
16710
|
+
queryKey: ["issueSnippets", projectId ?? "none"],
|
|
16711
|
+
queryFn: () => projectId ? fetchSnippets(projectId) : Promise.resolve(EMPTY$1),
|
|
16712
|
+
enabled,
|
|
16713
|
+
staleTime: 5 * 60 * 1e3
|
|
16714
|
+
});
|
|
16715
|
+
const { data: rememberedId = null } = useQuery({
|
|
16716
|
+
queryKey: ["lastIssueSnippetId", projectId ?? "none"],
|
|
16717
|
+
queryFn: () => projectId ? getSetting(
|
|
16718
|
+
SETTING_KEY,
|
|
16719
|
+
null,
|
|
16720
|
+
void 0,
|
|
16721
|
+
void 0,
|
|
16722
|
+
void 0,
|
|
16723
|
+
projectId,
|
|
16724
|
+
"GENERAL"
|
|
16725
|
+
) : Promise.resolve(null),
|
|
16726
|
+
enabled
|
|
16727
|
+
});
|
|
16728
|
+
const candidateId = manualSelectedId !== void 0 ? manualSelectedId : rememberedId;
|
|
16729
|
+
const selectedId = candidateId && snippets.some((s) => s.id === candidateId) ? candidateId : null;
|
|
16730
|
+
const setSelectedId = useCallback((id2) => {
|
|
16731
|
+
setManualSelectedId(id2);
|
|
16732
|
+
}, []);
|
|
16733
|
+
const rememberSelection = useCallback(async () => {
|
|
16734
|
+
if (!projectId || !isMember) return;
|
|
16735
|
+
try {
|
|
16736
|
+
await setSetting(
|
|
16737
|
+
SETTING_KEY,
|
|
16738
|
+
selectedId,
|
|
16739
|
+
void 0,
|
|
16740
|
+
void 0,
|
|
16741
|
+
void 0,
|
|
16742
|
+
projectId,
|
|
16743
|
+
"GENERAL"
|
|
16744
|
+
);
|
|
16745
|
+
} catch {
|
|
16746
|
+
}
|
|
16747
|
+
}, [projectId, isMember, selectedId]);
|
|
16748
|
+
return { snippets, selectedId, setSelectedId, rememberSelection };
|
|
16749
|
+
}
|
|
16750
|
+
function mergeSnippetIntoDescription(currentDescription, prevBody, nextBody) {
|
|
16751
|
+
const normalizedNext = nextBody || null;
|
|
16752
|
+
if (prevBody === normalizedNext) {
|
|
16753
|
+
return { ref: prevBody };
|
|
16754
|
+
}
|
|
16755
|
+
const trimmedCurrent = currentDescription.trimEnd();
|
|
16756
|
+
if (prevBody && !trimmedCurrent.endsWith(prevBody)) {
|
|
16757
|
+
return { ref: null };
|
|
16758
|
+
}
|
|
16759
|
+
const base = prevBody ? trimmedCurrent.slice(0, trimmedCurrent.length - prevBody.length).trimEnd() : currentDescription;
|
|
16760
|
+
return { ref: normalizedNext, description: appendSnippet(base, nextBody) };
|
|
16761
|
+
}
|
|
16259
16762
|
function useSessionReplayController() {
|
|
16260
16763
|
const controllerRef = useRef(null);
|
|
16261
16764
|
if (!controllerRef.current) {
|
|
@@ -16933,13 +17436,12 @@ function IssueForm({
|
|
|
16933
17436
|
position: position2,
|
|
16934
17437
|
onSubmit,
|
|
16935
17438
|
onCancel,
|
|
16936
|
-
initialDescription,
|
|
16937
17439
|
activeIntegration,
|
|
16938
17440
|
isIntegrationLoading = false
|
|
16939
17441
|
}) {
|
|
16940
17442
|
var _a, _b2;
|
|
16941
17443
|
const { isMember } = useAuthContext();
|
|
16942
|
-
const formState = useIssueFormState(
|
|
17444
|
+
const formState = useIssueFormState();
|
|
16943
17445
|
const sessionReplay = useSessionReplay();
|
|
16944
17446
|
const { markReportStart, clearReportStart } = sessionReplay;
|
|
16945
17447
|
useEffect(() => {
|
|
@@ -16966,6 +17468,22 @@ function IssueForm({
|
|
|
16966
17468
|
const [customFieldValues, setCustomFieldValues] = useState({});
|
|
16967
17469
|
const { selectedProjectId } = useProject();
|
|
16968
17470
|
const showCustomFields = isMember && Boolean(selectedProjectId);
|
|
17471
|
+
const snippets = useSnippets(selectedProjectId);
|
|
17472
|
+
const { setDescription } = formState;
|
|
17473
|
+
const lastAppliedSnippetBodyRef = useRef(null);
|
|
17474
|
+
useEffect(() => {
|
|
17475
|
+
const selected = snippets.snippets.find((snippet) => snippet.id === snippets.selectedId);
|
|
17476
|
+
const nextBody = selected ? selected.body.trim() : "";
|
|
17477
|
+
const result = mergeSnippetIntoDescription(
|
|
17478
|
+
formState.description,
|
|
17479
|
+
lastAppliedSnippetBodyRef.current,
|
|
17480
|
+
nextBody
|
|
17481
|
+
);
|
|
17482
|
+
lastAppliedSnippetBodyRef.current = result.ref;
|
|
17483
|
+
if (result.description !== void 0) {
|
|
17484
|
+
setDescription(result.description);
|
|
17485
|
+
}
|
|
17486
|
+
}, [snippets.selectedId]);
|
|
16969
17487
|
const [isOpen, setIsOpen] = useState(true);
|
|
16970
17488
|
const jiraIntegrationId = ((_a = jiraService.getConfig()) == null ? void 0 : _a.integrationId) ?? null;
|
|
16971
17489
|
const isResolvingIntegration = isMember && isIntegrationLoading;
|
|
@@ -16983,6 +17501,7 @@ function IssueForm({
|
|
|
16983
17501
|
const issueSubmission = useIssueSubmission({
|
|
16984
17502
|
position: position2,
|
|
16985
17503
|
onSubmit: (hasIntegrationFailure) => {
|
|
17504
|
+
void snippets.rememberSelection();
|
|
16986
17505
|
if (formState.mode === "ai") {
|
|
16987
17506
|
onSubmit(hasIntegrationFailure);
|
|
16988
17507
|
return;
|
|
@@ -16997,7 +17516,9 @@ function IssueForm({
|
|
|
16997
17516
|
activeIntegrationType: (activeIntegration == null ? void 0 : activeIntegration.type) ?? null,
|
|
16998
17517
|
notionIntegrationId: (activeIntegration == null ? void 0 : activeIntegration.type) === "NOTION" ? activeIntegration.integration.id : null,
|
|
16999
17518
|
videoFile: position2.videoFile,
|
|
17000
|
-
sessionReplay
|
|
17519
|
+
sessionReplay,
|
|
17520
|
+
// 직접 작성 모드는 이미 설명란에 문구 본문을 붙였다 — 여기서 또 실으면 중복이다.
|
|
17521
|
+
snippetId: formState.mode === "ai" ? snippets.selectedId : null
|
|
17001
17522
|
});
|
|
17002
17523
|
useDisableBodyScroll(formState.mode !== "ai");
|
|
17003
17524
|
useEffect(() => {
|
|
@@ -17086,7 +17607,16 @@ function IssueForm({
|
|
|
17086
17607
|
onSubmit: () => void submitCurrentMode(),
|
|
17087
17608
|
onSwitchToManual: () => formState.setMode("manual"),
|
|
17088
17609
|
submitting: issueSubmission.isSubmitting,
|
|
17089
|
-
error: issueSubmission.error
|
|
17610
|
+
error: issueSubmission.error,
|
|
17611
|
+
toolbar: /* @__PURE__ */ jsx(
|
|
17612
|
+
SnippetPicker,
|
|
17613
|
+
{
|
|
17614
|
+
snippets: snippets.snippets,
|
|
17615
|
+
selectedId: snippets.selectedId,
|
|
17616
|
+
onSelect: snippets.setSelectedId,
|
|
17617
|
+
disabled: issueSubmission.isSubmitting
|
|
17618
|
+
}
|
|
17619
|
+
)
|
|
17090
17620
|
}
|
|
17091
17621
|
)
|
|
17092
17622
|
]
|
|
@@ -17225,6 +17755,7 @@ function IssueForm({
|
|
|
17225
17755
|
);
|
|
17226
17756
|
}
|
|
17227
17757
|
function invalidateIssueQueries(issueId) {
|
|
17758
|
+
issueService.invalidateCache();
|
|
17228
17759
|
queryClient.invalidateQueries({ queryKey: ["contentIssues"] });
|
|
17229
17760
|
queryClient.invalidateQueries({ queryKey: ["issue", issueId] });
|
|
17230
17761
|
}
|
|
@@ -34496,7 +35027,10 @@ function IssueCustomFields({
|
|
|
34496
35027
|
const { values, setValue } = useCustomFieldValueDraft({
|
|
34497
35028
|
serverValues,
|
|
34498
35029
|
save: (fieldDefinitionId, value) => upsertIssueCustomFieldValue(issueId, fieldDefinitionId, value),
|
|
34499
|
-
onSaved: () =>
|
|
35030
|
+
onSaved: () => {
|
|
35031
|
+
toast.success("필드 값이 저장되었습니다.");
|
|
35032
|
+
applyIssueMutationEffects(issueId);
|
|
35033
|
+
},
|
|
34500
35034
|
onError: (_fieldDefinitionId, error) => {
|
|
34501
35035
|
devLogger.error("IssueCustomFields", "커스텀 필드 값 저장 실패:", error);
|
|
34502
35036
|
toast.error("필드 값 저장에 실패했습니다.");
|
|
@@ -35708,19 +36242,20 @@ function getCurrentStickerDocumentMetrics() {
|
|
|
35708
36242
|
}
|
|
35709
36243
|
const STICKER_PALETTE_WHITE = "#FFFFFF";
|
|
35710
36244
|
const STICKER_PALETTE_INK = "#111827";
|
|
36245
|
+
const STICKER_PALETTE_BLACK = "#000000";
|
|
35711
36246
|
const STICKER_PALETTE = {
|
|
35712
|
-
slate: { bg: "#
|
|
35713
|
-
blue: { bg: "#
|
|
35714
|
-
teal: { bg: "#
|
|
35715
|
-
green: { bg: "#
|
|
35716
|
-
|
|
35717
|
-
red: { bg: "#
|
|
35718
|
-
pink: { bg: "#
|
|
35719
|
-
violet: { bg: "#
|
|
36247
|
+
slate: { bg: "#64748B", fg: STICKER_PALETTE_WHITE },
|
|
36248
|
+
blue: { bg: "#0A84FF", fg: STICKER_PALETTE_INK },
|
|
36249
|
+
teal: { bg: "#00BFA5", fg: STICKER_PALETTE_INK },
|
|
36250
|
+
green: { bg: "#00C853", fg: STICKER_PALETTE_INK },
|
|
36251
|
+
lime: { bg: "#84CC16", fg: STICKER_PALETTE_INK },
|
|
36252
|
+
red: { bg: "#FF0000", fg: STICKER_PALETTE_BLACK },
|
|
36253
|
+
pink: { bg: "#FF2D87", fg: STICKER_PALETTE_INK },
|
|
36254
|
+
violet: { bg: "#7C3AED", fg: STICKER_PALETTE_WHITE },
|
|
35720
36255
|
orange: { bg: "#F97316", fg: STICKER_PALETTE_INK },
|
|
35721
|
-
yellow: { bg: "#
|
|
35722
|
-
indigo: { bg: "#
|
|
35723
|
-
cyan: { bg: "#
|
|
36256
|
+
yellow: { bg: "#FFD000", fg: STICKER_PALETTE_INK },
|
|
36257
|
+
indigo: { bg: "#4F46E5", fg: STICKER_PALETTE_WHITE },
|
|
36258
|
+
cyan: { bg: "#00BCD4", fg: STICKER_PALETTE_INK }
|
|
35724
36259
|
};
|
|
35725
36260
|
const STICKER_PALETTE_ORDER = Object.keys(STICKER_PALETTE);
|
|
35726
36261
|
function getEntry(name2) {
|
|
@@ -35828,7 +36363,7 @@ function IssueSticker$1({
|
|
|
35828
36363
|
const buttonStyle = {
|
|
35829
36364
|
...backgroundStyle,
|
|
35830
36365
|
// 밝은 배경(노랑·주황·하늘)은 흰 글씨로 대비가 안 나온다. 팔레트가 정한 글씨색을
|
|
35831
|
-
// inline 으로
|
|
36366
|
+
// inline 으로 추가해 text-white 클래스를 덮는다.
|
|
35832
36367
|
...designForeground ? { color: designForeground } : {},
|
|
35833
36368
|
["--issue-sticker-expanded-width"]: `${expandedWidth}px`,
|
|
35834
36369
|
...clusterStackAnimation ? {
|
|
@@ -35874,7 +36409,7 @@ function IssueSticker$1({
|
|
|
35874
36409
|
"span",
|
|
35875
36410
|
{
|
|
35876
36411
|
"data-sticker-badge": "",
|
|
35877
|
-
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 ===
|
|
36412
|
+
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:opacity-100 group-focus-visible:opacity-100"}`,
|
|
35878
36413
|
children: badgeLabel
|
|
35879
36414
|
}
|
|
35880
36415
|
) : null
|
|
@@ -36192,7 +36727,7 @@ async function getActiveIntegration(projectId) {
|
|
|
36192
36727
|
return null;
|
|
36193
36728
|
}
|
|
36194
36729
|
}
|
|
36195
|
-
function applyStickerFilters(issues,
|
|
36730
|
+
function applyStickerFilters(issues, currentPageUrl) {
|
|
36196
36731
|
const normalizedCurrentUrl = normalizeComparableUrl(currentPageUrl);
|
|
36197
36732
|
if (!normalizedCurrentUrl) return [];
|
|
36198
36733
|
return issues.filter((issue) => normalizeComparableUrl(issue.url) === normalizedCurrentUrl);
|
|
@@ -36219,10 +36754,10 @@ function useExtensionEnabled() {
|
|
|
36219
36754
|
const [isEnabled] = useState(true);
|
|
36220
36755
|
return isEnabled;
|
|
36221
36756
|
}
|
|
36222
|
-
const DEFAULT_VALUE
|
|
36757
|
+
const DEFAULT_VALUE = false;
|
|
36223
36758
|
function useIssueMode() {
|
|
36224
|
-
const [isCreatingIssue, setIsCreatingIssue] = useState(DEFAULT_VALUE
|
|
36225
|
-
const isCreatingIssueRef = useRef(DEFAULT_VALUE
|
|
36759
|
+
const [isCreatingIssue, setIsCreatingIssue] = useState(DEFAULT_VALUE);
|
|
36760
|
+
const isCreatingIssueRef = useRef(DEFAULT_VALUE);
|
|
36226
36761
|
useEffect(() => {
|
|
36227
36762
|
isCreatingIssueRef.current = isCreatingIssue;
|
|
36228
36763
|
}, [isCreatingIssue]);
|
|
@@ -36257,151 +36792,6 @@ function useIssueMode() {
|
|
|
36257
36792
|
showToast
|
|
36258
36793
|
};
|
|
36259
36794
|
}
|
|
36260
|
-
function buildSettingsQuery(settingKey, projectId, serviceType) {
|
|
36261
|
-
const params = new URLSearchParams({ setting_key: settingKey });
|
|
36262
|
-
if (projectId) {
|
|
36263
|
-
params.set("project_id", projectId);
|
|
36264
|
-
}
|
|
36265
|
-
{
|
|
36266
|
-
params.set("service_type", serviceType);
|
|
36267
|
-
}
|
|
36268
|
-
return `/api/settings?${params.toString()}`;
|
|
36269
|
-
}
|
|
36270
|
-
async function getSetting(settingKey, defaultValue, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
36271
|
-
try {
|
|
36272
|
-
const data = await apiClient.get(
|
|
36273
|
-
buildSettingsQuery(settingKey, projectId, serviceType)
|
|
36274
|
-
);
|
|
36275
|
-
if (!data) {
|
|
36276
|
-
if (defaultValue !== null && defaultValue !== void 0 && defaultValue !== "") {
|
|
36277
|
-
await initializeSetting(settingKey, defaultValue, projectId, serviceType);
|
|
36278
|
-
}
|
|
36279
|
-
return defaultValue;
|
|
36280
|
-
}
|
|
36281
|
-
return data.setting_value ?? defaultValue;
|
|
36282
|
-
} catch (error) {
|
|
36283
|
-
devLogger.error("settingsService", `설정 로드 실패 (${settingKey}):`, error);
|
|
36284
|
-
return defaultValue;
|
|
36285
|
-
}
|
|
36286
|
-
}
|
|
36287
|
-
async function initializeSetting(settingKey, value, projectId, serviceType) {
|
|
36288
|
-
try {
|
|
36289
|
-
await apiClient.put("/api/settings", {
|
|
36290
|
-
setting_key: settingKey,
|
|
36291
|
-
setting_value: value,
|
|
36292
|
-
project_id: projectId ?? null,
|
|
36293
|
-
service_type: serviceType ?? null
|
|
36294
|
-
});
|
|
36295
|
-
} catch (error) {
|
|
36296
|
-
devLogger.error("settingsService", `설정 초기화 실패 (${settingKey}):`, error);
|
|
36297
|
-
}
|
|
36298
|
-
}
|
|
36299
|
-
async function setSetting(settingKey, value, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
36300
|
-
try {
|
|
36301
|
-
await apiClient.put("/api/settings", {
|
|
36302
|
-
setting_key: settingKey,
|
|
36303
|
-
setting_value: value,
|
|
36304
|
-
project_id: projectId ?? null,
|
|
36305
|
-
service_type: serviceType ?? null
|
|
36306
|
-
});
|
|
36307
|
-
} catch (error) {
|
|
36308
|
-
devLogger.error("settingsService", `설정 저장 실패 (${settingKey}):`, error);
|
|
36309
|
-
throw error;
|
|
36310
|
-
}
|
|
36311
|
-
}
|
|
36312
|
-
async function migrateFromLocalStorage(settingKey, storageKey, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
36313
|
-
try {
|
|
36314
|
-
const existing = await apiClient.get(
|
|
36315
|
-
buildSettingsQuery(settingKey, projectId, serviceType)
|
|
36316
|
-
);
|
|
36317
|
-
if (existing) {
|
|
36318
|
-
return false;
|
|
36319
|
-
}
|
|
36320
|
-
const stored = localStorage.getItem(storageKey);
|
|
36321
|
-
const value = stored !== null ? JSON.parse(stored) : void 0;
|
|
36322
|
-
if (value !== void 0) {
|
|
36323
|
-
await setSetting(
|
|
36324
|
-
settingKey,
|
|
36325
|
-
value,
|
|
36326
|
-
void 0,
|
|
36327
|
-
void 0,
|
|
36328
|
-
void 0,
|
|
36329
|
-
projectId ?? void 0,
|
|
36330
|
-
serviceType ?? void 0
|
|
36331
|
-
);
|
|
36332
|
-
return true;
|
|
36333
|
-
}
|
|
36334
|
-
return false;
|
|
36335
|
-
} catch (error) {
|
|
36336
|
-
devLogger.error("settingsService", `마이그레이션 실패 (${settingKey}):`, error);
|
|
36337
|
-
return false;
|
|
36338
|
-
}
|
|
36339
|
-
}
|
|
36340
|
-
function useAuth() {
|
|
36341
|
-
const ctx = useAuthContext();
|
|
36342
|
-
return {
|
|
36343
|
-
isAuthenticated: ctx.isAuthenticated,
|
|
36344
|
-
isMember: ctx.isMember,
|
|
36345
|
-
isLoading: ctx.isLoading,
|
|
36346
|
-
user: ctx.accountId ? { id: ctx.accountId, email: "" } : null,
|
|
36347
|
-
tenant: ctx.tenantId ? { id: ctx.tenantId, name: "", slug: "" } : null,
|
|
36348
|
-
accountId: ctx.accountId
|
|
36349
|
-
};
|
|
36350
|
-
}
|
|
36351
|
-
const SETTING_KEY = "issueDescriptionTemplate";
|
|
36352
|
-
const STORAGE_KEY$1 = "issueDescriptionTemplate";
|
|
36353
|
-
const DEFAULT_VALUE = "";
|
|
36354
|
-
async function loadIssueTemplate(tenantId, email, projectId, isMember) {
|
|
36355
|
-
if (!tenantId || !isMember) {
|
|
36356
|
-
return DEFAULT_VALUE;
|
|
36357
|
-
}
|
|
36358
|
-
try {
|
|
36359
|
-
if (email) {
|
|
36360
|
-
await migrateFromLocalStorage(
|
|
36361
|
-
SETTING_KEY,
|
|
36362
|
-
STORAGE_KEY$1,
|
|
36363
|
-
tenantId,
|
|
36364
|
-
void 0,
|
|
36365
|
-
email,
|
|
36366
|
-
projectId ?? void 0,
|
|
36367
|
-
"GENERAL"
|
|
36368
|
-
);
|
|
36369
|
-
}
|
|
36370
|
-
const savedTemplate = await getSetting(
|
|
36371
|
-
SETTING_KEY,
|
|
36372
|
-
DEFAULT_VALUE,
|
|
36373
|
-
tenantId,
|
|
36374
|
-
void 0,
|
|
36375
|
-
email ?? void 0,
|
|
36376
|
-
projectId ?? void 0,
|
|
36377
|
-
"GENERAL"
|
|
36378
|
-
);
|
|
36379
|
-
return savedTemplate;
|
|
36380
|
-
} catch (error) {
|
|
36381
|
-
devLogger.error("useIssueTemplate", "템플릿 로드 실패:", error);
|
|
36382
|
-
return DEFAULT_VALUE;
|
|
36383
|
-
}
|
|
36384
|
-
}
|
|
36385
|
-
function useIssueTemplate() {
|
|
36386
|
-
var _a, _b2;
|
|
36387
|
-
const auth = useAuth();
|
|
36388
|
-
const project = useProject();
|
|
36389
|
-
const tenantId = ((_a = auth.tenant) == null ? void 0 : _a.id) ?? null;
|
|
36390
|
-
const email = ((_b2 = auth.user) == null ? void 0 : _b2.email) ?? null;
|
|
36391
|
-
const isMember = auth.isMember;
|
|
36392
|
-
const projectId = project.selectedProjectId;
|
|
36393
|
-
const { data: template } = useSuspenseQuery({
|
|
36394
|
-
queryKey: ["contentIssueTemplate", tenantId, email, projectId, isMember],
|
|
36395
|
-
queryFn: () => loadIssueTemplate(tenantId, email, projectId, isMember)
|
|
36396
|
-
});
|
|
36397
|
-
const loadTemplate = useCallback(() => {
|
|
36398
|
-
queryClient.invalidateQueries({ queryKey: ["contentIssueTemplate"] });
|
|
36399
|
-
}, []);
|
|
36400
|
-
return {
|
|
36401
|
-
template,
|
|
36402
|
-
loadTemplate
|
|
36403
|
-
};
|
|
36404
|
-
}
|
|
36405
36795
|
const RECORDING_BLOCKED_BY_ISSUE_MODE = "이슈 생성 모드에서는 녹화를 시작할 수 없습니다. 이슈 생성을 종료한 뒤 다시 시도하세요.";
|
|
36406
36796
|
const ISSUE_MODE_BLOCKED_BY_RECORDING = "녹화 중에는 이슈 생성 모드를 시작할 수 없습니다. 녹화를 중지한 뒤 다시 시도하세요.";
|
|
36407
36797
|
function getDigitFromCode(code2) {
|
|
@@ -36619,19 +37009,6 @@ function useScreenRecording() {
|
|
|
36619
37009
|
startedAt: snapshot.startedAt
|
|
36620
37010
|
};
|
|
36621
37011
|
}
|
|
36622
|
-
const DEFAULT_FILTERS = {
|
|
36623
|
-
url: "all"
|
|
36624
|
-
};
|
|
36625
|
-
function useStickerFilters() {
|
|
36626
|
-
const [stickerFilters, setStickerFilters] = useState({
|
|
36627
|
-
...DEFAULT_FILTERS,
|
|
36628
|
-
url: getCurrentPageUrl()
|
|
36629
|
-
});
|
|
36630
|
-
return {
|
|
36631
|
-
stickerFilters,
|
|
36632
|
-
setStickerFilters
|
|
36633
|
-
};
|
|
36634
|
-
}
|
|
36635
37012
|
function useStickerVisibility() {
|
|
36636
37013
|
const [showStickers, setShowStickers] = useState(true);
|
|
36637
37014
|
const showStickersRef = useRef(true);
|
|
@@ -36674,10 +37051,9 @@ function useContentAppState() {
|
|
|
36674
37051
|
const { isDomainAllowed } = useDomainRestriction(currentUrl);
|
|
36675
37052
|
const isExtensionEnabledRaw = useExtensionEnabled();
|
|
36676
37053
|
const isExtensionEnabled = isExtensionEnabledRaw && isDomainAllowed;
|
|
36677
|
-
const
|
|
36678
|
-
const {
|
|
37054
|
+
const [fieldFilters, setFieldFilters] = useState(EMPTY_ISSUE_FIELD_FILTERS);
|
|
37055
|
+
const { issues, loadIssues } = useIssues(currentUrl, useDeferredValue(fieldFilters));
|
|
36679
37056
|
const { showStickers, showStickersRef, setShowStickers } = useStickerVisibility();
|
|
36680
|
-
const { stickerFilters, setStickerFilters } = useStickerFilters();
|
|
36681
37057
|
const {
|
|
36682
37058
|
isCreatingIssue,
|
|
36683
37059
|
isCreatingIssueRef,
|
|
@@ -36691,8 +37067,8 @@ function useContentAppState() {
|
|
|
36691
37067
|
screenRecording.recordedFile
|
|
36692
37068
|
);
|
|
36693
37069
|
const filteredIssues = useMemo(() => {
|
|
36694
|
-
return applyStickerFilters(issues,
|
|
36695
|
-
}, [issues,
|
|
37070
|
+
return applyStickerFilters(issues, currentUrl);
|
|
37071
|
+
}, [issues, currentUrl]);
|
|
36696
37072
|
useCallback(async () => {
|
|
36697
37073
|
if (!isExtensionEnabled) {
|
|
36698
37074
|
return;
|
|
@@ -36710,38 +37086,12 @@ function useContentAppState() {
|
|
|
36710
37086
|
resetIssueMode();
|
|
36711
37087
|
clearClickPosition();
|
|
36712
37088
|
}, [resetIssueMode, clearClickPosition]);
|
|
36713
|
-
useCallback(
|
|
36714
|
-
(_newValue, filters) => {
|
|
36715
|
-
if (filters) {
|
|
36716
|
-
const contentScriptFilters = {
|
|
36717
|
-
...filters,
|
|
36718
|
-
url: getCurrentPageUrl()
|
|
36719
|
-
// 현재 페이지 URL로 고정
|
|
36720
|
-
};
|
|
36721
|
-
setStickerFilters(contentScriptFilters);
|
|
36722
|
-
}
|
|
36723
|
-
},
|
|
36724
|
-
[setStickerFilters]
|
|
36725
|
-
);
|
|
36726
|
-
useCallback(
|
|
36727
|
-
(filters) => {
|
|
36728
|
-
const contentScriptFilters = {
|
|
36729
|
-
...filters,
|
|
36730
|
-
url: getCurrentPageUrl()
|
|
36731
|
-
// 현재 페이지 URL로 고정
|
|
36732
|
-
};
|
|
36733
|
-
setStickerFilters(contentScriptFilters);
|
|
36734
|
-
},
|
|
36735
|
-
[setStickerFilters]
|
|
36736
|
-
);
|
|
36737
37089
|
const handleOpenIssueDetail = useCallback((issueId) => {
|
|
36738
37090
|
setOpenPopoverIssueId(issueId);
|
|
36739
37091
|
}, []);
|
|
36740
37092
|
const handleCloseIssueDetail = useCallback(() => {
|
|
36741
37093
|
setOpenPopoverIssueId(null);
|
|
36742
37094
|
}, []);
|
|
36743
|
-
useCallback(async (_newTemplate) => {
|
|
36744
|
-
}, []);
|
|
36745
37095
|
const handleRecordingStopped = useCallback(
|
|
36746
37096
|
async (_recordedFile) => {
|
|
36747
37097
|
if (!isCreatingIssueRef.current) {
|
|
@@ -36883,7 +37233,6 @@ function useContentAppState() {
|
|
|
36883
37233
|
);
|
|
36884
37234
|
return {
|
|
36885
37235
|
// 상태
|
|
36886
|
-
template,
|
|
36887
37236
|
openPopoverIssueId,
|
|
36888
37237
|
isExtensionEnabled,
|
|
36889
37238
|
issues: filteredIssues,
|
|
@@ -36904,7 +37253,9 @@ function useContentAppState() {
|
|
|
36904
37253
|
toggleIssueMode,
|
|
36905
37254
|
handleToggleRecording,
|
|
36906
37255
|
screenRecordingClearRecordedFile: screenRecording.clearRecordedFile,
|
|
36907
|
-
setShowStickers
|
|
37256
|
+
setShowStickers,
|
|
37257
|
+
fieldFilters,
|
|
37258
|
+
setFieldFilters
|
|
36908
37259
|
};
|
|
36909
37260
|
}
|
|
36910
37261
|
const STORAGE_KEY = "issue-sticker-sticker-render-mode";
|
|
@@ -36973,6 +37324,16 @@ function useStickerRenderMode() {
|
|
|
36973
37324
|
isSaving: mutation.isPending
|
|
36974
37325
|
};
|
|
36975
37326
|
}
|
|
37327
|
+
async function fetchIssueFilterGroups(projectId) {
|
|
37328
|
+
const [integrations, customFields] = await Promise.all([
|
|
37329
|
+
apiClient.get(`/api/integrations/${projectId}`).catch((error) => {
|
|
37330
|
+
devLogger.error("issueFilterOptions", "연동 조회 실패:", error);
|
|
37331
|
+
return [];
|
|
37332
|
+
}),
|
|
37333
|
+
fetchCustomFieldDefinitions(projectId)
|
|
37334
|
+
]);
|
|
37335
|
+
return composeIssueFilterGroups(Array.isArray(integrations) ? integrations : [], customFields);
|
|
37336
|
+
}
|
|
36976
37337
|
function advanceOnEvent(event) {
|
|
36977
37338
|
return ({ advance }) => {
|
|
36978
37339
|
const manager = SDKManager.getInstance();
|
|
@@ -37017,7 +37378,7 @@ function buildSdkOnboardingSteps({
|
|
|
37017
37378
|
id: "record",
|
|
37018
37379
|
targetId: "sdk-toolbar-record",
|
|
37019
37380
|
title: "재현 과정은 화면 녹화로 남깁니다",
|
|
37020
|
-
body: "클릭 순서나 화면 전환이 중요한 문제는 녹화로 남깁니다. 녹화를
|
|
37381
|
+
body: "클릭 순서나 화면 전환이 중요한 문제는 녹화로 남깁니다. 녹화를 시작하면 공유할 화면을 선택하는 창이 열립니다. 문제를 재현하고 이슈를 저장해 보세요.",
|
|
37021
37382
|
position: "top",
|
|
37022
37383
|
advanceOn: advanceOnEvent("issue:created"),
|
|
37023
37384
|
allowManualAdvance: true,
|
|
@@ -37090,6 +37451,112 @@ function SdkOnboardingProvider({
|
|
|
37090
37451
|
}
|
|
37091
37452
|
);
|
|
37092
37453
|
}
|
|
37454
|
+
const ISSUE_FIELD_FILTER_POPOVER_CLASS = "w-80 overflow-hidden p-0 text-xs";
|
|
37455
|
+
function IssueFieldFilterFields({
|
|
37456
|
+
groups,
|
|
37457
|
+
value,
|
|
37458
|
+
onChange,
|
|
37459
|
+
leading
|
|
37460
|
+
}) {
|
|
37461
|
+
const setRecord = (key, field, values) => onChange({ ...value, [key]: { ...value[key], [field]: values } });
|
|
37462
|
+
const customs = groups.filter((g) => g.kind === "custom");
|
|
37463
|
+
const jiras = groups.filter((g) => g.kind === "jira");
|
|
37464
|
+
const notions = groups.filter((g) => g.kind === "notion");
|
|
37465
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37466
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2 p-3", children: [
|
|
37467
|
+
leading,
|
|
37468
|
+
/* @__PURE__ */ jsx(
|
|
37469
|
+
DatePicker,
|
|
37470
|
+
{
|
|
37471
|
+
value: value.dateFrom,
|
|
37472
|
+
onChange: (v) => onChange({ ...value, dateFrom: v }),
|
|
37473
|
+
placeholder: "이슈 생성일: 시작",
|
|
37474
|
+
className: "rounded-md text-xs"
|
|
37475
|
+
}
|
|
37476
|
+
),
|
|
37477
|
+
/* @__PURE__ */ jsx(
|
|
37478
|
+
DatePicker,
|
|
37479
|
+
{
|
|
37480
|
+
value: value.dateTo,
|
|
37481
|
+
onChange: (v) => onChange({ ...value, dateTo: v }),
|
|
37482
|
+
placeholder: "이슈 생성일: 종료",
|
|
37483
|
+
className: "rounded-md text-xs"
|
|
37484
|
+
}
|
|
37485
|
+
),
|
|
37486
|
+
customs.map((g) => /* @__PURE__ */ jsx(
|
|
37487
|
+
MultiSelect,
|
|
37488
|
+
{
|
|
37489
|
+
options: g.options,
|
|
37490
|
+
value: value.customFieldValues[g.fieldDefinitionId] ?? [],
|
|
37491
|
+
onValueChange: (v) => setRecord("customFieldValues", g.fieldDefinitionId, v),
|
|
37492
|
+
placeholder: g.label,
|
|
37493
|
+
className: "rounded-md text-xs"
|
|
37494
|
+
},
|
|
37495
|
+
g.id
|
|
37496
|
+
))
|
|
37497
|
+
] }),
|
|
37498
|
+
jiras.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2 border-t border-line-subtle p-3", children: [
|
|
37499
|
+
/* @__PURE__ */ jsx("div", { className: "text-2xs font-semibold uppercase text-text-tertiary", children: "Jira" }),
|
|
37500
|
+
jiras.map((g) => /* @__PURE__ */ jsx(
|
|
37501
|
+
MultiSelect,
|
|
37502
|
+
{
|
|
37503
|
+
options: g.options,
|
|
37504
|
+
value: value.jiraFieldValues[g.fieldName] ?? [],
|
|
37505
|
+
onValueChange: (v) => setRecord("jiraFieldValues", g.fieldName, v),
|
|
37506
|
+
placeholder: g.label,
|
|
37507
|
+
className: "rounded-md text-xs"
|
|
37508
|
+
},
|
|
37509
|
+
g.id
|
|
37510
|
+
))
|
|
37511
|
+
] }) : null,
|
|
37512
|
+
notions.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2 border-t border-line-subtle p-3", children: [
|
|
37513
|
+
/* @__PURE__ */ jsx("div", { className: "text-2xs font-semibold uppercase text-text-tertiary", children: "Notion" }),
|
|
37514
|
+
notions.map((g) => /* @__PURE__ */ jsx(
|
|
37515
|
+
MultiSelect,
|
|
37516
|
+
{
|
|
37517
|
+
options: g.options,
|
|
37518
|
+
value: value.notionFieldValues[g.fieldName] ?? [],
|
|
37519
|
+
onValueChange: (v) => setRecord("notionFieldValues", g.fieldName, v),
|
|
37520
|
+
placeholder: g.label,
|
|
37521
|
+
className: "rounded-md text-xs"
|
|
37522
|
+
},
|
|
37523
|
+
g.id
|
|
37524
|
+
))
|
|
37525
|
+
] }) : null
|
|
37526
|
+
] });
|
|
37527
|
+
}
|
|
37528
|
+
function IssueFieldFilterPanel({
|
|
37529
|
+
title,
|
|
37530
|
+
onReset,
|
|
37531
|
+
onClose,
|
|
37532
|
+
...fields
|
|
37533
|
+
}) {
|
|
37534
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37535
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-line-subtle bg-surface-2 px-3 py-2", children: [
|
|
37536
|
+
/* @__PURE__ */ jsx("strong", { className: "text-sm font-semibold", children: title }),
|
|
37537
|
+
/* @__PURE__ */ jsx(
|
|
37538
|
+
"button",
|
|
37539
|
+
{
|
|
37540
|
+
type: "button",
|
|
37541
|
+
onClick: onClose,
|
|
37542
|
+
"aria-label": "닫기",
|
|
37543
|
+
className: "text-text-tertiary hover:text-text-primary",
|
|
37544
|
+
children: /* @__PURE__ */ jsx(X$1, { className: "h-3.5 w-3.5" })
|
|
37545
|
+
}
|
|
37546
|
+
)
|
|
37547
|
+
] }),
|
|
37548
|
+
/* @__PURE__ */ jsx(IssueFieldFilterFields, { ...fields }),
|
|
37549
|
+
/* @__PURE__ */ jsx("div", { className: "border-t border-line-subtle bg-surface-2 px-3 py-2", children: /* @__PURE__ */ jsx(
|
|
37550
|
+
"button",
|
|
37551
|
+
{
|
|
37552
|
+
type: "button",
|
|
37553
|
+
onClick: onReset,
|
|
37554
|
+
className: "text-text-tertiary hover:text-text-primary",
|
|
37555
|
+
children: "전체 초기화"
|
|
37556
|
+
}
|
|
37557
|
+
) })
|
|
37558
|
+
] });
|
|
37559
|
+
}
|
|
37093
37560
|
const SHORTCUTS = {
|
|
37094
37561
|
CAPTURE_SCREENSHOT: { mac: ["⌘⌥1", "⌃⌥1"], other: ["Ctrl+Alt+1"] },
|
|
37095
37562
|
CAPTURE_VIDEO: { mac: ["⌘⌥2", "⌃⌥2"], other: ["Ctrl+Alt+2"] }
|
|
@@ -37115,6 +37582,7 @@ function MoreMenu({
|
|
|
37115
37582
|
onOpenUnrenderedStickers,
|
|
37116
37583
|
onboardingEnabled,
|
|
37117
37584
|
onReplayOnboarding,
|
|
37585
|
+
filter: filter2,
|
|
37118
37586
|
account,
|
|
37119
37587
|
targets,
|
|
37120
37588
|
direction,
|
|
@@ -37135,6 +37603,14 @@ function MoreMenu({
|
|
|
37135
37603
|
visible: true,
|
|
37136
37604
|
targetRef: stickersTargetRef
|
|
37137
37605
|
},
|
|
37606
|
+
{
|
|
37607
|
+
id: "sticker-filter",
|
|
37608
|
+
label: "스티커 필터",
|
|
37609
|
+
hint: filter2 && filter2.activeCount > 0 ? `${filter2.activeCount}개 적용 중` : void 0,
|
|
37610
|
+
icon: /* @__PURE__ */ jsx(SlidersHorizontal, { size: ICON_SIZE }),
|
|
37611
|
+
onClick: () => filter2 == null ? void 0 : filter2.onOpen(),
|
|
37612
|
+
visible: filter2 !== void 0
|
|
37613
|
+
},
|
|
37138
37614
|
{
|
|
37139
37615
|
id: "render-mode",
|
|
37140
37616
|
label: `현재 표시 기준: ${renderModeLabel}`,
|
|
@@ -37613,6 +38089,7 @@ function Toolbar({
|
|
|
37613
38089
|
onStartRecording,
|
|
37614
38090
|
onStopRecording,
|
|
37615
38091
|
isCreatingIssue,
|
|
38092
|
+
isWritingIssue,
|
|
37616
38093
|
isRecording,
|
|
37617
38094
|
recordingStartedAt,
|
|
37618
38095
|
showStickers,
|
|
@@ -37626,10 +38103,12 @@ function Toolbar({
|
|
|
37626
38103
|
onboardingEnabled = true,
|
|
37627
38104
|
targets,
|
|
37628
38105
|
account,
|
|
37629
|
-
blocked
|
|
38106
|
+
blocked,
|
|
38107
|
+
filter: filter2
|
|
37630
38108
|
}) {
|
|
37631
38109
|
const rootRef = useRef(null);
|
|
37632
38110
|
const [internalOpen, setInternalOpen] = useState(false);
|
|
38111
|
+
const [filterOpen, setFilterOpen] = useState(false);
|
|
37633
38112
|
const [placement, setPlacement] = useState(
|
|
37634
38113
|
() => resolveInitialPlacement(toolbar)
|
|
37635
38114
|
);
|
|
@@ -37645,7 +38124,7 @@ function Toolbar({
|
|
|
37645
38124
|
},
|
|
37646
38125
|
[menuOpen, onMenuOpenChange]
|
|
37647
38126
|
);
|
|
37648
|
-
const state = isRecording ? "recording" : isCreatingIssue ? "aiming" : blocked ? "blocked" : "idle";
|
|
38127
|
+
const state = isRecording ? "recording" : isWritingIssue ? "writing" : isCreatingIssue ? "aiming" : blocked ? "blocked" : "idle";
|
|
37649
38128
|
const [now2, setNow] = useState(() => Date.now());
|
|
37650
38129
|
const skipFocusRestore = useRef(true);
|
|
37651
38130
|
const getSize2 = useCallback(
|
|
@@ -37694,7 +38173,9 @@ function Toolbar({
|
|
|
37694
38173
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
37695
38174
|
}, [isOpen, onboardingOpen, setIsOpen]);
|
|
37696
38175
|
useEffect(() => {
|
|
37697
|
-
if (state
|
|
38176
|
+
if (state === "idle") return;
|
|
38177
|
+
if (isOpen) setIsOpen(false);
|
|
38178
|
+
setFilterOpen(false);
|
|
37698
38179
|
}, [state, isOpen, setIsOpen]);
|
|
37699
38180
|
useEffect(() => {
|
|
37700
38181
|
var _a;
|
|
@@ -37757,9 +38238,10 @@ function Toolbar({
|
|
|
37757
38238
|
children: /* @__PURE__ */ jsx(Circle, { size: 15, fill: "currentColor" })
|
|
37758
38239
|
}
|
|
37759
38240
|
) }),
|
|
37760
|
-
/* @__PURE__ */ jsxs(TooltipContent, { side: "top", sideOffset: 10, children: [
|
|
38241
|
+
/* @__PURE__ */ jsxs(TooltipContent, { side: "top", sideOffset: 10, className: "text-center", children: [
|
|
37761
38242
|
"화면 녹화 ",
|
|
37762
|
-
getShortcutLabel("CAPTURE_VIDEO")
|
|
38243
|
+
getShortcutLabel("CAPTURE_VIDEO"),
|
|
38244
|
+
/* @__PURE__ */ jsx("span", { className: "block font-normal opacity-70", children: "공유할 화면을 선택하는 창이 열립니다" })
|
|
37763
38245
|
] })
|
|
37764
38246
|
] }),
|
|
37765
38247
|
/* @__PURE__ */ jsx("div", { className: "toolbar-divider" }),
|
|
@@ -37813,7 +38295,7 @@ function Toolbar({
|
|
|
37813
38295
|
children: /* @__PURE__ */ jsx(X$1, { size: 15 })
|
|
37814
38296
|
}
|
|
37815
38297
|
)
|
|
37816
|
-
] }) : state === "recording" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
38298
|
+
] }) : state === "writing" ? /* @__PURE__ */ jsx("span", { className: "toolbar-hint", children: "이슈를 작성 중입니다" }) : state === "recording" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37817
38299
|
/* @__PURE__ */ jsx("span", { className: "toolbar-pulse", "aria-hidden": "true" }),
|
|
37818
38300
|
/* @__PURE__ */ jsx("span", { className: "toolbar-elapsed", "aria-hidden": "true", children: formatElapsed(recordingStartedAt, now2) }),
|
|
37819
38301
|
/* @__PURE__ */ jsx("div", { className: "toolbar-divider" }),
|
|
@@ -37830,45 +38312,75 @@ function Toolbar({
|
|
|
37830
38312
|
] }) : idleBody;
|
|
37831
38313
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37832
38314
|
/* @__PURE__ */ jsx("style", { children: TOOLBAR_STYLES }),
|
|
37833
|
-
/* @__PURE__ */ jsxs(
|
|
37834
|
-
|
|
37835
|
-
|
|
37836
|
-
|
|
37837
|
-
|
|
37838
|
-
|
|
37839
|
-
|
|
37840
|
-
|
|
37841
|
-
|
|
37842
|
-
|
|
37843
|
-
|
|
37844
|
-
|
|
37845
|
-
|
|
37846
|
-
|
|
37847
|
-
|
|
37848
|
-
|
|
37849
|
-
|
|
37850
|
-
|
|
38315
|
+
/* @__PURE__ */ jsxs(Popover, { open: filterOpen, onOpenChange: setFilterOpen, children: [
|
|
38316
|
+
/* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
38317
|
+
"div",
|
|
38318
|
+
{
|
|
38319
|
+
ref: rootRef,
|
|
38320
|
+
"data-issue-sticker-toolbar": "",
|
|
38321
|
+
className: "toolbar-root",
|
|
38322
|
+
role: "toolbar",
|
|
38323
|
+
"aria-label": "이슈스티커",
|
|
38324
|
+
"data-state": state,
|
|
38325
|
+
"data-dragging": isDragging2,
|
|
38326
|
+
style: { ...anchor, zIndex: OVERLAY_LAYER_INDEX.fab },
|
|
38327
|
+
onKeyDown: handleKeyDown,
|
|
38328
|
+
tabIndex: -1,
|
|
38329
|
+
onPointerDown: handleRootPointerDown,
|
|
38330
|
+
children: [
|
|
38331
|
+
body,
|
|
38332
|
+
isOpen ? /* @__PURE__ */ jsx(
|
|
38333
|
+
MoreMenu,
|
|
38334
|
+
{
|
|
38335
|
+
showStickers,
|
|
38336
|
+
onToggleStickers,
|
|
38337
|
+
stickerRenderMode,
|
|
38338
|
+
onToggleStickerRenderMode,
|
|
38339
|
+
unrenderedStickerCount,
|
|
38340
|
+
onOpenUnrenderedStickers,
|
|
38341
|
+
onboardingEnabled,
|
|
38342
|
+
onReplayOnboarding: () => {
|
|
38343
|
+
setIsOpen(false);
|
|
38344
|
+
replay();
|
|
38345
|
+
},
|
|
38346
|
+
filter: filter2 ? {
|
|
38347
|
+
activeCount: countActiveIssueFieldFilters(filter2.value),
|
|
38348
|
+
onOpen: () => {
|
|
38349
|
+
setIsOpen(false);
|
|
38350
|
+
setFilterOpen(true);
|
|
38351
|
+
}
|
|
38352
|
+
} : void 0,
|
|
38353
|
+
account,
|
|
38354
|
+
targets,
|
|
38355
|
+
direction: menuPlacement.vertical,
|
|
38356
|
+
horizontalDirection: menuPlacement.horizontal
|
|
38357
|
+
}
|
|
38358
|
+
) : null
|
|
38359
|
+
]
|
|
38360
|
+
}
|
|
38361
|
+
) }),
|
|
38362
|
+
filter2 ? /* @__PURE__ */ jsx(
|
|
38363
|
+
PopoverContent,
|
|
38364
|
+
{
|
|
38365
|
+
side: menuPlacement.vertical === "up" ? "top" : "bottom",
|
|
38366
|
+
align: menuPlacement.horizontal === "left" ? "end" : "start",
|
|
38367
|
+
sideOffset: 8,
|
|
38368
|
+
collisionPadding: 8,
|
|
38369
|
+
className: ISSUE_FIELD_FILTER_POPOVER_CLASS,
|
|
38370
|
+
children: /* @__PURE__ */ jsx(
|
|
38371
|
+
IssueFieldFilterPanel,
|
|
37851
38372
|
{
|
|
37852
|
-
|
|
37853
|
-
|
|
37854
|
-
|
|
37855
|
-
|
|
37856
|
-
|
|
37857
|
-
|
|
37858
|
-
onboardingEnabled,
|
|
37859
|
-
onReplayOnboarding: () => {
|
|
37860
|
-
setIsOpen(false);
|
|
37861
|
-
replay();
|
|
37862
|
-
},
|
|
37863
|
-
account,
|
|
37864
|
-
targets,
|
|
37865
|
-
direction: menuPlacement.vertical,
|
|
37866
|
-
horizontalDirection: menuPlacement.horizontal
|
|
38373
|
+
title: "스티커 필터",
|
|
38374
|
+
groups: filter2.groups,
|
|
38375
|
+
value: filter2.value,
|
|
38376
|
+
onChange: filter2.onChange,
|
|
38377
|
+
onReset: () => filter2.onChange(EMPTY_ISSUE_FIELD_FILTERS),
|
|
38378
|
+
onClose: () => setFilterOpen(false)
|
|
37867
38379
|
}
|
|
37868
|
-
)
|
|
37869
|
-
|
|
37870
|
-
|
|
37871
|
-
)
|
|
38380
|
+
)
|
|
38381
|
+
}
|
|
38382
|
+
) : null
|
|
38383
|
+
] })
|
|
37872
38384
|
] });
|
|
37873
38385
|
}
|
|
37874
38386
|
const SDK_TOOLBAR_TARGETS = {
|
|
@@ -37928,7 +38440,6 @@ function ContentAppWrapper({
|
|
|
37928
38440
|
const [moreMenuOpen, setMoreMenuOpen] = useState(false);
|
|
37929
38441
|
const unrenderedSignatureRef = useRef("");
|
|
37930
38442
|
const {
|
|
37931
|
-
template,
|
|
37932
38443
|
openPopoverIssueId,
|
|
37933
38444
|
isExtensionEnabled,
|
|
37934
38445
|
issues,
|
|
@@ -37947,9 +38458,20 @@ function ContentAppWrapper({
|
|
|
37947
38458
|
handleToggleRecording,
|
|
37948
38459
|
screenRecordingClearRecordedFile,
|
|
37949
38460
|
showStickersRef,
|
|
37950
|
-
setShowStickers
|
|
38461
|
+
setShowStickers,
|
|
38462
|
+
fieldFilters,
|
|
38463
|
+
setFieldFilters
|
|
37951
38464
|
} = useContentAppState();
|
|
37952
38465
|
const { renderMode, saveRenderMode } = useStickerRenderMode();
|
|
38466
|
+
const { isMember } = useAuthContext();
|
|
38467
|
+
const { selectedProjectId } = useProject();
|
|
38468
|
+
const filterProjectId = isMember ? selectedProjectId : null;
|
|
38469
|
+
const { data: filterGroups = [] } = useQuery({
|
|
38470
|
+
queryKey: ["issueFilterGroups", filterProjectId],
|
|
38471
|
+
queryFn: () => filterProjectId ? fetchIssueFilterGroups(filterProjectId) : [],
|
|
38472
|
+
enabled: Boolean(filterProjectId),
|
|
38473
|
+
staleTime: 5 * 6e4
|
|
38474
|
+
});
|
|
37953
38475
|
const nextRenderMode = renderMode === "absolute" ? "target" : "absolute";
|
|
37954
38476
|
const unrenderedCount = unrenderedStickers.length;
|
|
37955
38477
|
const handleOpenMoreMenu = useCallback(() => setMoreMenuOpen(true), []);
|
|
@@ -37980,6 +38502,7 @@ function ContentAppWrapper({
|
|
|
37980
38502
|
onStartRecording: handleToggleRecording,
|
|
37981
38503
|
onStopRecording: handleToggleRecording,
|
|
37982
38504
|
isCreatingIssue,
|
|
38505
|
+
isWritingIssue: clickPosition !== null,
|
|
37983
38506
|
isRecording: screenRecording.isRecording,
|
|
37984
38507
|
recordingStartedAt: screenRecording.startedAt,
|
|
37985
38508
|
showStickers,
|
|
@@ -37989,7 +38512,8 @@ function ContentAppWrapper({
|
|
|
37989
38512
|
unrenderedStickerCount: unrenderedCount,
|
|
37990
38513
|
onOpenUnrenderedStickers: () => setUnrenderedDialogOpen(true),
|
|
37991
38514
|
menuOpen: moreMenuOpen,
|
|
37992
|
-
onMenuOpenChange: setMoreMenuOpen
|
|
38515
|
+
onMenuOpenChange: setMoreMenuOpen,
|
|
38516
|
+
filter: filterProjectId ? { groups: filterGroups, value: fieldFilters, onChange: setFieldFilters } : void 0
|
|
37993
38517
|
}
|
|
37994
38518
|
),
|
|
37995
38519
|
/* @__PURE__ */ jsx(QueryBoundary, { loadingFallback: /* @__PURE__ */ jsx(Fragment, {}), onError: OverlayErrorFallback, children: /* @__PURE__ */ jsx(
|
|
@@ -38035,7 +38559,6 @@ function ContentAppWrapper({
|
|
|
38035
38559
|
SDKManager.getInstance().eventBus.emit("issue:cancelled");
|
|
38036
38560
|
}
|
|
38037
38561
|
},
|
|
38038
|
-
initialDescription: template,
|
|
38039
38562
|
activeIntegration,
|
|
38040
38563
|
isIntegrationLoading
|
|
38041
38564
|
}
|
|
@@ -38079,9 +38602,9 @@ function AuthGate() {
|
|
|
38079
38602
|
) })
|
|
38080
38603
|
] });
|
|
38081
38604
|
}
|
|
38082
|
-
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;--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%;--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{--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;--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}@keyframes onboarding-confetti-x{0%{transform:translate(0)}to{transform:translate(var(--confetti-x))}}@keyframes onboarding-confetti-y{0%{transform:translateY(0);animation-timing-function:cubic-bezier(.12,.66,.32,1)}42%{transform:translateY(var(--confetti-lift));animation-timing-function:cubic-bezier(.58,0,.86,.32)}to{transform:translateY(var(--confetti-drop))}}@keyframes onboarding-confetti-piece{0%{opacity:0;transform:scale(.7) rotate(0)}6%{opacity:1}72%{opacity:1}to{opacity:0;transform:scale(1) rotate(var(--confetti-spin))}}.onboarding-confetti-x,.onboarding-confetti-y,.onboarding-confetti-piece{--confetti-duration: 1.9s;animation-duration:var(--confetti-duration);animation-delay:var(--confetti-delay, 0ms);animation-fill-mode:both}.onboarding-confetti-x{animation-name:onboarding-confetti-x;animation-timing-function:cubic-bezier(.08,.62,.3,1)}.onboarding-confetti-y{animation-name:onboarding-confetti-y;animation-timing-function:linear}.onboarding-confetti-piece{width:var(--confetti-size);height:var(--confetti-size);border-radius:var(--radius-pill) var(--radius-xs) var(--radius-pill) var(--radius-pill);animation-name:onboarding-confetti-piece;animation-timing-function:linear}@media(prefers-reduced-motion:reduce){.onboarding-confetti-x,.onboarding-confetti-y,.onboarding-confetti-piece{animation:none;opacity:0}}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:.5rem;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{background-color:transparent;--tw-text-opacity: 1;color:hsl(var(--text-primary) / var(--tw-text-opacity, 1))}.\\!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:.25rem;right:.25rem}.inset-y-0{top:0;bottom:0}.-bottom-px{bottom:-1px}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-0{left:0}.left-1\\/2{left:50%}.left-2{left:.5rem}.left-4{left:1rem}.left-\\[50\\%\\]{left:50%}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\\/2{top:50%}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-\\[50\\%\\]{top:50%}.top-\\[calc\\(\\(3\\.5rem-1\\.75rem\\)\\/2\\)\\]{top:.875rem}.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:-.5rem;margin-right:-.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-2\\.5{margin-top:.625rem;margin-bottom:.625rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-0\\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.ml-0\\.5{margin-left:.125rem}.ml-4{margin-left:1rem}.mr-1\\.5{margin-right:.375rem}.mt-0{margin-top:0}.mt-0\\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.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:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\\[1\\.4rem\\]{height:1.4rem}.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:6rem}.max-h-40{max-height:10rem}.max-h-56{max-height:14rem}.max-h-96{max-height:24rem}.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 - 3rem)}.max-h-\\[min\\(80vh\\,640px\\)\\]{max-height:min(80vh,640px)}.min-h-0{min-height:0px}.min-h-11{min-height:2.75rem}.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:.125rem}.w-1{width:.25rem}.w-1\\.5{width:.375rem}.w-1\\/2{width:50%}.w-10{width:2.5rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\\[1\\.4rem\\]{width:1.4rem}.w-\\[18px\\]{width:18px}.w-\\[21rem\\]{width:21rem}.w-\\[22rem\\]{width:22rem}.w-\\[30px\\]{width:30px}.w-\\[38px\\]{width:38px}.w-\\[calc\\(100vw-32px\\)\\]{width:calc(100vw - 32px)}.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:2.25rem}.min-w-\\[12rem\\]{min-width:12rem}.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:2rem}.max-w-\\[120px\\]{max-width:120px}.max-w-\\[160px\\]{max-width:160px}.max-w-\\[280px\\]{max-width:280px}.max-w-\\[28rem\\]{max-width:28rem}.max-w-\\[300px\\]{max-width:300px}.max-w-\\[360px\\]{max-width:360px}.max-w-\\[36rem\\]{max-width:36rem}.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:28rem}.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: -.25rem;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: .25rem;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:.125rem}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2{row-gap:.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * 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}.\\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.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:.125rem}.p-1{padding:.25rem}.p-1\\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-3\\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-\\[18px\\]{padding:18px}.px-0{padding-left:0;padding-right:0}.px-1\\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-8{padding-left:2rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2\\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.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:.72rem}.text-\\[1\\.45rem\\]{font-size:1.45rem}.text-\\[1\\.75rem\\]{font-size:1.75rem}.text-\\[10px\\]{font-size:10px}.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:1rem}.leading-5{line-height:1.25rem}.leading-8{line-height:2rem}.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}.\\!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}.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))}.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-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:1rem;padding-right:1rem}.group.toaster .group-\\[\\.toaster\\]\\:py-3{padding-top:.75rem;padding-bottom:.75rem}.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:.625rem}.sm\\:p-5{padding:1.25rem}.sm\\:p-6{padding:1.5rem}.sm\\:text-2xl{font-size:clamp(26px,24.78px + .327vw,30px);line-height:1.308}.sm\\:text-\\[2\\.1rem\\]{font-size:2.1rem}}@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:1rem}.\\[\\&\\>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))}`;
|
|
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))}`;
|
|
38083
38606
|
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}";
|
|
38084
|
-
const contentPageCSS =
|
|
38607
|
+
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}}`;
|
|
38085
38608
|
const PAGE_STYLE_ID = "issue-sticker-page-style";
|
|
38086
38609
|
let root = null;
|
|
38087
38610
|
let mountContainer = null;
|
|
@@ -38095,7 +38618,9 @@ function renderWidget(config) {
|
|
|
38095
38618
|
}
|
|
38096
38619
|
function mountWidget(config) {
|
|
38097
38620
|
if (isIssueStickerExtensionRuntimeActive()) {
|
|
38098
|
-
|
|
38621
|
+
{
|
|
38622
|
+
return;
|
|
38623
|
+
}
|
|
38099
38624
|
}
|
|
38100
38625
|
const existingHost = document.getElementById(ISSUE_STICKER_HOST_ELEMENT_ID);
|
|
38101
38626
|
if (root && mountContainer && existingHost) {
|
|
@@ -38232,7 +38757,10 @@ const IssueSticker = {
|
|
|
38232
38757
|
}
|
|
38233
38758
|
};
|
|
38234
38759
|
if (typeof window !== "undefined") {
|
|
38235
|
-
window.addEventListener(
|
|
38760
|
+
window.addEventListener(
|
|
38761
|
+
ISSUE_STICKER_EXTENSION_RUNTIME_READY_EVENT,
|
|
38762
|
+
destroySdkRuntime
|
|
38763
|
+
);
|
|
38236
38764
|
}
|
|
38237
38765
|
const DESTROY_DELAY_MS = 300;
|
|
38238
38766
|
let activeConsumerCount = 0;
|