sellmate-design-system-react 0.5.0 → 0.6.1

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 (38) hide show
  1. package/README.md +20 -0
  2. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +180 -37
  3. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  4. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +6 -1
  5. package/dist/components/SDateRangePicker/SDateRangePicker.js +180 -37
  6. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  7. package/dist/components/SGnb/SGnb.cjs +145 -57
  8. package/dist/components/SGnb/SGnb.cjs.map +1 -1
  9. package/dist/components/SGnb/SGnb.d.ts +7 -1
  10. package/dist/components/SGnb/SGnb.js +146 -58
  11. package/dist/components/SGnb/SGnb.js.map +1 -1
  12. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +180 -37
  13. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  14. package/dist/components/SKeyValueTable/SKeyValueTable.js +180 -37
  15. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  16. package/dist/components/SLayout/SLayout.cjs +21 -6
  17. package/dist/components/SLayout/SLayout.cjs.map +1 -1
  18. package/dist/components/SLayout/SLayout.d.ts +17 -2
  19. package/dist/components/SLayout/SLayout.js +21 -6
  20. package/dist/components/SLayout/SLayout.js.map +1 -1
  21. package/dist/components/SPage/SPage.cjs +21 -6
  22. package/dist/components/SPage/SPage.cjs.map +1 -1
  23. package/dist/components/SPage/SPage.js +21 -6
  24. package/dist/components/SPage/SPage.js.map +1 -1
  25. package/dist/components/SStepper/SStepper.cjs +3019 -0
  26. package/dist/components/SStepper/SStepper.cjs.map +1 -0
  27. package/dist/components/SStepper/SStepper.d.ts +16 -0
  28. package/dist/components/SStepper/SStepper.js +3017 -0
  29. package/dist/components/SStepper/SStepper.js.map +1 -0
  30. package/dist/components/SStepper/index.d.ts +2 -0
  31. package/dist/components/SStepper/stepper.config.d.ts +42 -0
  32. package/dist/index.cjs +500 -104
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.js +499 -105
  36. package/dist/index.js.map +1 -1
  37. package/dist/styles.css +61 -0
  38. package/package.json +3 -1
@@ -5424,25 +5424,45 @@ function SDatePicker({
5424
5424
  }
5425
5425
  );
5426
5426
  }
