@sellmate/design-system 0.0.53 → 0.0.54

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 (118) 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_21.cjs.entry.js → sd-button_23.cjs.entry.js} +591 -80
  4. package/dist/cjs/sd-popover.cjs.entry.js +2 -2
  5. package/dist/cjs/sd-progress.cjs.entry.js +2 -2
  6. package/dist/cjs/sd-select-multiple.cjs.entry.js +266 -0
  7. package/dist/cjs/sd-tbody_3.cjs.entry.js +3 -3
  8. package/dist/cjs/sd-td.cjs.entry.js +2 -2
  9. package/dist/collection/collection-manifest.json +1 -0
  10. package/dist/collection/components/sd-number-input/sd-number-input.css +128 -0
  11. package/dist/collection/components/sd-number-input/sd-number-input.js +744 -0
  12. package/dist/collection/components/sd-number-input/sd-number-input.js.map +1 -0
  13. package/dist/collection/components/sd-pagination/sd-pagination.js +2 -2
  14. package/dist/collection/components/sd-popover/sd-popover.js +2 -2
  15. package/dist/collection/components/sd-portal/sd-portal.js +1 -1
  16. package/dist/collection/components/sd-progress/sd-progress.js +2 -2
  17. package/dist/collection/components/sd-select/sd-select-option/sd-select-option.js +1 -1
  18. package/dist/collection/components/sd-select-multiple/sd-select-multiple.js +2 -2
  19. package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.css +5 -0
  20. package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js +91 -42
  21. package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js.map +1 -1
  22. package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.js +3 -3
  23. package/dist/collection/components/sd-table/sd-tbody/sd-tbody.js +1 -1
  24. package/dist/collection/components/sd-table/sd-td/sd-td.js +2 -2
  25. package/dist/collection/components/sd-table/sd-th/sd-th.js +1 -1
  26. package/dist/collection/components/sd-table/sd-tr/sd-tr.js +1 -1
  27. package/dist/collection/components/sd-toggle/sd-toggle.js +1 -1
  28. package/dist/collection/components/sd-toggle-button/sd-toggle-button.js +1 -1
  29. package/dist/collection/components/sd-tooltip/sd-tooltip.js +4 -4
  30. package/dist/collection/components/sd-tooltip-portal/sd-tooltip-portal.js +1 -1
  31. package/dist/components/{p-CYadUxId.js → p-BBNolp5g.js} +3 -3
  32. package/dist/components/{p-CYadUxId.js.map → p-BBNolp5g.js.map} +1 -1
  33. package/dist/components/{p-71Aop19u.js → p-BH3t01Im.js} +5 -5
  34. package/dist/components/{p-71Aop19u.js.map → p-BH3t01Im.js.map} +1 -1
  35. package/dist/components/{p-Be8w5kOo.js → p-BqxmCDlz.js} +7 -7
  36. package/dist/components/{p-Be8w5kOo.js.map → p-BqxmCDlz.js.map} +1 -1
  37. package/dist/components/{p-B13lOU0D.js → p-C5T02a4h.js} +4 -4
  38. package/dist/components/{p-B13lOU0D.js.map → p-C5T02a4h.js.map} +1 -1
  39. package/dist/components/{p-Cf-LyLYk.js → p-CEDtmtIo.js} +3 -3
  40. package/dist/components/{p-Cf-LyLYk.js.map → p-CEDtmtIo.js.map} +1 -1
  41. package/dist/components/{p-DP33nj_I.js → p-Cx3euWvk.js} +3 -3
  42. package/dist/components/{p-DP33nj_I.js.map → p-Cx3euWvk.js.map} +1 -1
  43. package/dist/components/{p-ChQIkICO.js → p-DdeknsBE.js} +3 -3
  44. package/dist/components/{p-ChQIkICO.js.map → p-DdeknsBE.js.map} +1 -1
  45. package/dist/components/{p-j-ZEdgz4.js → p-GHGGjwP3.js} +3 -3
  46. package/dist/components/{p-j-ZEdgz4.js.map → p-GHGGjwP3.js.map} +1 -1
  47. package/dist/components/{p-B4wWf5r8.js → p-XAhTfI7Q.js} +4 -4
  48. package/dist/components/{p-B4wWf5r8.js.map → p-XAhTfI7Q.js.map} +1 -1
  49. package/dist/components/{p-CVtij2QI.js → p-at_j60O8.js} +3 -3
  50. package/dist/components/{p-CVtij2QI.js.map → p-at_j60O8.js.map} +1 -1
  51. package/dist/components/sd-date-picker.js +1 -1
  52. package/dist/components/sd-date-range-picker.js +1 -1
  53. package/dist/components/sd-guide.js +1 -1
  54. package/dist/components/sd-number-input.d.ts +11 -0
  55. package/dist/components/sd-number-input.js +335 -0
  56. package/dist/components/sd-number-input.js.map +1 -0
  57. package/dist/components/sd-pagination.js +1 -1
  58. package/dist/components/sd-popover.js +3 -3
  59. package/dist/components/sd-portal.js +1 -1
  60. package/dist/components/sd-progress.js +2 -2
  61. package/dist/components/sd-select-multiple-group.js +74 -45
  62. package/dist/components/sd-select-multiple-group.js.map +1 -1
  63. package/dist/components/sd-select-multiple.js +4 -4
  64. package/dist/components/sd-select-option-group.js +1 -1
  65. package/dist/components/sd-select-option.js +1 -1
  66. package/dist/components/sd-select.js +1 -1
  67. package/dist/components/sd-table-backup.js +6 -6
  68. package/dist/components/sd-table.js +9 -9
  69. package/dist/components/sd-tbody.js +1 -1
  70. package/dist/components/sd-td.js +2 -2
  71. package/dist/components/sd-th.js +1 -1
  72. package/dist/components/sd-toggle-button.js +1 -1
  73. package/dist/components/sd-toggle.js +1 -1
  74. package/dist/components/sd-tooltip-portal.js +1 -1
  75. package/dist/components/sd-tooltip.js +1 -1
  76. package/dist/components/sd-tr.js +1 -1
  77. package/dist/design-system/design-system.esm.js +1 -1
  78. package/dist/design-system/p-26266f8c.entry.js +2 -0
  79. package/dist/design-system/p-2df41cc3.entry.js +2 -0
  80. package/dist/design-system/p-2df41cc3.entry.js.map +1 -0
  81. package/dist/design-system/p-3cc7957d.entry.js +2 -0
  82. package/dist/design-system/p-a18c202d.entry.js +2 -0
  83. package/dist/design-system/{p-0cbdb34f.entry.js → p-b0668ce9.entry.js} +2 -2
  84. package/dist/design-system/{p-d02b3369.entry.js → p-f9e04bf9.entry.js} +2 -2
  85. package/dist/design-system/p-f9e04bf9.entry.js.map +1 -0
  86. package/dist/esm/design-system.js +1 -1
  87. package/dist/esm/loader.js +1 -1
  88. package/dist/esm/{sd-button_21.entry.js → sd-button_23.entry.js} +589 -80
  89. package/dist/esm/sd-popover.entry.js +2 -2
  90. package/dist/esm/sd-progress.entry.js +2 -2
  91. package/dist/esm/sd-select-multiple.entry.js +264 -0
  92. package/dist/esm/sd-select-multiple.entry.js.map +1 -0
  93. package/dist/esm/sd-tbody_3.entry.js +3 -3
  94. package/dist/esm/sd-td.entry.js +2 -2
  95. package/dist/types/components/sd-number-input/sd-number-input.d.ts +58 -0
  96. package/dist/types/components/sd-select-multiple-group/sd-select-multiple-group.d.ts +2 -0
  97. package/dist/types/components.d.ts +145 -0
  98. package/hydrate/index.js +407 -68
  99. package/hydrate/index.mjs +407 -68
  100. package/package.json +1 -1
  101. package/dist/cjs/sd-select-multiple-group.cjs.entry.js +0 -406
  102. package/dist/cjs/sd-select-option-group.cjs.entry.js +0 -69
  103. package/dist/design-system/p-1e7a06ef.entry.js +0 -2
  104. package/dist/design-system/p-761882f5.entry.js +0 -2
  105. package/dist/design-system/p-790ae9ce.entry.js +0 -2
  106. package/dist/design-system/p-790ae9ce.entry.js.map +0 -1
  107. package/dist/design-system/p-a8e8fc17.entry.js +0 -2
  108. package/dist/design-system/p-d02b3369.entry.js.map +0 -1
  109. package/dist/design-system/p-e492d625.entry.js +0 -2
  110. package/dist/design-system/p-e492d625.entry.js.map +0 -1
  111. package/dist/esm/sd-select-multiple-group.entry.js +0 -404
  112. package/dist/esm/sd-select-multiple-group.entry.js.map +0 -1
  113. package/dist/esm/sd-select-option-group.entry.js +0 -67
  114. package/dist/esm/sd-select-option-group.entry.js.map +0 -1
  115. /package/dist/design-system/{p-1e7a06ef.entry.js.map → p-26266f8c.entry.js.map} +0 -0
  116. /package/dist/design-system/{p-761882f5.entry.js.map → p-3cc7957d.entry.js.map} +0 -0
  117. /package/dist/design-system/{p-a8e8fc17.entry.js.map → p-a18c202d.entry.js.map} +0 -0
  118. /package/dist/design-system/{p-0cbdb34f.entry.js.map → p-b0668ce9.entry.js.map} +0 -0
