@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.
- package/dist/cjs/design-system.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{sd-button_21.cjs.entry.js → sd-button_23.cjs.entry.js} +591 -80
- package/dist/cjs/sd-popover.cjs.entry.js +2 -2
- package/dist/cjs/sd-progress.cjs.entry.js +2 -2
- package/dist/cjs/sd-select-multiple.cjs.entry.js +266 -0
- package/dist/cjs/sd-tbody_3.cjs.entry.js +3 -3
- package/dist/cjs/sd-td.cjs.entry.js +2 -2
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/sd-number-input/sd-number-input.css +128 -0
- package/dist/collection/components/sd-number-input/sd-number-input.js +744 -0
- package/dist/collection/components/sd-number-input/sd-number-input.js.map +1 -0
- package/dist/collection/components/sd-pagination/sd-pagination.js +2 -2
- package/dist/collection/components/sd-popover/sd-popover.js +2 -2
- package/dist/collection/components/sd-portal/sd-portal.js +1 -1
- package/dist/collection/components/sd-progress/sd-progress.js +2 -2
- package/dist/collection/components/sd-select/sd-select-option/sd-select-option.js +1 -1
- package/dist/collection/components/sd-select-multiple/sd-select-multiple.js +2 -2
- package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.css +5 -0
- package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js +91 -42
- package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js.map +1 -1
- package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.js +3 -3
- package/dist/collection/components/sd-table/sd-tbody/sd-tbody.js +1 -1
- package/dist/collection/components/sd-table/sd-td/sd-td.js +2 -2
- package/dist/collection/components/sd-table/sd-th/sd-th.js +1 -1
- package/dist/collection/components/sd-table/sd-tr/sd-tr.js +1 -1
- package/dist/collection/components/sd-toggle/sd-toggle.js +1 -1
- package/dist/collection/components/sd-toggle-button/sd-toggle-button.js +1 -1
- package/dist/collection/components/sd-tooltip/sd-tooltip.js +4 -4
- package/dist/collection/components/sd-tooltip-portal/sd-tooltip-portal.js +1 -1
- package/dist/components/{p-CYadUxId.js → p-BBNolp5g.js} +3 -3
- package/dist/components/{p-CYadUxId.js.map → p-BBNolp5g.js.map} +1 -1
- package/dist/components/{p-71Aop19u.js → p-BH3t01Im.js} +5 -5
- package/dist/components/{p-71Aop19u.js.map → p-BH3t01Im.js.map} +1 -1
- package/dist/components/{p-Be8w5kOo.js → p-BqxmCDlz.js} +7 -7
- package/dist/components/{p-Be8w5kOo.js.map → p-BqxmCDlz.js.map} +1 -1
- package/dist/components/{p-B13lOU0D.js → p-C5T02a4h.js} +4 -4
- package/dist/components/{p-B13lOU0D.js.map → p-C5T02a4h.js.map} +1 -1
- package/dist/components/{p-Cf-LyLYk.js → p-CEDtmtIo.js} +3 -3
- package/dist/components/{p-Cf-LyLYk.js.map → p-CEDtmtIo.js.map} +1 -1
- package/dist/components/{p-DP33nj_I.js → p-Cx3euWvk.js} +3 -3
- package/dist/components/{p-DP33nj_I.js.map → p-Cx3euWvk.js.map} +1 -1
- package/dist/components/{p-ChQIkICO.js → p-DdeknsBE.js} +3 -3
- package/dist/components/{p-ChQIkICO.js.map → p-DdeknsBE.js.map} +1 -1
- package/dist/components/{p-j-ZEdgz4.js → p-GHGGjwP3.js} +3 -3
- package/dist/components/{p-j-ZEdgz4.js.map → p-GHGGjwP3.js.map} +1 -1
- package/dist/components/{p-B4wWf5r8.js → p-XAhTfI7Q.js} +4 -4
- package/dist/components/{p-B4wWf5r8.js.map → p-XAhTfI7Q.js.map} +1 -1
- package/dist/components/{p-CVtij2QI.js → p-at_j60O8.js} +3 -3
- package/dist/components/{p-CVtij2QI.js.map → p-at_j60O8.js.map} +1 -1
- package/dist/components/sd-date-picker.js +1 -1
- package/dist/components/sd-date-range-picker.js +1 -1
- package/dist/components/sd-guide.js +1 -1
- package/dist/components/sd-number-input.d.ts +11 -0
- package/dist/components/sd-number-input.js +335 -0
- package/dist/components/sd-number-input.js.map +1 -0
- package/dist/components/sd-pagination.js +1 -1
- package/dist/components/sd-popover.js +3 -3
- package/dist/components/sd-portal.js +1 -1
- package/dist/components/sd-progress.js +2 -2
- package/dist/components/sd-select-multiple-group.js +74 -45
- package/dist/components/sd-select-multiple-group.js.map +1 -1
- package/dist/components/sd-select-multiple.js +4 -4
- package/dist/components/sd-select-option-group.js +1 -1
- package/dist/components/sd-select-option.js +1 -1
- package/dist/components/sd-select.js +1 -1
- package/dist/components/sd-table-backup.js +6 -6
- package/dist/components/sd-table.js +9 -9
- package/dist/components/sd-tbody.js +1 -1
- package/dist/components/sd-td.js +2 -2
- package/dist/components/sd-th.js +1 -1
- package/dist/components/sd-toggle-button.js +1 -1
- package/dist/components/sd-toggle.js +1 -1
- package/dist/components/sd-tooltip-portal.js +1 -1
- package/dist/components/sd-tooltip.js +1 -1
- package/dist/components/sd-tr.js +1 -1
- package/dist/design-system/design-system.esm.js +1 -1
- package/dist/design-system/p-26266f8c.entry.js +2 -0
- package/dist/design-system/p-2df41cc3.entry.js +2 -0
- package/dist/design-system/p-2df41cc3.entry.js.map +1 -0
- package/dist/design-system/p-3cc7957d.entry.js +2 -0
- package/dist/design-system/p-a18c202d.entry.js +2 -0
- package/dist/design-system/{p-0cbdb34f.entry.js → p-b0668ce9.entry.js} +2 -2
- package/dist/design-system/{p-d02b3369.entry.js → p-f9e04bf9.entry.js} +2 -2
- package/dist/design-system/p-f9e04bf9.entry.js.map +1 -0
- package/dist/esm/design-system.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{sd-button_21.entry.js → sd-button_23.entry.js} +589 -80
- package/dist/esm/sd-popover.entry.js +2 -2
- package/dist/esm/sd-progress.entry.js +2 -2
- package/dist/esm/sd-select-multiple.entry.js +264 -0
- package/dist/esm/sd-select-multiple.entry.js.map +1 -0
- package/dist/esm/sd-tbody_3.entry.js +3 -3
- package/dist/esm/sd-td.entry.js +2 -2
- package/dist/types/components/sd-number-input/sd-number-input.d.ts +58 -0
- package/dist/types/components/sd-select-multiple-group/sd-select-multiple-group.d.ts +2 -0
- package/dist/types/components.d.ts +145 -0
- package/hydrate/index.js +407 -68
- package/hydrate/index.mjs +407 -68
- package/package.json +1 -1
- package/dist/cjs/sd-select-multiple-group.cjs.entry.js +0 -406
- package/dist/cjs/sd-select-option-group.cjs.entry.js +0 -69
- package/dist/design-system/p-1e7a06ef.entry.js +0 -2
- package/dist/design-system/p-761882f5.entry.js +0 -2
- package/dist/design-system/p-790ae9ce.entry.js +0 -2
- package/dist/design-system/p-790ae9ce.entry.js.map +0 -1
- package/dist/design-system/p-a8e8fc17.entry.js +0 -2
- package/dist/design-system/p-d02b3369.entry.js.map +0 -1
- package/dist/design-system/p-e492d625.entry.js +0 -2
- package/dist/design-system/p-e492d625.entry.js.map +0 -1
- package/dist/esm/sd-select-multiple-group.entry.js +0 -404
- package/dist/esm/sd-select-multiple-group.entry.js.map +0 -1
- package/dist/esm/sd-select-option-group.entry.js +0 -67
- package/dist/esm/sd-select-option-group.entry.js.map +0 -1
- /package/dist/design-system/{p-1e7a06ef.entry.js.map → p-26266f8c.entry.js.map} +0 -0
- /package/dist/design-system/{p-761882f5.entry.js.map → p-3cc7957d.entry.js.map} +0 -0
- /package/dist/design-system/{p-a8e8fc17.entry.js.map → p-a18c202d.entry.js.map} +0 -0
- /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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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
|
+
}
|