sellmate-design-system-react 9.0.0-beta.46 → 9.0.0-beta.48

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 (124) hide show
  1. package/AGENTS.md +17 -6
  2. package/README.md +13 -0
  3. package/dist/components/SChatAttachedFile/README.md +33 -0
  4. package/dist/components/SChatAttachedFile/SChatAttachedFile.d.ts +13 -0
  5. package/dist/components/SChatAttachedFile/chatAttachedFile.config.d.ts +23 -0
  6. package/dist/components/SChatAttachedFile/index.d.ts +2 -0
  7. package/dist/components/SChatFile/README.md +33 -0
  8. package/dist/components/SChatFile/SChatFile.d.ts +37 -0
  9. package/dist/components/SChatFile/chatFile.config.d.ts +56 -0
  10. package/dist/components/SChatFile/index.d.ts +2 -0
  11. package/dist/components/SChatMessage/README.md +4 -2
  12. package/dist/components/SChatMessage/SChatMessage.d.ts +19 -2
  13. package/dist/components/SChatSystemMessage/README.md +12 -0
  14. package/dist/components/SChatSystemMessage/SChatSystemMessage.d.ts +18 -0
  15. package/dist/components/SChatSystemMessage/index.d.ts +1 -0
  16. package/dist/components/SGhostButton/README.md +2 -0
  17. package/dist/components/SIcon/README.md +4 -0
  18. package/dist/components/SIcon/icons.gen.d.ts +3 -1
  19. package/dist/components/SSystemActionButton/README.md +20 -0
  20. package/dist/fonts/LICENSE.txt +94 -0
  21. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.0.woff2 +0 -0
  22. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.1.woff2 +0 -0
  23. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.10.woff2 +0 -0
  24. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.11.woff2 +0 -0
  25. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.12.woff2 +0 -0
  26. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.13.woff2 +0 -0
  27. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.14.woff2 +0 -0
  28. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.15.woff2 +0 -0
  29. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.16.woff2 +0 -0
  30. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.17.woff2 +0 -0
  31. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.18.woff2 +0 -0
  32. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.19.woff2 +0 -0
  33. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.2.woff2 +0 -0
  34. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.20.woff2 +0 -0
  35. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.21.woff2 +0 -0
  36. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.22.woff2 +0 -0
  37. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.23.woff2 +0 -0
  38. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.24.woff2 +0 -0
  39. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.25.woff2 +0 -0
  40. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.26.woff2 +0 -0
  41. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.27.woff2 +0 -0
  42. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.28.woff2 +0 -0
  43. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.29.woff2 +0 -0
  44. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.3.woff2 +0 -0
  45. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.30.woff2 +0 -0
  46. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.31.woff2 +0 -0
  47. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.32.woff2 +0 -0
  48. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.33.woff2 +0 -0
  49. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.34.woff2 +0 -0
  50. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.35.woff2 +0 -0
  51. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.36.woff2 +0 -0
  52. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.37.woff2 +0 -0
  53. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.38.woff2 +0 -0
  54. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.39.woff2 +0 -0
  55. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.4.woff2 +0 -0
  56. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.40.woff2 +0 -0
  57. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.41.woff2 +0 -0
  58. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.42.woff2 +0 -0
  59. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.43.woff2 +0 -0
  60. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.44.woff2 +0 -0
  61. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.45.woff2 +0 -0
  62. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.46.woff2 +0 -0
  63. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.47.woff2 +0 -0
  64. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.48.woff2 +0 -0
  65. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.49.woff2 +0 -0
  66. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.5.woff2 +0 -0
  67. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.50.woff2 +0 -0
  68. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.51.woff2 +0 -0
  69. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.52.woff2 +0 -0
  70. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.53.woff2 +0 -0
  71. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.54.woff2 +0 -0
  72. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.55.woff2 +0 -0
  73. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.56.woff2 +0 -0
  74. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.57.woff2 +0 -0
  75. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.58.woff2 +0 -0
  76. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.59.woff2 +0 -0
  77. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.6.woff2 +0 -0
  78. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.60.woff2 +0 -0
  79. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.61.woff2 +0 -0
  80. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.62.woff2 +0 -0
  81. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.63.woff2 +0 -0
  82. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.64.woff2 +0 -0
  83. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.65.woff2 +0 -0
  84. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.66.woff2 +0 -0
  85. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.67.woff2 +0 -0
  86. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.68.woff2 +0 -0
  87. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.69.woff2 +0 -0
  88. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.7.woff2 +0 -0
  89. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.70.woff2 +0 -0
  90. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.71.woff2 +0 -0
  91. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.72.woff2 +0 -0
  92. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.73.woff2 +0 -0
  93. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.74.woff2 +0 -0
  94. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.75.woff2 +0 -0
  95. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.76.woff2 +0 -0
  96. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.77.woff2 +0 -0
  97. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.78.woff2 +0 -0
  98. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.79.woff2 +0 -0
  99. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.8.woff2 +0 -0
  100. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.80.woff2 +0 -0
  101. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.81.woff2 +0 -0
  102. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.82.woff2 +0 -0
  103. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.83.woff2 +0 -0
  104. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.84.woff2 +0 -0
  105. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.85.woff2 +0 -0
  106. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.86.woff2 +0 -0
  107. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.87.woff2 +0 -0
  108. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.88.woff2 +0 -0
  109. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.89.woff2 +0 -0
  110. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.9.woff2 +0 -0
  111. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.90.woff2 +0 -0
  112. package/dist/fonts/woff2-dynamic-subset/PretendardVariable.subset.91.woff2 +0 -0
  113. package/dist/index.cjs +391 -104
  114. package/dist/index.cjs.map +1 -1
  115. package/dist/index.d.ts +3 -0
  116. package/dist/index.js +384 -105
  117. package/dist/index.js.map +1 -1
  118. package/dist/llms-full.txt +118 -9
  119. package/dist/llms.txt +20 -9
  120. package/dist/pretendard.css +937 -0
  121. package/dist/styles.css +1001 -25
  122. package/dist/theme.css +90 -5
  123. package/eslint/scale.gen.mjs +1 -1
  124. package/package.json +2 -2
package/dist/index.cjs CHANGED
@@ -559,6 +559,27 @@ var Icon_attachFile = (p) => {
559
559
  }
560
560
  );
561
561
  };