@@ -38,11 +38,11 @@ const SdPopover = class {
38
38
  this.showPopover = false;
39
39
  };
40
40
  render() {
41
- return (index.h(index.Fragment, { key: 'fa06f3ff6641006a75c3ed0912f8f2dc6ca2da56' }, this.label ? (index.h("sd-button", { ref: el => (this.buttonEl = el), label: this.label, icon: this.icon, size: this.buttonSize, color: this.color, variant: this.buttonVariant, class: "sd-popover", onClick: () => (this.showPopover = !this.showPopover) })) : (index.h("sd-icon", { ref: el => (this.buttonEl = el), name: this.icon, size: this.iconSize, color: this.color, class: "sd-popover", onClick: () => (this.showPopover = !this.showPopover) })), this.showPopover && (index.h("sd-tooltip-portal", { key: 'f433e3bc5e325bf9d70fae10b6777fe77e52061f', parentRef: this.buttonEl, onSdClose: this.handleClose, placement: this.placement }, index.h("div", { key: '7fa463878475d3c2ce86d006912c35b585d7bed0', class: {
41
+ return (index.h(index.Fragment, { key: '1300f5f84d96ef65840d8daec85dc53dba2c407c' }, this.label ? (index.h("sd-button", { ref: el => (this.buttonEl = el), label: this.label, icon: this.icon, size: this.buttonSize, color: this.color, variant: this.buttonVariant, class: "sd-popover", onClick: () => (this.showPopover = !this.showPopover) })) : (index.h("sd-icon", { ref: el => (this.buttonEl = el), name: this.icon, size: this.iconSize, color: this.color, class: "sd-popover", onClick: () => (this.showPopover = !this.showPopover) })), this.showPopover && (index.h("sd-tooltip-portal", { key: '73b7feb032125495c7df8bbcecee042b59c91886', parentRef: this.buttonEl, onSdClose: this.handleClose, placement: this.placement }, index.h("div", { key: 'b6209c9654fe11e148206ef49c8a304b1f72f068', class: {
42
42
  'sd-popover-menu': true,
43
43
  [`sd-popover-menu--${this.placement}`]: true,
44
44
  [this.menuClass]: !!this.menuClass,
45
- } }, index.h("i", { key: '90a23aea2730ec9dbc2b9ca77ef0a4ef13777006', class: `sd-popover-menu__arrow sd-popover-menu__arrow--${this.placement}` }, index.h(tooltipArrow.TooltipArrow, { key: '9246c25e04ea2dd6716e20ac01060ff7acc23fa9' })), index.h("div", { key: 'dd6f350fbb5f5a49302593b3c24faf6bf59bb9ec', class: "sd-popover-menu__content" }, this.menuTitle && index.h("div", { key: 'c9aae4e0eaa0e1ab4f1447907f2dbe0e6e988bbf', class: "sd-popover-menu__title" }, this.menuTitle), this.messages.length > 0 && (index.h("div", { key: '2ed497a7d543f4638756524b4062c9df57b20aa0', class: "sd-popover-menu__messages" }, this.messages.map(message => (index.h("div", null, message))))), this.buttons.length > 0 && (index.h("div", { key: '5ddf4ec18128bc58c77a3017fc1a621591adb67b', class: `sd-popover-menu__buttons sd-popover-menu__buttons--${this.buttons.length}` }, this.buttons.map(button => (index.h("sd-button", { ...button })))))), this.useClose && (index.h("button", { key: 'e7bbb527601bda49a4d4e5c28a555acb5714bd5b', class: "sd-popover-menu__close-button", onClick: () => this.handleClose() }, index.h("sd-icon", { key: '0e0ec3542195f3eb6955ef68ab82d947460271d3', name: "close", size: "12", color: "#AAAAAA" }))))))));
45
+ } }, index.h("i", { key: 'c788234f854fe0704ffffdc89dd297277916e7f1', class: `sd-popover-menu__arrow sd-popover-menu__arrow--${this.placement}` }, index.h(tooltipArrow.TooltipArrow, { key: '5d5b4aa3815b815ebe4bebc81f307ba62f781af1' })), index.h("div", { key: '6305c611f72e1e57ff90562a05568777ff3e5db0', class: "sd-popover-menu__content" }, this.menuTitle && index.h("div", { key: 'da81708c8925e82c6b28b2d582f17d588f9fceae', class: "sd-popover-menu__title" }, this.menuTitle), this.messages.length > 0 && (index.h("div", { key: 'd0d00ce577b6de6efd546fadafc5d487f5e9b0b9', class: "sd-popover-menu__messages" }, this.messages.map(message => (index.h("div", null, message))))), this.buttons.length > 0 && (index.h("div", { key: '3ce2714f038a72ffd1017e00521bf2c05fe8730c', class: `sd-popover-menu__buttons sd-popover-menu__buttons--${this.buttons.length}` }, this.buttons.map(button => (index.h("sd-button", { ...button })))))), this.useClose && (index.h("button", { key: '4c551c170b13797cb725e3e0ae42623dc983286a', class: "sd-popover-menu__close-button", onClick: () => this.handleClose() }, index.h("sd-icon", { key: '1c4620527b33feba50d06709ed0c9185be4094b4', name: "close", size: "12", color: "#AAAAAA" }))))))));
46
46
  }
