@sellmate/design-system 1.21.0 → 1.22.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 (105) hide show
  1. package/dist/cjs/design-system.cjs.js +1 -1
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/sd-button_2.cjs.entry.js +4 -4
  4. package/dist/cjs/sd-chip-input.cjs.entry.js +41 -17
  5. package/dist/cjs/sd-pagination_4.cjs.entry.js +86 -7
  6. package/dist/collection/components/assets/CaretDown.js +1 -1
  7. package/dist/collection/components/assets/CaretLeft.js +1 -1
  8. package/dist/collection/components/assets/CaretRight.js +1 -1
  9. package/dist/collection/components/assets/CaretUp.js +1 -1
  10. package/dist/collection/components/sd-chip-input/sd-chip-input.css +5 -0
  11. package/dist/collection/components/sd-chip-input/sd-chip-input.js +40 -16
  12. package/dist/collection/components/sd-table/sd-table.stories.helpers.js +97 -0
  13. package/dist/collection/components/sd-table/sd-thead/sd-thead.css +21 -0
  14. package/dist/collection/components/sd-table/sd-thead/sd-thead.js +87 -7
  15. package/dist/components/{p-D4zy1T3V.js → p-58DLP3IW.js} +1 -1
  16. package/dist/components/{p-CcwzTAJC.js → p-B0myARGe.js} +1 -1
  17. package/dist/components/{p-CBDBmMmw.js → p-B12iH3Zk.js} +1 -1
  18. package/dist/components/{p-B5VNSTAf.js → p-B2bF2KlS.js} +1 -1
  19. package/dist/components/{p-C3mTIE8H.js → p-BXRgi3NZ.js} +1 -1
  20. package/dist/components/{p-DC5W8Uy1.js → p-Bm3NWPaP.js} +1 -1
  21. package/dist/components/{p-FA9fGvbL.js → p-BpQwjSB8.js} +1 -1
  22. package/dist/components/{p-BjSMh85k.js → p-BpjmheLG.js} +1 -1
  23. package/dist/components/{p-CTw1Deo8.js → p-Bric-SEs.js} +1 -1
  24. package/dist/components/{p-CZYTZeMe.js → p-BwTsP0Ak.js} +1 -1
  25. package/dist/components/p-CCO1WtEj.js +1 -0
  26. package/dist/components/{p-DPXOBYhf.js → p-CHxVi6l1.js} +1 -1
  27. package/dist/components/{p-Dz7VXmIA.js → p-Cdzn78dP.js} +1 -1
  28. package/dist/components/{p-YpyfqzoP.js → p-Cjf8PHEl.js} +1 -1
  29. package/dist/components/{p-l7TaS8q9.js → p-Co2ThnbG.js} +1 -1
  30. package/dist/components/{p-BrHnpCXR.js → p-CwSlRPMm.js} +1 -1
  31. package/dist/components/{p-CTxZT3Je.js → p-D7StBSjK.js} +1 -1
  32. package/dist/components/{p-Btj50AUe.js → p-DFbj6d3L.js} +1 -1
  33. package/dist/components/{p-Cugxp5lo.js → p-DlXBFtBO.js} +1 -1
  34. package/dist/components/{p-BIHVGo10.js → p-Du_qPqW-.js} +1 -1
  35. package/dist/components/{p-DJY7lCe4.js → p-DzAvlr8W.js} +1 -1
  36. package/dist/components/{p-4MIzxb0h.js → p-FrqOl9KZ.js} +1 -1
  37. package/dist/components/{p-BQQC-6k4.js → p-JMuxVcTW.js} +1 -1
  38. package/dist/components/{p-B76pFg6k.js → p-OjchKJGr.js} +1 -1
  39. package/dist/components/{p-DIc8C633.js → p-YCGkwgiM.js} +1 -1
  40. package/dist/components/{p-DZikCqcw.js → p-ZvP2Ce6J.js} +1 -1
  41. package/dist/components/p-kRH2GOb0.js +1 -0
  42. package/dist/components/{p-s_75vJTu.js → p-mcMbSkii.js} +1 -1
  43. package/dist/components/{p-DU0IkIvI.js → p-vPS2GNz3.js} +1 -1
  44. package/dist/components/sd-action-modal.js +1 -1
  45. package/dist/components/sd-barcode-input.js +1 -1
  46. package/dist/components/sd-button.js +1 -1
  47. package/dist/components/sd-calendar.js +1 -1
  48. package/dist/components/sd-callout.js +1 -1
  49. package/dist/components/sd-checkbox.js +1 -1
  50. package/dist/components/sd-chip-input.js +1 -1
  51. package/dist/components/sd-chip.js +1 -1
  52. package/dist/components/sd-confirm-modal.js +1 -1
  53. package/dist/components/sd-date-picker-trigger.js +1 -1
  54. package/dist/components/sd-date-picker.js +1 -1
  55. package/dist/components/sd-date-range-picker-calendar.js +1 -1
  56. package/dist/components/sd-date-range-picker.js +1 -1
  57. package/dist/components/sd-dropdown-button.js +1 -1
  58. package/dist/components/sd-field.js +1 -1
  59. package/dist/components/sd-file-picker.js +1 -1
  60. package/dist/components/sd-ghost-button.js +1 -1
  61. package/dist/components/sd-guide.js +1 -1
  62. package/dist/components/sd-icon.js +1 -1
  63. package/dist/components/sd-input.js +1 -1
  64. package/dist/components/sd-key-value-table.js +1 -1
  65. package/dist/components/sd-loading-modal.js +1 -1
  66. package/dist/components/sd-modal-container.js +1 -1
  67. package/dist/components/sd-number-input.js +1 -1
  68. package/dist/components/sd-pagination.js +1 -1
  69. package/dist/components/sd-popover.js +1 -1
  70. package/dist/components/sd-popup.js +1 -1
  71. package/dist/components/sd-select-list-item-search.js +1 -1
  72. package/dist/components/sd-select-list-item.js +1 -1
  73. package/dist/components/sd-select-listbox.js +1 -1
  74. package/dist/components/sd-select-trigger.js +1 -1
  75. package/dist/components/sd-select.js +1 -1
  76. package/dist/components/sd-table.js +1 -1
  77. package/dist/components/sd-tabs.js +1 -1
  78. package/dist/components/sd-tag.js +1 -1
  79. package/dist/components/sd-text-link.js +1 -1
  80. package/dist/components/sd-textarea.js +1 -1
  81. package/dist/components/sd-thead.js +1 -1
  82. package/dist/components/sd-toast-container.js +1 -1
  83. package/dist/components/sd-toast.js +1 -1
  84. package/dist/components/sd-tooltip.js +1 -1
  85. package/dist/components/sd-tr.js +1 -1
  86. package/dist/design-system/design-system.esm.js +1 -1
  87. package/dist/design-system/p-14447dd5.entry.js +1 -0
  88. package/dist/design-system/p-4bbc894b.entry.js +1 -0
  89. package/dist/design-system/p-e7d4b78e.entry.js +1 -0
  90. package/dist/esm/design-system.js +1 -1
  91. package/dist/esm/loader.js +1 -1
  92. package/dist/esm/sd-button_2.entry.js +4 -4
  93. package/dist/esm/sd-chip-input.entry.js +41 -17
  94. package/dist/esm/sd-pagination_4.entry.js +86 -7
  95. package/dist/types/components/sd-table/constants.d.ts +1 -0
  96. package/dist/types/components/sd-table/sd-table.stories.helpers.d.ts +10 -0
  97. package/dist/types/components/sd-table/sd-thead/sd-thead.d.ts +8 -0
  98. package/hydrate/index.js +132 -28
  99. package/hydrate/index.mjs +132 -28
  100. package/package.json +1 -1
  101. package/dist/components/p-BVlg0BoC.js +0 -1
  102. package/dist/components/p-BzsHwLh6.js +0 -1
  103. package/dist/design-system/p-0f35cd21.entry.js +0 -1
  104. package/dist/design-system/p-4e44b45b.entry.js +0 -1
  105. package/dist/design-system/p-fe5b8eaa.entry.js +0 -1
package/hydrate/index.js CHANGED
@@ -5785,22 +5785,22 @@ const CancelOutline = (props) => {
5785
5785
 
5786
5786
  const CaretDown = (props) => {
5787
5787
  const { size = 24, ...rest } = props;
5788
- return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M11.8033 17.754L2.72757 6.40942C2.59557 6.24442 2.71304 6 2.92435 6H21.0757C21.287 6 21.4045 6.24442 21.2725 6.40942L12.1968 17.754C12.0959 17.8801 11.9041 17.8801 11.8033 17.754Z", fill: "currentColor", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round" })));
5788
+ return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M19.2188 8.25C19.9555 8.25 20.2813 9.44246 19.7061 10.0342L12.4874 17.46C12.2028 17.7526 11.7974 17.7526 11.5127 17.46L4.294 10.0342C3.71879 9.44247 4.04461 8.25 4.7813 8.25H19.2188Z", fill: "currentColor" })));
5789
5789
  };
5790
5790
 
5791
5791
  const CaretLeft = (props) => {
5792
5792
  const { size = 24, ...rest } = props;
5793
- return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M6.24594 12.1968L17.5905 21.2725C17.7555 21.4045 18 21.287 18 21.0757V2.92435C18 2.71304 17.7555 2.59557 17.5905 2.72757L6.24594 11.8033C6.11984 11.9041 6.11984 12.0959 6.24594 12.1968Z", fill: "currentColor", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round" })));
5793
+ return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M14.1423 4.29416C14.7698 3.71888 16.0358 4.04475 16.0358 4.78146V19.219C16.0358 19.9557 14.7698 20.2815 14.1423 19.7063L6.26827 12.4865C5.95813 12.2019 5.95791 11.7975 6.26827 11.5129L14.1423 4.29416Z", fill: "currentColor" })));
5794
5794
  };
5795
5795
 
5796
5796
  const CaretRight = (props) => {
5797
5797
  const { size = 24, ...rest } = props;
5798
- return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M17.754 12.1968L6.40942 21.2725C6.24442 21.4045 6 21.287 6 21.0757L6 2.92435C6 2.71304 6.24442 2.59557 6.40942 2.72757L17.754 11.8033C17.8801 11.9041 17.8801 12.0959 17.754 12.1968Z", fill: "currentColor", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round" })));
5798
+ return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M8.25 4.78127C8.25 4.04456 9.44248 3.71871 10.0342 4.29397L17.46 11.5127C17.7526 11.7973 17.7526 12.2027 17.46 12.4873L10.0342 19.7061C9.44249 20.2814 8.25 19.9555 8.25 19.2188V4.78127Z", fill: "currentColor" })));
5799
5799
  };
5800
5800
 