562
+ var Icon_back = (p) => {
563
+ const { size = 24, ...rest } = p;
564
+ return /* @__PURE__ */ jsxRuntime.jsx(
565
+ "svg",
566
+ {
567
+ width: size,
568
+ height: size,
569
+ viewBox: "0 0 24 24",
570
+ fill: "none",
571
+ xmlns: "http://www.w3.org/2000/svg",
572
+ ...rest,
573
+ children: /* @__PURE__ */ jsxRuntime.jsx(
574
+ "path",
575
+ {
576
+ d: "M7.82001 2.38596C8.15933 2.14859 8.62646 2.23126 8.86395 2.57053C9.10129 2.90984 9.01864 3.37699 8.67938 3.61447L5.6286 5.75021H14.7497C18.6157 5.75021 21.7497 8.88422 21.7497 12.7502C21.7495 16.6161 18.6156 19.7502 14.7497 19.7502H4.9997C4.58572 19.75 4.24984 19.4142 4.2497 19.0002C4.2497 18.5861 4.58563 18.2504 4.9997 18.2502H14.7497C17.7872 18.2502 20.2495 15.7877 20.2497 12.7502C20.2497 9.71265 17.7873 7.25021 14.7497 7.25021H5.6286L8.67938 9.38596C9.01865 9.62345 9.10132 10.0906 8.86395 10.4299C8.62639 10.7689 8.15922 10.8518 7.82001 10.6145L3.98993 7.93381C2.99491 7.23718 2.99509 5.76338 3.98993 5.06662L7.82001 2.38596Z",
577
+ fill: "currentColor"
578
+ }
579
+ )
580
+ }
581
+ );
582
+ };
562
583
  var Icon_barcode = (p) => {
563
584
  const { size = 24, ...rest } = p;
564
585
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1347,6 +1368,29 @@ var Icon_copy = (p) => {
1347
1368
  }
1348
1369
  );
1349
1370
  };
1371
+ var Icon_counsel = (p) => {
1372
+ const { size = 24, ...rest } = p;
1373
+ return /* @__PURE__ */ jsxRuntime.jsx(
1374
+ "svg",
1375
+ {
1376
+ width: size,
1377
+ height: size,
1378
+ viewBox: "0 0 24 24",
1379
+ fill: "none",
1380
+ xmlns: "http://www.w3.org/2000/svg",
1381
+ ...rest,
1382
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1383
+ "path",
1384
+ {
1385
+ fillRule: "evenodd",
1386
+ clipRule: "evenodd",
1387
+ d: "M12 1.75C17.3848 1.75 21.75 6.11522 21.75 11.5V16C21.75 19.1756 19.1756 21.75 16 21.75H12.5C12.0858 21.75 11.75 21.4142 11.75 21C11.75 20.5858 12.0858 20.25 12.5 20.25H16C17.3042 20.25 18.4694 19.6611 19.249 18.7363C19.1669 18.7437 19.084 18.75 19 18.75H18C16.4812 18.75 15.25 17.5188 15.25 16V13C15.25 11.4812 16.4812 10.25 18 10.25H19C19.4269 10.25 19.8299 10.3498 20.1904 10.5234C19.7072 6.4275 16.2258 3.25 12 3.25C7.77412 3.25 4.29172 6.42744 3.80859 10.5234C4.16932 10.3496 4.57276 10.25 5 10.25H6C7.51878 10.25 8.75 11.4812 8.75 13V16C8.75 17.5188 7.51878 18.75 6 18.75H5C3.48122 18.75 2.25 17.5188 2.25 16V11.5C2.25 6.11522 6.61522 1.75 12 1.75ZM5 11.75C4.30964 11.75 3.75 12.3096 3.75 13V16C3.75 16.6904 4.30964 17.25 5 17.25H6C6.69036 17.25 7.25 16.6904 7.25 16V13C7.25 12.3096 6.69036 11.75 6 11.75H5ZM18 11.75C17.3096 11.75 16.75 12.3096 16.75 13V16C16.75 16.6904 17.3096 17.25 18 17.25H19C19.6904 17.25 20.25 16.6904 20.25 16V13C20.25 12.3096 19.6904 11.75 19 11.75H18Z",
1388
+ fill: "currentColor"
1389
+ }
1390
+ )
1391
+ }
1392
+ );
1393
+ };
1350
1394
  var Icon_coupon = (p) => {
1351
1395
  const { size = 24, ...rest } = p;
1352
1396
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1471,52 +1515,6 @@ var Icon_date = (p) => {
1471
1515
  }
1472
1516
  );
1473
1517
  };
1474
- var Icon_delete = (p) => {
1475
- const { size = 24, ...rest } = p;
1476
- return /* @__PURE__ */ jsxRuntime.jsxs(
1477
- "svg",
1478
- {
1479
- width: size,
1480
- height: size,
1481
- viewBox: "0 0 24 24",
1482
- fill: "none",
1483
- xmlns: "http://www.w3.org/2000/svg",
1484
- ...rest,
1485
- children: [
1486
- /* @__PURE__ */ jsxRuntime.jsx(
1487
- "path",
1488
- {
1489
- d: "M8.35254 10.7646C8.75858 10.6834 9.15395 10.9466 9.23535 11.3525L10.2354 16.3525C10.3166 16.7586 10.0534 17.1539 9.64746 17.2354C9.24142 17.3166 8.84605 17.0534 8.76465 16.6475L7.76465 11.6475C7.68344 11.2414 7.94658 10.8461 8.35254 10.7646Z",
1490
- fill: "currentColor"
1491
- }
1492
- ),
1493
- /* @__PURE__ */ jsxRuntime.jsx(
1494
- "path",
1495
- {
1496
- d: "M12 10.75C12.4142 10.75 12.75 11.0858 12.75 11.5V16.5C12.75 16.9142 12.4142 17.25 12 17.25C11.5858 17.25 11.25 16.9142 11.25 16.5V11.5C11.25 11.0858 11.5858 10.75 12 10.75Z",
1497
- fill: "currentColor"
1498
- }
1499
- ),
1500
- /* @__PURE__ */ jsxRuntime.jsx(
1501
- "path",
1502
- {
1503
- d: "M14.7646 11.3525C14.8461 10.9466 15.2414 10.6834 15.6475 10.7646C16.0534 10.8461 16.3166 11.2414 16.2354 11.6475L15.2354 16.6475C15.1539 17.0534 14.7586 17.3166 14.3525 17.2354C13.9466 17.1539 13.6834 16.7586 13.7646 16.3525L14.7646 11.3525Z",
1504
- fill: "currentColor"
1505
- }
1506
- ),
1507
- /* @__PURE__ */ jsxRuntime.jsx(
1508
- "path",
1509
- {
1510
- fillRule: "evenodd",
1511
- clipRule: "evenodd",
1512
- d: "M13 2.0498C13.9664 2.0498 14.7499 2.8334 14.75 3.7998V4.25H20C20.4142 4.25 20.75 4.58579 20.75 5V8C20.75 8.41421 20.4142 8.75 20 8.75H19.6445L17.999 19.6123C17.7952 20.9565 16.6398 21.9502 15.2803 21.9502H8.71973C7.36018 21.9502 6.20481 20.9565 6.00098 19.6123L4.35547 8.75H4C3.58579 8.75 3.25 8.41421 3.25 8V5C3.25 4.58579 3.58579 4.25 4 4.25H8.75V3.7998C8.75011 2.8334 9.53357 2.0498 10.5 2.0498H13ZM7.48438 19.3877C7.57717 19.9985 8.10188 20.4502 8.71973 20.4502H15.2803C15.8981 20.4502 16.4228 19.9985 16.5156 19.3877L18.1279 8.75H5.87207L7.48438 19.3877ZM4.75 7.25H19.25V5.75H4.75V7.25ZM10.5 3.5498C10.362 3.5498 10.2501 3.66182 10.25 3.7998V4.25H13.25V3.7998C13.2499 3.66182 13.138 3.5498 13 3.5498H10.5Z",
1513
- fill: "currentColor"
1514
- }
1515
- )
1516
- ]
1517
- }
1518
- );
1519
- };
1520
1518
  var Icon_dot = (p) => {
1521
1519
  const { size = 24, ...rest } = p;
1522
1520
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1791,6 +1789,29 @@ var Icon_history = (p) => {
1791
1789
  }
1792
1790
  );
