@operato/input 8.0.0 → 9.0.0-beta.10

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 (211) hide show
  1. package/CHANGELOG.md +199 -23
  2. package/dist/src/index.d.ts +1 -0
  3. package/dist/src/index.js +1 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/ox-buttons-radio.d.ts +1 -1
  6. package/dist/src/ox-buttons-radio.js +11 -13
  7. package/dist/src/ox-buttons-radio.js.map +1 -1
  8. package/dist/src/ox-checkbox.d.ts +1 -1
  9. package/dist/src/ox-checkbox.js +8 -11
  10. package/dist/src/ox-checkbox.js.map +1 -1
  11. package/dist/src/ox-form-field.js +5 -5
  12. package/dist/src/ox-form-field.js.map +1 -1
  13. package/dist/src/ox-input-3axis.d.ts +1 -1
  14. package/dist/src/ox-input-3axis.js +3 -3
  15. package/dist/src/ox-input-3axis.js.map +1 -1
  16. package/dist/src/ox-input-3dish.d.ts +2 -2
  17. package/dist/src/ox-input-3dish.js +8 -4
  18. package/dist/src/ox-input-3dish.js.map +1 -1
  19. package/dist/src/ox-input-angle.d.ts +1 -1
  20. package/dist/src/ox-input-angle.js +5 -3
  21. package/dist/src/ox-input-angle.js.map +1 -1
  22. package/dist/src/ox-input-barcode.js +26 -7
  23. package/dist/src/ox-input-barcode.js.map +1 -1
  24. package/dist/src/ox-input-code.d.ts +1 -1
  25. package/dist/src/ox-input-code.js +14 -17
  26. package/dist/src/ox-input-code.js.map +1 -1
  27. package/dist/src/ox-input-color-gradient.d.ts +3 -3
  28. package/dist/src/ox-input-color-gradient.js +10 -13
  29. package/dist/src/ox-input-color-gradient.js.map +1 -1
  30. package/dist/src/ox-input-color-stops.d.ts +28 -25
  31. package/dist/src/ox-input-color-stops.js +54 -46
  32. package/dist/src/ox-input-color-stops.js.map +1 -1
  33. package/dist/src/ox-input-color.d.ts +1 -1
  34. package/dist/src/ox-input-color.js +5 -3
  35. package/dist/src/ox-input-color.js.map +1 -1
  36. package/dist/src/ox-input-container.js +1 -0
  37. package/dist/src/ox-input-container.js.map +1 -1
  38. package/dist/src/ox-input-crontab.d.ts +1 -1
  39. package/dist/src/ox-input-crontab.js +11 -7
  40. package/dist/src/ox-input-crontab.js.map +1 -1
  41. package/dist/src/ox-input-data.d.ts +1 -1
  42. package/dist/src/ox-input-data.js +3 -3
  43. package/dist/src/ox-input-data.js.map +1 -1
  44. package/dist/src/ox-input-direction.d.ts +2 -1
  45. package/dist/src/ox-input-direction.js +38 -7
  46. package/dist/src/ox-input-direction.js.map +1 -1
  47. package/dist/src/ox-input-duration.d.ts +1 -1
  48. package/dist/src/ox-input-duration.js +8 -3
  49. package/dist/src/ox-input-duration.js.map +1 -1
  50. package/dist/src/ox-input-file.js +10 -9
  51. package/dist/src/ox-input-file.js.map +1 -1
  52. package/dist/src/ox-input-hashtags.js +6 -7
  53. package/dist/src/ox-input-hashtags.js.map +1 -1
  54. package/dist/src/ox-input-i18n-label.d.ts +1 -1
  55. package/dist/src/ox-input-i18n-label.js +7 -9
  56. package/dist/src/ox-input-i18n-label.js.map +1 -1
  57. package/dist/src/ox-input-image.js +3 -2
  58. package/dist/src/ox-input-image.js.map +1 -1
  59. package/dist/src/ox-input-key-values.d.ts +1 -1
  60. package/dist/src/ox-input-key-values.js +7 -9
  61. package/dist/src/ox-input-key-values.js.map +1 -1
  62. package/dist/src/ox-input-layout/ox-input-card-layout.js +4 -6
  63. package/dist/src/ox-input-layout/ox-input-card-layout.js.map +1 -1
  64. package/dist/src/ox-input-layout/ox-input-grid-layout.js +4 -6
  65. package/dist/src/ox-input-layout/ox-input-grid-layout.js.map +1 -1
  66. package/dist/src/ox-input-layout/ox-input-layout.d.ts +2 -2
  67. package/dist/src/ox-input-layout/ox-input-layout.js +7 -10
  68. package/dist/src/ox-input-layout/ox-input-layout.js.map +1 -1
  69. package/dist/src/ox-input-mass-fraction.d.ts +1 -1
  70. package/dist/src/ox-input-mass-fraction.js +9 -11
  71. package/dist/src/ox-input-mass-fraction.js.map +1 -1
  72. package/dist/src/ox-input-multiple-colors.js +5 -6
  73. package/dist/src/ox-input-multiple-colors.js.map +1 -1
  74. package/dist/src/ox-input-options.d.ts +1 -1
  75. package/dist/src/ox-input-options.js +5 -8
  76. package/dist/src/ox-input-options.js.map +1 -1
  77. package/dist/src/ox-input-partition-keys.d.ts +1 -1
  78. package/dist/src/ox-input-partition-keys.js +6 -8
  79. package/dist/src/ox-input-partition-keys.js.map +1 -1
  80. package/dist/src/ox-input-privilege.d.ts +1 -1
  81. package/dist/src/ox-input-privilege.js +6 -7
  82. package/dist/src/ox-input-privilege.js.map +1 -1
  83. package/dist/src/ox-input-quantifier.js +4 -6
  84. package/dist/src/ox-input-quantifier.js.map +1 -1
  85. package/dist/src/ox-input-range.js +6 -9
  86. package/dist/src/ox-input-range.js.map +1 -1
  87. package/dist/src/ox-input-scene-component-id.d.ts +1 -1
  88. package/dist/src/ox-input-scene-component-id.js +5 -7
  89. package/dist/src/ox-input-scene-component-id.js.map +1 -1
  90. package/dist/src/ox-input-search.d.ts +1 -1
  91. package/dist/src/ox-input-search.js +7 -4
  92. package/dist/src/ox-input-search.js.map +1 -1
  93. package/dist/src/ox-input-select-buttons.d.ts +1 -1
  94. package/dist/src/ox-input-select-buttons.js +6 -9
  95. package/dist/src/ox-input-select-buttons.js.map +1 -1
  96. package/dist/src/ox-input-signature.d.ts +4 -2
  97. package/dist/src/ox-input-signature.js +42 -21
  98. package/dist/src/ox-input-signature.js.map +1 -1
  99. package/dist/src/ox-input-stack.d.ts +1 -1
  100. package/dist/src/ox-input-stack.js +7 -10
  101. package/dist/src/ox-input-stack.js.map +1 -1
  102. package/dist/src/ox-input-switch.d.ts +10 -0
  103. package/dist/src/ox-input-switch.js +122 -0
  104. package/dist/src/ox-input-switch.js.map +1 -0
  105. package/dist/src/ox-input-table-column-config.d.ts +1 -1
  106. package/dist/src/ox-input-table-column-config.js +4 -7
  107. package/dist/src/ox-input-table-column-config.js.map +1 -1
  108. package/dist/src/ox-input-table.d.ts +2 -2
  109. package/dist/src/ox-input-table.js +8 -9
  110. package/dist/src/ox-input-table.js.map +1 -1
  111. package/dist/src/ox-input-textarea.d.ts +1 -1
  112. package/dist/src/ox-input-textarea.js +5 -7
  113. package/dist/src/ox-input-textarea.js.map +1 -1
  114. package/dist/src/ox-input-unit-number.d.ts +1 -1
  115. package/dist/src/ox-input-unit-number.js +8 -3
  116. package/dist/src/ox-input-unit-number.js.map +1 -1
  117. package/dist/src/ox-input-value-map.d.ts +2 -2
  118. package/dist/src/ox-input-value-map.js +9 -11
  119. package/dist/src/ox-input-value-map.js.map +1 -1
  120. package/dist/src/ox-input-value-ranges.d.ts +1 -1
  121. package/dist/src/ox-input-value-ranges.js +8 -10
  122. package/dist/src/ox-input-value-ranges.js.map +1 -1
  123. package/dist/src/ox-input-work-shift.js +4 -7
  124. package/dist/src/ox-input-work-shift.js.map +1 -1
  125. package/dist/src/ox-select-floor.d.ts +35 -0
  126. package/dist/src/ox-select-floor.js +237 -0
  127. package/dist/src/ox-select-floor.js.map +1 -0
  128. package/dist/src/ox-select.js +7 -10
  129. package/dist/src/ox-select.js.map +1 -1
  130. package/dist/stories/image-for-select-floor.d.ts +1 -0
  131. package/dist/stories/image-for-select-floor.js +2 -0
  132. package/dist/stories/image-for-select-floor.js.map +1 -0
  133. package/dist/stories/ox-buttons-radio.stories.js +1 -1
  134. package/dist/stories/ox-buttons-radio.stories.js.map +1 -1
  135. package/dist/stories/ox-checkbox.stories.js +1 -1
  136. package/dist/stories/ox-checkbox.stories.js.map +1 -1
  137. package/dist/stories/ox-input-3axis.stories.js +1 -1
  138. package/dist/stories/ox-input-3axis.stories.js.map +1 -1
  139. package/dist/stories/ox-input-3dish.stories.js +1 -1
  140. package/dist/stories/ox-input-3dish.stories.js.map +1 -1
  141. package/dist/stories/ox-input-angle.stories.js +1 -1
  142. package/dist/stories/ox-input-angle.stories.js.map +1 -1
  143. package/dist/stories/ox-input-barcode.stories.js +1 -1
  144. package/dist/stories/ox-input-barcode.stories.js.map +1 -1
  145. package/dist/stories/ox-input-code.stories.js +1 -1
  146. package/dist/stories/ox-input-code.stories.js.map +1 -1
  147. package/dist/stories/ox-input-crontab.stories.js +1 -1
  148. package/dist/stories/ox-input-crontab.stories.js.map +1 -1
  149. package/dist/stories/ox-input-data.stories.js +1 -1
  150. package/dist/stories/ox-input-data.stories.js.map +1 -1
  151. package/dist/stories/ox-input-direction.stories.js +12 -1
  152. package/dist/stories/ox-input-direction.stories.js.map +1 -1
  153. package/dist/stories/ox-input-duration.stories.js +1 -1
  154. package/dist/stories/ox-input-duration.stories.js.map +1 -1
  155. package/dist/stories/ox-input-file.stories.js +1 -1
  156. package/dist/stories/ox-input-file.stories.js.map +1 -1
  157. package/dist/stories/ox-input-hashtags.stories.js +1 -1
  158. package/dist/stories/ox-input-hashtags.stories.js.map +1 -1
  159. package/dist/stories/ox-input-i18n-label.stories.js +1 -1
  160. package/dist/stories/ox-input-i18n-label.stories.js.map +1 -1
  161. package/dist/stories/ox-input-key-values.stories.js +1 -1
  162. package/dist/stories/ox-input-key-values.stories.js.map +1 -1
  163. package/dist/stories/ox-input-mass-fraction.stories.js +1 -1
  164. package/dist/stories/ox-input-mass-fraction.stories.js.map +1 -1
  165. package/dist/stories/ox-input-multiple-colors.stories.js +1 -1
  166. package/dist/stories/ox-input-multiple-colors.stories.js.map +1 -1
  167. package/dist/stories/ox-input-options.stories.js +1 -1
  168. package/dist/stories/ox-input-options.stories.js.map +1 -1
  169. package/dist/stories/ox-input-partition-keys.stories.js +1 -1
  170. package/dist/stories/ox-input-partition-keys.stories.js.map +1 -1
  171. package/dist/stories/ox-input-privilege.stories.js +1 -1
  172. package/dist/stories/ox-input-privilege.stories.js.map +1 -1
  173. package/dist/stories/ox-input-quantifier.stories.js +1 -1
  174. package/dist/stories/ox-input-quantifier.stories.js.map +1 -1
  175. package/dist/stories/ox-input-range.stories.js +1 -1
  176. package/dist/stories/ox-input-range.stories.js.map +1 -1
  177. package/dist/stories/ox-input-search.stories.js +1 -1
  178. package/dist/stories/ox-input-search.stories.js.map +1 -1
  179. package/dist/stories/ox-input-select-buttons.stories.js +1 -1
  180. package/dist/stories/ox-input-select-buttons.stories.js.map +1 -1
  181. package/dist/stories/ox-input-signature.stories.js +1 -1
  182. package/dist/stories/ox-input-signature.stories.js.map +1 -1
  183. package/dist/stories/ox-input-switch.stories.d.ts +38 -0
  184. package/dist/stories/ox-input-switch.stories.js +68 -0
  185. package/dist/stories/ox-input-switch.stories.js.map +1 -0
  186. package/dist/stories/ox-input-table-column-config.stories.js +1 -1
  187. package/dist/stories/ox-input-table-column-config.stories.js.map +1 -1
  188. package/dist/stories/ox-input-unit.stories.js +1 -1
  189. package/dist/stories/ox-input-unit.stories.js.map +1 -1
  190. package/dist/stories/ox-input-value-map.stories.js +1 -1
  191. package/dist/stories/ox-input-value-map.stories.js.map +1 -1
  192. package/dist/stories/ox-input-value-ranges.stories.js +1 -1
  193. package/dist/stories/ox-input-value-ranges.stories.js.map +1 -1
  194. package/dist/stories/ox-input-work-shift.stories.js +1 -1
  195. package/dist/stories/ox-input-work-shift.stories.js.map +1 -1
  196. package/dist/stories/ox-select-floor.stories.d.ts +45 -0
  197. package/dist/stories/ox-select-floor.stories.js +166 -0
  198. package/dist/stories/ox-select-floor.stories.js.map +1 -0
  199. package/dist/stories/ox-select-set-options.stories.js +1 -1
  200. package/dist/stories/ox-select-set-options.stories.js.map +1 -1
  201. package/dist/stories/ox-select.stories.js +1 -1
  202. package/dist/stories/ox-select.stories.js.map +1 -1
  203. package/dist/tsconfig.tsbuildinfo +1 -1
  204. package/package.json +25 -16
  205. package/assets/images/icon-editor-gradient-direction.png +0 -0
  206. package/assets/images/icon-properties-label.png +0 -0
  207. package/assets/images/icon-properties-line-type.png +0 -0
  208. package/assets/images/icon-properties-table.png +0 -0
  209. package/dist/src/ox-zoomable-image.d.ts +0 -17
  210. package/dist/src/ox-zoomable-image.js +0 -80
  211. package/dist/src/ox-zoomable-image.js.map +0 -1
