@bigtablet/design-system 3.3.0 โ†’ 3.4.1

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/README.md CHANGED
@@ -174,6 +174,8 @@ pnpm build # tsup + SCSS copy
174
174
  | | |
175
175
  |---|---|
176
176
  | ๐Ÿ“š [Components](./docs/COMPONENTS.md) | Props API + usage per component |
177
+ | ๐Ÿ”„ [Migration](./docs/MIGRATION.md) | Deprecated prop migration guide |
178
+ | ๐ŸŽจ [Theming](./docs/THEMING.md) | Light/dark theme system guide |
177
179
  | ๐Ÿ—๏ธ [Architecture](./docs/ARCHITECTURE.md) | Project structure + design principles |
178
180
  | ๐Ÿค [Contributing](./docs/CONTRIBUTING.md) | Dev setup + workflow |
179
181
  | ๐Ÿงช [Testing](./docs/TESTING.md) | Test patterns + a11y testing |
package/dist/index.css CHANGED
@@ -2695,6 +2695,7 @@
2695
2695
  border: 1px solid var(--bt-color-border-default);
2696
2696
  border-radius: 12px;
2697
2697
  box-shadow: var(--bt-elevation-level1);
2698
+ overflow: hidden;
2698
2699
  }
2699
2700
  [data-theme=dark] .dropdown_list {
2700
2701
  background: var(--bt-color-bg-solid-dim);
@@ -2705,10 +2706,6 @@
2705
2706
  }
2706
2707
  }
2707
2708
  .dropdown_list {
2708
- max-height: 18rem;
2709
- overflow-y: auto;
2710
- overflow-x: hidden;
2711
- padding: 4px 0;
2712
2709
  will-change: transform, opacity;
2713
2710
  }
2714
2711
  .dropdown_list_up {
@@ -2717,6 +2714,55 @@
2717
2714
  margin-top: 0;
2718
2715
  margin-bottom: 4px;
2719
2716
  }
2717
+ .dropdown_search {
2718
+ display: flex;
2719
+ align-items: center;
2720
+ gap: 8px;
2721
+ padding: 8px 12px;
2722
+ border-bottom: 1px solid var(--bt-color-border-default);
2723
+ }
2724
+ .dropdown_search_icon {
2725
+ display: inline-flex;
2726
+ align-items: center;
2727
+ justify-content: center;
2728
+ flex-shrink: 0;
2729
+ color: var(--bt-color-text-body);
2730
+ }
2731
+ .dropdown_search_input {
2732
+ flex: 1 1 auto;
2733
+ min-width: 0;
2734
+ border: none;
2735
+ outline: none;
2736
+ background: transparent;
2737
+ color: var(--bt-color-text-heading);
2738
+ border-radius: 6px;
2739
+ font-size: 14px;
2740
+ font-weight: 400;
2741
+ line-height: 20px;
2742
+ letter-spacing: 0px;
2743
+ transition: box-shadow 0.1s ease-in-out;
2744
+ }
2745
+ .dropdown_search_input::placeholder {
2746
+ color: var(--bt-color-text-body);
2747
+ }
2748
+ .dropdown_search_input:focus-visible {
2749
+ box-shadow: var(--bt-focus-ring);
2750
+ }
2751
+ .dropdown_options {
2752
+ max-height: 18rem;
2753
+ overflow-y: auto;
2754
+ overflow-x: hidden;
2755
+ padding: 4px 0;
2756
+ }
2757
+ .dropdown_empty {
2758
+ padding: 12px 16px;
2759
+ font-size: 14px;
2760
+ font-weight: 400;
2761
+ line-height: 20px;
2762
+ letter-spacing: 0px;
2763
+ color: var(--bt-color-text-caption);
2764
+ text-align: center;
2765
+ }
2720
2766
  .dropdown_option {
2721
2767
  width: 100%;
2722
2768
  box-sizing: border-box;
@@ -2751,6 +2797,14 @@
2751
2797
  cursor: not-allowed;
2752
2798
  color: var(--bt-color-text-caption);
2753
2799
  }
2800
+ .dropdown_option_check {
2801
+ display: inline-flex;
2802
+ align-items: center;
2803
+ justify-content: center;
2804
+ flex-shrink: 0;
2805
+ width: 16px;
2806
+ color: var(--bt-color-accent-default);
2807
+ }
2754
2808
  .dropdown_option_icon {
2755
2809
  display: inline-flex;
2756
2810
  align-items: center;
@@ -2803,6 +2857,9 @@
2803
2857
  .dropdown_icon {
2804
2858
  transition: none;
2805
2859
  }
2860
+ .dropdown_search_input {
2861
+ transition: none;
2862
+ }
2806
2863
  }
2807
2864
 
2808
2865
  /* src/ui/forms/date-picker/style.scss */
@@ -2887,6 +2944,124 @@
2887
2944
  height: 2px;
2888
2945
  }
2889
2946
 