1793
1791
  };
1792
+ var Icon_home = (p) => {
1793
+ const { size = 24, ...rest } = p;
1794
+ return /* @__PURE__ */ jsxRuntime.jsx(
1795
+ "svg",
1796
+ {
1797
+ width: size,
1798
+ height: size,
1799
+ viewBox: "0 0 24 24",
1800
+ fill: "none",
1801
+ xmlns: "http://www.w3.org/2000/svg",
1802
+ ...rest,
1803
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1804
+ "path",
1805
+ {
1806
+ fillRule: "evenodd",
1807
+ clipRule: "evenodd",
1808
+ d: "M10.8371 3.03041C11.5001 2.44103 12.5002 2.44103 13.1632 3.03041L21.4982 10.4396C21.8075 10.7148 21.8357 11.1887 21.5607 11.4982C21.2856 11.8075 20.8116 11.8355 20.5021 11.5607L19.7501 10.8917V20.0001C19.75 20.9664 18.9664 21.7501 18.0001 21.7501H16.5001C15.5338 21.7501 14.7503 20.9665 14.7501 20.0001V13.5001C14.7501 13.3621 14.6381 13.2502 14.5001 13.2501H9.50014C9.36207 13.2501 9.25014 13.3621 9.25014 13.5001V20.0001C9.24995 20.9664 8.46645 21.7501 7.50014 21.7501H6.00014C5.03376 21.7501 4.25033 20.9665 4.25014 20.0001V10.8917L3.49819 11.5607C3.18869 11.8356 2.71476 11.8074 2.43959 11.4982C2.16455 11.1886 2.19263 10.7148 2.50209 10.4396L10.8371 3.03041ZM12.1662 4.15151C12.0714 4.06731 11.9288 4.06731 11.8341 4.15151L5.75014 9.55873V20.0001C5.75033 20.1381 5.86219 20.2501 6.00014 20.2501H7.50014C7.63802 20.2501 7.74995 20.138 7.75014 20.0001V13.5001C7.75014 12.5336 8.53364 11.7501 9.50014 11.7501H14.5001C15.4666 11.7502 16.2501 12.5337 16.2501 13.5001V20.0001C16.2503 20.1381 16.3622 20.2501 16.5001 20.2501H18.0001C18.138 20.2501 18.25 20.138 18.2501 20.0001V9.55873L12.1662 4.15151Z",
1809
+ fill: "currentColor"
1810
+ }
1811
+ )
1812
+ }
1813
+ );
1814
+ };
1794
1815
  var Icon_image = (p) => {
1795
1816
  const { size = 24, ...rest } = p;
1796
1817
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3214,6 +3235,7 @@ var ICONS = {
3214
3235
  arrowUp: Icon_arrowUp,
3215
3236
  asterisk: Icon_asterisk,
3216
3237
  attachFile: Icon_attachFile,
3238
+ back: Icon_back,
3217
3239
  barcode: Icon_barcode,
3218
3240
  bell: Icon_bell,
3219
3241
  bellRinging: Icon_bellRinging,
@@ -3243,10 +3265,10 @@ var ICONS = {
3243
3265
  close: Icon_close,
3244
3266
  company: Icon_company,
3245
3267
  copy: Icon_copy,
3268
+ counsel: Icon_counsel,
3246
3269
  coupon: Icon_coupon,
3247
3270
  dashboard: Icon_dashboard,
3248
3271
  date: Icon_date,
3249
- delete: Icon_delete,
3250
3272
  dot: Icon_dot,
3251
3273
  download: Icon_download,
3252
3274
  drag: Icon_drag,
@@ -3257,6 +3279,7 @@ var ICONS = {
3257
3279
  helpFill: Icon_helpFill,
3258
3280
  helpOutline: Icon_helpOutline,
3259
3281
  history: Icon_history,
3282
+ home: Icon_home,
3260
3283
  image: Icon_image,
3261
3284
  inline: Icon_inline,
3262
3285
  launcher: Icon_launcher,
@@ -4658,10 +4681,9 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
4658
4681
  );
4659
4682
  });
4660
4683
  var DEFAULT_PLACEHOLDER = "\uBA54\uC2DC\uC9C0\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694...";
4661
- var FIELD_MIN_HEIGHT = 48;
4662
4684
  var FIELD_BORDER = 1;
4663
- var TEXTAREA_MIN_HEIGHT = FIELD_MIN_HEIGHT - FIELD_BORDER * 2;
4664
- var BUTTON_BOTTOM_INSET = `calc((${FIELD_MIN_HEIGHT}px - var(--cmp-ghostButton-md-size)) / 2)`;
4685
+ var TEXTAREA_MIN_HEIGHT = `calc(var(--cmp-chatInput-buttonFrame-height) - ${FIELD_BORDER * 2}px)`;
4686
+ var BUTTON_BOTTOM_INSET = `calc((var(--cmp-chatInput-buttonFrame-height) - var(--cmp-ghostButton-md-size)) / 2)`;
4665
4687
  var DEFAULT_MAX_ROWS = 5;
4666
4688
  var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
4667
4689
  value = "",
@@ -4690,8 +4712,8 @@ var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
4690
4712
  e.preventDefault();
4691
4713
  send();
4692
4714
  };
4693
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col bg-(--sys-color-field-bg-default)", className), style, children: [
4694
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-sd-8 p-sd-12", children: [
4715
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col bg-(--cmp-chatInput-bg)", className), style, children: [
4716
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-(--cmp-chatInput-gap) p-(--cmp-chatInput-padding)", children: [
4695
4717
  onAttach != null && /* @__PURE__ */ jsxRuntime.jsx(
4696
4718
  SGhostButton,
4697
4719
  {
@@ -4751,12 +4773,183 @@ var SChatInputImpl = /* @__PURE__ */ react.forwardRef(function SChatInput({
4751
4773
  ] });
4752
4774
  });
