sellmate-design-system-react 0.1.7 → 0.1.9

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 (146) hide show
  1. package/dist/components/SActionModal/SActionModal.cjs +11 -3
  2. package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
  3. package/dist/components/SActionModal/SActionModal.js +11 -3
  4. package/dist/components/SActionModal/SActionModal.js.map +1 -1
  5. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +226 -209
  6. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  7. package/dist/components/SBarcodeInput/SBarcodeInput.js +226 -209
  8. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  9. package/dist/components/SCalendar/SCalendar.cjs +9 -1
  10. package/dist/components/SCalendar/SCalendar.cjs.map +1 -1
  11. package/dist/components/SCalendar/SCalendar.js +9 -1
  12. package/dist/components/SCalendar/SCalendar.js.map +1 -1
  13. package/dist/components/SChip/SChip.cjs +9 -1
  14. package/dist/components/SChip/SChip.cjs.map +1 -1
  15. package/dist/components/SChip/SChip.d.ts +1 -1
  16. package/dist/components/SChip/SChip.js +9 -1
  17. package/dist/components/SChip/SChip.js.map +1 -1
  18. package/dist/components/SChipInput/SChipInput.cjs +260 -235
  19. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  20. package/dist/components/SChipInput/SChipInput.js +259 -235
  21. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  22. package/dist/components/SCircleProgress/SCircleProgress.cjs +56 -58
  23. package/dist/components/SCircleProgress/SCircleProgress.cjs.map +1 -1
  24. package/dist/components/SCircleProgress/SCircleProgress.js +56 -58
  25. package/dist/components/SCircleProgress/SCircleProgress.js.map +1 -1
  26. package/dist/components/SConfirmModal/SConfirmModal.cjs +9 -1
  27. package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
  28. package/dist/components/SConfirmModal/SConfirmModal.js +9 -1
  29. package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
  30. package/dist/components/SDatePicker/SDatePicker.cjs +247 -221
  31. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  32. package/dist/components/SDatePicker/SDatePicker.js +247 -221
  33. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  34. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +308 -256
  35. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  36. package/dist/components/SDateRangePicker/SDateRangePicker.js +308 -256
  37. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  38. package/dist/components/SDropdownButton/SDropdownButton.cjs +51 -4
  39. package/dist/components/SDropdownButton/SDropdownButton.cjs.map +1 -1
  40. package/dist/components/SDropdownButton/SDropdownButton.js +52 -5
  41. package/dist/components/SDropdownButton/SDropdownButton.js.map +1 -1
  42. package/dist/components/SField/SField.cjs +226 -21
  43. package/dist/components/SField/SField.cjs.map +1 -1
  44. package/dist/components/SField/SField.d.ts +11 -0
  45. package/dist/components/SField/SField.js +226 -21
  46. package/dist/components/SField/SField.js.map +1 -1
  47. package/dist/components/SFilePicker/SFilePicker.cjs +306 -278
  48. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  49. package/dist/components/SFilePicker/SFilePicker.d.ts +4 -2
  50. package/dist/components/SFilePicker/SFilePicker.js +306 -278
  51. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  52. package/dist/components/SGhostButton/SGhostButton.cjs +8 -0
  53. package/dist/components/SGhostButton/SGhostButton.cjs.map +1 -1
  54. package/dist/components/SGhostButton/SGhostButton.js +8 -0
  55. package/dist/components/SGhostButton/SGhostButton.js.map +1 -1
  56. package/dist/components/SGuide/SGuide.cjs +12 -1
  57. package/dist/components/SGuide/SGuide.cjs.map +1 -1
  58. package/dist/components/SGuide/SGuide.js +12 -1
  59. package/dist/components/SGuide/SGuide.js.map +1 -1
  60. package/dist/components/SInput/SInput.cjs +226 -209
  61. package/dist/components/SInput/SInput.cjs.map +1 -1
  62. package/dist/components/SInput/SInput.js +226 -209
  63. package/dist/components/SInput/SInput.js.map +1 -1
  64. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +640 -453
  65. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  66. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +3 -1
  67. package/dist/components/SKeyValueTable/SKeyValueTable.js +640 -453
  68. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  69. package/dist/components/SLoadingContainer/SLoadingContainer.cjs +64 -58
  70. package/dist/components/SLoadingContainer/SLoadingContainer.cjs.map +1 -1
  71. package/dist/components/SLoadingContainer/SLoadingContainer.js +64 -58
  72. package/dist/components/SLoadingContainer/SLoadingContainer.js.map +1 -1
  73. package/dist/components/SLoadingContainer/loading.cjs +64 -58
  74. package/dist/components/SLoadingContainer/loading.cjs.map +1 -1
  75. package/dist/components/SLoadingContainer/loading.js +64 -58
  76. package/dist/components/SLoadingContainer/loading.js.map +1 -1
  77. package/dist/components/SLoadingModal/SLoadingModal.cjs +68 -61
  78. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  79. package/dist/components/SLoadingModal/SLoadingModal.js +68 -61
  80. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  81. package/dist/components/SModalContainer/SModalContainer.cjs +9 -1
  82. package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
  83. package/dist/components/SModalContainer/SModalContainer.js +9 -1
  84. package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
  85. package/dist/components/SNumberInput/SNumberInput.cjs +334 -50
  86. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  87. package/dist/components/SNumberInput/SNumberInput.d.ts +2 -0
  88. package/dist/components/SNumberInput/SNumberInput.js +334 -50
  89. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  90. package/dist/components/SPagination/SPagination.cjs +1 -1
  91. package/dist/components/SPagination/SPagination.cjs.map +1 -1
  92. package/dist/components/SPagination/SPagination.js +1 -1
  93. package/dist/components/SPagination/SPagination.js.map +1 -1
  94. package/dist/components/SPopover/SPopover.cjs +20 -3
  95. package/dist/components/SPopover/SPopover.cjs.map +1 -1
  96. package/dist/components/SPopover/SPopover.js +20 -4
  97. package/dist/components/SPopover/SPopover.js.map +1 -1
  98. package/dist/components/SPopup/SPopup.cjs +2 -2
  99. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  100. package/dist/components/SPopup/SPopup.js +2 -2
  101. package/dist/components/SPopup/SPopup.js.map +1 -1
  102. package/dist/components/SPortal/SPortal.cjs +8 -0
  103. package/dist/components/SPortal/SPortal.cjs.map +1 -1
  104. package/dist/components/SPortal/SPortal.js +8 -0
  105. package/dist/components/SPortal/SPortal.js.map +1 -1
  106. package/dist/components/SSelect/SSelect.cjs +76 -32
  107. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  108. package/dist/components/SSelect/SSelect.js +76 -32
  109. package/dist/components/SSelect/SSelect.js.map +1 -1
  110. package/dist/components/STable/STable.cjs +133 -91
  111. package/dist/components/STable/STable.cjs.map +1 -1
  112. package/dist/components/STable/STable.js +133 -91
  113. package/dist/components/STable/STable.js.map +1 -1
  114. package/dist/components/STextLink/STextLink.cjs +137 -3
  115. package/dist/components/STextLink/STextLink.cjs.map +1 -1
  116. package/dist/components/STextLink/STextLink.d.ts +1 -1
  117. package/dist/components/STextLink/STextLink.js +118 -4
  118. package/dist/components/STextLink/STextLink.js.map +1 -1
  119. package/dist/components/STextarea/STextarea.cjs +226 -21
  120. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  121. package/dist/components/STextarea/STextarea.js +226 -21
  122. package/dist/components/STextarea/STextarea.js.map +1 -1
  123. package/dist/components/SToast/SToast.cjs +8 -0
  124. package/dist/components/SToast/SToast.cjs.map +1 -1
  125. package/dist/components/SToast/SToast.js +8 -0
  126. package/dist/components/SToast/SToast.js.map +1 -1
  127. package/dist/components/SToast/SToastContainer.cjs +11 -3
  128. package/dist/components/SToast/SToastContainer.cjs.map +1 -1
  129. package/dist/components/SToast/SToastContainer.js +11 -3
  130. package/dist/components/SToast/SToastContainer.js.map +1 -1
  131. package/dist/components/STooltip/STooltip.cjs +217 -14
  132. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  133. package/dist/components/STooltip/STooltip.js +217 -14
  134. package/dist/components/STooltip/STooltip.js.map +1 -1
  135. package/dist/index.cjs +532 -300
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.js +531 -300
  138. package/dist/index.js.map +1 -1
  139. package/dist/lib/floating-anim.cjs +8 -0
  140. package/dist/lib/floating-anim.cjs.map +1 -1
  141. package/dist/lib/floating-anim.d.ts +5 -1
  142. package/dist/lib/floating-anim.js +8 -0
  143. package/dist/lib/floating-anim.js.map +1 -1
  144. package/dist/styles.css +175 -66
  145. package/dist/theme.css +49 -22
  146. package/package.json +1 -1
