@bigtablet/design-system 3.3.0 โ†’ 3.4.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/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% {
@@ -4351,6 +4526,52 @@
4351
4526
  line-height: 20px;
4352
4527
  letter-spacing: 0px;
4353
4528
  }
4529
+ .table_th_checkbox,
4530
+ .table_td_checkbox {
4531
+ box-sizing: border-box;
4532
+ width: 48px;
4533
+ }
4534
+ .table_th_sortable {
4535
+ padding: 0;
4536
+ }
4537
+ .table_sort_button {
4538
+ display: flex;
4539
+ align-items: center;
4540
+ gap: 4px;
4541
+ width: 100%;
4542
+ padding: 12px 16px;
4543
+ border: none;
4544
+ background: transparent;
4545
+ color: inherit;
4546
+ font: inherit;
4547
+ cursor: pointer;
4548
+ transition: background 0.1s ease-in-out;
4549
+ }
4550
+ .table_sort_button:hover:not(:disabled) {
4551
+ background: var(--bt-color-state-hover-on-light);
4552
+ }
4553
+ .table_sort_button:focus-visible {
4554
+ outline: none;
4555
+ box-shadow: var(--bt-focus-ring);
4556
+ }
4557
+ .table_sort_button:disabled {
4558
+ cursor: not-allowed;
4559
+ opacity: 0.38;
4560
+ }
4561
+ .table_align_center .table_sort_button {
4562
+ justify-content: center;
4563
+ }
4564
+ .table_align_right .table_sort_button {
4565
+ justify-content: flex-end;
4566
+ }
4567
+ .table_sort_icon {
4568
+ flex-shrink: 0;
4569
+ color: var(--bt-color-text-caption);
4570
+ transition: color 0.1s ease-in-out;
4571
+ }
4572
+ .table_sort_icon_active {
4573
+ color: var(--bt-color-text-heading);
4574
+ }
4354
4575
  .table_tbody .table_row {
4355
4576
  border-bottom: 1px solid var(--bt-color-border-default);
4356
4577
  transition: background-color 0.1s ease-in-out;
@@ -4374,6 +4595,12 @@
4374
4595
  .table_tbody .table_row_skeleton {
4375
4596
  pointer-events: none;
4376
4597
  }
4598
+ .table_tbody .table_row_selected {
4599
+ background: var(--bt-color-accent-subtle);
4600
+ }
4601
+ .table_tbody .table_row_selected.table_row_hoverable:hover {
4602
+ background: var(--bt-color-accent-muted);
4603
+ }
4377
4604
  .table_td {
4378
4605
  padding: 12px 16px;
4379
4606
  color: var(--bt-color-text-body);
@@ -4406,6 +4633,12 @@
4406
4633
  line-height: 18px;
4407
4634
  letter-spacing: 0px;
4408
4635
  }
4636
+ .table_size_sm .table_th_sortable {
4637
+ padding: 0;
4638
+ }
4639
+ .table_size_sm .table_sort_button {
4640
+ padding: 8px 12px;
4641
+ }
4409
4642
  .table_size_lg .table_th,
4410
4643
  .table_size_lg .table_td {
4411
4644
  padding: 16px 20px;
@@ -4422,6 +4655,12 @@
4422
4655
  line-height: 22.5px;
4423
4656
  letter-spacing: 0px;
4424
4657
  }
4658
+ .table_size_lg .table_th_sortable {
4659
+ padding: 0;
4660
+ }
4661
+ .table_size_lg .table_sort_button {
4662
+ padding: 16px 20px;
4663
+ }
4425
4664
  .table_sticky_header .table_thead {
4426
4665
  position: sticky;
4427
4666
  top: 0;
@@ -4436,6 +4675,13 @@
4436
4675
  line-height: 20px;
4437
4676
  letter-spacing: 0px;
4438
4677
  }
4678
+ @media (prefers-reduced-motion: reduce) {
4679
+ .table_row,
4680
+ .table_sort_button,
4681
+ .table_sort_icon {
4682
+ transition: none;
4683
+ }
4684
+ }
4439
4685
 
4440
4686
  /* src/ui/forms/textfield/style.scss */
4441
4687
  @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"> {
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;
1359
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[];
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> {
@@ -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,21 @@ interface TableProps<T extends object> {
1796
1897
  className?: string;
1797
1898
  /** ํ–‰ ํด๋ฆญ ์ฝœ๋ฐฑ */
1798
1899
  onRowClick?: (item: T, index: number) => void;
1799
- }
1900
+ /** ํ˜„์žฌ ์ •๋ ฌ ์ƒํƒœ (์ œ์–ดํ˜•). `undefined` ๋Š” ์ •๋ ฌ ์—†์Œ */
1901
+ sort?: TableSort;
1902
+ /** ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ํ—ค๋” ํด๋ฆญ ์‹œ ๋ฐœํ™” (noneโ†’ascโ†’descโ†’none ์ˆœํ™˜). DS๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ •๋ ฌํ•˜์ง€ ์•Š์Œ - ์ •๋ ฌ๋œ `data` ๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•จ */
1903
+ onSortChange?: (sort: TableSort | undefined) => void;
1904
+ /** ์ „์ฒด ์„ ํƒ ์ฒดํฌ๋ฐ•์Šค aria-label (๊ธฐ๋ณธ๊ฐ’: "์ „์ฒด ์„ ํƒ") */
1905
+ selectAllAriaLabel?: string;
1906
+ /** ๊ฐœ๋ณ„ ํ–‰ ์„ ํƒ ์ฒดํฌ๋ฐ•์Šค aria-label (๊ธฐ๋ณธ๊ฐ’: (i) => `${i+1}๋ฒˆ์งธ ํ–‰ ์„ ํƒ`) */
1907
+ selectRowAriaLabel?: (index: number) => string;
1908
+ } & TableSelectionProps<T>;
1800
1909
  /**
1801
1910
  * ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๋กœ๋”ฉ ์ค‘์—๋Š” ํ—ค๋” ์œ ์ง€, ๋ฐ”๋””์— ์Šค์ผˆ๋ ˆํ†ค ํ–‰์„ ํ‘œ์‹œํ•œ๋‹ค.
1802
1911
  * @param props ํ…Œ์ด๋ธ” ์†์„ฑ
1803
1912
  * @returns ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ
1804
1913
  */
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;
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;
1806
1915
 
1807
1916
  type ThemeMode = "light" | "dark" | "system";
1808
1917
  type ResolvedTheme = "light" | "dark";
@@ -2199,4 +2308,4 @@ interface GridProps extends React$1.HTMLAttributes<HTMLDivElement> {
2199
2308
  */
2200
2309
  declare const Grid: ({ cols, minColWidth, gap, rowGap, colGap, singleColOnMobile, as: Tag, ref, className, children, style, ...props }: GridProps) => React$1.JSX.Element;
2201
2310
 
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 };
2311
+ 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 };