5427
+ function splitDateTime(v) {
5428
+ if (!v) return { date: null, hour: "00", minute: "00" };
5429
+ const [date = "", time = ""] = v.split(" ");
5430
+ const [hour = "00", minute = "00"] = time.split(":");
5431
+ return { date: date || null, hour, minute };
5432
+ }
5427
5433
  function RangeCalendar({
5428
5434
  value,
5429
5435
  selectable,
5430
5436
  maxRange,
5437
+ useTimePicker = false,
5431
5438
  onSelect,
5432
5439
  onPendingStartChange,
5433
5440
  onViewChange
5434
5441
  }) {
5435
5442
  const today = todayStr();
5436
- const base = value?.[0] || today;
5443
+ const initial = splitDateTime(value?.[0]);
5444
+ const base = initial.date || today;
5437
5445
  const [y, setY] = react.useState(Number(base.split("-")[0]));
5438
5446
  const [m, setM] = react.useState(Number(base.split("-")[1]));
5439
- const [start, setStart] = react.useState(value?.[0] ?? null);
5440
- const [end, setEnd] = react.useState(value?.[1] ?? null);
5447
+ const [start, setStart] = react.useState(initial.date);
5448
+ const [end, setEnd] = react.useState(splitDateTime(value?.[1]).date);
5441
5449
  const [hover, setHover] = react.useState(null);
5450
+ const [sH, setSH] = react.useState(initial.hour);
5451
+ const [sM, setSM] = react.useState(initial.minute);
5452
+ const [eH, setEH] = react.useState(splitDateTime(value?.[1]).hour);
5453
+ const [eM, setEM] = react.useState(splitDateTime(value?.[1]).minute);
5454
+ const lastEmitted = react.useRef("");
5442
5455
  react.useEffect(() => {
5443
- setStart(value?.[0] ?? null);
5444
- setEnd(value?.[1] ?? null);
5445
- }, [value]);
5456
+ if (useTimePicker && JSON.stringify(value) === lastEmitted.current) return;
5457
+ const s = splitDateTime(value?.[0]);
5458
+ const e = splitDateTime(value?.[1]);
5459
+ setStart(s.date);
5460
+ setEnd(e.date);
5461
+ setSH(s.hour);
5462
+ setSM(s.minute);
5463
+ setEH(e.hour);
5464
+ setEM(e.minute);
5465
+ }, [value, useTimePicker]);
5446
5466
  const setBase = (ny, nm) => {
5447
5467
  setY(ny);
5448
5468
  setM(nm);
@@ -5486,18 +5506,53 @@ function RangeCalendar({
5486
5506
  const hasRange = !!(rStart && rEnd && rStart !== rEnd);
5487
5507
  const inRange = (d) => !!(rStart && rEnd && d > rStart && d < rEnd);
5488
5508
  const RANGE_BG = "var(--cmp-datepicker-calendar-range-bg)";
5509
+ const pad = (v) => String(Number(v) || 0).padStart(2, "0");
5510
+ const emit = (dateStart, dateEnd, time) => {
5511
+ const t = time ?? { sH, sM, eH, eM };
5512
+ const range = useTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
5513
+ lastEmitted.current = JSON.stringify(range);
5514
+ onSelect(range);
5515
+ };
5489
5516
  const click = (d) => {
5490
5517
  if (isDisabled(d)) return;
5491
5518
  if (!start || complete || d < start) {
5492
5519
  setStart(d);
5493
5520
  setEnd(null);
5494
5521
  setHover(null);
5522
+ if (useTimePicker) {
5523
+ setSH("00");
5524
+ setSM("00");
5525
+ setEH("23");
5526
+ setEM("59");
5527
+ }
5495
5528
  onPendingStartChange?.(d);
5496
5529
  return;
5497
5530
  }
5498
5531
  setEnd(d);
5499
5532
  onPendingStartChange?.(null);
5500
- onSelect([start, d]);
5533
+ emit(start, d, useTimePicker ? { sH, sM, eH: "23", eM: "59" } : void 0);
5534
+ };
5535
+ const changeTime = (which, part, raw) => {
5536
+ const digits = raw.replace(/\D/g, "").slice(0, 2);
5537
+ const max = part === "h" ? 23 : 59;
5538
+ const next = digits !== "" && Number(digits) > max ? String(max) : digits;
5539
+ const nextTime = { sH, sM, eH, eM };
5540
+ if (which === "start") nextTime[part === "h" ? "sH" : "sM"] = next;
5541
+ else nextTime[part === "h" ? "eH" : "eM"] = next;
5542
+ setSH(nextTime.sH);
5543
+ setSM(nextTime.sM);
5544
+ setEH(nextTime.eH);
5545
+ setEM(nextTime.eM);
5546
+ if (start && end) emit(start, end, nextTime);
5547
+ };
5548
+ const blurTime = (which, part) => {
5549
+ if (which === "start") {
5550
+ if (part === "h") setSH(pad(sH));
5551
+ else setSM(pad(sM));
5552
+ } else {
5553
+ if (part === "h") setEH(pad(eH));
5554
+ else setEM(pad(eM));
5555
+ }
5501
5556
  };
5502
5557
  const GRID_COLS = "grid grid-cols-[repeat(7,var(--cmp-datepicker-calendar-day-width))]";
5503
5558
  const renderPanel = (gy, gm, isLeft) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-[var(--cmp-datepicker-calendar-gap)]", children: [
@@ -5572,35 +5627,120 @@ function RangeCalendar({
5572
5627
  );
5573
5628
  }) })
5574
5629
  ] });
