@mondrianai/runyourai-design-system 0.0.24 → 0.0.26

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/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React$1 from 'react';
2
2
  import React__default, { ReactNode } from 'react';
3
- import { Accordion as Accordion$1, AlertDialog as AlertDialog$1, Checkbox as Checkbox$1, Collapsible as Collapsible$1, Menubar as Menubar$1, Slider as Slider$1, Switch as Switch$1, Tooltip as Tooltip$1, Popover as Popover$1 } from 'radix-ui';
3
+ import { Accordion as Accordion$1, AlertDialog as AlertDialog$1, Checkbox as Checkbox$1, Collapsible as Collapsible$1, Menubar as Menubar$1, Slider as Slider$1, Toggle as Toggle$1, Switch as Switch$1, Tooltip as Tooltip$1, Popover as Popover$1 } from 'radix-ui';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
6
  import { VariantProps } from 'class-variance-authority';
@@ -132,7 +132,12 @@ interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, V
132
132
  */
133
133
  iconEnd?: React$1.ReactNode;
134
134
  }
135
- declare function Button({ className, variant, size, asChild, loading, iconStart, iconEnd, disabled, children, ...props }: ButtonProps): react_jsx_runtime.JSX.Element;
135
+ /**
136
+ * ref를 받는 이유 — Popover/Tooltip/Drawer/Modal 등 DS 컴포넌트가 트리거를 Radix `asChild`(Slot)로
137
+ * 렌더하고, Slot은 자식에 ref를 붙인다. peerDependencies가 react>=18이라 React 19의 ref-as-prop에
138
+ * 기댈 수 없으므로 forwardRef가 필요하다. (React 18에서는 없으면 ref 경고와 함께 위치 계산이 깨진다)
139
+ */
140
+ declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
136
141
 