2947
+ /* src/ui/overlay/drawer/style.scss */
2948
+ @keyframes skeleton_loading {
2949
+ 0% {
2950
+ background-position: 100% 0;
2951
+ }
2952
+ 100% {
2953
+ background-position: 0 0;
2954
+ }
2955
+ }
2956
+ .drawer {
2957
+ position: fixed;
2958
+ top: 0;
2959
+ right: 0;
2960
+ bottom: 0;
2961
+ left: 0;
2962
+ display: flex;
2963
+ background: var(--bt-color-bg-overlay);
2964
+ z-index: 100;
2965
+ will-change: opacity;
2966
+ }
2967
+ .drawer_placement_left {
2968
+ justify-content: flex-start;
2969
+ }
2970
+ .drawer_placement_right {
2971
+ justify-content: flex-end;
2972
+ }
2973
+ .drawer_placement_bottom {
2974
+ align-items: flex-end;
2975
+ justify-content: stretch;
2976
+ }
2977
+ .drawer_panel {
2978
+ position: relative;
2979
+ display: flex;
2980
+ flex-direction: column;
2981
+ background: var(--bt-color-bg-solid);
2982
+ box-shadow: var(--bt-elevation-level3);
2983
+ max-width: 100%;
2984
+ max-height: 100%;
2985
+ overflow: hidden;
2986
+ will-change: transform;
2987
+ }
2988
+ .drawer_placement_left .drawer_panel,
2989
+ .drawer_placement_right .drawer_panel {
2990
+ height: 100%;
2991
+ }
2992
+ .drawer_placement_bottom .drawer_panel {
2993
+ width: 100%;
2994
+ border-top-left-radius: 12px;
2995
+ border-top-right-radius: 12px;
2996
+ }
2997
+ .drawer_close {
2998
+ position: absolute;
2999
+ top: 12px;
3000
+ right: 12px;
3001
+ width: 32px;
3002
+ height: 32px;
3003
+ display: inline-flex;
3004
+ align-items: center;
3005
+ justify-content: center;
3006
+ border: none;
3007
+ background: transparent;
3008
+ color: var(--bt-color-text-caption);
3009
+ border-radius: 8px;
3010
+ cursor: pointer;
3011
+ transition: background 0.1s ease-in-out, color 0.1s ease-in-out;
3012
+ }
3013
+ .drawer_close:hover {
3014
+ background: var(--bt-color-state-hover-on-light);
3015
+ color: var(--bt-color-text-heading);
3016
+ }
3017
+ .drawer_close:focus-visible {
3018
+ outline: none;
3019
+ box-shadow: var(--bt-focus-ring);
3020
+ }
3021
+ .drawer_header {
3022
+ flex: 0 0 auto;
3023
+ display: flex;
3024
+ align-items: center;
3025
+ padding: 20px 24px;
3026
+ padding-right: 48px;
3027
+ border-bottom: 1px solid var(--bt-color-border-subtle);
3028
+ }
3029
+ .drawer_title {
3030
+ margin: 0;
3031
+ color: var(--bt-color-text-heading);
3032
+ font-size: 20px;
3033
+ font-weight: 700;
3034
+ line-height: 28px;
3035
+ letter-spacing: 0px;
3036
+ }
3037
+ .drawer_body {
3038
+ flex: 1 1 auto;
3039
+ min-height: 0;
3040
+ overflow-y: auto;
3041
+ padding: 24px;
3042
+ color: var(--bt-color-text-body);
3043
+ font-size: 15px;
3044
+ font-weight: 400;
3045
+ line-height: 22.5px;
3046
+ letter-spacing: 0px;
3047
+ }
3048
+ .drawer_footer {
3049
+ flex: 0 0 auto;
3050
+ display: flex;
3051
+ gap: 8px;
3052
+ justify-content: flex-end;
3053
+ padding: 16px 24px;
3054
+ border-top: 1px solid var(--bt-color-border-subtle);
3055
+ }
3056
+ @media (prefers-reduced-motion: reduce) {
3057
+ .drawer,
3058
+ .drawer_panel,
3059
+ .drawer_close {
3060
+ transition: none;
3061
+ animation: none;
3062
+ }
3063
+ }
3064
+
2890
3065
  /* src/ui/forms/file/style.scss */
