@x-plat/design-system 0.12.0 → 0.14.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.
Files changed (72) hide show
  1. package/dist/{breakpoints-DsXkJgdl.d.cts → breakpoints-CKkNxA-y.d.cts} +1 -1
  2. package/dist/{breakpoints-DsXkJgdl.d.ts → breakpoints-CKkNxA-y.d.ts} +1 -1
  3. package/dist/components/AutoResizeTextArea/index.cjs +2 -2
  4. package/dist/components/AutoResizeTextArea/index.js +2 -2
  5. package/dist/components/Badge/index.d.cts +1 -1
  6. package/dist/components/Badge/index.d.ts +1 -1
  7. package/dist/components/ChatInput/index.cjs +2 -2
  8. package/dist/components/ChatInput/index.js +2 -2
  9. package/dist/components/CheckBox/index.cjs +2 -2
  10. package/dist/components/CheckBox/index.js +2 -2
  11. package/dist/components/DatePicker/index.cjs +109 -75
  12. package/dist/components/DatePicker/index.d.cts +19 -0
  13. package/dist/components/DatePicker/index.d.ts +19 -0
  14. package/dist/components/DatePicker/index.js +109 -75
  15. package/dist/components/Editor/index.css +3 -0
  16. package/dist/components/FieldMessage/index.cjs +2 -2
  17. package/dist/components/FieldMessage/index.d.cts +8 -0
  18. package/dist/components/FieldMessage/index.d.ts +8 -0
  19. package/dist/components/FieldMessage/index.js +2 -2
  20. package/dist/components/FileUpload/index.cjs +10 -6
  21. package/dist/components/FileUpload/index.d.cts +15 -2
  22. package/dist/components/FileUpload/index.d.ts +15 -2
  23. package/dist/components/FileUpload/index.js +10 -6
  24. package/dist/components/ImageSelector/index.cjs +7 -6
  25. package/dist/components/ImageSelector/index.d.cts +15 -2
  26. package/dist/components/ImageSelector/index.d.ts +15 -2
  27. package/dist/components/ImageSelector/index.js +7 -6
  28. package/dist/components/Input/index.cjs +2 -2
  29. package/dist/components/Input/index.d.cts +4 -0
  30. package/dist/components/Input/index.d.ts +4 -0
  31. package/dist/components/Input/index.js +2 -2
  32. package/dist/components/Radio/index.cjs +2 -2
  33. package/dist/components/Radio/index.js +2 -2
  34. package/dist/components/Select/index.cjs +2 -2
  35. package/dist/components/Select/index.d.cts +1 -2
  36. package/dist/components/Select/index.d.ts +1 -2
  37. package/dist/components/Select/index.js +2 -2
  38. package/dist/components/Switch/index.cjs +2 -2
  39. package/dist/components/Switch/index.js +2 -2
  40. package/dist/components/TextArea/index.cjs +2 -2
  41. package/dist/components/TextArea/index.js +2 -2
  42. package/dist/components/TimePicker/index.cjs +2 -2
  43. package/dist/components/TimePicker/index.js +2 -2
  44. package/dist/components/ToggleChip/index.cjs +69 -0
  45. package/dist/components/ToggleChip/index.css +102 -0
  46. package/dist/components/ToggleChip/index.d.cts +37 -0
  47. package/dist/components/ToggleChip/index.d.ts +37 -0
  48. package/dist/components/ToggleChip/index.js +42 -0
  49. package/dist/components/index.cjs +184 -119
  50. package/dist/components/index.css +40 -0
  51. package/dist/components/index.d.cts +2 -1
  52. package/dist/components/index.d.ts +2 -1
  53. package/dist/components/index.js +174 -110
  54. package/dist/index.cjs +203 -138
  55. package/dist/index.css +40 -0
  56. package/dist/index.d.cts +4 -3
  57. package/dist/index.d.ts +4 -3
  58. package/dist/index.js +191 -127
  59. package/dist/layout/Grid/Item/index.d.cts +1 -1
  60. package/dist/layout/Grid/Item/index.d.ts +1 -1
  61. package/dist/layout/Grid/index.d.cts +1 -1
  62. package/dist/layout/Grid/index.d.ts +1 -1
  63. package/dist/layout/index.d.cts +1 -1
  64. package/dist/layout/index.d.ts +1 -1
  65. package/dist/tokens/index.d.cts +1 -1
  66. package/dist/tokens/index.d.ts +1 -1
  67. package/guidelines/Guidelines.md +13 -1
  68. package/guidelines/MIGRATION.md +297 -0
  69. package/guidelines/components/chip-tag.md +75 -2
  70. package/guidelines/components/datepicker.md +26 -0
  71. package/guidelines/components/file-media.md +21 -4
  72. package/package.json +1 -1
