@ehfuse/mui-form-controls 3.1.62 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +32 -0
- package/dist/TextArea.d.ts +2 -1
- package/dist/address.js +43 -1
- package/dist/address.js.map +4 -4
- package/dist/address.mjs +43 -1
- package/dist/address.mjs.map +4 -4
- package/dist/components/ReadonlyDisplay.d.ts +30 -8
- package/dist/components/ReadonlyField.d.ts +100 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +55 -13
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +55 -13
- package/dist/index.mjs.map +4 -4
- package/dist/types.d.ts +15 -4
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/readonly.d.ts +34 -0
- package/package.json +1 -1
- package/dist/SwitchField.d.ts +0 -10
- package/dist/ToggleButtonGroupField.d.ts +0 -10
- package/dist/devDebug.d.ts +0 -35
- package/dist/utils/outlinedFieldStyles.d.ts +0 -5
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ReadonlyDisplay.tsx
|
|
3
3
|
*
|
|
4
|
-
* readonly 입력칸을 "실제 <input> 없이" 그리는
|
|
4
|
+
* readonly / disabled 입력칸을 "실제 <input> 없이" 그리는 표시 컴포넌트.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* fieldset/legend 로 재현하되 실제 입력 요소를 만들지 않아 렌더 비용이 크게 낮아진다.
|
|
6
|
+
* mfc 의 readonly / disabled 는 기본적으로 이 컴포넌트로 렌더된다.
|
|
7
|
+
* - readonly : 조작 불가 + 글자색은 편집 가능할 때와 동일(흐려지지 않음).
|
|
8
|
+
* - disabled : 조작 불가 + 글자/라벨/테두리가 흐려짐(`dimmed`).
|
|
10
9
|
*
|
|
11
|
-
* 외관은 MUI OutlinedInput 마크업(fieldset+legend)을 그대로 따르므로 테마의 기본 테두리/반경/색을
|
|
10
|
+
* 외관은 MUI OutlinedInput 마크업(fieldset+legend)을 그대로 따르므로 테마의 기본 테두리/반경/색을 물려받고,
|
|
11
|
+
* 실제 입력 요소/IME/포커스 머신러리가 없어 렌더 비용이 크게 낮다.
|
|
12
|
+
* 실제 <input> 이 꼭 필요하면 소비처가 `readonlyInput` prop 으로 예전 동작(진짜 입력칸)을 되살릴 수 있다.
|
|
13
|
+
*
|
|
14
|
+
* ⚠️ 클래스 호환: 소비처 `sx` 에는 `& .MuiInputBase-input { textAlign }`, `& .MuiOutlinedInput-root { minHeight }`
|
|
15
|
+
* 같은 MUI 내부 셀렉터가 흔하다. 박스 렌더로 바뀌어도 그 스타일이 죽지 않도록 각 파트에 MUI 와 동일한
|
|
16
|
+
* 클래스명(MuiInputBase-root / MuiOutlinedInput-root / MuiInputBase-input / MuiOutlinedInput-input /
|
|
17
|
+
* MuiOutlinedInput-notchedOutline / MuiInputLabel-root / Mui-disabled)을 그대로 붙이고,
|
|
18
|
+
* 값 텍스트가 MUI input 과 같은 패딩을 갖게 해서 패딩/정렬 override 도 동일하게 먹도록 맞춘다.
|
|
12
19
|
*
|
|
13
20
|
* @license MIT
|
|
14
21
|
* @copyright 2025 김영진 (Kim Young Jin)
|
|
@@ -22,13 +29,28 @@ export interface ReadonlyDisplayProps {
|
|
|
22
29
|
value?: React.ReactNode;
|
|
23
30
|
prefix?: React.ReactNode;
|
|
24
31
|
suffix?: React.ReactNode;
|
|
32
|
+
/** 값 왼쪽 adornment(입력칸의 startAdornment 자리). */
|
|
33
|
+
startAdornment?: React.ReactNode;
|
|
34
|
+
/** 값 오른쪽 adornment(입력칸의 endAdornment 자리 — 복사 버튼 등 클릭 가능한 요소도 가능). */
|
|
35
|
+
endAdornment?: React.ReactNode;
|
|
25
36
|
/** suffix/prefix 를 값이 있을 때만 표시할지 여부. */
|
|
26
37
|
showAffixOnlyWithValue?: boolean;
|
|
27
38
|
align?: "left" | "right" | "center";
|
|
28
39
|
size?: "small" | "medium";
|
|
29
40
|
fullWidth?: boolean;
|
|
41
|
+
/** true 면 disabled 입력처럼 글자/라벨/테두리를 흐리게 그린다. */
|
|
42
|
+
dimmed?: boolean;
|
|
43
|
+
/** true 면 값의 줄바꿈을 보존하고 여러 줄로 표시한다(말줄임 대신). */
|
|
44
|
+
multiline?: boolean;
|
|
45
|
+
/** multiline 일 때 최소 줄 수(입력칸의 minRows 와 같은 높이를 유지한다). */
|
|
46
|
+
minRows?: number;
|
|
47
|
+
/** 값 표시 영역 클릭 핸들러(읽기 전용 칸을 눌러 다이얼로그를 여는 패턴 지원). */
|
|
48
|
+
onClick?: React.MouseEventHandler<HTMLDivElement>;
|
|
49
|
+
/** 네이티브 툴팁. */
|
|
50
|
+
title?: string;
|
|
30
51
|
className?: string;
|
|
52
|
+
id?: string;
|
|
31
53
|
sx?: SxProps<Theme>;
|
|
32
54
|
}
|
|
33
|
-
/** readonly 입력칸을 실제 input 없이 그리는
|
|
34
|
-
export declare function ReadonlyDisplay({ label, value, prefix, suffix, showAffixOnlyWithValue, align, size, fullWidth, className, sx, }: ReadonlyDisplayProps): import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
/** readonly/disabled 입력칸을 실제 input 없이 그리는 표시 컴포넌트. */
|
|
56
|
+
export declare function ReadonlyDisplay({ label, value, prefix, suffix, startAdornment, endAdornment, showAffixOnlyWithValue, align, size, fullWidth, dimmed, multiline, minRows, onClick, title, className, id, sx, }: ReadonlyDisplayProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReadonlyField.tsx
|
|
3
|
+
*
|
|
4
|
+
* mfc 컨트롤들이 readonly / disabled 상태에서 공통으로 쓰는 "박스 표시" 진입점.
|
|
5
|
+
*
|
|
6
|
+
* 설계 규칙 (v3.2.0 부터):
|
|
7
|
+
* - `readonly` : 실제 <input> 대신 {@link ReadonlyDisplay} 박스로 렌더. 글자색은 편집 상태와 동일(흐려지지 않음).
|
|
8
|
+
* - `disabled` : 같은 박스로 렌더하되 글자/라벨/테두리를 흐리게(dimmed) 그린다. 즉 disabled = readonly + 흐림.
|
|
9
|
+
* - `readonlyInput` : 예전처럼 진짜 입력칸을 렌더한다(포커스/선택/커스텀 adornment 가 꼭 필요한 칸의 탈출구).
|
|
10
|
+
* - `readonlyLight` : v3.2.0 에서 기본 동작이 되었으므로 무시된다(@deprecated).
|
|
11
|
+
*
|
|
12
|
+
* 훅 개수 안정성: 박스 분기는 **훅을 가진 Base 컴포넌트 바깥(export 래퍼)** 에서 한다.
|
|
13
|
+
* Base 안에서 early-return 하면 readonly/disabled 플래그가 런타임에 뒤집힐 때 훅 개수가 달라져 React 가 죽는다.
|
|
14
|
+
* 서로 다른 컴포넌트 타입으로 갈라지면 React 가 언마운트/마운트로 처리해 안전하다.
|
|
15
|
+
*
|
|
16
|
+
* @license MIT
|
|
17
|
+
* @copyright 2025 김영진 (Kim Young Jin)
|
|
18
|
+
* @author 김영진 (ehfuse@gmail.com)
|
|
19
|
+
*/
|
|
20
|
+
import React from "react";
|
|
21
|
+
import type { ReadonlyDisplayProps } from "./ReadonlyDisplay";
|
|
22
|
+
import type { FormLike } from "../types";
|
|
23
|
+
/** readonly/disabled 판정에 필요한 최소 props. */
|
|
24
|
+
export type ReadonlyBoxFlags = {
|
|
25
|
+
readonly?: boolean;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** true 면 readonly/disabled 여도 진짜 입력칸을 렌더한다. */
|
|
28
|
+
readonlyInput?: boolean;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* 이 컨트롤을 박스(ReadonlyDisplay)로 그려야 하는지.
|
|
32
|
+
* readonly 든 disabled 든 "편집 불가" 이므로 둘 다 박스로 간다. 차이는 흐림(dimmed) 뿐이다.
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldRenderReadonlyBox(props: ReadonlyBoxFlags): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* slotProps 에서 박스 렌더가 살릴 수 있는 것만 뽑는다.
|
|
37
|
+
* - `input.start/endAdornment` : 박스에도 그대로 붙인다(복사 버튼 등 클릭 가능한 요소 포함).
|
|
38
|
+
* - `htmlInput.style.textAlign` : 값 정렬로 옮긴다.
|
|
39
|
+
* 함수형 slotProps 는 ownerState 가 없어 해석할 수 없으므로 무시한다.
|
|
40
|
+
*/
|
|
41
|
+
export declare function pickSlotPropsForBox(slotProps: unknown): {
|
|
42
|
+
startAdornment?: React.ReactNode;
|
|
43
|
+
endAdornment?: React.ReactNode;
|
|
44
|
+
align?: "left" | "right" | "center";
|
|
45
|
+
};
|
|
46
|
+
/** 컨트롤 props 에서 박스 렌더에 필요한 공통 필드만 뽑는다(컴포넌트마다 반복되는 보일러플레이트 제거). */
|
|
47
|
+
export declare function commonReadonlyBoxProps(props: {
|
|
48
|
+
form?: FormLike | null;
|
|
49
|
+
name?: string;
|
|
50
|
+
value?: unknown;
|
|
51
|
+
label?: React.ReactNode;
|
|
52
|
+
disabled?: boolean;
|
|
53
|
+
size?: "small" | "medium" | string;
|
|
54
|
+
fullWidth?: boolean;
|
|
55
|
+
className?: string;
|
|
56
|
+
id?: string;
|
|
57
|
+
onClick?: unknown;
|
|
58
|
+
sx?: ReadonlyDisplayProps["sx"];
|
|
59
|
+
slotProps?: unknown;
|
|
60
|
+
multiline?: boolean;
|
|
61
|
+
minRows?: number | string;
|
|
62
|
+
/** Select/LabelSelect 는 바깥 FormControl 에 레이아웃 sx 를 받는다 — 박스에도 함께 적용한다. */
|
|
63
|
+
formControlProps?: {
|
|
64
|
+
sx?: ReadonlyDisplayProps["sx"];
|
|
65
|
+
};
|
|
66
|
+
}): {
|
|
67
|
+
startAdornment?: React.ReactNode;
|
|
68
|
+
endAdornment?: React.ReactNode;
|
|
69
|
+
align?: "left" | "right" | "center";
|
|
70
|
+
form: FormLike | null | undefined;
|
|
71
|
+
name: string | undefined;
|
|
72
|
+
value: unknown;
|
|
73
|
+
label: React.ReactNode;
|
|
74
|
+
disabled: boolean | undefined;
|
|
75
|
+
size: "small" | "medium";
|
|
76
|
+
fullWidth: boolean | undefined;
|
|
77
|
+
className: string | undefined;
|
|
78
|
+
id: string | undefined;
|
|
79
|
+
onClick: React.MouseEventHandler<HTMLDivElement>;
|
|
80
|
+
multiline: boolean;
|
|
81
|
+
minRows: number | undefined;
|
|
82
|
+
sx: import("@mui/system").SxProps<import("@mui/material").Theme> | undefined;
|
|
83
|
+
};
|
|
84
|
+
type ReadonlyFieldProps = Omit<ReadonlyDisplayProps, "value" | "dimmed"> & {
|
|
85
|
+
/** form 이 있으면 name 으로 값을 구독한다. */
|
|
86
|
+
form?: FormLike | null;
|
|
87
|
+
name?: string;
|
|
88
|
+
/** form 이 없을 때 쓸 값. */
|
|
89
|
+
value?: unknown;
|
|
90
|
+
/** 원시 값을 표시 문자열로 바꾸는 함수(포맷 마스크 등). */
|
|
91
|
+
format?: (value: unknown) => React.ReactNode;
|
|
92
|
+
/** disabled 면 true — 흐리게 그린다. */
|
|
93
|
+
disabled?: boolean;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* readonly/disabled 컨트롤의 공통 박스 렌더.
|
|
97
|
+
* form 유무로 컴포넌트 타입이 갈리므로 훅 개수는 각 타입 안에서 고정된다.
|
|
98
|
+
*/
|
|
99
|
+
export declare function ReadonlyField(props: ReadonlyFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
100
|
+
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -42,5 +42,6 @@ export { CardNumTextField } from "./CardNumTextField";
|
|
|
42
42
|
export { useKoreanHolidays, useKoreanHolidaysRange } from "./hooks";
|
|
43
43
|
export { ReadonlyDisplay } from "./components/ReadonlyDisplay";
|
|
44
44
|
export type { ReadonlyDisplayProps } from "./components/ReadonlyDisplay";
|
|
45
|
+
export { ReadonlyField, shouldRenderReadonlyBox, } from "./components/ReadonlyField";
|
|
45
46
|
export { CardIcon, VisaIcon, MastercardIcon, AmexIcon, JcbIcon, DinersIcon, DiscoverIcon, UnionPayIcon, BcIcon, } from "./icons";
|
|
46
47
|
export type { SearchTextFieldProps, ClearTextFieldProps, TagsTextFieldProps, PasswordTextFieldProps, TextFieldProps, TextAreaProps, CheckboxProps, SwitchProps, RadioGroupProps, RadioOption, DateRangeProps, SliderProps, RatingProps, ToggleButtonProps, ToggleButtonGroupProps, ToggleButtonGroupOption, ButtonGroupProps, StepperProps, AutocompleteProps, AutocompleteOption, SelectProps, SelectOption, LabelSelectProps, LabelSelectOption, AddressTextFieldProps, DaumPostcodeData, PasswordValidationRules, PasswordValidationResult, PhoneTextFieldProps, PhoneFormat, NumberTextFieldProps, JuminTextFieldProps, JuminInfo, VerificationCodeTextFieldProps, VerificationCodeType, EmailTextFieldProps, CustomDomain, DateTextFieldProps, DateFormat, TimeTextFieldProps, TimeFormat, DateTimeTextFieldProps, DateTimeFormat, BizNumTextFieldProps, CorpNumTextFieldProps, CardNumTextFieldProps, CardNumTextFieldHandle, SelectChangeEvent, } from "./types";
|