sh-ui-cli 0.64.1 → 0.64.3
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/data/changelog/versions.json +24 -0
- package/data/registry/react/components/accordion/index.module.tsx +7 -2
- package/data/registry/react/components/accordion/index.tailwind.tsx +9 -0
- package/data/registry/react/components/accordion/index.tsx +7 -2
- package/data/registry/react/components/combobox/index.module.tsx +12 -0
- package/data/registry/react/components/combobox/index.tailwind.tsx +12 -0
- package/data/registry/react/components/combobox/index.tsx +12 -0
- package/data/registry/react/components/date-picker/index.module.tsx +9 -2
- package/data/registry/react/components/date-picker/index.tailwind.tsx +6 -0
- package/data/registry/react/components/date-picker/index.tsx +9 -2
- package/data/registry/react/components/dialog/index.module.tsx +14 -2
- package/data/registry/react/components/dialog/index.tailwind.tsx +16 -0
- package/data/registry/react/components/dialog/index.tsx +14 -2
- package/data/registry/react/components/dropdown-menu/index.module.tsx +11 -0
- package/data/registry/react/components/dropdown-menu/index.tailwind.tsx +11 -0
- package/data/registry/react/components/dropdown-menu/index.tsx +11 -0
- package/data/registry/react/components/popover/index.module.tsx +10 -2
- package/data/registry/react/components/popover/index.tailwind.tsx +12 -0
- package/data/registry/react/components/popover/index.tsx +10 -2
- package/data/registry/react/components/select/index.module.tsx +7 -0
- package/data/registry/react/components/select/index.tailwind.tsx +7 -0
- package/data/registry/react/components/select/index.tsx +7 -0
- package/data/summaries/react.json +13 -13
- package/package.json +1 -1
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$description": "sh-ui 릴리즈 노트 단일 소스. docs(React)와 showcase(Flutter)가 함께 읽는다. 새 릴리즈마다 맨 앞에 추가.",
|
|
4
4
|
"versions": [
|
|
5
|
+
{
|
|
6
|
+
"version": "0.64.3",
|
|
7
|
+
"date": "2026-05-08",
|
|
8
|
+
"title": "patch — Trigger·Close 컴포넌트 7종 소스 JSDoc 에 render-prop 함정 명시",
|
|
9
|
+
"type": "patch",
|
|
10
|
+
"highlights": [
|
|
11
|
+
"**컴포넌트 소스 JSDoc 보강 (7종 × 4 변종)** — `sh_ui_get_component` 와 사용자 프로젝트에 설치된 컴포넌트 모두 소스의 JSDoc 만 보이는데 `render` prop 안내가 거기 없어 AI 가 button 중첩 워크어라운드를 반복하던 문제를 차단. dialog / popover / select / dropdown-menu / accordion / combobox 의 Trigger·Close·SubTrigger·Clear 위에 \"`<button>` 자체 렌더 → 자식 button 중첩 금지 → 다른 엘리먼트 슬롯은 `render` prop\" 패턴을 일관 톤으로 박음.",
|
|
12
|
+
"**`render` 와 `children` 패턴 구분 명시** — date-picker 의 DatePickerTrigger 는 sh-ui 자체 `<button>` 이라 Base UI 의 `render` prop 이 아닌 `children` 함수 패턴(value/formatted/placeholder 인자) + `className` 직접 스타일링이 정석. 이 차이를 JSDoc + summary 양쪽에 명시.",
|
|
13
|
+
"**plain / tailwind / vanilla-extract / module 4 변종 + apps/docs 듀얼카피본 모두 동기화** — 28 파일. v0.64.1·v0.64.2 의 summary 정정과 합쳐 AI 가 쓸 수 있는 모든 정보 채널(MCP list/get, llms.txt, 설치 후 IDE 호버) 에서 동일한 가이드 노출."
|
|
14
|
+
],
|
|
15
|
+
"url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.64.3"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"version": "0.64.2",
|
|
19
|
+
"date": "2026-05-08",
|
|
20
|
+
"title": "patch — llms summary 13건 정확성 audit + Base UI render-prop 함정 일괄 명시",
|
|
21
|
+
"type": "patch",
|
|
22
|
+
"highlights": [
|
|
23
|
+
"**summary 사실관계 정정 5건** — `radio` 의 'RadioGroupItem' (실제는 `Radio + RadioGroup`), `toast` 의 'useToast 훅 + ToastProvider' (실제는 `toast()` 함수 + `<Toaster />`, sonner-style), `textarea` 의 'autoResize' (실제 prop 없음), `cn` 의 'tailwind-merge 미사용' (tailwind 변종은 사용함), `pagination` 의 dot/축약 표기. AI 가 헛 import 하던 회귀 차단.",
|
|
24
|
+
"**`render` prop 함정 일괄 명시 (6건)** — popover / tooltip / dropdown-menu / accordion / date-picker / combobox 의 Trigger·Close 가 자체로 `<button>` 을 렌더한다는 점 + 자식 button 중첩 대신 Base UI 의 `render` prop 으로 슬롯하는 패턴을 summary 에 박음. (`<PopoverClose render={<Button>닫기</Button>} />`). v0.64.1 의 dialog/select 노트와 동일 톤으로 통일.",
|
|
25
|
+
"**exports 명시 보강 (8건)** — popover / tooltip / dropdown-menu / context-menu / menubar / accordion / date-picker / combobox 의 실제 export 이름을 summary 에 펼쳐 적음. AI 가 namespace attach (`Popover.Trigger` 등) 환각으로 import 하던 문제 해소."
|
|
26
|
+
],
|
|
27
|
+
"url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.64.2"
|
|
28
|
+
},
|
|
5
29
|
{
|
|
6
30
|
"version": "0.64.1",
|
|
7
31
|
"date": "2026-05-08",
|
|
@@ -45,8 +45,13 @@ export const AccordionItem = React.forwardRef<
|
|
|
45
45
|
AccordionItem.displayName = "AccordionItem";
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
* Trigger: 헤더 버튼. 우측에 chevron이 자동으로 붙고 expanded 상태에서 회전한다.
|
|
49
|
-
* Base UI의 AccordionHeader(h3)로 감싸 의미론적 헤더 구조를 유지한다.
|
|
48
|
+
* Trigger: 헤더 버튼. 우측에 chevron 이 자동으로 붙고 expanded 상태에서 회전한다.
|
|
49
|
+
* Base UI 의 AccordionHeader(h3) 로 감싸 의미론적 헤더 구조를 유지한다.
|
|
50
|
+
*
|
|
51
|
+
* 자체로 `<button>` 을 렌더하므로 자식으로 또 다른 button 을 넣지 말 것.
|
|
52
|
+
* 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop:
|
|
53
|
+
*
|
|
54
|
+
* <AccordionTrigger render={<MyHeader>...</MyHeader>} />
|
|
50
55
|
*/
|
|
51
56
|
export const AccordionTrigger = React.forwardRef<
|
|
52
57
|
HTMLButtonElement,
|
|
@@ -37,6 +37,15 @@ export const AccordionItem = React.forwardRef<
|
|
|
37
37
|
));
|
|
38
38
|
AccordionItem.displayName = "AccordionItem";
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Trigger: 헤더 버튼. 우측에 chevron 이 자동으로 붙고 expanded 상태에서 회전한다.
|
|
42
|
+
* Base UI 의 AccordionHeader(h3) 로 감싸 의미론적 헤더 구조를 유지한다.
|
|
43
|
+
*
|
|
44
|
+
* 자체로 `<button>` 을 렌더하므로 자식으로 또 다른 button 을 넣지 말 것.
|
|
45
|
+
* 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop:
|
|
46
|
+
*
|
|
47
|
+
* <AccordionTrigger render={<MyHeader>...</MyHeader>} />
|
|
48
|
+
*/
|
|
40
49
|
export const AccordionTrigger = React.forwardRef<
|
|
41
50
|
HTMLButtonElement,
|
|
42
51
|
WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseAccordion.Trigger>>
|
|
@@ -45,8 +45,13 @@ export const AccordionItem = React.forwardRef<
|
|
|
45
45
|
AccordionItem.displayName = "AccordionItem";
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
* Trigger: 헤더 버튼. 우측에 chevron이 자동으로 붙고 expanded 상태에서 회전한다.
|
|
49
|
-
* Base UI의 AccordionHeader(h3)로 감싸 의미론적 헤더 구조를 유지한다.
|
|
48
|
+
* Trigger: 헤더 버튼. 우측에 chevron 이 자동으로 붙고 expanded 상태에서 회전한다.
|
|
49
|
+
* Base UI 의 AccordionHeader(h3) 로 감싸 의미론적 헤더 구조를 유지한다.
|
|
50
|
+
*
|
|
51
|
+
* 자체로 `<button>` 을 렌더하므로 자식으로 또 다른 button 을 넣지 말 것.
|
|
52
|
+
* 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop:
|
|
53
|
+
*
|
|
54
|
+
* <AccordionTrigger render={<MyHeader>...</MyHeader>} />
|
|
50
55
|
*/
|
|
51
56
|
export const AccordionTrigger = React.forwardRef<
|
|
52
57
|
HTMLButtonElement,
|
|
@@ -25,8 +25,20 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
25
25
|
export const Combobox = BaseCombobox.Root;
|
|
26
26
|
|
|
27
27
|
export const ComboboxIcon = BaseCombobox.Icon;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Combobox 토글 트리거. 자체로 `<button>` 을 렌더 — 자식으로 또 다른 button
|
|
31
|
+
* (예: 커스텀 Button) 을 넣지 말 것. 다른 엘리먼트로 슬롯하려면 Base UI 의
|
|
32
|
+
* `render` prop 사용.
|
|
33
|
+
*/
|
|
28
34
|
export const ComboboxTrigger = BaseCombobox.Trigger;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 입력값 클리어 버튼. 자체로 `<button>` — 자식 button 중첩 금지. 다른
|
|
38
|
+
* 엘리먼트 슬롯은 `render` prop.
|
|
39
|
+
*/
|
|
29
40
|
export const ComboboxClear = BaseCombobox.Clear;
|
|
41
|
+
|
|
30
42
|
export const ComboboxValue = BaseCombobox.Value;
|
|
31
43
|
export const ComboboxGroup = BaseCombobox.Group;
|
|
32
44
|
export const ComboboxChips = BaseCombobox.Chips;
|
|
@@ -9,8 +9,20 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
9
9
|
|
|
10
10
|
export const Combobox = BaseCombobox.Root;
|
|
11
11
|
export const ComboboxIcon = BaseCombobox.Icon;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Combobox 토글 트리거. 자체로 `<button>` 을 렌더 — 자식으로 또 다른 button
|
|
15
|
+
* (예: 커스텀 Button) 을 넣지 말 것. 다른 엘리먼트로 슬롯하려면 Base UI 의
|
|
16
|
+
* `render` prop 사용.
|
|
17
|
+
*/
|
|
12
18
|
export const ComboboxTrigger = BaseCombobox.Trigger;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 입력값 클리어 버튼. 자체로 `<button>` — 자식 button 중첩 금지. 다른
|
|
22
|
+
* 엘리먼트 슬롯은 `render` prop.
|
|
23
|
+
*/
|
|
13
24
|
export const ComboboxClear = BaseCombobox.Clear;
|
|
25
|
+
|
|
14
26
|
export const ComboboxValue = BaseCombobox.Value;
|
|
15
27
|
export const ComboboxGroup = BaseCombobox.Group;
|
|
16
28
|
export const ComboboxChips = BaseCombobox.Chips;
|
|
@@ -25,8 +25,20 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
25
25
|
export const Combobox = BaseCombobox.Root;
|
|
26
26
|
|
|
27
27
|
export const ComboboxIcon = BaseCombobox.Icon;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Combobox 토글 트리거. 자체로 `<button>` 을 렌더 — 자식으로 또 다른 button
|
|
31
|
+
* (예: 커스텀 Button) 을 넣지 말 것. 다른 엘리먼트로 슬롯하려면 Base UI 의
|
|
32
|
+
* `render` prop 사용.
|
|
33
|
+
*/
|
|
28
34
|
export const ComboboxTrigger = BaseCombobox.Trigger;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 입력값 클리어 버튼. 자체로 `<button>` — 자식 button 중첩 금지. 다른
|
|
38
|
+
* 엘리먼트 슬롯은 `render` prop.
|
|
39
|
+
*/
|
|
29
40
|
export const ComboboxClear = BaseCombobox.Clear;
|
|
41
|
+
|
|
30
42
|
export const ComboboxValue = BaseCombobox.Value;
|
|
31
43
|
export const ComboboxGroup = BaseCombobox.Group;
|
|
32
44
|
export const ComboboxChips = BaseCombobox.Chips;
|
|
@@ -246,8 +246,15 @@ export interface DatePickerTriggerProps
|
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
/**
|
|
249
|
-
* 캘린더 popover를 여는 트리거 버튼.
|
|
250
|
-
*
|
|
249
|
+
* 캘린더 popover 를 여는 트리거 버튼. 자체로 `<button>` 을 렌더하므로 자식
|
|
250
|
+
* 으로 또 다른 button (예: 커스텀 Button) 을 넣지 말 것 — button 중첩은
|
|
251
|
+
* invalid HTML. 트리거 외관 커스터마이즈는 두 가지 방법:
|
|
252
|
+
*
|
|
253
|
+
* 1) `children` 에 함수 — 내부 텍스트만 커스터마이즈 (현재 값/포맷/placeholder 받아 직접 렌더):
|
|
254
|
+
* <DatePickerTrigger>{({ formatted, placeholder }) => formatted ?? placeholder}</DatePickerTrigger>
|
|
255
|
+
*
|
|
256
|
+
* 2) `className` 으로 직접 스타일링 — 별도 Button 컴포넌트로 감싸지 말고
|
|
257
|
+
* 버튼 자체에 클래스 부여.
|
|
251
258
|
*/
|
|
252
259
|
export const DatePickerTrigger = React.forwardRef<HTMLButtonElement, DatePickerTriggerProps>(
|
|
253
260
|
function DatePickerTrigger({ className, children, onClick, ...props }, ref) {
|
|
@@ -124,6 +124,12 @@ export interface DatePickerTriggerProps
|
|
|
124
124
|
}) => React.ReactNode);
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
/**
|
|
128
|
+
* 캘린더 popover 를 여는 트리거 버튼. 자체로 `<button>` 을 렌더하므로 자식
|
|
129
|
+
* 으로 또 다른 button (예: 커스텀 Button) 을 넣지 말 것 — button 중첩은
|
|
130
|
+
* invalid HTML. 트리거 외관 커스터마이즈는 `children` 함수 패턴 또는
|
|
131
|
+
* `className` 직접 스타일링 사용.
|
|
132
|
+
*/
|
|
127
133
|
export const DatePickerTrigger = React.forwardRef<HTMLButtonElement, DatePickerTriggerProps>(
|
|
128
134
|
function DatePickerTrigger({ className, children, onClick, ...props }, ref) {
|
|
129
135
|
const ctx = useDatePickerContext("DatePickerTrigger");
|
|
@@ -252,8 +252,15 @@ export interface DatePickerTriggerProps
|
|
|
252
252
|
}
|
|
253
253
|
|
|
254
254
|
/**
|
|
255
|
-
* 캘린더 popover를 여는 트리거 버튼.
|
|
256
|
-
*
|
|
255
|
+
* 캘린더 popover 를 여는 트리거 버튼. 자체로 `<button>` 을 렌더하므로 자식
|
|
256
|
+
* 으로 또 다른 button (예: 커스텀 Button) 을 넣지 말 것 — button 중첩은
|
|
257
|
+
* invalid HTML. 트리거 외관 커스터마이즈는 두 가지 방법:
|
|
258
|
+
*
|
|
259
|
+
* 1) `children` 에 함수 — 내부 텍스트만 커스터마이즈 (현재 값/포맷/placeholder 받아 직접 렌더):
|
|
260
|
+
* <DatePickerTrigger>{({ formatted, placeholder }) => formatted ?? placeholder}</DatePickerTrigger>
|
|
261
|
+
*
|
|
262
|
+
* 2) `className` 으로 직접 스타일링 — 별도 Button 컴포넌트로 감싸지 말고
|
|
263
|
+
* 버튼 자체에 클래스 부여.
|
|
257
264
|
*/
|
|
258
265
|
export const DatePickerTrigger = React.forwardRef<HTMLButtonElement, DatePickerTriggerProps>(
|
|
259
266
|
function DatePickerTrigger({ className, children, onClick, ...props }, ref) {
|
|
@@ -12,10 +12,22 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
12
12
|
*/
|
|
13
13
|
export const Dialog = BaseDialog.Root;
|
|
14
14
|
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Dialog 를 여는 트리거. 자체로 `<button>` 을 렌더하므로 자식으로 또 다른
|
|
17
|
+
* button (예: 커스텀 Button) 을 넣지 말 것 — button 중첩은 invalid HTML.
|
|
18
|
+
* 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용:
|
|
19
|
+
*
|
|
20
|
+
* <DialogTrigger render={<Button>열기</Button>} />
|
|
21
|
+
*/
|
|
16
22
|
export const DialogTrigger = BaseDialog.Trigger;
|
|
17
23
|
|
|
18
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* 클릭 시 Dialog 를 닫는 요소 (예: footer 취소 버튼). 자체로 `<button>` 을
|
|
26
|
+
* 렌더하므로 자식으로 또 다른 button 을 넣지 말 것 — 커스텀 Button 슬롯은
|
|
27
|
+
* `render` prop 사용:
|
|
28
|
+
*
|
|
29
|
+
* <DialogClose render={<Button variant='ghost'>취소</Button>} />
|
|
30
|
+
*/
|
|
19
31
|
export const DialogClose = BaseDialog.Close;
|
|
20
32
|
|
|
21
33
|
/** 우상단에 배치되는 X 닫기 버튼. `aria-label="닫기"`가 자동 부여된다. */
|
|
@@ -6,7 +6,23 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
export const Dialog = BaseDialog.Root;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Dialog 를 여는 트리거. 자체로 `<button>` 을 렌더하므로 자식으로 또 다른
|
|
12
|
+
* button (예: 커스텀 Button) 을 넣지 말 것 — button 중첩은 invalid HTML.
|
|
13
|
+
* 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용:
|
|
14
|
+
*
|
|
15
|
+
* <DialogTrigger render={<Button>열기</Button>} />
|
|
16
|
+
*/
|
|
9
17
|
export const DialogTrigger = BaseDialog.Trigger;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 클릭 시 Dialog 를 닫는 요소 (예: footer 취소 버튼). 자체로 `<button>` 을
|
|
21
|
+
* 렌더하므로 자식으로 또 다른 button 을 넣지 말 것 — 커스텀 Button 슬롯은
|
|
22
|
+
* `render` prop 사용:
|
|
23
|
+
*
|
|
24
|
+
* <DialogClose render={<Button variant='ghost'>취소</Button>} />
|
|
25
|
+
*/
|
|
10
26
|
export const DialogClose = BaseDialog.Close;
|
|
11
27
|
|
|
12
28
|
export function DialogCloseX({ className, children, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) {
|
|
@@ -12,10 +12,22 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
12
12
|
*/
|
|
13
13
|
export const Dialog = BaseDialog.Root;
|
|
14
14
|
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Dialog 를 여는 트리거. 자체로 `<button>` 을 렌더하므로 자식으로 또 다른
|
|
17
|
+
* button (예: 커스텀 Button) 을 넣지 말 것 — button 중첩은 invalid HTML.
|
|
18
|
+
* 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용:
|
|
19
|
+
*
|
|
20
|
+
* <DialogTrigger render={<Button>열기</Button>} />
|
|
21
|
+
*/
|
|
16
22
|
export const DialogTrigger = BaseDialog.Trigger;
|
|
17
23
|
|
|
18
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* 클릭 시 Dialog 를 닫는 요소 (예: footer 취소 버튼). 자체로 `<button>` 을
|
|
26
|
+
* 렌더하므로 자식으로 또 다른 button 을 넣지 말 것 — 커스텀 Button 슬롯은
|
|
27
|
+
* `render` prop 사용:
|
|
28
|
+
*
|
|
29
|
+
* <DialogClose render={<Button variant='ghost'>취소</Button>} />
|
|
30
|
+
*/
|
|
19
31
|
export const DialogClose = BaseDialog.Close;
|
|
20
32
|
|
|
21
33
|
/** 우상단에 배치되는 X 닫기 버튼. `aria-label="닫기"`가 자동 부여된다. */
|
|
@@ -14,6 +14,13 @@ export const DropdownMenu = BaseMenu.Root;
|
|
|
14
14
|
|
|
15
15
|
/* ───────── Trigger ───────── */
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* DropdownMenu 를 여는 트리거. 자체로 `<button>` 을 렌더 — 자식으로 또 다른
|
|
19
|
+
* button (예: 커스텀 Button) 을 넣지 말 것. 다른 엘리먼트로 슬롯하려면 Base
|
|
20
|
+
* UI 의 `render` prop:
|
|
21
|
+
*
|
|
22
|
+
* <DropdownMenuTrigger render={<Button variant='ghost'>메뉴</Button>} />
|
|
23
|
+
*/
|
|
17
24
|
export const DropdownMenuTrigger = React.forwardRef<
|
|
18
25
|
HTMLButtonElement,
|
|
19
26
|
WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseMenu.Trigger>>
|
|
@@ -193,6 +200,10 @@ export const DropdownMenuSeparator = React.forwardRef<
|
|
|
193
200
|
|
|
194
201
|
export const DropdownMenuSub = BaseMenu.SubmenuRoot;
|
|
195
202
|
|
|
203
|
+
/**
|
|
204
|
+
* 서브메뉴 트리거. 부모 메뉴 항목으로 동작하며 hover/우향 화살표로 서브를
|
|
205
|
+
* 연다. 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용.
|
|
206
|
+
*/
|
|
196
207
|
export const DropdownMenuSubTrigger = React.forwardRef<
|
|
197
208
|
HTMLDivElement,
|
|
198
209
|
WithStringClassName<
|
|
@@ -13,6 +13,13 @@ const itemCheck = "pl-7";
|
|
|
13
13
|
|
|
14
14
|
export const DropdownMenu = BaseMenu.Root;
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* DropdownMenu 를 여는 트리거. 자체로 `<button>` 을 렌더 — 자식으로 또 다른
|
|
18
|
+
* button (예: 커스텀 Button) 을 넣지 말 것. 다른 엘리먼트로 슬롯하려면 Base
|
|
19
|
+
* UI 의 `render` prop:
|
|
20
|
+
*
|
|
21
|
+
* <DropdownMenuTrigger render={<Button variant='ghost'>메뉴</Button>} />
|
|
22
|
+
*/
|
|
16
23
|
export const DropdownMenuTrigger = React.forwardRef<
|
|
17
24
|
HTMLButtonElement,
|
|
18
25
|
WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseMenu.Trigger>>
|
|
@@ -152,6 +159,10 @@ export const DropdownMenuSeparator = React.forwardRef<HTMLDivElement, React.HTML
|
|
|
152
159
|
|
|
153
160
|
export const DropdownMenuSub = BaseMenu.SubmenuRoot;
|
|
154
161
|
|
|
162
|
+
/**
|
|
163
|
+
* 서브메뉴 트리거. 부모 메뉴 항목으로 동작하며 hover/우향 화살표로 서브를
|
|
164
|
+
* 연다. 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용.
|
|
165
|
+
*/
|
|
155
166
|
export const DropdownMenuSubTrigger = React.forwardRef<
|
|
156
167
|
HTMLDivElement,
|
|
157
168
|
WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseMenu.SubmenuTrigger>>
|
|
@@ -14,6 +14,13 @@ export const DropdownMenu = BaseMenu.Root;
|
|
|
14
14
|
|
|
15
15
|
/* ───────── Trigger ───────── */
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* DropdownMenu 를 여는 트리거. 자체로 `<button>` 을 렌더 — 자식으로 또 다른
|
|
19
|
+
* button (예: 커스텀 Button) 을 넣지 말 것. 다른 엘리먼트로 슬롯하려면 Base
|
|
20
|
+
* UI 의 `render` prop:
|
|
21
|
+
*
|
|
22
|
+
* <DropdownMenuTrigger render={<Button variant='ghost'>메뉴</Button>} />
|
|
23
|
+
*/
|
|
17
24
|
export const DropdownMenuTrigger = React.forwardRef<
|
|
18
25
|
HTMLButtonElement,
|
|
19
26
|
WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseMenu.Trigger>>
|
|
@@ -193,6 +200,10 @@ export const DropdownMenuSeparator = React.forwardRef<
|
|
|
193
200
|
|
|
194
201
|
export const DropdownMenuSub = BaseMenu.SubmenuRoot;
|
|
195
202
|
|
|
203
|
+
/**
|
|
204
|
+
* 서브메뉴 트리거. 부모 메뉴 항목으로 동작하며 hover/우향 화살표로 서브를
|
|
205
|
+
* 연다. 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용.
|
|
206
|
+
*/
|
|
196
207
|
export const DropdownMenuSubTrigger = React.forwardRef<
|
|
197
208
|
HTMLDivElement,
|
|
198
209
|
WithStringClassName<
|
|
@@ -12,10 +12,18 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
12
12
|
*/
|
|
13
13
|
export const Popover = BasePopover.Root;
|
|
14
14
|
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Popover 를 여는 트리거. 자체로 `<button>` 을 렌더 — 자식 button 중첩 금지.
|
|
17
|
+
* 커스텀 Button 등으로 슬롯하려면 `render` prop:
|
|
18
|
+
*
|
|
19
|
+
* <PopoverTrigger render={<Button>열기</Button>} />
|
|
20
|
+
*/
|
|
16
21
|
export const PopoverTrigger = BasePopover.Trigger;
|
|
17
22
|
|
|
18
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Popover 를 닫는 요소. 자체로 `<button>` — 자식 button 중첩 금지. 다른
|
|
25
|
+
* 엘리먼트 슬롯은 `render` prop.
|
|
26
|
+
*/
|
|
19
27
|
export const PopoverClose = BasePopover.Close;
|
|
20
28
|
|
|
21
29
|
export interface PopoverContentProps
|
|
@@ -6,7 +6,19 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
export const Popover = BasePopover.Root;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Popover 를 여는 트리거. 자체로 `<button>` 을 렌더 — 자식 button 중첩 금지.
|
|
12
|
+
* 커스텀 Button 등으로 슬롯하려면 `render` prop:
|
|
13
|
+
*
|
|
14
|
+
* <PopoverTrigger render={<Button>열기</Button>} />
|
|
15
|
+
*/
|
|
9
16
|
export const PopoverTrigger = BasePopover.Trigger;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Popover 를 닫는 요소. 자체로 `<button>` — 자식 button 중첩 금지. 다른
|
|
20
|
+
* 엘리먼트 슬롯은 `render` prop.
|
|
21
|
+
*/
|
|
10
22
|
export const PopoverClose = BasePopover.Close;
|
|
11
23
|
|
|
12
24
|
export interface PopoverContentProps
|
|
@@ -12,10 +12,18 @@ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
|
|
|
12
12
|
*/
|
|
13
13
|
export const Popover = BasePopover.Root;
|
|
14
14
|
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Popover 를 여는 트리거. 자체로 `<button>` 을 렌더 — 자식 button 중첩 금지.
|
|
17
|
+
* 커스텀 Button 등으로 슬롯하려면 `render` prop:
|
|
18
|
+
*
|
|
19
|
+
* <PopoverTrigger render={<Button>열기</Button>} />
|
|
20
|
+
*/
|
|
16
21
|
export const PopoverTrigger = BasePopover.Trigger;
|
|
17
22
|
|
|
18
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Popover 를 닫는 요소. 자체로 `<button>` — 자식 button 중첩 금지. 다른
|
|
25
|
+
* 엘리먼트 슬롯은 `render` prop.
|
|
26
|
+
*/
|
|
19
27
|
export const PopoverClose = BasePopover.Close;
|
|
20
28
|
|
|
21
29
|
export interface PopoverContentProps
|
|
@@ -30,6 +30,13 @@ export function SelectValue({
|
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Select 트리거. 자체로 `<button>` 을 렌더 (chevron icon 포함) — 자식으로
|
|
35
|
+
* 또 다른 button (예: 커스텀 Button) 을 넣지 말 것. 트리거를 다른 엘리먼트
|
|
36
|
+
* 로 바꾸려면 Base UI 의 `render` prop:
|
|
37
|
+
*
|
|
38
|
+
* <SelectTrigger render={<Button variant='secondary'>{...}</Button>} />
|
|
39
|
+
*/
|
|
33
40
|
export const SelectTrigger = React.forwardRef<
|
|
34
41
|
HTMLButtonElement,
|
|
35
42
|
Omit<React.ComponentPropsWithoutRef<typeof BaseSelect.Trigger>, "className"> & { className?: string }
|
|
@@ -23,6 +23,13 @@ export function SelectValue({ placeholder, className, ...props }: { placeholder?
|
|
|
23
23
|
);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Select 트리거. 자체로 `<button>` 을 렌더 (chevron icon 포함) — 자식으로
|
|
28
|
+
* 또 다른 button (예: 커스텀 Button) 을 넣지 말 것. 트리거를 다른 엘리먼트
|
|
29
|
+
* 로 바꾸려면 Base UI 의 `render` prop:
|
|
30
|
+
*
|
|
31
|
+
* <SelectTrigger render={<Button variant='secondary'>{...}</Button>} />
|
|
32
|
+
*/
|
|
26
33
|
export const SelectTrigger = React.forwardRef<
|
|
27
34
|
HTMLButtonElement,
|
|
28
35
|
Omit<React.ComponentPropsWithoutRef<typeof BaseSelect.Trigger>, "className"> & { className?: string }
|
|
@@ -30,6 +30,13 @@ export function SelectValue({
|
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Select 트리거. 자체로 `<button>` 을 렌더 (chevron icon 포함) — 자식으로
|
|
35
|
+
* 또 다른 button (예: 커스텀 Button) 을 넣지 말 것. 트리거를 다른 엘리먼트
|
|
36
|
+
* 로 바꾸려면 Base UI 의 `render` prop:
|
|
37
|
+
*
|
|
38
|
+
* <SelectTrigger render={<Button variant='secondary'>{...}</Button>} />
|
|
39
|
+
*/
|
|
33
40
|
export const SelectTrigger = React.forwardRef<
|
|
34
41
|
HTMLButtonElement,
|
|
35
42
|
Omit<React.ComponentPropsWithoutRef<typeof BaseSelect.Trigger>, "className"> & { className?: string }
|
|
@@ -5,32 +5,32 @@
|
|
|
5
5
|
"card": "카드 컨테이너 — separate exports: Card / CardHeader / CardTitle / CardDescription / CardAction / CardContent / CardFooter. dot syntax(`Card.Header`) 아님.",
|
|
6
6
|
"input": "단일 행 텍스트 입력 — hasError 지원. 같은 모듈에 NumberInput / PhoneInput / BusinessNumberInput 변형 포함. 비밀번호 토글은 InputGroup + InputAdornment 레시피로 조립.",
|
|
7
7
|
"numeric-input": "슬라이더 동반·토큰 편집기용 컴팩트 숫자 입력 — onChange 즉시 min/max clamp, focus select-all, 단위(px/ms/%/° 등) suffix. 일반 폼 입력은 NumberInput 권장.",
|
|
8
|
-
"textarea": "여러 행 텍스트 입력 — rows
|
|
8
|
+
"textarea": "여러 행 텍스트 입력 — rows. autoResize 같은 추가 prop 없음.",
|
|
9
9
|
"label": "폼 레이블 — htmlFor로 입력과 연결.",
|
|
10
10
|
"checkbox": "체크박스 — indeterminate 지원 (Base UI).",
|
|
11
|
-
"radio": "라디오 그룹 —
|
|
11
|
+
"radio": "라디오 그룹 — Radio (단일 선택지) + RadioGroup (컨테이너) (Base UI). `RadioGroupItem` 이름 아님. 단일 즉시 적용은 Switch, 다중은 Checkbox 권장.",
|
|
12
12
|
"switch": "토글 스위치 — controlled/uncontrolled 모두 지원 (Base UI).",
|
|
13
13
|
"toggle": "단일 토글 / 토글 그룹 — pressed 상태 (Base UI).",
|
|
14
14
|
"slider": "수평 슬라이더 — 단일/범위 값, step.",
|
|
15
15
|
"select": "네이티브 대체 셀렉트 — separate exports: Select / SelectTrigger / SelectValue / SelectContent / SelectGroup / SelectLabel / SelectItem / SelectSeparator (Base UI). MultiSelect 변형 동봉. SelectTrigger 는 그 자체로 button 이라 자식 button 중첩 금지 — 다른 엘리먼트로 바꾸려면 Base UI 의 `render` prop 사용.",
|
|
16
|
-
"combobox": "검색 가능 셀렉트 —
|
|
16
|
+
"combobox": "검색 가능 셀렉트 — separate exports: Combobox / ComboboxTrigger / ComboboxClear / ComboboxValue / ComboboxIcon / ComboboxInput / ComboboxContent / ComboboxList / ComboboxGroup / ComboboxChips (Base UI). 자동 필터링·키보드 내비. ComboboxTrigger·ComboboxClear 는 자체로 `<button>` — 자식 button 중첩 금지, 다른 엘리먼트로 슬롯하려면 Base UI 의 `render` prop 사용.",
|
|
17
17
|
"color-picker": "색상 선택 — hex/rgb, 프리셋 팔레트.",
|
|
18
|
-
"date-picker": "날짜 선택 —
|
|
18
|
+
"date-picker": "날짜 선택 — separate exports: DatePicker / DatePickerTrigger / DatePickerContent / DatePickerCalendar / DatePickerFooter / DateRangePicker + useDatePicker 훅 (Base UI). DatePickerTrigger 는 sh-ui 자체 `<button>` 이라 자식 button 중첩 금지 — 외관 커스터마이즈는 `children` 함수 패턴(현재 값/포맷/placeholder 인자) 또는 `className` 직접 스타일링 사용 (Base UI 의 `render` prop 패턴 아님).",
|
|
19
19
|
"file-upload": "파일 업로드 — 드롭존, 다중 파일, 진행률.",
|
|
20
20
|
"dialog": "모달 다이얼로그 — separate exports: Dialog / DialogTrigger / DialogClose / DialogContent / DialogTitle / DialogDescription / DialogFooter / DialogCloseX (Base UI, 포커스 트랩). DialogTrigger·DialogClose 는 그 자체로 button 을 렌더 — 자식으로 다른 button 을 넣으면 button 중첩(invalid HTML). 다른 엘리먼트(예: 커스텀 Button)로 슬롯하려면 Base UI 의 `render` prop 사용: `<DialogClose render={<Button>닫기</Button>} />`.",
|
|
21
|
-
"popover": "floating 팝오버 —
|
|
22
|
-
"tooltip": "짧은 힌트 — hover/focus 표시, delay/closeDelay
|
|
23
|
-
"toast": "임시 알림 —
|
|
24
|
-
"dropdown-menu": "드롭다운 메뉴 —
|
|
25
|
-
"context-menu": "우클릭 컨텍스트 메뉴 — DropdownMenu와
|
|
26
|
-
"menubar": "수평 메뉴바 —
|
|
21
|
+
"popover": "floating 팝오버 — separate exports: Popover / PopoverTrigger / PopoverClose / PopoverContent / PopoverTitle / PopoverDescription (Base UI). PopoverTrigger·PopoverClose 는 자체로 `<button>` — 자식으로 button 중첩 금지, 다른 엘리먼트로 슬롯하려면 `render` prop 사용.",
|
|
22
|
+
"tooltip": "짧은 힌트 — separate exports: TooltipProvider (앱 루트에 한 번 두어 delay 공유) / Tooltip / TooltipTrigger / TooltipContent (Base UI). hover/focus 표시, delay/closeDelay. TooltipTrigger 는 임의 엘리먼트를 트리거로 슬롯하는 용도라 Button 등과 결합하려면 `render` prop 사용.",
|
|
23
|
+
"toast": "임시 알림 — `toast()` 함수 호출 + `<Toaster />` 컴포넌트 (sonner-style). useToast 훅·ToastProvider 아님. aria-live 자동.",
|
|
24
|
+
"dropdown-menu": "드롭다운 메뉴 — separate exports: DropdownMenu / DropdownMenuTrigger / DropdownMenuContent / DropdownMenuItem / DropdownMenuCheckboxItem / DropdownMenuRadioGroup / DropdownMenuRadioItem / DropdownMenuGroup / DropdownMenuLabel / DropdownMenuSeparator / DropdownMenuSub / DropdownMenuSubTrigger / DropdownMenuSubContent (Base UI). DropdownMenuTrigger·SubTrigger 는 자체로 `<button>` — 자식 button 중첩 금지, 다른 엘리먼트로 슬롯하려면 `render` prop 사용.",
|
|
25
|
+
"context-menu": "우클릭 컨텍스트 메뉴 — DropdownMenu 와 동일 export 패턴 (`Context-` 접두사: ContextMenu / ContextMenuTrigger / ContextMenuContent / ContextMenuItem 등). ContextMenuTrigger 는 임의 엘리먼트를 우클릭 수신 영역으로 지정하는 용도라 자체가 button 은 아니지만, 자식 슬롯이 필요하면 `render` prop 사용.",
|
|
26
|
+
"menubar": "수평 메뉴바 — Menubar 단일 export. 내부에 DropdownMenu 들을 나란히 배치하는 컨테이너로, 좌우 화살표로 메뉴 간 이동 (Base UI).",
|
|
27
27
|
"tabs": "탭 — separate exports: Tabs / TabsList / TabsTrigger / TabsContent / TabsIndicator (Base UI). dot syntax(`Tabs.List`) 아님.",
|
|
28
|
-
"accordion": "펼침/접힘 아코디언 —
|
|
28
|
+
"accordion": "펼침/접힘 아코디언 — separate exports: Accordion / AccordionItem / AccordionTrigger / AccordionContent (Base UI). single/multiple 모드. AccordionTrigger 는 자체로 `<button>` — 다른 엘리먼트로 슬롯하려면 `render` prop 사용.",
|
|
29
29
|
"carousel": "슬라이드 캐러셀 — Embla 기반, autoplay/autoscroll.",
|
|
30
30
|
"sidebar": "앱 사이드바 — collapsible, SidebarMenu/SidebarGroup 조합.",
|
|
31
31
|
"header": "앱 헤더 — 로고/네비/액션 compound, 데스크탑 inline / 모바일 drawer 자동 전환. drawer focus trap·ESC·focus restore. HeaderNav value(controlled) / defaultValue+onValueChange(uncontrolled) 로 자식 HeaderItem active 자동 매칭 (aria-current 자동, match 커스터마이즈). HeaderMenu(서브메뉴, 데스크탑 portal dropdown / drawer collapsible) · HeaderNavGroup(섹션 라벨) · HeaderDesktopOnly/HeaderMobileOnly(가시성 토글, drawer 이동 없음). variant(solid/transparent/blur) · stickyHide(prefers-reduced-motion 존중, 컨테이너 스크롤 자동 감지) 정식 지원. backdrop-filter @supports 폴백.",
|
|
32
32
|
"breadcrumb": "경로 내비게이션 — separate exports: Breadcrumb / BreadcrumbList / BreadcrumbItem / BreadcrumbLink / BreadcrumbPage / BreadcrumbSeparator / BreadcrumbEllipsis. dot syntax 아님. aria-current 자동.",
|
|
33
|
-
"pagination": "페이지 단위 내비게이션 —
|
|
33
|
+
"pagination": "페이지 단위 내비게이션 — separate exports: Pagination / PaginationContent / PaginationItem / PaginationLink / PaginationPrevious / PaginationNext / PaginationEllipsis. getPaginationRange 유틸 동봉. aria-current 자동.",
|
|
34
34
|
"avatar": "프로필 아바타 — 이미지 fallback → initials (Base UI).",
|
|
35
35
|
"badge": "상태 뱃지 — variant, size.",
|
|
36
36
|
"progress": "선형 진행률 — value 0~100, indeterminate.",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"focus-ring": "공용 포커스 링 스타일 — focus-ring.css.",
|
|
49
49
|
"z-index": "z-index 레이어 토큰 — z-index.css.",
|
|
50
50
|
"animations": "공용 애니메이션 키프레임 — animations.css.",
|
|
51
|
-
"cn": "className
|
|
51
|
+
"cn": "className 합성 헬퍼. plain 변종(`cn.ts`)은 순수 concat, tailwind 변종(`cn.tailwind.ts`)은 clsx + tailwind-merge 로 utility 충돌 자동 머지 (`cn('bg-red-500', 'bg-blue-500')` → `'bg-blue-500'`).",
|
|
52
52
|
"use-media-query": "미디어 쿼리 매칭 훅.",
|
|
53
53
|
"use-active-section": "스크롤 위치로 현재 섹션 감지 훅."
|
|
54
54
|
}
|