@@ -89,6 +89,7 @@ __export(components_exports, {
89
89
  TextArea: () => TextArea_default,
90
90
  TimePicker: () => TimePicker_default,
91
91
  ToastProvider: () => ToastProvider,
92
+ ToggleChip: () => ToggleChip_default,
92
93
  Tooltip: () => Tooltip_default,
93
94
  Video: () => Video_default,
94
95
  hasError: () => hasError,
@@ -1633,11 +1634,11 @@ var FieldMessage = (props) => {
1633
1634
  FieldMessage.displayName = "FieldMessage";
1634
1635
  var FieldMessage_default = FieldMessage;
1635
1636
  var Field = (props) => {
1636
- const { label, required = false, htmlFor, validations, children } = props;
1637
+ const { label, required = false, htmlFor, labelId, validations, children } = props;
1637
1638
  const hasMessages = !!validations && validations.length > 0;
1638
1639
  if (!label && !hasMessages) return /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(import_jsx_runtime297.Fragment, { children });
1639
1640
  return /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("div", { className: "lib-xplat-field", children: [
1640
- label && /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("label", { className: "lib-xplat-field-label", htmlFor, children: [
1641
+ label && /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("label", { className: "lib-xplat-field-label", id: labelId, htmlFor, children: [
1641
1642
  label,
1642
1643
  required && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("span", { className: "required", "aria-hidden": "true", children: "*" })
1643
1644
  ] }),
@@ -3404,8 +3405,12 @@ var SingleDatePicker = (props) => {
3404
3405
  highlightDates = [],
3405
3406
  locale = "ko",
3406
3407
  rangeStart,
3407
- rangeEnd
3408
+ rangeEnd,
3409
+ label,
3410
+ required,
3411
+ validations
3408
3412
  } = props;
3413
+ const labelId = import_react12.default.useId();
3409
3414
  const initialYear = value?.getFullYear();
3410
3415
  const initialMonth = value?.getMonth();
3411
3416
  const { year, month, days, goToPrevMonth, goToNextMonth, setYear, setMonth } = useCalendar(
@@ -3468,10 +3473,12 @@ var SingleDatePicker = (props) => {
3468
3473
  const monthLabels = MONTH_LABELS[locale];
3469
3474
  const titleText = pickerMode === "days" ? locale === "ko" ? `${year}\uB144 ${monthLabels[month]}` : `${monthLabels[month]} ${year}` : pickerMode === "months" ? `${year}` : `${yearRangeStart} - ${yearRangeStart + 11}`;
3470
3475
  const hasRange = rangeStart != null && rangeEnd != null;
3471
- return /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
3476
+ const calendar = /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
3472
3477
  "div",
3473
3478
  {
3474
3479
  className: clsx_default("lib-xplat-datepicker", "single"),
3480
+ role: "group",
3481
+ "aria-labelledby": label ? labelId : void 0,
3475
3482
  children: [
3476
3483
  /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "datepicker-header", children: [
3477
3484
  /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("button", { className: "datepicker-nav", onClick: handlePrev, type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(ChevronLeftIcon_default, {}) }),
@@ -3492,18 +3499,18 @@ var SingleDatePicker = (props) => {
3492
3499
  y
3493
3500
  );
3494
3501
  }) }),
3495
- pickerMode === "months" && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-picker-grid", children: monthLabels.map((label, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
3502
+ pickerMode === "months" && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-picker-grid", children: monthLabels.map((label2, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
3496
3503
  "button",
3497
3504
  {
3498
3505
  type: "button",
3499
3506
  className: clsx_default("datepicker-picker-cell", i === month && "active"),
3500
3507
  onClick: () => handleMonthSelect(i),
3501
- children: label
3508
+ children: label2
3502
3509
  },
3503
3510
  i
3504
3511
  )) }),
3505
3512
  pickerMode === "days" && /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(import_jsx_runtime314.Fragment, { children: [
3506
- /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-weekdays", children: weekdays.map((label, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
3513
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-weekdays", children: weekdays.map((label2, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
3507
3514
  "div",
3508
3515
  {
3509
3516
  className: clsx_default(
@@ -3511,9 +3518,9 @@ var SingleDatePicker = (props) => {
3511
3518
  i === 0 && "sunday",
3512
3519
  i === 6 && "saturday"
3513
3520
  ),
3514
- children: label
3521
+ children: label2
3515
3522
  },
3516
- label
3523
+ label2
3517
3524
  )) }),
3518
3525
  /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-grid", children: days.map((day, idx) => {
3519
3526
  const t = day.date.getTime();
@@ -3545,6 +3552,7 @@ var SingleDatePicker = (props) => {
3545
3552
  ]
3546
3553
  }
3547
3554
  );
3555
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(Field, { label, required, labelId, validations, children: calendar });
3548
3556
  };
3549
3557
  SingleDatePicker.displayName = "SingleDatePicker";
3550
3558
  var SingleDatePicker_default = SingleDatePicker;
@@ -3559,7 +3567,18 @@ var formatDate = (date) => {
3559
3567
  return `${y}/${m}/${d}`;
3560
3568
  };
3561
3569
  var InputDatePicker = (props) => {
3562
- const { value, onChange, minDate, maxDate, disabled, locale = "ko", placeholder } = props;
3570
+ const {
3571
+ value,
3572
+ onChange,
3573
+ minDate,
3574
+ maxDate,
3575
+ disabled,
3576
+ locale = "ko",
3577
+ placeholder,
3578
+ label,
3579
+ required,
3580
+ validations
3581
+ } = props;
3563
3582
  const [isOpen, setIsOpen] = import_react13.default.useState(false);
3564
3583
  const [tempDate, setTempDate] = import_react13.default.useState(value ?? /* @__PURE__ */ new Date());
3565
3584
  const handleOpen = () => {
@@ -3585,6 +3604,9 @@ var InputDatePicker = (props) => {
3585
3604
  placeholder,
3586
3605
  suffix: /* @__PURE__ */ (0, import_jsx_runtime315.jsx)(CalenderIcon_default, {}),
3587
3606
  disabled,
3607
+ label,
3608
+ required,
3609
+ validations,
3588
3610
  readOnly: true
3589
3611
  }
3590
3612
  ) }),
@@ -3716,8 +3738,12 @@ var RangePicker = (props) => {
3716
3738
  onChange,
3717
3739
  minDate,
3718
3740
  maxDate,
3719
- locale = "ko"
3741
+ locale = "ko",
3742
+ label,
3743
+ required,
3744
+ validations
3720
3745
  } = props;
3746
+ const labelId = import_react16.default.useId();
3721
3747
  const [activeTab, setActiveTab] = import_react16.default.useState("start");
3722
3748
  const handleStartChange = (date) => {
3723
3749
  if (!date) return;
@@ -3731,70 +3757,79 @@ var RangePicker = (props) => {
3731
3757
  };
3732
3758
  const startMaxDate = maxDate && endDate < maxDate ? endDate : endDate;
3733
3759
  const endMinDate = minDate && startDate > minDate ? startDate : startDate;
3734
- return /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)("div", { className: clsx_default("lib-xplat-datepicker", "range"), children: [
3735
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-tabs", children: /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3736
- Tab_default,
3737
- {
3738
- activeIndex: activeTab === "start" ? 0 : 1,
3739
- tabs: [
3740
- { value: "start", title: locale === "ko" ? "\uC2DC\uC791\uC77C" : "Start" },
3741
- { value: "end", title: locale === "ko" ? "\uC885\uB8CC\uC77C" : "End" }
3742
- ],
3743
- onChange: (tab) => setActiveTab(tab.value),
3744
- type: "toggle",
3745
- size: "sm"
3746
- }
3747
- ) }),
3748
- /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)("div", { className: "datepicker-range-panels", children: [
3749
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3750
- SingleDatePicker_default,
3751
- {
3752
- value: startDate,
3753
- onChange: handleStartChange,
3754
- minDate,
3755
- maxDate: startMaxDate,
3756
- rangeStart: startDate,
3757
- rangeEnd: endDate,
3758
- locale
3759
- }
3760
- ),
3761
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3762
- SingleDatePicker_default,
3763
- {
3764
- value: endDate,
3765
- onChange: handleEndChange,
3766
- minDate: endMinDate,
3767
- maxDate,
3768
- rangeStart: startDate,
3769
- rangeEnd: endDate,
3770
- locale
3771
- }
3772
- )
3773
- ] }),
3774
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-mobile", children: activeTab === "start" ? /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3775
- SingleDatePicker_default,
3776
- {
3777
- value: startDate,
3778
- onChange: handleStartChange,
3779
- minDate,
3780
- maxDate: startMaxDate,
3781
- rangeStart: startDate,
3782
- rangeEnd: endDate,
3783
- locale
3784
- }
3785
- ) : /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3786
- SingleDatePicker_default,
3787
- {
3788
- value: endDate,
3789
- onChange: handleEndChange,
3790
- minDate: endMinDate,
3791
- maxDate,
3792
- rangeStart: startDate,
3793
- rangeEnd: endDate,
3794
- locale
3795
- }
3796
- ) })
3797
- ] });
3760
+ const calendar = /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)(
3761
+ "div",
3762
+ {
3763
+ className: clsx_default("lib-xplat-datepicker", "range"),
3764
+ role: "group",
3765
+ "aria-labelledby": label ? labelId : void 0,
3766
+ children: [
3767
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-tabs", children: /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3768
+ Tab_default,
3769
+ {
3770
+ activeIndex: activeTab === "start" ? 0 : 1,
3771
+ tabs: [
3772
+ { value: "start", title: locale === "ko" ? "\uC2DC\uC791\uC77C" : "Start" },
3773
+ { value: "end", title: locale === "ko" ? "\uC885\uB8CC\uC77C" : "End" }
3774
+ ],
3775
+ onChange: (tab) => setActiveTab(tab.value),
3776
+ type: "toggle",
3777
+ size: "sm"
3778
+ }
3779
+ ) }),
3780
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)("div", { className: "datepicker-range-panels", children: [
3781
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3782
+ SingleDatePicker_default,
3783
+ {
3784
+ value: startDate,
3785
+ onChange: handleStartChange,
3786
+ minDate,
3787
+ maxDate: startMaxDate,
3788
+ rangeStart: startDate,
3789
+ rangeEnd: endDate,
3790
+ locale
3791
+ }
3792
+ ),
3793
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3794
+ SingleDatePicker_default,
3795
+ {
3796
+ value: endDate,
3797
+ onChange: handleEndChange,
3798
+ minDate: endMinDate,
3799
+ maxDate,
3800
+ rangeStart: startDate,
3801
+ rangeEnd: endDate,
3802
+ locale
3803
+ }
3804
+ )
3805
+ ] }),
3806
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-mobile", children: activeTab === "start" ? /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3807
+ SingleDatePicker_default,
3808
+ {
3809
+ value: startDate,
3810
+ onChange: handleStartChange,
3811
+ minDate,
3812
+ maxDate: startMaxDate,
3813
+ rangeStart: startDate,
3814
+ rangeEnd: endDate,
3815
+ locale
3816
+ }
3817
+ ) : /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
3818
+ SingleDatePicker_default,
3819
+ {
3820
+ value: endDate,
3821
+ onChange: handleEndChange,
3822
+ minDate: endMinDate,
3823
+ maxDate,
3824
+ rangeStart: startDate,
3825
+ rangeEnd: endDate,
3826
+ locale
3827
+ }
3828
+ ) })
3829
+ ]
3830
+ }
3831
+ );
3832
+ return /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(Field, { label, required, labelId, validations, children: calendar });
3798
3833
  };
