@bigtablet/design-system 3.4.0 → 3.5.0

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.css CHANGED
@@ -1634,7 +1634,6 @@
1634
1634
  .tooltip_position {
1635
1635
  position: absolute;
1636
1636
  z-index: 1000;
1637
- pointer-events: none;
1638
1637
  display: block;
1639
1638
  width: max-content;
1640
1639
  }
@@ -1696,6 +1695,7 @@
1696
1695
  cursor: pointer;
1697
1696
  overflow: hidden;
1698
1697
  white-space: nowrap;
1698
+ text-decoration: none;
1699
1699
  font-size: 14px;
1700
1700
  font-weight: 500;
1701
1701
  line-height: 20px;
@@ -1722,6 +1722,11 @@
1722
1722
  .button:disabled {
1723
1723
  cursor: not-allowed;
1724
1724
  }
1725
+ .button_disabled {
1726
+ cursor: not-allowed;
1727
+ opacity: 0.38;
1728
+ pointer-events: none;
1729
+ }
1725
1730
  .button_size_sm {
1726
1731
  min-height: 32px;
1727
1732
  }
@@ -4507,6 +4512,17 @@
4507
4512
  border-radius: 8px;
4508
4513
  background: var(--bt-color-bg-solid);
4509
4514
  }
4515
+ .table_sr_only {
4516
+ position: absolute;
4517
+ width: 1px;
4518
+ height: 1px;
4519
+ padding: 0;
4520
+ margin: -1px;
4521
+ overflow: hidden;
4522
+ clip: rect(0, 0, 0, 0);
4523
+ white-space: nowrap;
4524
+ border: 0;
4525
+ }
4510
4526
  .table {
4511
4527
  width: 100%;
4512
4528
  border-collapse: collapse;
@@ -5039,6 +5055,14 @@
5039
5055
  width: 0%;
5040
5056
  }
5041
5057
  }
