@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.mjs CHANGED
@@ -5783,22 +5783,22 @@ const CancelOutline = (props) => {
5783
5783
 
5784
5784
  const CaretDown = (props) => {
5785
5785
  const { size = 24, ...rest } = props;
5786
- 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" })));
5786
+ 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" })));
5787
5787
  };
5788
5788
 
5789
5789
  const CaretLeft = (props) => {
5790
5790
  const { size = 24, ...rest } = props;
5791
- 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" })));
5791
+ 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" })));
5792
5792
  };
5793
5793
 
5794
5794
  const CaretRight = (props) => {
5795
5795
  const { size = 24, ...rest } = props;
5796
- 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" })));
5796
+ 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" })));
5797
5797
  };
5798
5798
 
5799
5799
  const CaretUp = (props) => {
5800
5800
  const { size = 24, ...rest } = props;
5801
- 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" })));
5801
+ 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" })));
5802
5802
  };
5803
5803
 
5804
5804
  const Check = (props) => {
@@ -8107,7 +8107,7 @@ const CHIP_INPUT_SUGGESTIONS = {
8107
8107
  emptyLineHeight: '20px',
8108
8108
  };
8109
8109
 
8110
- 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)}`;
8110
+ 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)}`;
8111
8111
 
8112
8112
  class SdChipInput {
8113
8113
  constructor(hostRef) {
@@ -8336,7 +8336,9 @@ class SdChipInput {
8336
8336
  }
8337
8337
  if (event.key === 'Enter' && this.activeSuggestionIndex >= 0) {
8338
8338
  event.preventDefault();
8339
- this.addChip(activeItems[this.activeSuggestionIndex]);
8339
+ const selectedItem = activeItems[this.activeSuggestionIndex];
8340
+ if (!(this.internalValues ?? []).includes(selectedItem))
8341
+ this.addChip(selectedItem);
8340
8342
  return;
8341
8343
  }
8342
8344
  }
@@ -8396,6 +8398,10 @@ class SdChipInput {
8396
8398
  };
8397
8399
  handleContainerClick = () => {
8398
8400
  if (!this.disabled) {
8401
+ // 이미 포커스된 상태에서 재클릭 시 handleFocus가 다시 실행되지 않으므로
8402
+ // suppress 플래그를 여기서 직접 해제한다.
8403
+ this.suppressRecommendations = false;
8404
+ this.suppressSuggestions = false;
8399
8405
  this.inputEl?.focus();
8400
8406
  }
8401
8407
  };
@@ -8540,7 +8546,7 @@ class SdChipInput {
8540
8546
  fontFamily: CHIP_INPUT_SUGGESTIONS.itemFontFamily,
8541
8547
  color: CHIP_INPUT_SUGGESTIONS.emptyColor,
8542
8548
  };
8543
- 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: {
8549
+ 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: {
8544
8550
  'sd-chip-input__field': true,
8545
8551
  'sd-chip-input__field--filled': this.inputValue !== '',
8546
8552
  'sd-chip-input__field--empty': this.inputValue === '' && this.internalValues.length > 0 && !this.focused,
@@ -8548,20 +8554,38 @@ class SdChipInput {
8548
8554
  ? this.inputValue
8549
8555
  : this.internalValues.length === 0
8550
8556
  ? this.placeholder
8551
- : '' }, 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: {
8552
- 'sd-chip-input__suggestion-item': true,
8553
- 'sd-chip-input__suggestion-item--active': i === this.activeSuggestionIndex,
8554
- }, role: "option", tabIndex: -1, "aria-selected": i === this.activeSuggestionIndex, style: i === this.activeSuggestionIndex
8555
- ? {
8556
- ...suggestionItemStyle,
8557
- background: CHIP_INPUT_SUGGESTIONS.itemBgHover,
8558
- color: CHIP_INPUT_SUGGESTIONS.itemColorHover,
8559
- fontWeight: CHIP_INPUT_SUGGESTIONS.itemFontWeightSelected,
8560
- }
8561
- : suggestionItemStyle, onMouseDown: e => {
8562
- e.preventDefault();
8563
- this.addChip(item);
8564
- } }, item)))))))));
8557
+ : '' }, 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 && (
8558
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
8559
+ hAsync("div", { key: '4aa212280a928b88b85dffa3d453ea8f563e1fe0', class: "sd-chip-input__reset",
8560
+ // 리셋 버튼 클릭 input blur portal unmount refocus → 새 portal mount로
8561
+ // 두 wrapper가 body에 잠깐 겹치는 타이밍 이슈를 방지한다.
8562
+ 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) => {
8563
+ const isSelected = (this.internalValues ?? []).includes(item);
8564
+ const isActive = i === this.activeSuggestionIndex && !isSelected;
8565
+ return (hAsync("div", { key: item, class: {
8566
+ 'sd-chip-input__suggestion-item': true,
8567
+ 'sd-chip-input__suggestion-item--active': isActive,
8568
+ 'sd-chip-input__suggestion-item--selected': isSelected,
8569
+ }, role: "option", tabIndex: -1, "aria-selected": isSelected || isActive, "aria-disabled": isSelected ? 'true' : undefined, style: isSelected
8570
+ ? {
8571
+ ...suggestionItemStyle,
8572
+ color: '#0075FF',
8573
+ fontWeight: CHIP_INPUT_SUGGESTIONS.itemFontWeightSelected,
8574
+ cursor: 'default',
8575
+ }
8576
+ : isActive
8577
+ ? {
8578
+ ...suggestionItemStyle,
8579
+ background: CHIP_INPUT_SUGGESTIONS.itemBgHover,
8580
+ color: CHIP_INPUT_SUGGESTIONS.itemColorHover,
8581
+ fontWeight: CHIP_INPUT_SUGGESTIONS.itemFontWeightSelected,
8582
+ }
8583
+ : suggestionItemStyle, onMouseDown: e => {
8584
+ e.preventDefault();
8585
+ if (!isSelected)
8586
+ this.addChip(item);
8587
+ } }, hAsync("span", { style: { flex: '1' } }, item), isSelected && (hAsync("sd-icon", { name: "check", size: "12", style: { color: '#0075FF', flexShrink: '0' } }))));
8588
+ })))))));
8565
8589
  }
8566
8590
  static get watchers() { return {
8567
8591
  "values": [{
@@ -18305,7 +18329,7 @@ class SdTextarea {
18305
18329
  }; }
18306
18330
  }
18307
18331
 
18308
- 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}`;
18332
+ 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}`;
18309
18333
 
18310
18334
  class SdThead {
18311
18335
  constructor(hostRef) {
@@ -18341,14 +18365,29 @@ class SdThead {
18341
18365
  _stickyHeader = false;
18342
18366
  _scrolledLeft = false;
18343
18367
  _scrolledRight = false;
18368
+ dropdownOpenMap = {};
18344
18369
  tableEl = null;
18370
+ dropdownRefs = {};
18371
+ dropdownThRefs = {};
18372
+ dropdownPortals = {};
18345
18373
  handleColumnsChange(newCols) {
18346
18374
  if (Array.isArray(newCols) && (this.columnWidths ?? []).length === 0) {
18347
18375
  this.columnWidths = newCols.map(c => (c.autoWidth ? 0 : parseInt(c.width || '120', 10)));
18348
18376
  }
18349
18377
  }
18378
+ disconnectedCallback() {
18379
+ const portals = this.dropdownPortals ?? {};
18380
+ Object.values(portals).forEach(portal => {
18381
+ if (portal?.parentNode != null)
18382
+ portal.parentNode.removeChild(portal);
18383
+ });
18384
+ }
18350
18385
  componentWillLoad() {
18351
18386
  this.syncTableContext();
18387
+ this.dropdownOpenMap = this.dropdownOpenMap ?? {};
18388
+ this.dropdownRefs = this.dropdownRefs ?? {};
18389
+ this.dropdownThRefs = this.dropdownThRefs ?? {};
18390
+ this.dropdownPortals = this.dropdownPortals ?? {};
18352
18391
  this.columnWidths = Array.isArray(this.columnWidths) ? this.columnWidths : [];
18353
18392
  this.resolveConfig();
18354
18393
  if ((this.columnWidths ?? []).length === 0) {
@@ -18358,6 +18397,36 @@ class SdThead {
18358
18397
  componentDidLoad() {
18359
18398
  this.syncTableContext();
18360
18399
  this.resolveConfig();
18400
+ this.initDropdownPortals();
18401
+ }
18402
+ // sd-portal을 body에 붙여 CSS transform 영향 없이 정확한 위치에 패널을 표시한다.
18403
+ // <slot>을 render에 두지 않고 직접 DOM 이동(slot 속성 제거)으로 Stencil 슬롯 에뮬레이션 충돌을 피한다.
18404
+ initDropdownPortals() {
18405
+ const cols = this._columns ?? [];
18406
+ const hasDropdownCols = cols.filter(c => c.hasDropdown === true);
18407
+ if (hasDropdownCols.length === 0)
18408
+ return;
18409
+ for (const col of hasDropdownCols) {
18410
+ const colName = col.name;
18411
+ // 이미 포탈이 생성된 컬럼은 건너뜀 (refreshConfig 재호출 대비)
18412
+ if ((this.dropdownPortals ?? {})[colName] != null)
18413
+ continue;
18414
+ const slotContent = this.el.querySelector(`[slot="dropdown-${colName}"]`);
18415
+ if (slotContent == null)
18416
+ continue;
18417
+ // slot 속성 제거: Stencil 슬롯 에뮬레이션이 재배포하지 못하게 한다
18418
+ slotContent.removeAttribute('slot');
18419
+ const portal = document.createElement('sd-portal');
18420
+ portal.parentRef = this.dropdownThRefs[colName] ?? null;
18421
+ portal.open = false;
18422
+ // 첫 open 전까지 포탈 호스트 자체를 숨긴다.
18423
+ // moveSlotContent()가 open=true 시 children을 독립 wrapper div로 이동하므로 이후 동작에 영향 없음.
18424
+ portal.style.display = 'none';
18425
+ portal.addEventListener('sdClose', () => this.closeDropdown(colName));
18426
+ portal.appendChild(slotContent);
18427
+ document.body.appendChild(portal);
18428
+ this.dropdownPortals[colName] = portal;
18429
+ }
18361
18430
  }
18362
18431
  syncTableContext() {
18363
18432
  // sd-table이 shadow:true이므로 fallback content로 렌더되면 closest가 경계를 못 넘는다.
@@ -18400,6 +18469,7 @@ class SdThead {
18400
18469
  /** 테이블 설정을 다시 불러옵니다. */
18401
18470
  async refreshConfig() {
18402
18471
  this.resolveConfig();
18472
+ this.initDropdownPortals();
18403
18473
  }
18404
18474
  /** 컬럼 너비를 업데이트합니다. */
18405
18475
  async setColumnWidths(widths) {
@@ -18444,6 +18514,28 @@ class SdThead {
18444
18514
  handleColumnSort = (col) => {
18445
18515
  this.sdColumnSort.emit({ column: col });
18446
18516
  };
18517
+ toggleDropdown(name) {
18518
+ const isOpen = this.dropdownOpenMap[name] !== true;
18519
+ const portals = this.dropdownPortals ?? {};
18520
+ const newMap = { ...this.dropdownOpenMap };
18521
+ // _columns 기준으로 순회: portals가 비어도 dropdownOpenMap은 항상 갱신됨
18522
+ for (const col of (this._columns ?? []).filter(c => c.hasDropdown === true)) {
18523
+ const shouldBeOpen = col.name === name ? isOpen : false;
18524
+ newMap[col.name] = shouldBeOpen;
18525
+ const portal = portals[col.name];
18526
+ if (portal != null)
18527
+ portal.open = shouldBeOpen;
18528
+ }
18529
+ this.dropdownOpenMap = newMap;
18530
+ }
18531
+ closeDropdown(name) {
18532
+ if (this.dropdownOpenMap[name] !== true)
18533
+ return;
18534
+ this.dropdownOpenMap = { ...this.dropdownOpenMap, [name]: false };
18535
+ const portal = (this.dropdownPortals ?? {})[name];
18536
+ if (portal != null)
18537
+ portal.open = false;
18538
+ }
18447
18539
  handleSelectAll(checked) {
18448
18540
  const nextChecked = !!checked;
18449
18541
  const safeRows = Array.isArray(this.rows) ? this.rows : [];
@@ -18460,6 +18552,8 @@ class SdThead {
18460
18552
  }
18461
18553
  render() {
18462
18554
  const safeRows = Array.isArray(this.rows) ? this.rows : [];
18555
+ const dropdownOpenMap = this.dropdownOpenMap ?? {};
18556
+ const dropdownRefs = this.dropdownRefs ?? {};
18463
18557
  const stickyLeftCount = this._stickyColumn.left || 0;
18464
18558
  const stickyRightCount = this._stickyColumn.right || 0;
18465
18559
  const stickyLeftCols = this.visibleColumns.slice(0, stickyLeftCount);
@@ -18481,22 +18575,25 @@ class SdThead {
18481
18575
  '--table-border-color': TABLE_BORDER.color,
18482
18576
  '--table-border-width': `${TABLE_BORDER.width}px`,
18483
18577
  };
18484
- return (hAsync(Host, { key: '26981191de95775401cad61e80fbf1e22cb0250b', slot: `${this.tableId}-head`, style: headStyle }, hAsync("thead", { key: 'a53d430f1b71a45b98de2912b563d3f17cd20b24', class: {
18578
+ return (hAsync(Host, { key: '947f5e5b0e59e7e6f8a73e4fd44dbfa646cb630a', slot: `${this.tableId}-head`, style: headStyle }, hAsync("thead", { key: '2e0ffbfe9d96528c6e0082d4883fa462a18831d6', class: {
18485
18579
  'thead': true,
18486
18580
  'thead--sticky': this._stickyHeader,
18487
- } }, hAsync("tr", { key: '27ce13b70bfda4b210b36eb746fb60d369d9f5be', class: "tr" }, this._selectable && (hAsync("th", { key: 'e353b00c7a02b82781e5107b1fd73dc556427edf', class: {
18581
+ } }, hAsync("tr", { key: '5843a18e1548bc6546e447d4c9213375116af0e9', class: "tr" }, this._selectable && (hAsync("th", { key: '914024ca35874747e39f1819337cd4ad1cbe733d', class: {
18488
18582
  'th': true,
18489
18583
  'th--selected': true,
18490
18584
  'sticky-left': true,
18491
18585
  'sticky-left-edge': stickyLeftCount === 0,
18492
18586
  'is-scrolled-left': stickyLeftCount === 0 && this._scrolledLeft,
18493
- }, 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: {
18587
+ }, 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: {
18494
18588
  'th': true,
18495
18589
  [`${col.thClass}`]: Boolean(col.thClass),
18496
18590
  'sticky-left': true,
18497
18591
  'sticky-left-edge': idx === stickyLeftCount - 1,
18498
18592
  'is-scrolled-left': idx === stickyLeftCount - 1 && this._scrolledLeft,
18499
- }, 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 && (
18593
+ }, 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: {
18594
+ 'th__dropdown-trigger': true,
18595
+ 'th__dropdown-trigger--open': dropdownOpenMap[col.name] === true,
18596
+ }, 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 && (
18500
18597
  // column resize 는 마우스 드래그 전용 인터랙션이라 키보드 핸들러를 두지 않는다.
18501
18598
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
18502
18599
  hAsync("div", { class: "th__resizer", onMouseDown: (evt) => this.handleResize(idx, evt) }))))), middleCols.map((col, relativeIdx) => {
@@ -18504,7 +18601,10 @@ class SdThead {
18504
18601
  return (hAsync("th", { key: col.name, class: {
18505
18602
  th: true,
18506
18603
  [`${col.thClass}`]: Boolean(col.thClass),
18507
- }, 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 && (
18604
+ }, 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: {
18605
+ 'th__dropdown-trigger': true,
18606
+ 'th__dropdown-trigger--open': this.dropdownOpenMap[col.name] === true,
18607
+ }, 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 && (
18508
18608
  // column resize 는 마우스 드래그 전용 인터랙션이라 키보드 핸들러를 두지 않는다.
18509
18609
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
18510
18610
  hAsync("div", { class: "th__resizer", onMouseDown: (evt) => this.handleResize(actualColIdx, evt) }))));
@@ -18516,7 +18616,10 @@ class SdThead {
18516
18616
  'sticky-right': true,
18517
18617
  'sticky-right-edge': relativeIdx === 0,
18518
18618
  'is-scrolled-right': relativeIdx === 0 && this._scrolledRight,
18519
- }, 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 && (
18619
+ }, 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: {
18620
+ 'th__dropdown-trigger': true,
18621
+ 'th__dropdown-trigger--open': this.dropdownOpenMap[col.name] === true,
18622
+ }, 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 && (
18520
18623
  // column resize 는 마우스 드래그 전용 인터랙션이라 키보드 핸들러를 두지 않는다.
18521
18624
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
18522
18625
  hAsync("div", { class: "th__resizer th__resizer--left", onMouseDown: (evt) => this.handleResize(actualColIdx, evt, true) }))));
@@ -18549,6 +18652,7 @@ class SdThead {
18549
18652
  "_stickyHeader": [32],
18550
18653
  "_scrolledLeft": [32],
18551
18654
  "_scrolledRight": [32],
18655
+ "dropdownOpenMap": [32],
18552
18656
  "refreshConfig": [64],
18553
18657
  "setColumnWidths": [64],
18554
18658
  "refreshSelection": [64]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellmate/design-system",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Sellmate Design System - Web Components Library built with Stencil",
5
5
  "keywords": [
6
6
  "web-components",