@bigtablet/design-system 2.0.0 → 2.0.2

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
@@ -27,7 +27,10 @@
27
27
  }
28
28
  .alert_overlay {
29
29
  position: fixed;
30
- inset: 0;
30
+ top: 0;
31
+ right: 0;
32
+ bottom: 0;
33
+ left: 0;
31
34
  background: rgba(0, 0, 0, 0.5);
32
35
  display: flex;
33
36
  align-items: center;
@@ -190,7 +193,10 @@
190
193
  .button::before {
191
194
  content: "";
192
195
  position: absolute;
193
- inset: 0;
196
+ top: 0;
197
+ right: 0;
198
+ bottom: 0;
199
+ left: 0;
194
200
  border-radius: inherit;
195
201
  transition: background 0.2s ease-in-out;
196
202
  pointer-events: none;
@@ -449,7 +455,7 @@
449
455
  .checkbox_input:disabled {
450
456
  cursor: not-allowed;
451
457
  }
452
- .checkbox:has(.checkbox_input:disabled) {
458
+ .checkbox_disabled {
453
459
  cursor: not-allowed;
454
460
  }
455
461
  .checkbox_input:checked ~ .checkbox_state_layer .checkbox_icon,
@@ -509,13 +515,14 @@
509
515
  transition: border-color 0.2s ease-in-out;
510
516
  }
511
517
  .chip_content {
518
+ flex: 1;
512
519
  display: inline-flex;
513
520
  align-items: center;
514
521
  gap: 4px;
515
522
  border: none;
516
523
  background: transparent;
517
524
  cursor: pointer;
518
- padding: 6px 12px;
525
+ padding: 6px 12px 6px 16px;
519
526
  font-size: 14px;
520
527
  font-weight: 500;
521
528
  line-height: 20px;
@@ -527,7 +534,10 @@
527
534
  .chip_content::before {
528
535
  content: "";
529
536
  position: absolute;
530
- inset: 0;
537
+ top: 0;
538
+ right: 0;
539
+ bottom: 0;
540
+ left: 0;
531
541
  border-radius: inherit;
532
542
  transition: background 0.2s ease-in-out;
533
543
  pointer-events: none;
@@ -559,24 +569,11 @@
559
569
  cursor: pointer;
560
570
  padding: 6px 8px 6px 0;
561
571
  color: #121212;
562
- position: relative;
563
- overflow: hidden;
564
- }
565
- .chip_trailing::before {
566
- content: "";
567
- position: absolute;
568
- inset: 0;
569
- border-radius: inherit;
570
- transition: background 0.2s ease-in-out;
571
- pointer-events: none;
572
572
  }
573
- .chip_trailing:hover:not(:disabled)::before {
574
- background: rgba(0, 0, 0, 0.05);
575
- }
576
- .chip_trailing:focus-visible:not(:disabled)::before {
573
+ .chip_trailing:focus-visible:not(:disabled) .chip_icon {
577
574
  background: rgba(0, 0, 0, 0.08);
578
575
  }
579
- .chip_trailing:active:not(:disabled)::before {
576
+ .chip_trailing:active:not(:disabled) .chip_icon {
580
577
  background: rgba(26, 26, 26, 0.12);
581
578
  }
582
579
  .chip_trailing:disabled {
@@ -584,14 +581,21 @@
584
581
  }
585
582
  .chip_icon {
586
583
  display: inline-flex;
584
+ align-items: center;
585
+ justify-content: center;
587
586
  width: 20px;
588
587
  height: 20px;
589
588
  flex-shrink: 0;
589
+ border-radius: 9999px;
590
+ transition: background 0.2s ease-in-out;
590
591
  }
591
592
  .chip_icon svg {
592
593
  width: 100%;
593
594
  height: 100%;
594
595
  }
596
+ .chip_trailing:hover:not(:disabled) .chip_icon {
597
+ background: rgba(0, 0, 0, 0.05);
598
+ }
595
599
  .chip_label {
596
600
  white-space: nowrap;
597
601
  }
@@ -767,7 +771,10 @@
767
771
  .fab::before {
768
772
  content: "";
769
773
  position: absolute;
770
- inset: 0;
774
+ top: 0;
775
+ right: 0;
776
+ bottom: 0;
777
+ left: 0;
771
778
  border-radius: inherit;
772
779
  transition: background 0.2s ease-in-out;
773
780
  pointer-events: none;
@@ -846,7 +853,10 @@
846
853
  }
847
854
  .file_input_control {
848
855
  position: absolute;
849
- inset: 0;
856
+ top: 0;
857
+ right: 0;
858
+ bottom: 0;
859
+ left: 0;
850
860
  opacity: 0;
851
861
  cursor: pointer;
852
862
  }
@@ -933,7 +943,10 @@
933
943
  .icon_button::before {
934
944
  content: "";
935
945
  position: absolute;
936
- inset: 0;
946
+ top: 0;
947
+ right: 0;
948
+ bottom: 0;
949
+ left: 0;
937
950
  border-radius: inherit;
938
951
  transition: background 0.2s ease-in-out;
939
952
  pointer-events: none;
@@ -1091,6 +1104,7 @@
1091
1104
  align-items: flex-start;
1092
1105
  min-height: 52px;
1093
1106
  padding-left: 16px;
1107
+ padding-right: 16px;
1094
1108
  position: relative;
1095
1109
  }
1096
1110
  .list_item_align_middle > .list_item_state_layer {
@@ -1102,7 +1116,10 @@
1102
1116
  .list_item_interactive .list_item_state_layer::before {
1103
1117
  content: "";
1104
1118
  position: absolute;
1105
- inset: 0;
1119
+ top: 0;
1120
+ right: 0;
1121
+ bottom: 0;
1122
+ left: 0;
1106
1123
  transition: background 0.2s ease-in-out;
1107
1124
  pointer-events: none;
1108
1125
  }
@@ -1182,7 +1199,10 @@
1182
1199
  }
1183
1200
  .modal {
1184
1201
  position: fixed;
1185
- inset: 0;
1202
+ top: 0;
1203
+ right: 0;
1204
+ bottom: 0;
1205
+ left: 0;
1186
1206
  display: grid;
1187
1207
  place-items: center;
1188
1208
  background: rgba(0, 0, 0, 0.5);
@@ -1382,7 +1402,7 @@
1382
1402
  .radio_input:disabled ~ .radio_label {
1383
1403
  opacity: 0.38;
1384
1404
  }
1385
- .radio:has(.radio_input:disabled) {
1405
+ .radio_disabled {
1386
1406
  cursor: not-allowed;
1387
1407
  }
1388
1408
  .radio_input:checked ~ .radio_state_layer .radio_dot {
@@ -1393,12 +1413,20 @@
1393
1413
  position: absolute;
1394
1414
  left: 50%;
1395
1415
  top: 50%;
1396
- width: 60%;
1397
- height: 60%;
1416
+ width: 8px;
1417
+ height: 8px;
1398
1418
  transform: translate(-50%, -50%);
1399
1419
  background: #121212;
1400
1420
  border-radius: 9999px;
1401
1421
  }
1422
+ .radio_size_md .radio_input:checked ~ .radio_state_layer .radio_dot::after {
1423
+ width: 10px;
1424
+ height: 10px;
1425
+ }
1426
+ .radio_size_lg .radio_input:checked ~ .radio_state_layer .radio_dot::after {
1427
+ width: 10px;
1428
+ height: 10px;
1429
+ }
1402
1430
 
1403
1431
  /* src/ui/select/style.scss */
1404
1432
  @keyframes skeleton_loading {
@@ -1615,7 +1643,7 @@
1615
1643
  border-radius: 9999px;
1616
1644
  border: 2px solid #E5E5E5;
1617
1645
  border-top-color: #121212;
1618
- animation: spinner_spin 0.6s cubic-bezier(0.25, 1, 0.5, 1) linear infinite;
1646
+ animation: spinner_spin 0.8s linear infinite;
1619
1647
  }
1620
1648
 
1621
1649
  /* src/ui/switch/style.scss */
@@ -1791,7 +1819,7 @@
1791
1819
  .text_field_icon + .text_field_input_wrap {
1792
1820
  padding-left: 0;
1793
1821
  }
1794
- .text_field_input_wrap:has(+ .text_field_icon) {
1822
+ .text_field_input_wrap_no_pad_right {
1795
1823
  padding-right: 0;
1796
1824
  }
1797
1825
  .text_field_input {
@@ -1826,6 +1854,29 @@
1826
1854
  width: 20px;
1827
1855
  height: 20px;
1828
1856
  }
1857
+ .text_field_clear {
1858
+ display: inline-flex;
1859
+ align-items: center;
1860
+ justify-content: center;
1861
+ flex-shrink: 0;
1862
+ width: 40px;
1863
+ height: 40px;
1864
+ border: none;
1865
+ background: transparent;
1866
+ cursor: pointer;
1867
+ color: #888888;
1868
+ border-radius: 9999px;
1869
+ transition: color 0.2s ease-in-out, background 0.2s ease-in-out;
1870
+ padding: 0;
1871
+ }
1872
+ .text_field_clear:hover {
1873
+ color: #121212;
1874
+ background: rgba(0, 0, 0, 0.05);
1875
+ }
1876
+ .text_field_clear:focus-visible {
1877
+ outline: none;
1878
+ box-shadow: 0 0 0 3px rgba(18, 18, 18, 0.15);
1879
+ }
1829
1880
  .text_field_helper {
1830
1881
  padding: 4px 16px 0;
1831
1882
  font-family: "Pretendard", sans-serif;
@@ -1979,7 +2030,7 @@
1979
2030
  }
1980
2031
  .toast_icon {
1981
2032
  flex-shrink: 0;
1982
- margin-top: 1px;
2033
+ margin-top: 3px;
1983
2034
  display: flex;
1984
2035
  }
1985
2036
  .toast_icon_success {
package/dist/index.d.ts CHANGED
@@ -548,12 +548,14 @@ interface ChipProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onClic
548
548
  removable?: boolean;
549
549
  /** 비활성화 상태 */
550
550
  disabled?: boolean;
551
+ /** 팝업 열림 상태 (filter 타입에서 aria-expanded로 사용) */
552
+ open?: boolean;
551
553
  /** 칩 클릭 시 콜백 */
552
554
  onClick?: (event: React$1.MouseEvent<HTMLButtonElement>) => void;
553
555
  /** 삭제 버튼 클릭 시 콜백 */
554
556
  onRemove?: () => void;
555
557
  }
556
- declare const Chip: ({ type, label, selected, removable, disabled, onClick, onRemove, className, ...props }: ChipProps) => react_jsx_runtime.JSX.Element;
558
+ declare const Chip: ({ type, label, selected, removable, disabled, open, onClick, onRemove, className, ...props }: ChipProps) => react_jsx_runtime.JSX.Element;
557
559
 
558
560
  type DatePickerMode = "year-month" | "year-month-day";
559
561
  type SelectableRange = "all" | "until-today";
@@ -653,6 +655,36 @@ interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
653
655
  */
654
656
  declare const FileInput: ({ label, onFiles, supportingText, preview, className, disabled, ...props }: FileInputProps) => react_jsx_runtime.JSX.Element;
655
657
 
658
+ /**
659
+ * ⚠️ AUTO-GENERATED — DO NOT EDIT MANUALLY
660
+ * Run `node scripts/generate-icons.mjs` to regenerate.
661
+ *
662
+ * Source: @material-symbols/svg-300, @material-symbols/svg-400 (outlined)
663
+ * Icons: 57 icons × 4 variants (weight 300/400 × fill/no-fill)
664
+ * ViewBox: "0 -960 960 960" (Material Symbols standard)
665
+ */
666
+ type IconName = "add_a_photo" | "add_circle" | "add_lg" | "add_md" | "apartment" | "arrow_back" | "calendar_today" | "check" | "check_box" | "check_circle" | "close" | "close_small" | "cloud_download" | "cloud_upload" | "content_copy" | "delete_forever" | "edit" | "edit_note" | "error" | "event" | "fiber_manual_record" | "forward_5" | "group" | "groups" | "help" | "id" | "id_card" | "image" | "indeterminate_check_box" | "info" | "keyboard_arrow_down" | "keyboard_arrow_left" | "keyboard_arrow_right" | "keyboard_arrow_up" | "location_on" | "login" | "logout" | "more_vert" | "open_in_browser" | "open_in_new" | "pause" | "person" | "photo_camera" | "photo_library" | "play_arrow" | "replay_5" | "search" | "settings" | "share" | "speed_1_2x" | "speed_1_5x" | "speed_1_7x" | "speed_1x" | "speed_2x" | "stop" | "visibility" | "visibility_off";
667
+ type IconWeight = 300 | 400;
668
+
669
+ interface IconProps extends Omit<React$1.SVGProps<SVGSVGElement>, "fill"> {
670
+ /** 아이콘 이름 */
671
+ name: IconName;
672
+ /** 아이콘 크기 (px, 기본값: 24) */
673
+ size?: 20 | 24;
674
+ /** 선의 굵기 (기본값: 400) */
675
+ weight?: IconWeight;
676
+ /** 채움 스타일 여부 (기본값: false) */
677
+ fill?: boolean;
678
+ }
679
+ /**
680
+ * Material Symbols 기반 인라인 SVG 아이콘 컴포넌트.
681
+ * weight(300/400) × fill(true/false) × size(20/24) 조합을 지원한다.
682
+ */
683
+ declare const Icon: {
684
+ ({ name, size, weight, fill, style, ...props }: IconProps): react_jsx_runtime.JSX.Element | null;
685
+ displayName: string;
686
+ };
687
+
656
688
  type IconButtonVariant = "standard" | "filled" | "tonal" | "outlined";
657
689
  type IconButtonSize = "sm" | "md";
658
690
  interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
@@ -873,6 +905,8 @@ interface TextFieldProps extends Omit<React$1.InputHTMLAttributes<HTMLInputEleme
873
905
  leadingIcon?: React$1.ReactNode;
874
906
  /** 입력 필드 오른쪽에 표시할 아이콘 */
875
907
  trailingIcon?: React$1.ReactNode;
908
+ /** 값이 있을 때 오른쪽에 지우기(X) 버튼 표시 여부 */
909
+ clearable?: boolean;
876
910
  /** 컨테이너 전체 너비 차지 여부 */
877
911
  fullWidth?: boolean;
878
912
  /** 값 변경 시 호출되는 콜백 (IME 조합 완료 후 실행) */
@@ -893,7 +927,7 @@ interface TextFieldProps extends Omit<React$1.InputHTMLAttributes<HTMLInputEleme
893
927
  * @returns 렌더링된 텍스트 필드 UI
894
928
  */
895
929
  declare const TextField: {
896
- ({ id, label, showLabel, supportingText, error, leadingIcon, trailingIcon, fullWidth, className, onChangeAction, value, defaultValue, transformValue, ref, ...props }: TextFieldProps): react_jsx_runtime.JSX.Element;
930
+ ({ id, label, showLabel, supportingText, error, leadingIcon, trailingIcon, clearable, fullWidth, className, onChangeAction, value, defaultValue, transformValue, ref, ...props }: TextFieldProps): react_jsx_runtime.JSX.Element;
897
931
  displayName: string;
898
932
  };
899
933
 
@@ -951,4 +985,4 @@ interface TopLoadingProps {
951
985
  */
952
986
  declare const TopLoading: ({ progress, color, height, isLoading, ariaLabel, }: TopLoadingProps) => react_jsx_runtime.JSX.Element | null;
953
987
 
954
- export { AlertProvider, Button, type ButtonProps, Card, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipType, DatePicker, Divider, type DividerProps, FAB, type FABProps, type FABVariant, FileInput, type FileInputProps, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, Modal, type ModalProps, Pagination, type PaginationProps, Radio, type RadioProps, Select, type SelectOption, type SelectProps, Spinner, type SpinnerProps, Switch, type SwitchProps, TextField, type TextFieldProps, ToastProvider, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, colors, elevation, motion, opacity, radius, skeleton, spacing, typography, useAlert, useToast, zIndex };
988
+ export { AlertProvider, Button, type ButtonProps, Card, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipType, DatePicker, type DatePickerProps, Divider, type DividerProps, FAB, type FABProps, type FABVariant, FileInput, type FileInputProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconName, type IconProps, type IconWeight, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, Modal, type ModalProps, Pagination, type PaginationProps, Radio, type RadioProps, Select, type SelectOption, type SelectProps, Spinner, type SpinnerProps, Switch, type SwitchProps, TextField, type TextFieldProps, ToastProvider, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, colors, elevation, motion, opacity, radius, skeleton, spacing, typography, useAlert, useToast, zIndex };