3799
3834
  RangePicker.displayName = "RangePicker";
3800
3835
  var RangePicker_default = RangePicker;
@@ -5567,10 +5602,13 @@ var FileUpload = (props) => {
5567
5602
  multiple = false,
5568
5603
  maxSize,
5569
5604
  onChange,
5570
- label = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
5605
+ placeholder = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
5571
5606
  description,
5572
- validations
5607
+ validations,
5608
+ label,
5609
+ required
5573
5610
  } = props;
5611
+ const fieldId = import_react23.default.useId();
5574
5612
  const [isDragOver, setIsDragOver] = import_react23.default.useState(false);
5575
5613
  const inputRef = import_react23.default.useRef(null);
5576
5614
  const handleFiles = (fileList) => {
@@ -5615,6 +5653,7 @@ var FileUpload = (props) => {
5615
5653
  "input",
5616
5654
  {
5617
5655
  ref: inputRef,
5656
+ id: fieldId,
5618
5657
  type: "file",
5619
5658
  accept,
5620
5659
  multiple,
@@ -5623,12 +5662,12 @@ var FileUpload = (props) => {
5623
5662
  }
5624
5663
  ),
5625
5664
  /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("div", { className: "upload-icon", children: /* @__PURE__ */ (0, import_jsx_runtime325.jsx)(UploadIcon_default, {}) }),
5626
- /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("p", { className: "upload-label", children: label }),
5665
+ /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("p", { className: "upload-label", children: placeholder }),
5627
5666
  description && /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("p", { className: "upload-description", children: description })
5628
5667
  ]
5629
5668
  }