@@ -0,0 +1,237 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html } from 'lit';
3
+ import { customElement, property, query, state } from 'lit/decorators.js';
4
+ import { OxFormField } from './ox-form-field.js';
5
+ let OxSelectFloor = class OxSelectFloor extends OxFormField {
6
+ static styles = [
7
+ css `
8
+ :host {
9
+ display: block;
10
+ position: relative;
11
+ overflow: hidden;
12
+ height: 100%;
13
+
14
+ --ox-select-floor-rotate-x: 60deg;
15
+ --ox-select-floor-rotate-x-active: 40deg;
16
+ --ox-select-floor-perspective: 1200px;
17
+ }
18
+
19
+ .carousel-container {
20
+ position: relative;
21
+ width: 100%;
22
+ overflow: hidden;
23
+ user-select: none;
24
+ }
25
+
26
+ .card {
27
+ position: absolute;
28
+ bottom: 0;
29
+ width: 100%;
30
+ background-color: white;
31
+ transition:
32
+ transform 0.3s ease,
33
+ opacity 0.3s ease,
34
+ box-shadow 0.3s ease,
35
+ border 0.3s ease;
36
+ transform-origin: bottom;
37
+ transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x));
38
+ opacity: 0.5;
39
+ border: 2px solid transparent;
40
+ border-radius: 12px;
41
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
42
+ }
43
+
44
+ .card img {
45
+ width: 100%;
46
+ height: auto;
47
+ display: block;
48
+ pointer-events: none;
49
+ border-radius: 12px;
50
+ }
51
+
52
+ .selected {
53
+ opacity: 0.8;
54
+ z-index: 1;
55
+ border: 4px solid #3b82f6;
56
+ box-shadow: 0 8px 16px rgba(59, 130, 246, 0.4);
57
+ }
58
+
59
+ .selected.active {
60
+ opacity: 1;
61
+ z-index: 2;
62
+ transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x-active));
63
+ box-shadow: 0 12px 24px rgba(59, 130, 246, 0.4);
64
+ }
65
+
66
+ [template-container] {
67
+ position: absolute;
68
+ right: 10px;
69
+ z-index: 1;
70
+ }
71
+ `
72
+ ];
73
+ cards = [];
74
+ value = undefined;
75
+ bottomLimit = 70;
76
+ interval = 0;
77
+ selectedIndex = -1;
78
+ activeIndex = null;
79
+ carouselContainer;
80
+ isDragging = false;
81
+ lastMouseY = 0;
82
+ render() {
83
+ const length = this.cards.length;
84
+ const cards = this.cards;
85
+ const interval = this.interval;
86
+ return html `
87
+ <div
88
+ class="carousel-container"
89
+ @wheel=${interval ? () => { } : this.handleWheel}
90
+ @pointerdown=${this.handlePointerDown}
91
+ @pointermove=${this.handlePointerMove}
92
+ @pointerup=${this.handlePointerUp}
93
+ @pointerleave=${this.handlePointerLeave}
94
+ style=${interval ? `height: ${interval * length + 200}px;` : 'height: 100%;'}
95
+ >
96
+ ${cards.map(({ image, name }, index) => {
97
+ return html `
98
+ <div
99
+ class="card ${this.getClassForCard(index)} ${this.isActive(index) ? 'active' : ''}"
100
+ style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}
101
+ @click=${() => {
102
+ this.selectCard(index);
103
+ this.toggleActiveCard(index);
104
+ }}
105
+ >
106
+ <img src="${image}" @load=${(e) => this.adjustCardHeight(e, index)} />
107
+ </div>
108
+ `;
109
+ })}
110
+ ${cards.map(({ image, name }, index) => {
111
+ return html `
112
+ <div
113
+ style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}
114
+ @click=${() => this.selectCard(index)}
115
+ template-container
116
+ >
117
+ <slot name="template-${index}"></slot>
118
+ </div>
119
+ `;
120
+ })}
121
+ </div>
122
+ `;
123
+ }
124
+ updated(changes) {
125
+ if (changes.has('value')) {
126
+ if (this.value) {
127
+ this.selectedIndex = this.cards.findIndex(card => card.name == this.value);
128
+ }
129
+ else {
130
+ this.selectedIndex = -1;
131
+ }
132
+ }
133
+ }
134
+ firstUpdated() {
135
+ this.scrollToSelectedCard();
136
+ }
137
+ getClassForCard(index) {
138
+ return index === this.selectedIndex ? 'selected' : 'compressed';
139
+ }
140
+ isActive(index) {
141
+ return this.activeIndex === index;
142
+ }
143
+ handleWheel(event) {
144
+ event.preventDefault();
145
+ const delta = Math.sign(event.deltaY);
146
+ this.updateSelectedIndex(this.selectedIndex + delta);
147
+ }
148
+ handlePointerDown(event) {
149
+ event.preventDefault();
150
+ this.isDragging = true;
151
+ this.lastMouseY = event.clientY;
152
+ }
153
+ handlePointerMove(event) {
154
+ if (!this.isDragging) {
155
+ return;
156
+ }
157
+ event.preventDefault();
158
+ const deltaY = event.clientY - this.lastMouseY;
159
+ if (!this.lastMouseY) {
160
+ this.lastMouseY = event.clientY;
161
+ }
162
+ if (Math.abs(deltaY) > 30) {
163
+ this.lastMouseY = event.clientY;
164
+ const direction = deltaY > 0 ? -1 : 1;
165
+ this.updateSelectedIndex(this.selectedIndex + direction);
166
+ }
167
+ }
168
+ handlePointerUp(event) {
169
+ event.preventDefault();
170
+ this.isDragging = false;
171
+ }
172
+ handlePointerLeave(event) {
173
+ event.preventDefault();
174
+ this.isDragging = false;
175
+ }
176
+ toggleActiveCard(index) {
177
+ if (this.activeIndex === index) {
178
+ this.activeIndex = null;
179
+ }
180
+ else {
181
+ this.activeIndex = index;
182
+ }
183
+ }
184
+ updateSelectedIndex(newIndex) {
185
+ this.activeIndex = null;
186
+ this.selectedIndex = Math.max(-1, Math.min(newIndex, this.cards.length - 1));
187
+ this.scrollToSelectedCard();
188
+ }
189
+ scrollToSelectedCard() {
190
+ const cardHeight = 320;
191
+ const targetScrollTop = this.selectedIndex * cardHeight - (window.innerHeight / 2 - cardHeight / 2);
192
+ this.carouselContainer.scrollTo({ top: targetScrollTop, behavior: 'smooth' });
193
+ }
194
+ selectCard(index) {
195
+ this.selectedIndex = index;
196
+ this.notifySelection();
197
+ this.scrollToSelectedCard();
198
+ }
199
+ notifySelection() {
200
+ this.value = this.selectedIndex !== -1 ? this.cards[this.selectedIndex]?.name : undefined;
201
+ this.dispatchEvent(new CustomEvent('change', {
202
+ detail: this.value
203
+ }));
204
+ }
205
+ adjustCardHeight(e, index) {
206
+ const imgElement = e.target;
207
+ const aspectRatio = imgElement.naturalWidth / imgElement.naturalHeight;
208
+ const newHeight = imgElement.offsetWidth / aspectRatio;
209
+ imgElement.style.height = `${newHeight}px`;
210
+ }
211
+ };
212
+ __decorate([
213
+ property({ type: Array })
214
+ ], OxSelectFloor.prototype, "cards", void 0);
215
+ __decorate([
216
+ property({ type: String })
217
+ ], OxSelectFloor.prototype, "value", void 0);
218
+ __decorate([
219
+ property({ type: Number })
220
+ ], OxSelectFloor.prototype, "bottomLimit", void 0);
221
+ __decorate([
222
+ property({ type: Number })
223
+ ], OxSelectFloor.prototype, "interval", void 0);
224
+ __decorate([
225
+ state()
226
+ ], OxSelectFloor.prototype, "selectedIndex", void 0);
227
+ __decorate([
228
+ state()
229
+ ], OxSelectFloor.prototype, "activeIndex", void 0);
230
+ __decorate([
231
+ query('.carousel-container')
232
+ ], OxSelectFloor.prototype, "carouselContainer", void 0);
233
+ OxSelectFloor = __decorate([
234
+ customElement('ox-select-floor')
235
+ ], OxSelectFloor);
236
+ export { OxSelectFloor };
237
+ //# sourceMappingURL=ox-select-floor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-select-floor.js","sourceRoot":"","sources":["../../src/ox-select-floor.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { OxFormField } from './ox-form-field.js'\n\ntype Card = {\n name: string\n image: string\n}\n\n@customElement('ox-select-floor')\nexport class OxSelectFloor extends OxFormField {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n height: 100%;\n\n --ox-select-floor-rotate-x: 60deg;\n --ox-select-floor-rotate-x-active: 40deg;\n --ox-select-floor-perspective: 1200px;\n }\n\n .carousel-container {\n position: relative;\n width: 100%;\n overflow: hidden;\n user-select: none;\n }\n\n .card {\n position: absolute;\n bottom: 0;\n width: 100%;\n background-color: white;\n transition:\n transform 0.3s ease,\n opacity 0.3s ease,\n box-shadow 0.3s ease,\n border 0.3s ease;\n transform-origin: bottom;\n transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x));\n opacity: 0.5;\n border: 2px solid transparent;\n border-radius: 12px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n }\n\n .card img {\n width: 100%;\n height: auto;\n display: block;\n pointer-events: none;\n border-radius: 12px;\n }\n\n .selected {\n opacity: 0.8;\n z-index: 1;\n border: 4px solid #3b82f6;\n box-shadow: 0 8px 16px rgba(59, 130, 246, 0.4);\n }\n\n .selected.active {\n opacity: 1;\n z-index: 2;\n transform: perspective(var(--ox-select-floor-perspective)) rotateX(var(--ox-select-floor-rotate-x-active));\n box-shadow: 0 12px 24px rgba(59, 130, 246, 0.4);\n }\n\n [template-container] {\n position: absolute;\n right: 10px;\n z-index: 1;\n }\n `\n ]\n\n @property({ type: Array }) cards: Card[] = []\n @property({ type: String }) value?: string = undefined\n @property({ type: Number }) bottomLimit = 70\n @property({ type: Number }) interval = 0\n\n @state() private selectedIndex = -1\n @state() private activeIndex: number | null = null\n @query('.carousel-container') private carouselContainer!: HTMLDivElement\n\n private isDragging = false\n private lastMouseY = 0\n\n render() {\n const length = this.cards.length\n const cards = this.cards\n const interval = this.interval\n\n return html`\n <div\n class=\"carousel-container\"\n @wheel=${interval ? () => {} : this.handleWheel}\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointerleave=${this.handlePointerLeave}\n style=${interval ? `height: ${interval * length + 200}px;` : 'height: 100%;'}\n >\n ${cards.map(({ image, name }, index) => {\n return html`\n <div\n class=\"card ${this.getClassForCard(index)} ${this.isActive(index) ? 'active' : ''}\"\n style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}\n @click=${() => {\n this.selectCard(index)\n this.toggleActiveCard(index)\n }}\n >\n <img src=\"${image}\" @load=${(e: Event) => this.adjustCardHeight(e, index)} />\n </div>\n `\n })}\n ${cards.map(({ image, name }, index) => {\n return html`\n <div\n style=${`bottom: ${interval ? interval * index + 'px' : (this.bottomLimit * index) / length + '%'};`}\n @click=${() => this.selectCard(index)}\n template-container\n >\n <slot name=\"template-${index}\"></slot>\n </div>\n `\n })}\n </div>\n `\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('value')) {\n if (this.value) {\n this.selectedIndex = this.cards.findIndex(card => card.name == this.value)\n } else {\n this.selectedIndex = -1\n }\n }\n }\n\n firstUpdated() {\n this.scrollToSelectedCard()\n }\n\n getClassForCard(index: number) {\n return index === this.selectedIndex ? 'selected' : 'compressed'\n }\n\n isActive(index: number): boolean {\n return this.activeIndex === index\n }\n\n handleWheel(event: WheelEvent) {\n event.preventDefault()\n const delta = Math.sign(event.deltaY)\n this.updateSelectedIndex(this.selectedIndex + delta)\n }\n\n handlePointerDown(event: PointerEvent) {\n event.preventDefault()\n\n this.isDragging = true\n this.lastMouseY = event.clientY\n }\n\n handlePointerMove(event: PointerEvent) {\n if (!this.isDragging) {\n return\n }\n\n event.preventDefault()\n\n const deltaY = event.clientY - this.lastMouseY\n\n if (!this.lastMouseY) {\n this.lastMouseY = event.clientY\n }\n\n if (Math.abs(deltaY) > 30) {\n this.lastMouseY = event.clientY\n const direction = deltaY > 0 ? -1 : 1\n this.updateSelectedIndex(this.selectedIndex + direction)\n }\n }\n\n handlePointerUp(event: PointerEvent) {\n event.preventDefault()\n this.isDragging = false\n }\n\n handlePointerLeave(event: PointerEvent) {\n event.preventDefault()\n\n this.isDragging = false\n }\n\n private toggleActiveCard(index: number) {\n if (this.activeIndex === index) {\n this.activeIndex = null\n } else {\n this.activeIndex = index\n }\n }\n\n private updateSelectedIndex(newIndex: number) {\n this.activeIndex = null\n\n this.selectedIndex = Math.max(-1, Math.min(newIndex, this.cards.length - 1))\n this.scrollToSelectedCard()\n }\n\n private scrollToSelectedCard() {\n const cardHeight = 320\n const targetScrollTop = this.selectedIndex * cardHeight - (window.innerHeight / 2 - cardHeight / 2)\n\n this.carouselContainer.scrollTo({ top: targetScrollTop, behavior: 'smooth' })\n }\n\n private selectCard(index: number) {\n this.selectedIndex = index\n this.notifySelection()\n this.scrollToSelectedCard()\n }\n\n private notifySelection() {\n this.value = this.selectedIndex !== -1 ? this.cards[this.selectedIndex]?.name : undefined\n\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: this.value\n })\n )\n }\n\n private adjustCardHeight(e: Event, index: number) {\n const imgElement = e.target as HTMLImageElement\n const aspectRatio = imgElement.naturalWidth / imgElement.naturalHeight\n const newHeight = imgElement.offsetWidth / aspectRatio\n imgElement.style.height = `${newHeight}px`\n }\n}\n"]}
@@ -10,15 +10,7 @@ import { customElement, property, state } from 'lit/decorators.js';
10
10
  import { OxPopupList } from '@operato/popup';
