@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
package/dist/index.cjs CHANGED
@@ -6031,11 +6031,11 @@ var FieldMessage = (props) => {
6031
6031
  FieldMessage.displayName = "FieldMessage";
6032
6032
  var FieldMessage_default = FieldMessage;
6033
6033
  var Field = (props) => {
6034
- const { label, required = false, htmlFor, validations, children } = props;
6034
+ const { label, required = false, htmlFor, labelId, validations, children } = props;
6035
6035
  const hasMessages = !!validations && validations.length > 0;
6036
6036
  if (!label && !hasMessages) return /* @__PURE__ */ (0, import_jsx_runtime297.jsx)(import_jsx_runtime297.Fragment, { children });
6037
6037
  return /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("div", { className: "lib-xplat-field", children: [
6038
- label && /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("label", { className: "lib-xplat-field-label", htmlFor, children: [
6038
+ label && /* @__PURE__ */ (0, import_jsx_runtime297.jsxs)("label", { className: "lib-xplat-field-label", id: labelId, htmlFor, children: [
6039
6039
  label,
6040
6040
  required && /* @__PURE__ */ (0, import_jsx_runtime297.jsx)("span", { className: "required", "aria-hidden": "true", children: "*" })
6041
6041
  ] }),
@@ -7815,8 +7815,12 @@ var SingleDatePicker = (props) => {
7815
7815
  highlightDates = [],
7816
7816
  locale = "ko",
7817
7817
  rangeStart,
7818
- rangeEnd
7818
+ rangeEnd,
7819
+ label,
7820
+ required,
7821
+ validations
7819
7822
  } = props;
7823
+ const labelId = import_react12.default.useId();
7820
7824
  const initialYear = value?.getFullYear();
7821
7825
  const initialMonth = value?.getMonth();
7822
7826
  const { year, month, days, goToPrevMonth, goToNextMonth, setYear, setMonth } = useCalendar(
@@ -7879,10 +7883,12 @@ var SingleDatePicker = (props) => {
7879
7883
  const monthLabels = MONTH_LABELS[locale];
7880
7884
  const titleText = pickerMode === "days" ? locale === "ko" ? `${year}\uB144 ${monthLabels[month]}` : `${monthLabels[month]} ${year}` : pickerMode === "months" ? `${year}` : `${yearRangeStart} - ${yearRangeStart + 11}`;
7881
7885
  const hasRange = rangeStart != null && rangeEnd != null;
7882
- return /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
7886
+ const calendar = /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(
7883
7887
  "div",
7884
7888
  {
7885
7889
  className: clsx_default("lib-xplat-datepicker", "single"),
7890
+ role: "group",
7891
+ "aria-labelledby": label ? labelId : void 0,
7886
7892
  children: [
7887
7893
  /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)("div", { className: "datepicker-header", children: [
7888
7894
  /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("button", { className: "datepicker-nav", onClick: handlePrev, type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(ChevronLeftIcon_default, {}) }),
@@ -7903,18 +7909,18 @@ var SingleDatePicker = (props) => {
7903
7909
  y
7904
7910
  );
7905
7911
  }) }),
7906
- pickerMode === "months" && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-picker-grid", children: monthLabels.map((label, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
7912
+ pickerMode === "months" && /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-picker-grid", children: monthLabels.map((label2, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
7907
7913
  "button",
7908
7914
  {
7909
7915
  type: "button",
7910
7916
  className: clsx_default("datepicker-picker-cell", i === month && "active"),
7911
7917
  onClick: () => handleMonthSelect(i),
7912
- children: label
7918
+ children: label2
7913
7919
  },
7914
7920
  i
7915
7921
  )) }),
7916
7922
  pickerMode === "days" && /* @__PURE__ */ (0, import_jsx_runtime314.jsxs)(import_jsx_runtime314.Fragment, { children: [
7917
- /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-weekdays", children: weekdays.map((label, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
7923
+ /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-weekdays", children: weekdays.map((label2, i) => /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(
7918
7924
  "div",
7919
7925
  {
7920
7926
  className: clsx_default(
@@ -7922,9 +7928,9 @@ var SingleDatePicker = (props) => {
7922
7928
  i === 0 && "sunday",
7923
7929
  i === 6 && "saturday"
7924
7930
  ),
7925
- children: label
7931
+ children: label2
7926
7932
  },
7927
- label
7933
+ label2
7928
7934
  )) }),
7929
7935
  /* @__PURE__ */ (0, import_jsx_runtime314.jsx)("div", { className: "datepicker-grid", children: days.map((day, idx) => {
7930
7936
  const t = day.date.getTime();
@@ -7956,6 +7962,7 @@ var SingleDatePicker = (props) => {
7956
7962
  ]
7957
7963
  }
7958
7964
  );
7965
+ return /* @__PURE__ */ (0, import_jsx_runtime314.jsx)(Field, { label, required, labelId, validations, children: calendar });
7959
7966
  };
7960
7967
  SingleDatePicker.displayName = "SingleDatePicker";
7961
7968
  var SingleDatePicker_default = SingleDatePicker;
@@ -7970,7 +7977,18 @@ var formatDate = (date) => {
7970
7977
  return `${y}/${m}/${d}`;
7971
7978
  };
7972
7979
  var InputDatePicker = (props) => {
7973
- const { value, onChange, minDate, maxDate, disabled, locale = "ko", placeholder } = props;
7980
+ const {
7981
+ value,
7982
+ onChange,
7983
+ minDate,
7984
+ maxDate,
7985
+ disabled,
7986
+ locale = "ko",
7987
+ placeholder,
7988
+ label,
7989
+ required,
7990
+ validations
7991
+ } = props;
7974
7992
  const [isOpen, setIsOpen] = import_react13.default.useState(false);
7975
7993
  const [tempDate, setTempDate] = import_react13.default.useState(value ?? /* @__PURE__ */ new Date());
7976
7994
  const handleOpen = () => {
@@ -7996,6 +8014,9 @@ var InputDatePicker = (props) => {
7996
8014
  placeholder,
7997
8015
  suffix: /* @__PURE__ */ (0, import_jsx_runtime315.jsx)(CalenderIcon_default, {}),
7998
8016
  disabled,
8017
+ label,
8018
+ required,
8019
+ validations,
7999
8020
  readOnly: true
8000
8021
  }
8001
8022
  ) }),
@@ -8127,8 +8148,12 @@ var RangePicker = (props) => {
8127
8148
  onChange,
8128
8149
  minDate,
8129
8150
  maxDate,
8130
- locale = "ko"
8151
+ locale = "ko",
8152
+ label,
8153
+ required,
8154
+ validations
8131
8155
  } = props;
8156
+ const labelId = import_react16.default.useId();
8132
8157
  const [activeTab, setActiveTab] = import_react16.default.useState("start");
8133
8158
  const handleStartChange = (date) => {
8134
8159
  if (!date) return;
@@ -8142,70 +8167,79 @@ var RangePicker = (props) => {
8142
8167
  };
8143
8168
  const startMaxDate = maxDate && endDate < maxDate ? endDate : endDate;
8144
8169
  const endMinDate = minDate && startDate > minDate ? startDate : startDate;
8145
- return /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)("div", { className: clsx_default("lib-xplat-datepicker", "range"), children: [
8146
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-tabs", children: /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8147
- Tab_default,
8148
- {
8149
- activeIndex: activeTab === "start" ? 0 : 1,
8150
- tabs: [
8151
- { value: "start", title: locale === "ko" ? "\uC2DC\uC791\uC77C" : "Start" },
8152
- { value: "end", title: locale === "ko" ? "\uC885\uB8CC\uC77C" : "End" }
8153
- ],
8154
- onChange: (tab) => setActiveTab(tab.value),
8155
- type: "toggle",
8156
- size: "sm"
8157
- }
8158
- ) }),
8159
- /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)("div", { className: "datepicker-range-panels", children: [
8160
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8161
- SingleDatePicker_default,
8162
- {
8163
- value: startDate,
8164
- onChange: handleStartChange,
8165
- minDate,
8166
- maxDate: startMaxDate,
8167
- rangeStart: startDate,
8168
- rangeEnd: endDate,
8169
- locale
8170
- }
8171
- ),
8172
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8173
- SingleDatePicker_default,
8174
- {
8175
- value: endDate,
8176
- onChange: handleEndChange,
8177
- minDate: endMinDate,
8178
- maxDate,
8179
- rangeStart: startDate,
8180
- rangeEnd: endDate,
8181
- locale
8182
- }
8183
- )
8184
- ] }),
8185
- /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-mobile", children: activeTab === "start" ? /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8186
- SingleDatePicker_default,
8187
- {
8188
- value: startDate,
8189
- onChange: handleStartChange,
8190
- minDate,
8191
- maxDate: startMaxDate,
8192
- rangeStart: startDate,
8193
- rangeEnd: endDate,
8194
- locale
8195
- }
8196
- ) : /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8197
- SingleDatePicker_default,
8198
- {
8199
- value: endDate,
8200
- onChange: handleEndChange,
8201
- minDate: endMinDate,
8202
- maxDate,
8203
- rangeStart: startDate,
8204
- rangeEnd: endDate,
8205
- locale
8206
- }
8207
- ) })
8208
- ] });
8170
+ const calendar = /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)(
8171
+ "div",
8172
+ {
8173
+ className: clsx_default("lib-xplat-datepicker", "range"),
8174
+ role: "group",
8175
+ "aria-labelledby": label ? labelId : void 0,
8176
+ children: [
8177
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-tabs", children: /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8178
+ Tab_default,
8179
+ {
8180
+ activeIndex: activeTab === "start" ? 0 : 1,
8181
+ tabs: [
8182
+ { value: "start", title: locale === "ko" ? "\uC2DC\uC791\uC77C" : "Start" },
8183
+ { value: "end", title: locale === "ko" ? "\uC885\uB8CC\uC77C" : "End" }
8184
+ ],
8185
+ onChange: (tab) => setActiveTab(tab.value),
8186
+ type: "toggle",
8187
+ size: "sm"
8188
+ }
8189
+ ) }),
8190
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsxs)("div", { className: "datepicker-range-panels", children: [
8191
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8192
+ SingleDatePicker_default,
8193
+ {
8194
+ value: startDate,
8195
+ onChange: handleStartChange,
8196
+ minDate,
8197
+ maxDate: startMaxDate,
8198
+ rangeStart: startDate,
8199
+ rangeEnd: endDate,
8200
+ locale
8201
+ }
8202
+ ),
8203
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8204
+ SingleDatePicker_default,
8205
+ {
8206
+ value: endDate,
8207
+ onChange: handleEndChange,
8208
+ minDate: endMinDate,
8209
+ maxDate,
8210
+ rangeStart: startDate,
8211
+ rangeEnd: endDate,
8212
+ locale
8213
+ }
8214
+ )
8215
+ ] }),
8216
+ /* @__PURE__ */ (0, import_jsx_runtime318.jsx)("div", { className: "datepicker-range-mobile", children: activeTab === "start" ? /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8217
+ SingleDatePicker_default,
8218
+ {
8219
+ value: startDate,
8220
+ onChange: handleStartChange,
8221
+ minDate,
8222
+ maxDate: startMaxDate,
8223
+ rangeStart: startDate,
8224
+ rangeEnd: endDate,
8225
+ locale
8226
+ }
8227
+ ) : /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(
8228
+ SingleDatePicker_default,
8229
+ {
8230
+ value: endDate,
8231
+ onChange: handleEndChange,
8232
+ minDate: endMinDate,
8233
+ maxDate,
8234
+ rangeStart: startDate,
8235
+ rangeEnd: endDate,
8236
+ locale
8237
+ }
8238
+ ) })
8239
+ ]
8240
+ }
8241
+ );
8242
+ return /* @__PURE__ */ (0, import_jsx_runtime318.jsx)(Field, { label, required, labelId, validations, children: calendar });
8209
8243
  };