@@ -2,8 +2,8 @@
2
2
  import { forwardRef, createContext, useState, useRef, useImperativeHandle, useContext, useEffect } from 'react';
3
3
  import { clsx } from 'clsx';
4
4
  import { extendTailwindMerge } from 'tailwind-merge';
5
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
6
- import * as RPopover from '@radix-ui/react-popover';
5
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+ import * as RPopover2 from '@radix-ui/react-popover';
7
7
 
8
8
  var twMerge = extendTailwindMerge({
9
9
  extend: {
@@ -2854,12 +2854,20 @@ var SIcon = forwardRef(function SIcon2({ name, size = 24, color, rotate, label,
2854
2854
  // src/lib/floating-anim.ts
2855
2855
  var FLOATING_SLIDE_ANIM = [
2856
2856
  "data-[state=open]:data-[side=top]:animate-floating-in-top",
2857
+ "data-[state=delayed-open]:data-[side=top]:animate-floating-in-top",
2858
+ "data-[state=instant-open]:data-[side=top]:animate-floating-in-top",
2857
2859
  "data-[state=closed]:data-[side=top]:animate-floating-out-top",
2858
2860
  "data-[state=open]:data-[side=bottom]:animate-floating-in-bottom",
2861
+ "data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom",
2862
+ "data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom",
2859
2863
  "data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom",
2860
2864
  "data-[state=open]:data-[side=left]:animate-floating-in-left",
2865
+ "data-[state=delayed-open]:data-[side=left]:animate-floating-in-left",
2866
+ "data-[state=instant-open]:data-[side=left]:animate-floating-in-left",
2861
2867
  "data-[state=closed]:data-[side=left]:animate-floating-out-left",
2862
2868
  "data-[state=open]:data-[side=right]:animate-floating-in-right",
2869
+ "data-[state=delayed-open]:data-[side=right]:animate-floating-in-right",
2870
+ "data-[state=instant-open]:data-[side=right]:animate-floating-in-right",
2863
2871
  "data-[state=closed]:data-[side=right]:animate-floating-out-right"
2864
2872
  ].join(" ");
2865
2873
  var PortalContainerContext = createContext(null);
@@ -2867,11 +2875,200 @@ PortalContainerContext.Provider;
2867
2875
  function usePortalContainer() {
2868
2876
  return useContext(PortalContainerContext) ?? void 0;
2869
2877
  }
2878
+
2879
+ // src/components/STag/tag.config.ts
2880
+ var TAG_SIZE_CONFIG = {
2881
+ xs: {
2882
+ height: 20,
2883
+ paddingX: 8,
2884
+ gap: 4,
2885
+ radius: 6,
2886
+ iconSize: 12,
2887
+ fontSize: 11,
2888
+ fontWeight: 500,
2889
+ lineHeight: 18
2890
+ },
2891
+ sm: {
2892
+ height: 24,
2893
+ paddingX: 8,
2894
+ gap: 4,
2895
+ radius: 6,
2896
+ iconSize: 16,
2897
+ fontSize: 12,
2898
+ fontWeight: 700,
2899
+ lineHeight: 20
2900
+ },
2901
+ md: {
2902
+ height: 28,
2903
+ paddingX: 12,
2904
+ gap: 6,
2905
+ radius: 8,
2906
+ iconSize: 16,
2907
+ fontSize: 14,
2908
+ fontWeight: 700,
2909
+ lineHeight: 24
2910
+ }
2911
+ };
2912
+ var STag = forwardRef(function STag2({
2913
+ shape = "square",
2914
+ size = "sm",
2915
+ color = "grey",
2916
+ label = "",
2917
+ icon,
2918
+ iconLeft = true,
2919
+ width,
2920
+ className,
2921
+ style,
2922
+ ...rest
2923
+ }, ref) {
2924
+ const s = TAG_SIZE_CONFIG[size];
2925
+ const contentColor = `var(--cmp-tag-${color}-content)`;
2926
+ const iconNode = icon ? /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.iconSize, color: contentColor }) : null;
2927
+ const resolvedWidth = typeof width === "number" ? `${width}px` : width;
2928
+ return /* @__PURE__ */ jsxs(
2929
+ "span",
2930
+ {
2931
+ ref,
2932
+ "aria-label": label || "tag",
2933
+ className: cn(
2934
+ "box-border inline-flex w-fit select-none items-center justify-center whitespace-nowrap",
2935
+ className
2936
+ ),
2937
+ style: {
2938
+ minHeight: s.height,
2939
+ padding: `0 ${s.paddingX}px`,
2940
+ gap: s.gap,
2941
+ borderRadius: shape === "pill" ? 999 : s.radius,
2942
+ fontSize: s.fontSize,
2943
+ fontWeight: s.fontWeight,
2944
+ lineHeight: `${s.lineHeight}px`,
2945
+ background: `var(--cmp-tag-${color}-bg)`,
2946
+ color: contentColor,
2947
+ ...resolvedWidth != null ? { width: resolvedWidth } : {},
2948
+ ...style
2949
+ },
2950
+ ...rest,
2951
+ children: [
2952
+ icon && iconLeft && iconNode,
2953
+ label && /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-0 items-center justify-center", children: label }),
2954
+ icon && !iconLeft && iconNode
2955
+ ]
2956
+ }
2957
+ );
2958
+ });
2959
+ var SIZE = {
2960
+ xxs: { icon: 12, radius: "sm" },
2961
+ xs: { icon: 16, radius: "sm" },
2962
+ sm: { icon: 20, radius: "sm" },
2963
+ md: { icon: 24, radius: "md" },
2964
+ lg: { icon: 32, radius: "md" }
2965
+ };
2966
+ var TOOLTIP_HIDE_DELAY_MS = 100;
2967
+ function SGhostButton({
2968
+ icon,
2969
+ size = "sm",
2970
+ intent = "default",
2971
+ ariaLabel = "",
2972
+ tooltipText,
2973
+ disabled = false,
2974
+ onClick,
2975
+ className,
2976
+ style
2977
+ }) {
2978
+ const portalContainer = usePortalContainer();
2979
+ const [open, setOpen] = useState(false);
2980
+ const hideTimer = useRef(void 0);
2981
+ const cancelHide = () => {
2982
+ if (hideTimer.current) {
2983
+ clearTimeout(hideTimer.current);
2984
+ hideTimer.current = void 0;
2985
+ }
2986
+ };
2987
+ const openNow = () => {
2988
+ cancelHide();
2989
+ setOpen(true);
2990
+ };
2991
+ const startHide = () => {
2992
+ cancelHide();
2993
+ hideTimer.current = setTimeout(() => setOpen(false), TOOLTIP_HIDE_DELAY_MS);
2994
+ };
2995
+ const s = SIZE[size];
2996
+ const contentColor = disabled ? intent === "inverse" ? "var(--cmp-ghostButton-inverse-disabled)" : "var(--cmp-ghostButton-icon-disabled)" : `var(--cmp-ghostButton-${intent}-content)`;
2997
+ const btn = /* @__PURE__ */ jsxs(
2998
+ "button",
2999
+ {
3000
+ type: "button",
3001
+ disabled,
3002
+ "aria-disabled": disabled ? "true" : void 0,
3003
+ "aria-label": ariaLabel.trim() || void 0,
3004
+ tabIndex: disabled ? -1 : void 0,
3005
+ onClick: (e) => {
3006
+ if (disabled) {
3007
+ e.preventDefault();
3008
+ return;
3009
+ }
3010
+ onClick?.(e);
3011
+ },
3012
+ className: cn(
3013
+ "group relative box-border inline-flex items-center justify-center border-none bg-transparent p-0 transition-shadow",
3014
+ disabled ? "cursor-not-allowed" : "cursor-pointer",
3015
+ "focus-visible:outline-none focus-visible:shadow-[0_0_0_2px_var(--cmp-ghostButton-action-hover-bg)]",
3016
+ className
3017
+ ),
3018
+ style: {
3019
+ width: `var(--cmp-ghostButton-${size}-size)`,
3020
+ height: `var(--cmp-ghostButton-${size}-size)`,
3021
+ borderRadius: `var(--cmp-ghostButton-radius-${s.radius})`,
3022
+ ...style
3023
+ },
3024
+ children: [
3025
+ !disabled && /* @__PURE__ */ jsx(
3026
+ "span",
3027
+ {
3028
+ "aria-hidden": true,
3029
+ className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover:opacity-5",
3030
+ style: { background: `var(--cmp-ghostButton-${intent}-hover-bg)` }
3031
+ }
3032
+ ),
3033
+ /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: contentColor })
3034
+ ]
3035
+ }
3036
+ );
3037
+ const text = (tooltipText ?? "").trim();
3038
+ if (text === "") return btn;
3039
+ return /* @__PURE__ */ jsxs(RPopover2.Root, { open, onOpenChange: setOpen, children: [
3040
+ /* @__PURE__ */ jsx(RPopover2.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
3041
+ "span",
3042
+ {
3043
+ className: "inline-flex",
3044
+ onMouseEnter: openNow,
3045
+ onMouseLeave: startHide,
3046
+ onFocus: openNow,
3047
+ onBlur: startHide,
3048
+ children: btn
3049
+ }
3050
+ ) }),
3051
+ /* @__PURE__ */ jsx(RPopover2.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
3052
+ RPopover2.Content,
3053
+ {
3054
+ side: "top",
3055
+ sideOffset: 4,
3056
+ className: cn("z-50", FLOATING_SLIDE_ANIM),
3057
+ "aria-hidden": true,
3058
+ onOpenAutoFocus: (e) => e.preventDefault(),
3059
+ onMouseEnter: cancelHide,
3060
+ onMouseLeave: startHide,
3061
+ children: /* @__PURE__ */ jsx(STag, { shape: "square", size: "xs", color: "grey", label: text })
3062
+ }
3063
+ ) })
3064
+ ] });
3065
+ }
2870
3066
  var HIDE_DELAY_MS = 100;
