sellmate-design-system-react 7.1.0 → 8.1.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 (38) hide show
  1. package/AGENTS.md +412 -18
  2. package/README.md +16 -1
  3. package/dist/components/SDraggableItem/README.md +1 -0
  4. package/dist/components/SDraggableItem/SDraggableItem.d.ts +3 -0
  5. package/dist/components/SDrawer/README.md +5 -4
  6. package/dist/components/SDrawer/SDrawer.d.ts +16 -5
  7. package/dist/components/SExpansionItem/README.md +1 -0
  8. package/dist/components/SExpansionItem/SExpansionItem.d.ts +3 -0
  9. package/dist/components/SGnb/README.md +7 -0
  10. package/dist/components/SGnb/SGnb.d.ts +27 -0
  11. package/dist/components/SGnb/gnb.config.d.ts +13 -0
  12. package/dist/components/SIcon/SIcon.d.ts +1 -1
  13. package/dist/components/SIcon/icons.gen.d.ts +8 -3
  14. package/dist/components/SLayout/SLayout.d.ts +6 -0
  15. package/dist/components/SListItem/README.md +1 -0
  16. package/dist/components/SListItem/SListItem.d.ts +3 -0
  17. package/dist/components/SModal/README.md +41 -6
  18. package/dist/components/SModal/SModalOutlet.d.ts +18 -0
  19. package/dist/components/SModal/index.d.ts +1 -0
  20. package/dist/components/SSplitter/README.md +27 -0
  21. package/dist/components/SSplitter/SSplitter.d.ts +32 -0
  22. package/dist/components/SSplitter/index.d.ts +2 -0
  23. package/dist/components/SSplitter/splitter.config.d.ts +15 -0
  24. package/dist/components/STooltip/README.md +2 -0
  25. package/dist/index.cjs +1034 -221
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.js +1033 -223
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/autofill.d.ts +29 -0
  31. package/dist/lib/is-dev.d.ts +2 -0
  32. package/dist/lib/modal-outlet.d.ts +53 -0
  33. package/dist/llms-full.txt +502 -28
  34. package/dist/llms.txt +418 -20
  35. package/dist/styles.css +154 -17
  36. package/dist/theme.css +40 -10
  37. package/eslint/scale.gen.mjs +1 -1
  38. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { clsx } from 'clsx';
3
3
  import { extendTailwindMerge } from 'tailwind-merge';
4
- import { forwardRef, useState, useRef, useEffect, createContext, useContext, useCallback, useMemo, useId, Children, cloneElement, useImperativeHandle, useLayoutEffect, Fragment as Fragment$1, isValidElement, useSyncExternalStore } from 'react';
4
+ import { forwardRef, useState, useRef, useEffect, createContext, useContext, useCallback, useMemo, useId, Children, cloneElement, useImperativeHandle, useLayoutEffect, Fragment as Fragment$1, isValidElement, useSyncExternalStore, Component } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import { createPortal } from 'react-dom';
7
7
  import * as RCheckbox from '@radix-ui/react-checkbox';
@@ -438,6 +438,27 @@ var Icon_arrowUp = (p) => {
438
438
  }
439
439
  );
440
440
  };