5630
5669
  );
5631
- return /* @__PURE__ */ (0, import_jsx_runtime325.jsx)(Field, { validations, children: control });
5670
+ return /* @__PURE__ */ (0, import_jsx_runtime325.jsx)(Field, { label, required, htmlFor: fieldId, validations, children: control });
5632
5671
  };
5633
5672
  FileUpload.displayName = "FileUpload";
5634
5673
  var FileUpload_default = FileUpload;
@@ -5771,7 +5810,8 @@ var HtmlTypeWriter_default = HtmlTypeWriter;
5771
5810
  var import_react26 = __toESM(require("react"), 1);
5772
5811
  var import_jsx_runtime327 = require("react/jsx-runtime");
5773
5812
  var ImageSelector = (props) => {
5774
- const { value, label, onChange, validations } = props;
5813
+ const { value, placeholder, onChange, validations, label, required } = props;
5814
+ const fieldId = import_react26.default.useId();
5775
5815
  const [previewUrl, setPreviewUrl] = import_react26.default.useState();
5776
5816
  import_react26.default.useEffect(() => {
5777
5817
  if (!value) {
@@ -5801,7 +5841,7 @@ var ImageSelector = (props) => {
5801
5841
  {
5802
5842
  type: "file",
5803
5843
  accept: "image/*",
5804
- id: "image-input",
5844
+ id: fieldId,
5805
5845
  onChange: handleFileChange,
5806
5846
  ref: inputRef,
5807
5847
  "aria-invalid": hasError(validations) || void 0
@@ -5813,10 +5853,10 @@ var ImageSelector = (props) => {
5813
5853
  ] }),
5814
5854
  /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "content", children: previewUrl ? /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("img", { src: previewUrl, alt: "preview" }) : /* @__PURE__ */ (0, import_jsx_runtime327.jsxs)("div", { className: "skeleton", onClick: handleOpenFileDialog, children: [
5815
5855
  /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "icon-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime327.jsx)(ImageIcon_default, {}) }),
5816
- /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "label", children: label || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
5856
+ /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "label", children: placeholder || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
5817
5857
  ] }) })
5818
5858
  ] });
5819
- return /* @__PURE__ */ (0, import_jsx_runtime327.jsx)(Field, { validations, children: control });
5859
+ return /* @__PURE__ */ (0, import_jsx_runtime327.jsx)(Field, { label, required, htmlFor: fieldId, validations, children: control });
5820
5860
  };
5821
5861
  ImageSelector.displayName = "ImageSelector";
5822
5862
  var ImageSelector_default = ImageSelector;
@@ -7368,9 +7408,33 @@ var ToastProvider = ({
7368
7408
  };
7369
7409
  ToastProvider.displayName = "ToastProvider";
7370
7410
 
7411
+ // src/components/ToggleChip/ToggleChip.tsx
7412
+ var import_jsx_runtime353 = require("react/jsx-runtime");
7413
+ var ToggleChip = (props) => {
7414
+ const { children, selected = false, onClick, disabled = false, size = "md" } = props;
7415
+ return /* @__PURE__ */ (0, import_jsx_runtime353.jsx)(
7416
+ "button",
7417
+ {
7418
+ type: "button",
7419
+ className: clsx_default(
7420
+ "lib-xplat-chip",
7421
+ "lib-xplat-toggle-chip",
7422
+ size,
7423
+ selected ? "selected" : "unselected"
7424
+ ),
7425
+ "aria-pressed": selected,
7426
+ disabled,
7427
+ onClick,
7428
+ children
7429
+ }
7430
+ );
7431
+ };
7432
+ ToggleChip.displayName = "ToggleChip";
7433
+ var ToggleChip_default = ToggleChip;
7434
+
7371
7435
  // src/components/Tooltip/Tooltip.tsx
7372
7436
  var import_react42 = __toESM(require("react"), 1);
7373
- var import_jsx_runtime353 = require("react/jsx-runtime");
7437
+ var import_jsx_runtime354 = require("react/jsx-runtime");
7374
7438
  var OFFSET = 12;
7375
7439
  var GAP = 8;
7376
7440
  var SHOW_DELAY = 300;
@@ -7475,8 +7539,8 @@ var Tooltip = (props) => {
7475
7539
  window.clearTimeout(delayTimer.current);
7476
7540
  cancelAnimationFrame(rafRef.current);
7477
7541
  }, []);
7478
- if (!title && !description) return /* @__PURE__ */ (0, import_jsx_runtime353.jsx)(import_jsx_runtime353.Fragment, { children });
7479
- return /* @__PURE__ */ (0, import_jsx_runtime353.jsxs)(
7542
+ if (!title && !description) return /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(import_jsx_runtime354.Fragment, { children });
7543
+ return /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)(
7480
7544
  "div",
7481
7545
  {
7482
7546
  ref: triggerRef,
@@ -7489,7 +7553,7 @@ var Tooltip = (props) => {
7489
7553
  onBlur: close,
7490
7554
  children: [
7491
7555
  children,
7492
- visible && /* @__PURE__ */ (0, import_jsx_runtime353.jsx)(Portal_default, { children: /* @__PURE__ */ (0, import_jsx_runtime353.jsxs)(
7556
+ visible && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(Portal_default, { children: /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)(
7493
7557
  "div",
7494
7558
  {
7495
7559
  ref: tooltipRef,
@@ -7497,8 +7561,8 @@ var Tooltip = (props) => {
7497
7561
  className: clsx_default("lib-xplat-tooltip", shape),
7498
7562
  style: { position: "fixed", left: pos.left, top: pos.top },
7499
7563
  children: [
7500
- title && /* @__PURE__ */ (0, import_jsx_runtime353.jsx)("div", { className: "tooltip-title", children: title }),
7501
- description && /* @__PURE__ */ (0, import_jsx_runtime353.jsx)("div", { className: "tooltip-desc", children: description })
7564
+ title && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("div", { className: "tooltip-title", children: title }),
7565
+ description && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("div", { className: "tooltip-desc", children: description })
7502
7566
  ]
7503
7567
  }
7504
7568
  ) })
@@ -7511,10 +7575,10 @@ var Tooltip_default = Tooltip;
7511
7575
 
7512
7576
  // src/components/Video/Video.tsx
7513
7577
  var import_react43 = __toESM(require("react"), 1);
7514
- var import_jsx_runtime354 = require("react/jsx-runtime");
7515
- var PipIcon = () => /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
7516
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }),
7517
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("rect", { x: "12", y: "11", width: "7", height: "6", rx: "1", fill: "currentColor" })
7578
+ var import_jsx_runtime355 = require("react/jsx-runtime");
7579
+ var PipIcon = () => /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
7580
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }),
7581
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)("rect", { x: "12", y: "11", width: "7", height: "6", rx: "1", fill: "currentColor" })
7518
7582
  ] });