2871
3067
  function useBody(content, message = []) {
2872
3068
  if (content != null) return content;
2873
3069
  if (message.length === 0) return null;
2874
- return /* @__PURE__ */ jsx(Fragment, { children: message.map((line, i) => /* @__PURE__ */ jsx("div", { children: line }, i)) });
3070
+ const singleLine = message.length === 1;
3071
+ return /* @__PURE__ */ jsx(Fragment, { children: message.map((line, i) => /* @__PURE__ */ jsx("div", { className: singleLine ? "leading-[24px]" : void 0, children: line }, i)) });
2875
3072
  }
2876
3073
  var STooltip = forwardRef(function STooltip2({
2877
3074
  content,
@@ -2929,7 +3126,7 @@ var STooltip = forwardRef(function STooltip2({
2929
3126
  if (disabled || body == null) return /* @__PURE__ */ jsx(Fragment, { children: triggerNode });
2930
3127
  const isHover = trigger === "hover";
2931
3128
  const contentClass = cn(
2932
- "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px]",
3129
+ "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",
2933
3130
  FLOATING_SLIDE_ANIM,
2934
3131
  className
2935
3132
  );
@@ -2939,10 +3136,10 @@ var STooltip = forwardRef(function STooltip2({
2939
3136
  fontWeight: tooltipType === "default" ? 500 : 700,
2940
3137
  ...style
2941
3138
  };
2942
- return /* @__PURE__ */ jsxs(RPopover.Root, { open, onOpenChange: setOpen, children: [
3139
+ return /* @__PURE__ */ jsxs(RPopover2.Root, { open, onOpenChange: setOpen, children: [
2943
3140
  isHover ? (
2944
3141
  // hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
2945
- /* @__PURE__ */ jsx(RPopover.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
3142
+ /* @__PURE__ */ jsx(RPopover2.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
2946
3143
  "span",
2947
3144
  {
2948
3145
  className: "inline-flex",
@@ -2953,9 +3150,9 @@ var STooltip = forwardRef(function STooltip2({
2953
3150
  children: triggerNode
2954
3151
  }
2955
3152
  ) })
2956
- ) : /* @__PURE__ */ jsx(RPopover.Trigger, { asChild: true, children: triggerNode }),
2957
- /* @__PURE__ */ jsx(RPopover.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
2958
- RPopover.Content,
3153
+ ) : /* @__PURE__ */ jsx(RPopover2.Trigger, { asChild: true, children: triggerNode }),
3154
+ /* @__PURE__ */ jsx(RPopover2.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
3155
+ RPopover2.Content,
2959
3156
  {
2960
3157
  side: placement,
2961
3158
  sideOffset: 8,
@@ -2974,15 +3171,21 @@ var STooltip = forwardRef(function STooltip2({
2974
3171
  /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-[12px]", children: [
2975
3172
  /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: body }),
2976
3173
  useClose && /* @__PURE__ */ jsx(
2977
- RPopover.Close,
3174
+ SGhostButton,
2978
3175
  {
2979
- "aria-label": "\uB2EB\uAE30",
2980
- className: "shrink-0 cursor-pointer opacity-70 hover:opacity-100",
2981
- children: /* @__PURE__ */ jsx(SIcon, { name: "close", size: 16, color: fg })
3176
+ icon: "close",
3177
+ size: "xs",
3178
+ intent: tooltipType === "default" ? "inverse" : "default",
3179
+ ariaLabel: "\uB2EB\uAE30",
3180
+ className: "shrink-0",
3181
+ onClick: () => {
3182
+ cancelHide();
3183
+ setOpen(false);
3184
+ }
2982
3185
  }
2983
3186
  )
2984
3187
  ] }),
2985
- /* @__PURE__ */ jsx(RPopover.Arrow, { width: 16, height: 12, style: { fill: bg } })
3188
+ /* @__PURE__ */ jsx(RPopover2.Arrow, { width: 16, height: 12, style: { fill: bg } })
2986
3189
  ]
2987
3190
  }
2988
3191
  ) })
@@ -3016,8 +3219,8 @@ function useFormField(field) {
3016
3219
  }, [ctx, name]);
3017
3220
  }
3018
3221
  var FIELD_SIZE = {
3019
- sm: { height: 28, radius: 4, fieldGap: 12, labelGap: 6, fontSize: 12, lineHeight: 20, icon: 12 },
3020
- md: { height: 36, radius: 6, fieldGap: 16, labelGap: 8, fontSize: 14, lineHeight: 24, icon: 12 }
3222
+ sm: { height: 28, radius: 4, fieldGap: 12, labelGap: 6, fontSize: 12, lineHeight: 20, icon: 16 },
3223
+ md: { height: 36, radius: 6, fieldGap: 16, labelGap: 8, fontSize: 14, lineHeight: 24, icon: 16 }
3021
3224
  };
3022
3225
  var ALIGN = {
3023
3226
  start: "flex-start",
@@ -3032,6 +3235,7 @@ var SField = forwardRef(function SField2({
3032
3235
  labelTooltip = "",
3033
3236
  labelTooltipProps,
3034
3237
  labelWidth,
3238
+ labelHeight,
3035
3239
  size = "sm",
3036
3240
  addonLabel = "",
3037
3241
  addonAlign = "start",
@@ -3046,6 +3250,7 @@ var SField = forwardRef(function SField2({
3046
3250
  readOnly = false,
3047
3251
  width,
3048
3252
  multiline = false,
3253
+ borderless = false,
3049
3254
  children,
3050
3255
  className,
3051
3256
  style,
@@ -3079,8 +3284,8 @@ var SField = forwardRef(function SField2({
3079
3284
  const resolvedSuccess = status === "pass";
3080
3285
  const showError = resolvedError && errorMessage !== "";
3081
3286
  const interactive = !disabled && !readOnly;
3082
- const borderColor = disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
3083
- const bgColor = disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3287
+ const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
3288
+ const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3084
3289
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
3085
3290
  return /* @__PURE__ */ jsx(
3086
3291
  "div",
@@ -3097,7 +3302,7 @@ var SField = forwardRef(function SField2({
3097
3302
  {
3098
3303
  className: "flex shrink-0 items-center font-bold text-(--sys-color-field-text-default)",
3099
3304
  style: {
3100
- height: s.height,
3305
+ height: cssLen(labelHeight) ?? s.height,
3101
3306
  marginRight: s.fieldGap,
3102
3307
  width: cssLen(labelWidth),
3103
3308
  fontSize: s.fontSize,
@@ -3123,14 +3328,14 @@ var SField = forwardRef(function SField2({
3123
3328
  {
3124
3329
  className: cn(
3125
3330
  "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3126
- interactive && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
3331
+ interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
3127
3332
  disabled && "cursor-not-allowed"
3128
3333
  ),
3129
3334
  style: {
3130
3335
  // @ts-expect-error CSS 변수
3131
3336
  "--field-bc": borderColor,
3132
3337
  // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3133
- ...interactive && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3338
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3134
3339
  ...multiline ? { minHeight: s.height } : { height: s.height },
3135
3340
  "width": cssLen(width),
3136
3341
  "borderRadius": s.radius,
@@ -3169,194 +3374,6 @@ var SField = forwardRef(function SField2({
3169
3374
  }
3170
3375
  );
3171
3376
  });
3172
-
3173
- // src/components/STag/tag.config.ts
3174
- var TAG_SIZE_CONFIG = {
3175
- xs: {
3176
- height: 20,
3177
- paddingX: 8,
3178
- gap: 4,
3179
- radius: 6,
3180
- iconSize: 12,
3181
- fontSize: 11,
3182
- fontWeight: 500,
3183
- lineHeight: 18
3184
- },
3185
- sm: {
3186
- height: 24,
3187
- paddingX: 8,
3188
- gap: 4,
3189
- radius: 6,
3190
- iconSize: 16,
3191
- fontSize: 12,
3192
- fontWeight: 700,
3193
- lineHeight: 20
3194
- },
3195
- md: {
3196
- height: 28,
3197
- paddingX: 12,
3198
- gap: 6,
3199
- radius: 8,
3200
- iconSize: 16,
3201
- fontSize: 14,
3202
- fontWeight: 700,
3203
- lineHeight: 24
3204
- }
3205
- };
3206
- var STag = forwardRef(function STag2({
3207
- shape = "square",
3208
- size = "sm",
3209
- color = "grey",
3210
- label = "",
3211
- icon,
3212
- iconLeft = true,
3213
- width,
3214
- className,
3215
- style,
3216
- ...rest
3217
- }, ref) {
3218
- const s = TAG_SIZE_CONFIG[size];
3219
- const contentColor = `var(--cmp-tag-${color}-content)`;
3220
- const iconNode = icon ? /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.iconSize, color: contentColor }) : null;
3221
- const resolvedWidth = typeof width === "number" ? `${width}px` : width;
3222
- return /* @__PURE__ */ jsxs(
3223
- "span",
3224
- {
3225
- ref,
3226
- "aria-label": label || "tag",
3227
- className: cn(
3228
- "box-border inline-flex w-fit select-none items-center justify-center whitespace-nowrap",
3229
- className
3230
- ),
3231
- style: {
3232
- minHeight: s.height,
3233
- padding: `0 ${s.paddingX}px`,
3234
- gap: s.gap,
3235
- borderRadius: shape === "pill" ? 999 : s.radius,
3236
- fontSize: s.fontSize,
3237
- fontWeight: s.fontWeight,
3238
- lineHeight: `${s.lineHeight}px`,
3239
- background: `var(--cmp-tag-${color}-bg)`,
3240
- color: contentColor,
3241
- ...resolvedWidth != null ? { width: resolvedWidth } : {},
3242
- ...style
3243
- },
3244
- ...rest,
3245
- children: [
3246
- icon && iconLeft && iconNode,
3247
- label && /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-0 items-center justify-center", children: label }),
3248
- icon && !iconLeft && iconNode
3249
- ]
3250
- }
3251
- );
3252
- });
3253
- var SIZE = {
3254
- xxs: { icon: 12, radius: "sm" },
3255
- xs: { icon: 16, radius: "sm" },
3256
- sm: { icon: 20, radius: "sm" },
3257
- md: { icon: 24, radius: "md" },
3258
- lg: { icon: 32, radius: "md" }
3259
- };
3260
- var TOOLTIP_HIDE_DELAY_MS = 100;
3261
- function SGhostButton({
3262
- icon,
3263
- size = "sm",
3264
- intent = "default",
3265
- ariaLabel = "",
3266
- tooltipText,
3267
- disabled = false,
3268
- onClick,
3269
- className,
3270
- style
3271
- }) {
3272
- const portalContainer = usePortalContainer();
3273
- const [open, setOpen] = useState(false);
3274
- const hideTimer = useRef(void 0);
3275
- const cancelHide = () => {
3276
- if (hideTimer.current) {
3277
- clearTimeout(hideTimer.current);
3278
- hideTimer.current = void 0;
3279
- }
3280
- };
3281
- const openNow = () => {
3282
- cancelHide();
3283
- setOpen(true);
3284
- };
3285
- const startHide = () => {
3286
- cancelHide();
3287
- hideTimer.current = setTimeout(() => setOpen(false), TOOLTIP_HIDE_DELAY_MS);
3288
- };
3289
- const s = SIZE[size];
3290
- const contentColor = disabled ? intent === "inverse" ? "var(--cmp-ghostButton-inverse-disabled)" : "var(--cmp-ghostButton-icon-disabled)" : `var(--cmp-ghostButton-${intent}-content)`;
3291
- const btn = /* @__PURE__ */ jsxs(
3292
- "button",
3293
- {
3294
- type: "button",
3295
- disabled,
3296
- "aria-disabled": disabled ? "true" : void 0,
3297
- "aria-label": ariaLabel.trim() || void 0,
3298
- tabIndex: disabled ? -1 : void 0,
3299
- onClick: (e) => {
3300
- if (disabled) {
3301
- e.preventDefault();
3302
- return;
3303
- }
3304
- onClick?.(e);
3305
- },
3306
- className: cn(
3307
- "group relative box-border inline-flex items-center justify-center border-none bg-transparent p-0 transition-shadow",
3308
- disabled ? "cursor-not-allowed" : "cursor-pointer",
3309
- "focus-visible:outline-none focus-visible:shadow-[0_0_0_2px_var(--cmp-ghostButton-action-hover-bg)]",
3310
- className
3311
- ),
3312
- style: {
3313
- width: `var(--cmp-ghostButton-${size}-size)`,
3314
- height: `var(--cmp-ghostButton-${size}-size)`,
3315
- borderRadius: `var(--cmp-ghostButton-radius-${s.radius})`,
3316
- ...style
3317
- },
3318
- children: [
3319
- !disabled && /* @__PURE__ */ jsx(
3320
- "span",
3321
- {
3322
- "aria-hidden": true,
3323
- className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover:opacity-5",
3324
- style: { background: `var(--cmp-ghostButton-${intent}-hover-bg)` }
3325
- }
3326
- ),
3327
- /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: contentColor })
3328
- ]
3329
- }
3330
- );
3331
- const text = (tooltipText ?? "").trim();
3332
- if (text === "") return btn;
3333
- return /* @__PURE__ */ jsxs(RPopover.Root, { open, onOpenChange: setOpen, children: [
3334
- /* @__PURE__ */ jsx(RPopover.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
3335
- "span",
3336
- {
3337
- className: "inline-flex",
3338
- onMouseEnter: openNow,
3339
- onMouseLeave: startHide,
3340
- onFocus: openNow,
3341
- onBlur: startHide,
3342
- children: btn
3343
- }
3344
- ) }),
3345
- /* @__PURE__ */ jsx(RPopover.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
3346
- RPopover.Content,
3347
- {
3348
- side: "top",
3349
- sideOffset: 4,
3350
- className: cn("z-50", FLOATING_SLIDE_ANIM),
3351
- "aria-hidden": true,
3352
- onOpenAutoFocus: (e) => e.preventDefault(),
3353
- onMouseEnter: cancelHide,
3354
- onMouseLeave: startHide,
3355
- children: /* @__PURE__ */ jsx(STag, { shape: "square", size: "xs", color: "grey", label: text })
3356
- }
3357
- ) })
3358
- ] });
3359
- }
3360
3377
  var FONT = {
3361
3378
  sm: {
3362
3379
  fontSize: 12,