5801
5801
  const CaretUp = (props) => {
5802
5802
  const { size = 24, ...rest } = props;
5803
- return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M11.8033 6.24594L2.72757 17.5905C2.59557 17.7555 2.71304 18 2.92435 18H21.0757C21.287 18 21.4045 17.7555 21.2725 17.5905L12.1968 6.24594C12.0959 6.11984 11.9041 6.11984 11.8033 6.24594Z", fill: "currentColor", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round" })));
5803
+ return (hAsync("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...rest }, hAsync("path", { d: "M11.6252 6.44362C11.8583 6.27919 12.1422 6.27906 12.3752 6.44362L12.4865 6.5403L19.7063 13.9651C20.2815 14.5568 19.9557 15.7503 19.219 15.7503H4.78146C4.04475 15.7503 3.71888 14.5568 4.29416 13.9651L11.5129 6.5403L11.6252 6.44362Z", fill: "currentColor" })));
5804
5804
  };
5805
5805
 
5806
5806
  const Check = (props) => {
@@ -8109,7 +8109,7 @@ const CHIP_INPUT_SUGGESTIONS = {
8109
8109
  emptyLineHeight: '20px',
8110
8110
  };
8111
8111
 
8112
- const sdChipInputCss = () => `sd-chip-input{display:inline-flex}sd-chip-input .sd-chip-input{position:relative;width:100%;isolation:isolate;min-height:var(--sd-chip-input-min-height);display:flex;flex-flow:row wrap;align-items:center;gap:var(--sd-chip-input-chip-gap);padding:var(--sd-chip-input-padding-y) var(--sd-chip-input-padding-x);cursor:text}sd-chip-input .sd-chip-input__reset{display:inline-flex;align-items:center;gap:var(--sd-chip-input-reset-gap);flex-shrink:0}sd-chip-input .sd-chip-input__divider{display:inline-block;width:1px;height:12px;background-color:var(--sd-chip-input-divider-color);flex-shrink:0}sd-chip-input .sd-chip-input__max-count{font-size:var(--sd-chip-input-max-count-font-size);font-weight:var(--sd-chip-input-max-count-font-weight);color:var(--sd-chip-input-max-count-color);white-space:nowrap;flex-shrink:0}sd-chip-input .sd-chip-input__field{flex:0 0 auto;display:inline-grid;grid-template-columns:minmax(0, max-content);align-items:center;min-width:1ch;max-width:100%;height:var(--sd-chip-input-field-height);box-sizing:border-box;padding:0;border:none;border-radius:0;background:transparent;overflow:hidden}sd-chip-input .sd-chip-input__field::after{content:attr(data-value);grid-area:1/1;visibility:hidden;white-space:pre;font-size:var(--sd-chip-input-field-font-size);line-height:var(--sd-chip-input-field-line-height);font-weight:var(--sd-chip-input-field-font-weight);font-family:var(--sd-chip-input-field-font-family)}sd-chip-input .sd-chip-input__field--filled{padding:0 var(--sd-chip-input-field-padding-x);border:var(--sd-chip-input-field-border-width) solid var(--sd-chip-input-field-border-color);border-radius:var(--sd-chip-input-field-radius);background:var(--sd-chip-input-field-bg)}sd-chip-input .sd-chip-input__field--empty{position:absolute;top:0;left:0;width:0;height:0;min-width:0;overflow:hidden}sd-chip-input .sd-chip-input__input{grid-area:1/1;width:100%;min-width:1ch;height:var(--sd-chip-input-field-height);margin:0;padding:0;border:none;outline:none;overflow:hidden;text-overflow:ellipsis;background:transparent;font-size:var(--sd-chip-input-field-font-size);line-height:var(--sd-chip-input-field-line-height);font-weight:var(--sd-chip-input-field-font-weight);font-family:var(--sd-chip-input-field-font-family);color:var(--sd-chip-input-field-content)}sd-chip-input .sd-chip-input__input[disabled]{cursor:not-allowed;pointer-events:none}sd-chip-input .sd-chip-input__input::placeholder{color:var(--sd-chip-input-placeholder-color)}sd-chip-input .sd-chip-input__suggestions{display:flex;flex-direction:column;box-sizing:border-box;background:white;border-radius:var(--sd-chip-input-suggestions-radius);box-shadow:2px 2px 12px 2px rgba(0, 0, 0, 0.1);max-height:var(--sd-chip-input-suggestions-max-height);min-height:0;overflow-y:auto;overflow-x:hidden;outline:none}sd-chip-input .sd-chip-input__suggestion-item{display:flex;flex-shrink:0;align-items:center;gap:var(--sd-chip-input-suggestion-gap);padding:var(--sd-chip-input-suggestion-padding-y) var(--sd-chip-input-suggestion-padding-right) var(--sd-chip-input-suggestion-padding-y) var(--sd-chip-input-suggestion-padding-x);font-size:var(--sd-chip-input-suggestion-font-size);line-height:var(--sd-chip-input-suggestion-line-height);font-weight:var(--sd-chip-input-suggestion-font-weight);font-family:var(--sd-chip-input-suggestion-font-family);color:var(--sd-chip-input-suggestion-color);cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}sd-chip-input .sd-chip-input__suggestion-item--active{background:var(--sd-chip-input-suggestion-bg-hover);color:var(--sd-chip-input-suggestion-color-hover);font-weight:var(--sd-chip-input-suggestion-font-weight-selected)}sd-chip-input .sd-chip-input__suggestions-empty{padding:12px;text-align:center;font-size:var(--sd-chip-input-suggestions-empty-font-size);line-height:var(--sd-chip-input-suggestions-empty-line-height);font-family:var(--sd-chip-input-suggestion-font-family);color:var(--sd-chip-input-suggestions-empty-color)}`;
8112
+ const sdChipInputCss = () => `sd-chip-input{display:inline-flex}sd-chip-input .sd-chip-input{position:relative;width:100%;isolation:isolate;min-height:var(--sd-chip-input-min-height);display:flex;flex-flow:row wrap;align-items:center;gap:var(--sd-chip-input-chip-gap);padding:var(--sd-chip-input-padding-y) var(--sd-chip-input-padding-x);cursor:text}sd-chip-input .sd-chip-input__reset{display:inline-flex;align-items:center;gap:var(--sd-chip-input-reset-gap);flex-shrink:0}sd-chip-input .sd-chip-input__divider{display:inline-block;width:1px;height:12px;background-color:var(--sd-chip-input-divider-color);flex-shrink:0}sd-chip-input .sd-chip-input__max-count{font-size:var(--sd-chip-input-max-count-font-size);font-weight:var(--sd-chip-input-max-count-font-weight);color:var(--sd-chip-input-max-count-color);white-space:nowrap;flex-shrink:0}sd-chip-input .sd-chip-input__field{flex:0 0 auto;display:inline-grid;grid-template-columns:minmax(0, max-content);align-items:center;min-width:1ch;max-width:100%;height:var(--sd-chip-input-field-height);box-sizing:border-box;padding:0;border:none;border-radius:0;background:transparent;overflow:hidden}sd-chip-input .sd-chip-input__field::after{content:attr(data-value);grid-area:1/1;visibility:hidden;white-space:pre;font-size:var(--sd-chip-input-field-font-size);line-height:var(--sd-chip-input-field-line-height);font-weight:var(--sd-chip-input-field-font-weight);font-family:var(--sd-chip-input-field-font-family)}sd-chip-input .sd-chip-input__field--filled{padding:0 var(--sd-chip-input-field-padding-x);border:var(--sd-chip-input-field-border-width) solid var(--sd-chip-input-field-border-color);border-radius:var(--sd-chip-input-field-radius);background:var(--sd-chip-input-field-bg)}sd-chip-input .sd-chip-input__field--empty{position:absolute;top:0;left:0;width:0;height:0;min-width:0;overflow:hidden}sd-chip-input .sd-chip-input__input{grid-area:1/1;width:100%;min-width:1ch;height:var(--sd-chip-input-field-height);margin:0;padding:0;border:none;outline:none;overflow:hidden;text-overflow:ellipsis;background:transparent;font-size:var(--sd-chip-input-field-font-size);line-height:var(--sd-chip-input-field-line-height);font-weight:var(--sd-chip-input-field-font-weight);font-family:var(--sd-chip-input-field-font-family);color:var(--sd-chip-input-field-content)}sd-chip-input .sd-chip-input__input[disabled]{cursor:not-allowed;pointer-events:none}sd-chip-input .sd-chip-input__input::placeholder{color:var(--sd-chip-input-placeholder-color)}sd-chip-input .sd-chip-input__suggestions{display:flex;flex-direction:column;box-sizing:border-box;background:white;border-radius:var(--sd-chip-input-suggestions-radius);box-shadow:2px 2px 12px 2px rgba(0, 0, 0, 0.1);max-height:var(--sd-chip-input-suggestions-max-height);min-height:0;overflow-y:auto;overflow-x:hidden;outline:none}sd-chip-input .sd-chip-input__suggestion-item{display:flex;flex-shrink:0;align-items:center;gap:var(--sd-chip-input-suggestion-gap);padding:var(--sd-chip-input-suggestion-padding-y) var(--sd-chip-input-suggestion-padding-right) var(--sd-chip-input-suggestion-padding-y) var(--sd-chip-input-suggestion-padding-x);font-size:var(--sd-chip-input-suggestion-font-size);line-height:var(--sd-chip-input-suggestion-line-height);font-weight:var(--sd-chip-input-suggestion-font-weight);font-family:var(--sd-chip-input-suggestion-font-family);color:var(--sd-chip-input-suggestion-color);cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}sd-chip-input .sd-chip-input__suggestion-item--active{background:var(--sd-chip-input-suggestion-bg-hover);color:var(--sd-chip-input-suggestion-color-hover);font-weight:var(--sd-chip-input-suggestion-font-weight-selected)}sd-chip-input .sd-chip-input__suggestion-item--selected{cursor:default;overflow:visible;text-overflow:unset}sd-chip-input .sd-chip-input__suggestions-empty{padding:12px;text-align:center;font-size:var(--sd-chip-input-suggestions-empty-font-size);line-height:var(--sd-chip-input-suggestions-empty-line-height);font-family:var(--sd-chip-input-suggestion-font-family);color:var(--sd-chip-input-suggestions-empty-color)}`;
8113
8113
 
8114
8114
  class SdChipInput {
8115
8115
  constructor(hostRef) {
@@ -8338,7 +8338,9 @@ class SdChipInput {
8338
8338
  }
8339
8339
  if (event.key === 'Enter' && this.activeSuggestionIndex >= 0) {
8340
8340
  event.preventDefault();
8341
- this.addChip(activeItems[this.activeSuggestionIndex]);
8341
+ const selectedItem = activeItems[this.activeSuggestionIndex];
8342
+ if (!(this.internalValues ?? []).includes(selectedItem))
8343
+ this.addChip(selectedItem);
8342
8344
  return;
8343
8345
  }
8344
8346
  }
@@ -8398,6 +8400,10 @@ class SdChipInput {
8398
8400
  };
8399
8401
  handleContainerClick = () => {
8400
8402
  if (!this.disabled) {
8403
+ // 이미 포커스된 상태에서 재클릭 시 handleFocus가 다시 실행되지 않으므로
8404
+ // suppress 플래그를 여기서 직접 해제한다.
8405
+ this.suppressRecommendations = false;
8406
+ this.suppressSuggestions = false;
8401
8407
  this.inputEl?.focus();
8402
8408
  }
8403
8409
  };
@@ -8542,7 +8548,7 @@ class SdChipInput {
8542
8548
  fontFamily: CHIP_INPUT_SUGGESTIONS.itemFontFamily,
8543
8549
  color: CHIP_INPUT_SUGGESTIONS.emptyColor,
8544
8550
  };
8545
- return (hAsync("sd-field", { key: '7135f3f1fe7c76276bcd780ba2cfdf391925a57b', name: this.name, label: this.label, labelWidth: this.labelWidth, hint: this.hint, errorMessage: this.errorMessage, rules: [this.duplicateRule, ...(this.rules ?? [])], error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, status: this.status, size: this.size, width: this.width, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), style: cssVars, onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false) }, hAsync("div", { key: '8566ae7bc3bedaf6be95f29267587c49c090e73f', class: "sd-chip-input", ref: el => (this.chipInputRef = el), onClick: this.handleContainerClick }, (this.internalValues ?? []).map((value, i) => (hAsync("sd-chip", { key: i, value: value, error: this.getChipError(i), disabled: this.getChipDisabled(i), editable: false, onSdRemove: () => this.handleChipRemove(i) }))), !isMaxReached && (hAsync("div", { key: '00d9946c93d2e961466fa8baf617fc4ddc12d701', class: {
8551
+ return (hAsync("sd-field", { key: 'b72e33b6f204ebdf6791cc2f20d01bbb74a4203a', name: this.name, label: this.label, labelWidth: this.labelWidth, hint: this.hint, errorMessage: this.errorMessage, rules: [this.duplicateRule, ...(this.rules ?? [])], error: this.error, disabled: this.disabled, focused: this.focused, hovered: this.hovered, status: this.status, size: this.size, width: this.width, icon: this.icon, labelTooltip: this.labelTooltip, labelTooltipProps: this.labelTooltipProps, ref: el => (this.formField = el), style: cssVars, onMouseEnter: () => (this.hovered = true), onMouseLeave: () => (this.hovered = false) }, hAsync("div", { key: '499114d06f4d375fed5575edd394c501f4d72691', class: "sd-chip-input", ref: el => (this.chipInputRef = el), onClick: this.handleContainerClick }, (this.internalValues ?? []).map((value, i) => (hAsync("sd-chip", { key: i, value: value, error: this.getChipError(i), disabled: this.getChipDisabled(i), editable: false, onSdRemove: () => this.handleChipRemove(i) }))), !isMaxReached && (hAsync("div", { key: '5910a2d0e0e9cbc472baa1d9c9c3fa07e89fbdcb', class: {
8546
8552
  'sd-chip-input__field': true,
8547
8553
  'sd-chip-input__field--filled': this.inputValue !== '',
8548
8554
  'sd-chip-input__field--empty': this.inputValue === '' && this.internalValues.length > 0 && !this.focused,
@@ -8550,20 +8556,38 @@ class SdChipInput {
8550
8556
  ? this.inputValue
8551
8557
  : this.internalValues.length === 0
8552
8558
  ? this.placeholder
8553
- : '' }, hAsync("input", { key: '2845394a5eaec2d5f37876a0e8938fa9d3f38263', ref: el => (this.inputEl = el), class: "sd-chip-input__input", placeholder: this.internalValues.length === 0 ? this.placeholder : '', disabled: this.disabled, size: 1, onInput: this.handleInput, onKeyDown: this.handleKeyDown, onFocus: this.handleFocus, onBlur: this.handleBlur }))), showResetArea && (hAsync("div", { key: '7cec3884a4cace3d688e80006d6240d321ac60f3', class: "sd-chip-input__reset" }, this.inputValue === '' && hAsync("span", { key: '761539e242437841a2703d95903f9d6b5fe3d69f', class: "sd-chip-input__divider" }), this.maxCount != null && (hAsync("span", { key: '1b448973ba3573c94ae09b74cd24720c8ea011d3', class: "sd-chip-input__max-count" }, "\uCD5C\uB300 ", this.maxCount, "\uAC1C")), this.useReset && this.internalValues.length > 0 && (hAsync("sd-text-link", { key: '90d7582f35b8e7a8ee3c1dba717fa87c13c1de19', icon: "reset", iconColor: CHIP_INPUT_RESET.iconColor, label: "\uC785\uB825 \uCD08\uAE30\uD654", underline: true, disabled: this.disabled, style: { '--sd-text-link-color': CHIP_INPUT_RESET.labelColor }, onSdClick: this.handleResetInput })))), showDropdown && (hAsync("sd-portal", { key: '9495c87a4916829fe955f054a8c97d2b3fa04914', open: showDropdown, parentRef: this.chipInputRef ?? null, viewportPadding: SdChipInput.SUGGESTIONS_VIEWPORT_PADDING, onSdClose: this.closeSuggestions }, hAsync("div", { key: 'ac4afd8511316f0b4b957c312a051b02fc72f20e', class: "sd-chip-input__suggestions", role: "listbox", style: suggestionBoxStyle }, isDropdownLoading && (hAsync("div", { key: '3b6855a7ad2ef48415160544a19014d59ca38ec1', class: "sd-chip-input__suggestions-empty", style: suggestionEmptyStyle }, "\uBD88\uB7EC\uC624\uB294 \uC911...")), dropdownItems.map((item, i) => (hAsync("div", { key: item, class: {
8554
- 'sd-chip-input__suggestion-item': true,
8555
- 'sd-chip-input__suggestion-item--active': i === this.activeSuggestionIndex,
8556
- }, role: "option", tabIndex: -1, "aria-selected": i === this.activeSuggestionIndex, style: i === this.activeSuggestionIndex
8557
- ? {
8558
- ...suggestionItemStyle,
8559
- background: CHIP_INPUT_SUGGESTIONS.itemBgHover,
8560
- color: CHIP_INPUT_SUGGESTIONS.itemColorHover,
8561
- fontWeight: CHIP_INPUT_SUGGESTIONS.itemFontWeightSelected,
8562
- }
8563
- : suggestionItemStyle, onMouseDown: e => {
8564
- e.preventDefault();
8565
- this.addChip(item);
8566
- } }, item)))))))));
8559
+ : '' }, hAsync("input", { key: '3c1e75d691332b67a500a2d17030d5db191bdeb9', ref: el => (this.inputEl = el), class: "sd-chip-input__input", placeholder: this.internalValues.length === 0 ? this.placeholder : '', disabled: this.disabled, size: 1, onInput: this.handleInput, onKeyDown: this.handleKeyDown, onFocus: this.handleFocus, onBlur: this.handleBlur }))), showResetArea && (
8560
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
8561
+ hAsync("div", { key: '4aa212280a928b88b85dffa3d453ea8f563e1fe0', class: "sd-chip-input__reset",
8562
+ // 리셋 버튼 클릭 input blur portal unmount refocus → 새 portal mount로
8563
+ // 두 wrapper가 body에 잠깐 겹치는 타이밍 이슈를 방지한다.
8564
+ onMouseDown: e => e.preventDefault() }, this.inputValue === '' && hAsync("span", { key: 'f7faa45b57d8e38dda8cc98119357f92d914fee4', class: "sd-chip-input__divider" }), this.maxCount != null && (hAsync("span", { key: 'dfde4ea82558414614fb2d817f7bfa1fb5d4bf5f', class: "sd-chip-input__max-count" }, "\uCD5C\uB300 ", this.maxCount, "\uAC1C")), this.useReset && this.internalValues.length > 0 && (hAsync("sd-text-link", { key: '9b43c82c1a5d425e5b187e92b4259e7d919491e3', icon: "reset", iconColor: CHIP_INPUT_RESET.iconColor, label: "\uC785\uB825 \uCD08\uAE30\uD654", underline: true, disabled: this.disabled, style: { '--sd-text-link-color': CHIP_INPUT_RESET.labelColor }, onSdClick: this.handleResetInput })))), showDropdown && (hAsync("sd-portal", { key: 'aa205aacbbafcd8c3d9855268637e6da956d4a74', open: showDropdown, parentRef: this.chipInputRef ?? null, viewportPadding: SdChipInput.SUGGESTIONS_VIEWPORT_PADDING, onSdClose: this.closeSuggestions }, hAsync("div", { key: '26814734f202da3a13e695ae1d0c913ea430b888', class: "sd-chip-input__suggestions", role: "listbox", style: suggestionBoxStyle }, isDropdownLoading && (hAsync("div", { key: 'df80d11b79f67dc6cfe6503b258528efa3752265', class: "sd-chip-input__suggestions-empty", style: suggestionEmptyStyle }, "\uBD88\uB7EC\uC624\uB294 \uC911...")), dropdownItems.map((item, i) => {
8565
+ const isSelected = (this.internalValues ?? []).includes(item);
8566
+ const isActive = i === this.activeSuggestionIndex && !isSelected;
8567
+ return (hAsync("div", { key: item, class: {
8568
+ 'sd-chip-input__suggestion-item': true,
8569
+ 'sd-chip-input__suggestion-item--active': isActive,
8570
+ 'sd-chip-input__suggestion-item--selected': isSelected,
8571
+ }, role: "option", tabIndex: -1, "aria-selected": isSelected || isActive, "aria-disabled": isSelected ? 'true' : undefined, style: isSelected
8572
+ ? {
8573
+ ...suggestionItemStyle,
8574
+ color: '#0075FF',
8575
+ fontWeight: CHIP_INPUT_SUGGESTIONS.itemFontWeightSelected,
8576
+ cursor: 'default',
8577
+ }
8578
+ : isActive
8579
+ ? {
8580
+ ...suggestionItemStyle,
8581
+ background: CHIP_INPUT_SUGGESTIONS.itemBgHover,
8582
+ color: CHIP_INPUT_SUGGESTIONS.itemColorHover,
8583
+ fontWeight: CHIP_INPUT_SUGGESTIONS.itemFontWeightSelected,
8584
+ }
8585
+ : suggestionItemStyle, onMouseDown: e => {
8586
+ e.preventDefault();
8587
+ if (!isSelected)
8588
+ this.addChip(item);
8589
+ } }, hAsync("span", { style: { flex: '1' } }, item), isSelected && (hAsync("sd-icon", { name: "check", size: "12", style: { color: '#0075FF', flexShrink: '0' } }))));
8590
+ })))))));
8567
8591
  }
8568
8592
  static get watchers() { return {
8569
8593
  "values": [{
@@ -18307,7 +18331,7 @@ class SdTextarea {
18307
18331
  }; }
18308
18332
  }
18309
18333
 
18310
- const sdTheadCss = () => `sd-thead{display:contents}sd-thead *{box-sizing:border-box}.thead{display:table-header-group;height:var(--table-header-height, 36px)}.thead--sticky{position:sticky;top:0;z-index:120}.tr{display:table-row;width:100%}.th{display:table-cell;background:var(--table-header-bg, #F5FAFF);height:var(--table-header-height, 36px);padding:0 var(--table-header-padding-x, 16px);font-family:var(--table-header-font-family, inherit);font-weight:var(--table-header-font-weight, 500);font-size:var(--table-header-font-size, 12px);line-height:var(--table-header-line-height, 20px);text-decoration:var(--table-header-text-decoration, none);vertical-align:middle;border-bottom:var(--table-border-width, 1px) solid var(--table-border-color, #E1E1E1);-webkit-user-select:none;user-select:none;position:relative;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.th--selected{position:relative;width:var(--table-selectable-width, 48px) !important;max-width:var(--table-selectable-width, 48px) !important;min-width:var(--table-selectable-width, 48px) !important;text-align:center}.th--selected sd-checkbox label{position:relative}.th--selected sd-checkbox label:before{content:"";position:absolute;inset:-6px}.th.sticky-left{position:sticky;background-color:var(--table-header-bg, #F5FAFF);z-index:110 !important;left:var(--sticky-left-offset, 0)}.th.sticky-right{position:sticky;background-color:var(--table-header-bg, #F5FAFF);z-index:110 !important;right:var(--sticky-right-offset, 0)}.th.sticky-left-edge:after{content:"";position:absolute;top:0;left:100%;right:-20px;width:20px;height:100%;z-index:101 !important;box-shadow:inset 12px 0 20px -25px;opacity:0;pointer-events:none;transition:opacity 0.2s}.th.sticky-right-edge:after{content:"";position:absolute;top:0;left:-20px;width:20px;height:100%;z-index:101 !important;box-shadow:inset -12px 0 20px -25px;opacity:0;pointer-events:none;transition:opacity 0.2s}.th.sticky-left-edge.is-scrolled-left{overflow:visible}.th.sticky-left-edge.is-scrolled-left:after{opacity:1}.th.sticky-right-edge.is-scrolled-right{overflow:visible}.th.sticky-right-edge.is-scrolled-right:after{opacity:1}.th__content{display:flex;flex-flow:row nowrap;align-items:center;gap:var(--table-header-gap, 4px)}.th__content--left{justify-content:flex-start}.th__content--center{justify-content:center}.th__content--right{justify-content:flex-end}.th__content--label{white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.th__bar{position:absolute;top:50%;right:0;transform:translateY(-50%);width:var(--table-border-width, 1px);height:var(--table-header-resizer-height, 16px);z-index:3;background-color:var(--table-header-resizer-color, #CCCCCC)}.th__resizer{position:absolute;top:50%;right:0;transform:translateY(-50%);width:4px;height:var(--table-header-resizer-height, 16px);cursor:col-resize;z-index:3;border-left:var(--table-border-width, 1px) solid var(--table-header-resizer-color, #CCCCCC);border-right:var(--table-border-width, 1px) solid var(--table-header-resizer-color, #CCCCCC)}.th__resizer--left{right:auto;left:0}`;
18334
+ const sdTheadCss = () => `sd-thead{display:contents}sd-thead *{box-sizing:border-box}.thead{display:table-header-group;height:var(--table-header-height, 36px)}.thead--sticky{position:sticky;top:0;z-index:120}.tr{display:table-row;width:100%}.th{display:table-cell;background:var(--table-header-bg, #F5FAFF);height:var(--table-header-height, 36px);padding:0 var(--table-header-padding-x, 16px);font-family:var(--table-header-font-family, inherit);font-weight:var(--table-header-font-weight, 500);font-size:var(--table-header-font-size, 12px);line-height:var(--table-header-line-height, 20px);text-decoration:var(--table-header-text-decoration, none);vertical-align:middle;border-bottom:var(--table-border-width, 1px) solid var(--table-border-color, #E1E1E1);-webkit-user-select:none;user-select:none;position:relative;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.th--selected{position:relative;width:var(--table-selectable-width, 48px) !important;max-width:var(--table-selectable-width, 48px) !important;min-width:var(--table-selectable-width, 48px) !important;text-align:center}.th--selected sd-checkbox label{position:relative}.th--selected sd-checkbox label:before{content:"";position:absolute;inset:-6px}.th.sticky-left{position:sticky;background-color:var(--table-header-bg, #F5FAFF);z-index:110 !important;left:var(--sticky-left-offset, 0)}.th.sticky-right{position:sticky;background-color:var(--table-header-bg, #F5FAFF);z-index:110 !important;right:var(--sticky-right-offset, 0)}.th.sticky-left-edge:after{content:"";position:absolute;top:0;left:100%;right:-20px;width:20px;height:100%;z-index:101 !important;box-shadow:inset 12px 0 20px -25px;opacity:0;pointer-events:none;transition:opacity 0.2s}.th.sticky-right-edge:after{content:"";position:absolute;top:0;left:-20px;width:20px;height:100%;z-index:101 !important;box-shadow:inset -12px 0 20px -25px;opacity:0;pointer-events:none;transition:opacity 0.2s}.th.sticky-left-edge.is-scrolled-left{overflow:visible}.th.sticky-left-edge.is-scrolled-left:after{opacity:1}.th.sticky-right-edge.is-scrolled-right{overflow:visible}.th.sticky-right-edge.is-scrolled-right:after{opacity:1}.th__content{display:flex;flex-flow:row nowrap;align-items:center;gap:var(--table-header-gap, 4px)}.th__content--left{justify-content:flex-start}.th__content--center{justify-content:center}.th__content--right{justify-content:flex-end}.th__content--label{white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.th__bar{position:absolute;top:50%;right:0;transform:translateY(-50%);width:var(--table-border-width, 1px);height:var(--table-header-resizer-height, 16px);z-index:3;background-color:var(--table-header-resizer-color, #CCCCCC)}.th__dropdown-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:16px;height:16px;padding:0;border:none;background:transparent;cursor:pointer;color:inherit;border-radius:2px}.th__dropdown-trigger sd-icon{transition:transform 0.15s ease}.th__dropdown-trigger--open sd-icon{transform:rotate(180deg)}.th__resizer{position:absolute;top:50%;right:0;transform:translateY(-50%);width:4px;height:var(--table-header-resizer-height, 16px);cursor:col-resize;z-index:3;border-left:var(--table-border-width, 1px) solid var(--table-header-resizer-color, #CCCCCC);border-right:var(--table-border-width, 1px) solid var(--table-header-resizer-color, #CCCCCC)}.th__resizer--left{right:auto;left:0}`;
18311
18335
 
18312
18336
  class SdThead {
18313
18337
  constructor(hostRef) {
@@ -18343,14 +18367,29 @@ class SdThead {
18343
18367
  _stickyHeader = false;
18344
18368
  _scrolledLeft = false;
18345
18369
  _scrolledRight = false;
18370
+ dropdownOpenMap = {};
18346
18371
  tableEl = null;
18372
+ dropdownRefs = {};
18373
+ dropdownThRefs = {};
18374
+ dropdownPortals = {};
18347
18375
  handleColumnsChange(newCols) {
18348
18376
  if (Array.isArray(newCols) && (this.columnWidths ?? []).length === 0) {
18349
18377
  this.columnWidths = newCols.map(c => (c.autoWidth ? 0 : parseInt(c.width || '120', 10)));
18350
18378
  }
18351
18379
  }
18380
+ disconnectedCallback() {
18381
+ const portals = this.dropdownPortals ?? {};
18382
+ Object.values(portals).forEach(portal => {
18383
+ if (portal?.parentNode != null)
18384
+ portal.parentNode.removeChild(portal);
18385
+ });
18386
+ }
18352
18387
  componentWillLoad() {
18353
18388
  this.syncTableContext();
18389
+ this.dropdownOpenMap = this.dropdownOpenMap ?? {};
18390
+ this.dropdownRefs = this.dropdownRefs ?? {};
18391
+ this.dropdownThRefs = this.dropdownThRefs ?? {};
18392
+ this.dropdownPortals = this.dropdownPortals ?? {};
18354
18393
  this.columnWidths = Array.isArray(this.columnWidths) ? this.columnWidths : [];
18355
18394
  this.resolveConfig();
18356
18395
  if ((this.columnWidths ?? []).length === 0) {
@@ -18360,6 +18399,36 @@ class SdThead {
18360
18399
  componentDidLoad() {
18361
18400
  this.syncTableContext();
18362
18401
  this.resolveConfig();
18402
+ this.initDropdownPortals();
18403
+ }
18404
+ // sd-portal을 body에 붙여 CSS transform 영향 없이 정확한 위치에 패널을 표시한다.
18405
+ // <slot>을 render에 두지 않고 직접 DOM 이동(slot 속성 제거)으로 Stencil 슬롯 에뮬레이션 충돌을 피한다.
18406
+ initDropdownPortals() {
18407
+ const cols = this._columns ?? [];
18408
+ const hasDropdownCols = cols.filter(c => c.hasDropdown === true);
18409
+ if (hasDropdownCols.length === 0)
18410
+ return;
18411
+ for (const col of hasDropdownCols) {
18412
+ const colName = col.name;
18413
+ // 이미 포탈이 생성된 컬럼은 건너뜀 (refreshConfig 재호출 대비)
18414
+ if ((this.dropdownPortals ?? {})[colName] != null)
18415
+ continue;
18416
+ const slotContent = this.el.querySelector(`[slot="dropdown-${colName}"]`);
18417
+ if (slotContent == null)
18418
+ continue;
18419
+ // slot 속성 제거: Stencil 슬롯 에뮬레이션이 재배포하지 못하게 한다
18420
+ slotContent.removeAttribute('slot');
18421
+ const portal = document.createElement('sd-portal');
18422
+ portal.parentRef = this.dropdownThRefs[colName] ?? null;
18423
+ portal.open = false;
18424
+ // 첫 open 전까지 포탈 호스트 자체를 숨긴다.
18425
+ // moveSlotContent()가 open=true 시 children을 독립 wrapper div로 이동하므로 이후 동작에 영향 없음.
18426
+ portal.style.display = 'none';
18427
+ portal.addEventListener('sdClose', () => this.closeDropdown(colName));
18428
+ portal.appendChild(slotContent);
18429
+ document.body.appendChild(portal);
18430
+ this.dropdownPortals[colName] = portal;
18431
+ }
18363
18432
  }
18364
18433
  syncTableContext() {
18365
18434
  // sd-table이 shadow:true이므로 fallback content로 렌더되면 closest가 경계를 못 넘는다.
@@ -18402,6 +18471,7 @@ class SdThead {
18402
18471
  /** 테이블 설정을 다시 불러옵니다. */
18403
18472
  async refreshConfig() {
18404
18473
  this.resolveConfig();
18474
+ this.initDropdownPortals();
18405
18475
  }
18406
18476
  /** 컬럼 너비를 업데이트합니다. */
18407
18477
  async setColumnWidths(widths) {
@@ -18446,6 +18516,28 @@ class SdThead {
18446
18516
  handleColumnSort = (col) => {
18447
18517
  this.sdColumnSort.emit({ column: col });
18448
18518
  };
18519
+ toggleDropdown(name) {
18520
+ const isOpen = this.dropdownOpenMap[name] !== true;
18521
+ const portals = this.dropdownPortals ?? {};
18522
+ const newMap = { ...this.dropdownOpenMap };
18523
+ // _columns 기준으로 순회: portals가 비어도 dropdownOpenMap은 항상 갱신됨
18524
+ for (const col of (this._columns ?? []).filter(c => c.hasDropdown === true)) {
18525
+ const shouldBeOpen = col.name === name ? isOpen : false;
18526
+ newMap[col.name] = shouldBeOpen;
18527
+ const portal = portals[col.name];
18528
+ if (portal != null)
18529
+ portal.open = shouldBeOpen;
18530
+ }
18531
+ this.dropdownOpenMap = newMap;
18532
+ }
18533
+ closeDropdown(name) {
18534
+ if (this.dropdownOpenMap[name] !== true)
18535
+ return;
18536
+ this.dropdownOpenMap = { ...this.dropdownOpenMap, [name]: false };
18537
+ const portal = (this.dropdownPortals ?? {})[name];
18538
+ if (portal != null)
18539
+ portal.open = false;
18540
+ }
18449
18541
  handleSelectAll(checked) {
18450
18542
  const nextChecked = !!checked;
18451
18543
  const safeRows = Array.isArray(this.rows) ? this.rows : [];
@@ -18462,6 +18554,8 @@ class SdThead {
18462
18554
  }
18463
18555
  render() {
18464
18556
  const safeRows = Array.isArray(this.rows) ? this.rows : [];
18557
+ const dropdownOpenMap = this.dropdownOpenMap ?? {};
18558
+ const dropdownRefs = this.dropdownRefs ?? {};
18465
18559
  const stickyLeftCount = this._stickyColumn.left || 0;
18466
18560
  const stickyRightCount = this._stickyColumn.right || 0;
18467
18561
  const stickyLeftCols = this.visibleColumns.slice(0, stickyLeftCount);
@@ -18483,22 +18577,25 @@ class SdThead {
18483
18577
  '--table-border-color': TABLE_BORDER.color,
18484
18578
  '--table-border-width': `${TABLE_BORDER.width}px`,
18485
18579
  };
18486
- return (hAsync(Host, { key: '26981191de95775401cad61e80fbf1e22cb0250b', slot: `${this.tableId}-head`, style: headStyle }, hAsync("thead", { key: 'a53d430f1b71a45b98de2912b563d3f17cd20b24', class: {
18580
+ return (hAsync(Host, { key: '947f5e5b0e59e7e6f8a73e4fd44dbfa646cb630a', slot: `${this.tableId}-head`, style: headStyle }, hAsync("thead", { key: '2e0ffbfe9d96528c6e0082d4883fa462a18831d6', class: {
18487
18581
  'thead': true,
18488
18582
  'thead--sticky': this._stickyHeader,
18489
- } }, hAsync("tr", { key: '27ce13b70bfda4b210b36eb746fb60d369d9f5be', class: "tr" }, this._selectable && (hAsync("th", { key: 'e353b00c7a02b82781e5107b1fd73dc556427edf', class: {
18583
+ } }, hAsync("tr", { key: '5843a18e1548bc6546e447d4c9213375116af0e9', class: "tr" }, this._selectable && (hAsync("th", { key: '914024ca35874747e39f1819337cd4ad1cbe733d', class: {
18490
18584
  'th': true,
18491
18585
  'th--selected': true,
18492
18586
  'sticky-left': true,
18493
18587
  'sticky-left-edge': stickyLeftCount === 0,
18494
18588
  'is-scrolled-left': stickyLeftCount === 0 && this._scrolledLeft,
18495
- }, style: { '--sticky-left-offset': '0px' } }, hAsync("sd-checkbox", { key: '18eeabbcc4fc10196d6448bd9d0493b55778f9f1', value: this.getIsAllChecked(), disabled: safeRows.length === 0, onSdUpdate: (e) => this.handleSelectAll(e.detail) }), hAsync("div", { key: '1a5a0561fc94be53a8244827ac9ae4f98fa766c2', class: "th__bar" }))), stickyLeftCols.map((col, idx) => (hAsync("th", { key: col.name, class: {
18589
+ }, style: { '--sticky-left-offset': '0px' } }, hAsync("sd-checkbox", { key: 'e07232f1f5fa02589573ddaae53ebdadbdb97674', value: this.getIsAllChecked(), disabled: safeRows.length === 0, onSdUpdate: (e) => this.handleSelectAll(e.detail) }), hAsync("div", { key: '08b504cfd4f420e76e91d649eed28c7068517044', class: "th__bar" }))), stickyLeftCols.map((col, idx) => (hAsync("th", { key: col.name, class: {
18496
18590
  'th': true,
18497
18591
  [`${col.thClass}`]: Boolean(col.thClass),
18498
18592
  'sticky-left': true,
18499
18593
  'sticky-left-edge': idx === stickyLeftCount - 1,
18500
18594
  'is-scrolled-left': idx === stickyLeftCount - 1 && this._scrolledLeft,
18501
- }, style: { ...col.thStyle, ...this.getStickyStyle(idx) } }, hAsync("div", { class: `th__content th__content--${col.align || 'left'}` }, hAsync("div", { class: "th__content--label" }, col.label), col.icon && (hAsync("sd-icon", { name: col.icon, size: "12", color: resolveTableIconColor(col.icon, col.iconColor) })), col.sort && (hAsync("sd-icon", { name: resolveSortIconName(col.sort), size: "12", color: resolveTableIconColor(resolveSortIconName(col.sort), col.iconColor), onClick: () => this.handleColumnSort(col), style: { cursor: 'pointer' } })), col.tooltip && (hAsync("sd-tooltip", { ...col.tooltipOptions }, hAsync("div", { slot: "content" }, col.tooltip.map(text => (hAsync("p", null, text))))))), this._resizable && idx !== lastColIdx && (
18595
+ }, style: { ...col.thStyle, ...this.getStickyStyle(idx) }, ref: col.hasDropdown === true ? (el => { this.dropdownThRefs[col.name] = el; }) : undefined }, hAsync("div", { class: `th__content th__content--${col.align || 'left'}` }, hAsync("div", { class: "th__content--label" }, col.label), col.icon && (hAsync("sd-icon", { name: col.icon, size: "12", color: resolveTableIconColor(col.icon, col.iconColor) })), col.sort && (hAsync("sd-icon", { name: resolveSortIconName(col.sort), size: "12", color: resolveTableIconColor(resolveSortIconName(col.sort), col.iconColor), onClick: () => this.handleColumnSort(col), style: { cursor: 'pointer' } })), col.tooltip && (hAsync("sd-tooltip", { ...col.tooltipOptions }, hAsync("div", { slot: "content" }, col.tooltip.map(text => (hAsync("p", null, text)))))), col.hasDropdown === true && (hAsync("button", { class: {
18596
+ 'th__dropdown-trigger': true,
18597
+ 'th__dropdown-trigger--open': dropdownOpenMap[col.name] === true,
18598
+ }, ref: el => { dropdownRefs[col.name] = el; }, onClick: () => this.toggleDropdown(col.name), "aria-haspopup": "listbox", "aria-expanded": dropdownOpenMap[col.name] === true ? 'true' : 'false' }, hAsync("sd-icon", { name: "chevronDown", size: "12" })))), this._resizable && idx !== lastColIdx && (
18502
18599
  // column resize 는 마우스 드래그 전용 인터랙션이라 키보드 핸들러를 두지 않는다.
18503
18600
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
18504
18601
  hAsync("div", { class: "th__resizer", onMouseDown: (evt) => this.handleResize(idx, evt) }))))), middleCols.map((col, relativeIdx) => {
@@ -18506,7 +18603,10 @@ class SdThead {
18506
18603
  return (hAsync("th", { key: col.name, class: {
18507
18604
  th: true,
18508
18605
  [`${col.thClass}`]: Boolean(col.thClass),
18509
- }, style: { ...col.thStyle, ...this.getStickyStyle(actualColIdx) } }, hAsync("div", { class: `th__content th__content--${col.align || 'left'}` }, hAsync("div", { class: "th__content--label" }, col.label), col.icon && (hAsync("sd-icon", { name: col.icon, size: "12", color: resolveTableIconColor(col.icon, col.iconColor) })), col.sort && (hAsync("sd-icon", { name: resolveSortIconName(col.sort), size: "12", color: resolveTableIconColor(resolveSortIconName(col.sort), col.iconColor), onClick: () => this.handleColumnSort(col), style: { cursor: 'pointer' } })), col.tooltip && (hAsync("sd-tooltip", { ...col.tooltipOptions }, hAsync("div", { slot: "content" }, col.tooltip.map(text => (hAsync("p", null, text))))))), this._resizable && actualColIdx !== lastColIdx && (
18606
+ }, style: { ...col.thStyle, ...this.getStickyStyle(actualColIdx) }, ref: col.hasDropdown === true ? (el => { this.dropdownThRefs[col.name] = el; }) : undefined }, hAsync("div", { class: `th__content th__content--${col.align || 'left'}` }, hAsync("div", { class: "th__content--label" }, col.label), col.icon && (hAsync("sd-icon", { name: col.icon, size: "12", color: resolveTableIconColor(col.icon, col.iconColor) })), col.sort && (hAsync("sd-icon", { name: resolveSortIconName(col.sort), size: "12", color: resolveTableIconColor(resolveSortIconName(col.sort), col.iconColor), onClick: () => this.handleColumnSort(col), style: { cursor: 'pointer' } })), col.tooltip && (hAsync("sd-tooltip", { ...col.tooltipOptions }, hAsync("div", { slot: "content" }, col.tooltip.map(text => (hAsync("p", null, text)))))), col.hasDropdown === true && (hAsync("button", { class: {
18607
+ 'th__dropdown-trigger': true,
18608
+ 'th__dropdown-trigger--open': this.dropdownOpenMap[col.name] === true,
18609
+ }, ref: el => { this.dropdownRefs[col.name] = el; }, onClick: () => this.toggleDropdown(col.name), "aria-haspopup": "listbox", "aria-expanded": this.dropdownOpenMap[col.name] === true ? 'true' : 'false' }, hAsync("sd-icon", { name: "chevronDown", size: "12" })))), this._resizable && actualColIdx !== lastColIdx && (
18510
18610
  // column resize 는 마우스 드래그 전용 인터랙션이라 키보드 핸들러를 두지 않는다.
18511
18611
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
18512
18612
  hAsync("div", { class: "th__resizer", onMouseDown: (evt) => this.handleResize(actualColIdx, evt) }))));
@@ -18518,7 +18618,10 @@ class SdThead {
18518
18618
  'sticky-right': true,
18519
18619
  'sticky-right-edge': relativeIdx === 0,
18520
18620
  'is-scrolled-right': relativeIdx === 0 && this._scrolledRight,
18521
- }, style: { ...col.thStyle, ...this.getStickyStyle(actualColIdx) } }, hAsync("div", { class: `th__content th__content--${col.align || 'left'}` }, hAsync("div", { class: "th__content--label" }, col.label), col.icon && (hAsync("sd-icon", { name: col.icon, size: "12", color: resolveTableIconColor(col.icon, col.iconColor) })), col.sort && (hAsync("sd-icon", { name: resolveSortIconName(col.sort), size: "12", color: resolveTableIconColor(resolveSortIconName(col.sort), col.iconColor), onClick: () => this.handleColumnSort(col), style: { cursor: 'pointer' } })), col.tooltip && (hAsync("sd-tooltip", { ...col.tooltipOptions }, hAsync("div", { slot: "content" }, col.tooltip.map(text => (hAsync("p", null, text))))))), this._resizable && (
18621
+ }, style: { ...col.thStyle, ...this.getStickyStyle(actualColIdx) }, ref: col.hasDropdown === true ? (el => { this.dropdownThRefs[col.name] = el; }) : undefined }, hAsync("div", { class: `th__content th__content--${col.align || 'left'}` }, hAsync("div", { class: "th__content--label" }, col.label), col.icon && (hAsync("sd-icon", { name: col.icon, size: "12", color: resolveTableIconColor(col.icon, col.iconColor) })), col.sort && (hAsync("sd-icon", { name: resolveSortIconName(col.sort), size: "12", color: resolveTableIconColor(resolveSortIconName(col.sort), col.iconColor), onClick: () => this.handleColumnSort(col), style: { cursor: 'pointer' } })), col.tooltip && (hAsync("sd-tooltip", { ...col.tooltipOptions }, hAsync("div", { slot: "content" }, col.tooltip.map(text => (hAsync("p", null, text)))))), col.hasDropdown === true && (hAsync("button", { class: {
18622
+ 'th__dropdown-trigger': true,
18623
+ 'th__dropdown-trigger--open': this.dropdownOpenMap[col.name] === true,
18624
+ }, ref: el => { this.dropdownRefs[col.name] = el; }, onClick: () => this.toggleDropdown(col.name), "aria-haspopup": "listbox", "aria-expanded": this.dropdownOpenMap[col.name] === true ? 'true' : 'false' }, hAsync("sd-icon", { name: "chevronDown", size: "12" })))), this._resizable && (
18522
18625
  // column resize 는 마우스 드래그 전용 인터랙션이라 키보드 핸들러를 두지 않는다.
18523
18626
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
18524
18627
  hAsync("div", { class: "th__resizer th__resizer--left", onMouseDown: (evt) => this.handleResize(actualColIdx, evt, true) }))));
@@ -18551,6 +18654,7 @@ class SdThead {
18551
18654
  "_stickyHeader": [32],
18552
18655
  "_scrolledLeft": [32],
18553
18656
  "_scrolledRight": [32],
18657
+ "dropdownOpenMap": [32],
18554
18658
  "refreshConfig": [64],
18555
18659
  "setColumnWidths": [64],
18556
18660
  "refreshSelection": [64]