8210
8244
  RangePicker.displayName = "RangePicker";
8211
8245
  var RangePicker_default = RangePicker;
@@ -9978,10 +10012,13 @@ var FileUpload = (props) => {
9978
10012
  multiple = false,
9979
10013
  maxSize,
9980
10014
  onChange,
9981
- label = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
10015
+ placeholder = "\uD30C\uC77C\uC744 \uB4DC\uB798\uADF8\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uC5EC \uC5C5\uB85C\uB4DC",
9982
10016
  description,
9983
- validations
10017
+ validations,
10018
+ label,
10019
+ required
9984
10020
  } = props;
10021
+ const fieldId = import_react23.default.useId();
9985
10022
  const [isDragOver, setIsDragOver] = import_react23.default.useState(false);
9986
10023
  const inputRef = import_react23.default.useRef(null);
9987
10024
  const handleFiles = (fileList) => {
@@ -10026,6 +10063,7 @@ var FileUpload = (props) => {
10026
10063
  "input",
10027
10064
  {
10028
10065
  ref: inputRef,
10066
+ id: fieldId,
10029
10067
  type: "file",
10030
10068
  accept,
10031
10069
  multiple,
@@ -10034,12 +10072,12 @@ var FileUpload = (props) => {
10034
10072
  }
10035
10073
  ),
10036
10074
  /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("div", { className: "upload-icon", children: /* @__PURE__ */ (0, import_jsx_runtime325.jsx)(UploadIcon_default, {}) }),
10037
- /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("p", { className: "upload-label", children: label }),
10075
+ /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("p", { className: "upload-label", children: placeholder }),
10038
10076
  description && /* @__PURE__ */ (0, import_jsx_runtime325.jsx)("p", { className: "upload-description", children: description })
10039
10077
  ]
10040
10078
  }