441
+ var Icon_asterisk = (p) => {
442
+ const { size = 24, ...rest } = p;
443
+ return /* @__PURE__ */ jsx(
444
+ "svg",
445
+ {
446
+ width: size,
447
+ height: size,
448
+ viewBox: "0 0 24 24",
449
+ fill: "none",
450
+ xmlns: "http://www.w3.org/2000/svg",
451
+ ...rest,
452
+ children: /* @__PURE__ */ jsx(
453
+ "path",
454
+ {
455
+ d: "M12.1736 2.91895C12.3072 2.91895 12.4174 3.02382 12.4236 3.15723L12.7644 10.6738L19.4461 7.21191C19.5647 7.15042 19.7112 7.19288 19.7781 7.30859L19.9519 7.61035C20.0184 7.72598 19.9822 7.87332 19.8699 7.94531L13.53 11.999L19.8699 16.0547C19.9822 16.1267 20.0184 16.274 19.9519 16.3896L19.7781 16.6914C19.7113 16.8071 19.5647 16.8496 19.4461 16.7881L12.7654 13.3252L12.4236 20.8428C12.4174 20.9762 12.3072 21.0811 12.1736 21.0811H11.8259C11.6925 21.0809 11.5831 20.9761 11.5769 20.8428L11.2341 13.3252L4.55445 16.7881C4.43582 16.8496 4.28927 16.8071 4.22242 16.6914L4.04859 16.3896C3.98202 16.2739 4.01814 16.1266 4.13063 16.0547L10.4695 12L4.13063 7.94531C4.01813 7.87336 3.98201 7.72606 4.04859 7.61035L4.22242 7.30859C4.28928 7.19292 4.43582 7.15043 4.55445 7.21191L11.2341 10.6738L11.5769 3.15723C11.5831 3.02392 11.6925 2.91909 11.8259 2.91895H12.1736Z",
456
+ fill: "currentColor"
457
+ }
458
+ )
459
+ }
460
+ );
461
+ };
441
462
  var Icon_attachFile = (p) => {
442
463
  const { size = 24, ...rest } = p;
443
464
  return /* @__PURE__ */ jsx(
@@ -519,7 +540,7 @@ var Icon_barcode = (p) => {
519
540
  };
520
541
  var Icon_bell = (p) => {
521
542
  const { size = 24, ...rest } = p;
522
- return /* @__PURE__ */ jsxs(
543
+ return /* @__PURE__ */ jsx(
523
544
  "svg",
524
545
  {
525
546
  width: size,
@@ -528,22 +549,15 @@ var Icon_bell = (p) => {
528
549
  fill: "none",
529
550
  xmlns: "http://www.w3.org/2000/svg",
530
551
  ...rest,
531
- children: [
532
- /* @__PURE__ */ jsx(
533
- "path",
534
- {
535
- d: "M14.8 18.8086C14.9105 18.8086 15.0008 18.8985 14.9944 19.0088C14.8972 20.6781 13.5938 22 12.0002 22C10.4066 22 9.10324 20.6781 9.00609 19.0088C8.99968 18.8985 9.08997 18.8086 9.20043 18.8086H14.8Z",
536
- fill: "currentColor"
537
- }
538
- ),
539
- /* @__PURE__ */ jsx(
540
- "path",
541
- {
542
- d: "M12.0002 2C12.5525 2.00002 13.0002 2.44772 13.0002 3V4.20898C15.9941 4.69573 18.2815 7.3314 18.2815 10.5107V14.1582C18.2815 15.0811 19.1207 15.8005 19.7629 16.4531C20.4046 17.1057 19.6388 17.957 18.7307 17.957H5.26976C4.36161 17.957 3.59581 17.1057 4.23754 16.4531C4.87979 15.8005 5.71898 15.0811 5.71898 14.1582V10.5107C5.71898 7.33139 8.00632 4.69572 11.0002 4.20898V3C11.0002 2.44772 11.4479 2 12.0002 2Z",
543
- fill: "currentColor"
544
- }
545
- )
546
- ]
552
+ children: /* @__PURE__ */ jsx(
553
+ "path",
554
+ {
555
+ fillRule: "evenodd",
556
+ clipRule: "evenodd",
557
+ d: "M11.9997 2C12.8281 2 13.4997 2.67157 13.4997 3.5V4.16504C16.4633 4.82344 18.6734 7.38936 18.6735 10.4561V14.1465L18.6843 14.3301C18.7846 15.2926 19.607 16.8595 20.2468 17.4785C20.9292 18.1386 20.1161 19 19.1511 19H14.9938C14.9938 19.0028 14.994 19.0059 14.9938 19.0088C14.8967 20.6781 13.5933 22 11.9997 22C10.4062 21.9998 9.10269 20.678 9.00556 19.0088C9.00539 19.0059 9.00559 19.0028 9.00556 19H4.84833L4.66962 18.9902C3.78764 18.8932 3.11313 18.0974 3.75263 17.4785C4.39237 16.8596 5.21478 15.2927 5.31513 14.3301L5.32587 14.1465V10.4561C5.32596 7.38957 7.53635 4.82365 10.4997 4.16504V3.5C10.4997 2.67167 11.1714 2.00016 11.9997 2ZM11.9997 5.5C9.0949 5.50016 6.82597 7.76554 6.82587 10.4561V14.1465C6.82577 14.9672 6.47479 15.89 6.14423 16.5703C5.99522 16.8769 5.81805 17.1956 5.6247 17.5H18.3747C18.1813 17.1956 18.0042 16.8769 17.8552 16.5703C17.5246 15.89 17.1736 14.9671 17.1735 14.1465V10.4561C17.1734 7.76545 14.9046 5.5 11.9997 5.5Z",
558
+ fill: "currentColor"
559
+ }
560
+ )
547
561
  }
548
562
  );
549
563
  };
@@ -1627,28 +1641,7 @@ var Icon_history = (p) => {
1627
1641
  }
1628
1642
  );
1629
1643
  };
1630
- var Icon_imageFill = (p) => {
1631
- const { size = 24, ...rest } = p;
1632
- return /* @__PURE__ */ jsx(
1633
- "svg",
1634
- {
1635
- width: size,
1636
- height: size,
1637
- viewBox: "0 0 24 24",
1638
- fill: "none",
1639
- xmlns: "http://www.w3.org/2000/svg",
1640
- ...rest,
1641
- children: /* @__PURE__ */ jsx(
1642
- "path",
1643
- {
1644
- d: "M7.34277 10.165C7.43716 10.078 7.58268 10.0769 7.67871 10.1621L15.3535 16.9844C16.0043 17.5629 16.9817 17.575 17.6465 17.0127L22 13.3281V20C22 21.1046 21.1046 22 20 22H4C2.89543 22 2 21.1046 2 20V15.0967L7.34277 10.165ZM20 2C21.1046 2 22 2.89543 22 4V11.3633L16.6777 15.8672C16.5828 15.9475 16.4426 15.9459 16.3496 15.8633L8.67578 9.04102C8.00336 8.44333 6.98628 8.45327 6.3252 9.06348L2 13.0557V4C2 2.89543 2.89543 2 4 2H20ZM16.25 6C15.0074 6 14 7.00736 14 8.25C14 9.49264 15.0074 10.5 16.25 10.5C17.4926 10.5 18.5 9.49264 18.5 8.25C18.5 7.00736 17.4926 6 16.25 6Z",
1645
- fill: "currentColor"
1646
- }
1647
- )
1648
- }
1649
- );
1650
- };
1651
- var Icon_imageOutline = (p) => {
1644
+ var Icon_image = (p) => {
1652
1645
  const { size = 24, ...rest } = p;
1653
1646
  return /* @__PURE__ */ jsxs(
1654
1647
  "svg",
@@ -1665,7 +1658,7 @@ var Icon_imageOutline = (p) => {
1665
1658
  {
1666
1659
  fillRule: "evenodd",
1667
1660
  clipRule: "evenodd",
1668
- d: "M15.5 6.25C16.7426 6.25 17.75 7.25736 17.75 8.5C17.75 9.74264 16.7426 10.75 15.5 10.75C14.2574 10.75 13.25 9.74264 13.25 8.5C13.25 7.25736 14.2574 6.25 15.5 6.25ZM15.5 7.75C15.0858 7.75 14.75 8.08579 14.75 8.5C14.75 8.91421 15.0858 9.25 15.5 9.25C15.9142 9.25 16.25 8.91421 16.25 8.5C16.25 8.08579 15.9142 7.75 15.5 7.75Z",
1661
+ d: "M16 5.25C17.5188 5.25 18.75 6.48122 18.75 8C18.75 9.51878 17.5188 10.75 16 10.75C14.4812 10.75 13.25 9.51878 13.25 8C13.25 6.48122 14.4812 5.25 16 5.25ZM16 6.75C15.3096 6.75 14.75 7.30964 14.75 8C14.75 8.69036 15.3096 9.25 16 9.25C16.6904 9.25 17.25 8.69036 17.25 8C17.25 7.30964 16.6904 6.75 16 6.75Z",
1669
1662
  fill: "currentColor"
1670
1663
  }
1671
1664
  ),
@@ -1674,7 +1667,7 @@ var Icon_imageOutline = (p) => {
1674
1667
  {
1675
1668
  fillRule: "evenodd",
1676
1669
  clipRule: "evenodd",
1677
- d: "M19.2002 2.0498C20.7187 2.05002 21.9501 3.28123 21.9502 4.7998V19.2002C21.95 20.7187 20.7187 21.95 19.2002 21.9502H4.7998C3.28124 21.9501 2.05001 20.7187 2.0498 19.2002V4.7998C2.0499 3.28117 3.28117 2.0499 4.7998 2.0498H19.2002ZM7.66602 10.1514C7.57129 10.0672 7.42871 10.0672 7.33398 10.1514L3.5498 13.5137V19.2002C3.55001 19.8903 4.10966 20.4501 4.7998 20.4502H19.2002C19.8902 20.45 20.45 19.8902 20.4502 19.2002V14.877L17.6172 17.0811C16.9513 17.599 16.0104 17.5683 15.3799 17.0078L7.66602 10.1514ZM4.7998 3.5498C4.1096 3.5499 3.5499 4.10959 3.5498 4.7998V11.5078L6.33691 9.03027C6.99996 8.4409 8.00004 8.4409 8.66309 9.03027L16.377 15.8867C16.467 15.9666 16.6012 15.9714 16.6963 15.8975L20.4502 12.9766V4.7998C20.4501 4.10966 19.8903 3.55002 19.2002 3.5498H4.7998Z",
1670
+ d: "M19.2002 2.0498C20.7187 2.05002 21.9501 3.28123 21.9502 4.7998V19.2002C21.95 20.7187 20.7187 21.95 19.2002 21.9502H4.7998C3.28124 21.9501 2.05001 20.7187 2.0498 19.2002V4.7998C2.0499 3.28117 3.28116 2.0499 4.7998 2.0498H19.2002ZM4.7998 3.5498C4.10959 3.5499 3.5499 4.10959 3.5498 4.7998V11.8037L6.76465 8.70801C7.1683 8.31972 7.81224 8.33867 8.19238 8.75L14.9121 16.0293C15.2496 16.3947 15.8042 16.457 16.2139 16.1748L19.4326 13.9561C19.7591 13.731 20.1435 13.7318 20.4502 13.8867V4.7998C20.4501 4.10966 19.8903 3.55002 19.2002 3.5498H4.7998Z",
1678
1671
  fill: "currentColor"
1679
1672
  }
1680
1673
  )
@@ -1793,6 +1786,36 @@ var Icon_launcher = (p) => {
1793
1786
  }
1794
1787
  );
1795
1788
  };
1789
+ var Icon_leftRight = (p) => {
1790
+ const { size = 24, ...rest } = p;
1791
+ return /* @__PURE__ */ jsxs(
1792
+ "svg",
1793
+ {
1794
+ width: size,
1795
+ height: size,
1796
+ viewBox: "0 0 24 24",
1797
+ fill: "none",
1798
+ xmlns: "http://www.w3.org/2000/svg",
1799
+ ...rest,
1800
+ children: [
1801
+ /* @__PURE__ */ jsx(
1802
+ "path",
1803
+ {
1804
+ d: "M6.46594 12.5001C6.7421 12.1916 7.21587 12.1655 7.52454 12.4415C7.83288 12.7177 7.85911 13.1915 7.58313 13.5001L4.67688 16.7501H21.0001C21.4142 16.7502 21.7501 17.086 21.7501 17.5001C21.75 17.9142 21.4142 18.25 21.0001 18.2501H4.67688L7.58313 21.5001C7.859 21.8088 7.83295 22.2826 7.52454 22.5587C7.21592 22.8347 6.74212 22.8085 6.46594 22.5001L2.44153 18.0001C2.18693 17.7154 2.18693 17.2848 2.44153 17.0001L6.46594 12.5001Z",
1805
+ fill: "currentColor"
1806
+ }
1807
+ ),
1808
+ /* @__PURE__ */ jsx(
1809
+ "path",
1810
+ {
1811
+ d: "M16.4757 1.44153C16.7844 1.16552 17.2582 1.19163 17.5343 1.50013L21.5587 6.00013C21.8132 6.28481 21.8132 6.71549 21.5587 7.00013L17.5343 11.5001C17.2582 11.8086 16.7844 11.8346 16.4757 11.5587C16.1672 11.2826 16.1411 10.8088 16.4171 10.5001L19.3234 7.25013H3.00012C2.58596 7.25013 2.2502 6.91428 2.25012 6.50013C2.25012 6.08591 2.58591 5.75013 3.00012 5.75013H19.3234L16.4171 2.50013C16.1411 2.19146 16.1672 1.71769 16.4757 1.44153Z",
1812
+ fill: "currentColor"
1813
+ }
1814
+ )
1815
+ ]
1816
+ }
1817
+ );
1818
+ };
1796
1819
  var Icon_line = (p) => {
1797
1820
  const { size = 24, ...rest } = p;
1798
1821
  return /* @__PURE__ */ jsxs(
@@ -2411,6 +2434,27 @@ var Icon_search = (p) => {
2411
2434
  }
2412
2435
  );
2413
2436
  };
2437
+ var Icon_send = (p) => {
2438
+ const { size = 24, ...rest } = p;
2439
+ return /* @__PURE__ */ jsx(
2440
+ "svg",
2441
+ {
2442
+ width: size,
2443
+ height: size,
2444
+ viewBox: "0 0 24 24",
2445
+ fill: "none",
2446
+ xmlns: "http://www.w3.org/2000/svg",
2447
+ ...rest,
2448
+ children: /* @__PURE__ */ jsx(
2449
+ "path",
2450
+ {
2451
+ d: "M19.8551 3.15204C20.1245 3.06242 20.4219 3.13291 20.6226 3.33368C20.8233 3.53455 20.8931 3.83186 20.8033 4.10126L15.3209 20.5485C14.8017 22.1061 12.6164 22.1561 12.0269 20.6237L9.61191 14.3434L3.33261 11.9284C1.80035 11.3391 1.84967 9.15489 3.40683 8.63544L19.8551 3.15204ZM11.067 13.9479L13.4273 20.0847C13.5115 20.3036 13.8239 20.2964 13.898 20.0739L18.3756 6.64032L11.067 13.9479ZM3.88144 10.0583C3.65915 10.1325 3.65209 10.4437 3.8707 10.528L10.0064 12.8874L17.3141 5.58075L3.88144 10.0583Z",
2452
+ fill: "currentColor"
2453
+ }
2454
+ )
2455
+ }
2456
+ );
2457
+ };
2414
2458
  var Icon_setting = (p) => {
2415
2459
  const { size = 24, ...rest } = p;
2416
2460
  return /* @__PURE__ */ jsx(
@@ -2432,7 +2476,7 @@ var Icon_setting = (p) => {
2432
2476
  }
2433
2477
  );
2434
2478
  };
2435
- var Icon_shield = (p) => {
2479
+ var Icon_settingOutline = (p) => {
2436
2480
  const { size = 24, ...rest } = p;
2437
2481
  return /* @__PURE__ */ jsxs(
2438
2482
  "svg",
@@ -2447,7 +2491,9 @@ var Icon_shield = (p) => {
2447
2491
  /* @__PURE__ */ jsx(
2448
2492
  "path",
2449
2493
  {
2450
- d: "M16.2549 9.3486C16.5477 9.05582 17.0225 9.05602 17.3154 9.3486C17.6083 9.64149 17.6083 10.1163 17.3154 10.4091L12.0859 15.6386C11.6954 16.0291 11.0624 16.0291 10.6719 15.6386L7.46973 12.4365C7.17728 12.1436 7.17703 11.6687 7.46973 11.3759C7.76264 11.0833 8.23844 11.0831 8.53125 11.3759L11.3789 14.2246L16.2549 9.3486Z",
2494
+ fillRule: "evenodd",
2495
+ clipRule: "evenodd",
2496
+ d: "M11.9996 8C14.2087 8 15.9996 9.79086 15.9996 12C15.9996 14.2091 14.2087 16 11.9996 16C9.79065 15.9998 7.9996 14.209 7.9996 12C7.9996 9.791 9.79065 8.00022 11.9996 8ZM11.9996 9.5C10.6191 9.50022 9.4996 10.6194 9.4996 12C9.4996 13.3806 10.6191 14.4998 11.9996 14.5C13.3803 14.5 14.4996 13.3807 14.4996 12C14.4996 10.6193 13.3803 9.5 11.9996 9.5Z",
2451
2497
  fill: "currentColor"
2452
2498
  }
2453
2499
  ),
@@ -2456,7 +2502,7 @@ var Icon_shield = (p) => {
2456
2502
  {
2457
2503
  fillRule: "evenodd",
2458
2504
  clipRule: "evenodd",
2459
- d: "M11.501 1.4404C11.8718 1.27889 12.3024 1.30624 12.6533 1.52145L20.1533 6.12204C20.5238 6.34931 20.7499 6.75284 20.75 7.18747V10.5302C20.75 11.8881 20.6005 13.3051 20.0645 14.6425C19.5554 15.9124 18.7155 17.6378 17.4502 19.1894C16.1835 20.7426 14.4592 22.1581 12.1816 22.7275L12 22.7734L11.8184 22.7275C9.54076 22.1581 7.81646 20.7426 6.5498 19.1894C5.2845 17.6378 4.4446 15.9124 3.93555 14.6425C3.39949 13.3051 3.25 11.8881 3.25 10.5302V7.18747C3.25007 6.75284 3.47619 6.34931 3.84668 6.12204L11.3467 1.52145L11.501 1.4404ZM4.75 7.32712V10.5302C4.75 11.7887 4.89082 12.9929 5.32812 14.084C5.80497 15.2735 6.57635 16.8486 7.71191 18.2412C8.80911 19.5866 10.2182 20.7255 12 21.2216C13.7818 20.7255 15.1909 19.5866 16.2881 18.2412C17.4236 16.8486 18.195 15.2735 18.6719 14.084C19.1092 12.9929 19.25 11.7887 19.25 10.5302V7.32712L12 2.87985L4.75 7.32712Z",
2505
+ d: "M13.1851 1C13.5085 1 13.7979 1.20161 13.9068 1.50293L14.6832 3.65527C14.9613 3.72452 15.2006 3.79367 15.4029 3.86621C15.5134 3.90579 15.64 3.95628 15.7828 4.0166L16.2613 4.22949L18.0689 3.27246C18.2163 3.19438 18.3856 3.16661 18.5504 3.19238C18.7153 3.21835 18.8676 3.29735 18.984 3.41699L20.5748 5.06152C20.7859 5.28042 20.8459 5.60054 20.7271 5.87988L19.8785 7.86719C20.0192 8.12546 20.1316 8.34655 20.2174 8.53125C20.3097 8.73243 20.4239 9.01001 20.5601 9.36719L22.5377 10.2148L22.6432 10.2695C22.8771 10.4155 23.016 10.6779 22.9986 10.9561L22.8531 13.2383L22.8375 13.3486C22.8141 13.4565 22.7672 13.5589 22.6998 13.6475L22.6266 13.7305C22.5476 13.8076 22.4523 13.8674 22.3473 13.9043L20.4752 14.5693C20.4213 14.8278 20.3647 15.0493 20.3053 15.2363L20.1519 15.666C20.0973 15.8078 20.0394 15.9488 19.9781 16.0879L20.9185 18.166L20.9586 18.2793C20.9899 18.3941 20.9942 18.5153 20.9693 18.6328L20.9351 18.7471C20.8923 18.8584 20.823 18.959 20.733 19.0391L18.9449 20.6357L18.8512 20.707C18.753 20.7705 18.6411 20.812 18.524 20.8262L18.4059 20.8311C18.2889 20.8272 18.1732 20.7964 18.0689 20.7412L16.2262 19.7647C15.9378 19.9173 15.6394 20.0519 15.3346 20.168L14.5299 20.4697L13.815 22.4502L13.7672 22.5547C13.7121 22.6552 13.6346 22.7424 13.5406 22.8096L13.442 22.8701C13.3398 22.9219 13.2264 22.9498 13.1109 22.9522L11.0211 23C10.9023 23.0031 10.7841 22.9783 10.6773 22.9287L10.5748 22.8711C10.4431 22.7831 10.3415 22.6557 10.2848 22.5078L9.44198 20.2783C9.1547 20.1801 8.86973 20.0733 8.58847 19.959C8.35848 19.8594 8.13142 19.7518 7.90878 19.6367L5.81894 20.5303L5.71347 20.5664C5.64162 20.5854 5.56705 20.594 5.49276 20.5918L5.38241 20.5801C5.27208 20.5606 5.1671 20.5175 5.07577 20.4541L4.98886 20.3838L3.44198 18.9326C3.35574 18.8519 3.28988 18.7525 3.2496 18.6426L3.21737 18.5303C3.18685 18.376 3.20586 18.2154 3.27109 18.0723L4.1705 16.1143C4.05101 15.8824 3.93933 15.6454 3.83749 15.4053C3.71871 15.1116 3.60934 14.814 3.50839 14.5137L1.53866 13.9141C1.41879 13.8777 1.31002 13.8122 1.22226 13.7246L1.14218 13.6299C1.04481 13.4941 0.994151 13.3291 0.999601 13.1621L1.07675 11.0498C1.08222 10.9121 1.1259 10.7782 1.20175 10.6631C1.25874 10.5767 1.33262 10.5026 1.41855 10.4463L1.50839 10.3965L3.57382 9.4043C3.6695 9.05348 3.75306 8.78014 3.82675 8.58106C3.9305 8.31518 4.0461 8.05376 4.17245 7.79785L3.27694 5.90625C3.20906 5.76263 3.18873 5.6004 3.21835 5.44434C3.24057 5.3276 3.2899 5.21813 3.36191 5.125L3.44198 5.03711L4.98593 3.57813C5.09409 3.47611 5.23034 3.40784 5.37655 3.38086C5.52273 3.354 5.67376 3.37002 5.81112 3.42676L7.89901 4.28906C8.12988 4.13515 8.33881 4.01023 8.52792 3.91016C8.75326 3.79034 9.05504 3.66547 9.43417 3.53027L10.1607 1.50488C10.2143 1.35699 10.3122 1.22899 10.441 1.13867C10.57 1.04839 10.7249 0.999723 10.8824 1H13.1851ZM10.8463 4.03613C10.6946 4.45908 10.3613 4.79149 9.93808 4.94238C9.5875 5.06739 9.36381 5.16528 9.23202 5.23535L9.23007 5.23633C9.09075 5.31005 8.9247 5.40801 8.73105 5.53711C8.31531 5.81413 7.78855 5.86633 7.32675 5.67578L5.67343 4.99219L4.86484 5.75586L5.52792 7.15625C5.72387 7.57031 5.71997 8.05117 5.51718 8.46192C5.41394 8.67102 5.31944 8.88459 5.23398 9.10156L5.14218 9.37598C5.10686 9.491 5.06681 9.63118 5.02109 9.79883C4.90655 10.2184 4.6153 10.5675 4.22323 10.7559L2.55917 11.5547L2.51913 12.6436L3.94491 13.0781L4.11386 13.1416C4.49659 13.3106 4.79411 13.6335 4.92929 14.0352C5.01804 14.2992 5.11534 14.5609 5.21933 14.8193L5.35507 15.126C5.40249 15.2271 5.45233 15.3275 5.50351 15.4268C5.71457 15.8364 5.72588 16.3204 5.53378 16.7393L4.85898 18.2061L5.66659 18.9639L7.31894 18.2578L7.47616 18.2012C7.84698 18.0894 8.24932 18.125 8.59726 18.3047C8.78187 18.4001 8.97024 18.4892 9.16073 18.5723C9.28594 18.6231 9.41211 18.6724 9.53866 18.7197L9.92733 18.8594L10.0816 18.9219C10.4317 19.0869 10.7069 19.382 10.8453 19.748L11.5025 21.4883L12.5748 21.4639L13.1187 19.96L13.1832 19.8096C13.3508 19.4678 13.6433 19.2005 14.0035 19.0654L14.8004 18.7666L15.1676 18.6143C15.288 18.5597 15.4071 18.5013 15.524 18.4395L15.692 18.3623C16.0928 18.2097 16.5441 18.236 16.9283 18.4395L18.3238 19.1787L19.3248 18.2842L18.6109 16.7061C18.4355 16.318 18.4336 15.8732 18.6051 15.4834C18.7075 15.2508 18.7973 15.0126 18.8775 14.7715C18.9163 14.6479 18.9608 14.4825 19.0064 14.2637L19.0582 14.0762C19.2064 13.6503 19.5409 13.3098 19.9723 13.1563L21.3873 12.6523L21.4674 11.3877L19.9703 10.7461C19.5971 10.5861 19.3035 10.2817 19.1588 9.90234C19.0283 9.56034 18.9273 9.31663 18.8541 9.15723C18.7854 9.00988 18.689 8.81973 18.5611 8.58496C18.3418 8.18212 18.3187 7.70024 18.4986 7.27832L19.1519 5.74707L18.2867 4.85352L16.9625 5.55567C16.5475 5.77509 16.0531 5.78799 15.6275 5.58984C15.2974 5.43614 15.0582 5.33606 14.8971 5.27832C14.7581 5.22851 14.5701 5.17338 14.3209 5.11133C13.8356 4.99032 13.4418 4.63455 13.2721 4.16406L12.6715 2.5H11.3971L10.8463 4.03613Z",
2460
2506
  fill: "currentColor"
2461
2507
  }
2462
2508
  )
@@ -2464,9 +2510,9 @@ var Icon_shield = (p) => {
2464
2510
  }
2465
2511
  );
2466
2512
  };
2467
- var Icon_sidebar = (p) => {
2513
+ var Icon_shield = (p) => {
2468
2514
  const { size = 24, ...rest } = p;
2469
- return /* @__PURE__ */ jsx(
2515
+ return /* @__PURE__ */ jsxs(
2470
2516
  "svg",
2471
2517
  {
2472
2518
  width: size,
@@ -2475,19 +2521,28 @@ var Icon_sidebar = (p) => {
2475
2521
  fill: "none",
2476
2522
  xmlns: "http://www.w3.org/2000/svg",
2477
2523
  ...rest,
2478
- children: /* @__PURE__ */ jsx(
2479
- "path",
2480
- {
2481
- fillRule: "evenodd",
2482
- clipRule: "evenodd",
2483
- d: "M19 3C20.6569 3 22 4.34315 22 6V18L21.9961 18.1543C21.9184 19.6883 20.6883 20.9184 19.1543 20.9961L19 21H5L4.8457 20.9961C3.31166 20.9184 2.08163 19.6883 2.00391 18.1543L2 18V6C2 4.34315 3.34315 3 5 3H19ZM5 4.5C4.17157 4.5 3.5 5.17157 3.5 6V18C3.5 18.8284 4.17157 19.5 5 19.5H8V4.5H5ZM9.5 19.5H19C19.8284 19.5 20.5 18.8284 20.5 18V6C20.5 5.17157 19.8284 4.5 19 4.5H9.5V19.5Z",
2484
- fill: "currentColor"
2485
- }
2486
- )
2524
+ children: [
2525
+ /* @__PURE__ */ jsx(
2526
+ "path",
2527
+ {
2528
+ d: "M16.2549 9.3486C16.5477 9.05582 17.0225 9.05602 17.3154 9.3486C17.6083 9.64149 17.6083 10.1163 17.3154 10.4091L12.0859 15.6386C11.6954 16.0291 11.0624 16.0291 10.6719 15.6386L7.46973 12.4365C7.17728 12.1436 7.17703 11.6687 7.46973 11.3759C7.76264 11.0833 8.23844 11.0831 8.53125 11.3759L11.3789 14.2246L16.2549 9.3486Z",
2529
+ fill: "currentColor"
2530
+ }
2531
+ ),
2532
+ /* @__PURE__ */ jsx(
2533
+ "path",
2534
+ {
2535
+ fillRule: "evenodd",
2536
+ clipRule: "evenodd",
2537
+ d: "M11.501 1.4404C11.8718 1.27889 12.3024 1.30624 12.6533 1.52145L20.1533 6.12204C20.5238 6.34931 20.7499 6.75284 20.75 7.18747V10.5302C20.75 11.8881 20.6005 13.3051 20.0645 14.6425C19.5554 15.9124 18.7155 17.6378 17.4502 19.1894C16.1835 20.7426 14.4592 22.1581 12.1816 22.7275L12 22.7734L11.8184 22.7275C9.54076 22.1581 7.81646 20.7426 6.5498 19.1894C5.2845 17.6378 4.4446 15.9124 3.93555 14.6425C3.39949 13.3051 3.25 11.8881 3.25 10.5302V7.18747C3.25007 6.75284 3.47619 6.34931 3.84668 6.12204L11.3467 1.52145L11.501 1.4404ZM4.75 7.32712V10.5302C4.75 11.7887 4.89082 12.9929 5.32812 14.084C5.80497 15.2735 6.57635 16.8486 7.71191 18.2412C8.80911 19.5866 10.2182 20.7255 12 21.2216C13.7818 20.7255 15.1909 19.5866 16.2881 18.2412C17.4236 16.8486 18.195 15.2735 18.6719 14.084C19.1092 12.9929 19.25 11.7887 19.25 10.5302V7.32712L12 2.87985L4.75 7.32712Z",
2538
+ fill: "currentColor"
2539
+ }
2540
+ )
2541
+ ]
2487
2542
  }
2488
2543
  );
2489
2544
  };
2490
- var Icon_star = (p) => {
2545
+ var Icon_sidebar = (p) => {
2491
2546
  const { size = 24, ...rest } = p;
2492
2547
  return /* @__PURE__ */ jsx(
2493
2548
  "svg",
@@ -2501,7 +2556,9 @@ var Icon_star = (p) => {
2501
2556
  children: /* @__PURE__ */ jsx(
2502
2557
  "path",
2503
2558
  {
2504
- d: "M12.1736 2.91895C12.3072 2.91895 12.4174 3.02382 12.4236 3.15723L12.7644 10.6738L19.4461 7.21191C19.5647 7.15042 19.7112 7.19288 19.7781 7.30859L19.9519 7.61035C20.0184 7.72598 19.9822 7.87332 19.8699 7.94531L13.53 11.999L19.8699 16.0547C19.9822 16.1267 20.0184 16.274 19.9519 16.3896L19.7781 16.6914C19.7113 16.8071 19.5647 16.8496 19.4461 16.7881L12.7654 13.3252L12.4236 20.8428C12.4174 20.9762 12.3072 21.0811 12.1736 21.0811H11.8259C11.6925 21.0809 11.5831 20.9761 11.5769 20.8428L11.2341 13.3252L4.55445 16.7881C4.43582 16.8496 4.28927 16.8071 4.22242 16.6914L4.04859 16.3896C3.98202 16.2739 4.01814 16.1266 4.13063 16.0547L10.4695 12L4.13063 7.94531C4.01813 7.87336 3.98201 7.72606 4.04859 7.61035L4.22242 7.30859C4.28928 7.19292 4.43582 7.15043 4.55445 7.21191L11.2341 10.6738L11.5769 3.15723C11.5831 3.02392 11.6925 2.91909 11.8259 2.91895H12.1736Z",
2559
+ fillRule: "evenodd",
2560
+ clipRule: "evenodd",
2561
+ d: "M19 3C20.6569 3 22 4.34315 22 6V18L21.9961 18.1543C21.9184 19.6883 20.6883 20.9184 19.1543 20.9961L19 21H5L4.8457 20.9961C3.31166 20.9184 2.08163 19.6883 2.00391 18.1543L2 18V6C2 4.34315 3.34315 3 5 3H19ZM5 4.5C4.17157 4.5 3.5 5.17157 3.5 6V18C3.5 18.8284 4.17157 19.5 5 19.5H8V4.5H5ZM9.5 19.5H19C19.8284 19.5 20.5 18.8284 20.5 18V6C20.5 5.17157 19.8284 4.5 19 4.5H9.5V19.5Z",
2505
2562
  fill: "currentColor"
2506
2563
  }
2507
2564
  )
@@ -2570,6 +2627,52 @@ var Icon_synchronize = (p) => {
2570
2627
  }
2571
2628
  );
2572
2629
  };
2630
+ var Icon_thumbsDown = (p) => {
2631
+ const { size = 24, ...rest } = p;
2632
+ return /* @__PURE__ */ jsx(
2633
+ "svg",
2634
+ {
2635
+ width: size,
2636
+ height: size,
2637
+ viewBox: "0 0 24 24",
2638
+ fill: "none",
2639
+ xmlns: "http://www.w3.org/2000/svg",
2640
+ ...rest,
2641
+ children: /* @__PURE__ */ jsx(
2642
+ "path",
2643
+ {
2644
+ fillRule: "evenodd",
2645
+ clipRule: "evenodd",
2646
+ d: "M13.5 21.25C14.7426 21.25 15.75 20.2426 15.75 19V15.5C15.75 15.3619 15.8619 15.25 16 15.25H18.8936C20.7018 15.25 22.0178 13.5347 21.5498 11.7881L20.1484 6.55762C19.5504 4.3259 17.4329 2.84845 15.1318 3.05664L8.05371 3.69727C7.76261 3.13498 7.17686 2.75 6.5 2.75H4.5C3.25736 2.75 2.25 3.75736 2.25 5V13C2.25 14.2426 3.25736 15.25 4.5 15.25H8.25V15.1689C8.57271 15.4885 8.90914 15.8467 9.23438 16.2344C10.0174 17.1678 10.7037 18.2229 11.0371 19.2568C11.3509 20.2303 12.2316 21.25 13.5 21.25ZM13.5 19.75C13.1116 19.75 12.6594 19.4004 12.4648 18.7969C12.0481 17.5041 11.2278 16.2778 10.3828 15.2705C9.6516 14.3988 8.87296 13.658 8.25 13.1416V5.18555L15.2676 4.55078C16.8419 4.40844 18.2901 5.41938 18.6992 6.94629L20.1006 12.1768C20.3132 12.9706 19.7154 13.75 18.8936 13.75H16C15.0335 13.75 14.25 14.5335 14.25 15.5V19C14.25 19.4142 13.9142 19.75 13.5 19.75Z",
2647
+ fill: "currentColor"
2648
+ }
2649
+ )
2650
+ }
2651
+ );
2652
+ };
2653
+ var Icon_thumbsUp = (p) => {
2654
+ const { size = 24, ...rest } = p;
2655
+ return /* @__PURE__ */ jsx(
2656
+ "svg",
2657
+ {
2658
+ width: size,
2659
+ height: size,
2660
+ viewBox: "0 0 24 24",
2661
+ fill: "none",
2662
+ xmlns: "http://www.w3.org/2000/svg",
2663
+ ...rest,
2664
+ children: /* @__PURE__ */ jsx(
2665
+ "path",
2666
+ {
2667
+ fillRule: "evenodd",
2668
+ clipRule: "evenodd",
2669
+ d: "M13.5 2.75C14.7426 2.75 15.75 3.75736 15.75 5V8.5C15.75 8.63807 15.8619 8.75 16 8.75H18.8936C20.7018 8.75 22.0178 10.4653 21.5498 12.2119L20.1484 17.4424C19.5504 19.6741 17.4329 21.1516 15.1318 20.9434L8.05371 20.3027C7.76261 20.865 7.17686 21.25 6.5 21.25H4.5C3.25736 21.25 2.25 20.2426 2.25 19V11C2.25 9.75736 3.25736 8.75 4.5 8.75H8.25V8.83105C8.57271 8.51149 8.90914 8.15334 9.23438 7.76562C10.0174 6.83217 10.7037 5.77712 11.0371 4.74316C11.3509 3.76975 12.2316 2.75 13.5 2.75ZM13.5 4.25C13.1116 4.25 12.6594 4.59961 12.4648 5.20312C12.0481 6.49588 11.2278 7.72217 10.3828 8.72949C9.6516 9.60115 8.87296 10.342 8.25 10.8584V18.8145L15.2676 19.4492C16.8419 19.5916 18.2901 18.5806 18.6992 17.0537L20.1006 11.8232C20.3132 11.0294 19.7154 10.25 18.8936 10.25H16C15.0335 10.25 14.25 9.4665 14.25 8.5V5C14.25 4.58579 13.9142 4.25 13.5 4.25Z",
2670
+ fill: "currentColor"
2671
+ }
2672
+ )
2673
+ }
2674
+ );
2675
+ };
2573
2676
  var Icon_updown = (p) => {
2574
2677
  const { size = 24, ...rest } = p;
2575
2678
  return /* @__PURE__ */ jsxs(
@@ -2621,6 +2724,50 @@ var Icon_user = (p) => {
2621
2724
  }
2622
2725
  );
2623
2726
  };
2727
+ var Icon_users = (p) => {
2728
+ const { size = 24, ...rest } = p;
2729
+ return /* @__PURE__ */ jsxs(
2730
+ "svg",
2731
+ {
2732
+ width: size,
2733
+ height: size,
2734
+ viewBox: "0 0 24 24",
2735
+ fill: "none",
2736
+ xmlns: "http://www.w3.org/2000/svg",
2737
+ ...rest,
2738
+ children: [
2739
+ /* @__PURE__ */ jsx(
2740
+ "path",
2741
+ {
2742
+ d: "M11.4062 13.5C14.5 13.5 17 16 17 19.0938C17 19.5938 16.5625 20 16.0625 20H3.90625C3.40625 20 3 19.5938 3 19.0938C3 16 5.46875 13.5 8.5625 13.5H11.4062Z",
2743
+ fill: "currentColor"
2744
+ }
2745
+ ),
2746
+ /* @__PURE__ */ jsx(
2747
+ "path",
2748
+ {
2749
+ d: "M15.4189 13.5C18.8153 13.5001 21.5 16.4402 21.5 20H20.5C20.5 16.9999 18.3097 14.6219 15.626 14.5049C15.1851 14.0929 14.6769 13.7528 14.1201 13.5H15.4189Z",
2750
+ fill: "currentColor"
2751
+ }
2752
+ ),
2753
+ /* @__PURE__ */ jsx(
2754
+ "path",
2755
+ {
2756
+ d: "M10 4C12.1875 4 14 5.8125 14 8C14 10.2188 12.1875 12 10 12C7.78125 12 6 10.2188 6 8C6 5.8125 7.78125 4 10 4Z",
2757
+ fill: "currentColor"
2758
+ }
2759
+ ),
2760
+ /* @__PURE__ */ jsx(
2761
+ "path",
2762
+ {
2763
+ d: "M14 4C16.1902 4 18 5.8098 18 8C18 10.2201 16.1877 12 14 12V11C15.6405 11 17 9.66273 17 8C17 6.36208 15.6379 5 14 5V4Z",
2764
+ fill: "currentColor"
2765
+ }
2766
+ )
2767
+ ]
2768
+ }
2769
+ );
2770
+ };
2624
2771
  var Icon_visibilityOff = (p) => {
2625
2772
  const { size = 24, ...rest } = p;
2626
2773
  return /* @__PURE__ */ jsx(
@@ -2840,6 +2987,7 @@ var ICONS = {
2840
2987
  arrowLeft: Icon_arrowLeft,
2841
2988
  arrowRight: Icon_arrowRight,
2842
2989
  arrowUp: Icon_arrowUp,
2990
+ asterisk: Icon_asterisk,
2843
2991
  attachFile: Icon_attachFile,
2844
2992
  barcode: Icon_barcode,
2845
2993
  bell: Icon_bell,
@@ -2882,10 +3030,10 @@ var ICONS = {
2882
3030
  helpFill: Icon_helpFill,
2883
3031
  helpOutline: Icon_helpOutline,
2884
3032
  history: Icon_history,
2885
- imageFill: Icon_imageFill,
2886
- imageOutline: Icon_imageOutline,
3033
+ image: Icon_image,
2887
3034
  inline: Icon_inline,
2888
3035
  launcher: Icon_launcher,
3036
+ leftRight: Icon_leftRight,
2889
3037
  line: Icon_line,
2890
3038
  location: Icon_location,
2891
3039
  logout: Icon_logout,
@@ -2906,14 +3054,18 @@ var ICONS = {
2906
3054
  row: Icon_row,
2907
3055
  save: Icon_save,
2908
3056
  search: Icon_search,
3057
+ send: Icon_send,
2909
3058
  setting: Icon_setting,
3059
+ settingOutline: Icon_settingOutline,
2910
3060
  shield: Icon_shield,
2911
3061
  sidebar: Icon_sidebar,
2912
- star: Icon_star,
2913
3062
  store: Icon_store,
2914
3063
  synchronize: Icon_synchronize,
3064
+ thumbsDown: Icon_thumbsDown,
3065
+ thumbsUp: Icon_thumbsUp,
2915
3066
  updown: Icon_updown,
2916
3067
  user: Icon_user,
3068
+ users: Icon_users,
2917
3069
  visibilityOff: Icon_visibilityOff,
2918
3070
  visibilityOn: Icon_visibilityOn,
2919
3071
  warehouseFill: Icon_warehouseFill,
@@ -3011,6 +3163,7 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
3011
3163
  bordered,
3012
3164
  selected,
3013
3165
  dense,
3166
+ size,
3014
3167
  dragging,
3015
3168
  disabled,
3016
3169
  hovered,
@@ -3024,6 +3177,8 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
3024
3177
  const supportingTextNode = renderSlot(supportingText, renderState);
3025
3178
  const hasSupportingText = supportingTextNode != null && supportingTextNode !== "";
3026
3179
  const trailingNode = renderSlot(trailing, renderState);
3180
+ const titleTypo = size === "sm" ? selected ? "typo-item-sm-selected" : "typo-item-sm-default" : selected ? "typo-item-md-selected" : "typo-item-md-default";
3181
+ const paddingYClass = dense ? size === "sm" ? "py-(--cmp-listDraggableItem-paddingY-sm-dense)" : "py-(--cmp-listDraggableItem-paddingY-md-dense)" : size === "sm" ? "py-(--cmp-listDraggableItem-paddingY-sm-normal)" : "py-(--cmp-listDraggableItem-paddingY-md-normal)";
3027
3182
  return /* @__PURE__ */ jsxs(
3028
3183
  "div",
3029
3184
  {
@@ -3031,10 +3186,12 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
3031
3186
  "aria-disabled": disabled || void 0,
3032
3187
  "data-dragging": dragging || void 0,
3033
3188
  className: cn(
3034
- "relative flex w-full items-center gap-(--cmp-listDraggableItem-gap) overflow-hidden px-(--cmp-listDraggableItem-paddingX) text-[12px] leading-[20px]",
3035
- disabled ? "bg-(--cmp-listDraggableItem-bg-default) font-medium text-(--sys-color-disabled-text)" : selected ? "bg-(--cmp-listDraggableItem-bg-selected) font-bold text-(--cmp-listDraggableItem-text-selected)" : "bg-(--cmp-listDraggableItem-bg-default) font-medium text-(--cmp-listDraggableItem-text-default)",
3189
+ "relative flex w-full items-center gap-(--cmp-listDraggableItem-gap) overflow-hidden px-(--cmp-listDraggableItem-paddingX)",
3190
+ titleTypo,
3191
+ disabled ? "bg-(--cmp-listDraggableItem-bg-default) text-(--sys-color-disabled-text)" : selected ? "bg-(--cmp-listDraggableItem-bg-selected) text-(--cmp-listDraggableItem-text-selected)" : "bg-(--cmp-listDraggableItem-bg-default) text-(--cmp-listDraggableItem-text-default)",
3036
3192
  !disabled && !selected && !dragging && "hover:bg-(--cmp-listDraggableItem-bg-hover)",
3037
- hasSupportingText && supportingTextPosition === "bottom" ? dense ? "min-h-[52px] py-(--cmp-listDraggableItem-paddingY-dense)" : "min-h-[60px] py-(--cmp-listDraggableItem-paddingY-normal)" : dense ? "h-[32px] py-(--cmp-listDraggableItem-paddingY-dense)" : "h-[40px] py-(--cmp-listDraggableItem-paddingY-normal)",
3193
+ hasSupportingText && supportingTextPosition === "bottom" ? dense ? "min-h-[52px]" : "min-h-[60px]" : dense ? "h-[32px]" : "h-[40px]",
3194
+ paddingYClass,
3038
3195
  bordered ? cn(
3039
3196
  "rounded-(--cmp-listDraggableItem-radius-bordered) border border-(--cmp-listDraggableItem-border-default)",
3040
3197
  !disabled && !selected && !dragging && "hover:border-(--cmp-listDraggableItem-bordered-border-hover)",
@@ -3092,7 +3249,7 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
3092
3249
  "span",
3093
3250
  {
3094
3251
  className: cn(
3095
- "min-w-0 truncate text-[12px] font-normal leading-[20px] text-(--sys-color-fg-secondary)",
3252
+ "typo-body-sm-default min-w-0 truncate text-(--sys-color-fg-secondary)",
3096
3253
  supportingTextPosition === "right" && "flex-1"
3097
3254
  ),
3098
3255
  children: supportingTextNode
@@ -3120,6 +3277,7 @@ var SDraggableItemImpl = /* @__PURE__ */ forwardRef(function SDraggableItem({
3120
3277
  selected = false,
3121
3278
  dragging = false,
3122
3279
  dense = false,
3280
+ size = "sm",
3123
3281
  disabled = false,
3124
3282
  dragOverlay = true,
3125
3283
  dragOverlayOpacity = 0.75,
@@ -3191,6 +3349,7 @@ var SDraggableItemImpl = /* @__PURE__ */ forwardRef(function SDraggableItem({
3191
3349
  bordered,
3192
3350
  selected,
3193
3351
  dense,
3352
+ size,
3194
3353
  dragging: dragging || overlayVisible,
3195
3354
  disabled,
3196
3355
  hovered,
@@ -3225,6 +3384,7 @@ var SDraggableItemImpl = /* @__PURE__ */ forwardRef(function SDraggableItem({
3225
3384
  bordered,
3226
3385
  selected,
3227
3386
  dense,
3387
+ size,
3228
3388
  dragging: true,
3229
3389
  disabled,
3230
3390
  hovered: true,
@@ -3576,6 +3736,7 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
3576
3736
  interaction,
3577
3737
  accentStripe = false,
3578
3738
  dense = false,
3739
+ size = "sm",
3579
3740
  disabled = false,
3580
3741
  onToggle,
3581
3742
  className,
@@ -3591,6 +3752,7 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
3591
3752
  const hasChevronInteraction = interaction === "chevron";
3592
3753
  const showInteractionChevron = hasChevronInteraction && !disabled && (isSelected || hovered);
3593
3754
  const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
3755
+ const titleTypo = size === "sm" ? isExpanded ? "typo-item-sm-selected" : "typo-item-sm-default" : isExpanded ? "typo-item-md-selected" : "typo-item-md-default";
3594
3756
  const reportExpandedDescendant = useCallback(
3595
3757
  (delta) => {
3596
3758
  setExpandedDescendantCount((current) => Math.max(0, current + delta));
@@ -3648,7 +3810,8 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
3648
3810
  onToggle?.(next, event);
3649
3811
  },
3650
3812
  className: cn(
3651
- "group/expansion-item-button flex w-full cursor-pointer items-center justify-between border-0 text-left text-[14px] font-bold leading-[24px] text-(--cmp-listExpansionItem-title-text-default) focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent) disabled:cursor-not-allowed disabled:text-(--sys-color-disabled-text)",
3813
+ "group/expansion-item-button flex w-full cursor-pointer items-center justify-between border-0 text-left text-(--cmp-listExpansionItem-title-text-default) focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent) disabled:cursor-not-allowed disabled:text-(--sys-color-disabled-text)",
3814
+ titleTypo,
3652
3815
  isExpanded && "border-b border-(--cmp-listExpansionItem-title-border)",
3653
3816
  hasChevronInteraction ? "hover:bg-(--sys-color-bg-neutralBright)" : !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
3654
3817
  hasSupportingText && supportingTextPosition === "bottom" ? dense ? "min-h-[52px] py-(--cmp-listExpansionItem-title-paddingY-dense)" : "min-h-[60px] py-(--cmp-listExpansionItem-title-paddingY-normal)" : dense ? "h-[32px] py-(--cmp-listExpansionItem-title-paddingY-dense)" : "h-[40px] py-(--cmp-listExpansionItem-title-paddingY-normal)",
@@ -3685,7 +3848,7 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
3685
3848
  "span",
3686
3849
  {
3687
3850
  className: cn(
3688
- "min-w-0 truncate text-[12px] font-normal leading-[20px] text-(--sys-color-fg-secondary)",
3851
+ "typo-body-sm-default min-w-0 truncate text-(--sys-color-fg-secondary)",
3689
3852
  supportingTextPosition === "right" && "flex-1"
3690
3853
  ),
3691
3854
  children: supportingText
@@ -3729,6 +3892,7 @@ var SListItemImpl = /* @__PURE__ */ forwardRef(function SListItem({
3729
3892
  interaction,
3730
3893
  accentStripe = false,
3731
3894
  dense = false,
3895
+ size = "sm",
3732
3896
  disabled = false,
3733
3897
  className,
3734
3898
  onMouseEnter,
@@ -3747,6 +3911,7 @@ var SListItemImpl = /* @__PURE__ */ forwardRef(function SListItem({
3747
3911
  const hasChevronInteraction = interaction === "chevron";
3748
3912
  const showInteractionChevron = hasChevronInteraction && isInteractive && (isSelected || hovered);
3749
3913
  const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
3914
+ const titleTypo = size === "sm" ? isSelected ? "typo-item-sm-selected" : "typo-item-sm-default" : isSelected ? "typo-item-md-selected" : "typo-item-md-default";
3750
3915
  const handleMouseEnter = (event) => {
3751
3916
  if (isInteractive) setHovered(true);
3752
3917
  onMouseEnter?.(event);
@@ -3763,7 +3928,8 @@ var SListItemImpl = /* @__PURE__ */ forwardRef(function SListItem({
3763
3928
  onMouseEnter: handleMouseEnter,
3764
3929
  onMouseLeave: handleMouseLeave,
3765
3930
  className: cn(
3766
- "group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-[14px] font-bold leading-[24px] text-(--cmp-listItem-text-default)",
3931
+ "group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-(--cmp-listItem-text-default)",
3932
+ titleTypo,
3767
3933
  disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : isSelected ? cn(
3768
3934
  "cursor-pointer text-(--cmp-listItem-text-selected)",
3769
3935
  "bg-(--cmp-listItem-bg-selected)"
@@ -3804,7 +3970,7 @@ var SListItemImpl = /* @__PURE__ */ forwardRef(function SListItem({
3804
3970
  "span",
3805
3971
  {
3806
3972
  className: cn(
3807
- "min-w-0 truncate text-[12px] font-normal leading-[20px] text-(--sys-color-fg-secondary)",
3973
+ "typo-body-sm-default min-w-0 truncate text-(--sys-color-fg-secondary)",
3808
3974
  supportingTextPosition === "right" && "flex-1"
3809
3975
  ),
3810
3976
  children: supportingTextNode
@@ -4787,7 +4953,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ forwardRef(
4787
4953
  required && /* @__PURE__ */ jsx(
4788
4954
  SIcon,
4789
4955
  {
4790
- name: "star",
4956
+ name: "asterisk",
4791
4957
  size: 16,
4792
4958
  color: "var(--sys-color-fg-accent)",
4793
4959
  className: "shrink-0"
@@ -4906,6 +5072,225 @@ var SScrollArea = /* @__PURE__ */ forwardRef(function SScrollArea2({
4906
5072
  // src/components/SScrollArea/scrollArea.config.ts
4907
5073
  var SCROLL_AREA_AXES = ["vertical", "horizontal", "both"];
4908
5074
 
5075
+ // src/components/SSplitter/splitter.config.ts
5076
+ var SSPLITTER_UNITS = ["%", "px"];
5077
+ var SSPLITTER_DEFAULT_LIMITS = {
5078
+ "%": [10, 90],
5079
+ "px": [50, Infinity]
5080
+ };
5081
+ var SSPLITTER_DEFAULT_VALUE = {
5082
+ "%": 50,
5083
+ "px": 240
5084
+ };
5085
+ var SSPLITTER_KEY_STEP = {
5086
+ "%": { normal: 1, large: 10 },
5087
+ "px": { normal: 10, large: 50 }
5088
+ };
5089
+ var LINE = "var(--cmp-splitter-border-width)";
5090
+ var PAD = "var(--cmp-splitter-border-padding)";
5091
+ var HIT = `calc(${LINE} + ${PAD} * 2)`;
5092
+ var HIT_END = `calc(0px - ${PAD})`;
5093
+ var SSplitterContext = /* @__PURE__ */ createContext(null);
5094
+ function useSSplitterContext(who) {
5095
+ const ctx = useContext(SSplitterContext);
5096
+ if (!ctx) throw new Error(`${who} \uC740 <SSplitter> \uC548\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`);
5097
+ return ctx;
5098
+ }
5099
+ var SSplitterRoot = /* @__PURE__ */ forwardRef(function SSplitter({
5100
+ value,
5101
+ defaultValue,
5102
+ onValueChange,
5103
+ unit = "%",
5104
+ limits,
5105
+ emitImmediately = false,
5106
+ vertical = false,
5107
+ disabled = false,
5108
+ dividerClassName,
5109
+ dividerStyle,
5110
+ className,
5111
+ style,
5112
+ children,
5113
+ ...rest
5114
+ }, ref) {
5115
+ const rootRef = useRef(null);
5116
+ const setRootRef = useCallback(
5117
+ (node) => {
5118
+ rootRef.current = node;
5119
+ if (typeof ref === "function") ref(node);
5120
+ else if (ref) ref.current = node;
5121
+ },
5122
+ [ref]
5123
+ );
5124
+ const [uncontrolledValue, setUncontrolledValue] = useState(
5125
+ () => defaultValue ?? SSPLITTER_DEFAULT_VALUE[unit]
5126
+ );
5127
+ const isControlled = value !== void 0;
5128
+ const committedValue = isControlled ? value : uncontrolledValue;
5129
+ const [dragValue, setDragValue] = useState(null);
5130
+ const currentValue = dragValue ?? committedValue;
5131
+ const [dragging, setDragging] = useState(false);
5132
+ const [minLimit, maxLimit] = limits ?? SSPLITTER_DEFAULT_LIMITS[unit];
5133
+ const stateRef = useRef({ committedValue, unit, vertical, minLimit, maxLimit });
5134
+ stateRef.current = { committedValue, unit, vertical, minLimit, maxLimit };
5135
+ const emitRef = useRef({ onValueChange, emitImmediately, isControlled });
5136
+ emitRef.current = { onValueChange, emitImmediately, isControlled };
5137
+ const measure = useCallback(() => {
5138
+ const el = rootRef.current;
5139
+ if (!el) return 0;
5140
+ return stateRef.current.vertical ? el.clientHeight : el.clientWidth;
5141
+ }, []);
5142
+ const clamp4 = useCallback((next, containerSize) => {
5143
+ const { unit: u, minLimit: lo, maxLimit: hi } = stateRef.current;
5144
+ const unitMax = u === "%" ? 100 : containerSize;
5145
+ return Math.min(unitMax, hi, Math.max(lo, next));
5146
+ }, []);
5147
+ const commit = useCallback((next) => {
5148
+ if (next === stateRef.current.committedValue) return;
5149
+ stateRef.current.committedValue = next;
5150
+ if (!emitRef.current.isControlled) setUncontrolledValue(next);
5151
+ emitRef.current.onValueChange?.(next);
5152
+ }, []);
5153
+ const endDragRef = useRef(null);
5154
+ useEffect(() => () => endDragRef.current?.(), []);
5155
+ const startResize = useCallback(
5156
+ (event) => {
5157
+ if (disabled || typeof document === "undefined") return;
5158
+ event.preventDefault();
5159
+ event.currentTarget.focus();
5160
+ const isVertical = stateRef.current.vertical;
5161
+ const containerSize = measure();
5162
+ const startPos = isVertical ? event.clientY : event.clientX;
5163
+ const startValue = clamp4(stateRef.current.committedValue, containerSize);
5164
+ const multiplier = stateRef.current.unit === "%" ? containerSize === 0 ? 0 : 100 / containerSize : 1;
5165
+ let latest = startValue;
5166
+ const { body } = document;
5167
+ const prevUserSelect = body.style.userSelect;
5168
+ const prevCursor = body.style.cursor;
5169
+ body.style.userSelect = "none";
5170
+ body.style.cursor = isVertical ? "row-resize" : "col-resize";
5171
+ const onMove = (moveEvent) => {
5172
+ const delta = (isVertical ? moveEvent.clientY : moveEvent.clientX) - startPos;
5173
+ latest = clamp4(startValue + multiplier * delta, containerSize);
5174
+ setDragValue(latest);
5175
+ if (emitRef.current.emitImmediately) commit(latest);
5176
+ };
5177
+ const endDrag = () => {
5178
+ document.removeEventListener("mousemove", onMove);
5179
+ document.removeEventListener("mouseup", endDrag);
5180
+ body.style.userSelect = prevUserSelect;
5181
+ body.style.cursor = prevCursor;
5182
+ endDragRef.current = null;
5183
+ setDragging(false);
5184
+ setDragValue(null);
5185
+ commit(latest);
5186
+ };
5187
+ document.addEventListener("mousemove", onMove);
5188
+ document.addEventListener("mouseup", endDrag);
5189
+ endDragRef.current = endDrag;
5190
+ setDragging(true);
5191
+ },
5192
+ [disabled, measure, clamp4, commit]
5193
+ );
5194
+ const handleKeyDown = useCallback(
5195
+ (event) => {
5196
+ if (disabled) return;
5197
+ const { unit: u, vertical: isVertical, minLimit: lo } = stateRef.current;
5198
+ const step = SSPLITTER_KEY_STEP[u][event.shiftKey ? "large" : "normal"];
5199
+ const decrease = isVertical ? "ArrowUp" : "ArrowLeft";
5200
+ const increase = isVertical ? "ArrowDown" : "ArrowRight";
5201
+ let next = null;
5202
+ if (event.key === decrease) next = stateRef.current.committedValue - step;
5203
+ else if (event.key === increase) next = stateRef.current.committedValue + step;
5204
+ else if (event.key === "Home") next = lo;
5205
+ else if (event.key === "End") next = Number.MAX_SAFE_INTEGER;
5206
+ if (next === null) return;
5207
+ event.preventDefault();
5208
+ commit(clamp4(next, measure()));
5209
+ },
5210
+ [disabled, measure, clamp4, commit]
5211
+ );
5212
+ const sizeCss = unit === "%" ? `${currentValue}%` : `${Math.round(currentValue)}px`;
5213
+ const divider = /* @__PURE__ */ jsx("div", { className: "relative z-[1] shrink-0", style: { flexBasis: LINE }, children: /* @__PURE__ */ jsx(
5214
+ "div",
5215
+ {
5216
+ role: "separator",
5217
+ "aria-orientation": vertical ? "horizontal" : "vertical",
5218
+ "aria-valuenow": Math.round(currentValue),
5219
+ "aria-valuemin": Math.round(minLimit),
5220
+ "aria-valuemax": Number.isFinite(maxLimit) ? Math.round(maxLimit) : void 0,
5221
+ "aria-valuetext": sizeCss,
5222
+ "aria-disabled": disabled || void 0,
5223
+ tabIndex: disabled ? -1 : 0,
5224
+ onMouseDown: startResize,
5225
+ onKeyDown: handleKeyDown,
5226
+ className: cn(
5227
+ "group absolute flex outline-none",
5228
+ vertical ? "inset-x-0 flex-col justify-center" : "inset-y-0 justify-center",
5229
+ disabled ? "cursor-default" : vertical ? "cursor-row-resize" : "cursor-col-resize",
5230
+ dividerClassName
5231
+ ),
5232
+ style: {
5233
+ ...vertical ? { bottom: HIT_END, height: HIT } : { right: HIT_END, width: HIT },
5234
+ ...dividerStyle
5235
+ },
5236
+ children: /* @__PURE__ */ jsx(
5237
+ "span",
5238
+ {
5239
+ "aria-hidden": true,
5240
+ className: cn(
5241
+ // 평상시엔 자리만 잡고 칠하지 않는다 — 색이 붙는 것 자체가 조절 가능하다는 신호다.
5242
+ "transition-colors",
5243
+ vertical ? "h-(--cmp-splitter-border-width)" : "w-(--cmp-splitter-border-width)",
5244
+ !disabled && "group-hover:bg-(--cmp-splitter-border-color) group-focus-visible:bg-(--cmp-splitter-border-color)",
5245
+ !disabled && dragging && "bg-(--cmp-splitter-border-color)"
5246
+ )
5247
+ }
5248
+ )
5249
+ }
5250
+ ) });
5251
+ const ctx = { vertical, sizeCss, divider };
5252
+ return /* @__PURE__ */ jsx(SSplitterContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
5253
+ "div",
5254
+ {
5255
+ ref: setRootRef,
5256
+ className: cn("flex size-full", vertical ? "flex-col" : "flex-row", className),
5257
+ style,
5258
+ ...rest,
5259
+ children
5260
+ }
5261
+ ) });
5262
+ });
5263
+ function usePane(pane, className, style) {
5264
+ const ctx = useSSplitterContext(`SSplitter.${pane === "before" ? "Before" : "After"}`);
5265
+ const isSized = pane === "before";
5266
+ return {
5267
+ divider: ctx.divider,
5268
+ className: cn(
5269
+ "min-h-0 min-w-0 overflow-auto",
5270
+ isSized ? "shrink-0" : "flex-1 basis-0",
5271
+ className
5272
+ ),
5273
+ style: isSized ? { [ctx.vertical ? "height" : "width"]: ctx.sizeCss, ...style } : style
5274
+ };
5275
+ }
5276
+ var SSplitterBeforeImpl = /* @__PURE__ */ forwardRef(function SSplitterBefore({ className, style, children, ...rest }, ref) {
5277
+ const pane = usePane("before", className, style);
5278
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
5279
+ /* @__PURE__ */ jsx("div", { ref, className: pane.className, style: pane.style, ...rest, children }),
5280
+ pane.divider
5281
+ ] });
5282
+ });
5283
+ var SSplitterAfterImpl = /* @__PURE__ */ forwardRef(function SSplitterAfter({ className, style, children, ...rest }, ref) {
5284
+ const pane = usePane("after", className, style);
5285
+ return /* @__PURE__ */ jsx("div", { ref, className: pane.className, style: pane.style, ...rest, children });
5286
+ });
5287
+ var SSplitterBefore2 = /* @__PURE__ */ withDisplayName(SSplitterBeforeImpl, "SSplitter.Before");
5288
+ var SSplitterAfter2 = /* @__PURE__ */ withDisplayName(SSplitterAfterImpl, "SSplitter.After");
5289
+ var SSplitter2 = /* @__PURE__ */ Object.assign(SSplitterRoot, {
5290
+ Before: SSplitterBefore2,
5291
+ After: SSplitterAfter2
5292
+ });
5293
+
4909
5294
  // src/components/SButton/button.config.ts
4910
5295
  var BUTTON_COLORS = ["primary", "secondary", "neutral", "danger"];
4911
5296
  var BUTTON_SIZES = ["xs", "sm", "md", "lg"];
@@ -6008,8 +6393,8 @@ function SFooter({
6008
6393
  "footer",
6009
6394
  {
6010
6395
  className: cn(
6011
- "relative flex w-full flex-shrink-0 items-center justify-end gap-[var(--cmp-overlay-footer-gap)] overflow-hidden px-[var(--cmp-overlay-footer-paddingX)] py-[var(--cmp-overlay-footer-paddingY)] shadow-[var(--shadow-spread-md)]",
6012
- isGrey ? "bg-[var(--cmp-overlay-footer-bg-neutral)]" : "bg-[var(--cmp-overlay-footer-bg-default)]",
6396
+ "relative flex w-full flex-shrink-0 items-center justify-end gap-[var(--cmp-overlay-footer-gap)] overflow-hidden px-[var(--cmp-overlay-footer-paddingX)] py-[var(--cmp-overlay-footer-paddingY)]",
6397
+ isGrey ? "bg-[var(--cmp-overlay-footer-bg-neutral)] border-t border-solid border-[color:var(--sys-color-border-default)]" : "bg-[var(--cmp-overlay-footer-bg-default)] shadow-[var(--shadow-spread-md)]",
6013
6398
  className
6014
6399
  ),
6015
6400
  style,
@@ -6658,6 +7043,8 @@ function SLoadingModal({
6658
7043
  );
6659
7044
  }
6660
7045
  var CLOSE_ANIMATION_DURATION2 = 300;
7046
+ var RESIZE_KEY_STEP = { normal: 10, large: 50 };
7047
+ var RESIZE_HIT_WIDTH = "calc(var(--cmp-splitter-border-width) + var(--cmp-splitter-border-padding) * 2)";
6661
7048
  function toPx(value, percentBase) {
6662
7049
  if (typeof value === "number") return value;
6663
7050
  if (typeof value !== "string") return void 0;
@@ -6695,6 +7082,7 @@ function SDrawer({
6695
7082
  resizable = false,
6696
7083
  minWidth,
6697
7084
  maxWidth,
7085
+ onWidthChange,
6698
7086
  footerLeft,
6699
7087
  button,
6700
7088
  children,
@@ -6707,11 +7095,16 @@ function SDrawer({
6707
7095
  const [portalContainer, setPortalContainer] = useState(null);
6708
7096
  const backdropPointerDownRef = useRef(false);
6709
7097
  const contentRef = useRef(null);
7098
+ const panelRef = useRef(null);
6710
7099
  const stackRegistrationRef = useRef(null);
6711
7100
  const resizeCleanupRef = useRef(null);
6712
- const resizeStateRef = useRef(null);
6713
7101
  const [layerIndex, setLayerIndex] = useState(null);
6714
7102
  const [currentWidth, setCurrentWidth] = useState(width);
7103
+ const [resizing, setResizing] = useState(false);
7104
+ const [measuredWidth, setMeasuredWidth] = useState(null);
7105
+ const [viewportWidth, setViewportWidth] = useState(
7106
+ () => typeof window === "undefined" ? void 0 : window.innerWidth
7107
+ );
6715
7108
  useEffect(() => {
6716
7109
  setCurrentWidth(width);
6717
7110
  }, [width]);
@@ -6727,6 +7120,22 @@ function SDrawer({
6727
7120
  useEffect(() => {
6728
7121
  return () => resizeCleanupRef.current?.();
6729
7122
  }, []);
7123
+ useEffect(() => {
7124
+ if (!rendered) return;
7125
+ const sync = () => setViewportWidth(window.innerWidth);
7126
+ sync();
7127
+ window.addEventListener("resize", sync);
7128
+ return () => window.removeEventListener("resize", sync);
7129
+ }, [rendered]);
7130
+ useEffect(() => {
7131
+ const panel = panelRef.current;
7132
+ if (!resizable || !rendered || !panel || typeof ResizeObserver === "undefined") return;
7133
+ const observer = new ResizeObserver(
7134
+ () => setMeasuredWidth(Math.round(panel.getBoundingClientRect().width))
7135
+ );
7136
+ observer.observe(panel);
7137
+ return () => observer.disconnect();
7138
+ }, [resizable, rendered]);
6730
7139
  useEffect(() => {
6731
7140
  if (!open) {
6732
7141
  setEntered(false);
@@ -6768,41 +7177,80 @@ function SDrawer({
6768
7177
  }
6769
7178
  onOpenChange?.(false);
6770
7179
  };
7180
+ const resizeBounds = () => {
7181
+ const limit = viewportWidth;
7182
+ if (limit === void 0) return { min: void 0, max: void 0 };
7183
+ const min = toPx(minWidth, limit);
7184
+ const max = toPx(maxWidth, limit);
7185
+ return {
7186
+ min: min === void 0 ? void 0 : Math.min(min, limit),
7187
+ max: max === void 0 ? limit : Math.min(max, limit)
7188
+ };
7189
+ };
7190
+ const commitWidth = (next, startWidth) => {
7191
+ const { min, max } = resizeBounds();
7192
+ const clamped = Math.round(clamp3(next, min, max));
7193
+ setCurrentWidth(clamped);
7194
+ if (clamped !== Math.round(startWidth)) onWidthChange?.(clamped);
7195
+ };
6771
7196
  const handleResizeStart = (event) => {
7197
+ if (typeof document === "undefined") return;
7198
+ const panel = panelRef.current;
7199
+ if (!panel) return;
6772
7200
  event.preventDefault();
6773
7201
  event.stopPropagation();
6774
- const panel = contentRef.current?.querySelector("[data-s-drawer-panel]");
6775
- if (!panel) return;
6776
- resizeStateRef.current = {
6777
- startX: event.clientX,
6778
- startWidth: panel.getBoundingClientRect().width,
6779
- minWidth: toPx(minWidth, window.innerWidth),
6780
- maxWidth: toPx(maxWidth, window.innerWidth)
6781
- };
7202
+ event.currentTarget.focus();
7203
+ const startX = event.clientX;
7204
+ const startWidth = panel.getBoundingClientRect().width;
7205
+ const { min, max } = resizeBounds();
7206
+ let latest = startWidth;
7207
+ const { body } = document;
7208
+ const previousCursor = body.style.cursor;
7209
+ const previousUserSelect = body.style.userSelect;
6782
7210
  const onMove = (moveEvent) => {
6783
- const resizeState = resizeStateRef.current;
6784
- if (!resizeState) return;
6785
- const nextWidth = resizeState.startWidth + resizeState.startX - moveEvent.clientX;
6786
- setCurrentWidth(clamp3(nextWidth, resizeState.minWidth, resizeState.maxWidth));
7211
+ latest = Math.round(clamp3(startWidth + (startX - moveEvent.clientX), min, max));
7212
+ setCurrentWidth(latest);
6787
7213
  };
6788
- resizeCleanupRef.current?.();
6789
- const previousCursor = document.body.style.cursor;
6790
- const previousUserSelect = document.body.style.userSelect;
6791
7214
  const cleanupResize = () => {
6792
- resizeStateRef.current = null;
6793
- document.body.style.cursor = previousCursor;
6794
- document.body.style.userSelect = previousUserSelect;
7215
+ body.style.cursor = previousCursor;
7216
+ body.style.userSelect = previousUserSelect;
6795
7217
  document.removeEventListener("mousemove", onMove);
6796
7218
  document.removeEventListener("mouseup", cleanupResize);
6797
7219
  resizeCleanupRef.current = null;
7220
+ setResizing(false);
7221
+ commitWidth(latest, startWidth);
6798
7222
  };
7223
+ resizeCleanupRef.current?.();
6799
7224
  resizeCleanupRef.current = cleanupResize;
6800
- document.body.style.cursor = "col-resize";
6801
- document.body.style.userSelect = "none";
7225
+ body.style.cursor = "col-resize";
7226
+ body.style.userSelect = "none";
6802
7227
  document.addEventListener("mousemove", onMove);
6803
7228
  document.addEventListener("mouseup", cleanupResize);
7229
+ setResizing(true);
7230
+ };
7231
+ const handleResizeKeyDown = (event) => {
7232
+ const panel = panelRef.current;
7233
+ if (!panel) return;
7234
+ const startWidth = panel.getBoundingClientRect().width;
7235
+ const { min, max } = resizeBounds();
7236
+ const step = RESIZE_KEY_STEP[event.shiftKey ? "large" : "normal"];
7237
+ let next = null;
7238
+ if (event.key === "ArrowLeft") next = startWidth + step;
7239
+ else if (event.key === "ArrowRight") next = startWidth - step;
7240
+ else if (event.key === "Home" && min !== void 0) next = min;
7241
+ else if (event.key === "End" && max !== void 0) next = max;
7242
+ if (next === null) return;
7243
+ event.preventDefault();
7244
+ commitWidth(next, startWidth);
6804
7245
  };
6805
7246
  const modalHost = getModalHost();
7247
+ const resizeValueNow = measuredWidth ?? (typeof currentWidth === "number" ? Math.round(currentWidth) : void 0);
7248
+ const { min: resizeMinPx, max: resizeMaxPx } = resizeBounds();
7249
+ const resizeValueMin = resizeMinPx === void 0 ? void 0 : Math.round(resizeMinPx);
7250
+ const resizeValueMax = resizeMaxPx === void 0 ? void 0 : Math.round(resizeMaxPx);
7251
+ const appliedWidth = typeof currentWidth === "number" && viewportWidth !== void 0 ? Math.min(currentWidth, viewportWidth) : currentWidth;
7252
+ const appliedMinWidth = resizeMinPx ?? minWidth;
7253
+ const appliedMaxWidth = resizeMaxPx ?? maxWidth;
6806
7254
  return /* @__PURE__ */ jsx(RDialog.Root, { open, onOpenChange, children: /* @__PURE__ */ jsx(RDialog.Portal, { container: modalHost, forceMount: rendered ? true : void 0, children: /* @__PURE__ */ jsxs("div", { className: "pointer-events-none absolute inset-0", style: { zIndex: layerIndex ?? 0 }, children: [
6807
7255
  /* @__PURE__ */ jsx(
6808
7256
  RDialog.Overlay,
@@ -6844,6 +7292,7 @@ function SDrawer({
6844
7292
  /* @__PURE__ */ jsxs(
6845
7293
  "div",
6846
7294
  {
7295
+ ref: panelRef,
6847
7296
  className: cn(
6848
7297
  "pointer-events-auto relative flex h-full max-w-full translate-x-full flex-col overflow-hidden bg-[var(--cmp-drawer-bg)] shadow-[var(--shadow-overlay)] transition-transform duration-300 ease-out data-[state=open]:translate-x-0 data-[state=closed]:translate-x-full",
6849
7298
  shaking && "animate-drawer-shake",
@@ -6851,20 +7300,45 @@ function SDrawer({
6851
7300
  ),
6852
7301
  "data-s-drawer-panel": true,
6853
7302
  "data-state": open && entered ? "open" : "closed",
6854
- style: { width: currentWidth, minWidth, maxWidth, ...style },
7303
+ style: {
7304
+ width: appliedWidth,
7305
+ minWidth: appliedMinWidth,
7306
+ maxWidth: appliedMaxWidth,
7307
+ ...style
7308
+ },
6855
7309
  onAnimationEnd: (event) => {
6856
7310
  if (event.animationName === "drawer-shake") setShaking(false);
6857
7311
  },
6858
7312
  children: [
6859
- resizable && /* @__PURE__ */ jsx(
6860
- "button",
7313
+ resizable && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
7314
+ "div",
6861
7315
  {
6862
- type: "button",
7316
+ role: "separator",
7317
+ "aria-orientation": "vertical",
6863
7318
  "aria-label": "Drawer \uB108\uBE44 \uC870\uC808",
6864
- className: "absolute inset-y-0 left-0 z-[1] w-[8px] -translate-x-1/2 cursor-col-resize touch-none border-0 bg-transparent p-0",
6865
- onMouseDown: handleResizeStart
7319
+ "aria-valuenow": resizeValueNow,
7320
+ "aria-valuemin": resizeValueMin,
7321
+ "aria-valuemax": resizeValueMax,
7322
+ "aria-valuetext": resizeValueNow === void 0 ? void 0 : `${resizeValueNow}px`,
7323
+ tabIndex: 0,
7324
+ onMouseDown: handleResizeStart,
7325
+ onKeyDown: handleResizeKeyDown,
7326
+ className: "group absolute inset-y-0 left-0 z-[1] flex cursor-col-resize touch-none justify-start outline-none",
7327
+ style: { width: RESIZE_HIT_WIDTH },
7328
+ children: /* @__PURE__ */ jsx(
7329
+ "span",
7330
+ {
7331
+ "aria-hidden": true,
7332
+ className: cn(
7333
+ // 평상시엔 자리만 잡고 칠하지 않는다 — 색이 붙는 것 자체가 조절 가능하다는 신호다.
7334
+ "w-(--cmp-splitter-border-width) transition-colors",
7335
+ "group-hover:bg-(--cmp-splitter-border-color) group-focus-visible:bg-(--cmp-splitter-border-color)",
7336
+ resizing && "bg-(--cmp-splitter-border-color)"
7337
+ )
7338
+ }
7339
+ )
6866
7340
  }
6867
- ),
7341
+ ) }),
6868
7342
  /* @__PURE__ */ jsx(
6869
7343
  SOverlayHeader,
6870
7344
  {
@@ -6894,6 +7368,72 @@ function SDrawer({
6894
7368
  )
6895
7369
  ] }) }) });
6896
7370
  }
7371
+
7372
+ // src/lib/is-dev.ts
7373
+ function isDev() {
7374
+ return typeof process === "undefined" || process?.env?.NODE_ENV !== "production";
7375
+ }
7376
+
7377
+ // src/lib/modal-outlet.ts
7378
+ var EMPTY = [];
7379
+ var entries2 = EMPTY;
7380
+ var listeners2 = /* @__PURE__ */ new Set();
7381
+ var outletRendered = false;
7382
+ var outletCount = 0;
7383
+ var nextId2 = 0;
7384
+ function emit2() {
7385
+ for (const listener of listeners2) listener();
7386
+ }
7387
+ function subscribeModalEntries(listener) {
7388
+ listeners2.add(listener);
7389
+ return () => {
7390
+ listeners2.delete(listener);
7391
+ };
7392
+ }
7393
+ function getModalEntries() {
7394
+ return entries2;
7395
+ }
7396
+ function getServerModalEntries() {
7397
+ return EMPTY;
7398
+ }
7399
+ function markModalOutletRendered() {
7400
+ outletRendered = true;
7401
+ }
7402
+ function registerModalOutlet() {
7403
+ outletCount += 1;
7404
+ outletRendered = true;
7405
+ return () => {
7406
+ outletCount -= 1;
7407
+ if (outletCount === 0) queueMicrotask(sweepOrphans);
7408
+ };
7409
+ }
7410
+ function sweepOrphans() {
7411
+ if (outletCount > 0) return;
7412
+ outletRendered = false;
7413
+ if (entries2 === EMPTY) return;
7414
+ const orphans = entries2;
7415
+ entries2 = EMPTY;
7416
+ emit2();
7417
+ for (const entry of orphans) entry.onOrphan();
7418
+ }
7419
+ function hasModalOutlet() {
7420
+ return outletRendered;
7421
+ }
7422
+ function isModalOutletMounted() {
7423
+ return outletCount > 0;
7424
+ }
7425
+ function addModalEntry(host, node, onOrphan) {
7426
+ const id = ++nextId2;
7427
+ entries2 = [...entries2, { id, host, node, onOrphan }];
7428
+ emit2();
7429
+ return id;
7430
+ }
7431
+ function removeModalEntry(id) {
7432
+ const next = entries2.filter((entry) => entry.id !== id);
7433
+ if (next.length === entries2.length) return;
7434
+ entries2 = next;
7435
+ emit2();
7436
+ }
6897
7437
  var EXIT_DURATION = 300;
6898
7438
  var EXIT_BUFFER = 100;
6899
7439
  var SModalRefImpl = class {
@@ -6901,6 +7441,7 @@ var SModalRefImpl = class {
6901
7441
  this.pendingClose = false;
6902
7442
  this.pendingPatches = [];
6903
7443
  this.dismissRequested = false;
7444
+ this.torndown = false;
6904
7445
  }
6905
7446
  onOk(fn) {
6906
7447
  this.okFn = fn;
@@ -6932,10 +7473,10 @@ var SModalRefImpl = class {
6932
7473
  return this;
6933
7474
  }
6934
7475
  // 닫힘 트리거 — 이미 닫힘이 시작됐으면 무시(중복 콜백 방지)
6935
- settle(emit2) {
7476
+ settle(emit3) {
6936
7477
  if (this.dismissRequested) return;
6937
7478
  this.dismissRequested = true;
6938
- emit2();
7479
+ emit3();
6939
7480
  if (this.closeBinding) this.closeBinding();
6940
7481
  else this.pendingClose = true;
6941
7482
  }
@@ -6968,11 +7509,18 @@ var SModalRefImpl = class {
6968
7509
  this.pendingPatches = [];
6969
7510
  }
6970
7511
  }
6971
- /** @internal 정리 대상(root·host) 주입 */
6972
- _setTeardown(root, host) {
6973
- this.root = root;
7512
+ /** @internal host 주입 — 렌더 전에 호출해야 마운트 검사(_getHost) 성립한다 */
7513
+ _setHost(host) {
6974
7514
  this.host = host;
6975
7515
  }
7516
+ /** @internal outlet 경로 정리 대상(스토어 엔트리) 주입 */
7517
+ _setEntry(id) {
7518
+ this.entryId = id;
7519
+ }
7520
+ /** @internal 폴백(createRoot) 경로 정리 대상 주입 */
7521
+ _setRoot(root) {
7522
+ this.root = root;
7523
+ }
6976
7524
  /** @internal create 의 마운트 검사용 host 조회 */
6977
7525
  _getHost() {
6978
7526
  return this.host;
@@ -7003,9 +7551,21 @@ var SModalRefImpl = class {
7003
7551
  }
7004
7552
  /** @internal 닫힘 애니메이션 종료 후 언마운트 */
7005
7553
  _teardown() {
7554
+ if (this.torndown) return;
7555
+ this.torndown = true;
7556
+ if (this.entryId !== void 0) {
7557
+ removeModalEntry(this.entryId);
7558
+ return;
7559
+ }
7006
7560
  this.root?.unmount();
7007
7561
  this.host?.remove();
7008
7562
  }
7563
+ /** @internal 렌더 실패·outlet 소멸로 모달이 사라졌을 때 — 콜백을 마무리하고 정리한다 */
7564
+ _fail() {
7565
+ this.dismissRequested = true;
7566
+ this._emitDismissed();
7567
+ this._teardown();
7568
+ }
7009
7569
  };
7010
7570
  function useExitTeardown(open, refImpl) {
7011
7571
  const dismissedRef = useRef(false);
@@ -7072,8 +7632,15 @@ function LoadingMount({ options, refImpl }) {
7072
7632
  }
7073
7633
  );
7074
7634
  }
7635
+ var outletWarned = false;
7636
+ var NO_OUTLET_CAUSE = "SModalOutlet \uC774 \uC571 \uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4 \uC774 \uBAA8\uB2EC\uC740 \uBCC4\uB3C4 React \uB8E8\uD2B8(createRoot)\uB85C \uB9C8\uC6B4\uD2B8\uB429\uB2C8\uB2E4. React Context \uB294 DOM \uC774 \uC544\uB2C8\uB77C \uB80C\uB354 \uD2B8\uB9AC\uB97C \uD0C0\uBBC0\uB85C \uC571\uC758 Provider(QueryClient\xB7Router\xB7Theme \uB4F1)\uAC00 \uB2FF\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC571 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC5D0\uC11C Provider \uC548\uCABD\uC5D0 <SModalOutlet /> \uC744 \uD55C \uBC88 \uB80C\uB354\uD558\uC138\uC694.";
7637
+ function warnMissingOutlet() {
7638
+ if (!isDev() || outletWarned) return;
7639
+ outletWarned = true;
7640
+ console.warn(`[SModal] ${NO_OUTLET_CAUSE}`);
7641
+ }
7075
7642
  function warnIfNotModal(host, component) {
7076
- if (typeof process !== "undefined" && process?.env?.NODE_ENV === "production") return;
7643
+ if (!isDev()) return;
7077
7644
  if (!host || host.childElementCount === 0) return;
7078
7645
  const name = component?.name || "component";
7079
7646
  console.warn(
@@ -7081,14 +7648,14 @@ function warnIfNotModal(host, component) {
7081
7648
  );
7082
7649
  }
7083
7650
  function CreateMount({ options, refImpl }) {
7084
- const { component: Component, componentProps } = options;
7651
+ const { component: Component2, componentProps } = options;
7085
7652
  const [open, setOpen] = useState(true);
7086
7653
  useEffect(() => {
7087
7654
  refImpl._bindClose(() => setOpen(false));
7088
7655
  refImpl._bindUpdate(() => {
7089
7656
  });
7090
- warnIfNotModal(refImpl._getHost(), Component);
7091
- }, [refImpl, Component]);
7657
+ warnIfNotModal(refImpl._getHost(), Component2);
7658
+ }, [refImpl, Component2]);
7092
7659
  useExitTeardown(open, refImpl);
7093
7660
  const componentAllProps = {
7094
7661
  ...componentProps,
@@ -7100,15 +7667,42 @@ function CreateMount({ options, refImpl }) {
7100
7667
  onClose: () => refImpl._emitClose(),
7101
7668
  modalRef: refImpl
7102
7669
  };
7103
- return /* @__PURE__ */ jsx(Component, { ...componentAllProps });
7670
+ return /* @__PURE__ */ jsx(Component2, { ...componentAllProps });
7104
7671
  }
7672
+ var ModalErrorBoundary = class extends Component {
7673
+ constructor() {
7674
+ super(...arguments);
7675
+ this.state = { failed: false };
7676
+ }
7677
+ static getDerivedStateFromError() {
7678
+ return { failed: true };
7679
+ }
7680
+ componentDidCatch(error) {
7681
+ console.error(
7682
+ this.props.standalone ? `[SModal] \uBAA8\uB2EC \uB80C\uB354\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. ${NO_OUTLET_CAUSE}` : "[SModal] \uBAA8\uB2EC \uB80C\uB354\uC5D0 \uC2E4\uD328\uD574 \uBAA8\uB2EC\uC744 \uB2EB\uC2B5\uB2C8\uB2E4.",
7683
+ error
7684
+ );
7685
+ setTimeout(() => this.props.onError(), 0);
7686
+ }
7687
+ render() {
7688
+ return this.state.failed ? null : this.props.children;
7689
+ }
7690
+ };
7105
7691
  function mount(render) {
7106
7692
  const host = document.createElement("div");
7107
7693
  document.body.appendChild(host);
7108
7694
  const refImpl = new SModalRefImpl();
7695
+ refImpl._setHost(host);
7696
+ const useOutlet = hasModalOutlet();
7697
+ const node = /* @__PURE__ */ jsx(ModalErrorBoundary, { standalone: !useOutlet, onError: () => refImpl._fail(), children: render(refImpl) });
7698
+ if (useOutlet) {
7699
+ refImpl._setEntry(addModalEntry(host, node, () => refImpl._fail()));
7700
+ return refImpl;
7701
+ }
7702
+ warnMissingOutlet();
7109
7703
  const root = createRoot(host);
7110
- refImpl._setTeardown(root, host);
7111
- root.render(render(refImpl));
7704
+ refImpl._setRoot(root);
7705
+ root.render(node);
7112
7706
  return refImpl;
7113
7707
  }
7114
7708
  var SModal = {
@@ -7132,8 +7726,32 @@ var SModal = {
7132
7726
  return mount((refImpl) => /* @__PURE__ */ jsx(CreateMount, { options, refImpl }));
7133
7727
  }
7134
7728
  };
7729
+ function SModalEntryPortal({ entry }) {
7730
+ useEffect(() => {
7731
+ if (!entry.host.isConnected) document.body.appendChild(entry.host);
7732
+ return () => entry.host.remove();
7733
+ }, [entry]);
7734
+ return createPortal(entry.node, entry.host);
7735
+ }
7736
+ function SModalOutlet() {
7737
+ markModalOutletRendered();
7738
+ const entries3 = useSyncExternalStore(
7739
+ subscribeModalEntries,
7740
+ getModalEntries,
7741
+ getServerModalEntries
7742
+ );
7743
+ useEffect(() => {
7744
+ if (isDev() && isModalOutletMounted()) {
7745
+ console.warn(
7746
+ "[SModalOutlet] \uC774\uBBF8 \uB80C\uB354\uB41C SModalOutlet \uC774 \uC788\uC2B5\uB2C8\uB2E4. \uC571 \uC804\uCCB4\uC5D0 \uD558\uB098\uB9CC \uB450\uC138\uC694 \u2014 \uB458 \uC774\uC0C1\uC774\uBA74 \uAC19\uC740 \uBAA8\uB2EC\uC774 \uC911\uBCF5\uC73C\uB85C \uADF8\uB824\uC9D1\uB2C8\uB2E4."
7747
+ );
7748
+ }
7749
+ return registerModalOutlet();
7750
+ }, []);
7751
+ return /* @__PURE__ */ jsx(PortalContainerProvider, { value: null, children: /* @__PURE__ */ jsx(InsideModalProvider, { value: false, children: entries3.map((entry) => /* @__PURE__ */ jsx(SModalEntryPortal, { entry }, entry.id)) }) });
7752
+ }
7135
7753
  var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
7136
- var isSameNav = (a, b) => a === b || !!a && !!b && a.columnWidth === b.columnWidth && a.topHeight === b.topHeight && a.foldMs === b.foldMs && a.requireFullHeader === b.requireFullHeader;
7754
+ var isSameNav = (a, b) => a === b || !!a && !!b && a.columnWidth === b.columnWidth && a.topHeight === b.topHeight && a.foldMs === b.foldMs && a.requireFullHeader === b.requireFullHeader && a.resizing === b.resizing;
7137
7755
  var SLayoutContext = /* @__PURE__ */ createContext(null);
7138
7756
  var SLAYOUT_MIN_WIDTH = 1366;
7139
7757
  var SLAYOUT_MIN_WIDTH_VAR = "--s-layout-min-width";
@@ -7193,7 +7811,8 @@ var SLayout = /* @__PURE__ */ forwardRef(function SLayout2({
7193
7811
  gridTemplateRows: `${nav?.topHeight ?? "0px"} 1fr`,
7194
7812
  // 메뉴가 미끄러지는 동안 페이지 열도 같은 길이로 따라와야 한 덩어리로 읽힌다.
7195
7813
  // (fix 는 SGnb 가 제 폭을 직접 전환하므로 프레임이 손댈 게 없다)
7196
- transition: `grid-template-columns ${nav?.foldMs ?? 0}ms ease-out`
7814
+ // 폭을 끄는 중에는 전환을 끈다 — 그러지 않으면 열이 손보다 늦게 따라온다.
7815
+ transition: nav?.resizing ? "none" : `grid-template-columns ${nav?.foldMs ?? 0}ms ease-out`
7197
7816
  } : void 0;
7198
7817
  return /* @__PURE__ */ jsx(SLayoutContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
7199
7818
  "div",
@@ -7336,6 +7955,10 @@ var GNB_RAIL_WIDTH = 68;
7336
7955
  var GNB_FOLD_MS = 200;
7337
7956
  var GNB_EXPAND_MS = 200;
7338
7957
  var GNB_MENU_WIDTH = 240;
7958
+ var GNB_MENU_MIN_WIDTH = 200;
7959
+ var GNB_MENU_MAX_WIDTH = 300;
7960
+ var GNB_MENU_RESIZE_KEY_STEP = { normal: 10, large: 50 };
7961
+ var clampGnbMenuWidth = (width) => Math.min(GNB_MENU_MAX_WIDTH, Math.max(GNB_MENU_MIN_WIDTH, Math.round(width)));
7339
7962
  var GNB_FULL_LOGO_WIDTH = 140;
7340
7963
  var GNB_TOP_ICON_GAP = 8;
7341
7964
  var GNB_TOP_ICON_SIZE = 24;
@@ -7372,6 +7995,7 @@ function findGnbAncestors(items, value) {
7372
7995
  };
7373
7996
  return walk(items, []) ?? [];
7374
7997
  }
7998
+ var LABEL_TIP_HIDE_DELAY_MS = 100;
7375
7999
  var DEPTH_PADDING_LEFT = (M, depth) => depth === 1 ? M.depth1PaddingLeft : depth === 2 ? M.depth2PaddingLeft : M.depth3PaddingLeft;
7376
8000
  var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7377
8001
  type: typeProp,
@@ -7387,9 +8011,16 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7387
8011
  onLauncherClick,
7388
8012
  logo,
7389
8013
  topContent,
8014
+ railTop,
7390
8015
  railFooter,
8016
+ menuTop,
7391
8017
  menuFooter,
8018
+ foldedTop,
7392
8019
  foldedFooter,
8020
+ resizable = false,
8021
+ menuWidth: menuWidthProp,
8022
+ defaultMenuWidth,
8023
+ onMenuWidthChange,
7393
8024
  ariaLabel = "global navigation",
7394
8025
  className,
7395
8026
  style,
@@ -7408,6 +8039,46 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7408
8039
  () => new Set(findGnbAncestors(items, value))
7409
8040
  );
7410
8041
  const [hoveredKey, setHoveredKey] = useState(null);
8042
+ const [labelTip, setLabelTip] = useState(null);
8043
+ const labelTipHideRef = useRef(null);
8044
+ const portalContainer = usePortalContainer();
8045
+ const labelTipAnchorRef = useMemo(
8046
+ () => ({
8047
+ current: {
8048
+ getBoundingClientRect: () => labelTip?.el.getBoundingClientRect() ?? new DOMRect()
8049
+ }
8050
+ }),
8051
+ [labelTip?.el]
8052
+ );
8053
+ const cancelLabelTipHide = () => {
8054
+ if (labelTipHideRef.current === null) return;
8055
+ clearTimeout(labelTipHideRef.current);
8056
+ labelTipHideRef.current = null;
8057
+ };
8058
+ const showLabelTipIfTruncated = (row, label) => {
8059
+ cancelLabelTipHide();
8060
+ const el = row.querySelector("[data-gnb-label]");
8061
+ if (!el || el.scrollWidth <= el.clientWidth) {
8062
+ setLabelTip(null);
8063
+ return;
8064
+ }
8065
+ setLabelTip((prev) => prev?.el === el && prev.label === label ? prev : { label, el });
8066
+ };
8067
+ const startLabelTipHide = () => {
8068
+ cancelLabelTipHide();
8069
+ labelTipHideRef.current = setTimeout(() => setLabelTip(null), LABEL_TIP_HIDE_DELAY_MS);
8070
+ };
8071
+ useEffect(() => cancelLabelTipHide, []);
8072
+ const rowHoverProps = (item) => ({
8073
+ onMouseEnter: (event) => {
8074
+ setHoveredKey(item.value);
8075
+ showLabelTipIfTruncated(event.currentTarget, item.label);
8076
+ },
8077
+ onMouseLeave: () => {
8078
+ setHoveredKey((prev) => prev === item.value ? null : prev);
8079
+ startLabelTipHide();
8080
+ }
8081
+ });
7411
8082
  const [activeRail, setActiveRail] = useState(
7412
8083
  () => findGnbRailValue(items, value) ?? items[0]?.value
7413
8084
  );
@@ -7487,11 +8158,17 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7487
8158
  cursor: item.disabled ? "not-allowed" : "pointer"
7488
8159
  },
7489
8160
  onClick: () => handleRailClick(item),
7490
- onMouseEnter: () => setHoveredKey(item.value),
7491
- onMouseLeave: () => setHoveredKey((prev) => prev === item.value ? null : prev),
8161
+ ...rowHoverProps(item),
7492
8162
  children: [
7493
8163
  item.icon && /* @__PURE__ */ jsx(SIcon, { name: item.icon, size: GNB_RAIL.itemIcon, className: "shrink-0" }),
7494
- /* @__PURE__ */ jsx("span", { className: "w-full overflow-hidden text-ellipsis whitespace-nowrap text-center", children: item.label })
8164
+ /* @__PURE__ */ jsx(
8165
+ "span",
8166
+ {
8167
+ "data-gnb-label": true,
8168
+ className: "w-full overflow-hidden text-ellipsis whitespace-nowrap text-center",
8169
+ children: item.label
8170
+ }
8171
+ )
7495
8172
  ]
7496
8173
  }
7497
8174
  ) }, item.value);
@@ -7535,8 +8212,7 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7535
8212
  className: "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
7536
8213
  style: itemStyle,
7537
8214
  onClick: () => handleItemClick(item),
7538
- onMouseEnter: () => setHoveredKey(item.value),
7539
- onMouseLeave: () => setHoveredKey((prev) => prev === item.value ? null : prev),
8215
+ ...rowHoverProps(item),
7540
8216
  children: [
7541
8217
  depth === 1 && item.icon && /* @__PURE__ */ jsx(
7542
8218
  SIcon,
@@ -7547,16 +8223,23 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7547
8223
  className: "shrink-0"
7548
8224
  }
7549
8225
  ),
7550
- /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap flex items-center", children: [
8226
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center", children: [
7551
8227
  depth > 1 && iconBranch ? /* @__PURE__ */ jsx(
7552
8228
  "div",
7553
8229
  {
7554
- className: "w-[20px] flex items-center justify-center mr-[8px]",
8230
+ className: "mr-[8px] flex w-[20px] shrink-0 items-center justify-center",
7555
8231
  style: { height: M.itemLineHeight },
7556
8232
  children: "-"
7557
8233
  }
7558
8234
  ) : null,
7559
- item.label
8235
+ /* @__PURE__ */ jsx(
8236
+ "span",
8237
+ {
8238
+ "data-gnb-label": true,
8239
+ className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap",
8240
+ children: item.label
8241
+ }
8242
+ )
7560
8243
  ] }),
7561
8244
  item.tag !== void 0 && item.tag !== "" && /* @__PURE__ */ jsx(
7562
8245
  STag,
@@ -7608,7 +8291,14 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7608
8291
  const railItems = useRail ? items : [];
7609
8292
  const menuItems = useRail ? items.find((item) => item.value === activeRail)?.children ?? [] : items;
7610
8293
  const showMenu = !useRail || menuItems.length > 0;
7611
- const bodyWidth = (useRail ? GNB_RAIL_WIDTH : 0) + (showMenu ? GNB_MENU_WIDTH : 0);
8294
+ const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = useState(
8295
+ () => defaultMenuWidth ?? GNB_MENU_WIDTH
8296
+ );
8297
+ const [dragMenuWidth, setDragMenuWidth] = useState(null);
8298
+ const committedMenuWidth = menuWidthProp ?? uncontrolledMenuWidth;
8299
+ const menuWidth = clampGnbMenuWidth(dragMenuWidth ?? committedMenuWidth);
8300
+ const [resizing, setResizing] = useState(false);
8301
+ const bodyWidth = (useRail ? GNB_RAIL_WIDTH : 0) + (showMenu ? menuWidth : 0);
7612
8302
  const registerNav = layout?.registerNav;
7613
8303
  useIsomorphicLayoutEffect(() => {
7614
8304
  if (!registerNav) return;
@@ -7616,21 +8306,109 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7616
8306
  columnWidth: bodyWidth,
7617
8307
  topHeight: H.topHeight,
7618
8308
  foldMs: GNB_FOLD_MS,
7619
- requireFullHeader: railHasLeaf
8309
+ requireFullHeader: railHasLeaf,
8310
+ resizing
7620
8311
  });
7621
8312
  return () => registerNav(null);
7622
- }, [registerNav, bodyWidth, H.topHeight, railHasLeaf]);
8313
+ }, [registerNav, bodyWidth, H.topHeight, railHasLeaf, resizing]);
8314
+ const canResize = resizable && showMenu && !folded;
8315
+ const menuWidthRef = useRef(menuWidth);
8316
+ menuWidthRef.current = menuWidth;
8317
+ const commitMenuWidth = (next) => {
8318
+ const clamped = clampGnbMenuWidth(next);
8319
+ setDragMenuWidth(null);
8320
+ if (menuWidthProp === void 0) setUncontrolledMenuWidth(clamped);
8321
+ if (clamped !== committedMenuWidth) onMenuWidthChange?.(clamped);
8322
+ };
8323
+ const endResizeRef = useRef(null);
8324
+ useEffect(() => () => endResizeRef.current?.(), []);
8325
+ const startMenuResize = (event) => {
8326
+ if (!canResize || typeof document === "undefined") return;
8327
+ event.preventDefault();
8328
+ event.currentTarget.focus();
8329
+ const startX = event.clientX;
8330
+ const startWidth = menuWidthRef.current;
8331
+ let latest = startWidth;
8332
+ const { body } = document;
8333
+ const prevUserSelect = body.style.userSelect;
8334
+ const prevCursor = body.style.cursor;
8335
+ body.style.userSelect = "none";
8336
+ body.style.cursor = "col-resize";
8337
+ const onMove = (moveEvent) => {
8338
+ latest = clampGnbMenuWidth(startWidth + (moveEvent.clientX - startX));
8339
+ setDragMenuWidth(latest);
8340
+ };
8341
+ const endResize = () => {
8342
+ document.removeEventListener("mousemove", onMove);
8343
+ document.removeEventListener("mouseup", endResize);
8344
+ body.style.userSelect = prevUserSelect;
8345
+ body.style.cursor = prevCursor;
8346
+ endResizeRef.current = null;
8347
+ setResizing(false);
8348
+ commitMenuWidth(latest);
8349
+ };
8350
+ document.addEventListener("mousemove", onMove);
8351
+ document.addEventListener("mouseup", endResize);
8352
+ endResizeRef.current = endResize;
8353
+ setResizing(true);
8354
+ };
8355
+ const handleMenuResizeKeyDown = (event) => {
8356
+ if (!canResize) return;
8357
+ const step = GNB_MENU_RESIZE_KEY_STEP[event.shiftKey ? "large" : "normal"];
8358
+ let next = null;
8359
+ if (event.key === "ArrowLeft") next = menuWidthRef.current - step;
8360
+ else if (event.key === "ArrowRight") next = menuWidthRef.current + step;
8361
+ else if (event.key === "Home") next = GNB_MENU_MIN_WIDTH;
8362
+ else if (event.key === "End") next = GNB_MENU_MAX_WIDTH;
8363
+ if (next === null) return;
8364
+ event.preventDefault();
8365
+ commitMenuWidth(next);
8366
+ };
7623
8367
  const railFolded = folded && header === "fix";
7624
8368
  const isFull = header === "full";
7625
8369
  const isFullFrame = isFull && !!layout;
7626
8370
  const rightBorder = color === "light" ? `1px solid ${C.topBorder}` : void 0;
8371
+ const resizeHitWidth = "calc(var(--cmp-splitter-border-width) + var(--cmp-splitter-border-padding) * 2)";
8372
+ const menuResizeHandle = canResize ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
8373
+ "div",
8374
+ {
8375
+ role: "separator",
8376
+ "aria-orientation": "vertical",
8377
+ "aria-label": `${ariaLabel} width`,
8378
+ "aria-valuenow": menuWidth,
8379
+ "aria-valuemin": GNB_MENU_MIN_WIDTH,
8380
+ "aria-valuemax": GNB_MENU_MAX_WIDTH,
8381
+ "aria-valuetext": `${menuWidth}px`,
8382
+ tabIndex: 0,
8383
+ onMouseDown: startMenuResize,
8384
+ onKeyDown: handleMenuResizeKeyDown,
8385
+ className: "group absolute inset-y-0 z-[1] flex cursor-col-resize justify-end outline-none",
8386
+ style: {
8387
+ width: resizeHitWidth,
8388
+ ...isFull && !isFullFrame ? { left: `calc(${bodyWidth}px - ${resizeHitWidth})` } : { right: 0 }
8389
+ },
8390
+ children: /* @__PURE__ */ jsx(
8391
+ "span",
8392
+ {
8393
+ "aria-hidden": true,
8394
+ className: cn(
8395
+ // 평상시엔 자리만 잡고 칠하지 않는다 — 색이 붙는 것 자체가 조절 가능하다는 신호다.
8396
+ "w-(--cmp-splitter-border-width) transition-colors",
8397
+ "group-hover:bg-(--cmp-splitter-border-color) group-focus-visible:bg-(--cmp-splitter-border-color)",
8398
+ resizing && "bg-(--cmp-splitter-border-color)"
8399
+ )
8400
+ }
8401
+ )
8402
+ }
8403
+ ) }) : null;
7627
8404
  const rootStyle = isFullFrame ? { display: "contents", ...style } : isFull ? (
7628
8405
  // 단독 full — 상단바가 전폭이어야 하므로 루트도 전폭이고, 배경·선은 상단바·메뉴가 각자 그린다.
7629
8406
  { width: "100%", ...style }
7630
8407
  ) : {
7631
8408
  // fix 를 닫으면 48px 레일로 좁혀진다.
7632
8409
  width: folded ? GNB_COMMON.foldWidth : bodyWidth,
7633
- transition: `width ${GNB_FOLD_MS}ms ease-out`,
8410
+ // 폭을 끄는 중에는 전환을 끈다 — 접힘용 전환이 걸려 있으면 컬럼이 손보다 늦게 따라온다.
8411
+ transition: resizing ? "none" : `width ${GNB_FOLD_MS}ms ease-out`,
7634
8412
  backgroundColor: C.panelBg,
7635
8413
  borderRight: rightBorder,
7636
8414
  ...style
@@ -7707,7 +8485,8 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7707
8485
  ref,
7708
8486
  className: cn(
7709
8487
  "box-border",
7710
- !isFullFrame && "flex h-full shrink-0 flex-col overflow-hidden",
8488
+ // relative: fix 조절선이 루트(=GNB 컬럼) 오른쪽 끝을 기준으로 서야 상단바까지 이어진다.
8489
+ !isFullFrame && "relative flex h-full shrink-0 flex-col overflow-hidden",
7711
8490
  className
7712
8491
  ),
7713
8492
  style: rootStyle,
@@ -7745,86 +8524,109 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
7745
8524
  ] })
7746
8525
  }
7747
8526
  ),
7748
- /* @__PURE__ */ jsx(
8527
+ railFolded && foldedTop && /* @__PURE__ */ jsx("div", { className: "mt-[24px] flex shrink-0 items-center justify-center", children: foldedTop }),
8528
+ /* @__PURE__ */ jsxs(
7749
8529
  "div",
7750
8530
  {
7751
- className: cn("overflow-hidden", !isFullFrame && "min-h-0 flex-1"),
8531
+ className: cn("relative overflow-hidden", !isFullFrame && "min-h-0 flex-1"),
7752
8532
  style: isFullFrame ? { gridArea: "nav" } : void 0,
7753
- children: /* @__PURE__ */ jsxs(
7754
- "div",
7755
- {
7756
- className: "flex h-full flex-row",
7757
- style: {
7758
- width: bodyWidth,
7759
- transform: folded ? "translateX(-100%)" : "none",
7760
- visibility: folded ? "hidden" : "visible",
7761
- transition: `transform ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(folded)}`
7762
- },
7763
- children: [
7764
- useRail && // 레일 컬럼 — 스크롤되는 아이템 목록(nav)과 하단 고정 footer 를 한 컬럼에 담는다.
7765
- // footer 내비게이션이 아니므로 nav(landmark) 밖에 두고, 컬럼 폭·구분선·배경은 래퍼가
7766
- // 전체 높이에 걸쳐 책임진다(그래야 footer 자리까지 배경·오른쪽 선이 이어진다).
7767
- /* @__PURE__ */ jsxs(
7768
- "div",
7769
- {
7770
- className: "flex shrink-0 flex-col overflow-hidden",
7771
- style: {
7772
- width: GNB_RAIL_WIDTH,
7773
- borderRight: `1px solid ${C.topBorder}`,
7774
- backgroundColor: C.panelBg
7775
- },
7776
- children: [
7777
- /* @__PURE__ */ jsx(
7778
- "nav",
7779
- {
7780
- "aria-label": `${ariaLabel} rail`,
7781
- className: cn(
7782
- "flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto",
7783
- SCROLLBAR_HIDDEN_CLASS
7784
- ),
7785
- style: { padding: GNB_RAIL.padding },
7786
- children: /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col p-0", style: { gap: GNB_RAIL.gap }, children: railItems.map(renderRailItem) })
7787
- }
7788
- ),
7789
- railFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: railFooter })
7790
- ]
7791
- }
7792
- ),
7793
- showMenu && /* @__PURE__ */ jsxs(
7794
- "div",
7795
- {
7796
- className: "flex shrink-0 flex-col overflow-hidden",
7797
- style: {
7798
- width: GNB_MENU_WIDTH,
7799
- backgroundColor: C.panelBg,
7800
- // full 은 루트가 오른쪽 선을 못 그리므로(전폭이거나 아예 없다) 메뉴 오른쪽(페이지 경계)이 대신 그린다.
7801
- borderRight: isFull ? rightBorder : void 0
7802
- },
7803
- children: [
7804
- /* @__PURE__ */ jsx(
7805
- "nav",
7806
- {
7807
- "aria-label": ariaLabel,
7808
- className: cn(
7809
- "flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto",
7810
- SCROLLBAR_HIDDEN_CLASS
7811
- ),
7812
- style: {
7813
- paddingTop: M.bodyPaddingY,
7814
- paddingBottom: M.bodyPaddingY
7815
- },
7816
- children: /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item) => renderItem(item, 1)) })
7817
- }
7818
- ),
7819
- menuFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: menuFooter })
7820
- ]
7821
- }
7822
- )
7823
- ]
7824
- }
7825
- )
8533
+ children: [
8534
+ /* @__PURE__ */ jsxs(
8535
+ "div",
8536
+ {
8537
+ className: "flex h-full flex-row",
8538
+ style: {
8539
+ width: bodyWidth,
8540
+ transform: folded ? "translateX(-100%)" : "none",
8541
+ visibility: folded ? "hidden" : "visible",
8542
+ transition: `transform ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(folded)}`
8543
+ },
8544
+ children: [
8545
+ useRail && // 레일 컬럼 스크롤되는 아이템 목록(nav) 가운데 두고 위아래에 고정 슬롯(top/footer)을 붙인다.
8546
+ // 슬롯은 내비게이션이 아니므로 nav(landmark) 밖에 두고, 컬럼 폭·구분선·배경은 이 래퍼가
8547
+ // 전체 높이에 걸쳐 책임진다(그래야 슬롯 자리까지 배경·오른쪽 선이 이어진다).
8548
+ /* @__PURE__ */ jsxs(
8549
+ "div",
8550
+ {
8551
+ className: "flex shrink-0 flex-col overflow-hidden",
8552
+ style: {
8553
+ width: GNB_RAIL_WIDTH,
8554
+ borderRight: `1px solid ${C.topBorder}`,
8555
+ backgroundColor: C.panelBg
8556
+ },
8557
+ children: [
8558
+ railTop && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: railTop }),
8559
+ /* @__PURE__ */ jsx(
8560
+ "nav",
8561
+ {
8562
+ "aria-label": `${ariaLabel} rail`,
8563
+ className: cn(
8564
+ "flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto",
8565
+ SCROLLBAR_HIDDEN_CLASS
8566
+ ),
8567
+ style: { padding: GNB_RAIL.padding },
8568
+ children: /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col p-0", style: { gap: GNB_RAIL.gap }, children: railItems.map(renderRailItem) })
8569
+ }
8570
+ ),
8571
+ railFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: railFooter })
8572
+ ]
8573
+ }
8574
+ ),
8575
+ showMenu && /* @__PURE__ */ jsxs(
8576
+ "div",
8577
+ {
8578
+ className: "flex shrink-0 flex-col overflow-hidden",
8579
+ style: {
8580
+ width: menuWidth,
8581
+ backgroundColor: C.panelBg,
8582
+ // full 은 루트가 오른쪽 선을 못 그리므로(전폭이거나 아예 없다) 메뉴 오른쪽(페이지 경계)이 대신 그린다.
8583
+ borderRight: isFull ? rightBorder : void 0
8584
+ },
8585
+ children: [
8586
+ menuTop && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: menuTop }),
8587
+ /* @__PURE__ */ jsx(
8588
+ "nav",
8589
+ {
8590
+ "aria-label": ariaLabel,
8591
+ className: cn(
8592
+ "flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto",
8593
+ SCROLLBAR_HIDDEN_CLASS
8594
+ ),
8595
+ style: {
8596
+ paddingTop: M.bodyPaddingY,
8597
+ paddingBottom: M.bodyPaddingY
8598
+ },
8599
+ children: /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item) => renderItem(item, 1)) })
8600
+ }
8601
+ ),
8602
+ menuFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: menuFooter })
8603
+ ]
8604
+ }
8605
+ )
8606
+ ]
8607
+ }
8608
+ ),
8609
+ header === "full" && menuResizeHandle
8610
+ ]
7826
8611
  }
7827
8612
  ),
8613
+ header === "fix" && menuResizeHandle,
8614
+ /* @__PURE__ */ jsxs(RPopover2.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
8615
+ /* @__PURE__ */ jsx(RPopover2.Anchor, { virtualRef: labelTipAnchorRef }),
8616
+ /* @__PURE__ */ jsx(RPopover2.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
8617
+ RPopover2.Content,
8618
+ {
8619
+ side: "right",
8620
+ sideOffset: 4,
8621
+ className: cn("z-50", FLOATING_SLIDE_ANIM),
8622
+ "aria-hidden": true,
8623
+ onOpenAutoFocus: (event) => event.preventDefault(),
8624
+ onMouseEnter: cancelLabelTipHide,
8625
+ onMouseLeave: startLabelTipHide,
8626
+ children: /* @__PURE__ */ jsx(STag, { shape: "square", size: "xs", color: "grey", label: labelTip?.label ?? "" })
8627
+ }
8628
+ ) })
8629
+ ] }),
7828
8630
  railFolded && foldedFooter && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center justify-center mb-[24px]", children: foldedFooter })
7829
8631
  ]
7830
8632
  }
@@ -8934,7 +9736,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
8934
9736
  }, [value]);
8935
9737
  const selectedRef = useRef(selected);
8936
9738
  selectedRef.current = selected;
8937
- const emit2 = (next) => {
9739
+ const emit3 = (next) => {
8938
9740
  if (!onValueChange) return;
8939
9741
  const mapped = next.map(
8940
9742
  (v) => emitValue ? rawByValue.get(v) ?? v : optionByValue.get(v) ?? { value: v, label: v }
@@ -9038,14 +9840,14 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
9038
9840
  const handleSelect = (nextValue) => {
9039
9841
  if (multi) {
9040
9842
  const next = selected.includes(nextValue) ? selected.filter((v) => v !== nextValue) : [...selected, nextValue];
9041
- emit2(next);
9843
+ emit3(next);
9042
9844
  return;
9043
9845
  }
9044
- emit2([nextValue]);
9846
+ emit3([nextValue]);
9045
9847
  commitOpen(false, [nextValue]);
9046
9848
  };
9047
9849
  const handleSelectAll = () => {
9048
- emit2(allSelected ? [] : allValues);
9850
+ emit3(allSelected ? [] : allValues);
9049
9851
  };
9050
9852
  const handleToggleGroup = (leafValues) => {
9051
9853
  if (leafValues.length === 0) return;
@@ -9053,9 +9855,9 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
9053
9855
  const allSelectedInGroup = leafValues.every((v) => selectedSet.has(v));
9054
9856
  if (allSelectedInGroup) {
9055
9857
  const remove = new Set(leafValues);
9056
- emit2(selected.filter((v) => !remove.has(v)));
9858
+ emit3(selected.filter((v) => !remove.has(v)));
9057
9859
  } else {
9058
- emit2([...selected, ...leafValues.filter((v) => !selectedSet.has(v))]);
9860
+ emit3([...selected, ...leafValues.filter((v) => !selectedSet.has(v))]);
9059
9861
  }
9060
9862
  };
9061
9863
  useEffect(() => {
@@ -10132,6 +10934,9 @@ var STableBar = /* @__PURE__ */ forwardRef(function STableBar2({ total, selected
10132
10934
  }
10133
10935
  );
10134
10936
  });
10937
+
10938
+ // src/lib/autofill.ts
10939
+ var AUTOFILL_RESET_CLASS = "autofill:[-webkit-text-fill-color:currentColor] autofill:[box-shadow:0_0_0_1000px_var(--sys-color-field-bg-default)_inset] autofill:[transition:background-color_5000s_ease-in-out_0s] [&:-webkit-autofill]:[-webkit-text-fill-color:currentColor] [&:-webkit-autofill]:[box-shadow:0_0_0_1000px_var(--sys-color-field-bg-default)_inset] [&:-webkit-autofill]:[transition:background-color_5000s_ease-in-out_0s]";
10135
10940
  var FONT = {
10136
10941
  sm: { fontSize: 12, lineHeight: 20, paddingX: "var(--cmp-textinput-sm-paddingX)" },
10137
10942
  md: { fontSize: 14, lineHeight: 24, paddingX: "var(--cmp-textinput-md-paddingX)" }
@@ -10246,6 +11051,7 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
10246
11051
  },
10247
11052
  className: cn(
10248
11053
  "h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
11054
+ AUTOFILL_RESET_CLASS,
10249
11055
  inputClass
10250
11056
  ),
10251
11057
  style: {
@@ -10284,7 +11090,7 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
10284
11090
  }
10285
11091
  );
10286
11092
  });
10287
- var PAD = { fontSize: 12, paddingX: 12, paddingY: 4 };
11093
+ var PAD2 = { fontSize: 12, paddingX: 12, paddingY: 4 };
10288
11094
  var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
10289
11095
  value,
10290
11096
  onValueChange,
@@ -10316,7 +11122,7 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
10316
11122
  style,
10317
11123
  ...rest
10318
11124
  }, ref) {
10319
- const p = PAD;
11125
+ const p = PAD2;
10320
11126
  const [ruleError, setRuleError] = useState("");
10321
11127
  useFormField({
10322
11128
  name: rest.name,
@@ -10373,6 +11179,7 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
10373
11179
  },
10374
11180
  className: cn(
10375
11181
  "w-full resize-y border-0 bg-transparent outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
11182
+ AUTOFILL_RESET_CLASS,
10376
11183
  textareaClass
10377
11184
  ),
10378
11185
  style: {
@@ -10389,7 +11196,7 @@ var STextarea = /* @__PURE__ */ forwardRef(function STextarea2({
10389
11196
  }
10390
11197
  );
10391
11198
  });
10392
- var PAD2 = {
11199
+ var PAD3 = {
10393
11200
  sm: { fontSize: 12, lineHeight: 20, stepper: 20, icon: 12 },
10394
11201
  md: { fontSize: 14, lineHeight: 24, stepper: 24, icon: 14 }
10395
11202
  };
@@ -10481,7 +11288,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
10481
11288
  className,
10482
11289
  style
10483
11290
  }, ref) {
10484
- const p = PAD2[size];
11291
+ const p = PAD3[size];
10485
11292
  const padX = `var(--cmp-numberInput-${size}-paddingX)`;
10486
11293
  const decimalLimit = getDecimalLimit(useDecimal, maxDecimalLength);
10487
11294
  const numValue = applyDecimalLimit(toNumber(value), decimalLimit);
@@ -10525,7 +11332,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
10525
11332
  target.value = display;
10526
11333
  restoreCaret(display, Math.min(logicalCaret, display.replace(/,/g, "").length));
10527
11334
  };
10528
- const emit2 = (n, logicalCaret) => {
11335
+ const emit3 = (n, logicalCaret) => {
10529
11336
  const next = applyDecimalLimit(n, decimalLimit);
10530
11337
  const nextDisplay = formatWithCommas(next);
10531
11338
  setDisplayWithCaret(nextDisplay, logicalCaret);
@@ -10537,13 +11344,13 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
10537
11344
  if (incDisabled) return;
10538
11345
  const cur = numValue ?? (min === Number.NEGATIVE_INFINITY ? 0 : min);
10539
11346
  const next = applyDecimalLimit(Math.min(cur + step, max), decimalLimit);
10540
- if (next !== cur) emit2(next);
11347
+ if (next !== cur) emit3(next);
10541
11348
  };
10542
11349
  const decrement = () => {
10543
11350
  if (decDisabled) return;
10544
11351
  const cur = numValue ?? (min === Number.NEGATIVE_INFINITY ? 0 : min);
10545
11352
  const next = applyDecimalLimit(Math.max(cur - step, min), decimalLimit);
10546
- if (next !== cur) emit2(next);
11353
+ if (next !== cur) emit3(next);
10547
11354
  };
10548
11355
  const handleInput = (event) => {
10549
11356
  const target = event.currentTarget;
@@ -10686,7 +11493,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
10686
11493
  const cleaned = display.replace(/,/g, "");
10687
11494
  const n = toNumber(cleaned);
10688
11495
  const clamped = n === null ? null : Math.min(Math.max(n, min), max);
10689
- if (clamped !== n) emit2(clamped);
11496
+ if (clamped !== n) emit3(clamped);
10690
11497
  else setDisplay(n === null ? "" : formatInputWithCommas(cleaned));
10691
11498
  if (rules && rules.length > 0) setRuleError(runRules(clamped, rules));
10692
11499
  onBlur?.(e);
@@ -10695,6 +11502,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
10695
11502
  // h-full 대신 라인박스 높이 그대로 두어 prefix/suffix 와 동일하게 flex 로 수직 센터링
10696
11503
  // (h-full 이면 input 내부 텍스트 센터링을 브라우저가 수행해 1px 어긋날 수 있음)
10697
11504
  "min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-numberInput-text-placeholder)] disabled:cursor-not-allowed",
11505
+ AUTOFILL_RESET_CLASS,
10698
11506
  inputClass
10699
11507
  ),
10700
11508
  style: {
@@ -11295,7 +12103,7 @@ function RangeCalendar({
11295
12103
  const inRange = (d) => !!(rStart && rEnd && d > rStart && d < rEnd);
11296
12104
  const RANGE_BG = "var(--cmp-datepicker-calendar-range-bg)";
11297
12105
  const pad = (v) => String(Number(v) || 0).padStart(2, "0");
11298
- const emit2 = (dateStart, dateEnd, time) => {
12106
+ const emit3 = (dateStart, dateEnd, time) => {
11299
12107
  const t = time ?? { sH, sM, eH, eM };
11300
12108
  const range = useTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
11301
12109
  lastEmitted.current = JSON.stringify(range);
@@ -11318,7 +12126,7 @@ function RangeCalendar({
11318
12126
  }
11319
12127
  setEnd(d);
11320
12128
  onPendingStartChange?.(null);
11321
- emit2(start, d, useTimePicker ? { sH, sM, eH: "23", eM: "59" } : void 0);
12129
+ emit3(start, d, useTimePicker ? { sH, sM, eH: "23", eM: "59" } : void 0);
11322
12130
  };
11323
12131
  const changeTime = (which, part, raw) => {
11324
12132
  const digits = raw.replace(/\D/g, "").slice(0, 2);
@@ -11331,7 +12139,7 @@ function RangeCalendar({
11331
12139
  setSM(nextTime.sM);
11332
12140
  setEH(nextTime.eH);
11333
12141
  setEM(nextTime.eM);
11334
- if (start && end) emit2(start, end, nextTime);
12142
+ if (start && end) emit3(start, end, nextTime);
11335
12143
  };
11336
12144
  const blurTime = (which, part) => {
11337
12145
  if (which === "start") {
@@ -12058,7 +12866,7 @@ function SKeyValueTable({
12058
12866
  style
12059
12867
  }) {
12060
12868
  if (fields.length === 0) return null;
12061
- const emit2 = (name, value) => onChange?.({
12869
+ const emit3 = (name, value) => onChange?.({
12062
12870
  name,
12063
12871
  value,
12064
12872
  values: { ...values, [name]: value }
@@ -12069,7 +12877,7 @@ function SKeyValueTable({
12069
12877
  if (f.render) return f.render;
12070
12878
  const opt = { ...f.options ?? {} };
12071
12879
  if (Object.prototype.hasOwnProperty.call(values, f.name)) opt.value = values[f.name];
12072
- const up = (v) => emit2(f.name, v);
12880
+ const up = (v) => emit3(f.name, v);
12073
12881
  switch (f.type) {
12074
12882
  case "input":
12075
12883
  return /* @__PURE__ */ jsx(SInput, { width: "100%", ...opt, onValueChange: up });
@@ -12158,7 +12966,7 @@ function SKeyValueTable({
12158
12966
  children: /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full items-center justify-between gap-[var(--cmp-table-header-gap)]", children: [
12159
12967
  /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-[8px]", children: [
12160
12968
  /* @__PURE__ */ jsx("span", { className: "text-[12px] font-bold leading-[20px] text-[color:var(--sys-color-fg-primary)]", children: f.label }),
12161
- f.required && /* @__PURE__ */ jsx(SIcon, { name: "star", size: 12, color: "var(--sys-color-fg-accent)" })
12969
+ f.required && /* @__PURE__ */ jsx(SIcon, { name: "asterisk", size: 12, color: "var(--sys-color-fg-accent)" })
12162
12970
  ] }),
12163
12971
  f.helpText && f.helpText.length > 0 && /* @__PURE__ */ jsx(
12164
12972
  STooltip2,
@@ -12923,6 +13731,7 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
12923
13731
  size: 1,
12924
13732
  className: cn(
12925
13733
  "s-chip-input__input col-start-1 row-start-1 w-full border-0 bg-transparent p-0 font-normal text-(--cmp-chip-content-focus) outline-none placeholder:text-(--cmp-chipInput-text-placeholder) disabled:cursor-not-allowed",
13734
+ AUTOFILL_RESET_CLASS,
12926
13735
  size === "md" ? "text-14 leading-sd-24" : "text-12 leading-sd-20"
12927
13736
  ),
12928
13737
  style: {
@@ -13215,6 +14024,7 @@ var SBarcodeInput = /* @__PURE__ */ forwardRef(
13215
14024
  },
13216
14025
  className: cn(
13217
14026
  "h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-textinput-text-placeholder)] disabled:cursor-not-allowed",
14027
+ AUTOFILL_RESET_CLASS,
13218
14028
  inputClass
13219
14029
  ),
13220
14030
  style: {
@@ -14143,6 +14953,6 @@ function STimeRangePicker({
14143
14953
  );
14144
14954
  }
14145
14955
 
14146
- export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, PAGE_BACKGROUNDS, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip2 as SChip, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDateRangePicker, SDivider, SDraggableGroup, SDraggableItem2 as SDraggableItem, SDraggableList, SDraggableProvider, SDrawer, SDropdownButton2 as SDropdownButton, SExpansionItem, SExpansionList2 as SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLAYOUT_MIN_WIDTH, SLayout, SLayoutContext, SLinearProgress, SList2 as SList, SListItem2 as SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SScrollArea, SSectionHeaderCard2 as SSectionHeaderCard, SSelect2 as SSelect, SStepper, SSwitch, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip2 as STooltip, STree2 as STree, STreeItem2 as STreeItem, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, findGnbAncestors, findGnbRailValue, isColorKey, loading, resolveColor, useSLayout };
14956
+ export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, PAGE_BACKGROUNDS, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip2 as SChip, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDateRangePicker, SDivider, SDraggableGroup, SDraggableItem2 as SDraggableItem, SDraggableList, SDraggableProvider, SDrawer, SDropdownButton2 as SDropdownButton, SExpansionItem, SExpansionList2 as SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLAYOUT_MIN_WIDTH, SLayout, SLayoutContext, SLinearProgress, SList2 as SList, SListItem2 as SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SModalOutlet, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SSPLITTER_UNITS, SScrollArea, SSectionHeaderCard2 as SSectionHeaderCard, SSelect2 as SSelect, SSplitter2 as SSplitter, SStepper, SSwitch, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip2 as STooltip, STree2 as STree, STreeItem2 as STreeItem, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, findGnbAncestors, findGnbRailValue, isColorKey, loading, resolveColor, useSLayout };
14147
14957
  //# sourceMappingURL=index.js.map
14148
14958
  //# sourceMappingURL=index.js.map