2891
3066
  @keyframes skeleton_loading {
2892
3067
  0% {
@@ -4332,6 +4507,17 @@
4332
4507
  border-radius: 8px;
4333
4508
  background: var(--bt-color-bg-solid);
4334
4509
  }
4510
+ .table_sr_only {
4511
+ position: absolute;
4512
+ width: 1px;
4513
+ height: 1px;
4514
+ padding: 0;
4515
+ margin: -1px;
4516
+ overflow: hidden;
4517
+ clip: rect(0, 0, 0, 0);
4518
+ white-space: nowrap;
4519
+ border: 0;
4520
+ }
4335
4521
  .table {
4336
4522
  width: 100%;
4337
4523
  border-collapse: collapse;
@@ -4351,6 +4537,52 @@
4351
4537
  line-height: 20px;
4352
4538
  letter-spacing: 0px;
4353
4539
  }
4540
+ .table_th_checkbox,
4541
+ .table_td_checkbox {
4542
+ box-sizing: border-box;
4543
+ width: 48px;
4544
+ }
4545
+ .table_th_sortable {
4546
+ padding: 0;
4547
+ }
4548
+ .table_sort_button {
4549
+ display: flex;
4550
+ align-items: center;
4551
+ gap: 4px;
4552
+ width: 100%;
4553
+ padding: 12px 16px;
4554
+ border: none;
4555
+ background: transparent;
4556
+ color: inherit;
4557
+ font: inherit;
4558
+ cursor: pointer;
4559
+ transition: background 0.1s ease-in-out;
4560
+ }
4561
+ .table_sort_button:hover:not(:disabled) {
4562
+ background: var(--bt-color-state-hover-on-light);
4563
+ }
4564
+ .table_sort_button:focus-visible {
4565
+ outline: none;
4566
+ box-shadow: var(--bt-focus-ring);
4567
+ }
4568
+ .table_sort_button:disabled {
4569
+ cursor: not-allowed;
4570
+ opacity: 0.38;
4571
+ }
4572
+ .table_align_center .table_sort_button {
4573
+ justify-content: center;
4574
+ }
4575
+ .table_align_right .table_sort_button {
4576
+ justify-content: flex-end;
4577
+ }
4578
+ .table_sort_icon {
4579
+ flex-shrink: 0;
4580
+ color: var(--bt-color-text-caption);
4581
+ transition: color 0.1s ease-in-out;
4582
+ }
4583
+ .table_sort_icon_active {
4584
+ color: var(--bt-color-text-heading);
4585
+ }
4354
4586
  .table_tbody .table_row {
4355
4587
  border-bottom: 1px solid var(--bt-color-border-default);
4356
4588
  transition: background-color 0.1s ease-in-out;
@@ -4374,6 +4606,12 @@
4374
4606
  .table_tbody .table_row_skeleton {
4375
4607
  pointer-events: none;
4376
4608
  }
4609
+ .table_tbody .table_row_selected {
4610
+ background: var(--bt-color-accent-subtle);
4611
+ }
4612
+ .table_tbody .table_row_selected.table_row_hoverable:hover {
4613
+ background: var(--bt-color-accent-muted);
4614
+ }
4377
4615
  .table_td {
4378
4616
  padding: 12px 16px;
4379
4617
  color: var(--bt-color-text-body);
@@ -4406,6 +4644,12 @@
4406
4644
  line-height: 18px;
4407
4645
  letter-spacing: 0px;
4408
4646
  }
4647
+ .table_size_sm .table_th_sortable {
4648
+ padding: 0;
4649
+ }
4650
+ .table_size_sm .table_sort_button {
4651
+ padding: 8px 12px;
4652
+ }
4409
4653
  .table_size_lg .table_th,
4410
4654
  .table_size_lg .table_td {
4411
4655
  padding: 16px 20px;
@@ -4422,6 +4666,12 @@
4422
4666
  line-height: 22.5px;
4423
4667
  letter-spacing: 0px;
4424
4668
  }
4669
+ .table_size_lg .table_th_sortable {
4670
+ padding: 0;
4671
+ }
4672
+ .table_size_lg .table_sort_button {
4673
+ padding: 16px 20px;
4674
+ }
4425
4675
  .table_sticky_header .table_thead {
4426
4676
  position: sticky;
4427
4677
  top: 0;
@@ -4436,6 +4686,13 @@
4436
4686
  line-height: 20px;
4437
4687
  letter-spacing: 0px;
4438
4688
  }
4689
+ @media (prefers-reduced-motion: reduce) {
4690
+ .table_row,
4691
+ .table_sort_button,
4692
+ .table_sort_icon {
4693
+ transition: none;
4694
+ }
4695
+ }
4439
4696
 
4440
4697
  /* src/ui/forms/textfield/style.scss */
4441
4698
  @keyframes skeleton_loading {
package/dist/index.d.ts CHANGED
@@ -742,6 +742,14 @@ declare const elevation: {
742
742
  readonly level5: "0 8px 10px -5px rgba(0, 0, 0, 0.20), 0 20px 20px 0px rgba(0, 0, 0, 0.12)";
743
743
  };
744
744
 
745
+ declare const iconSize: {
746
+ readonly xs: 14;
747
+ readonly sm: 16;
748
+ readonly md: 18;
749
+ readonly lg: 20;
750
+ readonly xl: 32;
751
+ };
752
+
745
753
  declare const motion: {
746
754
  readonly transition: {
747
755
  readonly fast: "0.1s ease-in-out";
@@ -1307,6 +1315,42 @@ interface DividerProps extends React$1.HTMLAttributes<HTMLHRElement> {
1307
1315
  */
1308
1316
  declare const Divider: ({ weight, className, ...props }: DividerProps) => React$1.JSX.Element;
1309
1317
 
1318
+ /** Drawer ๊ฐ€ ๋ฏธ๋„๋Ÿฌ์ ธ ๋“ค์–ด์˜ค๋Š” ๋ฐฉํ–ฅ (top ์€ ๋ฒ”์œ„ ์™ธ) */
1319
+ type DrawerPlacement = "left" | "right" | "bottom";
1320
+ interface DrawerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
1321
+ /** ๋“œ๋กœ์–ด ์—ด๋ฆผ ์—ฌ๋ถ€ */
1322
+ open: boolean;
1323
+ /** ๋“œ๋กœ์–ด ๋‹ซ๊ธฐ ์ฝœ๋ฐฑ */
1324
+ onClose?: () => void;
1325
+ /** ์Šฌ๋ผ์ด๋“œ ๋ฐฉํ–ฅ (๊ธฐ๋ณธ๊ฐ’: "right") */
1326
+ placement?: DrawerPlacement;
1327
+ /** ํŒจ๋„ ํฌ๊ธฐ - left/right ๋Š” ๋„ˆ๋น„, bottom ์€ ๋†’์ด (๊ธฐ๋ณธ๊ฐ’: 360). number โ‡’ px */
1328
+ size?: number | string;
1329
+ /** ๋“œ๋กœ์–ด ์ œ๋ชฉ (ํ—ค๋” h2, heading_small_bold) */
1330
+ title?: React$1.ReactNode;
1331
+ /** ํ•˜๋‹จ ์•ก์…˜ ์˜์—ญ (Button๋“ค). ๋ฏธ์ง€์ • ์‹œ footer ์˜์—ญ ์ž์ฒด๊ฐ€ ์•ˆ ๋ณด์ž„ */
1332
+ footer?: React$1.ReactNode;
1333
+ /** ์˜ค๋ฒ„๋ ˆ์ด ํด๋ฆญ ์‹œ ๋‹ซ๊ธฐ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: true) */
1334
+ closeOnOverlay?: boolean;
1335
+ /** ์šฐ์ƒ๋‹จ X ๋‹ซ๊ธฐ ์•„์ด์ฝ˜ ํ‘œ์‹œ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: true) */
1336
+ showCloseIcon?: boolean;
1337
+ /** X ๋‹ซ๊ธฐ ๋ฒ„ํŠผ ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ” (๊ธฐ๋ณธ๊ฐ’: "๋‹ซ๊ธฐ") */
1338
+ closeLabel?: string;
1339
+ /** ๋“œ๋กœ์–ด ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ” (title ์—†์„ ๋•Œ ์‚ฌ์šฉ, ๊ธฐ๋ณธ๊ฐ’: "Dialog") */
1340
+ ariaLabel?: string;
1341
+ }
1342
+ /**
1343
+ * ํ™”๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋ฏธ๋„๋Ÿฌ์ ธ ๋“ค์–ด์˜ค๋Š” ํŒจ๋„(Drawer)์„ ๋ Œ๋”๋งํ•œ๋‹ค.
1344
+ * react-spring ๊ธฐ๋ฐ˜ ๋ฐฉํ–ฅ๋ณ„ ์Šฌ๋ผ์ด๋“œ ์ง„์ž…/ํ‡ด์ถœ + ํฌ์ปค์Šค ํŠธ๋žฉ + ๋ฐ”๋”” ์Šคํฌ๋กค ์ž ๊ธˆ.
1345
+ *
1346
+ * @param props ๋“œ๋กœ์–ด ์†์„ฑ
1347
+ * @returns ์—ด๋ฆผ ์ƒํƒœ์ผ ๋•Œ ๋ Œ๋”๋ง๋œ ๋“œ๋กœ์–ด, ๋‹ซํž˜ ์ƒํƒœ๋ฉด null
1348
+ */
1349
+ declare const Drawer: {
1350
+ ({ open, onClose, placement, size, title, footer, closeOnOverlay, showCloseIcon, closeLabel, ariaLabel, children, className, ...props }: DrawerProps): React$1.JSX.Element | null;
1351
+ displayName: string;
1352
+ };
1353
+
1310
1354
  type DropdownSize = "sm" | "md" | "lg";
1311
1355
  interface DropdownOption {
1312
1356
  value: string;
@@ -1321,7 +1365,8 @@ interface DropdownOption {
1321
1365
  /** ์•„์ดํ…œ ์•„๋ž˜ ๊ตฌ๋ถ„์„  ํ‘œ์‹œ ์—ฌ๋ถ€ */
1322
1366
  showDivider?: boolean;
1323
1367
  }
1324
- interface DropdownProps {
1368
+ /** single/multiple ๊ณตํ†ต ์†์„ฑ */
1369
+ interface DropdownCommonProps {
1325
1370
  /** ๋“œ๋กญ๋‹ค์šด ์š”์†Œ์˜ id (๋ฏธ์ž…๋ ฅ ์‹œ ์ž๋™ ์ƒ์„ฑ) */
1326
1371
  id?: string;
1327
1372
  /** ๋“œ๋กญ๋‹ค์šด ์œ„์— ํ‘œ์‹œํ•  ํ”Œ๋กœํŒ… ๋ผ๋ฒจ ํ…์ŠคํŠธ */
@@ -1330,14 +1375,6 @@ interface DropdownProps {
1330
1375
  placeholder?: string;
1331
1376
  /** ํ‘œ์‹œํ•  ์˜ต์…˜ ๋ชฉ๋ก */
1332
1377
  options: DropdownOption[];
1333
- /** ์ œ์–ดํ˜• ์„ ํƒ ๊ฐ’ */
1334
- value?: string | null;
1335
- /** ๊ฐ’ ๋ณ€๊ฒฝ ์ฝœ๋ฐฑ (canonical). ์„ ํƒ๋œ ๊ฐ’๊ณผ ์ „์ฒด ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. */
1336
- onValueChange?: (value: string | null, option?: DropdownOption | null) => void;
1337
- /** @deprecated `onValueChange` ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. */
1338
- onChange?: (value: string | null, option?: DropdownOption | null) => void;
1339
- /** ๋น„์ œ์–ดํ˜• ์ดˆ๊ธฐ ์„ ํƒ ๊ฐ’ */
1340
- defaultValue?: string | null;
1341
1378
  /** ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€ */
1342
1379
  disabled?: boolean;
1343
1380
  /** ๋“œ๋กญ๋‹ค์šด ํฌ๊ธฐ (๊ธฐ๋ณธ๊ฐ’: "md") */
@@ -1356,14 +1393,53 @@ interface DropdownProps {
1356
1393
  * @deprecated textAlign์€ ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
1357
1394
  */
1358
1395
  textAlign?: "left" | "center";
1396
+ /**
1397
+ * ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ ์—ฌ๋ถ€. ํ™œ์„ฑํ™” ์‹œ ์—ด๋ฆฐ ํŒจ๋„ ์ƒ๋‹จ์— ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ด ํ‘œ์‹œ๋˜๊ณ , ์˜ต์…˜ `label` ๋ถ€๋ถ„ ์ผ์น˜๋กœ ํ•„ํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค.
1398
+ * (๊ธฐ๋ณธ๊ฐ’: false)
1399
+ */
1400
+ searchable?: boolean;
1401
+ /** ๊ฒ€์ƒ‰ ์ž…๋ ฅ์˜ placeholder (๊ธฐ๋ณธ๊ฐ’: "๊ฒ€์ƒ‰โ€ฆ") */
1402
+ searchPlaceholder?: string;
1403
+ /** ํ•„ํ„ฐ ๊ฒฐ๊ณผ๊ฐ€ 0๊ฐœ์ผ ๋•Œ ํ‘œ์‹œํ•  ํ…์ŠคํŠธ (๊ธฐ๋ณธ๊ฐ’: "๊ฒฐ๊ณผ ์—†์Œ") */
1404
+ emptyText?: string;
1405
+ /** ๋ฉ€ํ‹ฐ ์„ ํƒ ์š”์•ฝ ํ…์ŠคํŠธ (๊ธฐ๋ณธ๊ฐ’: "N๊ฐœ ์„ ํƒ") */
1406
+ selectedSummary?: (count: number) => string;
1407
+ }
1408
+ /** ๋‹จ์ผ ์„ ํƒ (๊ธฐ๋ณธ) */
1409
+ interface DropdownSingleProps extends DropdownCommonProps {
1410
+ /** ๋‹ค์ค‘ ์„ ํƒ ๋ชจ๋“œ (๊ธฐ๋ณธ๊ฐ’: false) */
1411
+ multiple?: false;
1412
+ /** ์ œ์–ดํ˜• ์„ ํƒ ๊ฐ’ */
1413
+ value?: string | null;
1414
+ /** ๊ฐ’ ๋ณ€๊ฒฝ ์ฝœ๋ฐฑ (canonical). ์„ ํƒ๋œ ๊ฐ’๊ณผ ์ „์ฒด ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. */
1415
+ onValueChange?: (value: string | null, option?: DropdownOption | null) => void;
1416
+ /** @deprecated `onValueChange` ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. */
1417
+ onChange?: (value: string | null, option?: DropdownOption | null) => void;
1418
+ /** ๋น„์ œ์–ดํ˜• ์ดˆ๊ธฐ ์„ ํƒ ๊ฐ’ */
1419
+ defaultValue?: string | null;
1420
+ }
1421
+ /** ๋‹ค์ค‘ ์„ ํƒ */
1422
+ interface DropdownMultipleProps extends DropdownCommonProps {
1423
+ /** ๋‹ค์ค‘ ์„ ํƒ ๋ชจ๋“œ */
1424
+ multiple: true;
1425
+ /** ์ œ์–ดํ˜• ์„ ํƒ ๊ฐ’ ๋ชฉ๋ก */
1426
+ value?: string[];
1427
+ /** ๊ฐ’ ๋ณ€๊ฒฝ ์ฝœ๋ฐฑ (canonical). ์„ ํƒ๋œ ๊ฐ’ ๋ชฉ๋ก๊ณผ ์˜ต์…˜ ๊ฐ์ฒด ๋ชฉ๋ก์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. */
1428
+ onValueChange?: (values: string[], options: DropdownOption[]) => void;
1429
+ /** @deprecated `onValueChange` ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. */
1430
+ onChange?: (values: string[], options: DropdownOption[]) => void;
1431
+ /** ๋น„์ œ์–ดํ˜• ์ดˆ๊ธฐ ์„ ํƒ ๊ฐ’ ๋ชฉ๋ก */
1432
+ defaultValue?: string[];
1359
1433
  }
1434
+ type DropdownProps = DropdownSingleProps | DropdownMultipleProps;
1360
1435
  /**
1361
1436
  * ๋“œ๋กญ๋‹ค์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
1362
- * ์ œ์–ดํ˜•/๋น„์ œ์–ดํ˜• ์ƒํƒœ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํ‚ค๋ณด๋“œ/๋งˆ์šฐ์Šค ์ƒํ˜ธ์ž‘์šฉ๊ณผ ํ”Œ๋กœํŒ… ๋ผ๋ฒจ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
1437
+ * ์ œ์–ดํ˜•/๋น„์ œ์–ดํ˜• ์ƒํƒœ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํ‚ค๋ณด๋“œ/๋งˆ์šฐ์Šค ์ƒํ˜ธ์ž‘์šฉ๊ณผ ์ •์  ๋ผ๋ฒจ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
1438
+ * `searchable` ๋กœ ๋ผ๋ฒจ ๋ถ€๋ถ„ ์ผ์น˜ ๊ฒ€์ƒ‰์„, `multiple` ๋กœ ๋‹ค์ค‘ ์„ ํƒ์„ opt-in ํ•  ์ˆ˜ ์žˆ๋‹ค.
1363
1439
  * @param props ๋“œ๋กญ๋‹ค์šด ์†์„ฑ
1364
1440
  * @returns ๋ Œ๋”๋ง๋œ ๋“œ๋กญ๋‹ค์šด UI
1365
1441
  */
1366
- declare const Dropdown: ({ id, label, placeholder, options, value, onValueChange, onChange, defaultValue, disabled, size, className, }: DropdownProps) => React$1.JSX.Element;
1442
+ declare const Dropdown: (props: DropdownProps) => React$1.JSX.Element;
1367
1443
 
1368
1444
  type FileInputVariant = "button" | "preview";
1369
1445
  interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
@@ -1568,7 +1644,7 @@ interface MediaCardProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "t
1568
1644
  declare const MediaCard: ({ image, imagePosition, aspectRatio, heading, headingAs: HeadingTag, eyebrow, shadow, bordered, clickable, meta, children, className, ...props }: MediaCardProps) => React$1.JSX.Element;
1569
1645
 
1570
1646
  type ModalFooterAlign = "end" | "between" | "start";
1571
- interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1647
+ interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
1572
1648
  /** ๋ชจ๋‹ฌ ์—ด๋ฆผ ์—ฌ๋ถ€ */
1573
1649
  open: boolean;
1574
1650
  /** ๋ชจ๋‹ฌ ๋‹ซ๊ธฐ ์ฝœ๋ฐฑ */
@@ -1759,6 +1835,13 @@ interface SpinnerProps {
1759
1835
  declare const Spinner: ({ size, ariaLabel }: SpinnerProps) => React$1.JSX.Element;
1760
1836
 
1761
1837
  type TableSize = "sm" | "md" | "lg";
1838
+ type TableSortDirection = "asc" | "desc";
1839
+ interface TableSort {
1840
+ /** ์ •๋ ฌ ์ค‘์ธ ์ปฌ๋Ÿผ์˜ `TableColumn.key` */
1841
+ key: string;
1842
+ /** ์ •๋ ฌ ๋ฐฉํ–ฅ */
1843
+ direction: TableSortDirection;
1844
+ }
1762
1845
  interface TableColumn<T extends object> {
1763
1846
  /** ์ปฌ๋Ÿผ ์‹๋ณ„์ž - `data[key]` ์ž๋™ ๋ Œ๋”๋ง์—๋„ ์“ฐ์ž„ */
1764
1847
  key: string;
@@ -1770,8 +1853,26 @@ interface TableColumn<T extends object> {
1770
1853
  width?: string;
1771
1854
  /** ์ •๋ ฌ (๊ธฐ๋ณธ๊ฐ’: "left") */
1772
1855
  align?: "left" | "center" | "right";
1773
- }
1774
- interface TableProps<T extends object> {
1856
+ /** ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ปฌ๋Ÿผ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false). ํด๋ฆญ ์‹œ `onSortChange` ๋ฐœํ™” - ์‹ค์ œ ์ •๋ ฌ์€ ์†Œ๋น„์ž๊ฐ€ ์ˆ˜ํ–‰ */
1857
+ sortable?: boolean;
1858
+ }
1859
+ /** `selectable` ์‹œ `rowKey` ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ํŒ๋ณ„ ์œ ๋‹ˆ์˜จ */
1860
+ type TableSelectionProps<T extends object> = {
1861
+ /** ํ–‰ ์„ ํƒ(์ฒดํฌ๋ฐ•์Šค ์ปฌ๋Ÿผ) ํ™œ์„ฑํ™” ์—ฌ๋ถ€ */
1862
+ selectable: true;
1863
+ /** ํ–‰ ๊ณ ์œ  key ์ถ”์ถœ ํ•จ์ˆ˜ - `selectable` ์‚ฌ์šฉ ์‹œ ํ•„์ˆ˜ */
1864
+ rowKey: (row: T) => string;
1865
+ /** ์„ ํƒ๋œ ํ–‰ key ๋ฐฐ์—ด (์ œ์–ดํ˜•) */
1866
+ selectedKeys?: string[];
1867
+ /** ์„ ํƒ ๋ณ€๊ฒฝ ์ฝœ๋ฐฑ */
1868
+ onSelectionChange?: (keys: string[]) => void;
1869
+ } | {
1870
+ selectable?: false;
1871
+ rowKey?: (row: T) => string;
1872
+ selectedKeys?: string[];
1873
+ onSelectionChange?: (keys: string[]) => void;
1874
+ };
1875
+ type TableProps<T extends object> = {
1775
1876
  /** ์ปฌ๋Ÿผ ์ •์˜ */
1776
1877
  columns: TableColumn<T>[];
1777
1878
  /** ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด */
@@ -1796,13 +1897,29 @@ interface TableProps<T extends object> {
1796
1897
  className?: string;
1797
1898
  /** ํ–‰ ํด๋ฆญ ์ฝœ๋ฐฑ */
1798
1899
  onRowClick?: (item: T, index: number) => void;
1799
- }
1900
+ /**
1901
+ * clickable ํ–‰(onRowClick)์˜ ๋™์ž‘ ์„ค๋ช…. ๊ฐ clickable ํ–‰์— `aria-describedby` ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค (๊ธฐ๋ณธ๊ฐ’: "ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ํ–‰").
1902
+ * ํ–‰๋งˆ๋‹ค ์…€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ํ–‰์„ ์‹๋ณ„ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์—” ๋™์ž‘๋งŒ ๋‹ด์œผ๋ฉด ๋œ๋‹ค (์˜ˆ: "์„ ํƒํ•˜๋ฉด ์ƒ์„ธ ํ•ญ๋ชฉ์œผ๋กœ ์ด๋™").
1903
+ * `""`(๋นˆ ๋ฌธ์ž์—ด)๋กœ ๋‘๋ฉด ํžŒํŠธ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.
1904
+ * `aria-label` ๋Œ€์‹  `aria-describedby` ๋ฅผ ์“ฐ๋Š” ์ด์œ : `<tr>` ์˜ `aria-label`/`role="button"` ์€ ํ–‰/์…€์˜
1905
+ * accessible name ์„ ๋ฎ๊ฑฐ๋‚˜ ์…€์„ presentational ๋กœ ๋งŒ๋“ค์–ด ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ฐ€ ์…€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชป ์ฝ๋Š”๋‹ค.
1906
+ */
1907
+ rowClickHint?: string;
1908
+ /** ํ˜„์žฌ ์ •๋ ฌ ์ƒํƒœ (์ œ์–ดํ˜•). `undefined` ๋Š” ์ •๋ ฌ ์—†์Œ */
1909
+ sort?: TableSort;
1910
+ /** ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ํ—ค๋” ํด๋ฆญ ์‹œ ๋ฐœํ™” (noneโ†’ascโ†’descโ†’none ์ˆœํ™˜). DS๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ •๋ ฌํ•˜์ง€ ์•Š์Œ - ์ •๋ ฌ๋œ `data` ๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•จ */
1911
+ onSortChange?: (sort: TableSort | undefined) => void;
1912
+ /** ์ „์ฒด ์„ ํƒ ์ฒดํฌ๋ฐ•์Šค aria-label (๊ธฐ๋ณธ๊ฐ’: "์ „์ฒด ์„ ํƒ") */
1913
+ selectAllAriaLabel?: string;
1914
+ /** ๊ฐœ๋ณ„ ํ–‰ ์„ ํƒ ์ฒดํฌ๋ฐ•์Šค aria-label (๊ธฐ๋ณธ๊ฐ’: (i) => `${i+1}๋ฒˆ์งธ ํ–‰ ์„ ํƒ`) */
1915
+ selectRowAriaLabel?: (index: number) => string;
1916
+ } & TableSelectionProps<T>;
1800
1917
  /**
1801
1918
  * ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๋กœ๋”ฉ ์ค‘์—๋Š” ํ—ค๋” ์œ ์ง€, ๋ฐ”๋””์— ์Šค์ผˆ๋ ˆํ†ค ํ–‰์„ ํ‘œ์‹œํ•œ๋‹ค.
1802
1919
  * @param props ํ…Œ์ด๋ธ” ์†์„ฑ
1803
1920
  * @returns ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ
1804
1921
  */
1805
- declare const Table: <T extends object>({ columns, data, keyExtractor, emptyMessage, isLoading, skeletonRows, size, hoverable, stickyHeader, ariaLabel, className, onRowClick, }: TableProps<T>) => React$1.JSX.Element;
1922
+ 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;
1806
1923
 
1807
1924
  type ThemeMode = "light" | "dark" | "system";
1808
1925
  type ResolvedTheme = "light" | "dark";
@@ -2199,4 +2316,4 @@ interface GridProps extends React$1.HTMLAttributes<HTMLDivElement> {
2199
2316
  */
2200
2317
  declare const Grid: ({ cols, minColWidth, gap, rowGap, colGap, singleColOnMobile, as: Tag, ref, className, children, style, ...props }: GridProps) => React$1.JSX.Element;
2201
2318
 
2202
- export { Accordion, type AccordionItem, type AccordionProps, AlertProvider, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, BottomNav, BottomNavItem, type BottomNavItemProps, type BottomNavProps, BottomNavSpacer, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Card, type CardFooterAlign, type CardProps, type CardVariant, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, DatePicker, type DatePickerProps, Divider, type DividerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, type ErrorStateVariant, FileInput, type FileInputProps, Grid, type GridCols, type GridGap, type GridProps, Hero, type HeroAction, type HeroAlign, type HeroHeight, type HeroOverlay, type HeroProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconProps, type ImeStrategy, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, MediaCard, type MediaCardImage, type MediaCardImagePosition, type MediaCardProps, type MediaCardShadow, Menu, type MenuItem, type MenuProps, Modal, type ModalProps, NavBar, type NavBarLayout, type NavBarLocaleConfig, type NavBarLocaleOption, type NavBarProps, type NavBarVariant, NavLink, type NavLinkProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Popover, type PopoverPlacement, type PopoverProps, Radio, RadioGroup, type RadioGroupOrientation, type RadioGroupProps, type RadioGroupSize, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, type SidebarMode, type SidebarProps, SidebarSection, type SidebarSectionProps, Skeleton, type SkeletonProps, type SkeletonVariant, Spinner, type SpinnerProps, Stack, type StackAlign, type StackDirection, type StackGap, type StackJustify, type StackProps, type StackWrap, Tab, TabList, type TabListProps, TabPanel, type TabPanelProps, type TabProps, Table, type TableColumn, type TableProps, type TableSize, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, type TextFieldSize, Textarea, type TextareaProps, type TextareaResize, type TextareaSize, type ThemeMode, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, cn, colors, elevation, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useReducedMotion, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };
2319
+ export { Accordion, type AccordionItem, type AccordionProps, AlertProvider, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, BottomNav, BottomNavItem, type BottomNavItemProps, type BottomNavProps, BottomNavSpacer, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Card, type CardFooterAlign, type CardProps, type CardVariant, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, DatePicker, type DatePickerProps, Divider, type DividerProps, Drawer, type DrawerPlacement, type DrawerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, type ErrorStateVariant, FileInput, type FileInputProps, Grid, type GridCols, type GridGap, type GridProps, Hero, type HeroAction, type HeroAlign, type HeroHeight, type HeroOverlay, type HeroProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconProps, type ImeStrategy, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, MediaCard, type MediaCardImage, type MediaCardImagePosition, type MediaCardProps, type MediaCardShadow, Menu, type MenuItem, type MenuProps, Modal, type ModalProps, NavBar, type NavBarLayout, type NavBarLocaleConfig, type NavBarLocaleOption, type NavBarProps, type NavBarVariant, NavLink, type NavLinkProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Popover, type PopoverPlacement, type PopoverProps, Radio, RadioGroup, type RadioGroupOrientation, type RadioGroupProps, type RadioGroupSize, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, type SidebarMode, type SidebarProps, SidebarSection, type SidebarSectionProps, Skeleton, type SkeletonProps, type SkeletonVariant, Spinner, type SpinnerProps, Stack, type StackAlign, type StackDirection, type StackGap, type StackJustify, type StackProps, type StackWrap, Tab, TabList, type TabListProps, TabPanel, type TabPanelProps, type TabProps, Table, type TableColumn, type TableProps, type TableSize, type TableSort, type TableSortDirection, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, type TextFieldSize, Textarea, type TextareaProps, type TextareaResize, type TextareaSize, type ThemeMode, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, cn, colors, elevation, iconSize, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useReducedMotion, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };