sellmate-design-system-react 0.8.3 → 0.9.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 (73) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +78 -2
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +78 -2
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +78 -2
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +78 -2
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SDatePicker/SDatePicker.cjs +78 -2
  10. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  11. package/dist/components/SDatePicker/SDatePicker.js +78 -2
  12. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  13. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +78 -2
  14. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  15. package/dist/components/SDateRangePicker/SDateRangePicker.js +78 -2
  16. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  17. package/dist/components/SField/SField.cjs +78 -2
  18. package/dist/components/SField/SField.cjs.map +1 -1
  19. package/dist/components/SField/SField.js +78 -2
  20. package/dist/components/SField/SField.js.map +1 -1
  21. package/dist/components/SFilePicker/SFilePicker.cjs +78 -2
  22. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  23. package/dist/components/SFilePicker/SFilePicker.js +78 -2
  24. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  25. package/dist/components/SGnb/SGnb.cjs +58 -16
  26. package/dist/components/SGnb/SGnb.cjs.map +1 -1
  27. package/dist/components/SGnb/SGnb.d.ts +15 -0
  28. package/dist/components/SGnb/SGnb.js +58 -16
  29. package/dist/components/SGnb/SGnb.js.map +1 -1
  30. package/dist/components/SInput/SInput.cjs +78 -2
  31. package/dist/components/SInput/SInput.cjs.map +1 -1
  32. package/dist/components/SInput/SInput.js +78 -2
  33. package/dist/components/SInput/SInput.js.map +1 -1
  34. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +224 -118
  35. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  36. package/dist/components/SKeyValueTable/SKeyValueTable.js +224 -118
  37. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  38. package/dist/components/SNumberInput/SNumberInput.cjs +78 -2
  39. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  40. package/dist/components/SNumberInput/SNumberInput.js +78 -2
  41. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  42. package/dist/components/SSelect/SSelect.cjs +155 -49
  43. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  44. package/dist/components/SSelect/SSelect.js +155 -49
  45. package/dist/components/SSelect/SSelect.js.map +1 -1
  46. package/dist/components/SSelect/select.config.d.ts +7 -0
  47. package/dist/components/STable/STable.cjs +155 -49
  48. package/dist/components/STable/STable.cjs.map +1 -1
  49. package/dist/components/STable/STable.js +155 -49
  50. package/dist/components/STable/STable.js.map +1 -1
  51. package/dist/components/STextarea/STextarea.cjs +78 -2
  52. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  53. package/dist/components/STextarea/STextarea.js +78 -2
  54. package/dist/components/STextarea/STextarea.js.map +1 -1
  55. package/dist/components/STimePicker/STimePicker.cjs +78 -2
  56. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  57. package/dist/components/STimePicker/STimePicker.js +78 -2
  58. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  59. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +78 -2
  60. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  61. package/dist/components/STimeRangePicker/STimeRangePicker.js +78 -2
  62. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  63. package/dist/components/STooltip/STooltip.cjs +78 -2
  64. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  65. package/dist/components/STooltip/STooltip.d.ts +1 -1
  66. package/dist/components/STooltip/STooltip.js +78 -2
  67. package/dist/components/STooltip/STooltip.js.map +1 -1
  68. package/dist/index.cjs +209 -65
  69. package/dist/index.cjs.map +1 -1
  70. package/dist/index.js +209 -65
  71. package/dist/index.js.map +1 -1
  72. package/dist/styles.css +35 -8
  73. package/package.json +1 -1
@@ -7,7 +7,7 @@ export type STooltipTrigger = 'hover' | 'click';
7
7
  export interface STooltipProps {
8
8
  /** 툴팁 본문 (ReactNode). message 보다 우선 */
9
9
  content?: ReactNode;
10
- /** 툴팁 본문 줄 목록 (각 항목) */
10
+ /** 툴팁 본문 줄 목록 (각 항목이줄, HTML 문자열 허용 — innerHTML 렌더링) */
11
11
  message?: string[];
12
12
  /** 트리거 방식 */
13
13
  trigger?: STooltipTrigger;
@@ -170,6 +170,75 @@ InsideModalContext.Provider;
170
170
  function usePortalContainer() {
171
171
  return useContext(PortalContainerContext) ?? void 0;
172
172
  }
173
+
174
+ // src/lib/sanitize-inline-html.ts
175
+ var ALLOWED_INLINE_TAGS = /* @__PURE__ */ new Set(["A", "B", "STRONG", "I", "EM", "BR", "SPAN"]);
176
+ var ALLOWED_ATTRS_BY_TAG = {
177
+ A: /* @__PURE__ */ new Set(["href", "target", "rel", "class"])
178
+ };
179
+ var COMMON_ALLOWED_ATTRS = /* @__PURE__ */ new Set(["class"]);
180
+ var SAFE_HREF_RE = /^(https?:|mailto:|tel:|\/|#|\.)/i;
181
+ var DROP_CONTENT_TAGS = /* @__PURE__ */ new Set([
182
+ "SCRIPT",
183
+ "STYLE",
184
+ "IFRAME",
185
+ "OBJECT",
186
+ "EMBED",
187
+ "META",
188
+ "LINK",
189
+ "BASE",
190
+ "NOSCRIPT",
191
+ // SVG/MATH 는 foreign-content 파싱 모드로 전환되어 재직렬화 시 다른 트리로
192
+ // 재파싱될 수 있다(mXSS 벡터). 인라인 라벨에 필요 없으므로 통째로 제거한다.
193
+ "SVG",
194
+ "MATH",
195
+ "TEMPLATE"
196
+ ]);
197
+ var escapeHtml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
198
+ var sanitizeNode = (node) => {
199
+ if (node.nodeType === Node.COMMENT_NODE) {
200
+ node.remove();
201
+ return;
202
+ }
203
+ if (node.nodeType !== Node.ELEMENT_NODE) return;
204
+ const element = node;
205
+ const tagName = element.tagName;
206
+ if (DROP_CONTENT_TAGS.has(tagName)) {
207
+ element.remove();
208
+ return;
209
+ }
210
+ Array.from(element.childNodes).forEach((child) => sanitizeNode(child));
211
+ if (ALLOWED_INLINE_TAGS.has(tagName)) {
212
+ if (element.hasAttribute("className")) {
213
+ const val = element.getAttribute("className");
214
+ element.removeAttribute("className");
215
+ if (!element.hasAttribute("class")) element.setAttribute("class", val);
216
+ }
217
+ const allowedAttrs = ALLOWED_ATTRS_BY_TAG[tagName] ?? COMMON_ALLOWED_ATTRS;
218
+ Array.from(element.attributes).forEach((attr) => {
219
+ if (!allowedAttrs.has(attr.name)) element.removeAttribute(attr.name);
220
+ });
221
+ if (tagName === "A") {
222
+ const href = element.getAttribute("href");
223
+ if (href !== null && href !== "" && !SAFE_HREF_RE.test(href)) element.removeAttribute("href");
224
+ if (element.hasAttribute("target")) {
225
+ element.setAttribute("rel", "noopener noreferrer");
226
+ }
227
+ }
228
+ return;
229
+ }
230
+ const parent = element.parentNode;
231
+ if (parent == null) return;
232
+ while (element.firstChild) parent.insertBefore(element.firstChild, element);
233
+ parent.removeChild(element);
234
+ };
235
+ var sanitizeInlineHtml = (value) => {
236
+ if (typeof document === "undefined") return escapeHtml(value);
237
+ const template = document.createElement("template");
238
+ template.innerHTML = value;
239
+ Array.from(template.content.childNodes).forEach((child) => sanitizeNode(child));
240
+ return template.innerHTML;
241
+ };
173
242
  var Icon_add = (p) => {
174
243
  const { size = 24, ...rest } = p;
175
244
  return /* @__PURE__ */ jsx(
@@ -3076,7 +3145,14 @@ function useBody(content, message = []) {
3076
3145
  if (content != null) return content;
3077
3146
  if (message.length === 0) return null;
3078
3147
  const singleLine = message.length === 1;
3079
- return /* @__PURE__ */ jsx(Fragment, { children: message.map((line, i) => /* @__PURE__ */ jsx("div", { className: singleLine ? "leading-[24px]" : void 0, children: line }, i)) });
3148
+ return /* @__PURE__ */ jsx(Fragment, { children: message.map((line, i) => /* @__PURE__ */ jsx(
3149
+ "div",
3150
+ {
3151
+ className: singleLine ? "leading-[24px]" : void 0,
3152
+ dangerouslySetInnerHTML: { __html: sanitizeInlineHtml(line) }
3153
+ },
3154
+ i
3155
+ )) });
3080
3156
  }
3081
3157
  var STooltip = forwardRef(function STooltip2({
3082
3158
  content,
@@ -3134,7 +3210,7 @@ var STooltip = forwardRef(function STooltip2({
3134
3210
  if (disabled || body == null) return /* @__PURE__ */ jsx(Fragment, { children: triggerNode });
3135
3211
  const isHover = trigger === "hover";
3136
3212
  const contentClass = cn(
3137
- "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px]",
3213
+ "z-50 w-fit whitespace-nowrap rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px]",
3138
3214
  FLOATING_SLIDE_ANIM,
3139
3215
  className
3140
3216
  );