sh-ui-cli 0.64.2 → 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.
Files changed (24) hide show
  1. package/data/changelog/versions.json +12 -0
  2. package/data/registry/react/components/accordion/index.module.tsx +7 -2
  3. package/data/registry/react/components/accordion/index.tailwind.tsx +9 -0
  4. package/data/registry/react/components/accordion/index.tsx +7 -2
  5. package/data/registry/react/components/combobox/index.module.tsx +12 -0
  6. package/data/registry/react/components/combobox/index.tailwind.tsx +12 -0
  7. package/data/registry/react/components/combobox/index.tsx +12 -0
  8. package/data/registry/react/components/date-picker/index.module.tsx +9 -2
  9. package/data/registry/react/components/date-picker/index.tailwind.tsx +6 -0
  10. package/data/registry/react/components/date-picker/index.tsx +9 -2
  11. package/data/registry/react/components/dialog/index.module.tsx +14 -2
  12. package/data/registry/react/components/dialog/index.tailwind.tsx +16 -0
  13. package/data/registry/react/components/dialog/index.tsx +14 -2
  14. package/data/registry/react/components/dropdown-menu/index.module.tsx +11 -0
  15. package/data/registry/react/components/dropdown-menu/index.tailwind.tsx +11 -0
  16. package/data/registry/react/components/dropdown-menu/index.tsx +11 -0
  17. package/data/registry/react/components/popover/index.module.tsx +10 -2
  18. package/data/registry/react/components/popover/index.tailwind.tsx +12 -0
  19. package/data/registry/react/components/popover/index.tsx +10 -2
  20. package/data/registry/react/components/select/index.module.tsx +7 -0
  21. package/data/registry/react/components/select/index.tailwind.tsx +7 -0
  22. package/data/registry/react/components/select/index.tsx +7 -0
  23. package/data/summaries/react.json +1 -1
  24. package/package.json +1 -1
@@ -2,6 +2,18 @@
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
+ },
5
17
  {
6
18
  "version": "0.64.2",
7
19
  "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를 여는 트리거 버튼. children에 함수를 넘기면 현재 값/포맷 문자열/placeholder를
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를 여는 트리거 버튼. children에 함수를 넘기면 현재 값/포맷 문자열/placeholder를
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
- /** Dialog를 여는 트리거. 보통 Button을 감싸 사용. */
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
- /** 클릭 시 Dialog를 닫는 요소. footer의 취소 버튼 등에 사용. */
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
- /** Dialog를 여는 트리거. 보통 Button을 감싸 사용. */
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
- /** 클릭 시 Dialog를 닫는 요소. footer의 취소 버튼 등에 사용. */
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
- /** Popover를 여는 트리거. */
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
- /** Popover를 닫는 요소. */
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
- /** Popover를 여는 트리거. */
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
- /** Popover를 닫는 요소. */
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 }
@@ -15,7 +15,7 @@
15
15
  "select": "네이티브 대체 셀렉트 — separate exports: Select / SelectTrigger / SelectValue / SelectContent / SelectGroup / SelectLabel / SelectItem / SelectSeparator (Base UI). MultiSelect 변형 동봉. SelectTrigger 는 그 자체로 button 이라 자식 button 중첩 금지 — 다른 엘리먼트로 바꾸려면 Base UI 의 `render` prop 사용.",
16
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": "날짜 선택 — separate exports: DatePicker / DatePickerTrigger / DatePickerContent / DatePickerCalendar / DatePickerFooter / DateRangePicker + useDatePicker 훅 (Base UI). DatePickerTrigger 는 자체로 `<button>` — 다른 엘리먼트로 슬롯하려면 `render` prop 사용.",
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
21
  "popover": "floating 팝오버 — separate exports: Popover / PopoverTrigger / PopoverClose / PopoverContent / PopoverTitle / PopoverDescription (Base UI). PopoverTrigger·PopoverClose 는 자체로 `<button>` — 자식으로 button 중첩 금지, 다른 엘리먼트로 슬롯하려면 `render` prop 사용.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.64.2",
3
+ "version": "0.64.3",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {