sh-ui-cli 0.64.2 → 0.64.4

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 (25) hide show
  1. package/data/changelog/versions.json +24 -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/flutter.json +15 -15
  24. package/data/summaries/react.json +1 -1
  25. 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.4",
7
+ "date": "2026-05-08",
8
+ "title": "patch — Flutter summary 16건 정확성 audit",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**사실관계 정정 6건** — `card`/`dialog` 의 'header/body/footer named slot' (실제는 separate widget, Body 가 아니라 Content), `dialog` 의 'showDialog 로 호출' (실제는 `ShUiDialog.show<T>()` static, Flutter 빌트인 `showDialog` 와 다름), `checkbox` 의 'tristate' (실제 prop 은 `indeterminate`), `toast` 의 'ShUiToastOverlay' (실재 X — `ShUiToaster` + `ShUiToast.show()`), `tabs` 의 'ShUiTabsController' (실재 X — `ShUiTabs` + `ShUiTab` 데이터).",
12
+ "**exports 명시 보강 10건** — select/combobox 의 Multi 변종 (`ShUiMultiSelect<T>`, `ShUiMultiCombobox<T>`), date-picker 의 `ShUiDateRangePicker`, dropdown-menu 의 sealed `ShUiDropdownMenuEntry<T>` 자식들 (Item / CheckboxItem / RadioItem / Divider / Label), menubar 의 `ShUiMenubarMenu`, sidebar 의 Provider/Trigger/Header/Footer/Inset + `.of(ctx)` 패턴, app-shell 의 `ShUiAppShellGroup`/`Item`, header 의 `ShUiHeaderItem`, breadcrumb 의 `ShUiBreadcrumbItem`, popover 의 Title/Description, checkbox 의 `ShUiCheckboxGroup`. v0.64.1·v0.64.2 의 React audit 과 동일 톤으로 통일.",
13
+ "**MCP 양 플랫폼 정보 일관성 마무리** — React (v0.64.1·v0.64.2·v0.64.3) + Flutter (이번) 모두 source-of-truth 정확도 확보. AI 가 sh-ui MCP 로 컴포넌트 요청 시 환각으로 잘못된 위젯명·prop·호출 패턴을 만들어 내던 실패 모드 해소."
14
+ ],
15
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.64.4"
16
+ },
17
+ {
18
+ "version": "0.64.3",
19
+ "date": "2026-05-08",
20
+ "title": "patch — Trigger·Close 컴포넌트 7종 소스 JSDoc 에 render-prop 함정 명시",
21
+ "type": "patch",
22
+ "highlights": [
23
+ "**컴포넌트 소스 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\" 패턴을 일관 톤으로 박음.",
24
+ "**`render` 와 `children` 패턴 구분 명시** — date-picker 의 DatePickerTrigger 는 sh-ui 자체 `<button>` 이라 Base UI 의 `render` prop 이 아닌 `children` 함수 패턴(value/formatted/placeholder 인자) + `className` 직접 스타일링이 정석. 이 차이를 JSDoc + summary 양쪽에 명시.",
25
+ "**plain / tailwind / vanilla-extract / module 4 변종 + apps/docs 듀얼카피본 모두 동기화** — 28 파일. v0.64.1·v0.64.2 의 summary 정정과 합쳐 AI 가 쓸 수 있는 모든 정보 채널(MCP list/get, llms.txt, 설치 후 IDE 호버) 에서 동일한 가이드 노출."
26
+ ],
27
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.64.3"
28
+ },
5
29
  {
6
30
  "version": "0.64.2",
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를 여는 트리거 버튼. 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 }
@@ -3,34 +3,34 @@
3
3
  "summaries": {
4
4
  "tokens": "ShUiTheme (ThemeExtension) — 색상/간격/타이포/반경/지속시간 토큰. Theme.of(ctx).extension<ShUiTheme>()로 접근.",
5
5
  "button": "ShUiButton — variant(primary/secondary/ghost/danger/link) + size(sm/md/lg).",
6
- "card": "ShUiCard — header/body/footer named slot.",
6
+ "card": "ShUiCard — separate widgets: ShUiCard / ShUiCardHeader / ShUiCardTitle / ShUiCardDescription / ShUiCardContent / ShUiCardFooter (named slot 아님, Body 가 아니라 Content).",
7
7
  "input": "ShUiInput — TextField 래퍼 + sh-ui 토큰 스타일.",
8
8
  "textarea": "ShUiTextarea — 다중 행 입력.",
9
9
  "label": "ShUiLabel — 폼 레이블.",
10
- "checkbox": "ShUiCheckbox — tristate 지원.",
10
+ "checkbox": "ShUiCheckbox / ShUiCheckboxGroup `indeterminate` prop 으로 중간 상태 (Material 의 `tristate` 아님).",
11
11
  "radio": "ShUiRadio / ShUiRadioGroup — 단일 선택.",
12
12
  "switch": "ShUiSwitch — 토글 스위치.",
13
13
  "toggle": "ShUiToggle — 프레스 상태 유지 버튼.",
14
14
  "slider": "ShUiSlider — 단일 값, step.",
15
- "select": "ShUiSelect 네이티브 대체 드롭다운 셀렉트.",
16
- "combobox": "ShUiCombobox — 검색 가능 셀렉트.",
17
- "date-picker": "ShUiDatePicker — 캘린더 팝업.",
15
+ "select": "ShUiSelect<T> + ShUiSelectItem<T> / ShUiSelectGroup / ShUiSelectSeparator (모두 ShUiSelectElement). 다중 선택은 ShUiMultiSelect<T>.",
16
+ "combobox": "ShUiCombobox<T> + ShUiComboboxItem<T> — 검색 가능 셀렉트. 다중 선택은 ShUiMultiCombobox<T>.",
17
+ "date-picker": "ShUiDatePicker (단일) + ShUiDateRangePicker (범위) — 캘린더 팝업.",
18
18
  "color-picker": "ShUiColorPicker — 색상 선택.",
19
19
  "file-upload": "ShUiFileUpload — 파일 선택/드롭.",
20
- "dialog": "ShUiDialog header/body/footer named slot, showDialog 호출.",
21
- "popover": "ShUiPopover — 트리거 기준 오버레이.",
20
+ "dialog": "ShUiDialog + ShUiDialogTrigger / ShUiDialogContent / ShUiDialogHeader 분리 위젯. 명령형 호출은 `ShUiDialog.show<T>(...)` static (Flutter 빌트인 `showDialog` 아님).",
21
+ "popover": "ShUiPopover + ShUiPopoverTitle / ShUiPopoverDescription — 트리거 기준 오버레이.",
22
22
  "tooltip": "ShUiTooltip — long-press / hover 힌트.",
23
- "toast": "ShUiToastShUiToastOverlay로 스택 관리.",
24
- "dropdown-menu": "ShUiDropdownMenu 트리거 기준 메뉴.",
23
+ "toast": "임시 알림 `ShUiToast.show(ctx, ...)` static (또는 `.success` / `.danger` / `.warning`) + `ShUiToaster` 위젯 (앱 루트에 배치, 스택 관리). `ShUiToastOverlay` 클래스 아님.",
24
+ "dropdown-menu": "ShUiDropdownMenu<T> + ShUiDropdownMenuItem<T> / ShUiDropdownMenuCheckboxItem<T> / ShUiDropdownMenuRadioItem<T> / ShUiDropdownMenuDivider<T> / ShUiDropdownMenuLabel<T> (모두 ShUiDropdownMenuEntry<T> 의 sealed 자식).",
25
25
  "context-menu": "ShUiContextMenu — 길게 누르기/우클릭 메뉴.",
26
- "menubar": "ShUiMenubar — 수평 메뉴바.",
27
- "tabs": "ShUiTabs / ShUiTabsController — 탭 내비.",
26
+ "menubar": "ShUiMenubar + ShUiMenubarMenu — 수평 메뉴바, 각 ShUiMenubarMenu 가 하나의 드롭다운.",
27
+ "tabs": "ShUiTabs + ShUiTab (data class) — 탭 내비. `ShUiTabsController` 클래스 아님.",
28
28
  "accordion": "ShUiAccordion — 펼침/접힘. single/multiple.",
29
29
  "carousel": "ShUiCarousel — PageView 기반, autoplay/dots.",
30
- "sidebar": "ShUiSidebar 접이식 사이드바.",
31
- "app-shell": "ShUiAppShell — 사이드바 + 상단 바 + 본문 레이아웃.",
32
- "header": "ShUiHeader — 로고/네비/액션 영역.",
33
- "breadcrumb": "ShUiBreadcrumb(items: [...]) — items 기반 경로 내비.",
30
+ "sidebar": "ShUiSidebar + ShUiSidebarProvider (앱 루트, 접힘 상태 보유) / ShUiSidebarTrigger / ShUiSidebarHeader / ShUiSidebarFooter / ShUiSidebarInset (본문 영역). 자식에서 상태 접근은 `ShUiSidebar.of(context)`.",
31
+ "app-shell": "ShUiAppShell — 사이드바 + 상단 바 + 본문 레이아웃. nav 항목은 `ShUiAppShellItem` (label/icon/route 등) 을 `ShUiAppShellGroup` 에 묶어 전달.",
32
+ "header": "ShUiHeader — 로고/네비/액션 영역. nav 항목은 `ShUiHeaderItem` (label/route/onTap 등) 을 items 에 전달.",
33
+ "breadcrumb": "ShUiBreadcrumb(items: [...]) — items 기반 경로 내비. items 원소는 `ShUiBreadcrumbItem` 위젯.",
34
34
  "pagination": "ShUiPagination(page:, pageCount:, siblingCount:, onPageChanged:) — 페이지 범위 계산 내장.",
35
35
  "avatar": "ShUiAvatar — 이미지/initials fallback.",
36
36
  "badge": "ShUiBadge — 상태 뱃지.",
@@ -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.4",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {