@x-plat/design-system 0.12.0 → 0.13.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 (50) hide show
  1. package/dist/components/AutoResizeTextArea/index.cjs +2 -2
  2. package/dist/components/AutoResizeTextArea/index.js +2 -2
  3. package/dist/components/ChatInput/index.cjs +2 -2
  4. package/dist/components/ChatInput/index.js +2 -2
  5. package/dist/components/CheckBox/index.cjs +2 -2
  6. package/dist/components/CheckBox/index.js +2 -2
  7. package/dist/components/DatePicker/index.cjs +109 -75
  8. package/dist/components/DatePicker/index.d.cts +19 -0
  9. package/dist/components/DatePicker/index.d.ts +19 -0
  10. package/dist/components/DatePicker/index.js +109 -75
  11. package/dist/components/Editor/index.css +3 -0
  12. package/dist/components/FieldMessage/index.cjs +2 -2
  13. package/dist/components/FieldMessage/index.d.cts +8 -0
  14. package/dist/components/FieldMessage/index.d.ts +8 -0
  15. package/dist/components/FieldMessage/index.js +2 -2
  16. package/dist/components/FileUpload/index.cjs +10 -6
  17. package/dist/components/FileUpload/index.d.cts +15 -2
  18. package/dist/components/FileUpload/index.d.ts +15 -2
  19. package/dist/components/FileUpload/index.js +10 -6
  20. package/dist/components/ImageSelector/index.cjs +7 -6
  21. package/dist/components/ImageSelector/index.d.cts +15 -2
  22. package/dist/components/ImageSelector/index.d.ts +15 -2
  23. package/dist/components/ImageSelector/index.js +7 -6
  24. package/dist/components/Input/index.cjs +2 -2
  25. package/dist/components/Input/index.d.cts +4 -0
  26. package/dist/components/Input/index.d.ts +4 -0
  27. package/dist/components/Input/index.js +2 -2
  28. package/dist/components/Radio/index.cjs +2 -2
  29. package/dist/components/Radio/index.js +2 -2
  30. package/dist/components/Select/index.cjs +2 -2
  31. package/dist/components/Select/index.d.cts +1 -2
  32. package/dist/components/Select/index.d.ts +1 -2
  33. package/dist/components/Select/index.js +2 -2
  34. package/dist/components/Switch/index.cjs +2 -2
  35. package/dist/components/Switch/index.js +2 -2
  36. package/dist/components/TextArea/index.cjs +2 -2
  37. package/dist/components/TextArea/index.js +2 -2
  38. package/dist/components/TimePicker/index.cjs +2 -2
  39. package/dist/components/TimePicker/index.js +2 -2
  40. package/dist/components/index.cjs +122 -83
  41. package/dist/components/index.css +3 -0
  42. package/dist/components/index.js +122 -83
  43. package/dist/index.cjs +122 -83
  44. package/dist/index.css +3 -0
  45. package/dist/index.js +122 -83
  46. package/guidelines/Guidelines.md +12 -0
  47. package/guidelines/MIGRATION.md +270 -0
  48. package/guidelines/components/datepicker.md +26 -0
  49. package/guidelines/components/file-media.md +21 -4
  50. package/package.json +1 -1
@@ -1532,11 +1532,11 @@ var FieldMessage = (props) => {
1532
1532
  FieldMessage.displayName = "FieldMessage";
1533
1533
  var FieldMessage_default = FieldMessage;
1534
1534
  var Field = (props) => {
1535
- const { label, required = false, htmlFor, validations, children } = props;
1535
+ const { label, required = false, htmlFor, labelId, validations, children } = props;
1536
1536
  const hasMessages = !!validations && validations.length > 0;
1537
1537
  if (!label && !hasMessages) return /* @__PURE__ */ jsx297(Fragment, { children });
1538
1538
  return /* @__PURE__ */ jsxs191("div", { className: "lib-xplat-field", children: [
1539
- label && /* @__PURE__ */ jsxs191("label", { className: "lib-xplat-field-label", htmlFor, children: [
1539
+ label && /* @__PURE__ */ jsxs191("label", { className: "lib-xplat-field-label", id: labelId, htmlFor, children: [
1540
1540
  label,
1541
1541
  required && /* @__PURE__ */ jsx297("span", { className: "required", "aria-hidden": "true", children: "*" })
1542
1542
  ] }),
@@ -3303,8 +3303,12 @@ var SingleDatePicker = (props) => {
3303
3303
  highlightDates = [],
3304
3304
  locale = "ko",
3305
3305
  rangeStart,
3306
- rangeEnd
3306
+ rangeEnd,
3307
+ label,
3308
+ required,
3309
+ validations
3307
3310
  } = props;
3311
+ const labelId = React12.useId();
3308
3312
  const initialYear = value?.getFullYear();
3309
3313
  const initialMonth = value?.getMonth();
3310
3314
  const { year, month, days, goToPrevMonth, goToNextMonth, setYear, setMonth } = useCalendar(
@@ -3367,10 +3371,12 @@ var SingleDatePicker = (props) => {
3367
3371
  const monthLabels = MONTH_LABELS[locale];
3368
3372
  const titleText = pickerMode === "days" ? locale === "ko" ? `${year}\uB144 ${monthLabels[month]}` : `${monthLabels[month]} ${year}` : pickerMode === "months" ? `${year}` : `${yearRangeStart} - ${yearRangeStart + 11}`;
3369
3373
  const hasRange = rangeStart != null && rangeEnd != null;
3370
- return /* @__PURE__ */ jsxs200(
3374
+ const calendar = /* @__PURE__ */ jsxs200(
3371
3375
  "div",
3372
3376
  {
3373
3377
  className: clsx_default("lib-xplat-datepicker", "single"),
3378
+ role: "group",
3379
+ "aria-labelledby": label ? labelId : void 0,
3374
3380
  children: [
3375
3381
  /* @__PURE__ */ jsxs200("div", { className: "datepicker-header", children: [
3376
3382
  /* @__PURE__ */ jsx314("button", { className: "datepicker-nav", onClick: handlePrev, type: "button", children: /* @__PURE__ */ jsx314(ChevronLeftIcon_default, {}) }),
@@ -3391,18 +3397,18 @@ var SingleDatePicker = (props) => {
3391
3397
  y
3392
3398
  );
3393
3399
  }) }),
3394
- pickerMode === "months" && /* @__PURE__ */ jsx314("div", { className: "datepicker-picker-grid", children: monthLabels.map((label, i) => /* @__PURE__ */ jsx314(
3400
+ pickerMode === "months" && /* @__PURE__ */ jsx314("div", { className: "datepicker-picker-grid", children: monthLabels.map((label2, i) => /* @__PURE__ */ jsx314(
3395
3401
  "button",
3396
3402
  {
3397
3403
  type: "button",
3398
3404
  className: clsx_default("datepicker-picker-cell", i === month && "active"),
3399
3405
  onClick: () => handleMonthSelect(i),
3400
- children: label
3406
+ children: label2
3401
3407
  },
3402
3408
  i
3403
3409
  )) }),
3404
3410
  pickerMode === "days" && /* @__PURE__ */ jsxs200(Fragment4, { children: [
3405
- /* @__PURE__ */ jsx314("div", { className: "datepicker-weekdays", children: weekdays.map((label, i) => /* @__PURE__ */ jsx314(
3411
+ /* @__PURE__ */ jsx314("div", { className: "datepicker-weekdays", children: weekdays.map((label2, i) => /* @__PURE__ */ jsx314(
3406
3412
  "div",
3407
3413
  {
3408
3414
  className: clsx_default(
@@ -3410,9 +3416,9 @@ var SingleDatePicker = (props) => {
3410
3416
  i === 0 && "sunday",
3411
3417
  i === 6 && "saturday"
3412
3418
  ),
3413
- children: label
3419
+ children: label2
3414
3420
  },
3415
- label
3421
+ label2
3416
3422
  )) }),
3417
3423
  /* @__PURE__ */ jsx314("div", { className: "datepicker-grid", children: days.map((day, idx) => {
3418
3424
  const t = day.date.getTime();
@@ -3444,6 +3450,7 @@ var SingleDatePicker = (props) => {
3444
3450
  ]
3445
3451
  }
3446
3452
  );
3453
+ return /* @__PURE__ */ jsx314(Field, { label, required, labelId, validations, children: calendar });
3447
3454
  };
3448
3455
  SingleDatePicker.displayName = "SingleDatePicker";
3449
3456
  var SingleDatePicker_default = SingleDatePicker;
@@ -3458,7 +3465,18 @@ var formatDate = (date) => {
3458
3465
  return `${y}/${m}/${d}`;
3459
3466
  };
3460
3467
  var InputDatePicker = (props) => {
3461
- const { value, onChange, minDate, maxDate, disabled, locale = "ko", placeholder } = props;
3468
+ const {
3469
+ value,
3470
+ onChange,
3471
+ minDate,
3472
+ maxDate,
3473
+ disabled,
3474
+ locale = "ko",
3475
+ placeholder,
3476
+ label,
3477
+ required,
3478
+ validations
3479
+ } = props;
3462
3480
  const [isOpen, setIsOpen] = React13.useState(false);
3463
3481
  const [tempDate, setTempDate] = React13.useState(value ?? /* @__PURE__ */ new Date());
3464
3482
  const handleOpen = () => {
@@ -3484,6 +3502,9 @@ var InputDatePicker = (props) => {
3484
3502
  placeholder,
3485
3503
  suffix: /* @__PURE__ */ jsx315(CalenderIcon_default, {}),
3486
3504
  disabled,
3505
+ label,
3506
+ required,
3507
+ validations,
3487
3508
  readOnly: true
3488
3509
  }
3489
3510
  ) }),
@@ -3615,8 +3636,12 @@ var RangePicker = (props) => {
3615
3636
  onChange,
3616
3637
  minDate,
3617
3638
  maxDate,
3618
- locale = "ko"
3639
+ locale = "ko",
3640
+ label,
3641
+ required,
3642
+ validations
3619
3643
  } = props;
3644
+ const labelId = React16.useId();
3620
3645
  const [activeTab, setActiveTab] = React16.useState("start");
3621
3646
  const handleStartChange = (date) => {
3622
3647
  if (!date) return;
@@ -3630,70 +3655,79 @@ var RangePicker = (props) => {
3630
3655
  };
3631
3656
  const startMaxDate = maxDate && endDate < maxDate ? endDate : endDate;
3632
3657
  const endMinDate = minDate && startDate > minDate ? startDate : startDate;
3633
- return /* @__PURE__ */ jsxs203("div", { className: clsx_default("lib-xplat-datepicker", "range"), children: [
3634
- /* @__PURE__ */ jsx318("div", { className: "datepicker-range-tabs", children: /* @__PURE__ */ jsx318(
3635
- Tab_default,
3636
- {
3637
- activeIndex: activeTab === "start" ? 0 : 1,
3638
- tabs: [
3639
- { value: "start", title: locale === "ko" ? "\uC2DC\uC791\uC77C" : "Start" },
3640
- { value: "end", title: locale === "ko" ? "\uC885\uB8CC\uC77C" : "End" }
3641
- ],
3642
- onChange: (tab) => setActiveTab(tab.value),
3643
- type: "toggle",
3644
- size: "sm"
3645
- }
3646
- ) }),
3647
- /* @__PURE__ */ jsxs203("div", { className: "datepicker-range-panels", children: [
3648
- /* @__PURE__ */ jsx318(
3649
- SingleDatePicker_default,
3650
- {
3651
- value: startDate,
3652
- onChange: handleStartChange,
3653
- minDate,
3654
- maxDate: startMaxDate,
3655
- rangeStart: startDate,
3656
- rangeEnd: endDate,
3657
- locale
3658
- }
3659
- ),
3660
- /* @__PURE__ */ jsx318(
3661
- SingleDatePicker_default,
3662
- {
3663
- value: endDate,
3664
- onChange: handleEndChange,
3665
- minDate: endMinDate,
3666
- maxDate,
3667
- rangeStart: startDate,
3668
- rangeEnd: endDate,
3669
- locale
3670
- }
3671
- )
3672
- ] }),
3673
- /* @__PURE__ */ jsx318("div", { className: "datepicker-range-mobile", children: activeTab === "start" ? /* @__PURE__ */ jsx318(
3674
- SingleDatePicker_default,
3675
- {
3676
- value: startDate,
3677
- onChange: handleStartChange,
3678
- minDate,
3679
- maxDate: startMaxDate,
3680
- rangeStart: startDate,
3681
- rangeEnd: endDate,
3682
- locale
3683
- }
3684
- ) : /* @__PURE__ */ jsx318(
3685
- SingleDatePicker_default,
3686
- {
3687
- value: endDate,
3688
- onChange: handleEndChange,
3689
- minDate: endMinDate,
3690
- maxDate,
3691
- rangeStart: startDate,
3692
- rangeEnd: endDate,
3693
- locale
3694
- }
3695
- ) })
3696
- ] });
3658
+ const calendar = /* @__PURE__ */ jsxs203(
3659
+ "div",
3660
+ {
3661
+ className: clsx_default("lib-xplat-datepicker", "range"),
3662
+ role: "group",
3663
+ "aria-labelledby": label ? labelId : void 0,
3664
+ children: [
3665
+ /* @__PURE__ */ jsx318("div", { className: "datepicker-range-tabs", children: /* @__PURE__ */ jsx318(
3666
+ Tab_default,
3667
+ {
3668
+ activeIndex: activeTab === "start" ? 0 : 1,
3669
+ tabs: [
3670
+ { value: "start", title: locale === "ko" ? "\uC2DC\uC791\uC77C" : "Start" },
3671
+ { value: "end", title: locale === "ko" ? "\uC885\uB8CC\uC77C" : "End" }
3672
+ ],
3673
+ onChange: (tab) => setActiveTab(tab.value),
3674
+ type: "toggle",
3675
+ size: "sm"
3676
+ }
3677
+ ) }),
3678
+ /* @__PURE__ */ jsxs203("div", { className: "datepicker-range-panels", children: [
3679
+ /* @__PURE__ */ jsx318(
3680
+ SingleDatePicker_default,
3681
+ {
3682
+ value: startDate,
3683
+ onChange: handleStartChange,
3684
+ minDate,
3685
+ maxDate: startMaxDate,
3686
+ rangeStart: startDate,
3687
+ rangeEnd: endDate,
3688
+ locale
3689
+ }
3690
+ ),
3691
+ /* @__PURE__ */ jsx318(
3692
+ SingleDatePicker_default,
3693
+ {
3694
+ value: endDate,
3695
+ onChange: handleEndChange,
3696
+ minDate: endMinDate,
3697
+ maxDate,
3698
+ rangeStart: startDate,
3699
+ rangeEnd: endDate,
3700
+ locale
3701
+ }
3702
+ )
3703
+ ] }),
3704
+ /* @__PURE__ */ jsx318("div", { className: "datepicker-range-mobile", children: activeTab === "start" ? /* @__PURE__ */ jsx318(
3705
+ SingleDatePicker_default,
3706
+ {
3707
+ value: startDate,
3708
+ onChange: handleStartChange,
3709
+ minDate,
3710
+ maxDate: startMaxDate,
3711
+ rangeStart: startDate,
3712
+ rangeEnd: endDate,
3713
+ locale
3714
+ }
3715
+ ) : /* @__PURE__ */ jsx318(
3716
+ SingleDatePicker_default,
3717
+ {
3718
+ value: endDate,
3719
+ onChange: handleEndChange,
3720
+ minDate: endMinDate,
3721
+ maxDate,
3722
+ rangeStart: startDate,
3723
+ rangeEnd: endDate,
3724
+ locale
3725
+ }
3726
+ ) })
3727
+ ]
3728
+ }
3729
+ );
3730
+ return /* @__PURE__ */ jsx318(Field, { label, required, labelId, validations, children: calendar });
3697
3731
  };
3698
3732
  RangePicker.displayName = "RangePicker";
3699
3733
  var RangePicker_default = RangePicker;
@@ -5466,10 +5500,13 @@ var FileUpload = (props) => {
5466
5500
  multiple = false,
5467
5501
  maxSize,
5468
5502
  onChange,
5469
- label = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
5503
+ placeholder = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
5470
5504
  description,
5471
- validations
5505
+ validations,
5506
+ label,
5507
+ required
5472
5508
  } = props;
5509
+ const fieldId = React23.useId();
5473
5510
  const [isDragOver, setIsDragOver] = React23.useState(false);
5474
5511
  const inputRef = React23.useRef(null);
5475
5512
  const handleFiles = (fileList) => {
@@ -5514,6 +5551,7 @@ var FileUpload = (props) => {
5514
5551
  "input",
5515
5552
  {
5516
5553
  ref: inputRef,
5554
+ id: fieldId,
5517
5555
  type: "file",
5518
5556
  accept,
5519
5557
  multiple,
@@ -5522,12 +5560,12 @@ var FileUpload = (props) => {
5522
5560
  }
5523
5561
  ),
5524
5562
  /* @__PURE__ */ jsx325("div", { className: "upload-icon", children: /* @__PURE__ */ jsx325(UploadIcon_default, {}) }),
5525
- /* @__PURE__ */ jsx325("p", { className: "upload-label", children: label }),
5563
+ /* @__PURE__ */ jsx325("p", { className: "upload-label", children: placeholder }),
5526
5564
  description && /* @__PURE__ */ jsx325("p", { className: "upload-description", children: description })
5527
5565
  ]
5528
5566
  }
5529
5567
  );
5530
- return /* @__PURE__ */ jsx325(Field, { validations, children: control });
5568
+ return /* @__PURE__ */ jsx325(Field, { label, required, htmlFor: fieldId, validations, children: control });
5531
5569
  };
5532
5570
  FileUpload.displayName = "FileUpload";
5533
5571
  var FileUpload_default = FileUpload;
@@ -5670,7 +5708,8 @@ var HtmlTypeWriter_default = HtmlTypeWriter;
5670
5708
  import React26 from "react";
5671
5709
  import { jsx as jsx327, jsxs as jsxs210 } from "react/jsx-runtime";
5672
5710
  var ImageSelector = (props) => {
5673
- const { value, label, onChange, validations } = props;
5711
+ const { value, placeholder, onChange, validations, label, required } = props;
5712
+ const fieldId = React26.useId();
5674
5713
  const [previewUrl, setPreviewUrl] = React26.useState();
5675
5714
  React26.useEffect(() => {
5676
5715
  if (!value) {
@@ -5700,7 +5739,7 @@ var ImageSelector = (props) => {
5700
5739
  {
5701
5740
  type: "file",
5702
5741
  accept: "image/*",
5703
- id: "image-input",
5742
+ id: fieldId,
5704
5743
  onChange: handleFileChange,
5705
5744
  ref: inputRef,
5706
5745
  "aria-invalid": hasError(validations) || void 0
@@ -5712,10 +5751,10 @@ var ImageSelector = (props) => {
5712
5751
  ] }),
5713
5752
  /* @__PURE__ */ jsx327("div", { className: "content", children: previewUrl ? /* @__PURE__ */ jsx327("img", { src: previewUrl, alt: "preview" }) : /* @__PURE__ */ jsxs210("div", { className: "skeleton", onClick: handleOpenFileDialog, children: [
5714
5753
  /* @__PURE__ */ jsx327("div", { className: "icon-wrapper", children: /* @__PURE__ */ jsx327(ImageIcon_default, {}) }),
5715
- /* @__PURE__ */ jsx327("div", { className: "label", children: label || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
5754
+ /* @__PURE__ */ jsx327("div", { className: "label", children: placeholder || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
5716
5755
  ] }) })
5717
5756
  ] });
5718
- return /* @__PURE__ */ jsx327(Field, { validations, children: control });
5757
+ return /* @__PURE__ */ jsx327(Field, { label, required, htmlFor: fieldId, validations, children: control });
5719
5758
  };
5720
5759
  ImageSelector.displayName = "ImageSelector";
5721
5760
  var ImageSelector_default = ImageSelector;