issue-sticker 0.5.0 → 0.7.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 +42 -3
- package/dist/{externalUserPayload-zu5IXBjn.js → externalUserPayload-B26uCsCP.js} +388 -212
- package/dist/issue-sticker-headless-react.js +2 -17
- package/dist/issue-sticker-headless.js +2 -10
- package/dist/issue-sticker-react.js +666 -303
- 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 +9 -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 { z as trimLogBackupPayload, A as createSafeLogBackup, B as getLogBackupSessionId, N as NetworkCollector, C as ConsoleCollector, D as createIndexedDbLogBackup, e as buildJiraCreateFields, P as Popover, E as PopoverTrigger, F as Input, G as PopoverContent, L as Label, H as Select, J as SelectTrigger, K as SelectValue, M as SelectContent, O as SelectItem, Q as getJiraMetadata, R as buildJiraIssueFields, T as Button, U as Root2$2, V as Trigger$2, W as ChevronDown, X as Portal, Y as Content2$1, Z as Check, _ as X$1, $ as DatePicker, f as buildNotionCreateFields, a0 as getNotionPageMetadata, a1 as buildNotionFieldViews, c as captureWithModernScreenshot, p as pristineFetch, d as directUploadToSignedUrl, a2 as DirectUploadError, a3 as toast, a4 as getSnapshot, a5 as subscribe, a as uploadSignedMediaWithApi, v as sanitizeString, a6 as getRegisteredUploadId, h as buildGuestOwnerQuery, j as devLogger, w as getCurrentPageUrl, a7 as ChevronRight, a8 as ReactRemoveScroll, a9 as hideOthers, aa as useFocusGuards, ab as FocusScope, ac as getExposedJiraFields, ad as isJiraFieldExposed, n as normalizeExposedJiraFields, y as preloadModernScreenshot, u as uploadScreenshotDataUrls, k as filterExcludeServiceRelatedLogs, l as filterExcludeServiceRelatedConsoleLogs, s as selectNetworkLogsForSubmit, m as compactNetworkLogsForTransport, o as CONSOLE_LOG_SUBMIT_LIMIT, g as getElementPosition, q as buildExternalUserPayload, r as shrinkNetworkLogsToFit, t as measureJsonBytes, i as buildIssueIntegrationsPayload, x 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, al as OnboardingProvider, am as useOnboardingTarget, an as useOnboardingFlow } from "./externalUserPayload-B26uCsCP.js";
|
|
19
20
|
import * as React from "react";
|
|
20
21
|
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
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__;
|
|
@@ -167,9 +167,10 @@ function createCollectorSession(options = {}) {
|
|
|
167
167
|
console: consoleCollector,
|
|
168
168
|
backup,
|
|
169
169
|
async start() {
|
|
170
|
+
var _a, _b2;
|
|
170
171
|
network.start();
|
|
171
172
|
consoleCollector.start();
|
|
172
|
-
const navigationEntry = performanceApi == null ? void 0 : performanceApi.getEntriesByType("navigation")[0];
|
|
173
|
+
const navigationEntry = (_b2 = (_a = performanceApi == null ? void 0 : performanceApi.getEntriesByType) == null ? void 0 : _a.call(performanceApi, "navigation")) == null ? void 0 : _b2[0];
|
|
173
174
|
const navigationLog = createNavigationLog(navigationEntry, (performanceApi == null ? void 0 : performanceApi.timeOrigin) ?? 0);
|
|
174
175
|
if (navigationLog) network.ingest(navigationLog);
|
|
175
176
|
stopResourceObserver = observeResourceLogs(
|
|
@@ -211,15 +212,6 @@ function buildAdminIssueUrl(issueId, options) {
|
|
|
211
212
|
if (!adminBaseUrl) return null;
|
|
212
213
|
return new URL(`/issues/${encodeURIComponent(normalizedIssueId)}`, adminBaseUrl).toString();
|
|
213
214
|
}
|
|
214
|
-
function buildAdminProjectTitlePatternUrl(projectId, options) {
|
|
215
|
-
const normalizedProjectId = projectId.trim();
|
|
216
|
-
if (!normalizedProjectId) return null;
|
|
217
|
-
const adminBaseUrl = resolveAdminBaseUrl(options);
|
|
218
|
-
if (!adminBaseUrl) return null;
|
|
219
|
-
const url = new URL(`/projects/${encodeURIComponent(normalizedProjectId)}`, adminBaseUrl);
|
|
220
|
-
url.searchParams.set("tab", "title-pattern");
|
|
221
|
-
return url.toString();
|
|
222
|
-
}
|
|
223
215
|
const FAILED_ACTION_TEXT = {
|
|
224
216
|
jira: "Jira 이슈를 생성하지 못했습니다.",
|
|
225
217
|
notion: "Notion 페이지를 생성하지 못했습니다.",
|
|
@@ -264,6 +256,86 @@ function createJiraFieldSearchConfig(source) {
|
|
|
264
256
|
return null;
|
|
265
257
|
};
|
|
266
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
|
+
}
|
|
267
339
|
const SEARCH_DEBOUNCE_MS = 250;
|
|
268
340
|
function AsyncSearchSelect({
|
|
269
341
|
value,
|
|
@@ -719,6 +791,22 @@ const PenLine = createLucideIcon$1("PenLine", [
|
|
|
719
791
|
}
|
|
720
792
|
]
|
|
721
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
|
+
]);
|
|
722
810
|
/**
|
|
723
811
|
* @license lucide-react v0.468.0 - ISC
|
|
724
812
|
*
|
|
@@ -789,28 +877,6 @@ const TriangleAlert = createLucideIcon$1("TriangleAlert", [
|
|
|
789
877
|
["path", { d: "M12 9v4", key: "juzpu7" }],
|
|
790
878
|
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
791
879
|
]);
|
|
792
|
-
/**
|
|
793
|
-
* @license lucide-react v0.468.0 - ISC
|
|
794
|
-
*
|
|
795
|
-
* This source code is licensed under the ISC license.
|
|
796
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
797
|
-
*/
|
|
798
|
-
const WandSparkles = createLucideIcon$1("WandSparkles", [
|
|
799
|
-
[
|
|
800
|
-
"path",
|
|
801
|
-
{
|
|
802
|
-
d: "m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",
|
|
803
|
-
key: "ul74o6"
|
|
804
|
-
}
|
|
805
|
-
],
|
|
806
|
-
["path", { d: "m14 7 3 3", key: "1r5n42" }],
|
|
807
|
-
["path", { d: "M5 6v4", key: "ilb8ba" }],
|
|
808
|
-
["path", { d: "M19 14v4", key: "blhpug" }],
|
|
809
|
-
["path", { d: "M10 2v2", key: "7u0qdc" }],
|
|
810
|
-
["path", { d: "M7 8H3", key: "zfb6yr" }],
|
|
811
|
-
["path", { d: "M21 16h-4", key: "1cnmox" }],
|
|
812
|
-
["path", { d: "M11 3H9", key: "1obp7u" }]
|
|
813
|
-
]);
|
|
814
880
|
const EMPTY_SELECT_VALUE$1 = "__ISSUE_STICKER_EMPTY__";
|
|
815
881
|
const JIRA_REQUIRED_FIELD_IDS = /* @__PURE__ */ new Set(["priority"]);
|
|
816
882
|
function JiraReadonlyField({ field }) {
|
|
@@ -14243,6 +14309,7 @@ function ToastContainer({ position: position2 = "top-right" }) {
|
|
|
14243
14309
|
const content2 = /* @__PURE__ */ jsx(
|
|
14244
14310
|
"div",
|
|
14245
14311
|
{
|
|
14312
|
+
"data-issue-sticker-toast-layer": "",
|
|
14246
14313
|
className: cn$1(
|
|
14247
14314
|
`pointer-events-none fixed ${OVERLAY_LAYER.toast} flex flex-col-reverse`,
|
|
14248
14315
|
positionClass
|
|
@@ -14477,7 +14544,7 @@ const issueService = {
|
|
|
14477
14544
|
invalidateCache() {
|
|
14478
14545
|
invalidateIssuesCache();
|
|
14479
14546
|
},
|
|
14480
|
-
// 계약
|
|
14547
|
+
// 계약 기준: 백엔드 GET /api/sdk/issues/:id 는 back#101부터 읽기-시점-스크럽된
|
|
14481
14548
|
// llm_prompt 를 상세 응답에 포함한다(목록 응답에는 없음) — 스코프를 이 반환 타입에만 한정한다.
|
|
14482
14549
|
async getIssue(id2) {
|
|
14483
14550
|
return apiClient.get(
|
|
@@ -14494,7 +14561,7 @@ const issueService = {
|
|
|
14494
14561
|
return issue;
|
|
14495
14562
|
},
|
|
14496
14563
|
/**
|
|
14497
|
-
* 재생성. 스펙상 세
|
|
14564
|
+
* 재생성. 스펙상 세 채널 모두에서 되고 역할과 무관하다 — 검사는 역할이 아니라
|
|
14498
14565
|
* 그 이슈에 접근할 수 있는지다(백엔드가 판정한다).
|
|
14499
14566
|
*
|
|
14500
14567
|
* 응답으로 갱신된 이슈가 오지만 상태는 다시 pending 이다. 호출부는 응답을
|
|
@@ -14875,6 +14942,7 @@ const ISSUE_DRAFT_DISABLED_MESSAGE = "지금은 AI 작성을 사용할 수 없
|
|
|
14875
14942
|
const LABEL = "기대한 동작";
|
|
14876
14943
|
const PLACEHOLDER = "예: 할인 쿠폰을 적용하면 결제 금액에서 즉시 차감되어야 합니다";
|
|
14877
14944
|
const SWITCH_TO_MANUAL = "직접 작성";
|
|
14945
|
+
const SWITCH_TO_MANUAL_TOOLTIP = "제목, 설명 등 이슈 필드를 직접 작성합니다";
|
|
14878
14946
|
const SUBMIT = "보내기";
|
|
14879
14947
|
const MAX_INPUT_HEIGHT = 160;
|
|
14880
14948
|
const FOCUS_RETRY_BUDGET_MS = 1e3;
|
|
@@ -14888,7 +14956,8 @@ function IssueIntentBubble({
|
|
|
14888
14956
|
onSubmit,
|
|
14889
14957
|
onSwitchToManual,
|
|
14890
14958
|
submitting = false,
|
|
14891
|
-
error = null
|
|
14959
|
+
error = null,
|
|
14960
|
+
toolbar
|
|
14892
14961
|
}) {
|
|
14893
14962
|
const inputRef = useRef(null);
|
|
14894
14963
|
const canSubmit = !submitting && value.trim().length > 0;
|
|
@@ -14937,7 +15006,7 @@ function IssueIntentBubble({
|
|
|
14937
15006
|
/* @__PURE__ */ jsxs(
|
|
14938
15007
|
"div",
|
|
14939
15008
|
{
|
|
14940
|
-
className: `${ISSUE_STICKER_REPORT_FORM_CLASS} w-
|
|
15009
|
+
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`,
|
|
14941
15010
|
children: [
|
|
14942
15011
|
/* @__PURE__ */ jsxs("div", { className: "flex items-end gap-1.5", children: [
|
|
14943
15012
|
/* @__PURE__ */ jsx(
|
|
@@ -14966,9 +15035,23 @@ function IssueIntentBubble({
|
|
|
14966
15035
|
)
|
|
14967
15036
|
] }),
|
|
14968
15037
|
error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-danger", children: error }) : null,
|
|
14969
|
-
/* @__PURE__ */ jsxs(
|
|
14970
|
-
/* @__PURE__ */ jsx(
|
|
14971
|
-
|
|
15038
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
15039
|
+
/* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 240, skipDelayDuration: 120, disableHoverableContent: true, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
15040
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
15041
|
+
Button,
|
|
15042
|
+
{
|
|
15043
|
+
type: "button",
|
|
15044
|
+
variant: "secondary",
|
|
15045
|
+
size: "icon",
|
|
15046
|
+
className: "h-7 w-7",
|
|
15047
|
+
"aria-label": SWITCH_TO_MANUAL,
|
|
15048
|
+
onClick: onSwitchToManual,
|
|
15049
|
+
children: /* @__PURE__ */ jsx(PenLine, { className: "h-3.5 w-3.5" })
|
|
15050
|
+
}
|
|
15051
|
+
) }),
|
|
15052
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", sideOffset: 10, children: SWITCH_TO_MANUAL_TOOLTIP })
|
|
15053
|
+
] }) }),
|
|
15054
|
+
toolbar ?? null
|
|
14972
15055
|
] })
|
|
14973
15056
|
]
|
|
14974
15057
|
}
|
|
@@ -15535,6 +15618,180 @@ function IssueIntentBubbleAnchor({
|
|
|
15535
15618
|
)
|
|
15536
15619
|
] });
|
|
15537
15620
|
}
|
|
15621
|
+
function appendSnippet(base, body) {
|
|
15622
|
+
const trimmedBody = body.trim();
|
|
15623
|
+
if (!trimmedBody) return base;
|
|
15624
|
+
const trimmedBase = base.trimEnd();
|
|
15625
|
+
if (!trimmedBase) return trimmedBody;
|
|
15626
|
+
return `${trimmedBase}
|
|
15627
|
+
|
|
15628
|
+
${trimmedBody}`;
|
|
15629
|
+
}
|
|
15630
|
+
const TRIGGER_LABEL = "고정 문구 선택";
|
|
15631
|
+
const CLEAR_OPTION_LABEL = "선택 안 함";
|
|
15632
|
+
const GROUP_LABEL = {
|
|
15633
|
+
project: "공용 문구",
|
|
15634
|
+
personal: "내 문구"
|
|
15635
|
+
};
|
|
15636
|
+
function SnippetPicker({
|
|
15637
|
+
snippets,
|
|
15638
|
+
selectedId,
|
|
15639
|
+
onSelect,
|
|
15640
|
+
disabled = false
|
|
15641
|
+
}) {
|
|
15642
|
+
const [open, setOpen] = useState(false);
|
|
15643
|
+
const listRef = useRef(null);
|
|
15644
|
+
const optionRefs = useRef([]);
|
|
15645
|
+
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
15646
|
+
const selected = snippets.find((snippet) => snippet.id === selectedId) ?? null;
|
|
15647
|
+
const isEmpty = snippets.length === 0;
|
|
15648
|
+
const projectSnippets = snippets.filter((snippet) => snippet.scope === "project");
|
|
15649
|
+
const personalSnippets = snippets.filter((snippet) => snippet.scope === "personal");
|
|
15650
|
+
const orderedSnippets = [...projectSnippets, ...personalSnippets];
|
|
15651
|
+
useEffect(() => {
|
|
15652
|
+
if (!open) return;
|
|
15653
|
+
const selectedIndex = selectedId ? orderedSnippets.findIndex((snippet) => snippet.id === selectedId) + 1 : 0;
|
|
15654
|
+
setFocusedIndex(Math.max(selectedIndex, 0));
|
|
15655
|
+
}, [open]);
|
|
15656
|
+
useEffect(() => {
|
|
15657
|
+
var _a;
|
|
15658
|
+
if (!open) return;
|
|
15659
|
+
(_a = optionRefs.current[focusedIndex]) == null ? void 0 : _a.focus();
|
|
15660
|
+
}, [open, focusedIndex]);
|
|
15661
|
+
function selectAndClose(id2) {
|
|
15662
|
+
onSelect(id2);
|
|
15663
|
+
setOpen(false);
|
|
15664
|
+
}
|
|
15665
|
+
function handleListKeyDown(event) {
|
|
15666
|
+
const lastIndex = orderedSnippets.length;
|
|
15667
|
+
switch (event.key) {
|
|
15668
|
+
case "ArrowDown":
|
|
15669
|
+
event.preventDefault();
|
|
15670
|
+
setFocusedIndex((index2) => Math.min(index2 + 1, lastIndex));
|
|
15671
|
+
break;
|
|
15672
|
+
case "ArrowUp":
|
|
15673
|
+
event.preventDefault();
|
|
15674
|
+
setFocusedIndex((index2) => Math.max(index2 - 1, 0));
|
|
15675
|
+
break;
|
|
15676
|
+
case "Home":
|
|
15677
|
+
event.preventDefault();
|
|
15678
|
+
setFocusedIndex(0);
|
|
15679
|
+
break;
|
|
15680
|
+
case "End":
|
|
15681
|
+
event.preventDefault();
|
|
15682
|
+
setFocusedIndex(lastIndex);
|
|
15683
|
+
break;
|
|
15684
|
+
}
|
|
15685
|
+
}
|
|
15686
|
+
function optionClassName(isSelected) {
|
|
15687
|
+
return cn$1(
|
|
15688
|
+
"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",
|
|
15689
|
+
"hover:bg-surface-2 focus-visible:border-line-focus",
|
|
15690
|
+
isSelected && "bg-surface-2"
|
|
15691
|
+
);
|
|
15692
|
+
}
|
|
15693
|
+
let optionIndex = 0;
|
|
15694
|
+
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: disabled ? void 0 : setOpen, children: [
|
|
15695
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
15696
|
+
"button",
|
|
15697
|
+
{
|
|
15698
|
+
type: "button",
|
|
15699
|
+
disabled: disabled || isEmpty,
|
|
15700
|
+
className: cn$1(
|
|
15701
|
+
"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",
|
|
15702
|
+
"hover:bg-surface-2 focus-visible:border-line-focus disabled:cursor-not-allowed disabled:opacity-40"
|
|
15703
|
+
),
|
|
15704
|
+
children: [
|
|
15705
|
+
/* @__PURE__ */ jsx(Pin, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
15706
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: selected ? selected.label : TRIGGER_LABEL }),
|
|
15707
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3 shrink-0" })
|
|
15708
|
+
]
|
|
15709
|
+
}
|
|
15710
|
+
) }),
|
|
15711
|
+
/* @__PURE__ */ jsx(
|
|
15712
|
+
PopoverContent,
|
|
15713
|
+
{
|
|
15714
|
+
align: "start",
|
|
15715
|
+
sideOffset: 4,
|
|
15716
|
+
onEscapeKeyDown: stopEscapePropagation(),
|
|
15717
|
+
className: cn$1(`panel-shell-subtle w-72 p-1.5 shadow-lg ${OVERLAY_LAYER.floating}`),
|
|
15718
|
+
children: /* @__PURE__ */ jsxs(
|
|
15719
|
+
"div",
|
|
15720
|
+
{
|
|
15721
|
+
ref: listRef,
|
|
15722
|
+
role: "listbox",
|
|
15723
|
+
"aria-label": TRIGGER_LABEL,
|
|
15724
|
+
onKeyDown: handleListKeyDown,
|
|
15725
|
+
className: "flex max-h-80 flex-col gap-0.5 overflow-y-auto",
|
|
15726
|
+
children: [
|
|
15727
|
+
/* @__PURE__ */ jsx(
|
|
15728
|
+
"button",
|
|
15729
|
+
{
|
|
15730
|
+
ref: (node2) => {
|
|
15731
|
+
optionRefs.current[0] = node2;
|
|
15732
|
+
},
|
|
15733
|
+
type: "button",
|
|
15734
|
+
role: "option",
|
|
15735
|
+
"aria-selected": selectedId === null,
|
|
15736
|
+
tabIndex: focusedIndex === 0 ? 0 : -1,
|
|
15737
|
+
onClick: () => selectAndClose(null),
|
|
15738
|
+
className: optionClassName(selectedId === null),
|
|
15739
|
+
children: /* @__PURE__ */ jsx("span", { className: "text-sm text-text-secondary", children: CLEAR_OPTION_LABEL })
|
|
15740
|
+
}
|
|
15741
|
+
),
|
|
15742
|
+
[["project", projectSnippets], ["personal", personalSnippets]].map(
|
|
15743
|
+
([scope, groupSnippets]) => groupSnippets.length === 0 ? null : /* @__PURE__ */ jsxs(
|
|
15744
|
+
"div",
|
|
15745
|
+
{
|
|
15746
|
+
className: "border-t border-line-subtle pt-1 mt-1 first:mt-0 first:border-t-0 first:pt-0",
|
|
15747
|
+
children: [
|
|
15748
|
+
/* @__PURE__ */ jsx(
|
|
15749
|
+
"div",
|
|
15750
|
+
{
|
|
15751
|
+
role: "presentation",
|
|
15752
|
+
className: "px-2.5 pb-1 pt-1 text-[11px] font-medium text-text-tertiary",
|
|
15753
|
+
children: GROUP_LABEL[scope]
|
|
15754
|
+
}
|
|
15755
|
+
),
|
|
15756
|
+
groupSnippets.map((snippet) => {
|
|
15757
|
+
optionIndex += 1;
|
|
15758
|
+
const index2 = optionIndex;
|
|
15759
|
+
const isSelected = snippet.id === selectedId;
|
|
15760
|
+
return /* @__PURE__ */ jsxs(
|
|
15761
|
+
"button",
|
|
15762
|
+
{
|
|
15763
|
+
ref: (node2) => {
|
|
15764
|
+
optionRefs.current[index2] = node2;
|
|
15765
|
+
},
|
|
15766
|
+
type: "button",
|
|
15767
|
+
role: "option",
|
|
15768
|
+
"aria-selected": isSelected,
|
|
15769
|
+
tabIndex: focusedIndex === index2 ? 0 : -1,
|
|
15770
|
+
onClick: () => selectAndClose(snippet.id),
|
|
15771
|
+
className: optionClassName(isSelected),
|
|
15772
|
+
children: [
|
|
15773
|
+
/* @__PURE__ */ jsxs("span", { className: "flex w-full items-center justify-between gap-2", children: [
|
|
15774
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-sm text-text-primary", children: snippet.label }),
|
|
15775
|
+
isSelected ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 shrink-0 text-brand" }) : null
|
|
15776
|
+
] }),
|
|
15777
|
+
/* @__PURE__ */ jsx("span", { className: "line-clamp-2 text-xs text-text-tertiary", children: snippet.body })
|
|
15778
|
+
]
|
|
15779
|
+
},
|
|
15780
|
+
snippet.id
|
|
15781
|
+
);
|
|
15782
|
+
})
|
|
15783
|
+
]
|
|
15784
|
+
},
|
|
15785
|
+
scope
|
|
15786
|
+
)
|
|
15787
|
+
)
|
|
15788
|
+
]
|
|
15789
|
+
}
|
|
15790
|
+
)
|
|
15791
|
+
}
|
|
15792
|
+
)
|
|
15793
|
+
] });
|
|
15794
|
+
}
|
|
15538
15795
|
function useProject() {
|
|
15539
15796
|
const auth = useAuthContext();
|
|
15540
15797
|
return {
|
|
@@ -15714,20 +15971,15 @@ function useJiraConnectNudge(projectId, enabled) {
|
|
|
15714
15971
|
const isResolving = isEnabled && !isFetched;
|
|
15715
15972
|
return { needsConnect, connect, isResolving };
|
|
15716
15973
|
}
|
|
15717
|
-
function useIssueFormState(
|
|
15974
|
+
function useIssueFormState() {
|
|
15718
15975
|
const [title, setTitle] = useState("");
|
|
15719
|
-
const [description, setDescription] = useState(
|
|
15976
|
+
const [description, setDescription] = useState("");
|
|
15720
15977
|
const [mode, setMode] = useState("ai");
|
|
15721
15978
|
const [renderedMode, setRenderedMode] = useState("ai");
|
|
15722
15979
|
const [intent, setIntent] = useState("");
|
|
15723
15980
|
const modeRef = useRef(mode);
|
|
15724
15981
|
modeRef.current = mode;
|
|
15725
15982
|
const finishModeTransition = useCallback(() => setRenderedMode(modeRef.current), []);
|
|
15726
|
-
useEffect(() => {
|
|
15727
|
-
if (initialDescription !== void 0) {
|
|
15728
|
-
setDescription(initialDescription);
|
|
15729
|
-
}
|
|
15730
|
-
}, [initialDescription]);
|
|
15731
15983
|
return {
|
|
15732
15984
|
title,
|
|
15733
15985
|
description,
|
|
@@ -15883,6 +16135,26 @@ function waitForFormOpen() {
|
|
|
15883
16135
|
setTimeout(resolve, CAPTURE_START_DELAY_MS);
|
|
15884
16136
|
});
|
|
15885
16137
|
}
|
|
16138
|
+
const BLOCKED_PAGE_EVENTS = [
|
|
16139
|
+
"pointerdown",
|
|
16140
|
+
"pointerup",
|
|
16141
|
+
"mousedown",
|
|
16142
|
+
"mouseup",
|
|
16143
|
+
"dblclick",
|
|
16144
|
+
"auxclick",
|
|
16145
|
+
"contextmenu"
|
|
16146
|
+
];
|
|
16147
|
+
function isOwnRuntimeTarget(target) {
|
|
16148
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
16149
|
+
return target.closest(".issue-sticker-marker") !== null || target.closest("#issue-sticker-host") !== null;
|
|
16150
|
+
}
|
|
16151
|
+
const HIGHLIGHT_CLASS = "issue-sticker-mode-highlight";
|
|
16152
|
+
function highlightElement(element2) {
|
|
16153
|
+
element2.classList.add(HIGHLIGHT_CLASS);
|
|
16154
|
+
}
|
|
16155
|
+
function unhighlightElement(element2) {
|
|
16156
|
+
element2 == null ? void 0 : element2.classList.remove(HIGHLIGHT_CLASS);
|
|
16157
|
+
}
|
|
15886
16158
|
function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
15887
16159
|
const [clickPosition, setClickPosition] = useState(null);
|
|
15888
16160
|
const clickPositionRef = useRef(null);
|
|
@@ -15893,6 +16165,8 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15893
16165
|
useEffect(() => {
|
|
15894
16166
|
const handleMouseOver = (e) => {
|
|
15895
16167
|
if (!isCreatingIssueRef.current) {
|
|
16168
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16169
|
+
highlightedElementRef.current = null;
|
|
15896
16170
|
return;
|
|
15897
16171
|
}
|
|
15898
16172
|
preloadModernScreenshot();
|
|
@@ -15906,14 +16180,14 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15906
16180
|
if (target.closest(".issue-sticker-marker") || target.closest(".issue-form-overlay") || target.closest(".issue-popover") || target.closest("#issue-sticker-host")) {
|
|
15907
16181
|
return;
|
|
15908
16182
|
}
|
|
15909
|
-
|
|
15910
|
-
|
|
15911
|
-
}
|
|
15912
|
-
target.classList.add("issue-sticker-mode-highlight");
|
|
16183
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16184
|
+
highlightElement(target);
|
|
15913
16185
|
highlightedElementRef.current = target;
|
|
15914
16186
|
};
|
|
15915
16187
|
const handleMouseOut = (e) => {
|
|
15916
16188
|
if (!isCreatingIssueRef.current) {
|
|
16189
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16190
|
+
highlightedElementRef.current = null;
|
|
15917
16191
|
return;
|
|
15918
16192
|
}
|
|
15919
16193
|
const target = e.target;
|
|
@@ -15921,7 +16195,7 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15921
16195
|
return;
|
|
15922
16196
|
}
|
|
15923
16197
|
if (highlightedElementRef.current === target) {
|
|
15924
|
-
target
|
|
16198
|
+
unhighlightElement(target);
|
|
15925
16199
|
highlightedElementRef.current = null;
|
|
15926
16200
|
}
|
|
15927
16201
|
};
|
|
@@ -15934,10 +16208,8 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15934
16208
|
passive: true
|
|
15935
16209
|
});
|
|
15936
16210
|
return () => {
|
|
15937
|
-
|
|
15938
|
-
|
|
15939
|
-
highlightedElementRef.current = null;
|
|
15940
|
-
}
|
|
16211
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16212
|
+
highlightedElementRef.current = null;
|
|
15941
16213
|
document.removeEventListener("mouseover", handleMouseOver, {
|
|
15942
16214
|
capture: true
|
|
15943
16215
|
});
|
|
@@ -15999,10 +16271,8 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
15999
16271
|
e.preventDefault();
|
|
16000
16272
|
e.stopImmediatePropagation();
|
|
16001
16273
|
const selectedElement = highlightedElementRef.current ?? clickTarget;
|
|
16002
|
-
|
|
16003
|
-
|
|
16004
|
-
highlightedElementRef.current = null;
|
|
16005
|
-
}
|
|
16274
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16275
|
+
highlightedElementRef.current = null;
|
|
16006
16276
|
const newClickPosition = {
|
|
16007
16277
|
x: e.clientX + window.scrollX,
|
|
16008
16278
|
y: e.clientY + window.scrollY,
|
|
@@ -16015,23 +16285,35 @@ function useClickPosition(isCreatingIssueRef, recordedVideoFile) {
|
|
|
16015
16285
|
setClickPosition(newClickPosition);
|
|
16016
16286
|
clickPositionRef.current = newClickPosition;
|
|
16017
16287
|
};
|
|
16288
|
+
const blockPageEvent = (e) => {
|
|
16289
|
+
if (!isCreatingIssueRef.current) return;
|
|
16290
|
+
if (isOwnRuntimeTarget(e.target)) return;
|
|
16291
|
+
e.preventDefault();
|
|
16292
|
+
e.stopImmediatePropagation();
|
|
16293
|
+
};
|
|
16018
16294
|
document.addEventListener("click", handleDocumentClick, {
|
|
16019
16295
|
capture: true,
|
|
16020
16296
|
passive: false
|
|
16021
16297
|
});
|
|
16298
|
+
BLOCKED_PAGE_EVENTS.forEach((type) => {
|
|
16299
|
+
document.addEventListener(type, blockPageEvent, { capture: true, passive: false });
|
|
16300
|
+
});
|
|
16022
16301
|
return () => {
|
|
16023
16302
|
document.removeEventListener("click", handleDocumentClick, {
|
|
16024
16303
|
capture: true
|
|
16025
16304
|
});
|
|
16305
|
+
BLOCKED_PAGE_EVENTS.forEach((type) => {
|
|
16306
|
+
document.removeEventListener(type, blockPageEvent, {
|
|
16307
|
+
capture: true
|
|
16308
|
+
});
|
|
16309
|
+
});
|
|
16026
16310
|
};
|
|
16027
16311
|
}, [isCreatingIssueRef, recordedVideoFile]);
|
|
16028
16312
|
const clearClickPosition = () => {
|
|
16029
16313
|
setClickPosition(null);
|
|
16030
16314
|
clickPositionRef.current = null;
|
|
16031
|
-
|
|
16032
|
-
|
|
16033
|
-
highlightedElementRef.current = null;
|
|
16034
|
-
}
|
|
16315
|
+
unhighlightElement(highlightedElementRef.current);
|
|
16316
|
+
highlightedElementRef.current = null;
|
|
16035
16317
|
};
|
|
16036
16318
|
const setClickPositionManually = (position2) => {
|
|
16037
16319
|
setClickPosition(position2);
|
|
@@ -16135,7 +16417,8 @@ function useIssueSubmission({
|
|
|
16135
16417
|
activeIntegrationType,
|
|
16136
16418
|
notionIntegrationId,
|
|
16137
16419
|
videoFile,
|
|
16138
|
-
sessionReplay
|
|
16420
|
+
sessionReplay,
|
|
16421
|
+
snippetId
|
|
16139
16422
|
}) {
|
|
16140
16423
|
const failedServicesRef = useRef([]);
|
|
16141
16424
|
const { fetchNetworkLogs } = useNetworkLogs();
|
|
@@ -16199,6 +16482,7 @@ function useIssueSubmission({
|
|
|
16199
16482
|
tenant_id: authInfo.tenantId,
|
|
16200
16483
|
project_id: authInfo.projectId,
|
|
16201
16484
|
account_id: authInfo.accountId || void 0,
|
|
16485
|
+
snippet_id: snippetId ?? void 0,
|
|
16202
16486
|
...buildExternalUserPayload(SDKManager.getInstance().config.user),
|
|
16203
16487
|
// 비어 있는 값은 보내지 않는다 — 저장해봐야 값 없음과 같고 요청만 커진다.
|
|
16204
16488
|
custom_field_values: Object.entries(customFieldValues ?? {}).filter(([, value]) => value !== null && value !== void 0 && value !== "").map(([field_definition_id, value]) => ({ field_definition_id, value }))
|
|
@@ -16286,6 +16570,141 @@ function useIssueSubmission({
|
|
|
16286
16570
|
error: createIssueMutation.error ? `이슈 생성에 실패했습니다: ${createIssueMutation.error instanceof Error ? createIssueMutation.error.message : "알 수 없는 오류"}` : null
|
|
16287
16571
|
};
|
|
16288
16572
|
}
|
|
16573
|
+
async function fetchSnippets(projectId) {
|
|
16574
|
+
try {
|
|
16575
|
+
return await apiClient.get(
|
|
16576
|
+
`/api/snippets?projectId=${encodeURIComponent(projectId)}`
|
|
16577
|
+
);
|
|
16578
|
+
} catch (error) {
|
|
16579
|
+
devLogger.error("snippetService", "고정 문구 조회 실패:", error);
|
|
16580
|
+
return [];
|
|
16581
|
+
}
|
|
16582
|
+
}
|
|
16583
|
+
function buildSettingsQuery(settingKey, projectId, serviceType) {
|
|
16584
|
+
const params = new URLSearchParams({ setting_key: settingKey });
|
|
16585
|
+
if (projectId) {
|
|
16586
|
+
params.set("project_id", projectId);
|
|
16587
|
+
}
|
|
16588
|
+
{
|
|
16589
|
+
params.set("service_type", serviceType);
|
|
16590
|
+
}
|
|
16591
|
+
return `/api/settings?${params.toString()}`;
|
|
16592
|
+
}
|
|
16593
|
+
async function getSetting(settingKey, defaultValue, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
16594
|
+
try {
|
|
16595
|
+
const data = await apiClient.get(
|
|
16596
|
+
buildSettingsQuery(settingKey, projectId, serviceType)
|
|
16597
|
+
);
|
|
16598
|
+
if (!data) {
|
|
16599
|
+
if (defaultValue !== null && defaultValue !== void 0 && defaultValue !== "") {
|
|
16600
|
+
await initializeSetting(settingKey, defaultValue, projectId, serviceType);
|
|
16601
|
+
}
|
|
16602
|
+
return defaultValue;
|
|
16603
|
+
}
|
|
16604
|
+
return data.setting_value ?? defaultValue;
|
|
16605
|
+
} catch (error) {
|
|
16606
|
+
devLogger.error("settingsService", `설정 로드 실패 (${settingKey}):`, error);
|
|
16607
|
+
return defaultValue;
|
|
16608
|
+
}
|
|
16609
|
+
}
|
|
16610
|
+
async function initializeSetting(settingKey, value, projectId, serviceType) {
|
|
16611
|
+
try {
|
|
16612
|
+
await apiClient.put("/api/settings", {
|
|
16613
|
+
setting_key: settingKey,
|
|
16614
|
+
setting_value: value,
|
|
16615
|
+
project_id: projectId ?? null,
|
|
16616
|
+
service_type: serviceType ?? null
|
|
16617
|
+
});
|
|
16618
|
+
} catch (error) {
|
|
16619
|
+
devLogger.error("settingsService", `설정 초기화 실패 (${settingKey}):`, error);
|
|
16620
|
+
}
|
|
16621
|
+
}
|
|
16622
|
+
async function setSetting(settingKey, value, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
16623
|
+
try {
|
|
16624
|
+
await apiClient.put("/api/settings", {
|
|
16625
|
+
setting_key: settingKey,
|
|
16626
|
+
setting_value: value,
|
|
16627
|
+
project_id: projectId ?? null,
|
|
16628
|
+
service_type: serviceType ?? null
|
|
16629
|
+
});
|
|
16630
|
+
} catch (error) {
|
|
16631
|
+
devLogger.error("settingsService", `설정 저장 실패 (${settingKey}):`, error);
|
|
16632
|
+
throw error;
|
|
16633
|
+
}
|
|
16634
|
+
}
|
|
16635
|
+
function useAuth() {
|
|
16636
|
+
const ctx = useAuthContext();
|
|
16637
|
+
return {
|
|
16638
|
+
isAuthenticated: ctx.isAuthenticated,
|
|
16639
|
+
isMember: ctx.isMember,
|
|
16640
|
+
isLoading: ctx.isLoading,
|
|
16641
|
+
user: ctx.accountId ? { id: ctx.accountId, email: "" } : null,
|
|
16642
|
+
tenant: ctx.tenantId ? { id: ctx.tenantId, name: "", slug: "" } : null,
|
|
16643
|
+
accountId: ctx.accountId
|
|
16644
|
+
};
|
|
16645
|
+
}
|
|
16646
|
+
const EMPTY$1 = [];
|
|
16647
|
+
const SETTING_KEY = "lastIssueSnippetId";
|
|
16648
|
+
function useSnippets(projectId) {
|
|
16649
|
+
const { isMember } = useAuth();
|
|
16650
|
+
const [manualSelectedId, setManualSelectedId] = useState(void 0);
|
|
16651
|
+
useEffect(() => {
|
|
16652
|
+
setManualSelectedId(void 0);
|
|
16653
|
+
}, [projectId]);
|
|
16654
|
+
const enabled = Boolean(projectId) && isMember;
|
|
16655
|
+
const { data: snippets = EMPTY$1 } = useQuery({
|
|
16656
|
+
queryKey: ["issueSnippets", projectId ?? "none"],
|
|
16657
|
+
queryFn: () => projectId ? fetchSnippets(projectId) : Promise.resolve(EMPTY$1),
|
|
16658
|
+
enabled,
|
|
16659
|
+
staleTime: 5 * 60 * 1e3
|
|
16660
|
+
});
|
|
16661
|
+
const { data: rememberedId = null } = useQuery({
|
|
16662
|
+
queryKey: ["lastIssueSnippetId", projectId ?? "none"],
|
|
16663
|
+
queryFn: () => projectId ? getSetting(
|
|
16664
|
+
SETTING_KEY,
|
|
16665
|
+
null,
|
|
16666
|
+
void 0,
|
|
16667
|
+
void 0,
|
|
16668
|
+
void 0,
|
|
16669
|
+
projectId,
|
|
16670
|
+
"GENERAL"
|
|
16671
|
+
) : Promise.resolve(null),
|
|
16672
|
+
enabled
|
|
16673
|
+
});
|
|
16674
|
+
const candidateId = manualSelectedId !== void 0 ? manualSelectedId : rememberedId;
|
|
16675
|
+
const selectedId = candidateId && snippets.some((s) => s.id === candidateId) ? candidateId : null;
|
|
16676
|
+
const setSelectedId = useCallback((id2) => {
|
|
16677
|
+
setManualSelectedId(id2);
|
|
16678
|
+
}, []);
|
|
16679
|
+
const rememberSelection = useCallback(async () => {
|
|
16680
|
+
if (!projectId || !isMember) return;
|
|
16681
|
+
try {
|
|
16682
|
+
await setSetting(
|
|
16683
|
+
SETTING_KEY,
|
|
16684
|
+
selectedId,
|
|
16685
|
+
void 0,
|
|
16686
|
+
void 0,
|
|
16687
|
+
void 0,
|
|
16688
|
+
projectId,
|
|
16689
|
+
"GENERAL"
|
|
16690
|
+
);
|
|
16691
|
+
} catch {
|
|
16692
|
+
}
|
|
16693
|
+
}, [projectId, isMember, selectedId]);
|
|
16694
|
+
return { snippets, selectedId, setSelectedId, rememberSelection };
|
|
16695
|
+
}
|
|
16696
|
+
function mergeSnippetIntoDescription(currentDescription, prevBody, nextBody) {
|
|
16697
|
+
const normalizedNext = nextBody || null;
|
|
16698
|
+
if (prevBody === normalizedNext) {
|
|
16699
|
+
return { ref: prevBody };
|
|
16700
|
+
}
|
|
16701
|
+
const trimmedCurrent = currentDescription.trimEnd();
|
|
16702
|
+
if (prevBody && !trimmedCurrent.endsWith(prevBody)) {
|
|
16703
|
+
return { ref: null };
|
|
16704
|
+
}
|
|
16705
|
+
const base = prevBody ? trimmedCurrent.slice(0, trimmedCurrent.length - prevBody.length).trimEnd() : currentDescription;
|
|
16706
|
+
return { ref: normalizedNext, description: appendSnippet(base, nextBody) };
|
|
16707
|
+
}
|
|
16289
16708
|
function useSessionReplayController() {
|
|
16290
16709
|
const controllerRef = useRef(null);
|
|
16291
16710
|
if (!controllerRef.current) {
|
|
@@ -16778,23 +17197,21 @@ function useDraftCapability() {
|
|
|
16778
17197
|
return {
|
|
16779
17198
|
/** 응답을 실제로 받았을 때만 true. 조회 전·실패·null 응답에서는 false다. */
|
|
16780
17199
|
resolved: Boolean(capability),
|
|
16781
|
-
enabled: (capability == null ? void 0 : capability.enabled) ?? true
|
|
16782
|
-
titlePatternMissing: (data == null ? void 0 : data.draft.titlePatternMissing) ?? false
|
|
17200
|
+
enabled: (capability == null ? void 0 : capability.enabled) ?? true
|
|
16783
17201
|
};
|
|
16784
17202
|
}
|
|
16785
17203
|
function IssueFormDraftCapabilityGate({
|
|
16786
17204
|
onResolved
|
|
16787
17205
|
}) {
|
|
16788
|
-
const { resolved, enabled
|
|
17206
|
+
const { resolved, enabled } = useDraftCapability();
|
|
16789
17207
|
useEffect(() => {
|
|
16790
17208
|
if (!resolved) {
|
|
16791
17209
|
return;
|
|
16792
17210
|
}
|
|
16793
17211
|
onResolved({
|
|
16794
|
-
disabledReason: enabled ? null : ISSUE_DRAFT_DISABLED_MESSAGE
|
|
16795
|
-
titlePatternMissing
|
|
17212
|
+
disabledReason: enabled ? null : ISSUE_DRAFT_DISABLED_MESSAGE
|
|
16796
17213
|
});
|
|
16797
|
-
}, [resolved, enabled,
|
|
17214
|
+
}, [resolved, enabled, onResolved]);
|
|
16798
17215
|
return null;
|
|
16799
17216
|
}
|
|
16800
17217
|
function useJiraFieldSearchConfig(projectId) {
|
|
@@ -16965,13 +17382,12 @@ function IssueForm({
|
|
|
16965
17382
|
position: position2,
|
|
16966
17383
|
onSubmit,
|
|
16967
17384
|
onCancel,
|
|
16968
|
-
initialDescription,
|
|
16969
17385
|
activeIntegration,
|
|
16970
17386
|
isIntegrationLoading = false
|
|
16971
17387
|
}) {
|
|
16972
17388
|
var _a, _b2;
|
|
16973
17389
|
const { isMember } = useAuthContext();
|
|
16974
|
-
const formState = useIssueFormState(
|
|
17390
|
+
const formState = useIssueFormState();
|
|
16975
17391
|
const sessionReplay = useSessionReplay();
|
|
16976
17392
|
const { markReportStart, clearReportStart } = sessionReplay;
|
|
16977
17393
|
useEffect(() => {
|
|
@@ -16998,6 +17414,22 @@ function IssueForm({
|
|
|
16998
17414
|
const [customFieldValues, setCustomFieldValues] = useState({});
|
|
16999
17415
|
const { selectedProjectId } = useProject();
|
|
17000
17416
|
const showCustomFields = isMember && Boolean(selectedProjectId);
|
|
17417
|
+
const snippets = useSnippets(selectedProjectId);
|
|
17418
|
+
const { setDescription } = formState;
|
|
17419
|
+
const lastAppliedSnippetBodyRef = useRef(null);
|
|
17420
|
+
useEffect(() => {
|
|
17421
|
+
const selected = snippets.snippets.find((snippet) => snippet.id === snippets.selectedId);
|
|
17422
|
+
const nextBody = selected ? selected.body.trim() : "";
|
|
17423
|
+
const result = mergeSnippetIntoDescription(
|
|
17424
|
+
formState.description,
|
|
17425
|
+
lastAppliedSnippetBodyRef.current,
|
|
17426
|
+
nextBody
|
|
17427
|
+
);
|
|
17428
|
+
lastAppliedSnippetBodyRef.current = result.ref;
|
|
17429
|
+
if (result.description !== void 0) {
|
|
17430
|
+
setDescription(result.description);
|
|
17431
|
+
}
|
|
17432
|
+
}, [snippets.selectedId]);
|
|
17001
17433
|
const [isOpen, setIsOpen] = useState(true);
|
|
17002
17434
|
const jiraIntegrationId = ((_a = jiraService.getConfig()) == null ? void 0 : _a.integrationId) ?? null;
|
|
17003
17435
|
const isResolvingIntegration = isMember && isIntegrationLoading;
|
|
@@ -17015,6 +17447,7 @@ function IssueForm({
|
|
|
17015
17447
|
const issueSubmission = useIssueSubmission({
|
|
17016
17448
|
position: position2,
|
|
17017
17449
|
onSubmit: (hasIntegrationFailure) => {
|
|
17450
|
+
void snippets.rememberSelection();
|
|
17018
17451
|
if (formState.mode === "ai") {
|
|
17019
17452
|
onSubmit(hasIntegrationFailure);
|
|
17020
17453
|
return;
|
|
@@ -17029,7 +17462,9 @@ function IssueForm({
|
|
|
17029
17462
|
activeIntegrationType: (activeIntegration == null ? void 0 : activeIntegration.type) ?? null,
|
|
17030
17463
|
notionIntegrationId: (activeIntegration == null ? void 0 : activeIntegration.type) === "NOTION" ? activeIntegration.integration.id : null,
|
|
17031
17464
|
videoFile: position2.videoFile,
|
|
17032
|
-
sessionReplay
|
|
17465
|
+
sessionReplay,
|
|
17466
|
+
// 직접 작성 모드는 이미 설명란에 문구 본문을 붙였다 — 여기서 또 실으면 중복이다.
|
|
17467
|
+
snippetId: formState.mode === "ai" ? snippets.selectedId : null
|
|
17033
17468
|
});
|
|
17034
17469
|
useDisableBodyScroll(formState.mode !== "ai");
|
|
17035
17470
|
useEffect(() => {
|
|
@@ -17118,7 +17553,16 @@ function IssueForm({
|
|
|
17118
17553
|
onSubmit: () => void submitCurrentMode(),
|
|
17119
17554
|
onSwitchToManual: () => formState.setMode("manual"),
|
|
17120
17555
|
submitting: issueSubmission.isSubmitting,
|
|
17121
|
-
error: issueSubmission.error
|
|
17556
|
+
error: issueSubmission.error,
|
|
17557
|
+
toolbar: /* @__PURE__ */ jsx(
|
|
17558
|
+
SnippetPicker,
|
|
17559
|
+
{
|
|
17560
|
+
snippets: snippets.snippets,
|
|
17561
|
+
selectedId: snippets.selectedId,
|
|
17562
|
+
onSelect: snippets.setSelectedId,
|
|
17563
|
+
disabled: issueSubmission.isSubmitting
|
|
17564
|
+
}
|
|
17565
|
+
)
|
|
17122
17566
|
}
|
|
17123
17567
|
)
|
|
17124
17568
|
]
|
|
@@ -17257,6 +17701,7 @@ function IssueForm({
|
|
|
17257
17701
|
);
|
|
17258
17702
|
}
|
|
17259
17703
|
function invalidateIssueQueries(issueId) {
|
|
17704
|
+
issueService.invalidateCache();
|
|
17260
17705
|
queryClient.invalidateQueries({ queryKey: ["contentIssues"] });
|
|
17261
17706
|
queryClient.invalidateQueries({ queryKey: ["issue", issueId] });
|
|
17262
17707
|
}
|
|
@@ -17319,11 +17764,6 @@ function getAdminIssueUrl(issueId) {
|
|
|
17319
17764
|
adminBaseUrl: readViteEnv("VITE_ADMIN_BASE_URL")
|
|
17320
17765
|
});
|
|
17321
17766
|
}
|
|
17322
|
-
function getAdminProjectTitlePatternUrl(projectId) {
|
|
17323
|
-
return buildAdminProjectTitlePatternUrl(projectId, {
|
|
17324
|
-
adminBaseUrl: readViteEnv("VITE_ADMIN_BASE_URL")
|
|
17325
|
-
});
|
|
17326
|
-
}
|
|
17327
17767
|
function BrowserInfo({ userAgent }) {
|
|
17328
17768
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
17329
17769
|
/* @__PURE__ */ jsx("h4", { className: "mb-2 text-base font-medium text-text-secondary", children: "브라우저 정보" }),
|
|
@@ -34533,7 +34973,10 @@ function IssueCustomFields({
|
|
|
34533
34973
|
const { values, setValue } = useCustomFieldValueDraft({
|
|
34534
34974
|
serverValues,
|
|
34535
34975
|
save: (fieldDefinitionId, value) => upsertIssueCustomFieldValue(issueId, fieldDefinitionId, value),
|
|
34536
|
-
onSaved: () =>
|
|
34976
|
+
onSaved: () => {
|
|
34977
|
+
toast.success("필드 값이 저장되었습니다.");
|
|
34978
|
+
applyIssueMutationEffects(issueId);
|
|
34979
|
+
},
|
|
34537
34980
|
onError: (_fieldDefinitionId, error) => {
|
|
34538
34981
|
devLogger.error("IssueCustomFields", "커스텀 필드 값 저장 실패:", error);
|
|
34539
34982
|
toast.error("필드 값 저장에 실패했습니다.");
|
|
@@ -35743,6 +36186,64 @@ function getExpandedClusterStack(cluster, metrics = getWindowMetrics()) {
|
|
|
35743
36186
|
function getCurrentStickerDocumentMetrics() {
|
|
35744
36187
|
return getWindowMetrics();
|
|
35745
36188
|
}
|
|
36189
|
+
const STICKER_PALETTE_WHITE = "#FFFFFF";
|
|
36190
|
+
const STICKER_PALETTE_INK = "#111827";
|
|
36191
|
+
const STICKER_PALETTE_BLACK = "#000000";
|
|
36192
|
+
const STICKER_PALETTE = {
|
|
36193
|
+
slate: { bg: "#64748B", fg: STICKER_PALETTE_WHITE },
|
|
36194
|
+
blue: { bg: "#0A84FF", fg: STICKER_PALETTE_INK },
|
|
36195
|
+
teal: { bg: "#00BFA5", fg: STICKER_PALETTE_INK },
|
|
36196
|
+
green: { bg: "#00C853", fg: STICKER_PALETTE_INK },
|
|
36197
|
+
lime: { bg: "#84CC16", fg: STICKER_PALETTE_INK },
|
|
36198
|
+
red: { bg: "#FF0000", fg: STICKER_PALETTE_BLACK },
|
|
36199
|
+
pink: { bg: "#FF2D87", fg: STICKER_PALETTE_INK },
|
|
36200
|
+
violet: { bg: "#7C3AED", fg: STICKER_PALETTE_WHITE },
|
|
36201
|
+
orange: { bg: "#F97316", fg: STICKER_PALETTE_INK },
|
|
36202
|
+
yellow: { bg: "#FFD000", fg: STICKER_PALETTE_INK },
|
|
36203
|
+
indigo: { bg: "#4F46E5", fg: STICKER_PALETTE_WHITE },
|
|
36204
|
+
cyan: { bg: "#00BCD4", fg: STICKER_PALETTE_INK }
|
|
36205
|
+
};
|
|
36206
|
+
const STICKER_PALETTE_ORDER = Object.keys(STICKER_PALETTE);
|
|
36207
|
+
function getEntry(name2) {
|
|
36208
|
+
if (!name2) return null;
|
|
36209
|
+
return STICKER_PALETTE[name2] ?? null;
|
|
36210
|
+
}
|
|
36211
|
+
function getStickerColor(name2) {
|
|
36212
|
+
var _a;
|
|
36213
|
+
return ((_a = getEntry(name2)) == null ? void 0 : _a.bg) ?? null;
|
|
36214
|
+
}
|
|
36215
|
+
function getStickerForeground(name2) {
|
|
36216
|
+
var _a;
|
|
36217
|
+
return ((_a = getEntry(name2)) == null ? void 0 : _a.fg) ?? null;
|
|
36218
|
+
}
|
|
36219
|
+
const MAX_CLUSTER_BANDS = 4;
|
|
36220
|
+
function getClusterColorNames(members) {
|
|
36221
|
+
var _a;
|
|
36222
|
+
const present = /* @__PURE__ */ new Set();
|
|
36223
|
+
for (const member of members) {
|
|
36224
|
+
const color2 = (_a = member.design) == null ? void 0 : _a.color;
|
|
36225
|
+
if (color2 && getStickerColor(color2)) {
|
|
36226
|
+
present.add(color2);
|
|
36227
|
+
}
|
|
36228
|
+
}
|
|
36229
|
+
return STICKER_PALETTE_ORDER.filter((name2) => present.has(name2)).slice(
|
|
36230
|
+
0,
|
|
36231
|
+
MAX_CLUSTER_BANDS
|
|
36232
|
+
);
|
|
36233
|
+
}
|
|
36234
|
+
function buildClusterBackground(colorNames) {
|
|
36235
|
+
const hexes = colorNames.map((name2) => getStickerColor(name2)).filter((hex2) => Boolean(hex2));
|
|
36236
|
+
if (hexes.length === 0) return null;
|
|
36237
|
+
if (hexes.length === 1) return hexes[0] ?? null;
|
|
36238
|
+
const step = 100 / hexes.length;
|
|
36239
|
+
const round = (value) => Number.parseFloat(value.toFixed(2)).toString();
|
|
36240
|
+
const stops = hexes.map((hex2, index2) => {
|
|
36241
|
+
const from = index2 === 0 ? "0" : `${round(step * index2)}%`;
|
|
36242
|
+
const to = index2 === hexes.length - 1 ? "100%" : `${round(step * (index2 + 1))}%`;
|
|
36243
|
+
return `${hex2} ${from} ${to}`;
|
|
36244
|
+
});
|
|
36245
|
+
return `linear-gradient(135deg, ${stops.join(", ")})`;
|
|
36246
|
+
}
|
|
35746
36247
|
const STICKER_MAX_WIDTH = 480;
|
|
35747
36248
|
const STICKER_NON_TEXT_WIDTH = 72;
|
|
35748
36249
|
function getEstimatedTextWidth(title) {
|
|
@@ -35756,9 +36257,11 @@ function getEstimatedTextWidth(title) {
|
|
|
35756
36257
|
return width + 7;
|
|
35757
36258
|
}, 0);
|
|
35758
36259
|
}
|
|
35759
|
-
|
|
36260
|
+
const STICKER_BADGE_GAP = 36;
|
|
36261
|
+
function getEstimatedExpandedWidth(title, badge) {
|
|
36262
|
+
const badgeWidth = badge ? getEstimatedTextWidth(badge) + STICKER_BADGE_GAP : 0;
|
|
35760
36263
|
return Math.min(
|
|
35761
|
-
Math.max(getEstimatedTextWidth(title) + STICKER_NON_TEXT_WIDTH, 112),
|
|
36264
|
+
Math.max(getEstimatedTextWidth(title) + STICKER_NON_TEXT_WIDTH + badgeWidth, 112),
|
|
35762
36265
|
STICKER_MAX_WIDTH
|
|
35763
36266
|
);
|
|
35764
36267
|
}
|
|
@@ -35771,31 +36274,49 @@ function IssueSticker$1({
|
|
|
35771
36274
|
clusterCount,
|
|
35772
36275
|
onClusterClick,
|
|
35773
36276
|
clusterStackAnimation,
|
|
35774
|
-
clusterStackIndex = 0
|
|
36277
|
+
clusterStackIndex = 0,
|
|
36278
|
+
clusterColorNames,
|
|
36279
|
+
alwaysExpanded = false,
|
|
36280
|
+
ariaLabel
|
|
35775
36281
|
}) {
|
|
36282
|
+
var _a, _b2, _c2;
|
|
35776
36283
|
const position2 = documentPosition;
|
|
35777
36284
|
const resolvedClusterCount = clusterCount ?? 0;
|
|
35778
36285
|
const isCluster = resolvedClusterCount > 1;
|
|
36286
|
+
const clusterBackground = isCluster ? buildClusterBackground(clusterColorNames ?? []) : null;
|
|
35779
36287
|
const generating = isGeneratingStatus(issue.generation_status) && !isCluster;
|
|
35780
36288
|
const visibleTitle = isCluster ? `스티커 ${resolvedClusterCount}개 펼치기` : generating ? GENERATING_LABEL : issue.title;
|
|
35781
|
-
const
|
|
36289
|
+
const badgeLabel = isCluster || generating ? null : ((_a = issue.design) == null ? void 0 : _a.label) ?? null;
|
|
36290
|
+
const designColor = isCluster || generating ? null : getStickerColor((_b2 = issue.design) == null ? void 0 : _b2.color);
|
|
36291
|
+
const designForeground = designColor ? getStickerForeground((_c2 = issue.design) == null ? void 0 : _c2.color) : null;
|
|
36292
|
+
const expandedWidth = getEstimatedExpandedWidth(visibleTitle, badgeLabel);
|
|
35782
36293
|
const viewportWidth = typeof window === "undefined" ? Number.POSITIVE_INFINITY : window.innerWidth;
|
|
35783
36294
|
const scrollX = typeof window === "undefined" ? 0 : window.scrollX || window.pageXOffset || 0;
|
|
35784
36295
|
const viewportX = position2.x - scrollX;
|
|
35785
|
-
const shouldExpandLeft = viewportX + expandedWidth > viewportWidth - 12;
|
|
36296
|
+
const shouldExpandLeft = !alwaysExpanded && viewportX + expandedWidth > viewportWidth - 12;
|
|
35786
36297
|
const expandSide = shouldExpandLeft ? "left" : "right";
|
|
35787
|
-
const style = {
|
|
36298
|
+
const style = alwaysExpanded ? { position: "relative" } : {
|
|
35788
36299
|
position: "absolute",
|
|
35789
36300
|
left: `${position2.x}px`,
|
|
35790
36301
|
top: `${position2.y}px`,
|
|
35791
36302
|
transform: shouldExpandLeft ? "translate3d(calc(-100% + 16px), -50%, 0)" : "translate3d(-16px, -50%, 0)"
|
|
35792
36303
|
};
|
|
35793
36304
|
const wrapperClassName = isPopoverOpen ? "z-[10001]" : "z-[9999] hover:z-[10001] focus-within:z-[10001]";
|
|
35794
|
-
const
|
|
35795
|
-
const
|
|
35796
|
-
|
|
35797
|
-
|
|
35798
|
-
|
|
36305
|
+
const colorClassName = designColor ? "" : "bg-brand hover:bg-brand-hover";
|
|
36306
|
+
const expandClassName = alwaysExpanded ? "max-w-[480px]" : "max-w-8 hover:max-w-[480px] hover:shadow-xl focus-visible:max-w-[480px]";
|
|
36307
|
+
const buttonClassName = `issue-sticker-marker ${generating || alwaysExpanded ? "" : "issue-marker-breathe"} group flex h-8 w-max cursor-pointer items-center overflow-hidden rounded-full border text-white shadow-lg outline-none transition-[max-width,box-shadow,background-color,border-color,transform,opacity] duration-[var(--issue-marker-expand-duration)] ease-out focus-visible:ring-4 ${isCluster ? `max-w-8 border-white/80 ${clusterBackground ? "" : "bg-brand hover:bg-brand-hover"} shadow-lg ring-2 ring-brand-subtle hover:max-w-[160px] hover:shadow-xl focus-visible:max-w-[160px] focus-visible:ring-brand-subtle` : `${expandClassName} ${colorClassName} focus-visible:ring-brand-subtle ${generating ? "border-dashed border-white/70" : "border-white/80"}`} ${shouldExpandLeft ? "flex-row-reverse" : ""} ${isPopoverOpen ? "shadow-xl ring-4 ring-brand-subtle" : ""}`;
|
|
36308
|
+
const backgroundStyle = clusterBackground ? clusterBackground.startsWith("linear-gradient") ? { background: clusterBackground } : { backgroundColor: clusterBackground } : designColor ? { backgroundColor: designColor } : {};
|
|
36309
|
+
const buttonStyle = {
|
|
36310
|
+
...backgroundStyle,
|
|
36311
|
+
// 밝은 배경(노랑·주황·하늘)은 흰 글씨로 대비가 안 나온다. 팔레트가 정한 글씨색을
|
|
36312
|
+
// inline 으로 추가해 text-white 클래스를 덮는다.
|
|
36313
|
+
...designForeground ? { color: designForeground } : {},
|
|
36314
|
+
["--issue-sticker-expanded-width"]: `${expandedWidth}px`,
|
|
36315
|
+
...clusterStackAnimation ? {
|
|
36316
|
+
animation: clusterStackAnimation === "enter" ? "issue-sticker-cluster-sticker-enter 240ms cubic-bezier(0.34, 1.2, 0.64, 1) both" : "issue-sticker-cluster-sticker-exit 220ms ease-in both",
|
|
36317
|
+
animationDelay: clusterStackAnimation === "enter" ? `${clusterStackIndex * 24}ms` : void 0
|
|
36318
|
+
} : {}
|
|
36319
|
+
};
|
|
35799
36320
|
const handleClick = () => {
|
|
35800
36321
|
if (isCluster) {
|
|
35801
36322
|
onClusterClick == null ? void 0 : onClusterClick();
|
|
@@ -35813,7 +36334,7 @@ function IssueSticker$1({
|
|
|
35813
36334
|
"data-cluster-count": isCluster ? resolvedClusterCount : void 0,
|
|
35814
36335
|
"data-expand-side": expandSide,
|
|
35815
36336
|
onClick: handleClick,
|
|
35816
|
-
"aria-label": isCluster ? `겹친 스티커 ${resolvedClusterCount}개 펼치기` : `이슈 열기: ${visibleTitle}
|
|
36337
|
+
"aria-label": ariaLabel ?? (isCluster ? `겹친 스티커 ${resolvedClusterCount}개 펼치기` : `이슈 열기: ${visibleTitle}`),
|
|
35817
36338
|
children: [
|
|
35818
36339
|
/* @__PURE__ */ jsx(
|
|
35819
36340
|
"span",
|
|
@@ -35826,10 +36347,18 @@ function IssueSticker$1({
|
|
|
35826
36347
|
/* @__PURE__ */ jsx(
|
|
35827
36348
|
"span",
|
|
35828
36349
|
{
|
|
35829
|
-
className: `min-w-0 max-w-[428px] flex-1 truncate whitespace-nowrap text-xs font-semibold leading-none
|
|
36350
|
+
className: `min-w-0 max-w-[428px] flex-1 truncate whitespace-nowrap text-xs font-semibold leading-none transition-[opacity,transform] duration-[var(--issue-marker-expand-duration)] ease-out ${alwaysExpanded ? "translate-x-0 opacity-100" : "opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-focus-visible:translate-x-0 group-focus-visible:opacity-100"} ${shouldExpandLeft ? `${alwaysExpanded ? "" : "translate-x-1"} pl-3 text-right` : `${alwaysExpanded ? "" : "-translate-x-1"} pr-3 text-left`}`,
|
|
35830
36351
|
children: visibleTitle
|
|
35831
36352
|
}
|
|
35832
|
-
)
|
|
36353
|
+
),
|
|
36354
|
+
badgeLabel ? /* @__PURE__ */ jsx(
|
|
36355
|
+
"span",
|
|
36356
|
+
{
|
|
36357
|
+
"data-sticker-badge": "",
|
|
36358
|
+
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"}`,
|
|
36359
|
+
children: badgeLabel
|
|
36360
|
+
}
|
|
36361
|
+
) : null
|
|
35833
36362
|
]
|
|
35834
36363
|
}
|
|
35835
36364
|
) });
|
|
@@ -36080,7 +36609,10 @@ function IssueStickersContainer$1({
|
|
|
36080
36609
|
isPopoverOpen: false,
|
|
36081
36610
|
onStickerClick,
|
|
36082
36611
|
clusterCount: cluster.placements.length,
|
|
36083
|
-
onClusterClick: () => openCluster(cluster.id)
|
|
36612
|
+
onClusterClick: () => openCluster(cluster.id),
|
|
36613
|
+
clusterColorNames: getClusterColorNames(
|
|
36614
|
+
cluster.placements.map((placement) => placement.issue)
|
|
36615
|
+
)
|
|
36084
36616
|
},
|
|
36085
36617
|
cluster.id
|
|
36086
36618
|
);
|
|
@@ -36168,10 +36700,10 @@ function useExtensionEnabled() {
|
|
|
36168
36700
|
const [isEnabled] = useState(true);
|
|
36169
36701
|
return isEnabled;
|
|
36170
36702
|
}
|
|
36171
|
-
const DEFAULT_VALUE
|
|
36703
|
+
const DEFAULT_VALUE = false;
|
|
36172
36704
|
function useIssueMode() {
|
|
36173
|
-
const [isCreatingIssue, setIsCreatingIssue] = useState(DEFAULT_VALUE
|
|
36174
|
-
const isCreatingIssueRef = useRef(DEFAULT_VALUE
|
|
36705
|
+
const [isCreatingIssue, setIsCreatingIssue] = useState(DEFAULT_VALUE);
|
|
36706
|
+
const isCreatingIssueRef = useRef(DEFAULT_VALUE);
|
|
36175
36707
|
useEffect(() => {
|
|
36176
36708
|
isCreatingIssueRef.current = isCreatingIssue;
|
|
36177
36709
|
}, [isCreatingIssue]);
|
|
@@ -36206,151 +36738,6 @@ function useIssueMode() {
|
|
|
36206
36738
|
showToast
|
|
36207
36739
|
};
|
|
36208
36740
|
}
|
|
36209
|
-
function buildSettingsQuery(settingKey, projectId, serviceType) {
|
|
36210
|
-
const params = new URLSearchParams({ setting_key: settingKey });
|
|
36211
|
-
if (projectId) {
|
|
36212
|
-
params.set("project_id", projectId);
|
|
36213
|
-
}
|
|
36214
|
-
{
|
|
36215
|
-
params.set("service_type", serviceType);
|
|
36216
|
-
}
|
|
36217
|
-
return `/api/settings?${params.toString()}`;
|
|
36218
|
-
}
|
|
36219
|
-
async function getSetting(settingKey, defaultValue, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
36220
|
-
try {
|
|
36221
|
-
const data = await apiClient.get(
|
|
36222
|
-
buildSettingsQuery(settingKey, projectId, serviceType)
|
|
36223
|
-
);
|
|
36224
|
-
if (!data) {
|
|
36225
|
-
if (defaultValue !== null && defaultValue !== void 0 && defaultValue !== "") {
|
|
36226
|
-
await initializeSetting(settingKey, defaultValue, projectId, serviceType);
|
|
36227
|
-
}
|
|
36228
|
-
return defaultValue;
|
|
36229
|
-
}
|
|
36230
|
-
return data.setting_value ?? defaultValue;
|
|
36231
|
-
} catch (error) {
|
|
36232
|
-
devLogger.error("settingsService", `설정 로드 실패 (${settingKey}):`, error);
|
|
36233
|
-
return defaultValue;
|
|
36234
|
-
}
|
|
36235
|
-
}
|
|
36236
|
-
async function initializeSetting(settingKey, value, projectId, serviceType) {
|
|
36237
|
-
try {
|
|
36238
|
-
await apiClient.put("/api/settings", {
|
|
36239
|
-
setting_key: settingKey,
|
|
36240
|
-
setting_value: value,
|
|
36241
|
-
project_id: projectId ?? null,
|
|
36242
|
-
service_type: serviceType ?? null
|
|
36243
|
-
});
|
|
36244
|
-
} catch (error) {
|
|
36245
|
-
devLogger.error("settingsService", `설정 초기화 실패 (${settingKey}):`, error);
|
|
36246
|
-
}
|
|
36247
|
-
}
|
|
36248
|
-
async function setSetting(settingKey, value, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
36249
|
-
try {
|
|
36250
|
-
await apiClient.put("/api/settings", {
|
|
36251
|
-
setting_key: settingKey,
|
|
36252
|
-
setting_value: value,
|
|
36253
|
-
project_id: projectId ?? null,
|
|
36254
|
-
service_type: serviceType ?? null
|
|
36255
|
-
});
|
|
36256
|
-
} catch (error) {
|
|
36257
|
-
devLogger.error("settingsService", `설정 저장 실패 (${settingKey}):`, error);
|
|
36258
|
-
throw error;
|
|
36259
|
-
}
|
|
36260
|
-
}
|
|
36261
|
-
async function migrateFromLocalStorage(settingKey, storageKey, _tenantId, _accountId, _email, projectId, serviceType) {
|
|
36262
|
-
try {
|
|
36263
|
-
const existing = await apiClient.get(
|
|
36264
|
-
buildSettingsQuery(settingKey, projectId, serviceType)
|
|
36265
|
-
);
|
|
36266
|
-
if (existing) {
|
|
36267
|
-
return false;
|
|
36268
|
-
}
|
|
36269
|
-
const stored = localStorage.getItem(storageKey);
|
|
36270
|
-
const value = stored !== null ? JSON.parse(stored) : void 0;
|
|
36271
|
-
if (value !== void 0) {
|
|
36272
|
-
await setSetting(
|
|
36273
|
-
settingKey,
|
|
36274
|
-
value,
|
|
36275
|
-
void 0,
|
|
36276
|
-
void 0,
|
|
36277
|
-
void 0,
|
|
36278
|
-
projectId ?? void 0,
|
|
36279
|
-
serviceType ?? void 0
|
|
36280
|
-
);
|
|
36281
|
-
return true;
|
|
36282
|
-
}
|
|
36283
|
-
return false;
|
|
36284
|
-
} catch (error) {
|
|
36285
|
-
devLogger.error("settingsService", `마이그레이션 실패 (${settingKey}):`, error);
|
|
36286
|
-
return false;
|
|
36287
|
-
}
|
|
36288
|
-
}
|
|
36289
|
-
function useAuth() {
|
|
36290
|
-
const ctx = useAuthContext();
|
|
36291
|
-
return {
|
|
36292
|
-
isAuthenticated: ctx.isAuthenticated,
|
|
36293
|
-
isMember: ctx.isMember,
|
|
36294
|
-
isLoading: ctx.isLoading,
|
|
36295
|
-
user: ctx.accountId ? { id: ctx.accountId, email: "" } : null,
|
|
36296
|
-
tenant: ctx.tenantId ? { id: ctx.tenantId, name: "", slug: "" } : null,
|
|
36297
|
-
accountId: ctx.accountId
|
|
36298
|
-
};
|
|
36299
|
-
}
|
|
36300
|
-
const SETTING_KEY = "issueDescriptionTemplate";
|
|
36301
|
-
const STORAGE_KEY$1 = "issueDescriptionTemplate";
|
|
36302
|
-
const DEFAULT_VALUE = "";
|
|
36303
|
-
async function loadIssueTemplate(tenantId, email, projectId, isMember) {
|
|
36304
|
-
if (!tenantId || !isMember) {
|
|
36305
|
-
return DEFAULT_VALUE;
|
|
36306
|
-
}
|
|
36307
|
-
try {
|
|
36308
|
-
if (email) {
|
|
36309
|
-
await migrateFromLocalStorage(
|
|
36310
|
-
SETTING_KEY,
|
|
36311
|
-
STORAGE_KEY$1,
|
|
36312
|
-
tenantId,
|
|
36313
|
-
void 0,
|
|
36314
|
-
email,
|
|
36315
|
-
projectId ?? void 0,
|
|
36316
|
-
"GENERAL"
|
|
36317
|
-
);
|
|
36318
|
-
}
|
|
36319
|
-
const savedTemplate = await getSetting(
|
|
36320
|
-
SETTING_KEY,
|
|
36321
|
-
DEFAULT_VALUE,
|
|
36322
|
-
tenantId,
|
|
36323
|
-
void 0,
|
|
36324
|
-
email ?? void 0,
|
|
36325
|
-
projectId ?? void 0,
|
|
36326
|
-
"GENERAL"
|
|
36327
|
-
);
|
|
36328
|
-
return savedTemplate;
|
|
36329
|
-
} catch (error) {
|
|
36330
|
-
devLogger.error("useIssueTemplate", "템플릿 로드 실패:", error);
|
|
36331
|
-
return DEFAULT_VALUE;
|
|
36332
|
-
}
|
|
36333
|
-
}
|
|
36334
|
-
function useIssueTemplate() {
|
|
36335
|
-
var _a, _b2;
|
|
36336
|
-
const auth = useAuth();
|
|
36337
|
-
const project = useProject();
|
|
36338
|
-
const tenantId = ((_a = auth.tenant) == null ? void 0 : _a.id) ?? null;
|
|
36339
|
-
const email = ((_b2 = auth.user) == null ? void 0 : _b2.email) ?? null;
|
|
36340
|
-
const isMember = auth.isMember;
|
|
36341
|
-
const projectId = project.selectedProjectId;
|
|
36342
|
-
const { data: template } = useSuspenseQuery({
|
|
36343
|
-
queryKey: ["contentIssueTemplate", tenantId, email, projectId, isMember],
|
|
36344
|
-
queryFn: () => loadIssueTemplate(tenantId, email, projectId, isMember)
|
|
36345
|
-
});
|
|
36346
|
-
const loadTemplate = useCallback(() => {
|
|
36347
|
-
queryClient.invalidateQueries({ queryKey: ["contentIssueTemplate"] });
|
|
36348
|
-
}, []);
|
|
36349
|
-
return {
|
|
36350
|
-
template,
|
|
36351
|
-
loadTemplate
|
|
36352
|
-
};
|
|
36353
|
-
}
|
|
36354
36741
|
const RECORDING_BLOCKED_BY_ISSUE_MODE = "이슈 생성 모드에서는 녹화를 시작할 수 없습니다. 이슈 생성을 종료한 뒤 다시 시도하세요.";
|
|
36355
36742
|
const ISSUE_MODE_BLOCKED_BY_RECORDING = "녹화 중에는 이슈 생성 모드를 시작할 수 없습니다. 녹화를 중지한 뒤 다시 시도하세요.";
|
|
36356
36743
|
function getDigitFromCode(code2) {
|
|
@@ -36624,7 +37011,6 @@ function useContentAppState() {
|
|
|
36624
37011
|
const isExtensionEnabledRaw = useExtensionEnabled();
|
|
36625
37012
|
const isExtensionEnabled = isExtensionEnabledRaw && isDomainAllowed;
|
|
36626
37013
|
const { issues, loadIssues } = useIssues(currentUrl);
|
|
36627
|
-
const { template } = useIssueTemplate();
|
|
36628
37014
|
const { showStickers, showStickersRef, setShowStickers } = useStickerVisibility();
|
|
36629
37015
|
const { stickerFilters, setStickerFilters } = useStickerFilters();
|
|
36630
37016
|
const {
|
|
@@ -36689,8 +37075,6 @@ function useContentAppState() {
|
|
|
36689
37075
|
const handleCloseIssueDetail = useCallback(() => {
|
|
36690
37076
|
setOpenPopoverIssueId(null);
|
|
36691
37077
|
}, []);
|
|
36692
|
-
useCallback(async (_newTemplate) => {
|
|
36693
|
-
}, []);
|
|
36694
37078
|
const handleRecordingStopped = useCallback(
|
|
36695
37079
|
async (_recordedFile) => {
|
|
36696
37080
|
if (!isCreatingIssueRef.current) {
|
|
@@ -36832,7 +37216,6 @@ function useContentAppState() {
|
|
|
36832
37216
|
);
|
|
36833
37217
|
return {
|
|
36834
37218
|
// 상태
|
|
36835
|
-
template,
|
|
36836
37219
|
openPopoverIssueId,
|
|
36837
37220
|
isExtensionEnabled,
|
|
36838
37221
|
issues: filteredIssues,
|
|
@@ -36966,7 +37349,7 @@ function buildSdkOnboardingSteps({
|
|
|
36966
37349
|
id: "record",
|
|
36967
37350
|
targetId: "sdk-toolbar-record",
|
|
36968
37351
|
title: "재현 과정은 화면 녹화로 남깁니다",
|
|
36969
|
-
body: "클릭 순서나 화면 전환이 중요한 문제는 녹화로 남깁니다. 녹화를
|
|
37352
|
+
body: "클릭 순서나 화면 전환이 중요한 문제는 녹화로 남깁니다. 녹화를 시작하면 공유할 화면을 선택하는 창이 열립니다. 문제를 재현하고 이슈를 저장해 보세요.",
|
|
36970
37353
|
position: "top",
|
|
36971
37354
|
advanceOn: advanceOnEvent("issue:created"),
|
|
36972
37355
|
allowManualAdvance: true,
|
|
@@ -37550,8 +37933,6 @@ function useToolbarDrag({
|
|
|
37550
37933
|
);
|
|
37551
37934
|
return { isDragging: isDragging2, onPointerDown };
|
|
37552
37935
|
}
|
|
37553
|
-
const TITLE_PATTERN_MISSING_MESSAGE = "제목 패턴을 아직 추출하지 않아 팀 형식이 적용되지 않습니다. 누르면 프로젝트 설정이 새 탭으로 열립니다.";
|
|
37554
|
-
const TITLE_PATTERN_EXTRACT_LABEL = "패턴 추출하기";
|
|
37555
37936
|
function formatElapsed(startedAt, now2) {
|
|
37556
37937
|
const seconds = startedAt === null ? 0 : Math.max(0, Math.floor((now2 - startedAt) / 1e3));
|
|
37557
37938
|
const mm = String(Math.floor(seconds / 60)).padStart(2, "0");
|
|
@@ -37564,6 +37945,7 @@ function Toolbar({
|
|
|
37564
37945
|
onStartRecording,
|
|
37565
37946
|
onStopRecording,
|
|
37566
37947
|
isCreatingIssue,
|
|
37948
|
+
isWritingIssue,
|
|
37567
37949
|
isRecording,
|
|
37568
37950
|
recordingStartedAt,
|
|
37569
37951
|
showStickers,
|
|
@@ -37577,8 +37959,7 @@ function Toolbar({
|
|
|
37577
37959
|
onboardingEnabled = true,
|
|
37578
37960
|
targets,
|
|
37579
37961
|
account,
|
|
37580
|
-
blocked
|
|
37581
|
-
titlePatternExtract
|
|
37962
|
+
blocked
|
|
37582
37963
|
}) {
|
|
37583
37964
|
const rootRef = useRef(null);
|
|
37584
37965
|
const [internalOpen, setInternalOpen] = useState(false);
|
|
@@ -37597,7 +37978,7 @@ function Toolbar({
|
|
|
37597
37978
|
},
|
|
37598
37979
|
[menuOpen, onMenuOpenChange]
|
|
37599
37980
|
);
|
|
37600
|
-
const state = isRecording ? "recording" : isCreatingIssue ? "aiming" : blocked ? "blocked" : "idle";
|
|
37981
|
+
const state = isRecording ? "recording" : isWritingIssue ? "writing" : isCreatingIssue ? "aiming" : blocked ? "blocked" : "idle";
|
|
37601
37982
|
const [now2, setNow] = useState(() => Date.now());
|
|
37602
37983
|
const skipFocusRestore = useRef(true);
|
|
37603
37984
|
const getSize2 = useCallback(
|
|
@@ -37709,24 +38090,12 @@ function Toolbar({
|
|
|
37709
38090
|
children: /* @__PURE__ */ jsx(Circle, { size: 15, fill: "currentColor" })
|
|
37710
38091
|
}
|
|
37711
38092
|
) }),
|
|
37712
|
-
/* @__PURE__ */ jsxs(TooltipContent, { side: "top", sideOffset: 10, children: [
|
|
38093
|
+
/* @__PURE__ */ jsxs(TooltipContent, { side: "top", sideOffset: 10, className: "text-center", children: [
|
|
37713
38094
|
"화면 녹화 ",
|
|
37714
|
-
getShortcutLabel("CAPTURE_VIDEO")
|
|
38095
|
+
getShortcutLabel("CAPTURE_VIDEO"),
|
|
38096
|
+
/* @__PURE__ */ jsx("span", { className: "block font-normal opacity-70", children: "공유할 화면을 선택하는 창이 열립니다" })
|
|
37715
38097
|
] })
|
|
37716
38098
|
] }),
|
|
37717
|
-
titlePatternExtract ? /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
37718
|
-
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
37719
|
-
"button",
|
|
37720
|
-
{
|
|
37721
|
-
type: "button",
|
|
37722
|
-
className: "toolbar-btn",
|
|
37723
|
-
"aria-label": TITLE_PATTERN_EXTRACT_LABEL,
|
|
37724
|
-
onClick: titlePatternExtract.onClick,
|
|
37725
|
-
children: /* @__PURE__ */ jsx(WandSparkles, { size: 15 })
|
|
37726
|
-
}
|
|
37727
|
-
) }),
|
|
37728
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", sideOffset: 10, className: "whitespace-normal text-left", children: TITLE_PATTERN_MISSING_MESSAGE })
|
|
37729
|
-
] }) : null,
|
|
37730
38099
|
/* @__PURE__ */ jsx("div", { className: "toolbar-divider" }),
|
|
37731
38100
|
/* @__PURE__ */ jsxs(
|
|
37732
38101
|
"button",
|
|
@@ -37778,7 +38147,7 @@ function Toolbar({
|
|
|
37778
38147
|
children: /* @__PURE__ */ jsx(X$1, { size: 15 })
|
|
37779
38148
|
}
|
|
37780
38149
|
)
|
|
37781
|
-
] }) : state === "recording" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
38150
|
+
] }) : state === "writing" ? /* @__PURE__ */ jsx("span", { className: "toolbar-hint", children: "이슈를 작성 중입니다" }) : state === "recording" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37782
38151
|
/* @__PURE__ */ jsx("span", { className: "toolbar-pulse", "aria-hidden": "true" }),
|
|
37783
38152
|
/* @__PURE__ */ jsx("span", { className: "toolbar-elapsed", "aria-hidden": "true", children: formatElapsed(recordingStartedAt, now2) }),
|
|
37784
38153
|
/* @__PURE__ */ jsx("div", { className: "toolbar-divider" }),
|
|
@@ -37846,15 +38215,9 @@ const SDK_TOOLBAR_TARGETS = {
|
|
|
37846
38215
|
menuSession: "sdk-more-session"
|
|
37847
38216
|
};
|
|
37848
38217
|
function SdkToolbar(props) {
|
|
37849
|
-
const { isMember,
|
|
38218
|
+
const { isMember, login, logout } = useAuthContext();
|
|
37850
38219
|
const [error, setError] = useState("");
|
|
37851
38220
|
const [loading, setLoading] = useState(false);
|
|
37852
|
-
const [titlePatternMissing, setTitlePatternMissing] = useState(false);
|
|
37853
|
-
const handleDraftCapabilityResolved = useCallback(
|
|
37854
|
-
({ titlePatternMissing: missing }) => setTitlePatternMissing(missing),
|
|
37855
|
-
[]
|
|
37856
|
-
);
|
|
37857
|
-
const titlePatternUrl = isMember && titlePatternMissing && projectId ? getAdminProjectTitlePatternUrl(projectId) : null;
|
|
37858
38221
|
const handleLogin = async () => {
|
|
37859
38222
|
var _a;
|
|
37860
38223
|
setError("");
|
|
@@ -37873,25 +38236,21 @@ function SdkToolbar(props) {
|
|
|
37873
38236
|
await logout();
|
|
37874
38237
|
(_a = props.onMenuOpenChange) == null ? void 0 : _a.call(props, false);
|
|
37875
38238
|
};
|
|
37876
|
-
return /* @__PURE__ */
|
|
37877
|
-
|
|
37878
|
-
|
|
37879
|
-
|
|
37880
|
-
|
|
37881
|
-
|
|
37882
|
-
|
|
37883
|
-
|
|
37884
|
-
|
|
37885
|
-
|
|
37886
|
-
|
|
37887
|
-
|
|
37888
|
-
error,
|
|
37889
|
-
onLogin: () => void handleLogin(),
|
|
37890
|
-
onLogout: () => void handleLogout()
|
|
37891
|
-
}
|
|
38239
|
+
return /* @__PURE__ */ jsx(
|
|
38240
|
+
Toolbar,
|
|
38241
|
+
{
|
|
38242
|
+
...props,
|
|
38243
|
+
targets: SDK_TOOLBAR_TARGETS,
|
|
38244
|
+
account: {
|
|
38245
|
+
isMember,
|
|
38246
|
+
canLogin: !isDemoMode,
|
|
38247
|
+
loading,
|
|
38248
|
+
error,
|
|
38249
|
+
onLogin: () => void handleLogin(),
|
|
38250
|
+
onLogout: () => void handleLogout()
|
|
37892
38251
|
}
|
|
37893
|
-
|
|
37894
|
-
|
|
38252
|
+
}
|
|
38253
|
+
);
|
|
37895
38254
|
}
|
|
37896
38255
|
function ContentAppWrapper({
|
|
37897
38256
|
fabEnabled,
|
|
@@ -37903,7 +38262,6 @@ function ContentAppWrapper({
|
|
|
37903
38262
|
const [moreMenuOpen, setMoreMenuOpen] = useState(false);
|
|
37904
38263
|
const unrenderedSignatureRef = useRef("");
|
|
37905
38264
|
const {
|
|
37906
|
-
template,
|
|
37907
38265
|
openPopoverIssueId,
|
|
37908
38266
|
isExtensionEnabled,
|
|
37909
38267
|
issues,
|
|
@@ -37955,6 +38313,7 @@ function ContentAppWrapper({
|
|
|
37955
38313
|
onStartRecording: handleToggleRecording,
|
|
37956
38314
|
onStopRecording: handleToggleRecording,
|
|
37957
38315
|
isCreatingIssue,
|
|
38316
|
+
isWritingIssue: clickPosition !== null,
|
|
37958
38317
|
isRecording: screenRecording.isRecording,
|
|
37959
38318
|
recordingStartedAt: screenRecording.startedAt,
|
|
37960
38319
|
showStickers,
|
|
@@ -38010,7 +38369,6 @@ function ContentAppWrapper({
|
|
|
38010
38369
|
SDKManager.getInstance().eventBus.emit("issue:cancelled");
|
|
38011
38370
|
}
|
|
38012
38371
|
},
|
|
38013
|
-
initialDescription: template,
|
|
38014
38372
|
activeIntegration,
|
|
38015
38373
|
isIntegrationLoading
|
|
38016
38374
|
}
|
|
@@ -38054,9 +38412,9 @@ function AuthGate() {
|
|
|
38054
38412
|
) })
|
|
38055
38413
|
] });
|
|
38056
38414
|
}
|
|
38057
|
-
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}.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-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-normal{white-space:normal}.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}.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:10.5px;line-height:14px}.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:14px;line-height:21px}.text-lg{font-size:17px;line-height:25px}.text-sm{font-size:13px;line-height:19px}.text-xl{font-size:20px;line-height:29px}.text-xs{font-size:12px;line-height:16px}.font-black{font-weight:900}.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:13px;line-height:19px}.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:13px;line-height:19px}.group.toast .group-\\[\\.toast\\]\\:text-xs{font-size:12px;line-height:16px}.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:26px;line-height:34px}.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))}`;
|
|
38415
|
+
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-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))}`;
|
|
38058
38416
|
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}";
|
|
38059
|
-
const contentPageCSS =
|
|
38417
|
+
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}}`;
|
|
38060
38418
|
const PAGE_STYLE_ID = "issue-sticker-page-style";
|
|
38061
38419
|
let root = null;
|
|
38062
38420
|
let mountContainer = null;
|
|
@@ -38070,7 +38428,9 @@ function renderWidget(config) {
|
|
|
38070
38428
|
}
|
|
38071
38429
|
function mountWidget(config) {
|
|
38072
38430
|
if (isIssueStickerExtensionRuntimeActive()) {
|
|
38073
|
-
|
|
38431
|
+
{
|
|
38432
|
+
return;
|
|
38433
|
+
}
|
|
38074
38434
|
}
|
|
38075
38435
|
const existingHost = document.getElementById(ISSUE_STICKER_HOST_ELEMENT_ID);
|
|
38076
38436
|
if (root && mountContainer && existingHost) {
|
|
@@ -38207,7 +38567,10 @@ const IssueSticker = {
|
|
|
38207
38567
|
}
|
|
38208
38568
|
};
|
|
38209
38569
|
if (typeof window !== "undefined") {
|
|
38210
|
-
window.addEventListener(
|
|
38570
|
+
window.addEventListener(
|
|
38571
|
+
ISSUE_STICKER_EXTENSION_RUNTIME_READY_EVENT,
|
|
38572
|
+
destroySdkRuntime
|
|
38573
|
+
);
|
|
38211
38574
|
}
|
|
38212
38575
|
const DESTROY_DELAY_MS = 300;
|
|
38213
38576
|
let activeConsumerCount = 0;
|