137
142
  declare function Card({ className, ...props }: React$1.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
138
143
  declare function CardHeader({ className, ...props }: React$1.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
@@ -534,8 +539,13 @@ interface IconProps extends React$1.SVGProps<SVGSVGElement> {
534
539
  * Inline SVG icon component.
535
540
  * Uses `stroke="currentColor"` so color is controlled via CSS `text-*` classes.
536
541
  * Renders the same paths as lucide-react but without the library dependency.
542
+ *
543
+ * ref를 받는 이유 — Tooltip/Popover/Drawer 등이 트리거를 Radix `asChild`(Slot)로 렌더하고,
544
+ * Slot은 자식에 ref를 붙인다. peerDependencies가 react>=18이라 React 19의 ref-as-prop에
545
+ * 기댈 수 없으므로 forwardRef가 필요하다. (React 18에서는 ref가 죽어 Popper가 앵커를 잡지
546
+ * 못하고, 툴팁이 열려도 화면 밖에 머문다)
537
547
  */
538
- declare function Icon({ name, className, strokeWidth, ...props }: IconProps): react_jsx_runtime.JSX.Element | null;
548
+ declare const Icon: React$1.ForwardRefExoticComponent<Omit<IconProps, "ref"> & React$1.RefAttributes<SVGSVGElement>>;
539
549
 
540
550
  declare function Input({ className, type, ...props }: React$1.ComponentProps<"input">): react_jsx_runtime.JSX.Element;
541
551
 
@@ -717,6 +727,10 @@ interface ProgressProps {
717
727
  tooltip?: string;
718
728
  className?: string;
719
729
  }
730
+ /**
731
+ * 진행률 바 — Radix Progress 기반(role=progressbar, aria-valuenow/valuemin/valuemax).
732
+ * warning/danger 임계값 색상, tooltip 지원.
733
+ */
720
734
  declare function Progress({ value, warning, danger, tooltip, className, }: ProgressProps): react_jsx_runtime.JSX.Element;
721
735
 
722
736
  interface Item<T extends string> {
@@ -727,8 +741,18 @@ interface SegmentedControlProps<T extends string> {
727
741
  value: T;
728
742
  onChange: (value: T) => void;
729
743
  items: readonly Item<T>[];
744
+ /**
745
+ * true면 컨테이너를 w-full로 펼치고 각 세그먼트를 균등분할(flex-1)한다.
746
+ * 기본 false — 콘텐츠 폭(각 세그먼트가 라벨 길이에 맞춰짐).
747
+ */
748
+ block?: boolean;
749
+ className?: string;
730
750
  }
731
- declare function SegmentedControl<T extends string>({ value, onChange, items, }: SegmentedControlProps<T>): react_jsx_runtime.JSX.Element;
751
+ /**
752
+ * 세그먼트 컨트롤(값/필터 선택) — Tabs `variant="pill"`과 동일 스타일.
753
+ * 균등분할이 필요하면 `block`. 라벨이 칸보다 길면 말줄임되고, 그 경우에만 hover 시 툴팁으로 전체 표시.
754
+ */
755
+ declare function SegmentedControl<T extends string>({ value, onChange, items, block, className, }: SegmentedControlProps<T>): react_jsx_runtime.JSX.Element;
732
756
 
733
757
  interface SearchInputProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'type'> {
734
758
  value: string;
@@ -882,7 +906,7 @@ declare function SidebarLink({ href, className, style, onClick, children, }: {
882
906
  onClick?: () => void;
883
907
  children: React$1.ReactNode;
884
908
  }): React$1.ReactElement<unknown, string | React$1.JSXElementConstructor<any>>;
885
- declare function Sidebar({ logo, menus, avatar, utilities, panelTopContent, panelCenterContent, panelBottomContent, className, LinkComponent, isPanelOpen: isPanelOpenProp, onPanelOpenChange, mainMenuIconSize, }: {
909
+ declare function Sidebar({ logo, menus, avatar, utilities, panelTopContent, panelCenterContent, panelBottomContent, className, LinkComponent, isPanelOpen: isPanelOpenProp, onPanelOpenChange, mainMenuIconSize, labels, }: {
886
910
  logo: React$1.ReactNode;
887
911
  menus: SidebarMainMenuItem[];
888
912
  avatar: React$1.ReactNode;
@@ -906,6 +930,20 @@ declare function Sidebar({ logo, menus, avatar, utilities, panelTopContent, pane
906
930
  * - `'lg'`: 40px
907
931
  */
908
932
  mainMenuIconSize?: 'md' | 'lg';
933
+ /**
934
+ * 접근성 이름 — 스크린 리더에만 노출되는 문자열이라 화면에는 보이지 않는다.
935
+ * 미지정 시 한국어 기본값을 쓰므로, 다국어 앱은 번역된 문자열을 넘긴다.
936
+ */
937
+ labels?: {
938
+ /** 사이드바 전체(landmark). 기본값 '사이드바' */
939
+ sidebar?: string;
940
+ /** 좌측 서비스 내비게이터. 기본값 '메인 메뉴' */
941
+ mainMenu?: string;
942
+ /** 서브 메뉴 패널. 기본값은 활성 메뉴 제목 */
943
+ panel?: string;
944
+ /** 패널 닫기 버튼. 기본값 '패널 닫기' */
945
+ panelClose?: string;
946
+ };
909
947
  }): react_jsx_runtime.JSX.Element;
910
948
 
911
949
  interface SkeletonProps extends React$1.HTMLAttributes<HTMLDivElement> {
@@ -948,51 +986,71 @@ interface TabsProps<T extends string = string> {
948
986
  allTabs: TabItem<T>[];
949
987
  current: T;
950
988
  onTabChange: (value: T) => void;
951
- /**
952
- * "pill" — 회색 배경 컨테이너 + 흰 배경 active (segment control 스타일)
953
- * "underline" — 하단 밑줄 active (default)
954
- */
955
- variant?: 'pill' | 'underline';
956
989
  /** 컨테이너를 w-full로 펼치고 각 탭 버튼을 균등 분할(flex-1)합니다 */
957
990
  block?: boolean;
958
- /** Tailwind height 클래스 (e.g. "h-[36px]"). 지정 시 내부 버튼 패딩도 자동 조정됩니다. */
959
- height?: string;
960
991
  className?: string;
961
992
  }
962
993
  /**
963
- * 디자인 시스템에서는 동일 뷰의 데이터 전환을 위해 ToggleGroup 대신 Tabs를 사용합니다.
964
- * Tabs의 원래 목적으로도 사용하며, 한 화면에 두 가지의 의미로 Tabs를 사용하지 않습니다.
994
+ * 하단 밑줄(underline) 탭 — 서로 다른 콘텐츠 영역 전환(진짜 탭).
995
+ * Radix Tabs 기반: role=tablist/tab, roving tabindex, ←/→ 키보드,
996
+ * `activationMode="manual"`(화살표는 포커스만, 클릭/Enter/Space로 활성화).
997
+ *
998
+ * 세그먼트/값·필터 선택(구 `variant="pill"`)은 SegmentedControl을 사용한다.
999
+ *
1000
+ * NOTE: 콘텐츠 패널은 사용처가 바깥에서 `current`로 렌더하므로 Tabs.Content(및 aria-controls↔
1001
+ * aria-labelledby 연결)가 없다. 키보드·역할 a11y는 확보했으나 탭↔패널 연결은 미완.
1002
+ * 구 pill 사용처 이관 및 릴리스 체크리스트: docs/todo/tabs-segmented-control.md
965
1003
  */
966
- declare function Tabs<T extends string = string>({ allTabs, current, onTabChange, variant, block, height, className, }: TabsProps<T>): react_jsx_runtime.JSX.Element;
1004
+ declare function Tabs<T extends string = string>({ allTabs, current, onTabChange, block, className, }: TabsProps<T>): react_jsx_runtime.JSX.Element;
967
1005
 
968
- interface ToggleProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {
969
- pressed?: boolean;
970
- onPressedChange?: (pressed: boolean) => void;
971
- size?: 'sm' | 'md' | 'lg';
972
- }
1006
+ /**
1007
+ * 좌우 여백은 아이콘 단독 사용 시 정사각(min-w)을 유지하도록 좁게 둔다.
1008
+ * 라벨을 함께 두는 그룹(ToggleGroup)은 자체 여백을 쓴다.
1009
+ */
973
1010
  declare const toggleSizeClasses: {
974
- readonly sm: "h-7 min-w-7 px-1.5 text-sm";
1011
+ readonly sm: "h-7 min-w-7 px-1.5 text-xs";
975
1012
  readonly md: "h-9 min-w-9 px-2 text-sm";
976
1013
  readonly lg: "h-10 min-w-10 px-2.5 text-base";
977
1014
  };
978
1015
  declare const toggleBaseClasses = "inline-flex items-center justify-center gap-1.5 font-medium tracking-tight transition-colors select-none";
979
- declare function Toggle({ pressed, onPressedChange, size, disabled, className, children, ...props }: ToggleProps): react_jsx_runtime.JSX.Element;
1016
+ interface ToggleProps extends Omit<React$1.ComponentPropsWithoutRef<typeof Toggle$1.Root>, 'asChild'> {
1017
+ size?: 'sm' | 'md' | 'lg';
1018
+ }
1019
+ /**
1020
+ * 두 상태(on/off) 토글 버튼 — Radix Toggle 기반(aria-pressed, data-state=on/off, Space/Enter 키보드).
1021
+ * `pressed`/`onPressedChange`로 제어한다.
1022
+ */
1023
+ declare function Toggle({ size, className, ...props }: ToggleProps): react_jsx_runtime.JSX.Element;
980
1024
 
981
1025
  interface ToggleGroupItemData<T extends string = string> {
982
1026
  value: T;
983
- children: React.ReactNode;
1027
+ children: React$1.ReactNode;
984
1028
  disabled?: boolean;
985
1029
  }
986
1030
  interface ToggleGroupBaseProps<T extends string = string> {
987
1031
  items: ToggleGroupItemData<T>[];
988
1032
  /**
989
- * outlined — 컨테이너 border + 아이템 사이 divider (default)
990
- * noBorder — border 없음, 아이템마다 rounded-md 독립 적용
1033
+ * bordered — 컨테이너 border + 아이템 사이 divider (default)
1034
+ * noBorder — border 없이 붙은 묶음
1035
+ * chip — 아이템이 독립 알약(rounded-full)으로 떨어지고, 폭이 모자라면 줄바꿈된다
1036
+ */
1037
+ variant?: 'bordered' | 'noBorder' | 'chip';
1038
+ /**
1039
+ * 선택된 항목에 쓸 Button variant. 기본 'outline'(흰 배경 + 테두리).
1040
+ * 선택되지 않은 항목은 'secondary'(연회색 배경)로 고정이라, 선택된 쪽이 배경에서 떠 보인다.
1041
+ * 더 강한 강조가 필요하면 'primary'를 넘긴다.
991
1042
  */
992
- variant?: 'bordered' | 'noBorder';
1043
+ selectedStyle?: ButtonProps['variant'];
993
1044
  disabled?: boolean;
994
1045
  size?: 'sm' | 'md' | 'lg';
995
1046
  className?: string;
1047
+ /**
1048
+ * 그룹(radiogroup/group)의 접근성 이름. 화면에 보이는 제목이 따로 없다면 반드시 지정한다.
1049
+ * 보이는 제목이 있으면 `aria-labelledby`로 그 요소를 가리키는 편이 낫다.
1050
+ */
1051
+ 'aria-label'?: string;
1052
+ /** 그룹의 접근성 이름을 다른 요소에서 가져올 때 쓴다(`aria-label`보다 우선). */
1053
+ 'aria-labelledby'?: string;
996
1054
  }
997
1055
  interface ToggleGroupSingleProps<T extends string = string> extends ToggleGroupBaseProps<T> {
998
1056
  type?: 'single';
@@ -1005,7 +1063,16 @@ interface ToggleGroupMultipleProps<T extends string = string> extends ToggleGrou
1005
1063
  onValueChange?: (value: T[]) => void;
1006
1064
  }
1007
1065
  type ToggleGroupProps<T extends string = string> = ToggleGroupSingleProps<T> | ToggleGroupMultipleProps<T>;
1008
- declare function ToggleGroup<T extends string = string>({ items, variant, disabled, size, className, ...rest }: ToggleGroupProps<T>): react_jsx_runtime.JSX.Element;
1066
+ /**
1067
+ * 여러 항목 중 하나(single) 또는 여럿(multiple)을 고르는 버튼 그룹.
1068
+ * 항목은 DS Button으로 렌더링되므로 색/상태 스타일이 버튼과 일관된다.
1069
+ *
1070
+ * 선택 방식에 따라 역할이 달라진다 (WAI-ARIA APG).
1071
+ * - single — 상호배타 선택이므로 `radiogroup`/`radio`. 그룹 전체가 탭 스톱 하나이고
1072
+ * 좌우/상하 화살표로 이동하며 이동과 동시에 선택된다.
1073
+ * - multiple — 각각 독립 on/off이므로 `aria-pressed` 토글 버튼 묶음.
1074
+ */
1075
+ declare function ToggleGroup<T extends string = string>({ items, variant, selectedStyle, disabled, size, className, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...rest }: ToggleGroupProps<T>): react_jsx_runtime.JSX.Element;
1009
1076
 
1010
1077
  interface CircleIndicatorProps {
1011
1078
  /** 사용량 (바이트 또는 임의 단위) */
@@ -1256,9 +1323,20 @@ interface TooltipWithIconProps {
1256
1323
  content: string;
1257
1324
  /** 트리거 아이콘 이름 (Lucide). @default "info" */
1258
1325
  iconName?: string;
1326
+ /**
1327
+ * 트리거 버튼의 접근성 이름. 기본값은 `content`다.
1328
+ * 기본값이면 스크린 리더가 이름과 설명으로 같은 문장을 두 번 읽으므로,
1329
+ * 다국어 앱은 '도움말' 같은 짧은 번역 문자열을 넘기는 편이 낫다.
1330
+ */
1331
+ triggerLabel?: string;
1332
+ /** 트리거 버튼에 적용된다(크기·색). 아이콘은 버튼 크기를 채운다. */
1259
1333
  className?: string;
1260
1334
  }
1261
- declare function TooltipWithIcon({ content, iconName, className, }: TooltipWithIconProps): react_jsx_runtime.JSX.Element | null;
1335
+ /**
1336
+ * 트리거를 `<button>`으로 두는 이유 — 아이콘(svg)은 `aria-hidden`이고 탭 순서에도 없어
1337
+ * 트리거로 쓰면 키보드·스크린 리더 사용자가 툴팁에 도달할 수 없다.
1338
+ */
1339
+ declare function TooltipWithIcon({ content, iconName, triggerLabel, className, }: TooltipWithIconProps): react_jsx_runtime.JSX.Element | null;
1262
1340
 
1263
1341
  /**
1264
1342
  * 사용자 메시지 말풍선.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React$1 from 'react';
2
2
  import React__default, { ReactNode } from 'react';
3
- import { Accordion as Accordion$1, AlertDialog as AlertDialog$1, Checkbox as Checkbox$1, Collapsible as Collapsible$1, Menubar as Menubar$1, Slider as Slider$1, Switch as Switch$1, Tooltip as Tooltip$1, Popover as Popover$1 } from 'radix-ui';
3
+ import { Accordion as Accordion$1, AlertDialog as AlertDialog$1, Checkbox as Checkbox$1, Collapsible as Collapsible$1, Menubar as Menubar$1, Slider as Slider$1, Toggle as Toggle$1, Switch as Switch$1, Tooltip as Tooltip$1, Popover as Popover$1 } from 'radix-ui';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
6
  import { VariantProps } from 'class-variance-authority';
@@ -132,7 +132,12 @@ interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, V
132
132
  */
133
133
  iconEnd?: React$1.ReactNode;
134
134
  }
135
- declare function Button({ className, variant, size, asChild, loading, iconStart, iconEnd, disabled, children, ...props }: ButtonProps): react_jsx_runtime.JSX.Element;
135
+ /**
136
+ * ref를 받는 이유 — Popover/Tooltip/Drawer/Modal 등 DS 컴포넌트가 트리거를 Radix `asChild`(Slot)로
137
+ * 렌더하고, Slot은 자식에 ref를 붙인다. peerDependencies가 react>=18이라 React 19의 ref-as-prop에
138
+ * 기댈 수 없으므로 forwardRef가 필요하다. (React 18에서는 없으면 ref 경고와 함께 위치 계산이 깨진다)
139
+ */
140
+ declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
136
141
 
137
142
  declare function Card({ className, ...props }: React$1.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
138
143
  declare function CardHeader({ className, ...props }: React$1.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
@@ -534,8 +539,13 @@ interface IconProps extends React$1.SVGProps<SVGSVGElement> {
534
539
  * Inline SVG icon component.
535
540
  * Uses `stroke="currentColor"` so color is controlled via CSS `text-*` classes.
536
541
  * Renders the same paths as lucide-react but without the library dependency.
542
+ *
543
+ * ref를 받는 이유 — Tooltip/Popover/Drawer 등이 트리거를 Radix `asChild`(Slot)로 렌더하고,
544
+ * Slot은 자식에 ref를 붙인다. peerDependencies가 react>=18이라 React 19의 ref-as-prop에
545
+ * 기댈 수 없으므로 forwardRef가 필요하다. (React 18에서는 ref가 죽어 Popper가 앵커를 잡지
546
+ * 못하고, 툴팁이 열려도 화면 밖에 머문다)
537
547
  */
538
- declare function Icon({ name, className, strokeWidth, ...props }: IconProps): react_jsx_runtime.JSX.Element | null;
548
+ declare const Icon: React$1.ForwardRefExoticComponent<Omit<IconProps, "ref"> & React$1.RefAttributes<SVGSVGElement>>;
539
549
 
540
550
  declare function Input({ className, type, ...props }: React$1.ComponentProps<"input">): react_jsx_runtime.JSX.Element;
541
551
 
@@ -717,6 +727,10 @@ interface ProgressProps {
717
727
  tooltip?: string;
718
728
  className?: string;
719
729
  }
730
+ /**
731
+ * 진행률 바 — Radix Progress 기반(role=progressbar, aria-valuenow/valuemin/valuemax).
732
+ * warning/danger 임계값 색상, tooltip 지원.
733
+ */
720
734
  declare function Progress({ value, warning, danger, tooltip, className, }: ProgressProps): react_jsx_runtime.JSX.Element;
721
735
 
722
736
  interface Item<T extends string> {
@@ -727,8 +741,18 @@ interface SegmentedControlProps<T extends string> {
727
741
  value: T;
728
742
  onChange: (value: T) => void;
729
743
  items: readonly Item<T>[];
744
+ /**
745
+ * true면 컨테이너를 w-full로 펼치고 각 세그먼트를 균등분할(flex-1)한다.
746
+ * 기본 false — 콘텐츠 폭(각 세그먼트가 라벨 길이에 맞춰짐).
747
+ */
748
+ block?: boolean;
749
+ className?: string;
730
750
  }
731
- declare function SegmentedControl<T extends string>({ value, onChange, items, }: SegmentedControlProps<T>): react_jsx_runtime.JSX.Element;
751
+ /**
752
+ * 세그먼트 컨트롤(값/필터 선택) — Tabs `variant="pill"`과 동일 스타일.
753
+ * 균등분할이 필요하면 `block`. 라벨이 칸보다 길면 말줄임되고, 그 경우에만 hover 시 툴팁으로 전체 표시.
754
+ */
755
+ declare function SegmentedControl<T extends string>({ value, onChange, items, block, className, }: SegmentedControlProps<T>): react_jsx_runtime.JSX.Element;
732
756
 
733
757
  interface SearchInputProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'type'> {
734
758
  value: string;
@@ -882,7 +906,7 @@ declare function SidebarLink({ href, className, style, onClick, children, }: {
882
906
  onClick?: () => void;
883
907
  children: React$1.ReactNode;
884
908
  }): React$1.ReactElement<unknown, string | React$1.JSXElementConstructor<any>>;
885
- declare function Sidebar({ logo, menus, avatar, utilities, panelTopContent, panelCenterContent, panelBottomContent, className, LinkComponent, isPanelOpen: isPanelOpenProp, onPanelOpenChange, mainMenuIconSize, }: {
909
+ declare function Sidebar({ logo, menus, avatar, utilities, panelTopContent, panelCenterContent, panelBottomContent, className, LinkComponent, isPanelOpen: isPanelOpenProp, onPanelOpenChange, mainMenuIconSize, labels, }: {
886
910
  logo: React$1.ReactNode;
887
911
  menus: SidebarMainMenuItem[];
888
912
  avatar: React$1.ReactNode;
@@ -906,6 +930,20 @@ declare function Sidebar({ logo, menus, avatar, utilities, panelTopContent, pane
906
930
  * - `'lg'`: 40px
907
931
  */
908
932
  mainMenuIconSize?: 'md' | 'lg';
933
+ /**
934
+ * 접근성 이름 — 스크린 리더에만 노출되는 문자열이라 화면에는 보이지 않는다.
935
+ * 미지정 시 한국어 기본값을 쓰므로, 다국어 앱은 번역된 문자열을 넘긴다.
936
+ */
937
+ labels?: {
938
+ /** 사이드바 전체(landmark). 기본값 '사이드바' */
939
+ sidebar?: string;
940
+ /** 좌측 서비스 내비게이터. 기본값 '메인 메뉴' */
941
+ mainMenu?: string;
942
+ /** 서브 메뉴 패널. 기본값은 활성 메뉴 제목 */
943
+ panel?: string;
944
+ /** 패널 닫기 버튼. 기본값 '패널 닫기' */
945
+ panelClose?: string;
946
+ };
909
947
  }): react_jsx_runtime.JSX.Element;
910
948
 
911
949
  interface SkeletonProps extends React$1.HTMLAttributes<HTMLDivElement> {
@@ -948,51 +986,71 @@ interface TabsProps<T extends string = string> {
948
986
  allTabs: TabItem<T>[];
949
987
  current: T;
950
988
  onTabChange: (value: T) => void;
951
- /**
952
- * "pill" — 회색 배경 컨테이너 + 흰 배경 active (segment control 스타일)
953
- * "underline" — 하단 밑줄 active (default)
954
- */
955
- variant?: 'pill' | 'underline';
956
989
  /** 컨테이너를 w-full로 펼치고 각 탭 버튼을 균등 분할(flex-1)합니다 */
957
990
  block?: boolean;
958
- /** Tailwind height 클래스 (e.g. "h-[36px]"). 지정 시 내부 버튼 패딩도 자동 조정됩니다. */
959
- height?: string;
960
991
  className?: string;
961
992
  }
962
993
  /**
963
- * 디자인 시스템에서는 동일 뷰의 데이터 전환을 위해 ToggleGroup 대신 Tabs를 사용합니다.
964
- * Tabs의 원래 목적으로도 사용하며, 한 화면에 두 가지의 의미로 Tabs를 사용하지 않습니다.
994
+ * 하단 밑줄(underline) 탭 — 서로 다른 콘텐츠 영역 전환(진짜 탭).
995
+ * Radix Tabs 기반: role=tablist/tab, roving tabindex, ←/→ 키보드,
996
+ * `activationMode="manual"`(화살표는 포커스만, 클릭/Enter/Space로 활성화).
997
+ *
998
+ * 세그먼트/값·필터 선택(구 `variant="pill"`)은 SegmentedControl을 사용한다.
999
+ *
1000
+ * NOTE: 콘텐츠 패널은 사용처가 바깥에서 `current`로 렌더하므로 Tabs.Content(및 aria-controls↔
1001
+ * aria-labelledby 연결)가 없다. 키보드·역할 a11y는 확보했으나 탭↔패널 연결은 미완.
1002
+ * 구 pill 사용처 이관 및 릴리스 체크리스트: docs/todo/tabs-segmented-control.md
965
1003
  */
966
- declare function Tabs<T extends string = string>({ allTabs, current, onTabChange, variant, block, height, className, }: TabsProps<T>): react_jsx_runtime.JSX.Element;
1004
+ declare function Tabs<T extends string = string>({ allTabs, current, onTabChange, block, className, }: TabsProps<T>): react_jsx_runtime.JSX.Element;
967
1005
 
968
- interface ToggleProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {
969
- pressed?: boolean;
970
- onPressedChange?: (pressed: boolean) => void;
971
- size?: 'sm' | 'md' | 'lg';
972
- }
1006
+ /**
1007
+ * 좌우 여백은 아이콘 단독 사용 시 정사각(min-w)을 유지하도록 좁게 둔다.
1008
+ * 라벨을 함께 두는 그룹(ToggleGroup)은 자체 여백을 쓴다.
1009
+ */
973
1010
  declare const toggleSizeClasses: {
974
- readonly sm: "h-7 min-w-7 px-1.5 text-sm";
1011
+ readonly sm: "h-7 min-w-7 px-1.5 text-xs";
975
1012
  readonly md: "h-9 min-w-9 px-2 text-sm";
976
1013
  readonly lg: "h-10 min-w-10 px-2.5 text-base";
977
1014
  };
978
1015
  declare const toggleBaseClasses = "inline-flex items-center justify-center gap-1.5 font-medium tracking-tight transition-colors select-none";
979
- declare function Toggle({ pressed, onPressedChange, size, disabled, className, children, ...props }: ToggleProps): react_jsx_runtime.JSX.Element;
1016
+ interface ToggleProps extends Omit<React$1.ComponentPropsWithoutRef<typeof Toggle$1.Root>, 'asChild'> {
1017
+ size?: 'sm' | 'md' | 'lg';
1018
+ }
1019
+ /**
1020
+ * 두 상태(on/off) 토글 버튼 — Radix Toggle 기반(aria-pressed, data-state=on/off, Space/Enter 키보드).
1021
+ * `pressed`/`onPressedChange`로 제어한다.
1022
+ */
1023
+ declare function Toggle({ size, className, ...props }: ToggleProps): react_jsx_runtime.JSX.Element;
980
1024
 
981
1025
  interface ToggleGroupItemData<T extends string = string> {
982
1026
  value: T;
983
- children: React.ReactNode;
1027
+ children: React$1.ReactNode;
984
1028
  disabled?: boolean;
985
1029
  }
986
1030
  interface ToggleGroupBaseProps<T extends string = string> {
987
1031
  items: ToggleGroupItemData<T>[];
988
1032
  /**
989
- * outlined — 컨테이너 border + 아이템 사이 divider (default)
990
- * noBorder — border 없음, 아이템마다 rounded-md 독립 적용
1033
+ * bordered — 컨테이너 border + 아이템 사이 divider (default)
1034
+ * noBorder — border 없이 붙은 묶음
1035
+ * chip — 아이템이 독립 알약(rounded-full)으로 떨어지고, 폭이 모자라면 줄바꿈된다
1036
+ */
1037
+ variant?: 'bordered' | 'noBorder' | 'chip';
1038
+ /**
1039
+ * 선택된 항목에 쓸 Button variant. 기본 'outline'(흰 배경 + 테두리).
1040
+ * 선택되지 않은 항목은 'secondary'(연회색 배경)로 고정이라, 선택된 쪽이 배경에서 떠 보인다.
1041
+ * 더 강한 강조가 필요하면 'primary'를 넘긴다.
991
1042
  */
992
- variant?: 'bordered' | 'noBorder';
1043
+ selectedStyle?: ButtonProps['variant'];
993
1044
  disabled?: boolean;
994
1045
  size?: 'sm' | 'md' | 'lg';
995
1046
  className?: string;
1047
+ /**
1048
+ * 그룹(radiogroup/group)의 접근성 이름. 화면에 보이는 제목이 따로 없다면 반드시 지정한다.
1049
+ * 보이는 제목이 있으면 `aria-labelledby`로 그 요소를 가리키는 편이 낫다.
1050
+ */
1051
+ 'aria-label'?: string;
1052
+ /** 그룹의 접근성 이름을 다른 요소에서 가져올 때 쓴다(`aria-label`보다 우선). */
1053
+ 'aria-labelledby'?: string;
996
1054
  }
997
1055
  interface ToggleGroupSingleProps<T extends string = string> extends ToggleGroupBaseProps<T> {
998
1056
  type?: 'single';
@@ -1005,7 +1063,16 @@ interface ToggleGroupMultipleProps<T extends string = string> extends ToggleGrou
1005
1063
  onValueChange?: (value: T[]) => void;
1006
1064
  }
1007
1065
  type ToggleGroupProps<T extends string = string> = ToggleGroupSingleProps<T> | ToggleGroupMultipleProps<T>;
1008
- declare function ToggleGroup<T extends string = string>({ items, variant, disabled, size, className, ...rest }: ToggleGroupProps<T>): react_jsx_runtime.JSX.Element;
1066
+ /**
1067
+ * 여러 항목 중 하나(single) 또는 여럿(multiple)을 고르는 버튼 그룹.
1068
+ * 항목은 DS Button으로 렌더링되므로 색/상태 스타일이 버튼과 일관된다.
1069
+ *
1070
+ * 선택 방식에 따라 역할이 달라진다 (WAI-ARIA APG).
1071
+ * - single — 상호배타 선택이므로 `radiogroup`/`radio`. 그룹 전체가 탭 스톱 하나이고
1072
+ * 좌우/상하 화살표로 이동하며 이동과 동시에 선택된다.
1073
+ * - multiple — 각각 독립 on/off이므로 `aria-pressed` 토글 버튼 묶음.
1074
+ */
1075
+ declare function ToggleGroup<T extends string = string>({ items, variant, selectedStyle, disabled, size, className, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...rest }: ToggleGroupProps<T>): react_jsx_runtime.JSX.Element;
1009
1076
 
1010
1077
  interface CircleIndicatorProps {
1011
1078
  /** 사용량 (바이트 또는 임의 단위) */
@@ -1256,9 +1323,20 @@ interface TooltipWithIconProps {
1256
1323
  content: string;
1257
1324
  /** 트리거 아이콘 이름 (Lucide). @default "info" */
1258
1325
  iconName?: string;
1326
+ /**
1327
+ * 트리거 버튼의 접근성 이름. 기본값은 `content`다.
1328
+ * 기본값이면 스크린 리더가 이름과 설명으로 같은 문장을 두 번 읽으므로,
1329
+ * 다국어 앱은 '도움말' 같은 짧은 번역 문자열을 넘기는 편이 낫다.
1330
+ */
1331
+ triggerLabel?: string;
1332
+ /** 트리거 버튼에 적용된다(크기·색). 아이콘은 버튼 크기를 채운다. */
1259
1333
  className?: string;
1260
1334
  }
1261
- declare function TooltipWithIcon({ content, iconName, className, }: TooltipWithIconProps): react_jsx_runtime.JSX.Element | null;
1335
+ /**
1336
+ * 트리거를 `<button>`으로 두는 이유 — 아이콘(svg)은 `aria-hidden`이고 탭 순서에도 없어
1337
+ * 트리거로 쓰면 키보드·스크린 리더 사용자가 툴팁에 도달할 수 없다.
1338
+ */
1339
+ declare function TooltipWithIcon({ content, iconName, triggerLabel, className, }: TooltipWithIconProps): react_jsx_runtime.JSX.Element | null;
1262
1340
 
1263
1341
  /**
1264
1342
  * 사용자 메시지 말풍선.