7519
7583
  var formatTime = (sec) => {
7520
7584
  if (!Number.isFinite(sec) || sec < 0) return "0:00";
@@ -7689,13 +7753,13 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7689
7753
  const volumePct = (isMuted ? 0 : volume) * 100;
7690
7754
  const VolumeGlyph = isMuted || volume === 0 ? VolumeXIcon_default : volume < 0.5 ? VolumeIcon_default : Volume2Icon_default;
7691
7755
  const pipSupported = typeof document !== "undefined" && "pictureInPictureEnabled" in document && document.pictureInPictureEnabled;
7692
- return /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)(
7756
+ return /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)(
7693
7757
  "div",
7694
7758
  {
7695
7759
  ref: containerRef,
7696
7760
  className: clsx_default("lib-xplat-video", showControls && "has-controls"),
7697
7761
  children: [
7698
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7762
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7699
7763
  "video",
7700
7764
  {
7701
7765
  ref: setRefs,
@@ -7716,7 +7780,7 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7716
7780
  children
7717
7781
  }
7718
7782
  ),
7719
- showCenterPlay && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7783
+ showCenterPlay && /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7720
7784
  "button",
7721
7785
  {
7722
7786
  type: "button",
@@ -7728,11 +7792,11 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7728
7792
  onClick: togglePlay,
7729
7793
  "aria-label": isPlaying ? "\uC77C\uC2DC\uC815\uC9C0" : "\uC7AC\uC0DD",
7730
7794
  tabIndex: -1,
7731
- children: /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("span", { className: "center-play-icon", children: /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(PlayCircleIcon_default, {}) })
7795
+ children: /* @__PURE__ */ (0, import_jsx_runtime355.jsx)("span", { className: "center-play-icon", children: /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(PlayCircleIcon_default, {}) })
7732
7796
  }
7733
7797
  ),
7734
- showControls && /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)("div", { className: "controls", onClick: (e) => e.stopPropagation(), children: [
7735
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7798
+ showControls && /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)("div", { className: "controls", onClick: (e) => e.stopPropagation(), children: [
7799
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7736
7800
  "input",
7737
7801
  {
7738
7802
  type: "range",
@@ -7749,29 +7813,29 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7749
7813
  }
7750
7814
  }
7751
7815
  ),
7752
- /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)("div", { className: "controls-row", children: [
7753
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7816
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)("div", { className: "controls-row", children: [
7817
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7754
7818
  "button",
7755
7819
  {
7756
7820
  type: "button",
7757
7821
  className: "control-btn",
7758
7822
  onClick: togglePlay,
7759
7823
  "aria-label": isPlaying ? "\uC77C\uC2DC\uC815\uC9C0" : "\uC7AC\uC0DD",
7760
- children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(PauseIcon_default, {}) : /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(PlayIcon_default, {})
7824
+ children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(PauseIcon_default, {}) : /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(PlayIcon_default, {})
7761
7825
  }
7762
7826
  ),
7763
- /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)("div", { className: "volume-group", children: [
7764
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7827
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)("div", { className: "volume-group", children: [
7828
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7765
7829
  "button",
7766
7830
  {
7767
7831
  type: "button",
7768
7832
  className: "control-btn",
7769
7833
  onClick: toggleMute,
7770
7834
  "aria-label": isMuted ? "\uC74C\uC18C\uAC70 \uD574\uC81C" : "\uC74C\uC18C\uAC70",
7771
- children: /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(VolumeGlyph, {})
7835
+ children: /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(VolumeGlyph, {})
7772
7836
  }
7773
7837
  ),
7774
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7838
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7775
7839
  "input",
7776
7840
  {
7777
7841
  type: "range",
@@ -7786,14 +7850,14 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7786
7850
  }
7787
7851
  )
7788
7852
  ] }),
7789
- /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)("span", { className: "time", children: [
7853
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)("span", { className: "time", children: [
7790
7854
  formatTime(currentTime),
7791
7855
  " / ",
7792
7856
  formatTime(duration)
7793
7857
  ] }),
7794
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("div", { className: "controls-spacer" }),
7795
- playbackRates && playbackRates.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)("div", { className: clsx_default("rate-group", rateMenuOpen && "is-open"), children: [
7796
- /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)(
7858
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)("div", { className: "controls-spacer" }),
7859
+ playbackRates && playbackRates.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)("div", { className: clsx_default("rate-group", rateMenuOpen && "is-open"), children: [
7860
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)(
7797
7861
  "button",
7798
7862
  {
7799
7863
  type: "button",
@@ -7807,7 +7871,7 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7807
7871
  ]
7808
7872
  }
7809
7873
  ),
7810
- rateMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("ul", { className: "rate-menu", role: "menu", children: playbackRates.map((r2) => /* @__PURE__ */ (0, import_jsx_runtime354.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime354.jsxs)(
7874
+ rateMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime355.jsx)("ul", { className: "rate-menu", role: "menu", children: playbackRates.map((r2) => /* @__PURE__ */ (0, import_jsx_runtime355.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime355.jsxs)(
7811
7875
  "button",
7812
7876
  {
7813
7877
  type: "button",
@@ -7821,7 +7885,7 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7821
7885
  }
7822
7886
  ) }, r2)) })
7823
7887
  ] }),
7824
- showCaptions && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7888
+ showCaptions && /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7825
7889
  "button",
7826
7890
  {
7827
7891
  type: "button",
@@ -7829,37 +7893,37 @@ var Video = import_react43.default.forwardRef((props, ref) => {
7829
7893
  onClick: toggleCaptions,
7830
7894
  "aria-label": captionsOn ? "\uC790\uB9C9 \uB044\uAE30" : "\uC790\uB9C9 \uCF1C\uAE30",
7831
7895
  "aria-pressed": captionsOn,
7832
- children: /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(TypeIcon_default, {})
7896
+ children: /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(TypeIcon_default, {})
7833
7897
  }
7834
7898
  ),
7835
- showPip && pipSupported && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7899
+ showPip && pipSupported && /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7836
7900
  "button",
7837
7901
  {
7838
7902
  type: "button",
7839
7903
  className: clsx_default("control-btn", isPip && "is-active"),
7840
7904
  onClick: togglePip,
7841
7905
  "aria-label": isPip ? "PIP \uC885\uB8CC" : "PIP",
7842
- children: /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(PipIcon, {})
7906
+ children: /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(PipIcon, {})
7843
7907
  }
7844
7908
  ),
7845
- showDownload && /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7909
+ showDownload && /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7846
7910
  "a",
7847
7911
  {
7848
7912
  className: "control-btn",
7849
7913
  href: src,
7850
7914
  download: downloadFileName ?? true,
7851
7915
  "aria-label": "\uB2E4\uC6B4\uB85C\uB4DC",
7852
- children: /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(DownloadIcon_default, {})
7916
+ children: /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(DownloadIcon_default, {})
7853
7917
  }
7854
7918
  ),
7855
- /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(
7919
+ /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(
7856
7920
  "button",
7857
7921
  {
7858
7922
  type: "button",
7859
7923
  className: "control-btn",
7860
7924
  onClick: toggleFullscreen,
7861
7925
  "aria-label": isFullscreen ? "\uC804\uCCB4\uD654\uBA74 \uC885\uB8CC" : "\uC804\uCCB4\uD654\uBA74",
7862
- children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(MinimizeIcon_default, {}) : /* @__PURE__ */ (0, import_jsx_runtime354.jsx)(MaximizeIcon_default, {})
7926
+ children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(MinimizeIcon_default, {}) : /* @__PURE__ */ (0, import_jsx_runtime355.jsx)(MaximizeIcon_default, {})
7863
7927
  }
7864
7928
  )
7865
7929
  ] })
@@ -7931,6 +7995,7 @@ var Video_default = Video;
7931
7995
  TextArea,
7932
7996
  TimePicker,
7933
7997
  ToastProvider,
7998
+ ToggleChip,
7934
7999
  Tooltip,
7935
8000
  Video,
7936
8001
  hasError,
@@ -3612,6 +3612,9 @@
3612
3612
  color: var(--semantic-text-inverse);
3613
3613
  border-color: var(--semantic-surface-brand-default);
3614
3614
  }
3615
+ .lib-xplat-editor.readonly .lib-xplat-editor__editable ul.checklist > li::before {
3616
+ cursor: default;
3617
+ }
3615
3618
  .lib-xplat-editor__editable .align-center {
3616
3619
  text-align: center;
3617
3620
  }
@@ -5803,6 +5806,43 @@
5803
5806
  }