47
47
  static get watchers() { return {
48
48
  "show": ["watchShowHandler"]
@@ -21,10 +21,10 @@ const SdProgress = class {
21
21
  error: '#FB4444',
22
22
  };
23
23
  render() {
24
- return (index.h(index.Host, { key: 'ecd9801daf4fcb4a3a680286354c436b1423778a', style: {
24
+ return (index.h(index.Host, { key: '351f3fda014f276d22b02b09f92ed7895a43ea85', style: {
25
25
  '--progress-color': this.statusColor[this.status],
26
26
  '--progress-percentage': `${this.percentage}%`,
27
- } }, this.type === 'bar' ? this.renderBarProgress() : this.renderSpinnerProgress(), this.label && index.h("div", { key: '167d080cefe222ac28d966bbcf0aca4a122c98ea', class: "sd-progress__label" }, this.label)));
27
+ } }, this.type === 'bar' ? this.renderBarProgress() : this.renderSpinnerProgress(), this.label && index.h("div", { key: '3b41b3fdb26fdf283792172de45fbcff37e1c90e', class: "sd-progress__label" }, this.label)));
28
28
  }
29
29
  renderBarProgress() {
30
30
  return (index.h("div", { class: `sd-progress__bar sd-progress__bar--${this.status}` }, index.h("div", { class: ['sd-progress__bar__percent', this.percentage < 100 ? 'proceed' : ''].join(' ') }), index.h("div", { class: "sd-progress__bar__indicator sd-progress__bar__indicator--left" }, this.percentage, "%"), index.h("div", { class: "sd-progress__bar__indicator sd-progress__bar__indicator--right" }, this.percentage, "%")));
@@ -0,0 +1,266 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-B7tkxTye.js');
4
+ var selectKeyboardNavigation = require('./select-keyboard-navigation-6fO_V4En.js');
5
+
6
+ const sdSelectMultipleCss = () => `.sd-select-multiple__dropdown{overflow-y:auto;overflow-x:hidden;scroll-behavior:smooth}.sd-select-multiple__dropdown::-webkit-scrollbar{opacity:0;background:#e5e5e5}.sd-select-multiple__dropdown::-webkit-scrollbar:horizontal{height:8px}.sd-select-multiple__dropdown::-webkit-scrollbar:vertical{width:8px}.sd-select-multiple__dropdown::-webkit-scrollbar-thumb{height:80px;background-color:#cccccc;border-radius:4px}.sd-select-multiple__dropdown::-webkit-scrollbar-track{background-color:transparent}:host{display:inline-block;height:fit-content;position:relative}.sd-select-multiple{display:flex;flex-wrap:nowrap;width:var(--select-width, 200px);height:28px;cursor:pointer;user-select:none;border:1px solid #aaaaaa;border-radius:4px;background-color:white}.sd-select-multiple:hover:not(.sd-select-multiple--disabled){background:#f6f6f6}.sd-select-multiple.sd-select-multiple--disabled{cursor:not-allowed;background-color:#eeeeee;border-color:#cccccc}.sd-select-multiple.sd-select-multiple--disabled .sd-select-multiple__label{border-right:1px solid #cccccc}.sd-select-multiple.sd-select-multiple--disabled .sd-select-multiple__trigger{color:#888888}.sd-select-multiple.sd-select-multiple--disabled .sd-select-multiple__trigger:focus,.sd-select-multiple.sd-select-multiple--disabled .sd-select-multiple__trigger:focus-visible,.sd-select-multiple.sd-select-multiple--disabled .sd-select-multiple__trigger:focus-within{outline:none !important}.sd-select-multiple__label{font-size:12px;font-weight:500;color:#333333;padding:4px 12px;border-right:1px solid #cccccc;border-radius:4px 0 0 4px;background-color:#f6f6f6}.sd-select-multiple__container{position:relative;width:100%;display:flex}.sd-select-multiple__container .sd-select-multiple__trigger{padding:4px 20px 4px 12px;display:flex;width:100%;align-items:center}.sd-select-multiple__container .sd-select-multiple__trigger .sd-select-multiple__value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:20px;font-size:12px;font-weight:400}.sd-select-multiple__container .sd-select-multiple__trigger .sd-select-multiple__clear{margin:0 4px;width:8px;height:8px;background-color:transparent;outline:none;border:none}.sd-select-multiple__container .sd-select-multiple__arrow{position:absolute;top:8px;right:8px;width:12px;height:12px;color:#888888;transition:transform 0.3s ease}.sd-select-multiple__container .sd-select-multiple__arrow--open{transform:rotate(180deg)}.sd-select-multiple__dropdown{width:var(--select-dropdown-width, 200px);max-height:var(--select-dropdown-height, 260px);padding-bottom:2px;background-color:white;box-shadow:2px 2px 12px 2px rgba(0, 0, 0, 0.1);border-radius:4px;overflow-y:auto;color:#333333}.sd-select-multiple__dropdown .sd-select-multiple__search-container{position:sticky;top:0;display:flex;width:100%;background-color:white;align-items:center;padding:4px 8px;z-index:1}.sd-select-multiple__dropdown .sd-select-multiple__search-container--scrolled{box-shadow:2px 2px 8px 2px rgba(0, 0, 0, 0.2)}.sd-select-multiple__dropdown .sd-select-multiple__option-placeholder{padding:4px 12px;font-size:12px;line-height:20px;text-align:left}`;
7
+
8
+ const SdSelectMultiple = class extends selectKeyboardNavigation.BaseDropdownEvent {
9
+ constructor(hostRef) {
10
+ super();
11
+ index.registerInstance(this, hostRef);
12
+ this.sdChange = index.createEvent(this, "sdChange");
13
+ this.dropDownShow = index.createEvent(this, "dropDownShow");
14
+ }
15
+ get el() { return index.getElement(this); }
16
+ // props
17
+ value = null;
18
+ label = '';
19
+ options = [];
20
+ placeholder = '선택';
21
+ optionPlaceholder = '옵션이 없습니다.';
22
+ width = '200px';
23
+ dropdownHeight = '260px';
24
+ disabled = false;
25
+ clearable = false;
26
+ searchable = false;
27
+ useCheckbox = false;
28
+ // props - custom slots
29
+ optionRenderer;
30
+ // states
31
+ filteredOptions = this.options;
32
+ isOpen = false;
33
+ searchText = null;
34
+ itemIndex = -1;
35
+ isScrolled = false;
36
+ // events
37
+ sdChange;
38
+ dropDownShow;
39
+ selectRef;
40
+ searchRef;
41
+ optionRef;
42
+ dropdownRef;
43
+ async open() {
44
+ this.isOpen = true;
45
+ }
46
+ valueChanged() {
47
+ this.sdChange?.emit(this.value);
48
+ }
49
+ optionsChanged() {
50
+ this.filteredOptions = this.options;
51
+ this.filterOptions();
52
+ }
53
+ searchTextChanged() {
54
+ this.filterOptions();
55
+ }
56
+ async itemIndexChanged(newIndex, oldIndex) {
57
+ if (this.searchable) {
58
+ const searchInput = await this.getNativeInputElement();
59
+ if (this.itemIndex === -1) {
60
+ searchInput?.focus();
61
+ return;
62
+ }
63
+ else if (searchInput?.matches(':focus')) {
64
+ searchInput?.blur();
65
+ }
66
+ }
67
+ const optionElements = Array.from(this.dropdownRef?.querySelectorAll('.sd-select-multiple__dropdown sd-select-option') || []);
68
+ const currentItem = optionElements?.[this.itemIndex];
69
+ if (!currentItem || !this.isOpen)
70
+ return;
71
+ this.optionRef = currentItem;
72
+ const isOptionDisabled = await this.optionRef.isDisabled();
73
+ if (isOptionDisabled) {
74
+ newIndex > oldIndex ? this.itemIndex++ : this.itemIndex--;
75
+ return;
76
+ }
77
+ this.scrollToOption(currentItem);
78
+ }
79
+ async isOpenChanged() {
80
+ // Base class의 이벤트 관리 호출 - 다른 select와의 이벤트 충돌 방지
81
+ this.onDropdownToggle(this.isOpen);
82
+ const selectedOption = this.getSelectedOption();
83
+ if (!selectedOption) {
84
+ this.itemIndex = -1;
85
+ }
86
+ else {
87
+ this.itemIndex = this.options.indexOf(selectedOption[0]);
88
+ }
89
+ this.dropDownShow?.emit({ isOpen: this.isOpen });
90
+ if (this.isOpen === false)
91
+ return;
92
+ await new Promise(resolve => setTimeout(resolve, 10));
93
+ const optionElements = Array.from(this.dropdownRef?.querySelectorAll('.sd-select-multiple__dropdown sd-select-item') || []);
94
+ const currentItem = optionElements?.[this.itemIndex];
95
+ // 드롭다운이 열릴 때 검색 입력에 포커스
96
+ if (this.searchable) {
97
+ const searchInput = await this.getNativeInputElement();
98
+ searchInput?.focus();
99
+ }
100
+ if (!currentItem)
101
+ return;
102
+ await new Promise(resolve => setTimeout(resolve, 10)); // 추가 딜레이
103
+ this.scrollToOption(currentItem);
104
+ }
105
+ connectedCallback() {
106
+ // props가 모두 설정된 후에 실행되므로 올바른 options 값을 가져올 수 있음
107
+ this.filteredOptions = this.options;
108
+ this.initializeEvent(); // global dropdown Manager에 등록 + 이벤트 핸들러 초기화
109
+ }
110
+ disconnectedCallback() {
111
+ this.cleanupEvent(); // global dropdown Manager에서 제거 + 이벤트 정리
112
+ }
113
+ handleDocumentClick(event) {
114
+ if (!this.selectRef?.contains(event.target)) {
115
+ this.isOpen = false;
116
+ }
117
+ }
118
+ handleDocumentKeydown(keyboardEvent) {
119
+ keyboardEvent.stopPropagation();
120
+ const targetKey = ['ArrowDown', 'ArrowUp', 'Enter', 'Escape'];
121
+ if (!targetKey.includes(keyboardEvent.key))
122
+ return;
123
+ keyboardEvent.preventDefault();
124
+ switch (keyboardEvent.key) {
125
+ case 'ArrowDown':
126
+ case 'ArrowUp':
127
+ const keyboardNavigation = new selectKeyboardNavigation.SelectKeyboardNavigation(this.searchable, this.filteredOptions);
128
+ const nextIndex = keyboardNavigation.getNextIndex(this.itemIndex, keyboardEvent.key);
129
+ this.itemIndex = nextIndex;
130
+ break;
131
+ case 'Enter':
132
+ const selectedOption = this.filteredOptions[this.itemIndex];
133
+ if (selectedOption && !selectedOption.disabled) {
134
+ this.handleOptionSelection(selectedOption);
135
+ }
136
+ break;
137
+ case 'Escape':
138
+ this.isOpen = false;
139
+ break;
140
+ }
141
+ }
142
+ // event handlers
143
+ handleTriggerClick = (event) => {
144
+ event.stopPropagation();
145
+ if (!this.disabled) {
146
+ this.isOpen = !this.isOpen;
147
+ this.dropDownShow?.emit({ isOpen: this.isOpen });
148
+ }
149
+ };
150
+ handleOptionClick = (detail) => {
151
+ const { option, event } = detail;
152
+ event.stopPropagation();
153
+ this.handleOptionSelection(option);
154
+ };
155
+ filterOptions() {
156
+ if (!this.searchText || this.searchText.trim() === '') {
157
+ // 검색어가 없으면 전체 옵션 표시
158
+ this.filteredOptions = this.options;
159
+ }
160
+ else {
161
+ // 검색어가 있으면 필터링
162
+ this.filteredOptions = this.options.filter(option => option.label.toLowerCase().includes(this.searchText.toLowerCase()));
163
+ }
164
+ }
165
+ getSelectedOption() {
166
+ return this.options.filter(option => this.value?.includes(option));
167
+ }
168
+ handleDropdownScroll = (event) => {
169
+ const target = event.target;
170
+ const scrollTop = target.scrollTop;
171
+ // 스크롤이 조금이라도 되면 그림자 표시
172
+ this.isScrolled = scrollTop > 0;
173
+ };
174
+ async getNativeInputElement() {
175
+ if (this.searchRef) {
176
+ return this.searchRef.getNativeElement();
177
+ }
178
+ return null;
179
+ }
180
+ handleOptionSelection = (option) => {
181
+ if (!option || option.disabled)
182
+ return;
183
+ const isAlreadySelected = this.value?.some(opt => opt.value === option.value);
184
+ if (isAlreadySelected) {
185
+ // 이미 선택된 옵션인 경우, 선택 해제
186
+ this.value = this.value?.filter(opt => opt.value !== option.value) || null;
187
+ }
188
+ else {
189
+ // 새로운 옵션 선택
190
+ this.value = [...(this.value || []), option];
191
+ }
192
+ };
193
+ closeDropdown() {
194
+ this.isOpen = false;
195
+ }
196
+ scrollToOption(optionElement) {
197
+ if (!this.dropdownRef || !optionElement)
198
+ return;
199
+ const dropdown = this.dropdownRef;
200
+ const optionTop = optionElement.offsetTop;
201
+ const optionHeight = optionElement.offsetHeight;
202
+ const dropdownScrollTop = dropdown.scrollTop;
203
+ const dropdownHeight = dropdown.clientHeight;
204
+ const searchContainer = dropdown.querySelector('.sd-select__search-container');
205
+ const searchOffset = searchContainer ? searchContainer.offsetHeight : 0;
206
+ const visibleTop = dropdownScrollTop + searchOffset;
207
+ const visibleBottom = dropdownScrollTop + dropdownHeight;
208
+ if (optionTop < visibleTop) {
209
+ dropdown.scrollTop = optionTop - searchOffset;
210
+ }
211
+ else if (optionTop + optionHeight > visibleBottom) {
212
+ dropdown.scrollTop = optionTop + optionHeight - dropdownHeight + searchOffset;
213
+ }
214
+ }
215
+ // render method
216
+ render() {
217
+ const style = {
218
+ '--select-width': this.width || '200px',
219
+ '--select-dropdown-height': this.dropdownHeight || '260px',
220
+ };
221
+ return (index.h(index.Host, { key: 'b80f1d57e87db4e921436b726cfeac4618a13d6b', style: style }, index.h("div", { key: '43ae0ae2ec83cef2cad1ae59764b5463bb66eda0', class: {
222
+ 'sd-select-multiple': true,
223
+ 'sd-select-multiple--open': this.isOpen,
224
+ 'sd-select-multiple--disabled': this.disabled,
225
+ }, ref: el => (this.selectRef = el) }, this.renderLabel(this.label), index.h("div", { key: '8802336bea4e78aa6ccf1a567d238005ff58c29b', class: "sd-select-multiple__container" }, this.renderTrigger(), this.renderDropdown()))));
226
+ }
227
+ renderLabel(label) {
228
+ if (!label)
229
+ return null;
230
+ return index.h("label", { class: "sd-select-multiple__label" }, label);
231
+ }
232
+ renderTrigger() {
233
+ const selectedOption = this.getSelectedOption();
234
+ return (index.h("div", { class: "sd-select-multiple__trigger", tabindex: this.disabled ? -1 : 0, onClick: this.handleTriggerClick }, index.h("span", { class: "sd-select-multiple__value" }, !selectedOption
235
+ ? '선택'
236
+ : selectedOption.length
237
+ ? selectedOption.map(option => option.label).join(', ')
238
+ : this.placeholder), this.clearable && selectedOption?.length > 0 && !this.disabled && (index.h("sd-icon", { key: "close-icon", name: "close", size: 10, color: "#888", class: "sd-select-multiple__clear", onClick: event => {
239
+ event.stopPropagation();
240
+ this.value = null;
241
+ } })), index.h("sd-icon", { key: "arrow-icon", name: "arrowDown", color: "#888", class: { 'sd-select-multiple__arrow': true, 'sd-select-multiple__arrow--open': this.isOpen } })));
242
+ }
243
+ renderDropdown() {
244
+ if (this.isOpen === false)
245
+ return null;
246
+ return (index.h("sd-portal", { open: this.isOpen, parentRef: this.selectRef, onSdClose: this.closeDropdown }, index.h("div", { class: "sd-select-multiple__dropdown", onScroll: this.handleDropdownScroll, ref: el => (this.dropdownRef = el) }, this.searchable && (index.h("div", { class: {
247
+ 'sd-select-multiple__search-container': true,
248
+ 'sd-select-multiple__search-container--scrolled': this.isScrolled,
249
+ }, onClick: event => event.stopPropagation() }, index.h("sd-input", { ref: el => (this.searchRef = el), value: this.searchText, placeholder: "\uAC80\uC0C9", clearable: true, inputStyle: { 'padding-left': '8px' }, autofocus: true, onSdInput: event => {
250
+ this.searchText = String(event?.detail);
251
+ }, onSdFocus: () => {
252
+ this.itemIndex = -1;
253
+ } }, index.h("sd-icon", { name: "search", size: 16, color: "#737373", style: { marginRight: '4px' }, slot: "prefix" })))), this.filteredOptions.length > 0 ? (this.filteredOptions.map((option, index$1) => (index.h("slot", { name: `option-${option.value}` }, index.h("sd-select-option", { option: option, index: index$1, isSelected: this.value?.some(selected => selected.value === option.value), isFocused: index$1 === this.itemIndex, onOptionClick: ({ detail }) => this.handleOptionClick(detail), useCheckbox: this.useCheckbox }))))) : (index.h("slot", { name: "option-placeholder" }, index.h("div", { class: 'sd-select-multiple__option-placeholder' }, this.optionPlaceholder))))));
254
+ }
255
+ static get watchers() { return {
256
+ "value": ["valueChanged"],
257
+ "options": ["optionsChanged"],
258
+ "searchText": ["searchTextChanged"],
259
+ "itemIndex": ["itemIndexChanged"],
260
+ "isOpen": ["isOpenChanged"]
261
+ }; }
262
+ };
263
+ SdSelectMultiple.style = sdSelectMultipleCss();
264
+
265
+ exports.sd_select_multiple = SdSelectMultiple;
266
+ //# sourceMappingURL=sd-select-multiple.entry.cjs.js.map
@@ -9,7 +9,7 @@ const SdTbody = class {
9
9
  index.registerInstance(this, hostRef);
10
10
  }
11
11
  render() {
12
- return (index.h(index.Host, { key: '96bedf612efa56d790df7070e2641f6769da81a9' }, index.h("slot", { key: '9980c55cf76b1600034d8dcd60249b392c0c50f2' })));
12
+ return (index.h(index.Host, { key: '7636f7ff23e8aa3c83ace885c5f2ad3fa1e57a45' }, index.h("slot", { key: '9cdae57011b78e861dab1c16144642c534aaa9e4' })));
13
13
  }
14
14
  };
15
15
  SdTbody.style = sdTbodyCss();
@@ -21,7 +21,7 @@ const SdTh = class {
21
21
  index.registerInstance(this, hostRef);
22
22
  }
23
23
  render() {
24
- return (index.h(index.Host, { key: 'cbd2372809ca102893f62b3b4e2d51342cc4c52f', role: "columnheader" }, index.h("slot", { key: 'c51c2635013c8d405bf3d95d46d2b99bc52c3326' })));
24
+ return (index.h(index.Host, { key: '8b511af45184973c4daefe8bee11130934ef05be', role: "columnheader" }, index.h("slot", { key: 'a72bff519a60499357ccce741fa0b90cdf9197b7' })));
25
25
  }
26
26
  };
27
27
  SdTh.style = sdThCss();
@@ -33,7 +33,7 @@ const SdTr = class {
33
33
  index.registerInstance(this, hostRef);
34
34
  }
35
35
  render() {
36
- return (index.h(index.Host, { key: '228bb6d6b5225bd035cce96cd817beb9e2734ab4', role: "row" }, index.h("slot", { key: '8906dfdeb89afb1028a30a5b16b034f6c2ba67b9' })));
36
+ return (index.h(index.Host, { key: '45ae0547de2437e9b815e0ed33226276787805f7', role: "row" }, index.h("slot", { key: '98dabd2288d0db28bc9305f1b1b3298cb2a905d0' })));
37
37
  }
38
38
  };
