issue-sticker 0.2.1 → 0.3.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 +28 -0
- package/README.md +6 -6
- package/dist/{createLucideIcon-B457EluY.js → createLucideIcon-CmSNiW63.js} +19 -17
- package/dist/{externalUserPayload-C2hxbvaU.js → externalUserPayload-hJjuUx6q.js} +154 -57
- package/dist/issue-sticker-headless-react.js +2 -2
- package/dist/issue-sticker-headless.js +15 -9
- package/dist/issue-sticker-react.js +594 -134
- package/dist/{tooltip-BkQcdrki.js → tooltip-DciWyUWs.js} +1 -1
- package/package.json +5 -1
|
@@ -15,14 +15,14 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
var _focused, _cleanup, _setup, _a, _provider, _providerCalled, _b, _online, _cleanup2, _setup2, _c, _gcTimeout, _d, _queryType, _initialState, _revertState, _cache, _client, _retryer, _defaultOptions, _abortSignalConsumed, _Query_instances, isInitialPausedFetch_fn, dispatch_fn, _e, _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, _f, _client3, _observers, _mutationCache, _retryer2, _Mutation_instances, dispatch_fn2, _g, _mutations, _scopes, _mutationId, _h, _client4, _currentResult2, _currentMutation, _mutateOptions, _MutationObserver_instances, updateResult_fn, notify_fn2, _i, _queries, _j, _queryCache, _mutationCache2, _defaultOptions2, _queryDefaults, _mutationDefaults, _mountCount, _unsubscribeFocus, _unsubscribeOnline, _k, _l;
|
|
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, e as useControllableState, P as Primitive, f as useId$1, g as composeEventHandlers, h as Presence, i as createContextScope, j as useComposedRefs$1, k as useLayoutEffect2, l as useCallbackRef, m as useDismissableLayerSurface, n as Portal$1, o as createSlot, D as DismissableLayer, p as PortalContainerProvider } from "./createLucideIcon-CmSNiW63.js";
|
|
19
|
+
import { L as Label, r as Select, t as SelectTrigger, v as SelectValue, w as SelectContent, x as SelectItem, P as Popover, y as PopoverTrigger, I as Input, z as PopoverContent, e as buildJiraCreateFields, A as getJiraMetadata, B as buildJiraIssueFields, D as Button, R as Root2$2, T as Trigger$2, E as ChevronDown, F as Portal, G as Content2$1, H as Check, X as X$1, J as DatePicker, f as buildNotionCreateFields, K as getNotionPageMetadata, M as buildNotionFieldViews, c as captureWithModernScreenshot, d as directUploadToSignedUrl, O as DirectUploadError, a as uploadSignedMediaWithApi, m as sanitizeString, Q as getRegisteredUploadId, h as buildGuestOwnerQuery, i as devLogger, U as subscribe, V as getSnapshot, W as toast, Y as getExposedJiraFields, Z as isJiraFieldExposed, b as normalizeJiraFieldId, n as normalizeExposedJiraFields, C as ConsoleCollector, q as preloadModernScreenshot, N as NetworkCollector, u as uploadScreenshotDataUrls, j as filterExcludeServiceRelatedLogs, k as filterExcludeServiceRelatedConsoleLogs, l as compactNetworkLogsForTransport, g as getElementPosition, o as buildExternalUserPayload, s as syncExternalIssueIntegrations, _ as getIntegrationFailureMessage, p as SessionReplayCaptureController, $ as getPrimaryJiraMapping, a0 as createCollection, a1 as useDirection, a2 as ReactRemoveScroll, a3 as hideOthers, a4 as useFocusGuards, a5 as FocusScope, a6 as getPrimaryNotionMapping, a7 as buttonVariants, a8 as findElementBySelector, a9 as findElementByXPath, S as ScreenRecordingController, aa as useOnboardingFlow, ab as useOnboardingTarget, ac as ONBOARDING_POPOVER_DATA_ATTR, ad as OnboardingProvider } from "./externalUserPayload-hJjuUx6q.js";
|
|
19
20
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
20
|
-
import { c as createLucideIcon$1, b as usePortalContainer, a as cn$1, O as OVERLAY_LAYER, s as stopEscapePropagation, d as OVERLAY_LAYER_INDEX, e as useControllableState, P as Primitive, f as useId$1, g as composeEventHandlers, h as Presence, i as createContextScope, j as useComposedRefs$1, k as useLayoutEffect2, l as useCallbackRef, m as useDismissableLayerSurface, n as Portal$1, o as createSlot, D as DismissableLayer, p as PortalContainerProvider } from "./createLucideIcon-B457EluY.js";
|
|
21
21
|
import { createRoot } from "react-dom/client";
|
|
22
22
|
import * as React from "react";
|
|
23
23
|
import { useId, useRef, useState, useEffect, useCallback, useLayoutEffect, forwardRef, createElement, createContext, useContext, Component, Suspense, useInsertionEffect, useMemo, Children, isValidElement, Fragment as Fragment$1, useSyncExternalStore } from "react";
|
|
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-DciWyUWs.js";
|
|
26
26
|
function readReleaseMarker() {
|
|
27
27
|
try {
|
|
28
28
|
const g = globalThis.__ISSUE_STICKER_RELEASE__;
|
|
@@ -87,6 +87,43 @@ function getIssueStickerRuntimeOwner(element2) {
|
|
|
87
87
|
function markIssueStickerRuntimeHost(element2, owner) {
|
|
88
88
|
element2.setAttribute(ISSUE_STICKER_RUNTIME_OWNER_ATTRIBUTE, owner);
|
|
89
89
|
}
|
|
90
|
+
function createRuntimeHostElement(owner, doc) {
|
|
91
|
+
const targetDocument = resolveDocument();
|
|
92
|
+
if (!targetDocument) {
|
|
93
|
+
throw new Error("createRuntimeHostElement: document 를 찾을 수 없습니다.");
|
|
94
|
+
}
|
|
95
|
+
const hostElement = targetDocument.createElement("div");
|
|
96
|
+
hostElement.id = ISSUE_STICKER_HOST_ELEMENT_ID;
|
|
97
|
+
markIssueStickerRuntimeHost(hostElement, owner);
|
|
98
|
+
hostElement.style.all = "initial";
|
|
99
|
+
hostElement.style.position = "fixed";
|
|
100
|
+
hostElement.style.top = "0";
|
|
101
|
+
hostElement.style.left = "0";
|
|
102
|
+
hostElement.style.width = "0";
|
|
103
|
+
hostElement.style.height = "0";
|
|
104
|
+
hostElement.style.overflow = "visible";
|
|
105
|
+
hostElement.style.background = "transparent";
|
|
106
|
+
hostElement.style.pointerEvents = "none";
|
|
107
|
+
hostElement.style.zIndex = String(OVERLAY_LAYER_INDEX.runtimeHost);
|
|
108
|
+
hostElement.style.display = "block";
|
|
109
|
+
hostElement.style.isolation = "isolate";
|
|
110
|
+
return hostElement;
|
|
111
|
+
}
|
|
112
|
+
function isEditableTarget(target) {
|
|
113
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
114
|
+
return target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable === true;
|
|
115
|
+
}
|
|
116
|
+
function attachHostTypingGuard(shadowRoot) {
|
|
117
|
+
const handleKeyDown = (event) => {
|
|
118
|
+
const keyboardEvent = event;
|
|
119
|
+
if (keyboardEvent.ctrlKey || keyboardEvent.metaKey || keyboardEvent.altKey) return;
|
|
120
|
+
if (keyboardEvent.key === "Escape") return;
|
|
121
|
+
if (!isEditableTarget(keyboardEvent.composedPath()[0])) return;
|
|
122
|
+
keyboardEvent.stopPropagation();
|
|
123
|
+
};
|
|
124
|
+
shadowRoot.addEventListener("keydown", handleKeyDown);
|
|
125
|
+
return () => shadowRoot.removeEventListener("keydown", handleKeyDown);
|
|
126
|
+
}
|
|
90
127
|
function isIssueStickerExtensionRuntimeActive(doc) {
|
|
91
128
|
return getIssueStickerRuntimeOwner(getIssueStickerRuntimeHost()) === ISSUE_STICKER_RUNTIME_OWNER.extension;
|
|
92
129
|
}
|
|
@@ -1128,7 +1165,6 @@ function NotionPeopleFieldControl({
|
|
|
1128
1165
|
function NotionFieldList({
|
|
1129
1166
|
fields,
|
|
1130
1167
|
disabled = false,
|
|
1131
|
-
error,
|
|
1132
1168
|
title,
|
|
1133
1169
|
savingFieldId,
|
|
1134
1170
|
onFieldUpdate,
|
|
@@ -1139,7 +1175,6 @@ function NotionFieldList({
|
|
|
1139
1175
|
}
|
|
1140
1176
|
return /* @__PURE__ */ jsxs("section", { className: "space-y-4", children: [
|
|
1141
1177
|
title ? /* @__PURE__ */ jsx("h4", { className: "text-sm font-semibold text-text-primary", children: title }) : null,
|
|
1142
|
-
error ? /* @__PURE__ */ jsx("p", { className: "text-xs text-danger", children: error }) : null,
|
|
1143
1178
|
/* @__PURE__ */ jsx("div", { className: "grid gap-4 md:grid-cols-2", children: fields.map((field) => {
|
|
1144
1179
|
const fieldDisabled = disabled || !field.editable;
|
|
1145
1180
|
let content2;
|
|
@@ -1244,7 +1279,6 @@ function NotionIssueSection({
|
|
|
1244
1279
|
mapping,
|
|
1245
1280
|
notionSiteUrl,
|
|
1246
1281
|
disabled = false,
|
|
1247
|
-
error = null,
|
|
1248
1282
|
savingFieldId = null,
|
|
1249
1283
|
isSyncing = false,
|
|
1250
1284
|
canSync = false,
|
|
@@ -1305,7 +1339,6 @@ function NotionIssueSection({
|
|
|
1305
1339
|
{
|
|
1306
1340
|
fields,
|
|
1307
1341
|
disabled,
|
|
1308
|
-
error,
|
|
1309
1342
|
savingFieldId,
|
|
1310
1343
|
onFieldUpdate: (fieldId, value) => onFieldUpdate(fieldId, value, {
|
|
1311
1344
|
pageId,
|
|
@@ -4140,6 +4173,9 @@ function useBaseQuery(options, Observer, queryClient2) {
|
|
|
4140
4173
|
}
|
|
4141
4174
|
return !defaultedOptions.notifyOnChangeProps ? observer2.trackResult(result) : result;
|
|
4142
4175
|
}
|
|
4176
|
+
function useQuery(options, queryClient2) {
|
|
4177
|
+
return useBaseQuery(options, QueryObserver);
|
|
4178
|
+
}
|
|
4143
4179
|
function useSuspenseQuery(options, queryClient2) {
|
|
4144
4180
|
return useBaseQuery(
|
|
4145
4181
|
{
|
|
@@ -4479,8 +4515,8 @@ function removePendingSdkEventListener(event, callback) {
|
|
|
4479
4515
|
}
|
|
4480
4516
|
}
|
|
4481
4517
|
function flushPendingSdkEventListeners(eventBus) {
|
|
4482
|
-
pendingListeners.forEach((
|
|
4483
|
-
|
|
4518
|
+
pendingListeners.forEach((listeners, event) => {
|
|
4519
|
+
listeners.forEach((callback) => eventBus.on(event, callback));
|
|
4484
4520
|
});
|
|
4485
4521
|
pendingListeners.clear();
|
|
4486
4522
|
}
|
|
@@ -5208,7 +5244,6 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5208
5244
|
const originalHostWidth = host == null ? void 0 : host.style.width;
|
|
5209
5245
|
const originalHostHeight = host == null ? void 0 : host.style.height;
|
|
5210
5246
|
const originalHostPointerEvents = host == null ? void 0 : host.style.pointerEvents;
|
|
5211
|
-
const originalHostZIndex = host == null ? void 0 : host.style.zIndex;
|
|
5212
5247
|
const originalShadowWidth = shadowRoot == null ? void 0 : shadowRoot.style.width;
|
|
5213
5248
|
const originalShadowHeight = shadowRoot == null ? void 0 : shadowRoot.style.height;
|
|
5214
5249
|
const originalShadowPointerEvents = shadowRoot == null ? void 0 : shadowRoot.style.pointerEvents;
|
|
@@ -5219,7 +5254,6 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5219
5254
|
host.style.width = "100vw";
|
|
5220
5255
|
host.style.height = "100vh";
|
|
5221
5256
|
host.style.pointerEvents = "auto";
|
|
5222
|
-
host.style.zIndex = String(OVERLAY_LAYER_INDEX.sdkLoginHost);
|
|
5223
5257
|
}
|
|
5224
5258
|
if (shadowRoot) {
|
|
5225
5259
|
shadowRoot.style.width = "100vw";
|
|
@@ -5243,7 +5277,6 @@ function AuthProvider({ apiKey, children }) {
|
|
|
5243
5277
|
host.style.width = originalHostWidth || "";
|
|
5244
5278
|
host.style.height = originalHostHeight || "";
|
|
5245
5279
|
host.style.pointerEvents = originalHostPointerEvents || "";
|
|
5246
|
-
host.style.zIndex = originalHostZIndex || "";
|
|
5247
5280
|
}
|
|
5248
5281
|
if (shadowRoot) {
|
|
5249
5282
|
shadowRoot.style.width = originalShadowWidth || "";
|
|
@@ -5675,6 +5708,12 @@ async function uploadSignedMedia(file, mediaType, issueId) {
|
|
|
5675
5708
|
function issuesEndpoint() {
|
|
5676
5709
|
return "/api/sdk/issues";
|
|
5677
5710
|
}
|
|
5711
|
+
function guestOwnerQuery() {
|
|
5712
|
+
var _a2;
|
|
5713
|
+
const mode = getSdkMode();
|
|
5714
|
+
if (mode !== "public") return "";
|
|
5715
|
+
return buildGuestOwnerQuery(mode, (_a2 = SDKManager.getInstance().config.user) == null ? void 0 : _a2.id);
|
|
5716
|
+
}
|
|
5678
5717
|
let issuesCache = null;
|
|
5679
5718
|
const CACHE_DURATION_MS = 30 * 1e3;
|
|
5680
5719
|
const STICKER_PAGE_SIZE = 500;
|
|
@@ -5847,13 +5886,16 @@ const issueService = {
|
|
|
5847
5886
|
// llm_prompt 를 상세 응답에 포함한다(목록 응답에는 없음) — 스코프를 이 반환 타입에만 한정한다.
|
|
5848
5887
|
async getIssue(id2) {
|
|
5849
5888
|
return apiClient.get(
|
|
5850
|
-
`${issuesEndpoint()}/${id2}`
|
|
5889
|
+
`${issuesEndpoint()}/${id2}${guestOwnerQuery()}`
|
|
5851
5890
|
);
|
|
5852
5891
|
},
|
|
5853
5892
|
async updateIssue(id2, updates) {
|
|
5854
5893
|
const sanitizedUpdates = sanitizeString(updates);
|
|
5855
5894
|
const { comments: _comments, ...restUpdates } = sanitizedUpdates;
|
|
5856
|
-
const issue = await apiClient.put(
|
|
5895
|
+
const issue = await apiClient.put(
|
|
5896
|
+
`${issuesEndpoint()}/${id2}${guestOwnerQuery()}`,
|
|
5897
|
+
restUpdates
|
|
5898
|
+
);
|
|
5857
5899
|
invalidateIssuesCache();
|
|
5858
5900
|
return issue;
|
|
5859
5901
|
},
|
|
@@ -5865,7 +5907,7 @@ const issueService = {
|
|
|
5865
5907
|
});
|
|
5866
5908
|
},
|
|
5867
5909
|
async deleteIssue(id2, options) {
|
|
5868
|
-
const endpoint = `${issuesEndpoint()}/${id2}`;
|
|
5910
|
+
const endpoint = `${issuesEndpoint()}/${id2}${guestOwnerQuery()}`;
|
|
5869
5911
|
if (options == null ? void 0 : options.deleteExternal) {
|
|
5870
5912
|
await apiClient.delete(endpoint, {
|
|
5871
5913
|
body: { deleteExternal: true }
|
|
@@ -14144,77 +14186,33 @@ const featureBundle = {
|
|
|
14144
14186
|
};
|
|
14145
14187
|
const motion$1 = /* @__PURE__ */ createMotionProxy(featureBundle, createDomVisualElement);
|
|
14146
14188
|
const motion = motion$1;
|
|
14147
|
-
let nextId = 0;
|
|
14148
|
-
let toasts = [];
|
|
14149
|
-
const listeners = /* @__PURE__ */ new Set();
|
|
14150
|
-
function emit() {
|
|
14151
|
-
listeners.forEach((l) => l());
|
|
14152
|
-
}
|
|
14153
|
-
function addToast(message, type, options) {
|
|
14154
|
-
const id2 = `toast-${++nextId}`;
|
|
14155
|
-
const t = {
|
|
14156
|
-
id: id2,
|
|
14157
|
-
message,
|
|
14158
|
-
type,
|
|
14159
|
-
action: options == null ? void 0 : options.action,
|
|
14160
|
-
duration: (options == null ? void 0 : options.duration) ?? 2e3,
|
|
14161
|
-
createdAt: Date.now()
|
|
14162
|
-
};
|
|
14163
|
-
toasts = [...toasts, t];
|
|
14164
|
-
emit();
|
|
14165
|
-
return id2;
|
|
14166
|
-
}
|
|
14167
|
-
function dismiss(id2) {
|
|
14168
|
-
toasts = toasts.filter((t) => t.id !== id2);
|
|
14169
|
-
emit();
|
|
14170
|
-
}
|
|
14171
|
-
function dismissAll() {
|
|
14172
|
-
toasts = [];
|
|
14173
|
-
emit();
|
|
14174
|
-
}
|
|
14175
|
-
function toast(message, options) {
|
|
14176
|
-
return addToast(message, "default", options);
|
|
14177
|
-
}
|
|
14178
|
-
toast.success = (message, options) => addToast(message, "success", options);
|
|
14179
|
-
toast.warning = (message, options) => addToast(message, "warning", options);
|
|
14180
|
-
toast.error = (message, options) => addToast(message, "error", options);
|
|
14181
|
-
toast.info = (message, options) => addToast(message, "info", options);
|
|
14182
|
-
toast.dismiss = dismiss;
|
|
14183
|
-
toast.dismissAll = dismissAll;
|
|
14184
|
-
function subscribe(listener) {
|
|
14185
|
-
listeners.add(listener);
|
|
14186
|
-
return () => listeners.delete(listener);
|
|
14187
|
-
}
|
|
14188
|
-
function getSnapshot() {
|
|
14189
|
-
return toasts;
|
|
14190
|
-
}
|
|
14191
14189
|
const TYPE_STYLES = {
|
|
14192
14190
|
default: {
|
|
14193
|
-
|
|
14191
|
+
tint: "",
|
|
14194
14192
|
border: "border-line-subtle",
|
|
14195
14193
|
icon: Info$1,
|
|
14196
14194
|
iconColor: "text-text-tertiary"
|
|
14197
14195
|
},
|
|
14198
14196
|
success: {
|
|
14199
|
-
|
|
14197
|
+
tint: "bg-success-subtle",
|
|
14200
14198
|
border: "border-success/30",
|
|
14201
14199
|
icon: CircleCheck,
|
|
14202
14200
|
iconColor: "text-success"
|
|
14203
14201
|
},
|
|
14204
14202
|
warning: {
|
|
14205
|
-
|
|
14203
|
+
tint: "bg-warning-subtle",
|
|
14206
14204
|
border: "border-warning/30",
|
|
14207
14205
|
icon: TriangleAlert,
|
|
14208
14206
|
iconColor: "text-warning"
|
|
14209
14207
|
},
|
|
14210
14208
|
error: {
|
|
14211
|
-
|
|
14209
|
+
tint: "bg-danger-subtle",
|
|
14212
14210
|
border: "border-danger/30",
|
|
14213
14211
|
icon: CircleX,
|
|
14214
14212
|
iconColor: "text-danger"
|
|
14215
14213
|
},
|
|
14216
14214
|
info: {
|
|
14217
|
-
|
|
14215
|
+
tint: "bg-info-subtle",
|
|
14218
14216
|
border: "border-info/30",
|
|
14219
14217
|
icon: Info$1,
|
|
14220
14218
|
iconColor: "text-info"
|
|
@@ -14232,7 +14230,7 @@ function ToastItem({
|
|
|
14232
14230
|
const timer = setTimeout(onDismiss, t.duration);
|
|
14233
14231
|
return () => clearTimeout(timer);
|
|
14234
14232
|
}, [t.duration, onDismiss]);
|
|
14235
|
-
return /* @__PURE__ */
|
|
14233
|
+
return /* @__PURE__ */ jsx(
|
|
14236
14234
|
motion.div,
|
|
14237
14235
|
{
|
|
14238
14236
|
layout: true,
|
|
@@ -14246,11 +14244,13 @@ function ToastItem({
|
|
|
14246
14244
|
transition: { duration: 0.2, ease: [0.34, 1.2, 0.64, 1] },
|
|
14247
14245
|
style: { marginBottom: behindCount > 0 ? "-32px" : void 0, zIndex: 100 - behindCount },
|
|
14248
14246
|
className: cn$1(
|
|
14249
|
-
|
|
14250
|
-
|
|
14247
|
+
// 상태 색(-subtle)은 알파라 단독으로 깔면 호스트 페이지가 비쳐 본문이 읽히지
|
|
14248
|
+
// 않는다. 이 토스트는 고객 웹페이지 위에 뜨므로 불투명 surface 를 베이스로
|
|
14249
|
+
// 깔고 그 위에 틴트를 올린다.
|
|
14250
|
+
"pointer-events-auto w-fit min-w-[200px] max-w-[360px] overflow-hidden rounded-lg border bg-surface-1 shadow-md",
|
|
14251
14251
|
style.border
|
|
14252
14252
|
),
|
|
14253
|
-
children: [
|
|
14253
|
+
children: /* @__PURE__ */ jsxs("div", { className: cn$1("flex items-center gap-2.5 px-3 py-2.5", style.tint), children: [
|
|
14254
14254
|
t.type !== "default" ? /* @__PURE__ */ jsx(Icon2, { className: cn$1("h-4 w-4 shrink-0", style.iconColor) }) : null,
|
|
14255
14255
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 text-sm font-medium text-text-primary", children: t.message }),
|
|
14256
14256
|
t.action ? /* @__PURE__ */ jsx(
|
|
@@ -14275,12 +14275,12 @@ function ToastItem({
|
|
|
14275
14275
|
children: /* @__PURE__ */ jsx(X$1, { className: "h-3.5 w-3.5" })
|
|
14276
14276
|
}
|
|
14277
14277
|
)
|
|
14278
|
-
]
|
|
14278
|
+
] })
|
|
14279
14279
|
}
|
|
14280
14280
|
);
|
|
14281
14281
|
}
|
|
14282
14282
|
function ToastContainer({ position: position2 = "top-right" }) {
|
|
14283
|
-
const
|
|
14283
|
+
const toasts = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
14284
14284
|
const portalContainer = usePortalContainer();
|
|
14285
14285
|
const positionClass = {
|
|
14286
14286
|
"top-right": "top-4 right-4 items-end",
|
|
@@ -14295,7 +14295,7 @@ function ToastContainer({ position: position2 = "top-right" }) {
|
|
|
14295
14295
|
`pointer-events-none fixed ${OVERLAY_LAYER.toast} flex flex-col-reverse`,
|
|
14296
14296
|
positionClass
|
|
14297
14297
|
),
|
|
14298
|
-
children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: [...
|
|
14298
|
+
children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: [...toasts].reverse().map((t, i) => /* @__PURE__ */ jsx(ToastItem, { t, behindCount: i, onDismiss: () => toast.dismiss(t.id) }, t.id)) })
|
|
14299
14299
|
}
|
|
14300
14300
|
);
|
|
14301
14301
|
if (typeof document === "undefined") return null;
|
|
@@ -14447,6 +14447,52 @@ function OverlayShell({
|
|
|
14447
14447
|
"overlay-backdrop"
|
|
14448
14448
|
) : null });
|
|
14449
14449
|
}
|
|
14450
|
+
function useProject() {
|
|
14451
|
+
const auth = useAuthContext();
|
|
14452
|
+
return {
|
|
14453
|
+
projects: [],
|
|
14454
|
+
selectedProjectId: auth.projectId,
|
|
14455
|
+
selectProject: async (_projectId) => {
|
|
14456
|
+
},
|
|
14457
|
+
reloadProjects: () => {
|
|
14458
|
+
}
|
|
14459
|
+
};
|
|
14460
|
+
}
|
|
14461
|
+
const POPUP_POLL_INTERVAL_MS = 500;
|
|
14462
|
+
function useOAuthPopupWatcher(onSettle) {
|
|
14463
|
+
const popupWatchRef = useRef(void 0);
|
|
14464
|
+
const pendingRef = useRef(false);
|
|
14465
|
+
const settle = useCallback(() => {
|
|
14466
|
+
if (!pendingRef.current) return;
|
|
14467
|
+
pendingRef.current = false;
|
|
14468
|
+
window.clearInterval(popupWatchRef.current);
|
|
14469
|
+
onSettle();
|
|
14470
|
+
}, [onSettle]);
|
|
14471
|
+
const trackAttempt = useCallback(
|
|
14472
|
+
(popup) => {
|
|
14473
|
+
pendingRef.current = true;
|
|
14474
|
+
window.clearInterval(popupWatchRef.current);
|
|
14475
|
+
if (!popup) return;
|
|
14476
|
+
popupWatchRef.current = window.setInterval(() => {
|
|
14477
|
+
if (!popup.closed) return;
|
|
14478
|
+
settle();
|
|
14479
|
+
}, POPUP_POLL_INTERVAL_MS);
|
|
14480
|
+
},
|
|
14481
|
+
[settle]
|
|
14482
|
+
);
|
|
14483
|
+
useEffect(() => {
|
|
14484
|
+
window.addEventListener("focus", settle);
|
|
14485
|
+
return () => window.removeEventListener("focus", settle);
|
|
14486
|
+
}, [settle]);
|
|
14487
|
+
useEffect(() => () => window.clearInterval(popupWatchRef.current), []);
|
|
14488
|
+
return trackAttempt;
|
|
14489
|
+
}
|
|
14490
|
+
async function getPendingJiraConnections() {
|
|
14491
|
+
const result = await apiClient.get(
|
|
14492
|
+
"/api/oauth/jira/pending-connections"
|
|
14493
|
+
);
|
|
14494
|
+
return result.projects;
|
|
14495
|
+
}
|
|
14450
14496
|
function getUserLabel(user) {
|
|
14451
14497
|
return user.displayName || user.emailAddress || user.accountId;
|
|
14452
14498
|
}
|
|
@@ -14490,17 +14536,6 @@ class JiraService {
|
|
|
14490
14536
|
);
|
|
14491
14537
|
return result.url;
|
|
14492
14538
|
}
|
|
14493
|
-
async testConnection(projectId) {
|
|
14494
|
-
try {
|
|
14495
|
-
const result = await apiClient.post("/api/jira/test-connection", { projectId });
|
|
14496
|
-
return { success: true, user: result.user };
|
|
14497
|
-
} catch (error) {
|
|
14498
|
-
return {
|
|
14499
|
-
success: false,
|
|
14500
|
-
error: error instanceof Error ? error.message : "연결 테스트 중 오류가 발생했습니다."
|
|
14501
|
-
};
|
|
14502
|
-
}
|
|
14503
|
-
}
|
|
14504
14539
|
async createIssue(projectId, issueData, issueId) {
|
|
14505
14540
|
try {
|
|
14506
14541
|
const exposedFields = new Set(this.getExposedFields().map(normalizeJiraFieldId));
|
|
@@ -14579,6 +14614,40 @@ class JiraService {
|
|
|
14579
14614
|
}
|
|
14580
14615
|
}
|
|
14581
14616
|
const jiraService = new JiraService();
|
|
14617
|
+
const jiraPendingConnectionsQueryKey = ["jira", "pending-connections"];
|
|
14618
|
+
function useJiraConnectNudge(projectId, enabled) {
|
|
14619
|
+
const queryClient2 = useQueryClient();
|
|
14620
|
+
const isEnabled = enabled && Boolean(projectId);
|
|
14621
|
+
const {
|
|
14622
|
+
data: pending,
|
|
14623
|
+
refetch,
|
|
14624
|
+
isFetched
|
|
14625
|
+
} = useQuery({
|
|
14626
|
+
queryKey: jiraPendingConnectionsQueryKey,
|
|
14627
|
+
queryFn: getPendingJiraConnections,
|
|
14628
|
+
enabled: isEnabled
|
|
14629
|
+
});
|
|
14630
|
+
const trackAttempt = useOAuthPopupWatcher(
|
|
14631
|
+
useCallback(() => {
|
|
14632
|
+
void queryClient2.resetQueries({ queryKey: ["jiraIntegrationFields"] });
|
|
14633
|
+
void refetch();
|
|
14634
|
+
}, [queryClient2, refetch])
|
|
14635
|
+
);
|
|
14636
|
+
const connect = useCallback(async () => {
|
|
14637
|
+
if (!projectId) return;
|
|
14638
|
+
try {
|
|
14639
|
+
const url = await jiraService.getOAuthAuthorizationUrl(projectId);
|
|
14640
|
+
trackAttempt(window.open(url, "_blank", "width=600,height=700"));
|
|
14641
|
+
} catch (error) {
|
|
14642
|
+
devLogger.error("useJiraConnectNudge", "Jira 계정 연결 시작 실패:", error);
|
|
14643
|
+
}
|
|
14644
|
+
}, [projectId, trackAttempt]);
|
|
14645
|
+
const needsConnect = Boolean(
|
|
14646
|
+
projectId && (pending == null ? void 0 : pending.some((project) => project.projectId === projectId))
|
|
14647
|
+
);
|
|
14648
|
+
const isResolving = isEnabled && !isFetched;
|
|
14649
|
+
return { needsConnect, connect, isResolving };
|
|
14650
|
+
}
|
|
14582
14651
|
function useIssueFormState({ initialDescription } = {}) {
|
|
14583
14652
|
const [title, setTitle] = useState("");
|
|
14584
14653
|
const [description, setDescription] = useState(initialDescription || "");
|
|
@@ -14671,17 +14740,6 @@ function classifyBillingError(err) {
|
|
|
14671
14740
|
}
|
|
14672
14741
|
return null;
|
|
14673
14742
|
}
|
|
14674
|
-
function useProject() {
|
|
14675
|
-
const auth = useAuthContext();
|
|
14676
|
-
return {
|
|
14677
|
-
projects: [],
|
|
14678
|
-
selectedProjectId: auth.projectId,
|
|
14679
|
-
selectProject: async (_projectId) => {
|
|
14680
|
-
},
|
|
14681
|
-
reloadProjects: () => {
|
|
14682
|
-
}
|
|
14683
|
-
};
|
|
14684
|
-
}
|
|
14685
14743
|
function useAuthInfo() {
|
|
14686
14744
|
const auth = useAuthContext();
|
|
14687
14745
|
const { selectedProjectId } = useProject();
|
|
@@ -15081,6 +15139,7 @@ function useIssueSubmission({
|
|
|
15081
15139
|
onSubmit,
|
|
15082
15140
|
jiraFields,
|
|
15083
15141
|
notionFields,
|
|
15142
|
+
customFieldValues,
|
|
15084
15143
|
activeIntegrationType,
|
|
15085
15144
|
notionIntegrationId,
|
|
15086
15145
|
videoFile,
|
|
@@ -15098,7 +15157,7 @@ function useIssueSubmission({
|
|
|
15098
15157
|
const { createNotionPage } = useNotionIntegrationWithApi();
|
|
15099
15158
|
const createIssueMutation = useDebouncedMutation({
|
|
15100
15159
|
mutationFn: async (data) => {
|
|
15101
|
-
var _a2;
|
|
15160
|
+
var _a2, _b2;
|
|
15102
15161
|
if (!data.title.trim()) {
|
|
15103
15162
|
throw new Error("제목을 입력해주세요.");
|
|
15104
15163
|
}
|
|
@@ -15156,8 +15215,13 @@ function useIssueSubmission({
|
|
|
15156
15215
|
tenant_id: authInfo.tenantId,
|
|
15157
15216
|
project_id: authInfo.projectId,
|
|
15158
15217
|
account_id: authInfo.accountId || void 0,
|
|
15159
|
-
...buildExternalUserPayload(SDKManager.getInstance().config.user)
|
|
15218
|
+
...buildExternalUserPayload(SDKManager.getInstance().config.user),
|
|
15219
|
+
// 비어 있는 값은 보내지 않는다 — 저장해봐야 값 없음과 같고 요청만 커진다.
|
|
15220
|
+
custom_field_values: Object.entries(customFieldValues ?? {}).filter(([, value]) => value !== null && value !== void 0 && value !== "").map(([field_definition_id, value]) => ({ field_definition_id, value }))
|
|
15160
15221
|
};
|
|
15222
|
+
if (((_b2 = issueData.custom_field_values) == null ? void 0 : _b2.length) === 0) {
|
|
15223
|
+
delete issueData.custom_field_values;
|
|
15224
|
+
}
|
|
15161
15225
|
if ((sessionReplay == null ? void 0 : sessionReplay.preferOn) && sessionReplay.canAttach) {
|
|
15162
15226
|
try {
|
|
15163
15227
|
const snapshot = await sessionReplay.takeSnapshot();
|
|
@@ -15303,6 +15367,319 @@ function IssueFormButtons({
|
|
|
15303
15367
|
/* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", disabled: isSubmitting || submitDisabled, children: isSubmitting ? "생성 중..." : "생성" })
|
|
15304
15368
|
] });
|
|
15305
15369
|
}
|
|
15370
|
+
const SIZE_CLASSES = {
|
|
15371
|
+
sm: { box: "h-4 w-4", icon: "h-3 w-3", offset: "mt-0.5" },
|
|
15372
|
+
md: { box: "h-[1.4rem] w-[1.4rem]", icon: "h-4 w-4", offset: "" }
|
|
15373
|
+
};
|
|
15374
|
+
function Checkbox({
|
|
15375
|
+
id: id2,
|
|
15376
|
+
checked,
|
|
15377
|
+
disabled = false,
|
|
15378
|
+
onCheckedChange,
|
|
15379
|
+
size = "sm"
|
|
15380
|
+
}) {
|
|
15381
|
+
const sizeClasses = SIZE_CLASSES[size];
|
|
15382
|
+
return /* @__PURE__ */ jsxs("span", { className: cn$1("relative inline-flex shrink-0", sizeClasses.box, sizeClasses.offset), children: [
|
|
15383
|
+
/* @__PURE__ */ jsx(
|
|
15384
|
+
"input",
|
|
15385
|
+
{
|
|
15386
|
+
id: id2,
|
|
15387
|
+
type: "checkbox",
|
|
15388
|
+
className: "peer absolute inset-0 z-10 h-full w-full cursor-pointer appearance-none rounded-xs opacity-0 disabled:cursor-not-allowed",
|
|
15389
|
+
checked,
|
|
15390
|
+
disabled,
|
|
15391
|
+
onChange: (event) => onCheckedChange(event.target.checked)
|
|
15392
|
+
}
|
|
15393
|
+
),
|
|
15394
|
+
/* @__PURE__ */ jsx(
|
|
15395
|
+
"span",
|
|
15396
|
+
{
|
|
15397
|
+
"data-testid": "checkbox-indicator",
|
|
15398
|
+
className: cn$1(
|
|
15399
|
+
"pointer-events-none flex items-center justify-center rounded-xs border transition-[background-color,border-color,color,box-shadow] duration-fast peer-focus-visible:shadow-focus",
|
|
15400
|
+
sizeClasses.box,
|
|
15401
|
+
checked ? "border-brand bg-brand text-brand-fg" : "border-line-strong bg-surface-1 text-transparent",
|
|
15402
|
+
disabled && "opacity-60"
|
|
15403
|
+
),
|
|
15404
|
+
children: /* @__PURE__ */ jsx(
|
|
15405
|
+
Check,
|
|
15406
|
+
{
|
|
15407
|
+
"data-testid": "checkbox-icon",
|
|
15408
|
+
className: cn$1(
|
|
15409
|
+
"stroke-[3] transition-opacity duration-fast",
|
|
15410
|
+
sizeClasses.icon,
|
|
15411
|
+
checked ? "opacity-100" : "opacity-0"
|
|
15412
|
+
),
|
|
15413
|
+
"aria-hidden": "true"
|
|
15414
|
+
}
|
|
15415
|
+
)
|
|
15416
|
+
}
|
|
15417
|
+
)
|
|
15418
|
+
] });
|
|
15419
|
+
}
|
|
15420
|
+
function getOptions$1(field) {
|
|
15421
|
+
var _a2;
|
|
15422
|
+
const raw = (_a2 = field.field_config) == null ? void 0 : _a2.options;
|
|
15423
|
+
return Array.isArray(raw) ? raw.filter((o) => typeof o === "string") : [];
|
|
15424
|
+
}
|
|
15425
|
+
function toInputText(value) {
|
|
15426
|
+
if (value === null || value === void 0) return "";
|
|
15427
|
+
return String(value);
|
|
15428
|
+
}
|
|
15429
|
+
function CustomFieldInput({ field, value, disabled, onChange }) {
|
|
15430
|
+
const inputId = useId();
|
|
15431
|
+
const label = /* @__PURE__ */ jsx(Label, { htmlFor: inputId, children: field.field_name });
|
|
15432
|
+
if (field.field_type === "boolean") {
|
|
15433
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
15434
|
+
label,
|
|
15435
|
+
/* @__PURE__ */ jsx("div", { "data-testid": "custom-field-boolean-control", className: "flex", children: /* @__PURE__ */ jsx(
|
|
15436
|
+
Checkbox,
|
|
15437
|
+
{
|
|
15438
|
+
id: inputId,
|
|
15439
|
+
size: "md",
|
|
15440
|
+
disabled,
|
|
15441
|
+
checked: value === true || value === "true",
|
|
15442
|
+
onCheckedChange: (checked) => onChange(checked)
|
|
15443
|
+
}
|
|
15444
|
+
) })
|
|
15445
|
+
] });
|
|
15446
|
+
}
|
|
15447
|
+
if (field.field_type === "select") {
|
|
15448
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
15449
|
+
label,
|
|
15450
|
+
/* @__PURE__ */ jsxs(
|
|
15451
|
+
Select,
|
|
15452
|
+
{
|
|
15453
|
+
value: typeof value === "string" ? value : "",
|
|
15454
|
+
disabled,
|
|
15455
|
+
onValueChange: (next) => onChange(next),
|
|
15456
|
+
children: [
|
|
15457
|
+
/* @__PURE__ */ jsx(SelectTrigger, { id: inputId, children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "선택..." }) }),
|
|
15458
|
+
/* @__PURE__ */ jsx(SelectContent, { children: getOptions$1(field).map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option, children: option }, option)) })
|
|
15459
|
+
]
|
|
15460
|
+
}
|
|
15461
|
+
)
|
|
15462
|
+
] });
|
|
15463
|
+
}
|
|
15464
|
+
if (field.field_type === "multi_select") {
|
|
15465
|
+
const options = getOptions$1(field);
|
|
15466
|
+
const optionSet = new Set(options);
|
|
15467
|
+
const selected = Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
15468
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
15469
|
+
label,
|
|
15470
|
+
/* @__PURE__ */ jsx(
|
|
15471
|
+
MultiSelect,
|
|
15472
|
+
{
|
|
15473
|
+
options: options.map((option) => ({ label: option, value: option })),
|
|
15474
|
+
value: selected,
|
|
15475
|
+
disabled,
|
|
15476
|
+
onValueChange: (next) => {
|
|
15477
|
+
const allowed = next.filter((v) => optionSet.has(v));
|
|
15478
|
+
onChange(allowed.length > 0 ? allowed : null);
|
|
15479
|
+
},
|
|
15480
|
+
placeholder: "선택..."
|
|
15481
|
+
}
|
|
15482
|
+
)
|
|
15483
|
+
] });
|
|
15484
|
+
}
|
|
15485
|
+
if (field.field_type === "number") {
|
|
15486
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
15487
|
+
label,
|
|
15488
|
+
/* @__PURE__ */ jsx(
|
|
15489
|
+
Input,
|
|
15490
|
+
{
|
|
15491
|
+
id: inputId,
|
|
15492
|
+
type: "number",
|
|
15493
|
+
disabled,
|
|
15494
|
+
value: toInputText(value),
|
|
15495
|
+
onChange: (e) => onChange(e.target.value === "" ? null : Number(e.target.value)),
|
|
15496
|
+
placeholder: "숫자를 입력하세요"
|
|
15497
|
+
}
|
|
15498
|
+
)
|
|
15499
|
+
] });
|
|
15500
|
+
}
|
|
15501
|
+
if (field.field_type === "date") {
|
|
15502
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
15503
|
+
label,
|
|
15504
|
+
/* @__PURE__ */ jsx(
|
|
15505
|
+
Input,
|
|
15506
|
+
{
|
|
15507
|
+
id: inputId,
|
|
15508
|
+
type: "date",
|
|
15509
|
+
disabled,
|
|
15510
|
+
value: toInputText(value),
|
|
15511
|
+
onChange: (e) => onChange(e.target.value || null)
|
|
15512
|
+
}
|
|
15513
|
+
)
|
|
15514
|
+
] });
|
|
15515
|
+
}
|
|
15516
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
15517
|
+
label,
|
|
15518
|
+
/* @__PURE__ */ jsx(
|
|
15519
|
+
Input,
|
|
15520
|
+
{
|
|
15521
|
+
id: inputId,
|
|
15522
|
+
type: "text",
|
|
15523
|
+
disabled,
|
|
15524
|
+
value: toInputText(value),
|
|
15525
|
+
onChange: (e) => onChange(e.target.value),
|
|
15526
|
+
placeholder: "값을 입력하세요"
|
|
15527
|
+
}
|
|
15528
|
+
)
|
|
15529
|
+
] });
|
|
15530
|
+
}
|
|
15531
|
+
function CustomFieldsSection({
|
|
15532
|
+
fields,
|
|
15533
|
+
values,
|
|
15534
|
+
onChange,
|
|
15535
|
+
disabled,
|
|
15536
|
+
title = "커스텀 필드"
|
|
15537
|
+
}) {
|
|
15538
|
+
if (fields.length === 0) return null;
|
|
15539
|
+
return /* @__PURE__ */ jsxs("section", { className: "space-y-4", children: [
|
|
15540
|
+
title ? /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-text-primary", children: title }) : null,
|
|
15541
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: fields.map((field) => /* @__PURE__ */ jsx(
|
|
15542
|
+
CustomFieldInput,
|
|
15543
|
+
{
|
|
15544
|
+
field,
|
|
15545
|
+
value: values[field.id],
|
|
15546
|
+
disabled,
|
|
15547
|
+
onChange: (value) => onChange(field.id, value)
|
|
15548
|
+
},
|
|
15549
|
+
field.id
|
|
15550
|
+
)) })
|
|
15551
|
+
] });
|
|
15552
|
+
}
|
|
15553
|
+
const OPTION_FIELD_TYPES = /* @__PURE__ */ new Set(["select", "multi_select"]);
|
|
15554
|
+
function getOptions(field) {
|
|
15555
|
+
var _a2;
|
|
15556
|
+
if (!OPTION_FIELD_TYPES.has(field.field_type)) return null;
|
|
15557
|
+
const raw = (_a2 = field.field_config) == null ? void 0 : _a2.options;
|
|
15558
|
+
if (!Array.isArray(raw)) return null;
|
|
15559
|
+
const names = raw.filter((o) => typeof o === "string");
|
|
15560
|
+
return names.length > 0 ? names : null;
|
|
15561
|
+
}
|
|
15562
|
+
function pickValidOptionValue(field, value) {
|
|
15563
|
+
const options = getOptions(field);
|
|
15564
|
+
if (!options) return value;
|
|
15565
|
+
const allowed = new Set(options);
|
|
15566
|
+
if (field.field_type === "multi_select") {
|
|
15567
|
+
const list2 = Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
15568
|
+
const kept = list2.filter((v) => allowed.has(v));
|
|
15569
|
+
return kept.length > 0 ? kept : void 0;
|
|
15570
|
+
}
|
|
15571
|
+
return typeof value === "string" && allowed.has(value) ? value : void 0;
|
|
15572
|
+
}
|
|
15573
|
+
function getCustomFieldDefaultValues(fields) {
|
|
15574
|
+
var _a2;
|
|
15575
|
+
const values = {};
|
|
15576
|
+
for (const field of fields) {
|
|
15577
|
+
const raw = (_a2 = field.field_config) == null ? void 0 : _a2.default_value;
|
|
15578
|
+
if (raw === null || raw === void 0) continue;
|
|
15579
|
+
const value = pickValidOptionValue(field, raw);
|
|
15580
|
+
if (value === void 0) continue;
|
|
15581
|
+
values[field.id] = value;
|
|
15582
|
+
}
|
|
15583
|
+
return values;
|
|
15584
|
+
}
|
|
15585
|
+
const CUSTOM_FIELD_SAVE_DEBOUNCE_MS = 400;
|
|
15586
|
+
function useCustomFieldValueDraft({
|
|
15587
|
+
serverValues,
|
|
15588
|
+
save,
|
|
15589
|
+
onSaved,
|
|
15590
|
+
onError,
|
|
15591
|
+
delayMs = CUSTOM_FIELD_SAVE_DEBOUNCE_MS
|
|
15592
|
+
}) {
|
|
15593
|
+
const [draft, setDraft] = useState({});
|
|
15594
|
+
const timersRef = useRef({});
|
|
15595
|
+
const saveRef = useRef(save);
|
|
15596
|
+
const onSavedRef = useRef(onSaved);
|
|
15597
|
+
const onErrorRef = useRef(onError);
|
|
15598
|
+
saveRef.current = save;
|
|
15599
|
+
onSavedRef.current = onSaved;
|
|
15600
|
+
onErrorRef.current = onError;
|
|
15601
|
+
useEffect(() => {
|
|
15602
|
+
const timers = timersRef.current;
|
|
15603
|
+
return () => {
|
|
15604
|
+
Object.values(timers).forEach(clearTimeout);
|
|
15605
|
+
};
|
|
15606
|
+
}, []);
|
|
15607
|
+
const setValue = useCallback(
|
|
15608
|
+
(fieldDefinitionId, value) => {
|
|
15609
|
+
setDraft((current) => ({ ...current, [fieldDefinitionId]: value }));
|
|
15610
|
+
clearTimeout(timersRef.current[fieldDefinitionId]);
|
|
15611
|
+
timersRef.current[fieldDefinitionId] = setTimeout(() => {
|
|
15612
|
+
delete timersRef.current[fieldDefinitionId];
|
|
15613
|
+
void (async () => {
|
|
15614
|
+
var _a2, _b2;
|
|
15615
|
+
try {
|
|
15616
|
+
await saveRef.current(fieldDefinitionId, value);
|
|
15617
|
+
(_a2 = onSavedRef.current) == null ? void 0 : _a2.call(onSavedRef, fieldDefinitionId);
|
|
15618
|
+
} catch (error) {
|
|
15619
|
+
(_b2 = onErrorRef.current) == null ? void 0 : _b2.call(onErrorRef, fieldDefinitionId, error);
|
|
15620
|
+
}
|
|
15621
|
+
})();
|
|
15622
|
+
}, delayMs);
|
|
15623
|
+
},
|
|
15624
|
+
[delayMs]
|
|
15625
|
+
);
|
|
15626
|
+
const values = useMemo(() => ({ ...serverValues, ...draft }), [serverValues, draft]);
|
|
15627
|
+
return { values, setValue };
|
|
15628
|
+
}
|
|
15629
|
+
async function fetchCustomFieldDefinitions(projectId) {
|
|
15630
|
+
try {
|
|
15631
|
+
return await apiClient.get(
|
|
15632
|
+
`/api/integrations/fields/definitions?projectId=${encodeURIComponent(projectId)}`
|
|
15633
|
+
);
|
|
15634
|
+
} catch (error) {
|
|
15635
|
+
devLogger.error("customFieldService", "커스텀 필드 정의 조회 실패:", error);
|
|
15636
|
+
return [];
|
|
15637
|
+
}
|
|
15638
|
+
}
|
|
15639
|
+
async function fetchIssueCustomFieldValues(issueId) {
|
|
15640
|
+
try {
|
|
15641
|
+
return await apiClient.get(
|
|
15642
|
+
`/api/sdk/custom-field-values/issues/${encodeURIComponent(issueId)}/values`
|
|
15643
|
+
);
|
|
15644
|
+
} catch (error) {
|
|
15645
|
+
devLogger.error("customFieldService", "이슈 커스텀 필드 값 조회 실패:", error);
|
|
15646
|
+
return [];
|
|
15647
|
+
}
|
|
15648
|
+
}
|
|
15649
|
+
async function upsertIssueCustomFieldValue(issueId, fieldDefinitionId, value) {
|
|
15650
|
+
await apiClient.put(`/api/sdk/custom-field-values/issues/${encodeURIComponent(issueId)}/values`, {
|
|
15651
|
+
field_definition_id: fieldDefinitionId,
|
|
15652
|
+
value
|
|
15653
|
+
});
|
|
15654
|
+
}
|
|
15655
|
+
function IssueFormCustomFields({
|
|
15656
|
+
projectId,
|
|
15657
|
+
values,
|
|
15658
|
+
disabled,
|
|
15659
|
+
onChange,
|
|
15660
|
+
onDefaultsResolved
|
|
15661
|
+
}) {
|
|
15662
|
+
const { data: fields } = useSuspenseQuery({
|
|
15663
|
+
queryKey: ["customFieldDefinitions", projectId],
|
|
15664
|
+
queryFn: () => fetchCustomFieldDefinitions(projectId)
|
|
15665
|
+
});
|
|
15666
|
+
const defaultsAppliedRef = useRef(false);
|
|
15667
|
+
useEffect(() => {
|
|
15668
|
+
if (defaultsAppliedRef.current || fields.length === 0) return;
|
|
15669
|
+
defaultsAppliedRef.current = true;
|
|
15670
|
+
onDefaultsResolved(getCustomFieldDefaultValues(fields));
|
|
15671
|
+
}, [fields, onDefaultsResolved]);
|
|
15672
|
+
return /* @__PURE__ */ jsx(
|
|
15673
|
+
CustomFieldsSection,
|
|
15674
|
+
{
|
|
15675
|
+
fields,
|
|
15676
|
+
values,
|
|
15677
|
+
disabled,
|
|
15678
|
+
title: null,
|
|
15679
|
+
onChange
|
|
15680
|
+
}
|
|
15681
|
+
);
|
|
15682
|
+
}
|
|
15306
15683
|
const Textarea = React.forwardRef(
|
|
15307
15684
|
({ className, ...props }, ref) => {
|
|
15308
15685
|
return /* @__PURE__ */ jsx(
|
|
@@ -15417,6 +15794,26 @@ function IssueFormJiraFields({
|
|
|
15417
15794
|
}
|
|
15418
15795
|
);
|
|
15419
15796
|
}
|
|
15797
|
+
function JiraConnectNudge({ onConnect, isConnecting }) {
|
|
15798
|
+
return /* @__PURE__ */ jsx("div", { className: "rounded-[18px] border border-warning/20 bg-warning-subtle px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
15799
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
15800
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-text-primary", children: "Jira 계정 연결이 필요합니다" }),
|
|
15801
|
+
/* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-text-secondary", children: "연결하지 않으면 이 이슈가 Jira에 생성되지 않습니다." })
|
|
15802
|
+
] }),
|
|
15803
|
+
/* @__PURE__ */ jsx(
|
|
15804
|
+
Button,
|
|
15805
|
+
{
|
|
15806
|
+
type: "button",
|
|
15807
|
+
size: "sm",
|
|
15808
|
+
variant: "outline",
|
|
15809
|
+
onClick: onConnect,
|
|
15810
|
+
disabled: isConnecting,
|
|
15811
|
+
className: "shrink-0",
|
|
15812
|
+
children: isConnecting ? "연결 중…" : "내 계정 연결"
|
|
15813
|
+
}
|
|
15814
|
+
)
|
|
15815
|
+
] }) });
|
|
15816
|
+
}
|
|
15420
15817
|
function IssueFormNotionFields({
|
|
15421
15818
|
projectId,
|
|
15422
15819
|
selectedFields,
|
|
@@ -15557,12 +15954,20 @@ function IssueForm({
|
|
|
15557
15954
|
{}
|
|
15558
15955
|
);
|
|
15559
15956
|
const [notionFields, setNotionFields] = useState({});
|
|
15957
|
+
const [customFieldValues, setCustomFieldValues] = useState({});
|
|
15958
|
+
const { selectedProjectId } = useProject();
|
|
15959
|
+
const showCustomFields = isMember && Boolean(selectedProjectId);
|
|
15560
15960
|
const [isOpen, setIsOpen] = useState(true);
|
|
15561
15961
|
const jiraIntegrationId = ((_a2 = jiraService.getConfig()) == null ? void 0 : _a2.integrationId) ?? null;
|
|
15562
15962
|
const isResolvingIntegration = isMember && isIntegrationLoading;
|
|
15563
|
-
const
|
|
15963
|
+
const hasJiraIntegration = !isResolvingIntegration && isMember && jiraService.isConfigured() && Boolean(jiraIntegrationId);
|
|
15964
|
+
const jiraConnect = useJiraConnectNudge(
|
|
15965
|
+
(activeIntegration == null ? void 0 : activeIntegration.integration.project_id) ?? null,
|
|
15966
|
+
hasJiraIntegration
|
|
15967
|
+
);
|
|
15968
|
+
const showJiraFields = hasJiraIntegration && !jiraConnect.isResolving && !jiraConnect.needsConnect;
|
|
15564
15969
|
const showNotionFields = !isResolvingIntegration && isMember && (activeIntegration == null ? void 0 : activeIntegration.type) === "NOTION" && Boolean(activeIntegration.integration.id);
|
|
15565
|
-
const showIntegrationSkeleton = isResolvingIntegration;
|
|
15970
|
+
const showIntegrationSkeleton = isResolvingIntegration || hasJiraIntegration && jiraConnect.isResolving;
|
|
15566
15971
|
const integrationFieldSkeletonCount = Math.max(jiraService.getExposedFields().length, 2);
|
|
15567
15972
|
const submitSucceededRef = useRef(false);
|
|
15568
15973
|
const issueSubmission = useIssueSubmission({
|
|
@@ -15573,6 +15978,7 @@ function IssueForm({
|
|
|
15573
15978
|
},
|
|
15574
15979
|
jiraFields,
|
|
15575
15980
|
notionFields,
|
|
15981
|
+
customFieldValues,
|
|
15576
15982
|
activeIntegrationType: (activeIntegration == null ? void 0 : activeIntegration.type) ?? null,
|
|
15577
15983
|
notionIntegrationId: (activeIntegration == null ? void 0 : activeIntegration.type) === "NOTION" ? activeIntegration.integration.id : null,
|
|
15578
15984
|
videoFile: position2.videoFile,
|
|
@@ -15636,6 +16042,7 @@ function IssueForm({
|
|
|
15636
16042
|
children: [
|
|
15637
16043
|
/* @__PURE__ */ jsx("div", { className: "border-b border-line-subtle px-4 py-3", children: /* @__PURE__ */ jsx(IssueFormHeader, { title: "이슈 생성", onClose: handleClose }) }),
|
|
15638
16044
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-h-0 space-y-3 overflow-y-auto px-4 py-3", children: [
|
|
16045
|
+
hasJiraIntegration && jiraConnect.needsConnect ? /* @__PURE__ */ jsx(JiraConnectNudge, { onConnect: () => void jiraConnect.connect() }) : null,
|
|
15639
16046
|
/* @__PURE__ */ jsx(
|
|
15640
16047
|
SessionReplayAttachToggle,
|
|
15641
16048
|
{
|
|
@@ -15709,7 +16116,17 @@ function IssueForm({
|
|
|
15709
16116
|
}
|
|
15710
16117
|
)
|
|
15711
16118
|
}
|
|
15712
|
-
) : null
|
|
16119
|
+
) : null,
|
|
16120
|
+
showCustomFields ? /* @__PURE__ */ jsx(QueryBoundary, { loadingFallback: /* @__PURE__ */ jsx(IntegrationFieldsSkeleton, { fieldCount: 2 }), children: /* @__PURE__ */ jsx(
|
|
16121
|
+
IssueFormCustomFields,
|
|
16122
|
+
{
|
|
16123
|
+
projectId: selectedProjectId,
|
|
16124
|
+
values: customFieldValues,
|
|
16125
|
+
disabled: issueSubmission.isSubmitting,
|
|
16126
|
+
onChange: (fieldId, value) => setCustomFieldValues((current) => ({ ...current, [fieldId]: value })),
|
|
16127
|
+
onDefaultsResolved: (defaults) => setCustomFieldValues((current) => ({ ...defaults, ...current }))
|
|
16128
|
+
}
|
|
16129
|
+
) }) : null
|
|
15713
16130
|
] }),
|
|
15714
16131
|
/* @__PURE__ */ jsx("div", { className: "border-t border-line-subtle px-4 py-2.5", children: /* @__PURE__ */ jsx(IssueFormButtons, { isSubmitting: issueSubmission.isSubmitting, onCancel: handleClose }) })
|
|
15715
16132
|
]
|
|
@@ -32222,7 +32639,8 @@ const markdownComponents = {
|
|
|
32222
32639
|
function IssueDescription({
|
|
32223
32640
|
issueId,
|
|
32224
32641
|
description,
|
|
32225
|
-
onUpdated
|
|
32642
|
+
onUpdated,
|
|
32643
|
+
readOnly = false
|
|
32226
32644
|
}) {
|
|
32227
32645
|
const textareaRef = useRef(null);
|
|
32228
32646
|
const [draftDescription, setDraftDescription] = useState(description);
|
|
@@ -32272,7 +32690,7 @@ function IssueDescription({
|
|
|
32272
32690
|
children: "취소"
|
|
32273
32691
|
}
|
|
32274
32692
|
)
|
|
32275
|
-
] }) : /* @__PURE__ */ jsx(
|
|
32693
|
+
] }) : !readOnly ? /* @__PURE__ */ jsx(
|
|
32276
32694
|
Button,
|
|
32277
32695
|
{
|
|
32278
32696
|
type: "button",
|
|
@@ -32282,7 +32700,7 @@ function IssueDescription({
|
|
|
32282
32700
|
"aria-label": "설명 수정",
|
|
32283
32701
|
children: /* @__PURE__ */ jsx(Pencil, { className: "h-4 w-4" })
|
|
32284
32702
|
}
|
|
32285
|
-
)
|
|
32703
|
+
) : null
|
|
32286
32704
|
] }),
|
|
32287
32705
|
isEditing ? /* @__PURE__ */ jsx(
|
|
32288
32706
|
Textarea,
|
|
@@ -32831,7 +33249,8 @@ function IssueHeader({
|
|
|
32831
33249
|
title,
|
|
32832
33250
|
adminIssueUrl,
|
|
32833
33251
|
onClose,
|
|
32834
|
-
onUpdated
|
|
33252
|
+
onUpdated,
|
|
33253
|
+
readOnly = false
|
|
32835
33254
|
}) {
|
|
32836
33255
|
const [draftTitle, setDraftTitle] = useState(title);
|
|
32837
33256
|
const [isEditing, setIsEditing] = useState(false);
|
|
@@ -32887,7 +33306,7 @@ function IssueHeader({
|
|
|
32887
33306
|
}
|
|
32888
33307
|
) : /* @__PURE__ */ jsxs("div", { className: "flex max-w-full min-w-0 items-center gap-1", children: [
|
|
32889
33308
|
/* @__PURE__ */ jsx("h2", { className: "m-0 min-w-0 max-w-[28rem] truncate text-xl font-semibold text-text-primary", children: title }),
|
|
32890
|
-
/* @__PURE__ */ jsx(
|
|
33309
|
+
!readOnly ? /* @__PURE__ */ jsx(
|
|
32891
33310
|
Button,
|
|
32892
33311
|
{
|
|
32893
33312
|
type: "button",
|
|
@@ -32898,7 +33317,7 @@ function IssueHeader({
|
|
|
32898
33317
|
className: "h-8 w-8 shrink-0",
|
|
32899
33318
|
children: /* @__PURE__ */ jsx(Pencil, { className: "h-4 w-4" })
|
|
32900
33319
|
}
|
|
32901
|
-
)
|
|
33320
|
+
) : null
|
|
32902
33321
|
] }),
|
|
32903
33322
|
helperText ? /* @__PURE__ */ jsx("p", { className: "text-xs text-danger", children: helperText }) : null
|
|
32904
33323
|
] }),
|
|
@@ -33103,6 +33522,35 @@ function IssueVideo({ video, hideLabel }) {
|
|
|
33103
33522
|
)
|
|
33104
33523
|
] });
|
|
33105
33524
|
}
|
|
33525
|
+
function IssueCustomFields({
|
|
33526
|
+
issueId,
|
|
33527
|
+
projectId,
|
|
33528
|
+
readOnly = false
|
|
33529
|
+
}) {
|
|
33530
|
+
const { data: fields } = useQuery({
|
|
33531
|
+
queryKey: ["customFieldDefinitions", projectId],
|
|
33532
|
+
queryFn: () => fetchCustomFieldDefinitions(projectId)
|
|
33533
|
+
});
|
|
33534
|
+
const { data: rows } = useQuery({
|
|
33535
|
+
queryKey: ["issueCustomFieldValues", issueId],
|
|
33536
|
+
queryFn: () => fetchIssueCustomFieldValues(issueId)
|
|
33537
|
+
});
|
|
33538
|
+
const serverValues = useMemo(
|
|
33539
|
+
() => Object.fromEntries((rows ?? []).map((row) => [row.field_definition_id, row.value])),
|
|
33540
|
+
[rows]
|
|
33541
|
+
);
|
|
33542
|
+
const { values, setValue } = useCustomFieldValueDraft({
|
|
33543
|
+
serverValues,
|
|
33544
|
+
save: (fieldDefinitionId, value) => upsertIssueCustomFieldValue(issueId, fieldDefinitionId, value),
|
|
33545
|
+
onSaved: () => toast.success("필드 값이 저장되었습니다."),
|
|
33546
|
+
onError: (_fieldDefinitionId, error) => {
|
|
33547
|
+
devLogger.error("IssueCustomFields", "커스텀 필드 값 저장 실패:", error);
|
|
33548
|
+
toast.error("필드 값 저장에 실패했습니다.");
|
|
33549
|
+
}
|
|
33550
|
+
});
|
|
33551
|
+
if (!fields || fields.length === 0) return null;
|
|
33552
|
+
return /* @__PURE__ */ jsx(CustomFieldsSection, { fields, values, disabled: readOnly, onChange: setValue });
|
|
33553
|
+
}
|
|
33106
33554
|
function useJiraFieldUpdate() {
|
|
33107
33555
|
const [isUpdating, setIsUpdating] = useState(false);
|
|
33108
33556
|
const [error, setError] = useState(null);
|
|
@@ -33164,6 +33612,7 @@ function JiraIssueInfo({
|
|
|
33164
33612
|
}
|
|
33165
33613
|
);
|
|
33166
33614
|
}
|
|
33615
|
+
const ERROR_TOAST_DURATION_MS = 6e3;
|
|
33167
33616
|
function NotionIssueInfo({
|
|
33168
33617
|
issueId,
|
|
33169
33618
|
projectId,
|
|
@@ -33173,7 +33622,6 @@ function NotionIssueInfo({
|
|
|
33173
33622
|
onFieldUpdated
|
|
33174
33623
|
}) {
|
|
33175
33624
|
const [savingFieldId, setSavingFieldId] = useState(null);
|
|
33176
|
-
const [fieldError, setFieldError] = useState(null);
|
|
33177
33625
|
const [isSyncing, setIsSyncing] = useState(false);
|
|
33178
33626
|
const syncingRef = useRef(false);
|
|
33179
33627
|
const searchPeople = useCallback(
|
|
@@ -33183,13 +33631,13 @@ function NotionIssueInfo({
|
|
|
33183
33631
|
const handleFieldUpdate = useCallback(
|
|
33184
33632
|
async (fieldId, value, context) => {
|
|
33185
33633
|
setSavingFieldId(fieldId);
|
|
33186
|
-
setFieldError(null);
|
|
33187
33634
|
try {
|
|
33188
33635
|
await sdkNotionApi.updatePageField(projectId, context.pageId, fieldId, value);
|
|
33189
33636
|
applyIssueMutationEffects(issueId);
|
|
33190
33637
|
onFieldUpdated == null ? void 0 : onFieldUpdated();
|
|
33191
33638
|
} catch (err) {
|
|
33192
|
-
|
|
33639
|
+
const message = err instanceof Error ? err.message : "필드 저장에 실패했습니다.";
|
|
33640
|
+
toast.error(message, { duration: ERROR_TOAST_DURATION_MS });
|
|
33193
33641
|
} finally {
|
|
33194
33642
|
setSavingFieldId(null);
|
|
33195
33643
|
}
|
|
@@ -33206,7 +33654,7 @@ function NotionIssueInfo({
|
|
|
33206
33654
|
onFieldUpdated == null ? void 0 : onFieldUpdated();
|
|
33207
33655
|
} catch (err) {
|
|
33208
33656
|
const message = err instanceof Error ? err.message : "동기화에 실패했습니다.";
|
|
33209
|
-
|
|
33657
|
+
toast.error(message, { duration: ERROR_TOAST_DURATION_MS });
|
|
33210
33658
|
} finally {
|
|
33211
33659
|
syncingRef.current = false;
|
|
33212
33660
|
setIsSyncing(false);
|
|
@@ -33217,7 +33665,6 @@ function NotionIssueInfo({
|
|
|
33217
33665
|
{
|
|
33218
33666
|
mapping,
|
|
33219
33667
|
disabled: isUpdating,
|
|
33220
|
-
error: fieldError,
|
|
33221
33668
|
savingFieldId,
|
|
33222
33669
|
isSyncing,
|
|
33223
33670
|
canSync: canSync && Boolean(mapping.integration_id),
|
|
@@ -33741,7 +34188,12 @@ function NetworkLogsSection({
|
|
|
33741
34188
|
] })
|
|
33742
34189
|
] }) });
|
|
33743
34190
|
}
|
|
34191
|
+
function canWriteIssueContent(isMember, externalUserId) {
|
|
34192
|
+
if (isMember) return true;
|
|
34193
|
+
return Boolean(externalUserId);
|
|
34194
|
+
}
|
|
33744
34195
|
function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
34196
|
+
var _a2;
|
|
33745
34197
|
const [isOpen, setIsOpen] = useState(true);
|
|
33746
34198
|
const [activeLogSection, setActiveLogSection] = useState(null);
|
|
33747
34199
|
const isLogDetailActive = activeLogSection !== null;
|
|
@@ -33753,6 +34205,7 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
33753
34205
|
}, []);
|
|
33754
34206
|
const handleClose = () => setIsOpen(false);
|
|
33755
34207
|
const { isMember } = useAuthContext();
|
|
34208
|
+
const canWriteContent = canWriteIssueContent(isMember, (_a2 = SDKManager.getInstance().config.user) == null ? void 0 : _a2.id);
|
|
33756
34209
|
const { selectedProjectId } = useProject();
|
|
33757
34210
|
const { data: issue } = useSuspenseQuery({
|
|
33758
34211
|
queryKey: ["issue", issueId, selectedProjectId],
|
|
@@ -33794,7 +34247,8 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
33794
34247
|
title: issue.title,
|
|
33795
34248
|
adminIssueUrl,
|
|
33796
34249
|
onClose: handleClose,
|
|
33797
|
-
onUpdated: onUpdate
|
|
34250
|
+
onUpdated: onUpdate,
|
|
34251
|
+
readOnly: !canWriteContent
|
|
33798
34252
|
}
|
|
33799
34253
|
) }),
|
|
33800
34254
|
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
@@ -33803,7 +34257,8 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
33803
34257
|
{
|
|
33804
34258
|
issueId: issue.id,
|
|
33805
34259
|
description: issue.description ?? "",
|
|
33806
|
-
onUpdated: onUpdate
|
|
34260
|
+
onUpdated: onUpdate,
|
|
34261
|
+
readOnly: !canWriteContent
|
|
33807
34262
|
}
|
|
33808
34263
|
),
|
|
33809
34264
|
showJiraInfo && mapping ? /* @__PURE__ */ jsx(
|
|
@@ -33828,6 +34283,14 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
33828
34283
|
onFieldUpdated: onUpdate
|
|
33829
34284
|
}
|
|
33830
34285
|
) : null,
|
|
34286
|
+
isMember && (selectedProjectId ?? issue.project_id) ? /* @__PURE__ */ jsx(
|
|
34287
|
+
IssueCustomFields,
|
|
34288
|
+
{
|
|
34289
|
+
issueId: issue.id,
|
|
34290
|
+
projectId: selectedProjectId ?? issue.project_id,
|
|
34291
|
+
readOnly: !canWriteContent
|
|
34292
|
+
}
|
|
34293
|
+
) : null,
|
|
33831
34294
|
issue.screenshot ? /* @__PURE__ */ jsx(IssueScreenshot, { screenshot: issue.screenshot }) : null,
|
|
33832
34295
|
issue.video ? /* @__PURE__ */ jsx(IssueVideo, { video: issue.video }) : null,
|
|
33833
34296
|
/* @__PURE__ */ jsx(
|
|
@@ -33866,7 +34329,7 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
33866
34329
|
]
|
|
33867
34330
|
}
|
|
33868
34331
|
) }),
|
|
33869
|
-
/* @__PURE__ */ jsx(
|
|
34332
|
+
canWriteContent ? /* @__PURE__ */ jsx(
|
|
33870
34333
|
IssueDeleteActions,
|
|
33871
34334
|
{
|
|
33872
34335
|
issueId: issue.id,
|
|
@@ -33878,7 +34341,7 @@ function IssuePopover({ issueId, onClose, onUpdate }) {
|
|
|
33878
34341
|
handleClose();
|
|
33879
34342
|
}
|
|
33880
34343
|
}
|
|
33881
|
-
)
|
|
34344
|
+
) : null
|
|
33882
34345
|
] }) })
|
|
33883
34346
|
]
|
|
33884
34347
|
}
|
|
@@ -34622,8 +35085,18 @@ async function getActiveIntegration(projectId) {
|
|
|
34622
35085
|
return null;
|
|
34623
35086
|
}
|
|
34624
35087
|
}
|
|
34625
|
-
function applyStickerFilters(issues, _filters) {
|
|
34626
|
-
|
|
35088
|
+
function applyStickerFilters(issues, _filters, currentPageUrl) {
|
|
35089
|
+
const normalizedCurrentUrl = normalizeComparableUrl(currentPageUrl);
|
|
35090
|
+
if (!normalizedCurrentUrl) return [];
|
|
35091
|
+
return issues.filter((issue) => normalizeComparableUrl(issue.url) === normalizedCurrentUrl);
|
|
35092
|
+
}
|
|
35093
|
+
function normalizeComparableUrl(url) {
|
|
35094
|
+
if (!url) return null;
|
|
35095
|
+
try {
|
|
35096
|
+
return new URL(url).href;
|
|
35097
|
+
} catch {
|
|
35098
|
+
return null;
|
|
35099
|
+
}
|
|
34627
35100
|
}
|
|
34628
35101
|
function highlightIssue(issueId) {
|
|
34629
35102
|
const sticker = document.querySelector(`[data-issue-id="${issueId}"]`);
|
|
@@ -35110,8 +35583,8 @@ function useContentAppState() {
|
|
|
35110
35583
|
screenRecording.recordedFile
|
|
35111
35584
|
);
|
|
35112
35585
|
const filteredIssues = useMemo(() => {
|
|
35113
|
-
return applyStickerFilters(issues);
|
|
35114
|
-
}, [issues, stickerFilters]);
|
|
35586
|
+
return applyStickerFilters(issues, stickerFilters, currentUrl);
|
|
35587
|
+
}, [issues, stickerFilters, currentUrl]);
|
|
35115
35588
|
useCallback(async () => {
|
|
35116
35589
|
if (!isExtensionEnabled) {
|
|
35117
35590
|
return;
|
|
@@ -36124,7 +36597,7 @@ function buildSdkOnboardingSteps({
|
|
|
36124
36597
|
{
|
|
36125
36598
|
id: "stickers",
|
|
36126
36599
|
targetId: "sdk-menu-stickers",
|
|
36127
|
-
title: "
|
|
36600
|
+
title: "남긴 이슈는 화면 위 스티커로 보입니다",
|
|
36128
36601
|
body: "등록된 이슈가 제품 화면 위에 마커로 표시됩니다. 마커 보기로 표시를 켜고 끌 수 있습니다.",
|
|
36129
36602
|
position: "left",
|
|
36130
36603
|
action: onOpenFabMenu
|
|
@@ -36324,7 +36797,7 @@ function AuthGate() {
|
|
|
36324
36797
|
}
|
|
36325
36798
|
return /* @__PURE__ */ jsx(QueryBoundary, { loadingFallback: /* @__PURE__ */ jsx(Fragment, {}), children: /* @__PURE__ */ jsx(ContentAppWrapper, { fabEnabled, position: "bottom-right", onboarding }) });
|
|
36326
36799
|
}
|
|
36327
|
-
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-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;--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;--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))}.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;letter-spacing:.14em;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%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.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-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-\\[100vh\\]{height:100vh}.h-\\[18px\\]{height:18px}.h-\\[220px\\]{height:220px}.h-\\[22px\\]{height:22px}.h-\\[280px\\]{height:280px}.h-\\[30px\\]{height:30px}.h-\\[min\\(36vh\\,320px\\)\\]{height:min(36vh,320px)}.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-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-10{min-height:2.5rem}.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\\/2{width:50%}.w-10{width:2.5rem}.w-12{width:3rem}.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-9{width:2.25rem}.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\\(420px\\,calc\\(100vw-32px\\)\\)\\]{width:min(420px,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-\\[240px\\]{max-width:240px}.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-\\[440px\\]{max-width:440px}.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}.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 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}.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\\.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-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-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-\\[hsl\\(144_8\\%_91\\%\\)\\]{--tw-border-opacity: 1;border-color:hsl(144 8% 91% / var(--tw-border-opacity, 1))}.border-brand{border-color:var(--brand)}.border-brand-border{border-color:var(--brand-border)}.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-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{border-left-color:var(--brand)}.\\!bg-success-subtle{background-color:hsl(var(--success-subtle))!important}.bg-\\[hsl\\(202_52\\%_96\\%\\)\\]{--tw-bg-opacity: 1;background-color:hsl(202 52% 96% / var(--tw-bg-opacity, 1))}.bg-\\[hsl\\(34_82\\%_96\\%\\)\\]{--tw-bg-opacity: 1;background-color:hsl(34 82% 96% / var(--tw-bg-opacity, 1))}.bg-\\[hsl\\(3_68\\%_96\\%\\)\\]{--tw-bg-opacity: 1;background-color:hsl(3 68% 96% / var(--tw-bg-opacity, 1))}.bg-\\[var\\(--overlay-backdrop-strong\\)\\]{background-color:var(--overlay-backdrop-strong)}.bg-black\\/10{background-color:#0000001a}.bg-black\\/40{background-color:#0006}.bg-black\\/80{background-color:#000c}.bg-brand{background-color:var(--brand)}.bg-brand-subtle{background-color:var(--brand-subtle)}.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-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-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-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;letter-spacing:.03em}.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-\\[11px\\]{font-size:11px}.text-base{font-size:14px;line-height:21px;letter-spacing:-.006em}.text-lg{font-size:17px;line-height:25px;letter-spacing:-.012em}.text-sm{font-size:13px;line-height:19px;letter-spacing:-.004em}.text-xl{font-size:20px;line-height:29px;letter-spacing:-.018em}.text-xs{font-size:12px;line-height:16px;letter-spacing:.012em}.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}.tracking-\\[-0\\.01em\\]{letter-spacing:-.01em}.tracking-\\[-0\\.024em\\]{letter-spacing:-.024em}.tracking-\\[-0\\.028em\\]{letter-spacing:-.028em}.tracking-\\[-0\\.02em\\]{letter-spacing:-.02em}.tracking-\\[-0\\.036em\\]{letter-spacing:-.036em}.tracking-\\[0\\.14em\\]{letter-spacing:.14em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-\\[hsl\\(145_5\\%_42\\%\\)\\]{--tw-text-opacity: 1;color:hsl(145 5% 42% / var(--tw-text-opacity, 1))}.text-brand{color:var(--brand)}.text-brand-fg{color:var(--brand-fg)}.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-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:var(--brand)}.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-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-color: var(--brand)}.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-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}.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;letter-spacing:-.004em}.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))}.last\\:border-b-0:last-child{border-bottom-width:0px}.focus-within\\:z-\\[10001\\]:focus-within{z-index:10001}.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-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-success-subtle\\/80:hover{background-color:hsl(var(--success-subtle) / .8)}.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)}.hover\\:brightness-110:hover{--tw-brightness: brightness(1.1);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)}.focus\\:border-brand:focus{border-color:var(--brand)}.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-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)}.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.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{background-color:var(--brand)}.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-success-subtle{background-color:hsl(var(--success-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;letter-spacing:-.004em}.group.toast .group-\\[\\.toast\\]\\:text-xs{font-size:12px;line-height:16px;letter-spacing:.012em}.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)}.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]{background-color:var(--brand)}.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]{background-color:var(--brand)}.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]{color:var(--brand)}.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;letter-spacing:-.024em}.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)}}.\\[\\&\\>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-success [data-icon]{--tw-text-opacity: 1;color:hsl(var(--success) / 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))}';
|
|
36800
|
+
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-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;--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;--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))}.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;letter-spacing:.14em;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%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.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-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-\\[280px\\]{height:280px}.h-\\[30px\\]{height:30px}.h-\\[min\\(36vh\\,320px\\)\\]{height:min(36vh,320px)}.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-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-10{min-height:2.5rem}.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\\/2{width:50%}.w-10{width:2.5rem}.w-12{width:3rem}.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-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\\(420px\\,calc\\(100vw-32px\\)\\)\\]{width:min(420px,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-\\[240px\\]{max-width:240px}.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}.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\\.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-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-\\[hsl\\(144_8\\%_91\\%\\)\\]{--tw-border-opacity: 1;border-color:hsl(144 8% 91% / var(--tw-border-opacity, 1))}.border-brand{border-color:var(--brand)}.border-brand-border{border-color:var(--brand-border)}.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-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{border-left-color:var(--brand)}.\\!bg-success-subtle{background-color:hsl(var(--success-subtle))!important}.bg-\\[var\\(--overlay-backdrop-strong\\)\\]{background-color:var(--overlay-backdrop-strong)}.bg-black\\/10{background-color:#0000001a}.bg-black\\/40{background-color:#0006}.bg-black\\/80{background-color:#000c}.bg-brand{background-color:var(--brand)}.bg-brand-subtle{background-color:var(--brand-subtle)}.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-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-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-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;letter-spacing:.03em}.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-\\[11px\\]{font-size:11px}.text-base{font-size:14px;line-height:21px;letter-spacing:-.006em}.text-lg{font-size:17px;line-height:25px;letter-spacing:-.012em}.text-sm{font-size:13px;line-height:19px;letter-spacing:-.004em}.text-xl{font-size:20px;line-height:29px;letter-spacing:-.018em}.text-xs{font-size:12px;line-height:16px;letter-spacing:.012em}.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}.tracking-\\[-0\\.01em\\]{letter-spacing:-.01em}.tracking-\\[-0\\.024em\\]{letter-spacing:-.024em}.tracking-\\[-0\\.028em\\]{letter-spacing:-.028em}.tracking-\\[-0\\.02em\\]{letter-spacing:-.02em}.tracking-\\[-0\\.036em\\]{letter-spacing:-.036em}.tracking-\\[0\\.14em\\]{letter-spacing:.14em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-\\[hsl\\(145_5\\%_42\\%\\)\\]{--tw-text-opacity: 1;color:hsl(145 5% 42% / var(--tw-text-opacity, 1))}.text-brand{color:var(--brand)}.text-brand-fg{color:var(--brand-fg)}.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-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:var(--brand)}.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-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-color: var(--brand)}.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-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}.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;letter-spacing:-.004em}.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))}.last\\:border-b-0:last-child{border-bottom-width:0px}.focus-within\\:z-\\[10001\\]:focus-within{z-index:10001}.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-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{border-color:var(--brand)}.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-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)}.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\\]\\:relative{position:relative}.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{background-color:var(--brand)}.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-subtle{background-color:hsl(var(--success-subtle))!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;letter-spacing:-.004em}.group.toast .group-\\[\\.toast\\]\\:text-xs{font-size:12px;line-height:16px;letter-spacing:.012em}.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]{background-color:var(--brand)}.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]{background-color:var(--brand)}.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]{color:var(--brand)}.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;letter-spacing:-.024em}.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)}}.\\[\\&\\>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))}`;
|
|
36328
36801
|
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}";
|
|
36329
36802
|
const contentPageCSS = "body.issue-sticker-mode-active,body.issue-sticker-mode-active *{cursor:crosshair!important}body.issue-sticker-mode-active .issue-sticker-marker{cursor:default!important}body.issue-sticker-mode-active button,body.issue-sticker-mode-active a,body.issue-sticker-mode-active input,body.issue-sticker-mode-active textarea,body.issue-sticker-mode-active select{cursor:pointer!important}.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}";
|
|
36330
36803
|
const PAGE_STYLE_ID = "issue-sticker-page-style";
|
|
@@ -36348,21 +36821,7 @@ function mountWidget(config) {
|
|
|
36348
36821
|
return;
|
|
36349
36822
|
}
|
|
36350
36823
|
existingHost == null ? void 0 : existingHost.remove();
|
|
36351
|
-
const hostElement =
|
|
36352
|
-
hostElement.id = ISSUE_STICKER_HOST_ELEMENT_ID;
|
|
36353
|
-
markIssueStickerRuntimeHost(hostElement, ISSUE_STICKER_RUNTIME_OWNER.sdk);
|
|
36354
|
-
hostElement.style.all = "initial";
|
|
36355
|
-
hostElement.style.position = "fixed";
|
|
36356
|
-
hostElement.style.top = "0";
|
|
36357
|
-
hostElement.style.left = "0";
|
|
36358
|
-
hostElement.style.width = "0";
|
|
36359
|
-
hostElement.style.height = "0";
|
|
36360
|
-
hostElement.style.overflow = "visible";
|
|
36361
|
-
hostElement.style.background = "transparent";
|
|
36362
|
-
hostElement.style.pointerEvents = "none";
|
|
36363
|
-
hostElement.style.zIndex = String(OVERLAY_LAYER_INDEX.sdkHost);
|
|
36364
|
-
hostElement.style.display = "block";
|
|
36365
|
-
hostElement.style.isolation = "isolate";
|
|
36824
|
+
const hostElement = createRuntimeHostElement(ISSUE_STICKER_RUNTIME_OWNER.sdk);
|
|
36366
36825
|
if (!document.getElementById(PAGE_STYLE_ID)) {
|
|
36367
36826
|
const style = document.createElement("style");
|
|
36368
36827
|
style.id = PAGE_STYLE_ID;
|
|
@@ -36371,6 +36830,7 @@ function mountWidget(config) {
|
|
|
36371
36830
|
}
|
|
36372
36831
|
document.body.appendChild(hostElement);
|
|
36373
36832
|
const shadow = createShadowRoot(hostElement, [globalsCSS, sdkShadowCSS]);
|
|
36833
|
+
attachHostTypingGuard(shadow.shadowRoot);
|
|
36374
36834
|
mountContainer = shadow.mountContainer;
|
|
36375
36835
|
mountContainer.style.width = "0";
|
|
36376
36836
|
mountContainer.style.height = "0";
|