5575
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex h-[364px] flex-col gap-[var(--cmp-datepicker-calendar-gap)] rounded-[var(--cmp-datepicker-calendar-radius)] bg-[var(--cmp-datepicker-calendar-bg)] p-[var(--cmp-datepicker-calendar-paddingXY)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.2)] select-none", children: [
5576
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", children: [
5577
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] text-[14px] font-medium leading-[24px]", children: [
5578
- /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: "prevYear", onClick: goPrevYear }),
5579
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center", children: y }),
5580
- /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronRight", size: "xxs", ariaLabel: "nextYear", onClick: goNextYear })
5581
- ] }),
5582
- /* @__PURE__ */ jsxRuntime.jsx(
5583
- "button",
5584
- {
5585
- type: "button",
5586
- onClick: goToday,
5587
- className: "absolute right-0 h-[24px] min-w-[37px] cursor-pointer bg-transparent text-center text-[12px] font-medium leading-[24px] text-[color:var(--cmp-datepicker-calendar-day-default-text)] hover:underline",
5588
- children: "\uC624\uB298"
5589
- }
5590
- )
5591
- ] }),
5592
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-range-panelGap)]", children: [
5593
- renderPanel(y, m, true),
5594
- /* @__PURE__ */ jsxRuntime.jsx(
5595
- "span",
5596
- {
5597
- className: "w-px shrink-0 self-stretch bg-[var(--cmp-datepicker-calendar-range-divider)]",
5598
- "aria-hidden": true
5599
- }
5630
+ const renderTimeSection = (which, date, suffix) => {
5631
+ const active = !!date;
5632
+ const [yy = "", mm = "", dd = ""] = date ? date.split("-") : [];
5633
+ const hour = which === "start" ? sH : eH;
5634
+ const minute = which === "start" ? sM : eM;
5635
+ const num = (n, strip) => active && n !== "" ? strip ? String(Number(n)) : n : "-";
5636
+ const INPUT_CLS = "h-[var(--cmp-datepicker-sm-height)] w-[40px] rounded-[var(--cmp-datepicker-sm-radius)] border border-solid border-[color:var(--cmp-datepicker-border-default)] bg-[var(--cmp-datepicker-bg-default)] text-center text-[12px] font-medium leading-[20px] text-[color:var(--cmp-datepicker-text-default)] outline-none placeholder:text-[color:var(--cmp-datepicker-text-disabled)] focus:border-[color:var(--cmp-datepicker-border-focus)] disabled:cursor-not-allowed";
5637
+ const LABEL = "text-[color:var(--cmp-datepicker-calendar-time-date-label)]";
5638
+ const UNIT = "text-[color:var(--cmp-datepicker-calendar-time-date-unit)]";
5639
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5640
+ "div",
5641
+ {
5642
+ className: cn(
5643
+ "flex flex-1 items-center justify-center gap-[var(--cmp-datepicker-calendar-time-section-gap)] rounded-[var(--cmp-datepicker-calendar-time-radius)] px-[var(--cmp-datepicker-calendar-time-paddingX)] py-[var(--cmp-datepicker-calendar-time-paddingY)] text-[12px] font-medium leading-[20px]",
5644
+ active ? "bg-[var(--cmp-datepicker-calendar-time-bg-selected)]" : "bg-[var(--cmp-datepicker-calendar-time-bg-default)]"
5645
+ ),
5646
+ children: [
5647
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-date-gap)]", children: [
5648
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: num(yy, false) }),
5649
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: "\uB144" }),
5650
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: num(mm, true) }),
5651
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: "\uC6D4" }),
5652
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: num(dd, true) }),
5653
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: "\uC77C" })
5654
+ ] }),
5655
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-time-unit-gap)]", children: [
5656
+ /* @__PURE__ */ jsxRuntime.jsx(
5657
+ "input",
5658
+ {
5659
+ type: "text",
5660
+ inputMode: "numeric",
5661
+ maxLength: 2,
5662
+ "aria-label": `${suffix} \uC2DC`,
5663
+ disabled: !active,
5664
+ value: active ? hour : "",
5665
+ placeholder: "--",
5666
+ onChange: (e) => changeTime(which, "h", e.target.value),
5667
+ onBlur: () => blurTime(which, "h"),
5668
+ className: INPUT_CLS
5669
+ }
5670
+ ),
5671
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL, children: ":" }),
5672
+ /* @__PURE__ */ jsxRuntime.jsx(
5673
+ "input",
5674
+ {
5675
+ type: "text",
5676
+ inputMode: "numeric",
5677
+ maxLength: 2,
5678
+ "aria-label": `${suffix} \uBD84`,
5679
+ disabled: !active,
5680
+ value: active ? minute : "",
5681
+ placeholder: "--",
5682
+ onChange: (e) => changeTime(which, "m", e.target.value),
5683
+ onBlur: () => blurTime(which, "m"),
5684
+ className: INPUT_CLS
5685
+ }
5686
+ )
5687
+ ] }),
5688
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: UNIT, children: suffix })
5689
+ ]
5690
+ }
5691
+ );
5692
+ };
5693
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5694
+ "div",
5695
+ {
5696
+ className: cn(
5697
+ "inline-flex flex-col gap-[var(--cmp-datepicker-calendar-gap)] rounded-[var(--cmp-datepicker-calendar-radius)] bg-[var(--cmp-datepicker-calendar-bg)] p-[var(--cmp-datepicker-calendar-paddingXY)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.2)] select-none",
5698
+ useTimePicker ? "h-auto" : "h-[364px]"
5600
5699
  ),
5601
- renderPanel(nextMonthYM.year, nextMonthYM.month, false)
5602
- ] })
5603
- ] });
5700
+ children: [
5701
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", children: [
5702
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] text-[14px] font-medium leading-[24px]", children: [
5703
+ /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: "prevYear", onClick: goPrevYear }),
5704
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center", children: y }),
5705
+ /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronRight", size: "xxs", ariaLabel: "nextYear", onClick: goNextYear })
5706
+ ] }),
5707
+ /* @__PURE__ */ jsxRuntime.jsx(
5708
+ "button",
5709
+ {
5710
+ type: "button",
5711
+ onClick: goToday,
5712
+ className: "absolute right-0 h-[24px] min-w-[37px] cursor-pointer bg-transparent text-center text-[12px] font-medium leading-[24px] text-[color:var(--cmp-datepicker-calendar-day-default-text)] hover:underline",
5713
+ children: "\uC624\uB298"
5714
+ }
5715
+ )
5716
+ ] }),
5717
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-range-panelGap)]", children: [
5718
+ renderPanel(y, m, true),
5719
+ /* @__PURE__ */ jsxRuntime.jsx(
5720
+ "span",
5721
+ {
5722
+ className: "w-px shrink-0 self-stretch bg-[var(--cmp-datepicker-calendar-range-divider)]",
5723
+ "aria-hidden": true
5724
+ }
5725
+ ),
5726
+ renderPanel(nextMonthYM.year, nextMonthYM.month, false)
5727
+ ] }),
5728
+ useTimePicker && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5729
+ /* @__PURE__ */ jsxRuntime.jsx(
5730
+ "span",
5731
+ {
5732
+ className: "h-px w-full bg-[var(--cmp-datepicker-calendar-range-divider)]",
5733
+ "aria-hidden": true
5734
+ }
5735
+ ),
5736
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-time-gap)]", children: [
5737
+ renderTimeSection("start", start, "\uBD80\uD130"),
5738
+ renderTimeSection("end", end, "\uAE4C\uC9C0")
5739
+ ] })
5740
+ ] })
5741
+ ]
5742
+ }
5743
+ );
5604
5744
  }