39
39
  SdTr.style = sdTrCss();
@@ -13,11 +13,11 @@ const SdTd = class {
13
13
  tdStyle;
14
14
  tdClass;
15
15
  render() {
16
- return (index.h(index.Host, { key: '182bd00cbbb22b4f3613e973d2999421a3f5f2cd', role: "cell", class: {
16
+ return (index.h(index.Host, { key: '96933d25aa2342e56aaad5a447840bf51b0af078', role: "cell", class: {
17
17
  'sd-td': true,
18
18
  [`sd-td--${this.align}`]: true,
19
19
  [this.tdClass || '']: Boolean(this.tdClass),
20
- }, style: this.tdStyle }, index.h("slot", { key: 'fff1a74106822c8092fa57ba785f6ab5be96edcd' })));
20
+ }, style: this.tdStyle }, index.h("slot", { key: 'd6a500857bfc914b0443c5ced9607e15dc151c7c' })));
21
21
  }
22
22
  };
23
23
  SdTd.style = sdTdCss();
@@ -22,6 +22,7 @@
22
22
  "components/sd-icon/sd-icon.js",
23
23
  "components/sd-input/sd-input.js",
24
24
  "components/sd-loading-spinner/sd-loading-spinner.js",
25
+ "components/sd-number-input/sd-number-input.js",
25
26
  "components/sd-pagination/sd-pagination.js",