5058
+ @keyframes toast_progress_reduced {
5059
+ from {
5060
+ width: 0;
5061
+ }
5062
+ to {
5063
+ width: 0;
5064
+ }
5065
+ }
5042
5066
  .toast_container {
5043
5067
  position: fixed;
5044
5068
  top: 16px;
@@ -5175,6 +5199,16 @@
5175
5199
  .toast_progress_default {
5176
5200
  background: var(--bt-color-text-body);
5177
5201
  }
5202
+ .toast_item:hover .toast_progress,
5203
+ .toast_item:focus-within .toast_progress {
5204
+ animation-play-state: paused;
5205
+ }
5206
+ @media (prefers-reduced-motion: reduce) {
5207
+ .toast_progress {
5208
+ animation-name: toast_progress_reduced;
5209
+ width: 0;
5210
+ }
5211
+ }
5178
5212
 
5179
5213
  /* src/ui/forms/toggle/style.scss */
5180
5214
  @keyframes skeleton_loading {
package/dist/index.d.ts CHANGED
@@ -544,7 +544,7 @@ interface TabProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>,
544
544
  /** 이 tab의 value */
545
545
  value: string;
546
546
  }
547
- declare const Tab: ({ value, className, children, onClick, ...props }: TabProps) => React$1.JSX.Element;
547
+ declare const Tab: ({ value, className, children, onClick, onKeyDown, ...props }: TabProps) => React$1.JSX.Element;
548
548
  interface TabPanelProps extends React$1.HTMLAttributes<HTMLDivElement> {
549
549
  /** 이 panel을 활성화할 tab의 value */
550
550
  value: string;
@@ -1119,6 +1119,11 @@ interface AlertOptions {
1119
1119
  onConfirm?: () => void;
1120
1120
  /** 취소 버튼 클릭 시 호출되는 콜백 */
1121
1121
  onCancel?: () => void;
1122
+ /**
1123
+ * 오버레이 클릭으로 닫기 허용 여부 (기본값: true).
1124
+ * destructive 확인처럼 실수 닫힘을 막아야 하면 false 로.
1125
+ */
1126
+ closeOnOverlay?: boolean;
1122
1127
  }
1123
1128
  interface AlertContextValue {
1124
1129
  showAlert: (options: AlertOptions) => void;
@@ -1130,7 +1135,8 @@ declare const AlertProvider: React$1.FC<{
1130
1135
 
1131
1136
  type ButtonVariant = "filled" | "tonal" | "outline" | "text";
1132
1137
  type ButtonSize = "sm" | "md" | "lg" | "xl";
1133
- interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
1138
+ /** button/anchor 공통 스타일·콘텐츠 props */
1139
+ interface ButtonBaseProps {
1134
1140
  /** 버튼 스타일 변형 (기본값: "filled") */
1135
1141
  variant?: ButtonVariant;
1136
1142
  /** 버튼 크기 (기본값: "md") */
@@ -1148,16 +1154,43 @@ interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
1148
1154
  * filled: 빨간 bg, outline: 빨간 텍스트/border, tonal: 빨간 wash.
1149
1155
  */
1150
1156
  danger?: boolean;
1157
+ /**
1158
+ * 비활성화. button 은 native `disabled`, anchor 는 `aria-disabled`+`tabIndex=-1`+
1159
+ * 클릭 차단으로 처리(anchor 엔 native disabled 가 없으므로).
1160
+ */
1161
+ disabled?: boolean;
1162
+ }
1163
+ /** `<button>` 으로 렌더링 (기본) */
1164
+ interface ButtonAsButton extends ButtonBaseProps, Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, keyof ButtonBaseProps> {
1165
+ /** 렌더링할 요소 (기본값: "button") */
1166
+ as?: "button";
1167
+ /** button 렌더 시엔 href 를 허용하지 않음 (href 만 주면 anchor 로 분기되도록) */
1168
+ href?: never;
1151
1169
  /** 루트 button 요소 ref (React 19 ref-as-prop) */
1152
1170
  ref?: React$1.Ref<HTMLButtonElement>;
1153
1171
  }
1172
+ /** `<a>` 로 렌더링 - 링크 시맨틱(우클릭 새 탭·미들클릭·SR 링크 안내) */
1173
+ interface ButtonAsAnchor extends ButtonBaseProps, Omit<React$1.AnchorHTMLAttributes<HTMLAnchorElement>, keyof ButtonBaseProps> {
1174
+ /** anchor 로 렌더링 - 생략 가능(href 만 줘도 anchor 로 분기) */
1175
+ as?: "a";
1176
+ /** 링크 대상 (anchor 필수) */
1177
+ href: string;
1178
+ /** 루트 anchor 요소 ref (React 19 ref-as-prop) */
1179
+ ref?: React$1.Ref<HTMLAnchorElement>;
1180
+ }
1181
+ /**
1182
+ * Button props - `as`/`href` 에 따라 button 또는 anchor 로 렌더링되는 discriminated union.
1183
+ * `as` 미지정 시 기본 `<button>` (기존 동작과 100% 호환).
1184
+ */
1185
+ type ButtonProps = ButtonAsButton | ButtonAsAnchor;
1154
1186
  /**
1155
1187
  * 버튼을 렌더링한다.
1156
1188
  * Figma DS 기준 4가지 variant(filled/tonal/outline/text)와 4가지 size(sm/md/lg/xl)를 지원한다.
1189
+ * `as="a"` (또는 `href` 지정) 시 동일 스타일의 anchor 로 렌더링한다.
1157
1190
  * @param props 버튼 속성
1158
- * @returns 렌더링된 버튼 요소
1191
+ * @returns 렌더링된 button 또는 anchor 요소
1159
1192
  */
1160
- declare const Button: ({ variant, size, leadingIcon, trailingIcon, fullWidth, radius, danger, type, ref, className, children, ...props }: ButtonProps) => React$1.JSX.Element;
1193
+ declare const Button: (props: ButtonProps) => React$1.JSX.Element;
1161
1194
 
1162
1195
  type CardVariant = "default" | "accent" | "glass" | "outlined";
1163
1196
  type CardFooterAlign = "start" | "between" | "end";
@@ -1243,8 +1276,10 @@ interface ChipProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onClic
1243
1276
  onClick?: (event: React$1.MouseEvent<HTMLButtonElement>) => void;
1244
1277
  /** 삭제 버튼 클릭 시 콜백 */
1245
1278
  onRemove?: () => void;
1279
+ /** 삭제 버튼 접근성 레이블 (기본값: "{label} 제거") - 칩이 여러 개일 때 대상 구분용 */
1280
+ removeLabel?: string;
1246
1281
  }
1247
- declare const Chip: ({ type, size, tone, label, selected, removable, disabled, open, leadingIcon, onClick, onRemove, className, ...props }: ChipProps) => React$1.JSX.Element;
1282
+ declare const Chip: ({ type, size, tone, label, selected, removable, disabled, open, leadingIcon, onClick, onRemove, removeLabel, className, ...props }: ChipProps) => React$1.JSX.Element;
1248
1283
 
1249
1284
  type DatePickerMode = "year-month" | "year-month-day";
1250
1285
  type SelectableRange = "all" | "until-today";
@@ -1317,7 +1352,7 @@ declare const Divider: ({ weight, className, ...props }: DividerProps) => React$
1317
1352
 
1318
1353
  /** Drawer 가 미끄러져 들어오는 방향 (top 은 범위 외) */
1319
1354
  type DrawerPlacement = "left" | "right" | "bottom";
1320
- interface DrawerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1355
+ interface DrawerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
1321
1356
  /** 드로어 열림 여부 */
1322
1357
  open: boolean;
1323
1358
  /** 드로어 닫기 콜백 */
@@ -1347,7 +1382,7 @@ interface DrawerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "titl
1347
1382
  * @returns 열림 상태일 때 렌더링된 드로어, 닫힘 상태면 null
1348
1383
  */
1349
1384
  declare const Drawer: {
1350
- ({ open, onClose, placement, size, title, footer, closeOnOverlay, showCloseIcon, closeLabel, ariaLabel, children, className, ...props }: DrawerProps): React$1.JSX.Element | null;
1385
+ ({ open, onClose, placement, size, title, footer, closeOnOverlay, showCloseIcon, closeLabel, ariaLabel, children, className, ...props }: DrawerProps): React$1.ReactPortal | null;
1351
1386
  displayName: string;
1352
1387
  };
1353
1388
 
@@ -1404,6 +1439,11 @@ interface DropdownCommonProps {
1404
1439
  emptyText?: string;
1405
1440
  /** 멀티 선택 요약 텍스트 (기본값: "N개 선택") */
1406
1441
  selectedSummary?: (count: number) => string;
1442
+ /**
1443
+ * 네이티브 폼 제출 참여용 name. 지정 시 선택 값이 hidden input 으로 렌더되어
1444
+ * `<form>` POST 에 포함됩니다 (multiple 은 같은 name 의 hidden input 반복).
1445
+ */
1446
+ name?: string;
1407
1447
  }
1408
1448
  /** 단일 선택 (기본) */
1409
1449
  interface DropdownSingleProps extends DropdownCommonProps {
@@ -1644,7 +1684,7 @@ interface MediaCardProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "t
1644
1684
  declare const MediaCard: ({ image, imagePosition, aspectRatio, heading, headingAs: HeadingTag, eyebrow, shadow, bordered, clickable, meta, children, className, ...props }: MediaCardProps) => React$1.JSX.Element;
1645
1685
 
1646
1686
  type ModalFooterAlign = "end" | "between" | "start";
1647
- interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1687
+ interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
1648
1688
  /** 모달 열림 여부 */
1649
1689
  open: boolean;
1650
1690
  /** 모달 닫기 콜백 */
@@ -1674,7 +1714,7 @@ interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title
1674
1714
  * @param props 모달 속성
1675
1715
  * @returns 열림 상태일 때 렌더링된 모달, 닫힘 상태면 null
1676
1716
  */
1677
- declare const Modal: ({ open, onClose, closeOnOverlay, width, title, description, footer, footerAlign, showCloseIcon, closeLabel, children, className, ariaLabel, ...props }: ModalProps) => React$1.JSX.Element | null;
1717
+ declare const Modal: ({ open, onClose, closeOnOverlay, width, title, description, footer, footerAlign, showCloseIcon, closeLabel, children, className, ariaLabel, ...props }: ModalProps) => React$1.ReactPortal | null;
1678
1718
 
1679
1719
  interface OtpInputProps {
1680
1720
  /** OTP 자릿수 (기본값: 6) */
@@ -1897,6 +1937,14 @@ type TableProps<T extends object> = {
1897
1937
  className?: string;
1898
1938
  /** 행 클릭 콜백 */
1899
1939
  onRowClick?: (item: T, index: number) => void;
1940
+ /**
1941
+ * clickable 행(onRowClick)의 동작 설명. 각 clickable 행에 `aria-describedby` 로 연결된다 (기본값: "클릭 가능한 행").
1942
+ * 행마다 셀 데이터가 이미 행을 식별하므로 여기엔 동작만 담으면 된다 (예: "선택하면 상세 항목으로 이동").
1943
+ * `""`(빈 문자열)로 두면 힌트를 붙이지 않는다.
1944
+ * `aria-label` 대신 `aria-describedby` 를 쓰는 이유: `<tr>` 의 `aria-label`/`role="button"` 은 행/셀의
1945
+ * accessible name 을 덮거나 셀을 presentational 로 만들어 스크린리더가 셀 데이터를 못 읽는다.
1946
+ */
1947
+ rowClickHint?: string;
1900
1948
  /** 현재 정렬 상태 (제어형). `undefined` 는 정렬 없음 */
1901
1949
  sort?: TableSort;
1902
1950
  /** 정렬 가능한 헤더 클릭 시 발화 (none→asc→desc→none 순환). DS는 데이터를 직접 정렬하지 않음 - 정렬된 `data` 를 다시 전달해야 함 */
@@ -1911,7 +1959,7 @@ type TableProps<T extends object> = {
1911
1959
  * @param props 테이블 속성
1912
1960
  * @returns 테이블 컴포넌트
1913
1961
  */
1914
- declare const Table: <T extends object>({ columns, data, keyExtractor, emptyMessage, isLoading, skeletonRows, size, hoverable, stickyHeader, ariaLabel, className, onRowClick, sort, onSortChange, selectAllAriaLabel, selectRowAriaLabel, selectable, rowKey, selectedKeys, onSelectionChange, }: TableProps<T>) => React$1.JSX.Element;
1962
+ declare const Table: <T extends object>({ columns, data, keyExtractor, emptyMessage, isLoading, skeletonRows, size, hoverable, stickyHeader, ariaLabel, className, onRowClick, rowClickHint, sort, onSortChange, selectAllAriaLabel, selectRowAriaLabel, selectable, rowKey, selectedKeys, onSelectionChange, }: TableProps<T>) => React$1.JSX.Element;
1915
1963
 
1916
1964
  type ThemeMode = "light" | "dark" | "system";
1917
1965
  type ResolvedTheme = "light" | "dark";