10041
10079
  );
10042
- return /* @__PURE__ */ (0, import_jsx_runtime325.jsx)(Field, { validations, children: control });
10080
+ return /* @__PURE__ */ (0, import_jsx_runtime325.jsx)(Field, { label, required, htmlFor: fieldId, validations, children: control });
10043
10081
  };
10044
10082
  FileUpload.displayName = "FileUpload";
10045
10083
  var FileUpload_default = FileUpload;
@@ -10182,7 +10220,8 @@ var HtmlTypeWriter_default = HtmlTypeWriter;
10182
10220
  var import_react26 = __toESM(require("react"), 1);
10183
10221
  var import_jsx_runtime327 = require("react/jsx-runtime");
10184
10222
  var ImageSelector = (props) => {
10185
- const { value, label, onChange, validations } = props;
10223
+ const { value, placeholder, onChange, validations, label, required } = props;
10224
+ const fieldId = import_react26.default.useId();
10186
10225
  const [previewUrl, setPreviewUrl] = import_react26.default.useState();
10187
10226
  import_react26.default.useEffect(() => {
10188
10227
  if (!value) {
@@ -10212,7 +10251,7 @@ var ImageSelector = (props) => {
10212
10251
  {
10213
10252
  type: "file",
10214
10253
  accept: "image/*",
10215
- id: "image-input",
10254
+ id: fieldId,
10216
10255
  onChange: handleFileChange,
10217
10256
  ref: inputRef,
10218
10257
  "aria-invalid": hasError(validations) || void 0
@@ -10224,10 +10263,10 @@ var ImageSelector = (props) => {
10224
10263
  ] }),
10225
10264
  /* @__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: [
10226
10265
  /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "icon-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime327.jsx)(ImageIcon_default, {}) }),
10227
- /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "label", children: label || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
10266
+ /* @__PURE__ */ (0, import_jsx_runtime327.jsx)("div", { className: "label", children: placeholder || "\uC774\uBBF8\uC9C0 \uCD94\uAC00\uD558\uAE30" })
10228
10267
  ] }) })
10229
10268
  ] });
10230
- return /* @__PURE__ */ (0, import_jsx_runtime327.jsx)(Field, { validations, children: control });
10269
+ return /* @__PURE__ */ (0, import_jsx_runtime327.jsx)(Field, { label, required, htmlFor: fieldId, validations, children: control });
10231
10270
  };
10232
10271
  ImageSelector.displayName = "ImageSelector";
10233
10272
  var ImageSelector_default = ImageSelector;
package/dist/index.css CHANGED
@@ -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
  }