4753
4775
  var SChatInput2 = /* @__PURE__ */ withDisplayName(SChatInputImpl, "SChatInput");
4776
+
4777
+ // src/components/SChatAttachedFile/chatAttachedFile.config.ts
4778
+ var CHAT_ATTACHED_FILE_CONFIG = {
4779
+ /** 바깥 상자 — 좌우·상하 여백·면·선·라운드 */
4780
+ box: "px-(--cmp-chatAttachedFile-paddingX) py-(--cmp-chatAttachedFile-paddingY) rounded-(--cmp-chatAttachedFile-radius) border-(length:--cmp-chatAttachedFile-border-width) border-(--cmp-chatAttachedFile-border-color) bg-(--cmp-chatAttachedFile-bg)",
4781
+ /** 콘텐츠 묶음 ↔ 제거 버튼 간격 */
4782
+ outerGap: "gap-(--cmp-chatAttachedFile-gap)",
4783
+ /** 아이콘 칩 ↔ 파일명 간격 */
4784
+ contentGap: "gap-(--cmp-chatAttachedFile-content-gap)",
4785
+ /** 클립 아이콘이 앉는 칩 — 내부 패딩·면·라운드 (높이는 아이콘+패딩이 정한다) */
4786
+ tile: "p-(--cmp-chatAttachedFile-icon-wrapper-padding) rounded-(--cmp-chatAttachedFile-icon-wrapper-radius) bg-(--cmp-chatAttachedFile-icon-wrapper-bg)",
4787
+ /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
4788
+ iconSize: 16,
4789
+ /** 파일명 타이포 프리셋 */
4790
+ nameTypo: "typo-body-sm-default",
4791
+ /** 파일명 텍스트색 */
4792
+ textColor: "text-(--cmp-chatAttachedFile-filename-color)"
4793
+ };
4794
+ var SChatAttachedFileImpl = /* @__PURE__ */ react.forwardRef(
4795
+ function SChatAttachedFile({ name, onRemove, className, ...rest }, ref) {
4796
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4797
+ "div",
4798
+ {
4799
+ ref,
4800
+ className: cn(
4801
+ "inline-flex max-w-full items-center border-solid",
4802
+ CHAT_ATTACHED_FILE_CONFIG.box,
4803
+ CHAT_ATTACHED_FILE_CONFIG.outerGap,
4804
+ className
4805
+ ),
4806
+ ...rest,
4807
+ children: [
4808
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("flex min-w-0 items-center", CHAT_ATTACHED_FILE_CONFIG.contentGap), children: [
4809
+ /* @__PURE__ */ jsxRuntime.jsx(
4810
+ "span",
4811
+ {
4812
+ className: cn(
4813
+ "inline-grid shrink-0 place-items-center text-(--sys-color-fg-accentLight)",
4814
+ CHAT_ATTACHED_FILE_CONFIG.tile
4815
+ ),
4816
+ children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "attachFile", color: "grey_65", size: CHAT_ATTACHED_FILE_CONFIG.iconSize })
4817
+ }
4818
+ ),
4819
+ /* @__PURE__ */ jsxRuntime.jsx(
4820
+ "span",
4821
+ {
4822
+ className: cn(
4823
+ "truncate",
4824
+ CHAT_ATTACHED_FILE_CONFIG.nameTypo,
4825
+ CHAT_ATTACHED_FILE_CONFIG.textColor
4826
+ ),
4827
+ children: name
4828
+ }
4829
+ )
4830
+ ] }),
4831
+ onRemove != null && /* @__PURE__ */ jsxRuntime.jsx(
4832
+ SGhostButton,
4833
+ {
4834
+ icon: "close",
4835
+ size: "xs",
4836
+ ariaLabel: `${name} \uC81C\uAC70`,
4837
+ onClick: onRemove,
4838
+ className: "shrink-0"
4839
+ }
4840
+ )
4841
+ ]
4842
+ }
4843
+ );
4844
+ }
4845
+ );
4846
+ var SChatAttachedFile2 = /* @__PURE__ */ withDisplayName(SChatAttachedFileImpl, "SChatAttachedFile");
4847
+
4848
+ // src/components/SChatFile/chatFile.config.ts
4849
+ var CHAT_FILE_CONFIG = {
4850
+ /** 바깥 상자 — 좌우 비대칭 여백·상하 여백·면·선·라운드 */
4851
+ box: "pl-(--cmp-chatFile-paddingLeft) pr-(--cmp-chatFile-paddingRight) py-(--cmp-chatFile-paddingY) rounded-(--cmp-chatFile-radius) border-(length:--cmp-chatFile-border-width) border-(--cmp-chatFile-border-color) bg-(--cmp-chatFile-bg-default)",
4852
+ /** 아이콘 칩 ↔ 파일명 간격 */
4853
+ contentGap: "gap-(--cmp-chatFile-gap)",
4854
+ /**
4855
+ * 클립 아이콘이 앉는 칩 — 내부 패딩·면·라운드 (높이는 아이콘+패딩이 정한다).
4856
+ *
4857
+ * hover 면은 상자가 아니라 여기에도 걸린다 — 카드가 어두워질 때 칩은 반대로 밝아져
4858
+ * 칩이 배경에 묻히지 않는다. 상자의 hover 를 따라가야 하므로 group-hover 로 받는다.
4859
+ *
4860
+ * **`--sys-color-bg-frame` 은 임시다.** 시안의 hover 칩 색(`#FFFFFF`)에 대응하는
4861
+ * 컴포넌트 토큰이 없다 — `component.chatMessage.chatFile.icon.wrapper.bg` 는 값이 하나뿐이라
4862
+ * hover 를 담지 못한다. 상자의 `bg.default` 가 참조하는 것과 같은 시스템 토큰으로 대신 걸어 둔다.
4863
+ * 디자인팀에 `icon.wrapper.bg.hover` 를 요청해 나오는 대로 갈아끼운다.
4864
+ */
4865
+ tile: "p-(--cmp-chatFile-icon-wrapper-padding) rounded-(--cmp-chatFile-icon-wrapper-radius) bg-(--cmp-chatFile-icon-wrapper-bg) group-hover/chat-file:bg-(--sys-color-bg-frame)",
4866
+ /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
4867
+ iconSize: 20,
4868
+ /** 파일명 타이포 프리셋 */
4869
+ nameTypo: "typo-body-md-bold",
4870
+ /** 파일명·부가정보 텍스트색 */
4871
+ textColor: "text-(--cmp-chatFile-text-color)",
4872
+ /**
4873
+ * 눌리는 모양 — 커서·hover 면·포커스 링. 보낸 파일은 언제나 열 수 있으므로 늘 붙는다
4874
+ * (`onFileClick` 이 필수다).
4875
+ *
4876
+ * 상자의 여백·면·선과 따로 두는 이유: 이건 상호작용을 드러내는 값이라 성격이 다르다.
4877
+ * 링은 `SExpansionItem`·`SStepper` 와 같은 accent outline.
4878
+ */
4879
+ interactive: "cursor-pointer hover:bg-(--cmp-chatFile-bg-hover) focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent)"
4880
+ };
4881
+ var SIZE_UNITS = ["B", "KB", "MB", "GB", "TB"];
4882
+ function formatFileSize(bytes) {
4883
+ if (!Number.isFinite(bytes) || bytes < 0) return "";
4884
+ let value = bytes;
4885
+ let unit = 0;
4886
+ while (value >= 1024 && unit < SIZE_UNITS.length - 1) {
4887
+ value /= 1024;
4888
+ unit += 1;
4889
+ }
4890
+ return unit === 0 ? `${Math.round(value)}${SIZE_UNITS[0]}` : `${value.toFixed(1)}${SIZE_UNITS[unit]}`;
4891
+ }
4892
+ function normalizeExtension(extension) {
4893
+ return extension.trim().replace(/^\.+/, "").toLowerCase();
4894
+ }
4895
+ function fileExtension(name) {
4896
+ const dot = name.lastIndexOf(".");
4897
+ return dot > 0 && dot < name.length - 1 ? name.slice(dot + 1).toLowerCase() : "";
4898
+ }
4899
+ var SChatFileImpl = /* @__PURE__ */ react.forwardRef(function SChatFile({ name, extension, size, onFileClick, className, ...rest }, ref) {
4900
+ const ext = extension != null ? normalizeExtension(extension) : fileExtension(name);
4901
+ const meta = [ext, size != null ? formatFileSize(size) : ""].filter(Boolean).join(" / ");
4902
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4903
+ "div",
4904
+ {
4905
+ ref,
4906
+ className: cn(
4907
+ // group/chat-file: 아이콘 칩이 상자의 hover 를 따라가야 해서 이름을 붙인다 (config.tile 참고)
4908
+ "group/chat-file inline-flex max-w-full items-center border-solid",
4909
+ CHAT_FILE_CONFIG.box,
4910
+ CHAT_FILE_CONFIG.contentGap,
4911
+ CHAT_FILE_CONFIG.interactive,
4912
+ className
4913
+ ),
4914
+ ...rest,
4915
+ role: "button",
4916
+ tabIndex: 0,
4917
+ onClick: (event) => {
4918
+ rest.onClick?.(event);
4919
+ onFileClick?.();
4920
+ },
4921
+ onKeyDown: (event) => {
4922
+ rest.onKeyDown?.(event);
4923
+ if (event.key !== "Enter" && event.key !== " ") return;
4924
+ event.preventDefault();
4925
+ onFileClick?.();
4926
+ },
4927
+ children: [
4928
+ /* @__PURE__ */ jsxRuntime.jsx(
4929
+ "span",
4930
+ {
4931
+ className: cn(
4932
+ "inline-grid shrink-0 place-items-center text-(--sys-color-fg-accentLight)",
4933
+ CHAT_FILE_CONFIG.tile
4934
+ ),
4935
+ children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "attachFile", size: CHAT_FILE_CONFIG.iconSize })
4936
+ }
4937
+ ),
4938
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
4939
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("truncate", CHAT_FILE_CONFIG.nameTypo, CHAT_FILE_CONFIG.textColor), children: name }),
4940
+ meta !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("typo-body-xs-default truncate", CHAT_FILE_CONFIG.textColor), children: meta })
4941
+ ] })
4942
+ ]
4943
+ }
4944
+ );
4945
+ });
4946
+ var SChatFile2 = /* @__PURE__ */ withDisplayName(SChatFileImpl, "SChatFile");
4754
4947
  var CHAT_MESSAGE_DIRECTIONS = ["incoming", "outgoing"];
