@x-plat/design-system 0.1.4 → 0.1.5

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.
@@ -1062,6 +1062,7 @@ var ANIMATION_DURATION_MS = 200;
1062
1062
  var SelectRoot = (props) => {
1063
1063
  const {
1064
1064
  placeholder = "\uC120\uD0DD\uD558\uC138\uC694",
1065
+ value: valueProp,
1065
1066
  onChange,
1066
1067
  children,
1067
1068
  disabled = false,
@@ -1070,8 +1071,15 @@ var SelectRoot = (props) => {
1070
1071
  const itemChildren = import_react5.default.Children.toArray(children).filter(
1071
1072
  (child) => import_react5.default.isValidElement(child) && child.type === SelectItem_default
1072
1073
  );
1074
+ const isControlled = valueProp !== void 0;
1073
1075
  const [isOpen, setOpen] = import_react5.default.useState(false);
1074
- const [selectedLabel, setSelectedLabel] = import_react5.default.useState(null);
1076
+ const [uncontrolledLabel, setUncontrolledLabel] = import_react5.default.useState(null);
1077
+ const controlledLabel = import_react5.default.useMemo(() => {
1078
+ if (!isControlled) return null;
1079
+ const match = itemChildren.find((child) => child.props.value === valueProp);
1080
+ return match ? match.props.children : null;
1081
+ }, [isControlled, valueProp, itemChildren]);
1082
+ const selectedLabel = isControlled ? controlledLabel : uncontrolledLabel;
1075
1083
  const triggerRef = import_react5.default.useRef(null);
1076
1084
  const contentRef = import_react5.default.useRef(null);
1077
1085
  const [mounted, setMounted] = import_react5.default.useState(false);
@@ -1095,13 +1103,15 @@ var SelectRoot = (props) => {
1095
1103
  useClickOutside_default([contentRef, triggerRef], close, isOpen);
1096
1104
  const position = useAutoPosition_default(triggerRef, contentRef, mounted);
1097
1105
  const setSelected = import_react5.default.useCallback(
1098
- (label, value2) => {
1099
- setSelectedLabel(label);
1100
- onChange?.(value2, label);
1106
+ (label, itemValue) => {
1107
+ if (!isControlled) {
1108
+ setUncontrolledLabel(label);
1109
+ }
1110
+ onChange?.(itemValue, label);
1101
1111
  },
1102
- [onChange]
1112
+ [isControlled, onChange]
1103
1113
  );
1104
- const value = import_react5.default.useMemo(
1114
+ const ctxValue = import_react5.default.useMemo(
1105
1115
  () => ({
1106
1116
  isOpen,
1107
1117
  mounted,
@@ -1122,7 +1132,7 @@ var SelectRoot = (props) => {
1122
1132
  if (disabled) return;
1123
1133
  toggle();
1124
1134
  };
1125
- return /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(context_default.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)(
1135
+ return /* @__PURE__ */ (0, import_jsx_runtime296.jsx)(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ (0, import_jsx_runtime296.jsxs)(
1126
1136
  "div",
1127
1137
  {
1128
1138
  className: clsx_default(
@@ -22,6 +22,8 @@ type SelectChangeHandler = (value: string | number | undefined, label: React.Rea
22
22
  interface SelectProps {
23
23
  /** 선택 전 표시할 문구 */
24
24
  placeholder?: string;
25
+ /** 현재 선택된 값 (controlled) */
26
+ value?: string | number;
25
27
  /** 값이 바뀔 때 호출 */
26
28
  onChange?: SelectChangeHandler;
27
29
  /** Select.Item 만 허용 */
@@ -22,6 +22,8 @@ type SelectChangeHandler = (value: string | number | undefined, label: React.Rea
22
22
  interface SelectProps {
23
23
  /** 선택 전 표시할 문구 */
24
24
  placeholder?: string;
25
+ /** 현재 선택된 값 (controlled) */
26
+ value?: string | number;
25
27
  /** 값이 바뀔 때 호출 */
26
28
  onChange?: SelectChangeHandler;
27
29
  /** Select.Item 만 허용 */
@@ -1025,6 +1025,7 @@ var ANIMATION_DURATION_MS = 200;
1025
1025
  var SelectRoot = (props) => {
1026
1026
  const {
1027
1027
  placeholder = "\uC120\uD0DD\uD558\uC138\uC694",
1028
+ value: valueProp,
1028
1029
  onChange,
1029
1030
  children,
1030
1031
  disabled = false,
@@ -1033,8 +1034,15 @@ var SelectRoot = (props) => {
1033
1034
  const itemChildren = React5.Children.toArray(children).filter(
1034
1035
  (child) => React5.isValidElement(child) && child.type === SelectItem_default
1035
1036
  );
1037
+ const isControlled = valueProp !== void 0;
1036
1038
  const [isOpen, setOpen] = React5.useState(false);
1037
- const [selectedLabel, setSelectedLabel] = React5.useState(null);
1039
+ const [uncontrolledLabel, setUncontrolledLabel] = React5.useState(null);
1040
+ const controlledLabel = React5.useMemo(() => {
1041
+ if (!isControlled) return null;
1042
+ const match = itemChildren.find((child) => child.props.value === valueProp);
1043
+ return match ? match.props.children : null;
1044
+ }, [isControlled, valueProp, itemChildren]);
1045
+ const selectedLabel = isControlled ? controlledLabel : uncontrolledLabel;
1038
1046
  const triggerRef = React5.useRef(null);
1039
1047
  const contentRef = React5.useRef(null);
1040
1048
  const [mounted, setMounted] = React5.useState(false);
@@ -1058,13 +1066,15 @@ var SelectRoot = (props) => {
1058
1066
  useClickOutside_default([contentRef, triggerRef], close, isOpen);
1059
1067
  const position = useAutoPosition_default(triggerRef, contentRef, mounted);
1060
1068
  const setSelected = React5.useCallback(
1061
- (label, value2) => {
1062
- setSelectedLabel(label);
1063
- onChange?.(value2, label);
1069
+ (label, itemValue) => {
1070
+ if (!isControlled) {
1071
+ setUncontrolledLabel(label);
1072
+ }
1073
+ onChange?.(itemValue, label);
1064
1074
  },
1065
- [onChange]
1075
+ [isControlled, onChange]
1066
1076
  );
1067
- const value = React5.useMemo(
1077
+ const ctxValue = React5.useMemo(
1068
1078
  () => ({
1069
1079
  isOpen,
1070
1080
  mounted,
@@ -1085,7 +1095,7 @@ var SelectRoot = (props) => {
1085
1095
  if (disabled) return;
1086
1096
  toggle();
1087
1097
  };
1088
- return /* @__PURE__ */ jsx296(context_default.Provider, { value, children: /* @__PURE__ */ jsxs189(
1098
+ return /* @__PURE__ */ jsx296(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs189(
1089
1099
  "div",
1090
1100
  {
1091
1101
  className: clsx_default(
@@ -186,6 +186,7 @@ var KNOB_TRANSITION_MS = 250;
186
186
  var Switch = (props) => {
187
187
  const {
188
188
  value,
189
+ size = "md",
189
190
  disabled,
190
191
  onChange,
191
192
  colorNamespace = "xplat",
@@ -220,6 +221,7 @@ var Switch = (props) => {
220
221
  {
221
222
  className: clsx_default(
222
223
  "lib-xplat-switch",
224
+ size,
223
225
  value ? "checked" : void 0,
224
226
  disabled && "disabled",
225
227
  isAnimating && "animating",
@@ -1,15 +1,46 @@
1
1
  /* src/components/Switch/switch.scss */
2
2
  .lib-xplat-switch {
3
3
  position: relative;
4
- width: 4rem;
5
- height: 2rem;
6
- border-radius: 1rem;
4
+ border-radius: 9999px;
7
5
  cursor: pointer;
8
6
  transition: background-color 0.2s, border-color 0.2s;
9
7
  border: 1px solid transparent;
10
8
  background-color: #D4D4D4;
11
9
  border-color: #D4D4D4;
12
10
  }
11
+ .lib-xplat-switch.sm {
12
+ width: 2rem;
13
+ height: 1.125rem;
14
+ }
15
+ .lib-xplat-switch.sm > .knob {
16
+ width: 0.875rem;
17
+ height: 0.875rem;
18
+ }
19
+ .lib-xplat-switch.sm > .knob.checked {
20
+ transform: translateY(-50%) translateX(0.875rem);
21
+ }
22
+ .lib-xplat-switch.md {
23
+ width: 3rem;
24
+ height: 1.625rem;
25
+ }
26
+ .lib-xplat-switch.md > .knob {
27
+ width: 1.375rem;
28
+ height: 1.375rem;
29
+ }
30
+ .lib-xplat-switch.md > .knob.checked {
31
+ transform: translateY(-50%) translateX(1.375rem);
32
+ }
33
+ .lib-xplat-switch.lg {
34
+ width: 3.5rem;
35
+ height: 1.875rem;
36
+ }
37
+ .lib-xplat-switch.lg > .knob {
38
+ width: 1.625rem;
39
+ height: 1.625rem;
40
+ }
41
+ .lib-xplat-switch.lg > .knob.checked {
42
+ transform: translateY(-50%) translateX(1.625rem);
43
+ }
13
44
  .lib-xplat-switch.disabled {
14
45
  opacity: 0.5;
15
46
  cursor: not-allowed;
@@ -767,14 +798,9 @@
767
798
  position: absolute;
768
799
  top: 50%;
769
800
  left: 0;
770
- width: 1.75rem;
771
- height: 1.75rem;
772
801
  background-color: #FFFFFF;
773
802
  border-radius: 9999px;
774
803
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
775
804
  transform: translateY(-50%);
776
805
  transition: transform 0.25s;
777
806
  }
778
- .lib-xplat-switch > .knob.checked {
779
- transform: translateY(-50%) translateX(2rem);
780
- }
@@ -1,8 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { C as ColorNamespace, a as ColorName, d as ColorProps } from '../../colors-BG91q_uV.cjs';
3
3
 
4
+ type SwitchSize = "sm" | "md" | "lg";
4
5
  interface SwitchProps<N extends ColorNamespace, C extends ColorName<N> = ColorName<N>> extends ColorProps<N, C> {
5
6
  value: boolean;
7
+ size?: SwitchSize;
6
8
  disabled?: boolean;
7
9
  className?: string;
8
10
  onChange?: (value: boolean) => void;
@@ -1,8 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { C as ColorNamespace, a as ColorName, d as ColorProps } from '../../colors-BG91q_uV.js';
3
3
 
4
+ type SwitchSize = "sm" | "md" | "lg";
4
5
  interface SwitchProps<N extends ColorNamespace, C extends ColorName<N> = ColorName<N>> extends ColorProps<N, C> {
5
6
  value: boolean;
7
+ size?: SwitchSize;
6
8
  disabled?: boolean;
7
9
  className?: string;
8
10
  onChange?: (value: boolean) => void;
@@ -150,6 +150,7 @@ var KNOB_TRANSITION_MS = 250;
150
150
  var Switch = (props) => {
151
151
  const {
152
152
  value,
153
+ size = "md",
153
154
  disabled,
154
155
  onChange,
155
156
  colorNamespace = "xplat",
@@ -184,6 +185,7 @@ var Switch = (props) => {
184
185
  {
185
186
  className: clsx_default(
186
187
  "lib-xplat-switch",
188
+ size,
187
189
  value ? "checked" : void 0,
188
190
  disabled && "disabled",
189
191
  isAnimating && "animating",
@@ -2766,6 +2766,7 @@ var ANIMATION_DURATION_MS3 = 200;
2766
2766
  var SelectRoot = (props) => {
2767
2767
  const {
2768
2768
  placeholder = "\uC120\uD0DD\uD558\uC138\uC694",
2769
+ value: valueProp,
2769
2770
  onChange,
2770
2771
  children,
2771
2772
  disabled = false,
@@ -2774,8 +2775,15 @@ var SelectRoot = (props) => {
2774
2775
  const itemChildren = import_react17.default.Children.toArray(children).filter(
2775
2776
  (child) => import_react17.default.isValidElement(child) && child.type === SelectItem_default
2776
2777
  );
2778
+ const isControlled = valueProp !== void 0;
2777
2779
  const [isOpen, setOpen] = import_react17.default.useState(false);
2778
- const [selectedLabel, setSelectedLabel] = import_react17.default.useState(null);
2780
+ const [uncontrolledLabel, setUncontrolledLabel] = import_react17.default.useState(null);
2781
+ const controlledLabel = import_react17.default.useMemo(() => {
2782
+ if (!isControlled) return null;
2783
+ const match = itemChildren.find((child) => child.props.value === valueProp);
2784
+ return match ? match.props.children : null;
2785
+ }, [isControlled, valueProp, itemChildren]);
2786
+ const selectedLabel = isControlled ? controlledLabel : uncontrolledLabel;
2779
2787
  const triggerRef = import_react17.default.useRef(null);
2780
2788
  const contentRef = import_react17.default.useRef(null);
2781
2789
  const [mounted, setMounted] = import_react17.default.useState(false);
@@ -2799,13 +2807,15 @@ var SelectRoot = (props) => {
2799
2807
  useClickOutside_default([contentRef, triggerRef], close, isOpen);
2800
2808
  const position = useAutoPosition_default(triggerRef, contentRef, mounted);
2801
2809
  const setSelected = import_react17.default.useCallback(
2802
- (label, value2) => {
2803
- setSelectedLabel(label);
2804
- onChange?.(value2, label);
2810
+ (label, itemValue) => {
2811
+ if (!isControlled) {
2812
+ setUncontrolledLabel(label);
2813
+ }
2814
+ onChange?.(itemValue, label);
2805
2815
  },
2806
- [onChange]
2816
+ [isControlled, onChange]
2807
2817
  );
2808
- const value = import_react17.default.useMemo(
2818
+ const ctxValue = import_react17.default.useMemo(
2809
2819
  () => ({
2810
2820
  isOpen,
2811
2821
  mounted,
@@ -2826,7 +2836,7 @@ var SelectRoot = (props) => {
2826
2836
  if (disabled) return;
2827
2837
  toggle();
2828
2838
  };
2829
- return /* @__PURE__ */ (0, import_jsx_runtime319.jsx)(context_default.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime319.jsxs)(
2839
+ return /* @__PURE__ */ (0, import_jsx_runtime319.jsx)(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ (0, import_jsx_runtime319.jsxs)(
2830
2840
  "div",
2831
2841
  {
2832
2842
  className: clsx_default(
@@ -3460,6 +3470,7 @@ var KNOB_TRANSITION_MS = 250;
3460
3470
  var Switch = (props) => {
3461
3471
  const {
3462
3472
  value,
3473
+ size = "md",
3463
3474
  disabled,
3464
3475
  onChange,
3465
3476
  colorNamespace = "xplat",
@@ -3494,6 +3505,7 @@ var Switch = (props) => {
3494
3505
  {
3495
3506
  className: clsx_default(
3496
3507
  "lib-xplat-switch",
3508
+ size,
3497
3509
  value ? "checked" : void 0,
3498
3510
  disabled && "disabled",
3499
3511
  isAnimating && "animating",
@@ -7267,15 +7267,46 @@
7267
7267
  /* src/components/Switch/switch.scss */
7268
7268
  .lib-xplat-switch {
7269
7269
  position: relative;
7270
- width: 4rem;
7271
- height: 2rem;
7272
- border-radius: 1rem;
7270
+ border-radius: 9999px;
7273
7271
  cursor: pointer;
7274
7272
  transition: background-color 0.2s, border-color 0.2s;
7275
7273
  border: 1px solid transparent;
7276
7274
  background-color: #D4D4D4;
7277
7275
  border-color: #D4D4D4;
7278
7276
  }
7277
+ .lib-xplat-switch.sm {
7278
+ width: 2rem;
7279
+ height: 1.125rem;
7280
+ }
7281
+ .lib-xplat-switch.sm > .knob {
7282
+ width: 0.875rem;
7283
+ height: 0.875rem;
7284
+ }
7285
+ .lib-xplat-switch.sm > .knob.checked {
7286
+ transform: translateY(-50%) translateX(0.875rem);
7287
+ }
7288
+ .lib-xplat-switch.md {
7289
+ width: 3rem;
7290
+ height: 1.625rem;
7291
+ }
7292
+ .lib-xplat-switch.md > .knob {
7293
+ width: 1.375rem;
7294
+ height: 1.375rem;
7295
+ }
7296
+ .lib-xplat-switch.md > .knob.checked {
7297
+ transform: translateY(-50%) translateX(1.375rem);
7298
+ }
7299
+ .lib-xplat-switch.lg {
7300
+ width: 3.5rem;
7301
+ height: 1.875rem;
7302
+ }
7303
+ .lib-xplat-switch.lg > .knob {
7304
+ width: 1.625rem;
7305
+ height: 1.625rem;
7306
+ }
7307
+ .lib-xplat-switch.lg > .knob.checked {
7308
+ transform: translateY(-50%) translateX(1.625rem);
7309
+ }
7279
7310
  .lib-xplat-switch.disabled {
7280
7311
  opacity: 0.5;
7281
7312
  cursor: not-allowed;
@@ -8033,17 +8064,12 @@
8033
8064
  position: absolute;
8034
8065
  top: 50%;
8035
8066
  left: 0;
8036
- width: 1.75rem;
8037
- height: 1.75rem;
8038
8067
  background-color: #FFFFFF;
8039
8068
  border-radius: 9999px;
8040
8069
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
8041
8070
  transform: translateY(-50%);
8042
8071
  transition: transform 0.25s;
8043
8072
  }
8044
- .lib-xplat-switch > .knob.checked {
8045
- transform: translateY(-50%) translateX(2rem);
8046
- }
8047
8073
 
8048
8074
  /* src/components/Tab/tab.scss */
8049
8075
  .lib-xplat-tab {
@@ -2695,6 +2695,7 @@ var ANIMATION_DURATION_MS3 = 200;
2695
2695
  var SelectRoot = (props) => {
2696
2696
  const {
2697
2697
  placeholder = "\uC120\uD0DD\uD558\uC138\uC694",
2698
+ value: valueProp,
2698
2699
  onChange,
2699
2700
  children,
2700
2701
  disabled = false,
@@ -2703,8 +2704,15 @@ var SelectRoot = (props) => {
2703
2704
  const itemChildren = React16.Children.toArray(children).filter(
2704
2705
  (child) => React16.isValidElement(child) && child.type === SelectItem_default
2705
2706
  );
2707
+ const isControlled = valueProp !== void 0;
2706
2708
  const [isOpen, setOpen] = React16.useState(false);
2707
- const [selectedLabel, setSelectedLabel] = React16.useState(null);
2709
+ const [uncontrolledLabel, setUncontrolledLabel] = React16.useState(null);
2710
+ const controlledLabel = React16.useMemo(() => {
2711
+ if (!isControlled) return null;
2712
+ const match = itemChildren.find((child) => child.props.value === valueProp);
2713
+ return match ? match.props.children : null;
2714
+ }, [isControlled, valueProp, itemChildren]);
2715
+ const selectedLabel = isControlled ? controlledLabel : uncontrolledLabel;
2708
2716
  const triggerRef = React16.useRef(null);
2709
2717
  const contentRef = React16.useRef(null);
2710
2718
  const [mounted, setMounted] = React16.useState(false);
@@ -2728,13 +2736,15 @@ var SelectRoot = (props) => {
2728
2736
  useClickOutside_default([contentRef, triggerRef], close, isOpen);
2729
2737
  const position = useAutoPosition_default(triggerRef, contentRef, mounted);
2730
2738
  const setSelected = React16.useCallback(
2731
- (label, value2) => {
2732
- setSelectedLabel(label);
2733
- onChange?.(value2, label);
2739
+ (label, itemValue) => {
2740
+ if (!isControlled) {
2741
+ setUncontrolledLabel(label);
2742
+ }
2743
+ onChange?.(itemValue, label);
2734
2744
  },
2735
- [onChange]
2745
+ [isControlled, onChange]
2736
2746
  );
2737
- const value = React16.useMemo(
2747
+ const ctxValue = React16.useMemo(
2738
2748
  () => ({
2739
2749
  isOpen,
2740
2750
  mounted,
@@ -2755,7 +2765,7 @@ var SelectRoot = (props) => {
2755
2765
  if (disabled) return;
2756
2766
  toggle();
2757
2767
  };
2758
- return /* @__PURE__ */ jsx319(context_default.Provider, { value, children: /* @__PURE__ */ jsxs203(
2768
+ return /* @__PURE__ */ jsx319(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs203(
2759
2769
  "div",
2760
2770
  {
2761
2771
  className: clsx_default(
@@ -3389,6 +3399,7 @@ var KNOB_TRANSITION_MS = 250;
3389
3399
  var Switch = (props) => {
3390
3400
  const {
3391
3401
  value,
3402
+ size = "md",
3392
3403
  disabled,
3393
3404
  onChange,
3394
3405
  colorNamespace = "xplat",
@@ -3423,6 +3434,7 @@ var Switch = (props) => {
3423
3434
  {
3424
3435
  className: clsx_default(
3425
3436
  "lib-xplat-switch",
3437
+ size,
3426
3438
  value ? "checked" : void 0,
3427
3439
  disabled && "disabled",
3428
3440
  isAnimating && "animating",
package/dist/index.cjs CHANGED
@@ -7304,6 +7304,7 @@ var ANIMATION_DURATION_MS3 = 200;
7304
7304
  var SelectRoot = (props) => {
7305
7305
  const {
7306
7306
  placeholder = "\uC120\uD0DD\uD558\uC138\uC694",
7307
+ value: valueProp,
7307
7308
  onChange,
7308
7309
  children,
7309
7310
  disabled = false,
@@ -7312,8 +7313,15 @@ var SelectRoot = (props) => {
7312
7313
  const itemChildren = import_react17.default.Children.toArray(children).filter(
7313
7314
  (child) => import_react17.default.isValidElement(child) && child.type === SelectItem_default
7314
7315
  );
7316
+ const isControlled = valueProp !== void 0;
7315
7317
  const [isOpen, setOpen] = import_react17.default.useState(false);
7316
- const [selectedLabel, setSelectedLabel] = import_react17.default.useState(null);
7318
+ const [uncontrolledLabel, setUncontrolledLabel] = import_react17.default.useState(null);
7319
+ const controlledLabel = import_react17.default.useMemo(() => {
7320
+ if (!isControlled) return null;
7321
+ const match = itemChildren.find((child) => child.props.value === valueProp);
7322
+ return match ? match.props.children : null;
7323
+ }, [isControlled, valueProp, itemChildren]);
7324
+ const selectedLabel = isControlled ? controlledLabel : uncontrolledLabel;
7317
7325
  const triggerRef = import_react17.default.useRef(null);
7318
7326
  const contentRef = import_react17.default.useRef(null);
7319
7327
  const [mounted, setMounted] = import_react17.default.useState(false);
@@ -7337,13 +7345,15 @@ var SelectRoot = (props) => {
7337
7345
  useClickOutside_default([contentRef, triggerRef], close, isOpen);
7338
7346
  const position = useAutoPosition_default(triggerRef, contentRef, mounted);
7339
7347
  const setSelected = import_react17.default.useCallback(
7340
- (label, value2) => {
7341
- setSelectedLabel(label);
7342
- onChange?.(value2, label);
7348
+ (label, itemValue) => {
7349
+ if (!isControlled) {
7350
+ setUncontrolledLabel(label);
7351
+ }
7352
+ onChange?.(itemValue, label);
7343
7353
  },
7344
- [onChange]
7354
+ [isControlled, onChange]
7345
7355
  );
7346
- const value = import_react17.default.useMemo(
7356
+ const ctxValue = import_react17.default.useMemo(
7347
7357
  () => ({
7348
7358
  isOpen,
7349
7359
  mounted,
@@ -7364,7 +7374,7 @@ var SelectRoot = (props) => {
7364
7374
  if (disabled) return;
7365
7375
  toggle();
7366
7376
  };
7367
- return /* @__PURE__ */ (0, import_jsx_runtime319.jsx)(context_default.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime319.jsxs)(
7377
+ return /* @__PURE__ */ (0, import_jsx_runtime319.jsx)(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ (0, import_jsx_runtime319.jsxs)(
7368
7378
  "div",
7369
7379
  {
7370
7380
  className: clsx_default(
@@ -7998,6 +8008,7 @@ var KNOB_TRANSITION_MS = 250;
7998
8008
  var Switch = (props) => {
7999
8009
  const {
8000
8010
  value,
8011
+ size = "md",
8001
8012
  disabled,
8002
8013
  onChange,
8003
8014
  colorNamespace = "xplat",
@@ -8032,6 +8043,7 @@ var Switch = (props) => {
8032
8043
  {
8033
8044
  className: clsx_default(
8034
8045
  "lib-xplat-switch",
8046
+ size,
8035
8047
  value ? "checked" : void 0,
8036
8048
  disabled && "disabled",
8037
8049
  isAnimating && "animating",
package/dist/index.css CHANGED
@@ -7269,15 +7269,46 @@
7269
7269
  /* src/components/Switch/switch.scss */
7270
7270
  .lib-xplat-switch {
7271
7271
  position: relative;
7272
- width: 4rem;
7273
- height: 2rem;
7274
- border-radius: 1rem;
7272
+ border-radius: 9999px;
7275
7273
  cursor: pointer;
7276
7274
  transition: background-color 0.2s, border-color 0.2s;
7277
7275
  border: 1px solid transparent;
7278
7276
  background-color: #D4D4D4;
7279
7277
  border-color: #D4D4D4;
7280
7278
  }
7279
+ .lib-xplat-switch.sm {
7280
+ width: 2rem;
7281
+ height: 1.125rem;
7282
+ }
7283
+ .lib-xplat-switch.sm > .knob {
7284
+ width: 0.875rem;
7285
+ height: 0.875rem;
7286
+ }
7287
+ .lib-xplat-switch.sm > .knob.checked {
7288
+ transform: translateY(-50%) translateX(0.875rem);
7289
+ }
7290
+ .lib-xplat-switch.md {
7291
+ width: 3rem;
7292
+ height: 1.625rem;
7293
+ }
7294
+ .lib-xplat-switch.md > .knob {
7295
+ width: 1.375rem;
7296
+ height: 1.375rem;
7297
+ }
7298
+ .lib-xplat-switch.md > .knob.checked {
7299
+ transform: translateY(-50%) translateX(1.375rem);
7300
+ }
7301
+ .lib-xplat-switch.lg {
7302
+ width: 3.5rem;
7303
+ height: 1.875rem;
7304
+ }
7305
+ .lib-xplat-switch.lg > .knob {
7306
+ width: 1.625rem;
7307
+ height: 1.625rem;
7308
+ }
7309
+ .lib-xplat-switch.lg > .knob.checked {
7310
+ transform: translateY(-50%) translateX(1.625rem);
7311
+ }
7281
7312
  .lib-xplat-switch.disabled {
7282
7313
  opacity: 0.5;
7283
7314
  cursor: not-allowed;
@@ -8035,17 +8066,12 @@
8035
8066
  position: absolute;
8036
8067
  top: 50%;
8037
8068
  left: 0;
8038
- width: 1.75rem;
8039
- height: 1.75rem;
8040
8069
  background-color: #FFFFFF;
8041
8070
  border-radius: 9999px;
8042
8071
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
8043
8072
  transform: translateY(-50%);
8044
8073
  transition: transform 0.25s;
8045
8074
  }
8046
- .lib-xplat-switch > .knob.checked {
8047
- transform: translateY(-50%) translateX(2rem);
8048
- }
8049
8075
 
8050
8076
  /* src/components/Tab/tab.scss */
8051
8077
  .lib-xplat-tab {
package/dist/index.js CHANGED
@@ -6926,6 +6926,7 @@ var ANIMATION_DURATION_MS3 = 200;
6926
6926
  var SelectRoot = (props) => {
6927
6927
  const {
6928
6928
  placeholder = "\uC120\uD0DD\uD558\uC138\uC694",
6929
+ value: valueProp,
6929
6930
  onChange,
6930
6931
  children,
6931
6932
  disabled = false,
@@ -6934,8 +6935,15 @@ var SelectRoot = (props) => {
6934
6935
  const itemChildren = React16.Children.toArray(children).filter(
6935
6936
  (child) => React16.isValidElement(child) && child.type === SelectItem_default
6936
6937
  );
6938
+ const isControlled = valueProp !== void 0;
6937
6939
  const [isOpen, setOpen] = React16.useState(false);
6938
- const [selectedLabel, setSelectedLabel] = React16.useState(null);
6940
+ const [uncontrolledLabel, setUncontrolledLabel] = React16.useState(null);
6941
+ const controlledLabel = React16.useMemo(() => {
6942
+ if (!isControlled) return null;
6943
+ const match = itemChildren.find((child) => child.props.value === valueProp);
6944
+ return match ? match.props.children : null;
6945
+ }, [isControlled, valueProp, itemChildren]);
6946
+ const selectedLabel = isControlled ? controlledLabel : uncontrolledLabel;
6939
6947
  const triggerRef = React16.useRef(null);
6940
6948
  const contentRef = React16.useRef(null);
6941
6949
  const [mounted, setMounted] = React16.useState(false);
@@ -6959,13 +6967,15 @@ var SelectRoot = (props) => {
6959
6967
  useClickOutside_default([contentRef, triggerRef], close, isOpen);
6960
6968
  const position = useAutoPosition_default(triggerRef, contentRef, mounted);
6961
6969
  const setSelected = React16.useCallback(
6962
- (label, value2) => {
6963
- setSelectedLabel(label);
6964
- onChange?.(value2, label);
6970
+ (label, itemValue) => {
6971
+ if (!isControlled) {
6972
+ setUncontrolledLabel(label);
6973
+ }
6974
+ onChange?.(itemValue, label);
6965
6975
  },
6966
- [onChange]
6976
+ [isControlled, onChange]
6967
6977
  );
6968
- const value = React16.useMemo(
6978
+ const ctxValue = React16.useMemo(
6969
6979
  () => ({
6970
6980
  isOpen,
6971
6981
  mounted,
@@ -6986,7 +6996,7 @@ var SelectRoot = (props) => {
6986
6996
  if (disabled) return;
6987
6997
  toggle();
6988
6998
  };
6989
- return /* @__PURE__ */ jsx319(context_default.Provider, { value, children: /* @__PURE__ */ jsxs203(
6999
+ return /* @__PURE__ */ jsx319(context_default.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs203(
6990
7000
  "div",
6991
7001
  {
6992
7002
  className: clsx_default(
@@ -7620,6 +7630,7 @@ var KNOB_TRANSITION_MS = 250;
7620
7630
  var Switch = (props) => {
7621
7631
  const {
7622
7632
  value,
7633
+ size = "md",
7623
7634
  disabled,
7624
7635
  onChange,
7625
7636
  colorNamespace = "xplat",
@@ -7654,6 +7665,7 @@ var Switch = (props) => {
7654
7665
  {
7655
7666
  className: clsx_default(
7656
7667
  "lib-xplat-switch",
7668
+ size,
7657
7669
  value ? "checked" : void 0,
7658
7670
  disabled && "disabled",
7659
7671
  isAnimating && "animating",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-plat/design-system",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "XPLAT UI Design System package",
5
5
  "author": "XPLAT WOONG",
6
6
  "main": "dist/index.cjs",