26
27
  "components/sd-popover/sd-popover.js",
27
28
  "components/sd-portal/sd-portal.js",
@@ -0,0 +1,128 @@
1
+ sd-icon {
2
+ display: inline-block;
3
+ line-height: 0;
4
+ }
5
+ sd-icon .sd-icon--rotate-90 {
6
+ transform: rotate(90deg);
7
+ }
8
+ sd-icon .sd-icon--rotate-180 {
9
+ transform: rotate(180deg);
10
+ }
11
+ sd-icon .sd-icon--rotate-270 {
12
+ transform: rotate(270deg);
13
+ }
14
+
15
+ .sd-number-input {
16
+ box-sizing: border-box;
17
+ display: flex;
18
+ width: var(--input-width, 100%);
19
+ align-items: center;
20
+ height: 28px;
21
+ padding: 4px 8px;
22
+ border: 1px solid #aaaaaa;
23
+ border-radius: 4px;
24
+ color: #333333;
25
+ font-size: 12px;
26
+ line-height: 20px;
27
+ background: white;
28
+ position: relative;
29
+ }
30
+ .sd-number-input--hovered {
31
+ border-color: #0075ff;
32
+ box-shadow: 0 0 4px 0 rgba(0, 113, 255, 0.4);
33
+ }
34
+ .sd-number-input.sd-number-input--error {
35
+ border-color: #fb4444;
36
+ }
37
+ .sd-number-input.sd-number-input--pass {
38
+ border-color: #2bce6c;
39
+ }
40
+ .sd-number-input.sd-number-input--disabled {
41
+ background-color: #eeeeee !important;
42
+ border-color: #cccccc !important;
43
+ cursor: not-allowed !important;
44
+ box-shadow: none !important;
45
+ }
46
+ .sd-number-input.sd-number-input--disabled .sd-number-input__input {
47
+ color: #888888 !important;
48
+ }
49
+ .sd-number-input .sd-number-input__input {
50
+ display: block;
51
+ width: 100%;
52
+ height: 20px;
53
+ line-height: 20px;
54
+ border: none;
55
+ outline: none;
56
+ background: transparent;
57
+ font-size: inherit;
58
+ color: #333333;
59
+ margin-left: 4px;
60
+ margin-right: 4px;
61
+ padding-block: 0;
62
+ padding-inline: 0;
63
+ text-align: right;
64
+ }
65
+ .sd-number-input .sd-number-input__input::placeholder {
66
+ font-size: 12px;
67
+ height: 20px;
68
+ line-height: 20px;
69
+ color: #aaaaaa;
70
+ }
71
+ .sd-number-input .sd-number-input__clear-icon {
72
+ cursor: pointer;
73
+ margin-left: 8px;
74
+ }
75
+ .sd-number-input .sd-number-input__buttons {
76
+ padding: 4px;
77
+ display: flex;
78
+ justify-content: space-between;
79
+ align-items: center;
80
+ position: absolute;
81
+ inset: 0;
82
+ opacity: 0;
83
+ pointer-events: none;
84
+ transition: opacity 0.2s ease;
85
+ }
86
+ .sd-number-input .sd-number-input__button {
87
+ width: 20px;
88
+ height: 20px;
89
+ border: none;
90
+ border-radius: 2px;
91
+ background-color: #eff6ff;
92
+ cursor: pointer;
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ padding: 0;
97
+ margin: 0;
98
+ transition: background-color 0.2s ease;
99
+ }
100
+ .sd-number-input .sd-number-input__button:hover:not(:disabled) {
101
+ background-color: #e6f1ff;
102
+ }
103
+ .sd-number-input .sd-number-input__button:disabled {
104
+ background-color: #eeeeee;
105
+ cursor: not-allowed;
106
+ }
107
+ .sd-number-input .sd-number-input__button--decrement {
108
+ border-bottom-left-radius: 0;
109
+ border-bottom-right-radius: 0;
110
+ }
111
+ .sd-number-input .sd-number-input__button--increment {
112
+ border-top-left-radius: 0;
113
+ border-top-right-radius: 0;
114
+ }
115
+ .sd-number-input .sd-number-input__label {
116
+ margin-bottom: 8px;
117
+ font-weight: 500;
118
+ color: #333333;
119
+ }
120
+
121
+ sd-number-input:focus-within .sd-number-input__buttons {
122
+ opacity: 1;
123
+ pointer-events: auto;
124
+ }
125
+ sd-number-input:focus-within .sd-number-input {
126
+ border-color: #0075ff;
127
+ box-shadow: 0 0 4px 0 rgba(0, 113, 255, 0.4);
128
+ }