4755
4948
  var CHAT_MESSAGE_VARIANTS = ["default", "template"];
4756
4949
  var BUBBLE_SURFACE = {
4757
- incoming: "bg-(--sys-color-bg-screen) text-(--sys-color-fg-primary)",
4758
- outgoing: "bg-(--sys-color-bg-brand) text-(--sys-color-fg-inverse)",
4759
- template: "bg-(--sys-color-bg-accentFaint) text-(--sys-color-fg-deep)"
4950
+ incoming: "bg-(--cmp-chatBubble-incoming-bg) text-(--cmp-chatBubble-incoming-content)",
4951
+ outgoing: "bg-(--cmp-chatBubble-outgoing-bg) text-(--cmp-chatBubble-outgoing-content)",
4952
+ template: "bg-(--cmp-chatBubble-templete-bg) text-(--cmp-chatBubble-templete-content)"
4760
4953
  };
4761
4954
  var CHAT_MESSAGE_READ_STATUSES = ["read", "unread"];
4762
4955
  var READ_STATUS_LABEL = {
@@ -4764,8 +4957,8 @@ var READ_STATUS_LABEL = {
4764
4957
  unread: "\uC548 \uC77D\uC74C"
4765
4958
  };
4766
4959
  var READ_STATUS_COLOR = {
4767
- read: "text-(--sys-color-fg-tertiary)",
4768
- unread: "text-(--sys-color-fg-warning)"
4960
+ read: "text-(--cmp-chatTimeStamp-color)",
4961
+ unread: "text-(--cmp-chatReadMark-color)"
4769
4962
  };
4770
4963
  var AVATAR_SIZE = 32;
4771
4964
  var AVATAR_ROW_HEIGHT = 40;
@@ -4777,7 +4970,7 @@ function Avatar({ src, alt, placeholder }) {
4777
4970
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", style: { height: AVATAR_ROW_HEIGHT }, children: /* @__PURE__ */ jsxRuntime.jsx(
4778
4971
  "div",
4779
4972
  {
4780
- className: "relative overflow-hidden rounded-full bg-(--sys-color-bg-screen)",
4973
+ className: "relative overflow-hidden rounded-(--cmp-chatAvatar-radius) bg-(--cmp-chatAvatar-bg)",
4781
4974
  style: { width: AVATAR_SIZE, height: AVATAR_SIZE },
4782
4975
  children: src != null ? /* @__PURE__ */ jsxRuntime.jsx(SImage, { src, alt: alt ?? "", fit: "cover", className: "h-full w-full" }) : (
4783
4976
  // 원 밖으로 나가는 만큼을 좌우로 나눠 가운데를 맞추고, 아래는 원이 자른다.
@@ -4786,7 +4979,7 @@ function Avatar({ src, alt, placeholder }) {
4786
4979
  {
4787
4980
  name: "user",
4788
4981
  size: AVATAR_ICON_SIZE,
4789
- color: "var(--sys-color-fg-quaternary)",
4982
+ color: "var(--cmp-chatAvatar-icon)",
4790
4983
  className: "absolute top-0",
4791
4984
  style: { left: (AVATAR_SIZE - AVATAR_ICON_SIZE) / 2 }
4792
4985
  }
@@ -4806,12 +4999,14 @@ var SChatMessageImpl = /* @__PURE__ */ react.forwardRef(function SChatMessage({
4806
4999
  variant = "default",
4807
5000
  actions,
4808
5001
  messages,
5002
+ attachments,
4809
5003
  className,
4810
5004
  ...rest
4811
5005
  }, ref) {
4812
5006
  const outgoing = direction === "outgoing";
4813
- const surface = variant === "template" ? "template" : direction;
5007
+ const surface = direction === "outgoing" && variant === "template" ? "template" : direction;
4814
5008
  const bubbles = messages ?? [];
5009
+ const files = attachments ?? [];
4815
5010
  return /* @__PURE__ */ jsxRuntime.jsxs(
4816
5011
  "div",
4817
5012
  {
@@ -4819,50 +5014,112 @@ var SChatMessageImpl = /* @__PURE__ */ react.forwardRef(function SChatMessage({
4819
5014
  className: cn(
4820
5015
  // 아바타와 본문 열이 같은 줄에 서고, 보낸 메시지는 좌우를 뒤집는다.
4821
5016
  // items-start 라 이름이 있든 없든 아바타는 언제나 첫 줄에 붙는다.
4822
- "flex items-start gap-sd-12",
5017
+ "flex items-start gap-(--cmp-chatMessage-avatarGap)",
4823
5018
  outgoing && "flex-row-reverse",
4824
5019
  className
4825
5020
  ),
4826
5021
  ...rest,
4827
5022
  children: [
4828
5023
  !outgoing && /* @__PURE__ */ jsxRuntime.jsx(Avatar, { src: avatarSrc, alt: avatarAlt, placeholder: continued }),
4829
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex min-w-0 flex-col gap-sd-4", outgoing ? "items-end" : "items-start"), children: [
4830
- !outgoing && !continued && sender != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-default px-sd-8 text-(--sys-color-fg-secondary)", children: sender }),
4831
- bubbles.length > 0 && // 말풍선끼리는 이름·시각과의 간격(4px)보다 벌려 한 덩어리 안의 여러 발화로 읽히게 한다.
4832
- /* @__PURE__ */ jsxRuntime.jsx(
4833
- "div",
4834
- {
4835
- className: cn("flex min-w-0 flex-col gap-sd-8", outgoing ? "items-end" : "items-start"),
4836
- children: bubbles.map((message, index) => /* @__PURE__ */ jsxRuntime.jsx(
5024
+ /* @__PURE__ */ jsxRuntime.jsxs(
5025
+ "div",
5026
+ {
5027
+ className: cn(
5028
+ "flex min-w-0 flex-col gap-(--cmp-chatMessage-contents-gap)",
5029
+ outgoing ? "items-end" : "items-start"
5030
+ ),
5031
+ children: [
5032
+ !outgoing && !continued && sender != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-bold px-(--cmp-chatMessage-name-paddingX) text-(--cmp-chatMessage-name-color)", children: sender }),
5033
+ bubbles.length > 0 && // 말풍선끼리는 이름·시각과의 간격(4px)보다 벌려 한 덩어리 안의 여러 발화로 읽히게 한다.
5034
+ /* @__PURE__ */ jsxRuntime.jsx(
4837
5035
  "div",
4838
5036
  {
4839
5037
  className: cn(
4840
- // 라운드 12px 은 대응 토큰이 없어 값으로 둔다 (디자인팀 토큰 추가 요청 대상).
4841
- "typo-body-md-default max-w-full rounded-[12px] px-sd-16 py-sd-8",
4842
- // 한글은 기본 규칙으로 두면 어절 한가운데서도 줄이 바뀐다 — 띄어쓰기에서만 끊고,
4843
- // 끊을 자리가 없는 긴 토큰(URL·주문번호)만 흘려보낸다.
4844
- "break-keep wrap-break-word",
4845
- BUBBLE_SURFACE[surface]
5038
+ "flex min-w-0 flex-col gap-(--cmp-chatMessage-group-bubble-gap)",
5039
+ outgoing ? "items-end" : "items-start"
4846
5040
  ),
4847
- children: message
4848
- },
4849
- index
4850
- ))
4851
- }
4852
- ),
4853
- (readStatus != null || time != null) && // 읽음 표시와 시각은 한 줄에 선다 — 읽음이 먼저, 시각이 뒤다.
4854
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "typo-body-sm-default flex items-center gap-sd-4 px-sd-8", children: [
4855
- readStatus != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: READ_STATUS_COLOR[readStatus], children: READ_STATUS_LABEL[readStatus] }),
4856
- time != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-(--sys-color-fg-tertiary)", children: time })
4857
- ] }),
4858
- actions != null && // 버튼이 많아 한 줄에 안 들어가면 감싼다 — 넘쳐서 잘리는 것보다 낫다.
4859
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-wrap gap-sd-8 px-sd-8", outgoing && "justify-end"), children: actions })
4860
- ] })
5041
+ children: bubbles.map((message, index) => /* @__PURE__ */ jsxRuntime.jsx(
5042
+ "div",
5043
+ {
5044
+ className: cn(
5045
+ "typo-body-md-medium max-w-full rounded-(--cmp-chatBubble-radius) px-(--cmp-chatBubble-paddingX) py-(--cmp-chatBubble-paddingY)",
5046
+ // 한글은 기본 규칙으로 두면 어절 한가운데서도 줄이 바뀐다 — 띄어쓰기에서만 끊고,
5047
+ // 끊을 자리가 없는 긴 토큰(URL·주문번호)만 흘려보낸다.
5048
+ "break-keep wrap-break-word",
5049
+ BUBBLE_SURFACE[surface]
5050
+ ),
5051
+ children: message
5052
+ },
5053
+ index
5054
+ ))
5055
+ }
5056
+ ),
5057
+ files.length > 0 && // 파일 칸끼리는 말풍선과 같은 간격으로 벌린다 — 한 덩어리 안의 여러 발화로 읽힌다.
5058
+ // 말풍선과 달리 면으로 감싸지 않는다 (`attachments` 주석 참고).
5059
+ /* @__PURE__ */ jsxRuntime.jsx(
5060
+ "div",
5061
+ {
5062
+ className: cn(
5063
+ "flex min-w-0 flex-col gap-(--cmp-chatMessage-group-bubble-gap)",
5064
+ outgoing ? "items-end" : "items-start"
5065
+ ),
5066
+ children: files.map((file, index) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-full", children: file }, index))
5067
+ }
5068
+ ),
5069
+ (readStatus != null || time != null) && // 읽음 표시와 시각은 한 줄에 선다 — 읽음이 먼저, 시각이 뒤다.
5070
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-(--cmp-chatMessage-subData-gap) px-(--cmp-chatMessage-subData-paddingX)", children: [
5071
+ readStatus != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("typo-body-sm-bold", READ_STATUS_COLOR[readStatus]), children: READ_STATUS_LABEL[readStatus] }),
5072
+ time != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-medium text-(--cmp-chatTimeStamp-color)", children: time })
5073
+ ] }),
5074
+ actions != null && // 버튼이 많아 한 줄에 안 들어가면 감싼다 — 넘쳐서 잘리는 것보다 낫다.
5075
+ /* @__PURE__ */ jsxRuntime.jsx(
5076
+ "div",
5077
+ {
5078
+ className: cn(
5079
+ "flex flex-wrap gap-sd-8 px-(--cmp-chatMessage-bottomButtons-paddingX)",
5080
+ outgoing && "justify-end"
5081
+ ),
5082
+ children: actions
5083
+ }
5084
+ )
5085
+ ]
5086
+ }
5087
+ )
4861
5088
  ]