5804
5807
  }
5805
5808
 
5809
+ /* src/components/ToggleChip/togglechip.scss */
5810
+ .lib-xplat-toggle-chip {
5811
+ cursor: pointer;
5812
+ font-family: inherit;
5813
+ transition:
5814
+ background-color 0.28s cubic-bezier(0.25, 0.46, 0.45, 0.94),
5815
+ border-color 0.28s cubic-bezier(0.25, 0.46, 0.45, 0.94),
5816
+ color 0.28s cubic-bezier(0.25, 0.46, 0.45, 0.94);
5817
+ }
5818
+ .lib-xplat-toggle-chip.unselected {
5819
+ color: var(--semantic-text-secondary);
5820
+ background-color: var(--semantic-surface-neutral-primary);
5821
+ border: 1px solid var(--semantic-border-primary);
5822
+ }
5823
+ .lib-xplat-toggle-chip.unselected:hover:not(:disabled) {
5824
+ color: var(--semantic-text-primary);
5825
+ background-color: var(--semantic-surface-neutral-secondary);
5826
+ }
5827
+ .lib-xplat-toggle-chip {
5828
+ }
5829
+ .lib-xplat-toggle-chip.selected {
5830
+ color: var(--semantic-text-brand-primary);
5831
+ background-color: var(--semantic-surface-brand-subtle);
5832
+ border: 1px solid var(--semantic-border-brand-primary);
5833
+ }
5834
+ .lib-xplat-toggle-chip.selected:hover:not(:disabled) {
5835
+ background-color: var(--semantic-surface-brand-secondary);
5836
+ }
5837
+ .lib-xplat-toggle-chip:focus-visible {
5838
+ outline: 2px solid var(--semantic-interaction-focus-ring);
5839
+ outline-offset: 2px;
5840
+ }
5841
+ .lib-xplat-toggle-chip:disabled {
5842
+ cursor: not-allowed;
5843
+ opacity: 0.4;
5844
+ }
5845
+
5806
5846
  /* src/components/Video/video.scss */
5807
5847
  .lib-xplat-video {
5808
5848
  position: relative;