11
11
  import { OxFormField } from './ox-form-field.js';
12
12
  let OxSelect = class OxSelect extends OxFormField {
13
- constructor() {
14
- super(...arguments);
15
- this.name = '';
16
- this.placeholder = '';
17
- this.label = '';
18
- this.popupContainer = null;
19
- this.observer = null;
20
- }
21
- static { this.styles = [
13
+ static styles = [
22
14
  css `
23
15
  :host {
24
16
  display: block;
@@ -66,7 +58,12 @@ let OxSelect = class OxSelect extends OxFormField {
66
58
  color: var(--md-sys-color-on-primary-container);
67
59
  }
68
60
  `
69
- ]; }
61
+ ];
62
+ name = '';
63
+ placeholder = '';
64
+ label = '';
65
+ popupContainer = null;
66
+ observer = null;
70
67
  render() {
71
68
  const label = (this.label instanceof Array ? this.label.join(', ') : this.label?.trim()) ||
72
69
  (this.value instanceof Array ? this.value.join(', ') : this.value?.trim()) ||
@@ -1 +1 @@
1
- {"version":3,"file":"ox-select.js","sourceRoot":"","sources":["../../src/ox-select.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,4BAA4B,CAAA;AACnC,OAAO,iCAAiC,CAAA;AACxC,OAAO,kBAAkB,CAAA;AAEzB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAkB,MAAM,KAAK,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAS,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGzC,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,WAAW;IAAlC;;QAmDuB,SAAI,GAAW,EAAE,CAAA;QACjB,gBAAW,GAAW,EAAE,CAAA;QAE3C,UAAK,GAAsB,EAAE,CAAA;QAC7B,mBAAc,GAAuB,IAAI,CAAA;QACzC,aAAQ,GAA4B,IAAI,CAAA;IAkJnD,CAAC;aAzMQ,WAAM,GAAG;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8CF;KACF,AAhDY,CAgDZ;IASD,MAAM;QACJ,MAAM,KAAK,GACT,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1E,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1E,IAAI,CAAC,WAAW;YAChB,EAAE,CAAA;QAEJ,OAAO,IAAI,CAAA;oBACK,IAAI,CAAC,MAAM;sCACO,KAAK;;;;;KAKtC,CAAA;IACH,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QAEzB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QAElC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAgB,EAAE,EAAE;YACpD,CAAC,CAAC,cAAc,EAAE,CAAA;YAElB,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;gBACnE,IAAI,CAAC,MAAM,EAAE,CAAA;YACf,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA6B;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,eAAe,CAAC;gBACpE,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAgB,CAAA;YAErD,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;gBAC5B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;gBAE1B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CACR,OAAwD,EACxD,MAAoD,EAAE;QAEtD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACtC,OAAO,OAAO,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;QAChF,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,IAAI,EAAE,CAAA;QAE1C,MAAM,QAAQ,GAAG,IAAI,CAAA;;;;oBAIL,QAAQ;wBACJ,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;uBAC1B,UAAU;;UAEvB,QAAQ;YACR,CAAC,CAAC,IAAI,CAAA;0BACU,CAAC,CAAQ,EAAE,EAAE;gBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,MAA0B,CAAA;gBAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAc,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CACnF,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CACzC,CAAA;gBACD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAE,MAA2B,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;gBAElF,IAAI,CAAC,KAAK,GAAG,OAAO;qBACjB,GAAG,CAAC,MAAM,CAAC,EAAE,CACX,MAA2B,CAAC,OAAO,CAAC,CAAC,CAAE,MAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CACtF;qBACA,MAAM,CAAC,OAAO,CAAC,CAAA;YACpB,CAAC;;;gBAGD,UAAU,CAAC,GAAG,CACd,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA,8BAA8B,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,iBAAiB,CAC5F,EAAE;YACP,CAAC,CAAC,IAAI,CAAA,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA,sBAAsB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,SAAS,CAAC,EAAE;;KAE3G,CAAA;QAED,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA;QAEhF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,YAAY,WAAW,CAAgB,CAAA;YAE5F,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;gBAErD,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;gBAC5B,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,CAAA;gBAC/C,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBAEnC,MAAM,aAAa,GAAG,KAAK,EAAE,CAAQ,EAAE,EAAE;oBACvC,IAAI,CAAC,KAAK,GAAI,CAAiB,CAAC,MAAM,CAAA;oBAEtC,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;wBAC1B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAA;oBAC5C,CAAC;gBACH,CAAC,CAAA;gBACD,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;gBAEnD,MAAM,YAAY,GAAG,CAAC,CAAQ,EAAE,EAAE;oBAChC,wCAAwC;oBACxC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;wBACxB,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE,IAAI,CAAC,KAAK;qBACnB,CAAC,CACH,CAAA;oBACD,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;oBACtD,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;oBAEpD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;gBAC7B,CAAC,CAAA;gBACD,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBAEjE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;gBAEpC,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI;oBACJ,GAAG,EAAE,MAAM;iBACZ,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;;AAtJ2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sCAAkB;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAyB;AAE3C;IAAR,KAAK,EAAE;uCAA8B;AAC7B;IAAR,KAAK,EAAE;gDAA0C;AACzC;IAAR,KAAK,EAAE;0CAAyC;AAxDtC,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CA0MpB","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@material/web/icon/icon.js'\nimport '@operato/popup/ox-popup-list.js'\nimport './ox-checkbox.js'\n\nimport { css, html, render, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { OxPopupList } from '@operato/popup'\n\nimport { OxFormField } from './ox-form-field.js'\n\n@customElement('ox-select')\nexport class OxSelect extends OxFormField {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n\n --ox-select-padding: var(--spacing-tiny);\n --ox-select-font: var(--input-font);\n --ox-select-color: var(--input-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-color: var(--theme-primary-text-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-hover-color: var(--md-sys-color-on-primary-container, #3c3938);\n }\n\n div {\n width: 100%;\n box-sizing: border-box;\n\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: var(--ox-select-padding);\n font: var(--ox-select-font);\n color: var(--ox-select-color);\n }\n\n span {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n gap: 4px;\n }\n\n md-icon {\n --md-icon-size: 16px;\n display: block;\n text-align: right;\n color: var(--ox-select-icon-color);\n opacity: 0.7;\n }\n\n div:hover md-icon {\n color: var(--md-sys-color-on-primary-container);\n }\n `\n ]\n\n @property({ type: String }) name: string = ''\n @property({ type: String }) placeholder: string = ''\n\n @state() label: string | string[] = ''\n @state() popupContainer: HTMLElement | null = null\n @state() observer: MutationObserver | null = null\n\n render() {\n const label =\n (this.label instanceof Array ? this.label.join(', ') : this.label?.trim()) ||\n (this.value instanceof Array ? this.value.join(', ') : this.value?.trim()) ||\n this.placeholder ||\n ''\n\n return html`\n <div @click=${this.expand}>\n <span data-reactive-tooltip>${label}</span>\n <md-icon>expand_more</md-icon>\n </div>\n\n <slot></slot>\n `\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n this.setAttribute('tabindex', '0')\n\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n e.preventDefault()\n\n if (e.key === ' ' || e.key === 'Spacebar' || e.key === 'ArrowDown') {\n this.expand()\n }\n })\n\n this.addEventListener('click', () => this.expand())\n }\n\n async updated(changes: PropertyValues<this>) {\n if (changes.has('value')) {\n const popupList = (this.popupContainer?.querySelector('ox-popup-list') ||\n this.querySelector('ox-popup-list')) as OxPopupList\n\n if (popupList) {\n popupList.value = this.value\n await this.requestUpdate()\n\n this.label = popupList.getSelectedLabels()\n }\n }\n }\n\n setOptions(\n options: string[] | { display: string; value: string }[],\n opt: { multiple?: boolean; withSearch?: boolean } = {}\n ) {\n const objOptions = options.map(option => {\n return typeof option == 'string' ? { display: option, value: option } : option\n })\n\n const { multiple, withSearch } = opt || {}\n\n const template = html`\n <ox-popup-list\n align-left\n nowrap\n ?multiple=${multiple}\n attr-selected=${multiple ? 'checked' : ''}\n ?with-search=${withSearch}\n >\n ${multiple\n ? html`<ox-checkbox\n @change=${(e: Event) => {\n const target = e.target as HTMLInputElement\n const options = Array.from(target.parentElement!.querySelectorAll('[option]')).filter(\n option => !option.hasAttribute('hidden')\n )\n options.forEach(option => ((option as HTMLInputElement).checked = target.checked))\n\n this.value = options\n .map(option =>\n (option as HTMLInputElement).checked ? (option as HTMLInputElement).value : undefined\n )\n .filter(Boolean)\n }}\n >set all</ox-checkbox\n >\n ${objOptions.map(\n option => html` <ox-checkbox option value=${option.value}>${option.display}</ox-checkbox> `\n )}`\n : html`${objOptions.map(option => html` <div option value=${option.value}>${option.display}</div> `)}`}\n </ox-popup-list>\n `\n\n render(template, this)\n }\n\n expand() {\n if (this.disabled) {\n return\n }\n\n const slotContent = this.renderRoot.querySelector('slot')?.assignedNodes() || []\n\n if (slotContent.length > 0) {\n const popupList = slotContent.find(content => content instanceof OxPopupList) as OxPopupList\n\n if (popupList) {\n const { left, bottom } = this.getBoundingClientRect()\n\n popupList.value = this.value\n popupList.style.width = `${this.offsetWidth}px`\n popupList.style.textWrap = 'nowrap'\n\n const selectHandler = async (e: Event) => {\n this.value = (e as CustomEvent).detail\n\n if (popupList) {\n await this.requestUpdate()\n this.label = popupList.getSelectedLabels()\n }\n }\n popupList.addEventListener('select', selectHandler)\n\n const closeHandler = (e: Event) => {\n /* popup이 close될 때 change 이벤트를 발생시킨다. */\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n popupList.removeEventListener('select', selectHandler)\n popupList.removeEventListener('close', closeHandler)\n\n this.appendChild(popupList)\n }\n popupList.addEventListener('close', closeHandler, { once: true })\n\n document.body.appendChild(popupList)\n\n popupList.open({\n left,\n top: bottom\n })\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ox-select.js","sourceRoot":"","sources":["../../src/ox-select.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@material/web/icon/icon.js'\nimport '@operato/popup/ox-popup-list.js'\nimport './ox-checkbox.js'\n\nimport { css, html, render, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { OxPopupList } from '@operato/popup'\n\nimport { OxFormField } from './ox-form-field.js'\n\n@customElement('ox-select')\nexport class OxSelect extends OxFormField {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n border-bottom: 1px solid rgba(0, 0, 0, 0.15);\n\n --ox-select-padding: var(--spacing-tiny);\n --ox-select-font: var(--input-font);\n --ox-select-color: var(--input-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-color: var(--theme-primary-text-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-hover-color: var(--md-sys-color-on-primary-container, #3c3938);\n }\n\n div {\n width: 100%;\n box-sizing: border-box;\n\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: var(--ox-select-padding);\n font: var(--ox-select-font);\n color: var(--ox-select-color);\n }\n\n span {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n gap: 4px;\n }\n\n md-icon {\n --md-icon-size: 16px;\n display: block;\n text-align: right;\n color: var(--ox-select-icon-color);\n opacity: 0.7;\n }\n\n div:hover md-icon {\n color: var(--md-sys-color-on-primary-container);\n }\n `\n ]\n\n @property({ type: String }) name: string = ''\n @property({ type: String }) placeholder: string = ''\n\n @state() label: string | string[] = ''\n @state() popupContainer: HTMLElement | null = null\n @state() observer: MutationObserver | null = null\n\n render() {\n const label =\n (this.label instanceof Array ? this.label.join(', ') : this.label?.trim()) ||\n (this.value instanceof Array ? this.value.join(', ') : this.value?.trim()) ||\n this.placeholder ||\n ''\n\n return html`\n <div @click=${this.expand}>\n <span data-reactive-tooltip>${label}</span>\n <md-icon>expand_more</md-icon>\n </div>\n\n <slot></slot>\n `\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n this.setAttribute('tabindex', '0')\n\n this.addEventListener('keydown', (e: KeyboardEvent) => {\n e.preventDefault()\n\n if (e.key === ' ' || e.key === 'Spacebar' || e.key === 'ArrowDown') {\n this.expand()\n }\n })\n\n this.addEventListener('click', () => this.expand())\n }\n\n async updated(changes: PropertyValues<this>) {\n if (changes.has('value')) {\n const popupList = (this.popupContainer?.querySelector('ox-popup-list') ||\n this.querySelector('ox-popup-list')) as OxPopupList\n\n if (popupList) {\n popupList.value = this.value\n await this.requestUpdate()\n\n this.label = popupList.getSelectedLabels()\n }\n }\n }\n\n setOptions(\n options: string[] | { display: string; value: string }[],\n opt: { multiple?: boolean; withSearch?: boolean } = {}\n ) {\n const objOptions = options.map(option => {\n return typeof option == 'string' ? { display: option, value: option } : option\n })\n\n const { multiple, withSearch } = opt || {}\n\n const template = html`\n <ox-popup-list\n align-left\n nowrap\n ?multiple=${multiple}\n attr-selected=${multiple ? 'checked' : ''}\n ?with-search=${withSearch}\n >\n ${multiple\n ? html`<ox-checkbox\n @change=${(e: Event) => {\n const target = e.target as HTMLInputElement\n const options = Array.from(target.parentElement!.querySelectorAll('[option]')).filter(\n option => !option.hasAttribute('hidden')\n )\n options.forEach(option => ((option as HTMLInputElement).checked = target.checked))\n\n this.value = options\n .map(option =>\n (option as HTMLInputElement).checked ? (option as HTMLInputElement).value : undefined\n )\n .filter(Boolean)\n }}\n >set all</ox-checkbox\n >\n ${objOptions.map(\n option => html` <ox-checkbox option value=${option.value}>${option.display}</ox-checkbox> `\n )}`\n : html`${objOptions.map(option => html` <div option value=${option.value}>${option.display}</div> `)}`}\n </ox-popup-list>\n `\n\n render(template, this)\n }\n\n expand() {\n if (this.disabled) {\n return\n }\n\n const slotContent = this.renderRoot.querySelector('slot')?.assignedNodes() || []\n\n if (slotContent.length > 0) {\n const popupList = slotContent.find(content => content instanceof OxPopupList) as OxPopupList\n\n if (popupList) {\n const { left, bottom } = this.getBoundingClientRect()\n\n popupList.value = this.value\n popupList.style.width = `${this.offsetWidth}px`\n popupList.style.textWrap = 'nowrap'\n\n const selectHandler = async (e: Event) => {\n this.value = (e as CustomEvent).detail\n\n if (popupList) {\n await this.requestUpdate()\n this.label = popupList.getSelectedLabels()\n }\n }\n popupList.addEventListener('select', selectHandler)\n\n const closeHandler = (e: Event) => {\n /* popup이 close될 때 change 이벤트를 발생시킨다. */\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n popupList.removeEventListener('select', selectHandler)\n popupList.removeEventListener('close', closeHandler)\n\n this.appendChild(popupList)\n }\n popupList.addEventListener('close', closeHandler, { once: true })\n\n document.body.appendChild(popupList)\n\n popupList.open({\n left,\n top: bottom\n })\n }\n }\n }\n}\n"]}