4862
5089
  }
4863
5090
  );
4864
5091
  });
4865
5092
  var SChatMessage2 = /* @__PURE__ */ withDisplayName(SChatMessageImpl, "SChatMessage");
5093
+ var SChatSystemMessageImpl = /* @__PURE__ */ react.forwardRef(
5094
+ function SChatSystemMessage({ message, className, ...rest }, ref) {
5095
+ const notices = message ?? [];
5096
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("flex flex-col items-center gap-sd-8", className), ...rest, children: notices.map((notice, i) => (
5097
+ // 알약은 문구 길이만큼만 차지하고, 길면 줄바꿈해 여러 줄로 선다.
5098
+ // 안내는 HTML 문자열을 허용하되 sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어)
5099
+ /* @__PURE__ */ jsxRuntime.jsx(
5100
+ "span",
5101
+ {
5102
+ className: cn(
5103
+ // 라운드는 말풍선과 같은 토큰을 쓴다 — 여러 줄이 돼도 모서리가 상자 높이를 따라
5104
+ // 부풀지 않는다. 제 몫인 chatSystemMessage.radius 는 pill(9999px)이라 쓰지 않는다.
5105
+ // 두 줄부터 좌우가 커다란 반원이 되어 첫 글자가 안으로 밀리기 때문이다.
5106
+ "inline-flex max-w-full rounded-(--cmp-chatBubble-radius) border",
5107
+ "border-(--cmp-chatSystemMessage-border-color) bg-(--cmp-chatSystemMessage-bg)",
5108
+ "typo-body-sm-medium text-(--cmp-chatSystemMessage-color)",
5109
+ "px-(--cmp-chatSystemMessage-paddingX) py-(--cmp-chatSystemMessage-paddingY) text-center",
5110
+ // 한글은 기본 규칙으로 두면 어절 한가운데서도 줄이 바뀐다 — 띄어쓰기에서만 끊고,
5111
+ // 끊을 자리가 없는 긴 토큰(URL·주문번호)만 흘려보낸다 (SChatMessage 말풍선과 같은 규칙).
5112
+ // 가운데 정렬이라 마지막 줄에 한 단어만 남으면 특히 눈에 띄므로 text-pretty 로 줄을 고른다.
5113
+ "break-keep wrap-break-word text-pretty"
5114
+ ),
5115
+ dangerouslySetInnerHTML: { __html: sanitizeInlineHtml(notice) }
5116
+ },
5117
+ i
5118
+ )
5119
+ )) });
5120
+ }
5121
+ );
5122
+ var SChatSystemMessage2 = /* @__PURE__ */ withDisplayName(SChatSystemMessageImpl, "SChatSystemMessage");
4866
5123
 
4867
5124
  // src/lib/z-index.ts
4868
5125
  var Z_INDEX = {
@@ -5818,7 +6075,11 @@ var SExpansionItem = /* @__PURE__ */ react.forwardRef(
5818
6075
  depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
5819
6076
  isExpanded && cn(
5820
6077
  "text-(--cmp-listExpansionItem-title-text-expanded)",
5821
- isSelected && "bg-(--cmp-listExpansionItem-title-bg-expanded)"
6078
+ // 펼침 배경(파랑)은 bordered 일 때만. 카드처럼 테두리로 경계가 잡힌
6079
+ // 아이템에서만 배경이 선택 상태를 나타낸다.
6080
+ // 테두리 없는 리스트에서는 accentStripe 가 그 역할을 하므로,
6081
+ // 배경까지 깔면 항목 경계가 없는 목록에서 선택 표시가 두 겹이 된다.
6082
+ isSelected && bordered && "bg-(--cmp-listExpansionItem-title-bg-expanded)"
5822
6083
  )
5823
6084
  ),
5824
6085
  children: [
@@ -6170,10 +6431,21 @@ function SCheckbox({
6170
6431
  ) })
6171
6432
  }
6172
6433
  ),
6173
- label && // 고스트(500) 텍스트로 너비를 고정 → 두께 400↔500 전환 시 레이아웃이 밀리지 않음
6174
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "grid text-nowrap text-[12px] leading-[20px]", style: { color: labelColor }, children: [
6175
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "invisible font-medium", style: { gridArea: "1 / 1" }, children: label }),
6176
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { gridArea: "1 / 1", fontWeight: isChecked ? 500 : 400 }, children: label })
6434
+ label && // 고스트(500) 텍스트로 너비를 고정 → 두께 400↔500 전환 시 레이아웃이 밀리지 않음.
6435
+ // 한글은 기본 규칙으로 두면 어절 한가운데서도 줄이 바뀐다. 그러면 min-content 가 한 글자가
6436
+ // 되어, flex 아이템을 지켜 주는 min-width:auto 가 무력해지고 폭이 남는데도 라벨부터
6437
+ // 찌그러진다 — 띄어쓰기에서만 끊고, 끊을 자리가 없는 긴 토큰만 흘려보낸다
6438
+ // (SRadio·SSwitch 라벨과 같은 규칙). 두 사본에 함께 걸려야 하므로 바깥 grid 에 준다.
6439
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "grid break-keep wrap-break-word", style: { color: labelColor }, children: [
6440
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "typo-body-sm-medium invisible", style: { gridArea: "1 / 1" }, children: label }),
6441
+ /* @__PURE__ */ jsxRuntime.jsx(
6442
+ "span",
6443
+ {
6444
+ className: isChecked ? "typo-body-sm-medium" : "typo-body-sm-default",
6445
+ style: { gridArea: "1 / 1" },
6446
+ children: label
6447
+ }
6448
+ )
6177
6449
  ] })
6178
6450
  ]
6179
6451
  }
@@ -7627,7 +7899,7 @@ function SSwitch({
7627
7899
  style
7628
7900
  }) {
7629
7901
  const right = rightLabel;
7630
- const renderLabel = (text) => text ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] font-medium leading-[20px]", children: text }) : null;
7902
+ const renderLabel = (text) => text ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-medium break-keep wrap-break-word", children: text }) : null;
7631
7903
  const trackBg = disabled ? value ? "var(--cmp-switch-bg-disabled-on)" : "var(--cmp-switch-bg-disabled-off)" : value ? "var(--cmp-switch-bg-on)" : "var(--cmp-switch-bg-off)";
