@solapi/ui-kit 1.0.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/README.md +153 -0
- package/dist/GlobalMfa-F9T2HvGA.cjs +1 -0
- package/dist/GlobalMfa-a9UddAbl.js +2176 -0
- package/dist/components/AuthFlow/AuthFlowGoogleOtpForm.d.ts +11 -0
- package/dist/components/AuthFlow/AuthFlowPasswordForm.d.ts +15 -0
- package/dist/components/AuthFlow/AuthFlowQueueItem.d.ts +6 -0
- package/dist/components/AuthFlow/AuthFlowSelfCert.d.ts +16 -0
- package/dist/components/AuthFlow/AuthFlowSimpleCert.d.ts +15 -0
- package/dist/components/AuthFlow/AuthFlowSmsForm.d.ts +33 -0
- package/dist/components/AuthFlow/AuthFlowTimer.d.ts +16 -0
- package/dist/components/AuthFlow/index.d.ts +6 -0
- package/dist/components/Confirm/Confirm.d.ts +3 -0
- package/dist/components/DatePicker/DatePicker.d.ts +21 -0
- package/dist/components/DatePicker/DateTimeField.d.ts +16 -0
- package/dist/components/DatePicker/MonthCalendar.d.ts +19 -0
- package/dist/components/DatePicker/TimeSelector.d.ts +13 -0
- package/dist/components/DatePicker/index.d.ts +4 -0
- package/dist/components/GlobalMfa/GlobalMfa.d.ts +3 -0
- package/dist/components/ListFilter/FilterChip.d.ts +21 -0
- package/dist/components/ListFilter/FilterPanelContent.d.ts +9 -0
- package/dist/components/ListFilter/ListFilter.d.ts +37 -0
- package/dist/components/ListFilter/NumberConditionSelect.d.ts +6 -0
- package/dist/components/ListFilter/SelectOptionButtons.d.ts +9 -0
- package/dist/components/ListFilter/index.d.ts +2 -0
- package/dist/components/Menu/Menu.d.ts +43 -0
- package/dist/components/Menu/index.d.ts +2 -0
- package/dist/components/Mfa/MfaEmail.d.ts +17 -0
- package/dist/components/Mfa/MfaMultiCert.d.ts +23 -0
- package/dist/components/Mfa/MfaPasswordNumPad.d.ts +11 -0
- package/dist/components/Mfa/MfaQueueItem.d.ts +7 -0
- package/dist/components/Mfa/MfaSelfCert.d.ts +20 -0
- package/dist/components/Mfa/MfaSms.d.ts +28 -0
- package/dist/components/Mfa/index.d.ts +4 -0
- package/dist/components/MiniTabs/MiniTabs.d.ts +28 -0
- package/dist/components/MiniTabs/index.d.ts +2 -0
- package/dist/components/Modal/Modal.d.ts +9 -0
- package/dist/components/Snackbar/Snackbar.d.ts +9 -0
- package/dist/components/Tabs/Tabs.d.ts +22 -0
- package/dist/components/Tabs/index.d.ts +1 -0
- package/dist/components/TextInput/TextInput.d.ts +30 -0
- package/dist/components/TextInput/index.d.ts +2 -0
- package/dist/components/common/Box.d.ts +27 -0
- package/dist/components/common/Button.d.ts +22 -0
- package/dist/components/common/Collapse.d.ts +19 -0
- package/dist/components/common/Divider.d.ts +15 -0
- package/dist/components/common/Grid.d.ts +51 -0
- package/dist/components/common/IconButton.d.ts +20 -0
- package/dist/components/common/Info.d.ts +10 -0
- package/dist/components/common/Paper.d.ts +19 -0
- package/dist/components/common/Popover.d.ts +20 -0
- package/dist/components/common/Stack.d.ts +17 -0
- package/dist/components/common/Typography.d.ts +20 -0
- package/dist/components/common/index.d.ts +15 -0
- package/dist/export/GlobalUIProvider.d.ts +20 -0
- package/dist/export/UIHost.d.ts +1 -0
- package/dist/export/UIProvider.d.ts +42 -0
- package/dist/export/index.d.ts +13 -0
- package/dist/federation/componentLoader.d.ts +8 -0
- package/dist/federation/hookLoader.d.ts +8 -0
- package/dist/federation/index.d.ts +4 -0
- package/dist/federation/providerLoader.d.ts +11 -0
- package/dist/federation/safeImport.d.ts +14 -0
- package/dist/federation.cjs +1 -0
- package/dist/federation.js +132 -0
- package/dist/hooks/useConfirm.d.ts +7 -0
- package/dist/hooks/useEnhancedMutation.d.ts +8 -0
- package/dist/hooks/useLingeringValue.d.ts +7 -0
- package/dist/hooks/useModal.d.ts +7 -0
- package/dist/hooks/useSnackbar.d.ts +12 -0
- package/dist/index-BpqgYc0Q.cjs +5 -0
- package/dist/index-DV20NPKR.js +18341 -0
- package/dist/index.cjs +1 -0
- package/dist/index.js +43 -0
- package/dist/lib/createMutationConfig.d.ts +62 -0
- package/dist/lib/phoneUtils.d.ts +1 -0
- package/dist/lib/typeDetector.d.ts +59 -0
- package/dist/stores/createConfirmStore.d.ts +24 -0
- package/dist/stores/createModalStore.d.ts +37 -0
- package/dist/stores/createSnackbarStore.d.ts +20 -0
- package/dist/stores/requestQueueStore.d.ts +41 -0
- package/dist/theme/ThemeProvider.d.ts +29 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/tokens.d.ts +17 -0
- package/dist/theme/types.d.ts +126 -0
- package/dist/theme/utils.d.ts +52 -0
- package/dist/ui-kit.css +1 -0
- package/dist/utils/scrollLock.d.ts +6 -0
- package/dist/utils/supportAdapter.d.ts +22 -0
- package/package.json +66 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BpqgYc0Q.cjs");require("react/jsx-runtime");require("react");require("react-dom");exports.Box=e.Box;exports.Button=e.Button;exports.Collapse=e.Collapse;exports.DatePicker=e.DatePicker;exports.Divider=e.Divider;exports.GlobalUIProvider=e.GlobalUIProvider;exports.Grid=e.Grid;exports.IconButton=e.IconButton;exports.ListFilter=e.ListFilter;exports.Menu=e.Menu;exports.MiniTabs=e.MiniTabs_default;exports.Paper=e.Paper;exports.Stack=e.Stack;exports.Tabs=e.Tabs;exports.TextInput=e.TextInput;exports.ThemeProvider=e.ThemeProvider;exports.Typography=e.Typography;exports.createTransition=e.createTransition;exports.darkColors=e.darkColors;exports.defaultTheme=e.defaultTheme;exports.getCSSVariable=e.getCSSVariable;exports.getThemeBorderRadius=e.getThemeBorderRadius;exports.getThemeColor=e.getThemeColor;exports.getThemeFontSize=e.getThemeFontSize;exports.getThemeShadow=e.getThemeShadow;exports.getThemeSpacing=e.getThemeSpacing;exports.lightColors=e.lightColors;exports.mediaQuery=e.mediaQuery;exports.setCSSVariable=e.setCSSVariable;exports.spacing=e.spacing;exports.useConfirm=e.useConfirm;exports.useEnhancedMutation=e.useEnhancedMutation;exports.useModal=e.useModal;exports.useSnackbar=e.useSnackbar;exports.useTheme=e.useTheme;exports.useThemeOptional=e.useThemeOptional;exports.withAlpha=e.withAlpha;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { B as o, a as i, C as n, F as h, D as l, y as m, G as u, a2 as T, L as p, E as d, A as g, a1 as S, S as c, r as C, b, N as B, T as P, Z as k, K as x, I as y, Q as I, X as M, U as f, W as v, Y as D, V as F, J as G, _ as V, R as w, a0 as z, u as A, z as E, t as L, x as O, O as Q, P as R, $ as U } from "./index-DV20NPKR.js";
|
|
2
|
+
import "react/jsx-runtime";
|
|
3
|
+
import "react";
|
|
4
|
+
import "react-dom";
|
|
5
|
+
export {
|
|
6
|
+
o as Box,
|
|
7
|
+
i as Button,
|
|
8
|
+
n as Collapse,
|
|
9
|
+
h as DatePicker,
|
|
10
|
+
l as Divider,
|
|
11
|
+
m as GlobalUIProvider,
|
|
12
|
+
u as Grid,
|
|
13
|
+
T as IconButton,
|
|
14
|
+
p as ListFilter,
|
|
15
|
+
d as Menu,
|
|
16
|
+
g as MiniTabs,
|
|
17
|
+
S as Paper,
|
|
18
|
+
c as Stack,
|
|
19
|
+
C as Tabs,
|
|
20
|
+
b as TextInput,
|
|
21
|
+
B as ThemeProvider,
|
|
22
|
+
P as Typography,
|
|
23
|
+
k as createTransition,
|
|
24
|
+
x as darkColors,
|
|
25
|
+
y as defaultTheme,
|
|
26
|
+
I as getCSSVariable,
|
|
27
|
+
M as getThemeBorderRadius,
|
|
28
|
+
f as getThemeColor,
|
|
29
|
+
v as getThemeFontSize,
|
|
30
|
+
D as getThemeShadow,
|
|
31
|
+
F as getThemeSpacing,
|
|
32
|
+
G as lightColors,
|
|
33
|
+
V as mediaQuery,
|
|
34
|
+
w as setCSSVariable,
|
|
35
|
+
z as spacing,
|
|
36
|
+
A as useConfirm,
|
|
37
|
+
E as useEnhancedMutation,
|
|
38
|
+
L as useModal,
|
|
39
|
+
O as useSnackbar,
|
|
40
|
+
Q as useTheme,
|
|
41
|
+
R as useThemeOptional,
|
|
42
|
+
U as withAlpha
|
|
43
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { MutationFunction, MutationFunctionContext } from '@tanstack/react-query';
|
|
2
|
+
import { AxiosError } from 'axios';
|
|
3
|
+
import { useRequestQueueStore, type QueuedRequest } from 'stores/requestQueueStore';
|
|
4
|
+
export { useRequestQueueStore, type QueuedRequest };
|
|
5
|
+
export interface Snackbar {
|
|
6
|
+
success: (message: string) => void;
|
|
7
|
+
error: (message: string) => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* MFA 설정 인터페이스
|
|
11
|
+
* Federation을 통해 host app에서 주입하여 사용
|
|
12
|
+
*/
|
|
13
|
+
export interface MfaSettings {
|
|
14
|
+
/** 기존 MFA 헤더 키 (기본값: 'x-mfa-data') */
|
|
15
|
+
legacyMfaHeaderKey?: string;
|
|
16
|
+
/** 신규 MFA 헤더 키 (기본값: 'x-auth-flow') */
|
|
17
|
+
newMfaHeaderKey?: string;
|
|
18
|
+
/** 인증 타입 라벨 매핑 */
|
|
19
|
+
authTypeLabels?: Record<string, string>;
|
|
20
|
+
/** 인증 타입 우선순위 */
|
|
21
|
+
authTypePriority?: string[];
|
|
22
|
+
/** MFA 리다이렉트 URL */
|
|
23
|
+
redirectUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 전역 MFA 설정을 업데이트합니다.
|
|
27
|
+
* host app에서 federation을 통해 import하여 사용합니다.
|
|
28
|
+
*/
|
|
29
|
+
export declare function configureMfa(settings: Partial<MfaSettings>): void;
|
|
30
|
+
/**
|
|
31
|
+
* 현재 MFA 설정을 반환합니다.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getMfaSettings(): MfaSettings;
|
|
34
|
+
export interface EnhancedMutationOptions<TData, TError, TVariables, TContext> {
|
|
35
|
+
mfaKey?: string;
|
|
36
|
+
enableAlert?: boolean;
|
|
37
|
+
successMessage?: string;
|
|
38
|
+
errorMessage?: string;
|
|
39
|
+
onSuccess?: (data: TData, variables: TVariables, context: TContext | undefined) => void | Promise<void>;
|
|
40
|
+
onError?: (error: TError, variables: TVariables, context: TContext | undefined) => void | Promise<void>;
|
|
41
|
+
snackbar?: Snackbar;
|
|
42
|
+
mutationFn?: MutationFunction<TData, TVariables>;
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}
|
|
45
|
+
export declare function handleNewMfa(error: AxiosError): false | Promise<unknown>;
|
|
46
|
+
export declare function handleLegacyMfa(error: AxiosError): false | Promise<unknown>;
|
|
47
|
+
/**
|
|
48
|
+
* MFA 에러를 감지하고 처리합니다.
|
|
49
|
+
* 신규 MFA(x-auth-flow)와 기존 MFA(response.data.mfa) 모두 지원합니다.
|
|
50
|
+
*/
|
|
51
|
+
export declare function handleMfa(error: AxiosError): false | Promise<unknown>;
|
|
52
|
+
/**
|
|
53
|
+
* React hook 없이 mutation config를 생성하는 순수 함수.
|
|
54
|
+
* Module Federation 환경에서 host app이 자체 useMutation과 함께 사용.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createMutationConfig<TData = unknown, TError = unknown, TVariables = void, TContext = unknown>(options?: EnhancedMutationOptions<TData, TError, TVariables, TContext>, snackbar?: Snackbar): {
|
|
57
|
+
mutationFn: (variables: TVariables, context: MutationFunctionContext) => Promise<TData>;
|
|
58
|
+
onSuccess: (data: TData, variables: TVariables, context: TContext | undefined) => Promise<void>;
|
|
59
|
+
onError: (error: TError, variables: TVariables, context: TContext | undefined) => Promise<void>;
|
|
60
|
+
mfaKey?: string;
|
|
61
|
+
};
|
|
62
|
+
export default createMutationConfig;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isPhoneNumber(number: any): string | false;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function isClassComponent(component: any): boolean;
|
|
2
|
+
export function isFunctionComponent(component: any): boolean;
|
|
3
|
+
export function isReactComponent(component: any): boolean;
|
|
4
|
+
export function isElement(element: any): element is React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
5
|
+
export function isDOMTypeElement(element: any): boolean;
|
|
6
|
+
export function isCompositeTypeElement(element: any): boolean;
|
|
7
|
+
export function isString(string: any): boolean;
|
|
8
|
+
export function isNumber(number: any): boolean;
|
|
9
|
+
export function isNumberString(number: any): boolean;
|
|
10
|
+
export function isArray(array: any): boolean;
|
|
11
|
+
export function isObject(object: any): boolean;
|
|
12
|
+
export function isBoolean(data: any): boolean;
|
|
13
|
+
export function isEmptyObject(object: any): boolean;
|
|
14
|
+
export function isFunction(func: any): boolean;
|
|
15
|
+
export function isPromise(p: any): boolean;
|
|
16
|
+
export function isAsyncFunction(func: any): boolean;
|
|
17
|
+
export function isEmptyString(data: any): boolean;
|
|
18
|
+
export { isPhoneNumber };
|
|
19
|
+
export function isPersonalPhoneNumber(number: any): boolean;
|
|
20
|
+
export function isRegExp(regexp: any): boolean;
|
|
21
|
+
export function isEmail(email: any): boolean;
|
|
22
|
+
export function isUrl(url: any, requireProtocol?: boolean): boolean;
|
|
23
|
+
export function isUrlScheme(url: any): boolean;
|
|
24
|
+
export function isBusinessNumber(number: any): string | false;
|
|
25
|
+
export function isCorporationNumber(number: any): string | false;
|
|
26
|
+
export function isIPAddress(ip: any): boolean;
|
|
27
|
+
export function isMobile(): boolean;
|
|
28
|
+
export function isMemberId(memberId: any): boolean;
|
|
29
|
+
declare namespace _default {
|
|
30
|
+
export { isClassComponent };
|
|
31
|
+
export { isFunctionComponent };
|
|
32
|
+
export { isReactComponent };
|
|
33
|
+
export { isElement };
|
|
34
|
+
export { isDOMTypeElement };
|
|
35
|
+
export { isCompositeTypeElement };
|
|
36
|
+
export { isString };
|
|
37
|
+
export { isArray };
|
|
38
|
+
export { isObject };
|
|
39
|
+
export { isEmptyObject };
|
|
40
|
+
export { isFunction };
|
|
41
|
+
export { isPromise };
|
|
42
|
+
export { isAsyncFunction };
|
|
43
|
+
export { isNumber };
|
|
44
|
+
export { isNumberString };
|
|
45
|
+
export { isEmptyString };
|
|
46
|
+
export { isRegExp };
|
|
47
|
+
export { isEmail };
|
|
48
|
+
export { isUrl };
|
|
49
|
+
export { isUrlScheme };
|
|
50
|
+
export { isBusinessNumber };
|
|
51
|
+
export { isPhoneNumber };
|
|
52
|
+
export { isPersonalPhoneNumber };
|
|
53
|
+
export { isMobile };
|
|
54
|
+
export { isIPAddress };
|
|
55
|
+
export { isMemberId };
|
|
56
|
+
}
|
|
57
|
+
export default _default;
|
|
58
|
+
import React from 'react';
|
|
59
|
+
import { isPhoneNumber } from './phoneUtils';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type Confirm = {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
message: string;
|
|
5
|
+
confirmText: string;
|
|
6
|
+
cancelText: string;
|
|
7
|
+
alertMode: boolean;
|
|
8
|
+
resolve: (value: boolean) => void;
|
|
9
|
+
reject: (reason?: any) => void;
|
|
10
|
+
};
|
|
11
|
+
export type ConfirmProps = {
|
|
12
|
+
title?: string;
|
|
13
|
+
message: string;
|
|
14
|
+
confirmText?: string;
|
|
15
|
+
cancelText?: string;
|
|
16
|
+
alertMode?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type ConfirmState = {
|
|
19
|
+
confirms: Confirm[];
|
|
20
|
+
confirm: (props: ConfirmProps) => Promise<boolean>;
|
|
21
|
+
close: (id: string, result: boolean) => void;
|
|
22
|
+
closeAll: () => void;
|
|
23
|
+
};
|
|
24
|
+
export declare function createConfirmStore(): import("zustand/vanilla").StoreApi<ConfirmState>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type ModalMaxWidth = 'xs' | 'sm' | 'md' | number;
|
|
2
|
+
export type Modal = {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
content: React.ReactNode | ((modal: Omit<Modal, 'content'>) => React.ReactNode);
|
|
6
|
+
maxWidth: ModalMaxWidth;
|
|
7
|
+
fullWidth: boolean;
|
|
8
|
+
fullHeight: boolean;
|
|
9
|
+
overrideButton: React.ReactNode | ((modal: Omit<Modal, 'overrideButton'>) => React.ReactNode);
|
|
10
|
+
customActions: React.ReactNode | ((modal: Omit<Modal, 'customActions'>) => React.ReactNode);
|
|
11
|
+
disableActions: boolean;
|
|
12
|
+
disableBackdropClick: boolean;
|
|
13
|
+
disableTransition: boolean;
|
|
14
|
+
onBeforeClose?: () => Promise<boolean> | boolean;
|
|
15
|
+
resolve: (value: boolean) => void;
|
|
16
|
+
reject: (reason?: any) => void;
|
|
17
|
+
};
|
|
18
|
+
export type ModalProps = {
|
|
19
|
+
title?: string;
|
|
20
|
+
content: React.ReactNode | ((dialog: Omit<Modal, 'content'>) => React.ReactNode);
|
|
21
|
+
maxWidth?: ModalMaxWidth;
|
|
22
|
+
fullWidth?: boolean;
|
|
23
|
+
fullHeight?: boolean;
|
|
24
|
+
overrideButton?: React.ReactNode | ((modal: Omit<Modal, 'overrideButton'>) => React.ReactNode);
|
|
25
|
+
customActions?: React.ReactNode | ((modal: Omit<Modal, 'customActions'>) => React.ReactNode);
|
|
26
|
+
disableActions?: boolean;
|
|
27
|
+
disableBackdropClick?: boolean;
|
|
28
|
+
disableTransition?: boolean;
|
|
29
|
+
onBeforeClose?: () => Promise<boolean> | boolean;
|
|
30
|
+
};
|
|
31
|
+
export type ModalState = {
|
|
32
|
+
modals: Modal[];
|
|
33
|
+
open: (props: ModalProps) => Promise<boolean>;
|
|
34
|
+
close: (id: string, result: boolean) => void;
|
|
35
|
+
closeAll: () => void;
|
|
36
|
+
};
|
|
37
|
+
export declare function createModalStore(): import("zustand/vanilla").StoreApi<ModalState>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type SnackbarSeverity = 'success' | 'error' | 'warning' | 'info';
|
|
2
|
+
export type SnackbarAction = {
|
|
3
|
+
label: string;
|
|
4
|
+
onClick: () => void;
|
|
5
|
+
};
|
|
6
|
+
export type SnackbarItem = {
|
|
7
|
+
id: string;
|
|
8
|
+
message: string;
|
|
9
|
+
severity: SnackbarSeverity;
|
|
10
|
+
autoHideMs?: number;
|
|
11
|
+
timer?: ReturnType<typeof window.setTimeout>;
|
|
12
|
+
actions?: SnackbarAction[];
|
|
13
|
+
};
|
|
14
|
+
export type SnackbarState = {
|
|
15
|
+
items: SnackbarItem[];
|
|
16
|
+
showSnackbar: (message: string, severity?: SnackbarSeverity, autoHideMs?: number, actions?: SnackbarAction[]) => void;
|
|
17
|
+
hideSnackbar: (id: string) => void;
|
|
18
|
+
clear: () => void;
|
|
19
|
+
};
|
|
20
|
+
export declare function createSnackbarStore(): import("zustand/vanilla").StoreApi<SnackbarState>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
export type QueuedRequest = {
|
|
3
|
+
id: string;
|
|
4
|
+
status: string;
|
|
5
|
+
config: AxiosRequestConfig;
|
|
6
|
+
reason: string;
|
|
7
|
+
createdAt: number;
|
|
8
|
+
isNewMfa?: boolean;
|
|
9
|
+
mfa?: {
|
|
10
|
+
[key: string]: any;
|
|
11
|
+
};
|
|
12
|
+
then?: (data: any) => void;
|
|
13
|
+
catch?: (error: any) => void;
|
|
14
|
+
};
|
|
15
|
+
type RequestQueueState = {
|
|
16
|
+
queue: QueuedRequest[];
|
|
17
|
+
isProcessing: boolean;
|
|
18
|
+
lastAddedRequest: QueuedRequest | null;
|
|
19
|
+
lastRemovedRequestId: string | null;
|
|
20
|
+
enqueue: (config: AxiosRequestConfig, options?: {
|
|
21
|
+
reason?: string;
|
|
22
|
+
mfa?: {
|
|
23
|
+
[key: string]: any;
|
|
24
|
+
};
|
|
25
|
+
isNewMfa?: boolean;
|
|
26
|
+
then?: (data: any) => void;
|
|
27
|
+
catch?: (error: any) => void;
|
|
28
|
+
}) => string;
|
|
29
|
+
dequeue: (id: string) => void;
|
|
30
|
+
clearQueue: () => void;
|
|
31
|
+
getQueueStatus: () => {
|
|
32
|
+
total: number;
|
|
33
|
+
};
|
|
34
|
+
updateQueue: (id: string, data: any) => void;
|
|
35
|
+
resolve: (id: string, data: any) => void;
|
|
36
|
+
reject: (id: string, error: any) => void;
|
|
37
|
+
getLastAddedRequest: () => QueuedRequest | null;
|
|
38
|
+
getLastRemovedRequestId: () => string | null;
|
|
39
|
+
};
|
|
40
|
+
export declare const useRequestQueueStore: import("zustand").UseBoundStore<import("zustand").StoreApi<RequestQueueState>>;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Provider
|
|
3
|
+
* CSS Variables를 사용한 테마 시스템 구현
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { Theme, ThemeMode, ThemeConfig, ThemeColors } from './types';
|
|
7
|
+
interface ThemeContextValue {
|
|
8
|
+
theme: Theme;
|
|
9
|
+
mode: ThemeMode;
|
|
10
|
+
setMode: (mode: ThemeMode) => void;
|
|
11
|
+
updateColors: (colors: Partial<ThemeColors>) => void;
|
|
12
|
+
}
|
|
13
|
+
interface ThemeProviderProps {
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
config?: ThemeConfig;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ThemeProvider Component
|
|
19
|
+
*/
|
|
20
|
+
export declare const ThemeProvider: React.FC<ThemeProviderProps>;
|
|
21
|
+
/**
|
|
22
|
+
* useTheme Hook
|
|
23
|
+
*/
|
|
24
|
+
export declare const useTheme: () => ThemeContextValue;
|
|
25
|
+
/**
|
|
26
|
+
* Optional useTheme Hook (doesn't throw error)
|
|
27
|
+
*/
|
|
28
|
+
export declare const useThemeOptional: () => ThemeContextValue | null;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme System Export
|
|
3
|
+
* Host 앱에서 사용할 수 있도록 모든 theme 관련 기능 export
|
|
4
|
+
*/
|
|
5
|
+
export type { Theme, ThemeMode, ThemeConfig, ThemeColors, ThemeSpacing, ThemeTypography, ThemeBorderRadius, ThemeShadows, ThemeTransition, ThemeBreakpoints } from './types';
|
|
6
|
+
export { defaultTheme, lightColors, darkColors } from './tokens';
|
|
7
|
+
export { ThemeProvider, useTheme, useThemeOptional } from './ThemeProvider';
|
|
8
|
+
export { getCSSVariable, setCSSVariable, getThemeColor, getThemeSpacing, getThemeFontSize, getThemeBorderRadius, getThemeShadow, createTransition, mediaQuery, withAlpha, spacing } from './utils';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design Tokens
|
|
3
|
+
* 디자인 시스템의 기본 토큰 정의
|
|
4
|
+
*/
|
|
5
|
+
import { Theme, ThemeColors } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Light Mode Colors
|
|
8
|
+
*/
|
|
9
|
+
export declare const lightColors: ThemeColors;
|
|
10
|
+
/**
|
|
11
|
+
* Dark Mode Colors
|
|
12
|
+
*/
|
|
13
|
+
export declare const darkColors: ThemeColors;
|
|
14
|
+
/**
|
|
15
|
+
* Default Theme
|
|
16
|
+
*/
|
|
17
|
+
export declare const defaultTheme: Theme;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme System Types
|
|
3
|
+
*/
|
|
4
|
+
export interface ThemeColors {
|
|
5
|
+
primary: string;
|
|
6
|
+
primaryHover: string;
|
|
7
|
+
primaryActive: string;
|
|
8
|
+
primaryAlpha: string;
|
|
9
|
+
secondary: string;
|
|
10
|
+
secondaryHover: string;
|
|
11
|
+
secondaryActive: string;
|
|
12
|
+
secondaryAlpha: string;
|
|
13
|
+
success: string;
|
|
14
|
+
successLight: string;
|
|
15
|
+
successDark: string;
|
|
16
|
+
successAlpha: string;
|
|
17
|
+
error: string;
|
|
18
|
+
errorLight: string;
|
|
19
|
+
errorDark: string;
|
|
20
|
+
errorAlpha: string;
|
|
21
|
+
warning: string;
|
|
22
|
+
warningLight: string;
|
|
23
|
+
warningDark: string;
|
|
24
|
+
warningAlpha: string;
|
|
25
|
+
info: string;
|
|
26
|
+
infoLight: string;
|
|
27
|
+
infoDark: string;
|
|
28
|
+
infoAlpha: string;
|
|
29
|
+
background: string;
|
|
30
|
+
surface: string;
|
|
31
|
+
border: string;
|
|
32
|
+
borderLight: string;
|
|
33
|
+
text: string;
|
|
34
|
+
textSecondary: string;
|
|
35
|
+
textDisabled: string;
|
|
36
|
+
textHint: string;
|
|
37
|
+
disabled: string;
|
|
38
|
+
disabledBackground: string;
|
|
39
|
+
overlay: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ThemeSpacing {
|
|
42
|
+
xs: string;
|
|
43
|
+
sm: string;
|
|
44
|
+
md: string;
|
|
45
|
+
lg: string;
|
|
46
|
+
xl: string;
|
|
47
|
+
xxl: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ThemeTypography {
|
|
50
|
+
fontFamily: string;
|
|
51
|
+
fontSize: {
|
|
52
|
+
xs: string;
|
|
53
|
+
sm: string;
|
|
54
|
+
md: string;
|
|
55
|
+
lg: string;
|
|
56
|
+
xl: string;
|
|
57
|
+
xxl: string;
|
|
58
|
+
};
|
|
59
|
+
fontWeight: {
|
|
60
|
+
light: number;
|
|
61
|
+
regular: number;
|
|
62
|
+
medium: number;
|
|
63
|
+
semibold: number;
|
|
64
|
+
bold: number;
|
|
65
|
+
};
|
|
66
|
+
lineHeight: {
|
|
67
|
+
tight: number;
|
|
68
|
+
normal: number;
|
|
69
|
+
relaxed: number;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export interface ThemeBorderRadius {
|
|
73
|
+
none: string;
|
|
74
|
+
sm: string;
|
|
75
|
+
md: string;
|
|
76
|
+
lg: string;
|
|
77
|
+
xl: string;
|
|
78
|
+
full: string;
|
|
79
|
+
}
|
|
80
|
+
export interface ThemeShadows {
|
|
81
|
+
none: string;
|
|
82
|
+
sm: string;
|
|
83
|
+
md: string;
|
|
84
|
+
lg: string;
|
|
85
|
+
xl: string;
|
|
86
|
+
}
|
|
87
|
+
export interface ThemeTransition {
|
|
88
|
+
duration: {
|
|
89
|
+
fast: string;
|
|
90
|
+
normal: string;
|
|
91
|
+
slow: string;
|
|
92
|
+
};
|
|
93
|
+
timing: {
|
|
94
|
+
easeIn: string;
|
|
95
|
+
easeOut: string;
|
|
96
|
+
easeInOut: string;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export interface ThemeBreakpoints {
|
|
100
|
+
xs: string;
|
|
101
|
+
sm: string;
|
|
102
|
+
md: string;
|
|
103
|
+
lg: string;
|
|
104
|
+
xl: string;
|
|
105
|
+
}
|
|
106
|
+
export interface Theme {
|
|
107
|
+
colors: ThemeColors;
|
|
108
|
+
spacing: ThemeSpacing;
|
|
109
|
+
typography: ThemeTypography;
|
|
110
|
+
borderRadius: ThemeBorderRadius;
|
|
111
|
+
shadows: ThemeShadows;
|
|
112
|
+
transition: ThemeTransition;
|
|
113
|
+
breakpoints: ThemeBreakpoints;
|
|
114
|
+
spacingUnit: number;
|
|
115
|
+
gridColumns: number;
|
|
116
|
+
transitionDurationMs: {
|
|
117
|
+
fast: number;
|
|
118
|
+
normal: number;
|
|
119
|
+
slow: number;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export type ThemeMode = 'light' | 'dark';
|
|
123
|
+
export interface ThemeConfig {
|
|
124
|
+
mode: ThemeMode;
|
|
125
|
+
customColors?: Partial<ThemeColors>;
|
|
126
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Utilities
|
|
3
|
+
* CSS Variables를 쉽게 사용하기 위한 유틸리티 함수들
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* CSS Variable 값 가져오기
|
|
7
|
+
*/
|
|
8
|
+
export declare const getCSSVariable: (variableName: string) => string;
|
|
9
|
+
/**
|
|
10
|
+
* CSS Variable 값 설정하기
|
|
11
|
+
*/
|
|
12
|
+
export declare const setCSSVariable: (variableName: string, value: string) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Theme Color 가져오기
|
|
15
|
+
*/
|
|
16
|
+
export declare const getThemeColor: (colorName: string) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Theme Spacing 가져오기
|
|
19
|
+
*/
|
|
20
|
+
export declare const getThemeSpacing: (size: string) => string;
|
|
21
|
+
/**
|
|
22
|
+
* Theme Font Size 가져오기
|
|
23
|
+
*/
|
|
24
|
+
export declare const getThemeFontSize: (size: string) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Theme Border Radius 가져오기
|
|
27
|
+
*/
|
|
28
|
+
export declare const getThemeBorderRadius: (size: string) => string;
|
|
29
|
+
/**
|
|
30
|
+
* Theme Shadow 가져오기
|
|
31
|
+
*/
|
|
32
|
+
export declare const getThemeShadow: (size: string) => string;
|
|
33
|
+
/**
|
|
34
|
+
* Transition 생성 헬퍼
|
|
35
|
+
*/
|
|
36
|
+
export declare const createTransition: (property: string | string[], duration?: "fast" | "normal" | "slow", timing?: "easeIn" | "easeOut" | "easeInOut") => string;
|
|
37
|
+
/**
|
|
38
|
+
* Media Query 헬퍼
|
|
39
|
+
*/
|
|
40
|
+
export declare const mediaQuery: {
|
|
41
|
+
up: (breakpoint: "xs" | "sm" | "md" | "lg" | "xl") => string;
|
|
42
|
+
down: (breakpoint: "xs" | "sm" | "md" | "lg" | "xl") => string;
|
|
43
|
+
between: (start: "xs" | "sm" | "md" | "lg" | "xl", end: "xs" | "sm" | "md" | "lg" | "xl") => string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Alpha 채널 추가 (rgba 변환)
|
|
47
|
+
*/
|
|
48
|
+
export declare const withAlpha: (color: string, alpha: number) => string;
|
|
49
|
+
/**
|
|
50
|
+
* Spacing 계산 헬퍼 (배수 적용)
|
|
51
|
+
*/
|
|
52
|
+
export declare const spacing: (multiplier: number, base?: string) => string;
|
package/dist/ui-kit.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._root_1p4to_2{position:fixed;bottom:var(--spacing-md);left:var(--spacing-md);z-index:1500;pointer-events:none}._snackbarContainer_1p4to_10{display:flex;flex-direction:column;gap:var(--spacing-sm)}._snackbar_1p4to_10{pointer-events:auto;width:420px}._snackbar_1p4to_10>div{display:flex;flex-direction:column;padding:12px var(--spacing-md);font-size:0;line-height:1;border-left:4px solid;border-radius:var(--border-radius-md);box-shadow:var(--shadow-md)}._snackbar_1p4to_10>div._info_1p4to_29{background-color:#333;color:#fff;border-color:transparent}._snackbar_1p4to_10>div._success_1p4to_34{background-color:#333;color:#2ed843;border-color:#2ed843}._snackbar_1p4to_10>div._warning_1p4to_39{background-color:#333;color:var(--color-warning);border-color:var(--color-warning)}._snackbar_1p4to_10>div._error_1p4to_44{background-color:#333;color:var(--color-error);border-color:var(--color-error)}._topRow_1p4to_49{display:flex;align-items:center;gap:var(--spacing-md)}._icon_1p4to_54{flex-shrink:0;align-self:flex-start}._closeButton_1p4to_58{color:#fff;padding:var(--spacing-xs);flex-shrink:0;align-self:flex-start}._closeButton_1p4to_58:hover{background-color:#ffffff26}._snackbar_1p4to_10 p{font-size:var(--font-size-sm);margin:0;font-family:var(--font-family);color:#fff;text-align:left;flex:1;line-height:1.5}._actions_1p4to_76{display:flex;gap:var(--spacing-xs);justify-content:flex-end;margin-top:var(--spacing-sm)}._actionButton_1p4to_82{font-family:var(--font-family);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:#fff;background:#ffffff1f;border:none;padding:4px 10px;border-radius:var(--border-radius-sm);cursor:pointer;white-space:nowrap}._actionButton_1p4to_82:hover{background-color:#ffffff38}._enter_1p4to_99{opacity:0;transform:translate(-10px)}._enterActive_1p4to_103{opacity:1;transform:translate(0);transition:opacity var(--transition-duration-normal) var(--transition-timing-ease-out),transform var(--transition-duration-normal) var(--transition-timing-ease-out)}._exit_1p4to_110{opacity:1;transform:translate(0)}._exitActive_1p4to_114{opacity:0;transform:translate(-10px);transition:opacity var(--transition-duration-fast) var(--transition-timing-ease-in),transform var(--transition-duration-fast) var(--transition-timing-ease-in)}@media(max-width:640px){._root_1p4to_2{left:var(--spacing-md);right:var(--spacing-md);bottom:unset;top:var(--spacing-md);top:calc(var(--spacing-md) + env(safe-area-inset-top,0px))}._snackbar_1p4to_10{width:100%}._snackbar_1p4to_10>div{width:100%}._closeButton_1p4to_58{min-width:44px;min-height:44px;padding:var(--spacing-sm)}._enter_1p4to_99{opacity:0;transform:translateY(-10px)}._enterActive_1p4to_103{opacity:1;transform:translateY(0);transition:opacity var(--transition-duration-normal) var(--transition-timing-ease-out),transform var(--transition-duration-normal) var(--transition-timing-ease-out)}._exit_1p4to_110{opacity:1;transform:translateY(0)}._exitActive_1p4to_114{opacity:0;transform:translateY(-10px);transition:opacity var(--transition-duration-fast) var(--transition-timing-ease-in),transform var(--transition-duration-fast) var(--transition-timing-ease-in)}}._container_bvge5_5._fullWidth_bvge5_5{width:100%}._item_bvge5_9{min-width:0}._typography_1dcgk_1{margin:0;font-family:var(--font-family);color:var(--color-text)}._h1_1dcgk_9{font-size:2.5rem;font-weight:var(--font-weight-bold);line-height:var(--line-height-tight)}._h2_1dcgk_15{font-size:2rem;font-weight:var(--font-weight-bold);line-height:var(--line-height-tight)}._h3_1dcgk_21{font-size:1.75rem;font-weight:var(--font-weight-semibold);line-height:var(--line-height-tight)}._h4_1dcgk_27{font-size:1.5rem;font-weight:var(--font-weight-semibold);line-height:var(--line-height-tight)}._h5_1dcgk_33{font-size:1.25rem;font-weight:var(--font-weight-medium);line-height:var(--line-height-normal)}._h6_1dcgk_39{font-size:1.125rem;font-weight:var(--font-weight-medium);line-height:var(--line-height-normal)}._body1_1dcgk_45{font-size:var(--font-size-md);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal)}._body2_1dcgk_51{font-size:var(--font-size-sm);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal)}._caption_1dcgk_57{font-size:var(--font-size-xs);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal)}._subtitle1_1dcgk_63{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);line-height:var(--line-height-normal)}._subtitle2_1dcgk_69{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);line-height:var(--line-height-normal)}._primary_1dcgk_76{color:var(--color-primary)}._secondary_1dcgk_80{color:var(--color-secondary)}._error_1dcgk_84{color:var(--color-error)}._warning_1dcgk_88{color:var(--color-warning)}._info_1dcgk_92{color:var(--color-info)}._success_1dcgk_96{color:var(--color-success)}._text-primary_1dcgk_100{color:var(--color-text)}._text-secondary_1dcgk_104,._textSecondary_1dcgk_105{color:var(--color-text-secondary)}._gutterBottom_1dcgk_110{margin-bottom:.5em}._noWrap_1dcgk_114{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._button_tcn3h_1{display:inline-flex;align-items:center;justify-content:center;position:relative;box-sizing:border-box;outline:none;border:0;margin:0;cursor:pointer;user-select:none;vertical-align:middle;text-decoration:none;font-family:var(--font-family);font-weight:var(--font-weight-medium);line-height:1.75;text-transform:none;min-width:64px;border-radius:var(--border-radius-sm);transition:background-color var(--transition-duration-fast) var(--transition-timing-ease-out),border-color var(--transition-duration-fast) var(--transition-timing-ease-out),color var(--transition-duration-fast) var(--transition-timing-ease-out),box-shadow var(--transition-duration-fast) var(--transition-timing-ease-out)}._button_tcn3h_1:focus-visible{outline:1px solid var(--color-primary);background-color:transparent;outline-offset:2px}._minimum_tcn3h_38{min-width:unset;padding:1px 6px;font-size:var(--font-size-xs)}._small_tcn3h_44{padding:var(--spacing-xs) var(--spacing-sm);font-size:var(--font-size-sm)}._medium_tcn3h_49{padding:calc(var(--spacing-xs) + 1px) calc(var(--spacing-sm) + 2px);font-size:var(--font-size-sm)}._large_tcn3h_54{padding:var(--spacing-sm) var(--spacing-md);font-size:var(--font-size-md)}._text_tcn3h_60{background-color:transparent;border:none;color:var(--color-text)}._text_tcn3h_60:hover{background-color:#0000000a}._text_tcn3h_60:active{background-color:#00000014}._text_tcn3h_60._primary_tcn3h_74{color:var(--color-primary)}._text_tcn3h_60._primary_tcn3h_74:hover{background-color:var(--color-primary-alpha)}._text_tcn3h_60._secondary_tcn3h_82{color:var(--color-secondary)}._text_tcn3h_60._secondary_tcn3h_82:hover{background-color:var(--color-secondary-alpha)}._text_tcn3h_60._error_tcn3h_90{color:var(--color-error)}._text_tcn3h_60._error_tcn3h_90:hover{background-color:var(--color-error-alpha)}._text_tcn3h_60._warning_tcn3h_98{color:var(--color-warning)}._text_tcn3h_60._warning_tcn3h_98:hover{background-color:var(--color-warning-alpha)}._text_tcn3h_60._info_tcn3h_106{color:var(--color-info)}._text_tcn3h_60._info_tcn3h_106:hover{background-color:var(--color-info-alpha)}._text_tcn3h_60._success_tcn3h_114{color:var(--color-success)}._text_tcn3h_60._success_tcn3h_114:hover{background-color:var(--color-success-alpha)}._contained_tcn3h_123{background-color:var(--color-border-light);color:var(--color-text)}._contained_tcn3h_123:hover{background-color:var(--color-border)}._contained_tcn3h_123:active{background-color:var(--color-text-secondary)}._contained_tcn3h_123._primary_tcn3h_74{background-color:var(--color-primary);color:var(--color-background)}._contained_tcn3h_123._primary_tcn3h_74:hover{background-color:var(--color-primary-hover)}._contained_tcn3h_123._primary_tcn3h_74:active{background-color:var(--color-primary-active)}._contained_tcn3h_123._secondary_tcn3h_82{background-color:var(--color-secondary);color:var(--color-background)}._contained_tcn3h_123._secondary_tcn3h_82:hover{background-color:var(--color-secondary-hover)}._contained_tcn3h_123._secondary_tcn3h_82:active{background-color:var(--color-secondary-active)}._contained_tcn3h_123._error_tcn3h_90{background-color:var(--color-error);color:var(--color-background)}._contained_tcn3h_123._error_tcn3h_90:hover{background-color:var(--color-error-dark)}._contained_tcn3h_123._warning_tcn3h_98{background-color:var(--color-warning);color:var(--color-background)}._contained_tcn3h_123._warning_tcn3h_98:hover{background-color:var(--color-warning-dark)}._contained_tcn3h_123._info_tcn3h_106{background-color:var(--color-info);color:var(--color-background)}._contained_tcn3h_123._info_tcn3h_106:hover{background-color:var(--color-info-dark)}._contained_tcn3h_123._success_tcn3h_114{background-color:var(--color-success);color:var(--color-background)}._contained_tcn3h_123._success_tcn3h_114:hover{background-color:var(--color-success-dark)}._outlined_tcn3h_199{background-color:transparent;border:1px solid var(--color-border);color:var(--color-text)}._outlined_tcn3h_199:hover{background-color:#0000000a;border-color:#c4c4c4}._outlined_tcn3h_199._primary_tcn3h_74{color:var(--color-primary);border-color:var(--color-primary)}._outlined_tcn3h_199._primary_tcn3h_74:hover{background-color:var(--color-primary-alpha);border-color:var(--color-primary-hover)}._outlined_tcn3h_199._secondary_tcn3h_82{color:var(--color-secondary);border-color:var(--color-secondary)}._outlined_tcn3h_199._secondary_tcn3h_82:hover{background-color:var(--color-secondary-alpha);border-color:var(--color-secondary-hover)}._outlined_tcn3h_199._error_tcn3h_90{color:var(--color-error);border-color:var(--color-error)}._outlined_tcn3h_199._error_tcn3h_90:hover{background-color:var(--color-error-alpha);border-color:var(--color-error-dark)}._outlined_tcn3h_199._warning_tcn3h_98{color:var(--color-warning);border-color:var(--color-warning)}._outlined_tcn3h_199._warning_tcn3h_98:hover{background-color:var(--color-warning-alpha);border-color:var(--color-warning-dark)}._outlined_tcn3h_199._info_tcn3h_106{color:var(--color-info);border-color:var(--color-info)}._outlined_tcn3h_199._info_tcn3h_106:hover{background-color:var(--color-info-alpha);border-color:var(--color-info-dark)}._outlined_tcn3h_199._success_tcn3h_114{color:var(--color-success);border-color:var(--color-success)}._outlined_tcn3h_199._success_tcn3h_114:hover{background-color:var(--color-success-alpha);border-color:var(--color-success-dark)}._fullWidth_tcn3h_271{width:100%}._disabled_tcn3h_275{cursor:not-allowed;opacity:.6;pointer-events:none;color:var(--color-text-disabled);background-color:var(--color-disabled-background);box-shadow:none}._disabled_tcn3h_275._outlined_tcn3h_199{border-color:var(--color-border)}._iconButton_78he9_1{display:inline-flex;align-items:center;justify-content:center;position:relative;box-sizing:border-box;outline:none;border:0;margin:0;cursor:pointer;user-select:none;vertical-align:middle;text-decoration:none;background-color:transparent;border-radius:var(--border-radius-full);transition:background-color var(--transition-duration-fast) var(--transition-timing-ease-out),color var(--transition-duration-fast) var(--transition-timing-ease-out)}._small_78he9_24{padding:var(--spacing-xs);font-size:var(--font-size-sm)}._small_78he9_24 svg{width:18px;height:18px}._medium_78he9_34{padding:var(--spacing-sm);font-size:var(--font-size-md)}._medium_78he9_34 svg{width:20px;height:20px}._large_78he9_44{padding:var(--spacing-md);font-size:var(--font-size-lg)}._large_78he9_44 svg{width:24px;height:24px}._default_78he9_55{color:var(--color-text-secondary)}._default_78he9_55:hover{background-color:#0000000a;color:var(--color-text)}._default_78he9_55:active{background-color:#00000014}._primary_78he9_69{color:var(--color-primary)}._primary_78he9_69:hover,._primary_78he9_69:active{background-color:var(--color-primary-alpha)}._secondary_78he9_82{color:var(--color-secondary)}._secondary_78he9_82:hover,._secondary_78he9_82:active{background-color:var(--color-secondary-alpha)}._error_78he9_95{color:var(--color-error)}._error_78he9_95:hover,._error_78he9_95:active{background-color:var(--color-error-alpha)}._warning_78he9_108{color:var(--color-warning)}._warning_78he9_108:hover,._warning_78he9_108:active{background-color:var(--color-warning-alpha)}._info_78he9_121{color:var(--color-info)}._info_78he9_121:hover,._info_78he9_121:active{background-color:var(--color-info-alpha)}._success_78he9_134{color:var(--color-success)}._success_78he9_134:hover,._success_78he9_134:active{background-color:var(--color-success-alpha)}._disabled_78he9_147{cursor:not-allowed;opacity:.6;pointer-events:none;color:var(--color-text-disabled)}._divider_kfqte_1{margin:0;flex-shrink:0;border-width:0;border-style:solid;border-color:var(--color-border)}._horizontal_kfqte_10{border-bottom-width:thin;width:100%;height:0}._vertical_kfqte_16{border-right-width:thin;width:0;height:auto;align-self:stretch}._fullWidth_kfqte_23{width:100%}._inset_kfqte_27{margin-left:var(--spacing-xxl)}._middle_kfqte_31{margin-left:var(--spacing-md);margin-right:var(--spacing-md)}._flexItem_kfqte_36{align-self:stretch;height:auto}._wrapper_t75l7_3{display:block}._paper_qx9wm_1{background-color:var(--color-background);color:var(--color-text);transition:box-shadow var(--transition-duration-fast) var(--transition-timing-ease-out);border-radius:var(--border-radius-sm)}._elevationNone_qx9wm_11{box-shadow:var(--shadow-none)}._elevationSm_qx9wm_15{box-shadow:var(--shadow-sm)}._elevationMd_qx9wm_19{box-shadow:var(--shadow-md)}._elevationLg_qx9wm_23{box-shadow:var(--shadow-lg)}._elevationXl_qx9wm_27{box-shadow:var(--shadow-xl)}._outlined_qx9wm_32{border:1px solid var(--color-border);box-shadow:var(--shadow-none)}._square_qx9wm_38{border-radius:var(--border-radius-none)}._popover_km28f_1{position:fixed;inset:0;pointer-events:none;z-index:0;opacity:0;transition:opacity var(--transition-duration-normal, .2s) var(--transition-timing-ease-out)}._popover_km28f_1._entered_km28f_14{opacity:1}._popover_km28f_1._closing_km28f_17{opacity:0;transition:opacity var(--transition-duration-fast, .15s) var(--transition-timing-ease-in);pointer-events:none}._popover_km28f_1._entered_km28f_14 ._backdrop_km28f_23,._popover_km28f_1._entered_km28f_14 ._paper_km28f_24{pointer-events:auto}._backdrop_km28f_23{position:fixed;inset:0;background:transparent;pointer-events:auto}._paper_km28f_24{position:fixed;background:var(--color-background);border:1px solid var(--color-border);border-radius:var(--border-radius-md);box-shadow:var(--shadow-lg);box-sizing:border-box;pointer-events:auto;max-height:min(80vh,100dvh);overflow:hidden;opacity:0;transform:scale(.98);transition:opacity var(--transition-duration-normal, .2s) var(--transition-timing-ease-out),transform var(--transition-duration-normal, .2s) var(--transition-timing-ease-out)}._paper_km28f_24._ready_km28f_56{opacity:1;transform:scale(1)}._popover_km28f_1._closing_km28f_17 ._paper_km28f_24{opacity:0;transform:scale(.98);transition:opacity var(--transition-duration-fast, .15s) var(--transition-timing-ease-in),transform var(--transition-duration-fast, .15s) var(--transition-timing-ease-in)}._paper_km28f_24 ._scroll_km28f_70{max-height:min(80vh,100dvh);overflow-y:auto}._overlay_xqi43_2{position:fixed;inset:0;background:var(--color-overlay);display:grid;place-items:center}._modal_xqi43_14{background:var(--color-background);border-radius:var(--border-radius-sm);display:flex;flex-direction:column;box-shadow:var(--shadow-xl);max-width:calc(100vw - calc(var(--spacing-xl) * 2));max-height:calc(100vh - calc(var(--spacing-xl) * 2));margin:var(--spacing-xl);overflow:hidden}._modal_xqi43_14._xs_xqi43_27{width:var(--breakpoint-sm)}._modal_xqi43_14._sm_xqi43_30{width:var(--breakpoint-md)}._modal_xqi43_14._md_xqi43_33{width:var(--breakpoint-lg)}._modal_xqi43_14._fullWidth_xqi43_36{width:100%}._modal_xqi43_14._fullHeight_xqi43_39{height:calc(100vh - calc(var(--spacing-xl) * 2))}@media(max-width:640px){._modal_xqi43_14{max-width:calc(100vw - calc(var(--spacing-sm) * 2));max-height:calc(100vh - calc(var(--spacing-sm) * 2));margin:var(--spacing-sm)}._modal_xqi43_14._fullHeight_xqi43_39{height:calc(100vh - calc(var(--spacing-sm) * 2))}}._modal_xqi43_14 ._header_xqi43_56{transition:box-shadow var(--transition-duration-normal);box-shadow:0 0 15px #00000012;flex:0 0 auto;z-index:5;padding:var(--spacing-sm);padding-left:var(--spacing-md);padding-right:var(--spacing-md);padding-top:var(--spacing-md)}._modal_xqi43_14 ._header_xqi43_56 h6{font-size:var(--font-size-xl);font-weight:var(--font-weight-medium);line-height:var(--line-height-tight);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--color-text);font-family:var(--font-family)}._modal_xqi43_14 ._header_xqi43_56 ._closeBtn_xqi43_77{padding:6px;font-size:0;min-width:auto;border-radius:var(--border-radius-full)}._modal_xqi43_14 ._header_xqi43_56 ._closeBtn_xqi43_77 svg{fill:var(--color-text-secondary)}._modal_xqi43_14 ._header_xqi43_56._top_xqi43_86{box-shadow:none}._modal_xqi43_14 ._header_xqi43_56._mid_xqi43_89{box-shadow:0 2px 8px #00000014}._modal_xqi43_14 ._content_xqi43_94{overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1 1 auto;min-height:0;word-break:break-all;color:var(--color-text);font-family:var(--font-family);padding:var(--spacing-sm) var(--spacing-md)}._modal_xqi43_14 ._content_xqi43_94._noHeader_xqi43_104{padding-top:var(--spacing-md)}._modal_xqi43_14 ._content_xqi43_94._noFooter_xqi43_107{padding-bottom:var(--spacing-md)}._modal_xqi43_14 ._content_xqi43_94::-webkit-scrollbar{width:5px}._modal_xqi43_14 ._content_xqi43_94::-webkit-scrollbar-thumb{background-color:var(--color-text-secondary);border-radius:var(--border-radius-sm)}._modal_xqi43_14 ._content_xqi43_94::-webkit-scrollbar-track{background-color:var(--color-border-light);border-radius:var(--border-radius-sm)}._modal_xqi43_14 ._footer_xqi43_123{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;flex:0 0 auto;gap:var(--spacing-sm);padding:var(--spacing-sm);transition:box-shadow var(--transition-duration-normal);box-shadow:0 0 10px #00000012;z-index:5}._modal_xqi43_14 ._footer_xqi43_123._mid_xqi43_89{box-shadow:0 -2px 8px #00000014}._modal_xqi43_14 ._footer_xqi43_123._bot_xqi43_138{box-shadow:none}._modal_xqi43_14 ._footer_xqi43_123 button{padding:6px var(--spacing-sm)}._footer_xqi43_123 ._supportBtn_xqi43_144 ._liveDot_xqi43_144{width:var(--spacing-sm);height:var(--spacing-sm);border-radius:var(--border-radius-full);background-color:var(--color-error);animation:_supportLive_xqi43_1 3s cubic-bezier(.36,.07,.19,.97) infinite}@keyframes _supportLive_xqi43_1{1%{box-shadow:0 0 0 0 var(--color-error)}50%{box-shadow:0 0 10px 0 var(--color-error)}90%{box-shadow:0 0 20px 0 var(--color-error)}to{box-shadow:0 0 40px 0 var(--color-error-alpha)}}._footer_xqi43_123 ._closeBtn_xqi43_77 ._esc_xqi43_166{display:block;margin-left:var(--spacing-sm);padding:0 var(--spacing-xs);font-size:9px;height:20px;line-height:20px;border-radius:var(--border-radius-sm);background-color:var(--color-disabled-background);color:var(--color-text-secondary);font-family:var(--font-family)}._enter_xqi43_180{opacity:0}._enterActive_xqi43_183{opacity:1;transition:opacity var(--transition-duration-slow) var(--transition-timing-ease-out)}._exit_xqi43_188{opacity:1}._exitActive_xqi43_191{opacity:0;transition:opacity var(--transition-duration-normal) var(--transition-timing-ease-in)}._content_129q0_5{padding:var(--spacing-sm) 0;color:var(--color-text);font-family:var(--font-family);font-size:var(--font-size-md);line-height:var(--line-height-normal);word-break:break-word;white-space:pre-wrap}._footer_129q0_15{margin-top:var(--spacing-md);display:flex;justify-content:flex-end;align-items:center;gap:var(--spacing-sm);flex-shrink:0}@font-face{font-family:Spoqa Han Sans Neo;font-weight:300;font-style:normal;font-display:swap;src:url(https://solapi-content.s3.ap-northeast-2.amazonaws.com/assets/SpoqaHanSansNeo_TTF_subset/SpoqaHanSansNeo-Light.woff2) format("woff2")}@font-face{font-family:Spoqa Han Sans Neo;font-weight:400;font-style:normal;font-display:swap;src:url(https://solapi-content.s3.ap-northeast-2.amazonaws.com/assets/SpoqaHanSansNeo_TTF_subset/SpoqaHanSansNeo-Regular.woff2) format("woff2")}@font-face{font-family:Spoqa Han Sans Neo;font-weight:500;font-style:normal;font-display:swap;src:url(https://solapi-content.s3.ap-northeast-2.amazonaws.com/assets/SpoqaHanSansNeo_TTF_subset/SpoqaHanSansNeo-Medium.woff2) format("woff2")}@font-face{font-family:Spoqa Han Sans Neo;font-weight:700;font-style:normal;font-display:swap;src:url(https://solapi-content.s3.ap-northeast-2.amazonaws.com/assets/SpoqaHanSansNeo_TTF_subset/SpoqaHanSansNeo-Bold.woff2) format("woff2")}._root_f5tys_1{display:inline-block}._backdrop_f5tys_6{position:fixed;inset:0;background:transparent}._menuPaper_f5tys_15{position:fixed;border-radius:var(--border-radius-md);border:1px solid var(--color-border);padding:6px 0;box-sizing:border-box;background:var(--color-background);box-shadow:var(--shadow-lg);animation:_menuFadeIn_f5tys_1 .15s ease-out;overflow:hidden}._compact_f5tys_27{min-width:190px;max-width:230px}._wide_f5tys_32{min-width:280px;max-width:300px}@keyframes _menuFadeIn_f5tys_1{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}._menuItem_f5tys_48{box-sizing:border-box;cursor:pointer;margin:0 6px;padding:6px 12px;border-radius:4px;transition:background-color var(--transition-duration-fast) var(--transition-timing-ease-out);user-select:none}._menuItem_f5tys_48:hover{background-color:var(--color-surface)}._menuItem_f5tys_48._error_f5tys_63:hover{background-color:var(--color-error-alpha)}._menuItem_f5tys_48:hover ._shortcutBadge_f5tys_67{opacity:1;color:#000000b8;border-color:#00000038}._menuItem_f5tys_48:active{background-color:var(--color-border-light)}._selected_f5tys_77{font-weight:var(--font-weight-medium);background-color:var(--color-border-light)}._disabled_f5tys_82{cursor:default;opacity:.5;pointer-events:none;background-color:transparent}._error_f5tys_63,._menuItem_f5tys_48._error_f5tys_63 ._label_f5tys_93,._menuItem_f5tys_48._error_f5tys_63 ._label_f5tys_93 *{color:var(--color-error)}._leftIcon_f5tys_98{width:22px;height:22px;display:flex;align-items:center;justify-content:center}._iconSvg_f5tys_107{display:block;font-size:1.12em;color:#c4c4c4}._menuItem_f5tys_48._error_f5tys_63 ._iconSvg_f5tys_107{color:var(--color-error)}._label_f5tys_93{min-width:0}._endIcon_f5tys_121{display:flex;align-items:center}._shortcut_f5tys_67{display:inline-flex;align-items:center}._shortcutBadge_f5tys_67{display:inline-flex;align-items:center;justify-content:center;min-width:22px;min-height:22px;padding:3px;box-sizing:border-box;border-radius:4px;border:1px solid rgba(0,0,0,.16);background:transparent;opacity:.75;color:#0009;white-space:nowrap;font-size:10px;line-height:1.2;font-variant-numeric:tabular-nums}._triggerButton_f5tys_153{padding:6px}._dividerFull_f5tys_157{height:1px;background:var(--color-border);opacity:.7;margin:6px 0}._groupHeader_f5tys_164{padding:6px 18px 2px;user-select:none;color:var(--color-text-tertiary)}._dense_f5tys_171{padding:4px 0}._dense_f5tys_171 ._menuItem_f5tys_48{padding:4px 10px;margin:0 4px;font-size:.8125rem}._dense_f5tys_171 ._leftIcon_f5tys_98{width:18px;height:18px}._dense_f5tys_171 ._iconSvg_f5tys_107{font-size:.95em}._dense_f5tys_171 ._dividerFull_f5tys_157{margin:4px 0}._dense_f5tys_171 ._groupHeader_f5tys_164{padding:4px 14px 1px}._shadowWrap_1pc8r_1{position:relative}._root_1pc8r_5{background:transparent;padding:0;margin:0;max-width:100%;overflow:hidden;position:relative}._root_1pc8r_5:after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--color-border)}._tabList_1pc8r_25{display:flex;flex-wrap:nowrap;align-items:center;justify-content:flex-start}._tabItem_1pc8r_32{flex-shrink:0}._tabBox_1pc8r_36{position:relative;padding:calc(var(--spacing-xs) - 1px)}._tabButton_1pc8r_41{position:relative;display:flex;align-items:center;font-weight:var(--font-weight-medium);color:var(--color-text-secondary);background:none;border:none;outline:none;cursor:pointer;font-size:var(--font-size-md);font-family:var(--font-family);transition:color .2s,background .2s;border-radius:var(--border-radius-md);font-size:var(--font-size-sm)}._small_1pc8r_60 ._tabButton_1pc8r_41{padding:var(--spacing-xs) var(--spacing-sm)}._medium_1pc8r_64 ._tabButton_1pc8r_41{padding:var(--spacing-sm) var(--spacing-md)}._large_1pc8r_68 ._tabButton_1pc8r_41{padding:var(--spacing-md) var(--spacing-lg)}._tabButton_1pc8r_41:hover{color:var(--color-primary);background:#0000000d}._selectedTabButton_1pc8r_77{color:var(--color-primary)}._disabled_1pc8r_81{cursor:not-allowed;opacity:.6;pointer-events:none}._cursor_1pc8r_87{position:absolute;bottom:0;height:2px;background:var(--color-primary);border-radius:2px;transition:left .25s cubic-bezier(.4,0,.2,1),width .25s cubic-bezier(.4,0,.2,1);z-index:3;pointer-events:none}._startIcon_1pc8r_100{margin-right:var(--spacing-xs);display:flex;align-items:center}._moreButton_1pc8r_106{padding:6px;color:var(--color-text-secondary)}._moreButton_1pc8r_106:hover{color:var(--color-primary);background:var(--color-primary-alpha)}._root_1h21x_1{position:relative;padding:var(--spacing-sm);background-color:var(--color-surface);border-radius:var(--border-radius-sm);font-family:var(--font-family)}._cursor_1h21x_9{position:absolute;transition:left .4s cubic-bezier(.13,.83,.55,1.08);background-color:var(--color-primary);border-radius:var(--border-radius-sm)}._containedCursor_1h21x_16{background-color:var(--color-background);box-shadow:var(--shadow-sm)}._disabledCursor_1h21x_21{background-color:var(--color-disabled)}._scrollContainer_1h21x_25{display:flex;align-items:center;gap:0}._scrollButton_1h21x_31{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:28px;height:28px;border:none;background:none;color:var(--color-text-secondary);cursor:pointer;padding:0;border-radius:var(--border-radius-sm);transition:background-color var(--transition-duration-fast) var(--transition-timing-ease-out)}._scrollButton_1h21x_31:hover{background-color:var(--color-border-light);color:var(--color-text)}._scrollButton_1h21x_31:disabled{opacity:.3;cursor:default}._scrollButton_1h21x_31:disabled:hover{background-color:transparent;color:var(--color-text-secondary)}._selectWrap_1h21x_62{position:relative;overflow:hidden;flex:1;min-width:0;touch-action:pan-y;cursor:grab}._selectWrap_1h21x_62:active{cursor:grabbing}._gridRow_1h21x_75{display:flex;gap:4px;width:fit-content;min-width:100%;transition:transform .3s ease}._tabItemContainer_1h21x_83{min-width:100px;flex:1 0 100px;overflow:hidden}._choiceItemWrap_1h21x_89{color:var(--color-text-secondary);font-weight:var(--font-weight-bold);border-radius:var(--border-radius-sm);cursor:pointer;padding:var(--spacing-sm);transition:background-color var(--transition-duration-fast) var(--transition-timing-ease-out),color var(--transition-duration-fast) var(--transition-timing-ease-out);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;max-width:100%;box-sizing:border-box;font-family:var(--font-family);font-size:var(--font-size-sm);border:none;background:none;outline:none}._choiceItemWrap_1h21x_89:focus-visible{outline:1px solid var(--color-primary);outline-offset:-1px}._choiceItemWrap_1h21x_89:hover{color:var(--color-text);background-color:var(--color-border-light)}._selectedItemWrap_1h21x_123{color:var(--color-background)}._selectedItemWrap_1h21x_123:hover{color:var(--color-background);background-color:transparent;cursor:default}._containedSelectedItemWrap_1h21x_133{color:var(--color-primary);font-weight:var(--font-weight-bold)}._containedSelectedItemWrap_1h21x_133:hover{color:var(--color-primary);background-color:transparent;cursor:default}._disabledItemWrap_1h21x_144{color:var(--color-text-disabled);background-color:transparent;cursor:default;opacity:.6}._disabledItemWrap_1h21x_144:hover{color:var(--color-text-disabled);background-color:transparent;cursor:default}._root_2630y_1{position:relative}._filterChip_2630y_6{display:inline-flex;align-items:center;gap:var(--spacing-xs);height:24px;box-sizing:border-box;padding:var(--spacing-xs);padding-right:var(--spacing-sm);border:1px dashed var(--color-border);border-radius:20px;background:transparent;cursor:pointer;transition:background-color var(--transition-duration-fast) var(--transition-timing-ease-out)}._filterChip_2630y_6:hover{background-color:var(--color-surface)}._filterChip_2630y_6 span{font-size:12px}._filterChip_2630y_6 ._icon_2630y_29{padding:2px var(--spacing-xs);color:var(--color-text-secondary)}._filterChip_2630y_6 ._icon_2630y_29._hasValue_2630y_33:hover{color:var(--color-error)}._filterChip_2630y_6 ._divider_2630y_37{width:1px;height:1em;background-color:var(--color-border);margin:0 var(--spacing-xs)}._removeAllButton_2630y_44{background:none;border:none;padding:0;cursor:pointer;display:block}._selectOptions_2630y_53{max-height:200px;overflow-y:auto}._condButton_2630y_59{border-radius:var(--border-radius-sm);border:1px solid var(--color-border);background:var(--color-background);padding:2px var(--spacing-xs);font-size:var(--font-size-xs);cursor:pointer}._condButton_2630y_59:hover{border-color:var(--color-text-secondary)}._condOptions_2630y_71{max-width:200px;padding:var(--spacing-xs)}._label_15skt_1{display:block;font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-left:var(--spacing-xs);margin-bottom:5px;font-family:var(--font-family);font-weight:var(--font-weight-medium)}._largeLabel_15skt_11{font-size:var(--font-size-sm)}._focusedLabel_15skt_15{color:var(--color-text)}._requiredMarker_15skt_19{color:var(--color-error);margin-left:var(--spacing-xs)}._inputWrapper_15skt_24{position:relative;display:flex;align-items:stretch;width:100%;border:1px solid var(--color-border);border-radius:var(--border-radius-sm);transition:border-color var(--transition-duration-normal) var(--transition-timing-ease-out),outline-color var(--transition-duration-normal) var(--transition-timing-ease-out),box-shadow var(--transition-duration-normal) var(--transition-timing-ease-out);background-color:var(--color-background)}._inputWrapper_15skt_24:hover:not(._inputWrapperDisabled_15skt_41):not(._inputWrapperError_15skt_41){border-color:var(--color-border-hover, var(--color-text-secondary))}._inputWrapper_15skt_24:focus-within{border-color:var(--color-primary);outline:1px solid var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-alpha)}._inputWrapperError_15skt_41{border-color:var(--color-error)!important;outline:1px solid var(--color-error)!important;box-shadow:0 0 0 3px var(--color-error-alpha)!important}._inputWrapperDisabled_15skt_41{background-color:var(--color-disabled-background);border-color:var(--color-border-light);outline:none}._root_15skt_63{width:100%;box-sizing:border-box;border:none;border-radius:var(--border-radius-sm);font-weight:var(--font-weight-regular);color:var(--color-text);background-color:transparent;outline:none;font-family:var(--font-family);font-size:var(--font-size-md);line-height:var(--line-height-normal)}._root_15skt_63::placeholder{color:var(--color-text-disabled);opacity:.7}._rootWithStartAdornment_15skt_82{border-top-left-radius:0;border-bottom-left-radius:0}._rootWithEndAdornment_15skt_87{border-top-right-radius:0;border-bottom-right-radius:0}._adornment_15skt_92{display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}._smallAdornment_15skt_99{padding:var(--spacing-sm)}._mediumAdornment_15skt_103,._largeAdornment_15skt_107{padding:calc(var(--spacing-sm) * 1.5)}._textarea_15skt_111{resize:none;overflow:hidden;font-family:var(--font-family);line-height:var(--line-height-normal);transition:height var(--transition-duration-normal) var(--transition-timing-ease-out)}._textareaScrollable_15skt_120{overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--color-border) transparent}._textareaScrollable_15skt_120::-webkit-scrollbar{width:6px}._textareaScrollable_15skt_120::-webkit-scrollbar-track{background:transparent;border-radius:var(--border-radius-sm)}._textareaScrollable_15skt_120::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:var(--border-radius-sm)}._textareaScrollable_15skt_120::-webkit-scrollbar-thumb:hover{background:var(--color-text-secondary)}._bolderRoot_15skt_144{font-weight:var(--font-weight-bold)}._small_15skt_99{padding:calc(var(--spacing-sm) - 2px) var(--spacing-sm);font-size:var(--font-size-sm)}._medium_15skt_103{padding:calc(var(--spacing-sm) * 1.5);font-size:var(--font-size-md)}._large_15skt_11{padding:calc(var(--spacing-sm) * 1.5);font-size:var(--font-size-lg)}._hasStartAdornment_15skt_167{padding-left:0}._hasEndAdornment_15skt_171{padding-right:0}._leftAlign_15skt_175{text-align:left}._centerAlign_15skt_179{text-align:center}._rightAlign_15skt_183{text-align:right}._disabledRoot_15skt_187{background-color:var(--color-disabled-background);color:var(--color-text-disabled);cursor:not-allowed;outline:none;opacity:.6}._errorMessage_15skt_195{display:block;margin-top:var(--spacing-xs);margin-left:var(--spacing-xs);padding-left:var(--spacing-xs);padding-right:var(--spacing-xs);white-space:pre-line;font-size:var(--font-size-xs);color:var(--color-error);font-family:var(--font-family)}._helperText_15skt_207{display:block;margin-top:var(--spacing-xs);margin-left:var(--spacing-xs);padding-left:var(--spacing-xs);padding-right:var(--spacing-xs);white-space:pre-line;font-size:var(--font-size-xs);color:var(--color-text-secondary);font-family:var(--font-family)}._messageContainer_15skt_219{min-height:0}._datePicker_1q6kp_1{cursor:pointer;outline:none}._datePicker_1q6kp_1:focus-visible{outline:2px solid var(--color-primary, #1976d2);outline-offset:2px}._timeSelector_1q6kp_13 select{padding:4px 28px 4px 8px;font-size:var(--font-size-sm, .875rem);color:var(--color-text, #111);background-color:var(--color-background, #fff);border:1px solid var(--color-border, #ccc);border-radius:var(--border-radius-sm, 4px);cursor:pointer;min-height:28px;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23666' aria-hidden='true'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 6px center;background-size:20px 20px;transition:border-color var(--transition-duration-fast) var(--transition-timing-ease-out)}._timeSelector_1q6kp_13 select:hover{border-color:var(--color-border-hover)}._timeSelector_1q6kp_13 select:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px var(--color-primary-alpha)}._timeColon_1q6kp_42{margin:0 2px;font-size:var(--font-size-sm, .875rem);color:var(--color-text-secondary, #666)}._timeInputRow_1q6kp_48{display:flex;flex-wrap:wrap;gap:var(--spacing-md, 16px);margin-bottom:var(--spacing-sm, 8px)}._month_1q6kp_56 strong{font-size:var(--font-size-lg)}._calendar_1q6kp_60 table{border-collapse:collapse;border-spacing:0;table-layout:fixed}._calendar_1q6kp_60 table td{padding:0;text-align:center;vertical-align:middle;cursor:pointer}._calendar_1q6kp_60 table td>div{margin:0;padding:6px 0}._calendar_1q6kp_60 table td>div p{margin:0;padding:0 6px}._calendar_1q6kp_60 ._valid_1q6kp_83:hover{outline:1px solid var(--color-primary);outline-offset:-1px}._calendar_1q6kp_60 ._invalid_1q6kp_88{color:var(--color-text-secondary, #999);cursor:default}._calendar_1q6kp_60 ._current_1q6kp_93 p{font-weight:var(--font-weight-bold)}._calendar_1q6kp_60 ._selected_1q6kp_97{color:var(--color-background);background-color:var(--color-primary);border-radius:var(--border-radius-sm)}._calendar_1q6kp_60 ._selected_1q6kp_97:hover{background-color:var(--color-primary-hover)}._calendar_1q6kp_60 ._selected_1q6kp_97 p{color:var(--color-background);font-weight:var(--font-weight-bold)}._calendar_1q6kp_60 ._inRange_1q6kp_112 p{background-color:var(--color-primary-alpha, rgba(25, 118, 210, .12))}._dateTimeInput_1q6kp_116::-webkit-outer-spin-button,._dateTimeInput_1q6kp_116::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}._dateTimeInput_1q6kp_116{-moz-appearance:textfield;appearance:textfield}._base_1tubv_6{box-sizing:border-box;font-family:var( --font-family, "Spoqa Han Sans Neo", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif );-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}._base_1tubv_6 *,._base_1tubv_6 *:before,._base_1tubv_6 *:after{box-sizing:inherit}._root_gcepv_1{padding:var(--spacing-sm) var(--spacing-md);border-radius:var(--border-radius-md);background-color:#f3f3f3;color:var(--color-text);font-size:var(--font-size-sm);line-height:1.6}._infoIcon_gcepv_11{margin-right:var(--spacing-xs);vertical-align:middle}._listDash_gcepv_16{margin-right:8px}._root_1ot2h_1,._root_1r2ar_1{width:100%;font-family:var(--font-family);color:var(--color-text)}._numBtn_1r2ar_7{cursor:pointer;align-items:center;justify-content:center;display:flex;width:100%;height:50px;border:none;font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);transition:all var(--transition-duration-slow) var(--transition-timing-ease-in-out);color:var(--color-text);border-radius:var(--border-radius-sm);background-color:var(--color-surface);font-family:var(--font-family)}._numBtn_1r2ar_7:hover:not(:disabled){color:var(--color-text);background-color:var(--color-border-light);box-shadow:var(--shadow-sm)}._hoverNumBtn_1r2ar_31{color:var(--color-text);background-color:var(--color-border-light)}._disabledNumBtn_1r2ar_36{cursor:not-allowed;color:var(--color-text-disabled);background-color:var(--color-disabled-background);opacity:.6}._numBox_1r2ar_43{position:relative;box-sizing:border-box;width:100%;padding-bottom:100%;border-radius:var(--border-radius-md);border:1px solid var(--color-border);font-size:var(--font-size-md);background-color:var(--color-background);transition:border-color var(--transition-duration-fast) var(--transition-timing-ease-out)}._numBox_1r2ar_43:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--color-text);font-size:var(--font-size-lg)}._activeNumBox_1r2ar_66{border-color:var(--color-primary);background-color:var(--color-info-light)}._activeNumBox_1r2ar_66:after{content:"●";color:var(--color-primary)}._root_1ot2h_1{width:100%;font-family:var(--font-family);color:var(--color-text)}._root_lw48y_1{width:100%;max-width:400px;margin:0 auto;font-family:var(--font-family);color:var(--color-text)}._selectCard_lw48y_10{height:100%;box-sizing:border-box;border-radius:15px;cursor:pointer;border:1px solid var(--color-border-light, #f1f3f5);box-shadow:0 2px 8px #4950570f;background:var(--color-background);transition:box-shadow .2s ease}._selectCard_lw48y_10:hover{box-shadow:0 2px 8px var(--color-primary-alpha, rgba(59, 130, 246, .35))}._selectCard_lw48y_10._selected_lw48y_25{box-shadow:0 2px 8px var(--color-primary-alpha, rgba(59, 130, 246, .35));border-color:var(--color-primary)}._cardContent_lw48y_30{padding:var(--spacing-md);padding-bottom:var(--spacing-sm);text-align:center}._appIconImg_lw48y_37{width:100%;max-width:35px;box-shadow:0 0 10px #00000026;border-radius:10px}._appIconsWrap_lw48y_44{margin:0 auto;max-width:130px}._iconWrap_lw48y_50{width:100%;max-width:35px}._icon_lw48y_50{font-size:35px;color:#00000080}._plusIcon_lw48y_60{color:#0000003d;font-size:25px}._iconsContainer_lw48y_65{height:92px;display:flex;justify-content:center;align-items:center;gap:var(--spacing-xs)}._radioLabel_lw48y_74{display:flex;align-items:center;justify-content:center;gap:var(--spacing-xs);cursor:pointer;word-break:keep-all}._radioInput_lw48y_83{accent-color:var(--color-primary);width:18px;height:18px;cursor:pointer}._inProgressWrap_lw48y_91{text-align:center;padding:var(--spacing-lg)}._root_stics_1{width:100%}._authTypeSelector_stics_5{display:flex;gap:8px;flex-wrap:wrap}._root_1ot2h_1,._root_7ctgd_1{width:100%;font-family:var(--font-family);color:var(--color-text)}._passButton_7ctgd_7{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:10px 16px;border:none;border-radius:8px;background-color:#e8344e;color:#fff;font-size:15px;font-weight:600;font-family:inherit;cursor:pointer;transition:background-color .15s}._passButton_7ctgd_7:hover{background-color:#d02a42}._passButton_7ctgd_7:disabled{background-color:var(--color-disabled-background);color:var(--color-text-disabled);cursor:default}._passIcon_7ctgd_35{width:24px;height:24px;border-radius:4px;object-fit:cover;margin-right:8px;vertical-align:middle}._root_1ot2h_1,._root_13kk5_1{width:100%;font-family:var(--font-family);color:var(--color-text)}._appItem_13kk5_7{width:100%;display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer;padding:12px 4px;border-radius:8px;border:none;background:none;transition:background-color .15s}._appItem_13kk5_7:hover{background-color:var(--color-border-light)}._appItem_13kk5_7:disabled{cursor:default;opacity:.5}._appItem_13kk5_7:disabled:hover{background-color:transparent}._appIcon_13kk5_34{width:48px;height:48px;border-radius:12px;object-fit:cover}._appLabel_13kk5_41{font-size:11px;color:var(--color-text-secondary);text-align:center;line-height:1.3;word-break:keep-all}._root_193lu_1{width:100%;font-family:var(--font-family);color:var(--color-text)}._qrCode_193lu_7{width:200px;height:200px;border:1px solid var(--color-border);border-radius:8px;padding:8px}._iconWrap_193lu_15{display:flex;flex-direction:column;align-items:center;gap:8px}._icon_193lu_15{font-size:var(--font-size-xl);color:var(--color-text-primary);margin-right:var(--spacing-sm);vertical-align:middle}._otpName_193lu_29{font-size:var(--font-size-lg);text-align:center}._root_1gs03_1{width:100%;padding-bottom:8px}._authTypeSelector_1gs03_6{display:flex;gap:8px;flex-wrap:wrap}._stepper_1gs03_12{display:flex;align-items:flex-start;justify-content:center;gap:8px;padding:4px 0 8px}._stepItem_1gs03_20{display:flex;flex-direction:column;align-items:center;gap:8px;flex-shrink:0}._stepCircle_1gs03_28{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;flex-shrink:0}._stepCompleted_1gs03_40{background-color:var(--color-primary);color:#fff}._stepActive_1gs03_45{border:2px solid var(--color-primary);color:var(--color-primary);background-color:var(--color-background)}._stepPending_1gs03_51{border:2px solid var(--color-border);color:var(--color-text-disabled);background-color:var(--color-background)}._stepLabel_1gs03_57{font-size:11px;min-width:40px;display:inline-block;text-align:center;color:var(--color-text-disabled);white-space:nowrap}._stepLabelActive_1gs03_66{color:var(--color-primary);font-weight:600}._stepLabelCompleted_1gs03_71{color:var(--color-text-secondary)}._stepLine_1gs03_75{width:32px;height:2px;flex-shrink:0;margin-top:13px}._stepLineCompleted_1gs03_82{background-color:var(--color-primary)}._stepLinePending_1gs03_86{background-color:var(--color-border)}
|