5605
5745
  function SDateRangePicker({
5606
5746
  value,
@@ -5610,6 +5750,7 @@ function SDateRangePicker({
5610
5750
  placeholder = "YYYY-MM-DD ~ YYYY-MM-DD",
5611
5751
  selectable,
5612
5752
  maxRange,
5753
+ useTimePicker = false,
5613
5754
  disabled = false,
5614
5755
  width,
5615
5756
  name,
@@ -5653,8 +5794,9 @@ function SDateRangePicker({
5653
5794
  setPendingStart(null);
5654
5795
  onValueChange?.(r);
5655
5796
  if (rules && rules.length > 0) setRuleError(runRules(r, rules));
5656
- setOpen(false);
5797
+ if (!useTimePicker) setOpen(false);
5657
5798
  };
5799
+ const resolvedPlaceholder = useTimePicker && placeholder === "YYYY-MM-DD ~ YYYY-MM-DD" ? "YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm" : placeholder;
5658
5800
  return /* @__PURE__ */ jsxRuntime.jsx(
5659
5801
  SField,
5660
5802
  {
@@ -5721,7 +5863,7 @@ function SDateRangePicker({
5721
5863
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-right", children: startText }),
5722
5864
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-[4px]", children: "~" }),
5723
5865
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: endText })
5724
- ] }) : placeholder
5866
+ ] }) : resolvedPlaceholder
5725
5867
  }
5726
5868
  )
5727
5869
  ]
@@ -5740,6 +5882,7 @@ function SDateRangePicker({
5740
5882
  value: value ?? null,
5741
5883
  selectable,
5742
5884
  maxRange,
5885
+ useTimePicker,
5743
5886
  onSelect: select,
5744
5887
  onPendingStartChange: setPendingStart,
5745
5888
  onViewChange