7632
7904
  return /* @__PURE__ */ jsxRuntime.jsxs(
7633
7905
  "label",
@@ -10636,11 +10908,15 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
10636
10908
  ...style
10637
10909
  };
10638
10910
  const hideAfterSlide = (hidden) => `visibility 0s linear ${hidden ? `${GNB_FOLD_MS}ms` : "0s"}`;
10639
- const sideFoldStyle = {
10640
- opacity: railFolded ? 0 : 1,
10641
- position: railFolded ? "absolute" : "static",
10642
- visibility: railFolded ? "hidden" : "visible",
10643
- transition: `opacity ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(railFolded)}`
10911
+ const sideFoldStyle = railFolded ? {
10912
+ opacity: 0,
10913
+ position: "absolute",
10914
+ visibility: "hidden",
10915
+ transition: `opacity ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(true)}`
10916
+ } : {
10917
+ opacity: 1,
10918
+ visibility: "visible",
10919
+ transition: `opacity ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(false)}`
10644
10920
  };
10645
10921
  const launcherButton = onLauncherClick ? /* @__PURE__ */ jsxRuntime.jsx(
10646
10922
  SGhostButton,
@@ -11630,7 +11906,7 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
11630
11906
  // plain 에는 전용 배경 토큰이 없어 시스템 흰 표면을 쓴다(토큰이 생기면 그것으로 갈아끼운다).
11631
11907
  bar ? "h-(--cmp-pageHeader-bar-height) border-b border-(--cmp-pageHeader-bar-border) bg-(--cmp-pageHeader-bar-bg) py-(--cmp-pageHeader-bar-paddingY)" : cn(
11632
11908
  // 스크롤되면 그림자를 더해 콘텐츠 위에 뜬 것처럼 보이게 한다.
11633
- "bg-(--sys-color-bg-frame) pt-(--cmp-pageHeader-plain-paddingTop) pb-(--cmp-pageHeader-plain-paddingBottom)",
11909
+ "bg-(--sys-color-bg-frame) py-(--cmp-pageHeader-plain-paddingY)",
11634
11910
  isScrolled && "shadow-floating"
11635
11911
  ),
11636
11912
  className
@@ -11640,7 +11916,10 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
11640
11916
  children: /* @__PURE__ */ jsxRuntime.jsxs(
11641
11917
  "div",
11642
11918
  {
11643
- className: "flex min-w-0 flex-1 items-center gap-(--cmp-pageHeader-gap)",
11919
+ className: cn(
11920
+ "flex min-w-0 flex-1 gap-(--cmp-pageHeader-gap)",
11921
+ bar ? "items-center" : "items-start"
11922
+ ),
11644
11923
  style: rowStyle,
11645
11924
  children: [
11646
11925
  hasBack && /* @__PURE__ */ jsxRuntime.jsx(
@@ -11650,7 +11929,7 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
11650
11929
  size: "xs",
11651
11930
  ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
11652
11931
  onClick: onBack,
11653
- className: "shrink-0"
11932
+ className: cn("shrink-0", bar ? "" : "mt-[3px]")
11654
11933
  }
11655
11934
  ),
11656
11935
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -15783,7 +16062,7 @@ function SRadio({
15783
16062
  label && /* @__PURE__ */ jsxRuntime.jsxs(
15784
16063
  "span",
15785
16064
  {
15786
- className: "grid",
16065
+ className: "grid break-keep wrap-break-word",
15787
16066
  style: {
15788
16067
  color: disabled ? "var(--cmp-radio-label-disabled)" : "var(--cmp-radio-label-default)"
15789
16068
  },
@@ -23420,6 +23699,8 @@ exports.CALENDAR_BOARD_DAY_COLORS = CALENDAR_BOARD_DAY_COLORS;
23420
23699
  exports.CALENDAR_BOARD_EVENT_COLORS = CALENDAR_BOARD_EVENT_COLORS;
23421
23700
  exports.CALENDAR_BOARD_EVENT_PRESETS = CALENDAR_BOARD_EVENT_PRESETS;
23422
23701
  exports.CALENDAR_BOARD_MAX_VISIBLE_EVENTS = CALENDAR_BOARD_MAX_VISIBLE_EVENTS;
23702
+ exports.CHAT_ATTACHED_FILE_CONFIG = CHAT_ATTACHED_FILE_CONFIG;
23703
+ exports.CHAT_FILE_CONFIG = CHAT_FILE_CONFIG;
23423
23704
  exports.CHAT_MESSAGE_DIRECTIONS = CHAT_MESSAGE_DIRECTIONS;
23424
23705
  exports.CHAT_MESSAGE_READ_STATUSES = CHAT_MESSAGE_READ_STATUSES;
23425
23706
  exports.CHAT_MESSAGE_VARIANTS = CHAT_MESSAGE_VARIANTS;
@@ -23456,8 +23737,11 @@ exports.SCalendar = SCalendar;
23456
23737
  exports.SCalendarBoard = SCalendarBoard;
23457
23738
  exports.SCallout = SCallout;
23458
23739
  exports.SCard = SCard;
23740
+ exports.SChatAttachedFile = SChatAttachedFile2;
23741
+ exports.SChatFile = SChatFile2;
23459
23742
  exports.SChatInput = SChatInput2;
23460
23743
  exports.SChatMessage = SChatMessage2;
23744
+ exports.SChatSystemMessage = SChatSystemMessage2;
23461
23745
  exports.SCheckbox = SCheckbox;
23462
23746
  exports.SChip = SChip2;
23463
23747
  exports.SChipFilter = SChipFilter;
@@ -23554,11 +23838,14 @@ exports.TIMEPICKER_SIZE_CONFIG = TIMEPICKER_SIZE_CONFIG;
23554
23838
  exports.buttonPreset = buttonPreset;
23555
23839
  exports.cn = cn;
23556
23840
  exports.fieldWidthValue = fieldWidthValue;
23841
+ exports.fileExtension = fileExtension;
23557
23842
  exports.findGnbAncestors = findGnbAncestors;
23558
23843
  exports.findGnbRailValue = findGnbRailValue;
23844
+ exports.formatFileSize = formatFileSize;
23559
23845
  exports.isColorKey = isColorKey;
23560
23846
  exports.isFieldWidthGrade = isFieldWidthGrade;
23561
23847
  exports.loading = loading;
23848
+ exports.normalizeExtension = normalizeExtension;
23562
23849
  exports.resolveColor = resolveColor;
23563
23850
  exports.useSLayout = useSLayout;
23564
23851
  //# sourceMappingURL=index.cjs.map