@operato/input 1.0.0-alpha.8 → 1.0.0-alpha.9

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 (61) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +9 -6
  3. package/assets/images/icon-editor-gradient-direction.png +0 -0
  4. package/assets/images/icon-properties-label.png +0 -0
  5. package/demo/index-color-gradient.html +35 -0
  6. package/demo/index-color-stops.html +62 -0
  7. package/demo/index-color.html +35 -0
  8. package/demo/index-multiple-colors.html +37 -0
  9. package/demo/index.html +4 -0
  10. package/dist/src/index.d.ts +15 -11
  11. package/dist/src/index.js +15 -11
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/ox-input-background-pattern.d.ts +31 -0
  14. package/dist/src/ox-input-background-pattern.js +147 -0
  15. package/dist/src/ox-input-background-pattern.js.map +1 -0
  16. package/dist/src/ox-input-code.d.ts +4 -4
  17. package/dist/src/ox-input-code.js +8 -8
  18. package/dist/src/ox-input-code.js.map +1 -1
  19. package/dist/src/ox-input-color-gradient.d.ts +26 -0
  20. package/dist/src/ox-input-color-gradient.js +318 -0
  21. package/dist/src/ox-input-color-gradient.js.map +1 -0
  22. package/dist/src/ox-input-color-stops.d.ts +71 -0
  23. package/dist/src/ox-input-color-stops.js +445 -0
  24. package/dist/src/ox-input-color-stops.js.map +1 -0
  25. package/dist/src/ox-input-color.d.ts +176 -0
  26. package/dist/src/ox-input-color.js +298 -0
  27. package/dist/src/ox-input-color.js.map +1 -0
  28. package/dist/src/ox-input-data.d.ts +1 -1
  29. package/dist/src/ox-input-data.js +1 -1
  30. package/dist/src/ox-input-data.js.map +1 -1
  31. package/dist/src/ox-input-fill-style.d.ts +42 -0
  32. package/dist/src/ox-input-fill-style.js +323 -0
  33. package/dist/src/ox-input-fill-style.js.map +1 -0
  34. package/dist/src/ox-input-multiple-colors.d.ts +28 -0
  35. package/dist/src/ox-input-multiple-colors.js +113 -0
  36. package/dist/src/ox-input-multiple-colors.js.map +1 -0
  37. package/dist/src/ox-input-scene-component-id.d.ts +11 -0
  38. package/dist/src/ox-input-scene-component-id.js +68 -0
  39. package/dist/src/ox-input-scene-component-id.js.map +1 -0
  40. package/dist/src/ox-input-stack.d.ts +1 -1
  41. package/dist/src/ox-input-stack.js +1 -1
  42. package/dist/src/ox-input-stack.js.map +1 -1
  43. package/dist/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +14 -7
  45. package/src/index.ts +15 -11
  46. package/src/ox-input-background-pattern.ts.xxx +163 -0
  47. package/src/ox-input-code.ts +9 -10
  48. package/src/ox-input-color-gradient.ts.xxx +343 -0
  49. package/src/ox-input-color-stops.ts +499 -0
  50. package/src/ox-input-color.ts +323 -0
  51. package/src/ox-input-data.ts +2 -2
  52. package/src/ox-input-fill-style.ts.xxx +361 -0
  53. package/src/ox-input-keyvalues.ts.ing +10 -10
  54. package/src/ox-input-multiple-colors.ts +113 -0
  55. package/src/ox-input-ranges.ts.ing +12 -12
  56. package/src/{ox-input-id.ts → ox-input-scene-component-id.ts} +1 -1
  57. package/src/ox-input-stack.ts +1 -1
  58. package/translations/en.json +1 -0
  59. package/translations/ko.json +1 -0
  60. package/translations/ms.json +1 -0
  61. package/translations/zh.json +1 -0
@@ -0,0 +1,445 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { __decorate } from "tslib";
5
+ import './ox-input-color';
6
+ import { css, html } from 'lit';
7
+ import { customElement, property, query } from 'lit/decorators.js';
8
+ import { OxFormField } from './ox-form-field';
9
+ import deepEquals from 'lodash-es/isEqual';
10
+ /**
11
+ 범위내에서 여러 컬러셋(포지션과 색깔) 배열을 편집하는 컴포넌트이다.
12
+
13
+ 미리보기 Bar에서는 gradient나, solid 형태의 컬러셋을 보여준다.
14
+
15
+ 새로운 컬러셋을 추가고자 할 때는 미리보기 Bar를 더블클릭한다.
16
+ 컬러셋을 제거하고자 할 때는 컬러셋 마커를 아래방향으로 드래깅한다.
17
+ 컬러셋의 위치를 옮기고자 할 때는, 컬러셋 마커를 좌우로 드래깅하여 이동시키거나,
18
+ 옮기고자하는 컬러셋 마커를 마우스로 선택하고, 포지션 입력 에디터에서 직접 수정한다.
19
+ 컬러셋의 색상을 바꾸고자 할 때는, 컬러셋 마커를 더블클릭하여 컬러파레트를 팝업시켜서 색상을 선택하거나, 색상 입력 에디터에서 직접 색상을 수정할 수 있다.
20
+
21
+ Example:
22
+
23
+ <ox-input-color-stops type="gradient" .value=${gradient.colorStops}>
24
+ </ox-input-color-stops>
25
+ */
26
+ let OxInputColorStops = class OxInputColorStops extends OxFormField {
27
+ constructor() {
28
+ super(...arguments);
29
+ /**
30
+ * `type`은 color-stop bar의 표시 방법을 의미한다.
31
+ * - 'solid' : 컬러스톱위치에서 다음 컬러스톱까지 solid color로 채운다.
32
+ * - 'gradient' : 컬러스톱위치에서 다음 컬러스톱까지 gradient color로 채운다.
33
+ */
34
+ this.type = 'solid';
35
+ /**
36
+ * `min`은 color-stop bar의 위치값 범위의 최소값을 의미한다.
37
+ */
38
+ this.min = 0;
39
+ /**
40
+ * `max`은 color-stop bar의 위치값 범위의 최대값을 의미한다.
41
+ */
42
+ this.max = 1;
43
+ this.dragstart = { position: 0, x: 0, y: 0 };
44
+ }
45
+ static { this.styles = css `
46
+ :host {
47
+ display: grid;
48
+ grid-template-columns: repeat(10, 1fr);
49
+ grid-gap: 0;
50
+ grid-auto-rows: minmax(0, auto);
51
+ }
52
+
53
+ #color-stops {
54
+ grid-column: 1 / 11;
55
+ grid-row: 1;
56
+
57
+ clear: both;
58
+ margin-bottom: -3px;
59
+ }
60
+
61
+ #colorbar {
62
+ width: 95%;
63
+ height: 12px;
64
+ margin: auto;
65
+ margin-bottom: 25px;
66
+ border: 1px solid #ccc;
67
+ }
68
+
69
+ #markers {
70
+ position: relative;
71
+ top: 30px;
72
+ }
73
+
74
+ #markers div {
75
+ width: 10px;
76
+ height: 10px;
77
+ margin-top: -15px;
78
+ position: absolute;
79
+ border: 2px solid #fff;
80
+ cursor: pointer;
81
+ -webkit-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);
82
+ -moz-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);
83
+ box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);
84
+ }
85
+
86
+ #markers div::before {
87
+ border-bottom: 6px solid #fff;
88
+ border-left: 7px solid transparent;
89
+ border-right: 7px solid transparent;
90
+ content: '';
91
+ width: 0;
92
+ height: 0;
93
+ left: -2px;
94
+ position: absolute;
95
+ top: -8px;
96
+ }
97
+
98
+ #markers div[focused] {
99
+ border-color: var(--things-editor-colorbar-marker-focused-color, #585858);
100
+ }
101
+
102
+ #markers div[focused]:before {
103
+ border-bottom: 7px solid var(--things-editor-colorbar-marker-focused-color, #585858);
104
+ }
105
+
106
+ .icon-only-label {
107
+ background: url(/assets/images/icon-properties-label.png) no-repeat;
108
+ width: 30px;
109
+ height: 24px;
110
+ }
111
+
112
+ .icon-only-label.color {
113
+ grid-column: 1 / 2;
114
+ grid-row: 2;
115
+
116
+ background-position: 70% -498px;
117
+ float: left;
118
+ margin-top: 0;
119
+ }
120
+
121
+ .icon-only-label.position {
122
+ grid-column: 7 / 8;
123
+ grid-row: 2;
124
+
125
+ background-position: 70% -797px;
126
+ float: left;
127
+ margin-top: 0;
128
+ }
129
+
130
+ things-editor-color {
131
+ grid-column: 2 / 7;
132
+ grid-row: 2;
133
+ }
134
+
135
+ input[type='number'] {
136
+ grid-column: 8 / 11;
137
+ grid-row: 2;
138
+ border: 1px solid rgba(0, 0, 0, 0.2);
139
+ }
140
+ `; }
141
+ connectedCallback() {
142
+ super.connectedCallback();
143
+ this._dragImage = new Image();
144
+ this._dragImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
145
+ }
146
+ firstUpdated() {
147
+ window.addEventListener('resize', () => {
148
+ this.requestUpdate();
149
+ });
150
+ }
151
+ updated(changes) {
152
+ var needRerenderColorBar = false;
153
+ if (changes.has('value') && this.value instanceof Array) {
154
+ var oldValue = changes.get('value');
155
+ if (this.focused &&
156
+ (!oldValue ||
157
+ this.value.findIndex(v => v.position == this.focused.position && v.color == this.focused.color) == -1)) {
158
+ /* 이전 값이 없었던 경우에 focused를 클리어시킨다.
159
+ * 이전 값이 있던 경우에도, focused는 이 에디터 내부에서만 선택될 수 있으며, 수정될 수 있으므로 동일한 포지션을 갖는 value가 없으면, 새로운 에디터가 시작된 것으로 판단하여 focused를 클리어시킨다.
160
+ */
161
+ this.focused = null;
162
+ }
163
+ if (!deepEquals(oldValue, this.value)) {
164
+ needRerenderColorBar = true;
165
+ }
166
+ }
167
+ if (needRerenderColorBar || changes.has('min') || changes.has('max')) {
168
+ if (!this.value) {
169
+ this.value = [
170
+ { color: 'white', position: this.min },
171
+ { color: 'white', position: this.max }
172
+ ];
173
+ }
174
+ this._renderColorBar(this.min, this.max, this.type);
175
+ this.requestUpdate();
176
+ }
177
+ }
178
+ render() {
179
+ return html `
180
+ <div id="color-stops">
181
+ <div id="colorbar" @dblclick=${(e) => this._onDblClickColorbar(e)}>
182
+ <div
183
+ id="markers"
184
+ @dblclick=${(e) => this._onDblClickMarkers(e)}
185
+ @mousedown=${(e) => this._onMouseDown(e)}
186
+ @dragstart=${(e) => this._onDragStart(e)}
187
+ @drag=${this._throttled(100, this._onDrag.bind(this))}
188
+ @dragend=${(e) => this._onDragEnd(e)}
189
+ >
190
+ ${this._refinedValue(this.value).map((item, index) => html `
191
+ <div
192
+ .style="background-color:${item.color};margin-left:${this._calculatePosition(item.position, this.min, this.max)}px;"
193
+ marker-index=${index}
194
+ draggable="true"
195
+ ></div>
196
+ `)}
197
+ </div>
198
+ </div>
199
+ </div>
200
+
201
+ <label class="icon-only-label color"></label>
202
+ <ox-input-color
203
+ id="color-editor"
204
+ .value=${this.focused && this.focused.color}
205
+ @change=${(e) => this._onChangeSubComponent(e)}
206
+ >
207
+ </ox-input-color>
208
+
209
+ <label class="icon-only-label position"></label>
210
+ <input
211
+ type="number"
212
+ id="color-position"
213
+ .value=${this.focused && this.focused.position}
214
+ @change=${(e) => this._onChangeSubComponent(e)}
215
+ step="0.01"
216
+ />
217
+ `;
218
+ }
219
+ _refinedValue(value) {
220
+ return value instanceof Array ? value : [];
221
+ }
222
+ _setFocused(index) {
223
+ if (this.focused && this.focused.index === index) {
224
+ return;
225
+ }
226
+ var marker = this.renderRoot.querySelector(`#markers div[marker-index='${index}']`);
227
+ var olds = this.renderRoot.querySelectorAll('#markers div[focused]');
228
+ olds.length > 0 && olds.forEach(old => old.removeAttribute('focused'));
229
+ marker && marker.setAttribute('focused', '');
230
+ if (!marker) {
231
+ this.focused = null;
232
+ return;
233
+ }
234
+ var colorStop = this.value[index];
235
+ this._changeFocused({
236
+ index: index,
237
+ color: colorStop.color,
238
+ position: Math.max(this.min, Math.min(colorStop.position, this.max))
239
+ });
240
+ }
241
+ _changeFocused(focused) {
242
+ if (!focused) {
243
+ this._setFocused(-1); // clear focused marker
244
+ return;
245
+ }
246
+ this.focused = focused;
247
+ this.value = this.value.map((colorStop, index) => {
248
+ if (index != focused.index) {
249
+ return colorStop;
250
+ }
251
+ return {
252
+ color: focused.color,
253
+ position: focused.position
254
+ };
255
+ }).sort((a, b) => {
256
+ return b.position < a.position ? 1 : -1;
257
+ });
258
+ var colorStop = this.value[focused.index];
259
+ if (focused.position != colorStop.position || focused.color != colorStop.color) {
260
+ var index = -1;
261
+ for (var i = 0; i < this.value.length; i++) {
262
+ colorStop = this.value[i];
263
+ if (focused.position == colorStop.position && focused.color == colorStop.color) {
264
+ index = i;
265
+ break;
266
+ }
267
+ }
268
+ this._setFocused(index);
269
+ }
270
+ }
271
+ _renderColorBar(min, max, type) {
272
+ var value = this._refinedValue(this.value);
273
+ var gradient = '';
274
+ if (value instanceof Array && value.length > 0) {
275
+ if (this.type == 'gradient') {
276
+ var stopsStrings = (value || []).map(function (stop) {
277
+ var position = (stop.position - min) / (max - min);
278
+ return `${stop.color} ${position * 100}%`;
279
+ });
280
+ }
281
+ else {
282
+ var stops = value || [];
283
+ var last;
284
+ var last_position = 0;
285
+ var stopsStrings = stops.map(function (stop) {
286
+ var stop_position = (stop.position - min) / (max - min);
287
+ if (last) {
288
+ last_position = (last.position - min) / (max - min);
289
+ var step = `${stop.color} ${last_position * 100}%, ${stop.color} ${stop_position * 100}%`;
290
+ }
291
+ else {
292
+ var step = `${stop.color} ${stop_position * 100}%`;
293
+ }
294
+ last = stop;
295
+ return step;
296
+ });
297
+ if (last) {
298
+ last_position = (last.position - min) / (max - min);
299
+ stopsStrings.push(`${last.color} ${last_position * 100}%, white ${last_position * 100}%, white 100%`);
300
+ }
301
+ }
302
+ gradient = stopsStrings.join(',');
303
+ }
304
+ else {
305
+ gradient = 'black 0%, black 100%';
306
+ }
307
+ this.colorbar.style.background = `linear-gradient(to right, ${gradient})`;
308
+ /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
309
+ }
310
+ _onChangeSubComponent(e) {
311
+ var element = e.target;
312
+ var id = element.id;
313
+ if (!this.focused) {
314
+ return;
315
+ }
316
+ switch (id) {
317
+ case 'color-editor':
318
+ this._changeFocused({
319
+ ...this.focused,
320
+ color: element.value
321
+ });
322
+ break;
323
+ case 'color-position':
324
+ this._changeFocused({
325
+ ...this.focused,
326
+ position: Math.max(this.min, Math.min(Number(element.value), this.max))
327
+ });
328
+ break;
329
+ }
330
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
331
+ }
332
+ _onDblClickColorbar(e) {
333
+ /* 마커를 클릭한 경우를 걸러낸다. */
334
+ if (e.target !== this.colorbar)
335
+ return;
336
+ var width = this.colorbar.offsetWidth;
337
+ var position = this.min + (this.max - this.min) * (e.offsetX / width);
338
+ var colorStops = this.value ? this.value.slice() : [];
339
+ for (var i = 0; i < colorStops.length; i++) {
340
+ if (colorStops[i].position > position)
341
+ break;
342
+ }
343
+ colorStops.splice(i, 0, {
344
+ position: position,
345
+ color: '#fff'
346
+ });
347
+ this.value = colorStops;
348
+ this.focused = null;
349
+ this._setFocused(i);
350
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
351
+ }
352
+ _onDblClickMarkers(e) {
353
+ this.colorEditor.showPicker();
354
+ }
355
+ _onMouseDown(e) {
356
+ var marker = e.target;
357
+ var index = marker.getAttribute('marker-index');
358
+ this._setFocused(Number(index));
359
+ }
360
+ _onDragStart(e) {
361
+ /* drag 시에 ghost image를 보이지 않게 하려고 함 */
362
+ e.dataTransfer?.setDragImage(this._dragImage, 0, 0);
363
+ this.dragstart = {
364
+ position: this.focused.position,
365
+ x: e.clientX,
366
+ y: e.clientY
367
+ };
368
+ }
369
+ // TODO onDrag 이벤트가 계속 발생하므로 처리하는 성능 저하됨. 그래서 throttling 하도록 함
370
+ _throttled(delay, fn) {
371
+ let lastCall = 0;
372
+ return function (...args) {
373
+ const now = new Date().getTime();
374
+ if (now - lastCall < delay) {
375
+ return;
376
+ }
377
+ lastCall = now;
378
+ return fn(...args);
379
+ };
380
+ }
381
+ _onDrag(e) {
382
+ if (e.clientX <= 0) {
383
+ return;
384
+ }
385
+ var width = this.colorbar.offsetWidth;
386
+ var position = this.dragstart.position + ((e.clientX - this.dragstart.x) / width) * (this.max - this.min);
387
+ if (position != this.focused.position) {
388
+ this._changeFocused({
389
+ ...this.focused,
390
+ position: Math.max(this.min, Math.min(position, this.max))
391
+ });
392
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
393
+ }
394
+ }
395
+ _onDragEnd(e) {
396
+ if (e.clientY - this.dragstart.y > 40) {
397
+ this.value.splice(this.focused.index, 1);
398
+ this.value = this.value.slice();
399
+ this._setFocused(-1);
400
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }));
401
+ }
402
+ }
403
+ _calculatePosition(position, min, max) {
404
+ /* TODO 7 ==> 마커 폭의 절반으로 계산해야함. */
405
+ var calculated = position;
406
+ if (calculated > this.max)
407
+ calculated = this.max;
408
+ else if (calculated < this.min)
409
+ calculated = this.min;
410
+ var width = (this.colorbar && this.colorbar.offsetWidth) || 0;
411
+ return ((calculated - this.min) / (this.max - this.min)) * width - 7;
412
+ }
413
+ appendFormData({ formData }) {
414
+ if (!this.name)
415
+ return;
416
+ const value = this.value;
417
+ formData.append(this.name, typeof value === 'string' ? value : value === undefined || value === null ? '' : JSON.stringify(value));
418
+ }
419
+ };
420
+ __decorate([
421
+ property({ type: String })
422
+ ], OxInputColorStops.prototype, "type", void 0);
423
+ __decorate([
424
+ property({ type: Number })
425
+ ], OxInputColorStops.prototype, "min", void 0);
426
+ __decorate([
427
+ property({ type: Number })
428
+ ], OxInputColorStops.prototype, "max", void 0);
429
+ __decorate([
430
+ property({ type: Array })
431
+ ], OxInputColorStops.prototype, "value", void 0);
432
+ __decorate([
433
+ property({ type: Object })
434
+ ], OxInputColorStops.prototype, "focused", void 0);
435
+ __decorate([
436
+ query('#colorbar')
437
+ ], OxInputColorStops.prototype, "colorbar", void 0);
438
+ __decorate([
439
+ query('#color-editor')
440
+ ], OxInputColorStops.prototype, "colorEditor", void 0);
441
+ OxInputColorStops = __decorate([
442
+ customElement('ox-input-color-stops')
443
+ ], OxInputColorStops);
444
+ export { OxInputColorStops };
445
+ //# sourceMappingURL=ox-input-color-stops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-input-color-stops.js","sourceRoot":"","sources":["../../src/ox-input-color-stops.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport './ox-input-color'\n\nimport { PropertyValues, css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { OxFormField } from './ox-form-field'\nimport { OxInputColor } from './ox-input-color'\nimport deepEquals from 'lodash-es/isEqual'\n\nexport type ColorStop = {\n color: string\n position: number\n}\n\n/**\n범위내에서 여러 컬러셋(포지션과 색깔) 배열을 편집하는 컴포넌트이다.\n\n미리보기 Bar에서는 gradient나, solid 형태의 컬러셋을 보여준다.\n\n새로운 컬러셋을 추가고자 할 때는 미리보기 Bar를 더블클릭한다.\n컬러셋을 제거하고자 할 때는 컬러셋 마커를 아래방향으로 드래깅한다.\n컬러셋의 위치를 옮기고자 할 때는, 컬러셋 마커를 좌우로 드래깅하여 이동시키거나,\n옮기고자하는 컬러셋 마커를 마우스로 선택하고, 포지션 입력 에디터에서 직접 수정한다.\n컬러셋의 색상을 바꾸고자 할 때는, 컬러셋 마커를 더블클릭하여 컬러파레트를 팝업시켜서 색상을 선택하거나, 색상 입력 에디터에서 직접 색상을 수정할 수 있다.\n\nExample:\n\n <ox-input-color-stops type=\"gradient\" .value=${gradient.colorStops}>\n </ox-input-color-stops>\n*/\n@customElement('ox-input-color-stops')\nexport class OxInputColorStops extends OxFormField {\n static styles = css`\n :host {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n grid-gap: 0;\n grid-auto-rows: minmax(0, auto);\n }\n\n #color-stops {\n grid-column: 1 / 11;\n grid-row: 1;\n\n clear: both;\n margin-bottom: -3px;\n }\n\n #colorbar {\n width: 95%;\n height: 12px;\n margin: auto;\n margin-bottom: 25px;\n border: 1px solid #ccc;\n }\n\n #markers {\n position: relative;\n top: 30px;\n }\n\n #markers div {\n width: 10px;\n height: 10px;\n margin-top: -15px;\n position: absolute;\n border: 2px solid #fff;\n cursor: pointer;\n -webkit-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);\n -moz-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);\n box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);\n }\n\n #markers div::before {\n border-bottom: 6px solid #fff;\n border-left: 7px solid transparent;\n border-right: 7px solid transparent;\n content: '';\n width: 0;\n height: 0;\n left: -2px;\n position: absolute;\n top: -8px;\n }\n\n #markers div[focused] {\n border-color: var(--things-editor-colorbar-marker-focused-color, #585858);\n }\n\n #markers div[focused]:before {\n border-bottom: 7px solid var(--things-editor-colorbar-marker-focused-color, #585858);\n }\n\n .icon-only-label {\n background: url(/assets/images/icon-properties-label.png) no-repeat;\n width: 30px;\n height: 24px;\n }\n\n .icon-only-label.color {\n grid-column: 1 / 2;\n grid-row: 2;\n\n background-position: 70% -498px;\n float: left;\n margin-top: 0;\n }\n\n .icon-only-label.position {\n grid-column: 7 / 8;\n grid-row: 2;\n\n background-position: 70% -797px;\n float: left;\n margin-top: 0;\n }\n\n things-editor-color {\n grid-column: 2 / 7;\n grid-row: 2;\n }\n\n input[type='number'] {\n grid-column: 8 / 11;\n grid-row: 2;\n border: 1px solid rgba(0, 0, 0, 0.2);\n }\n `\n\n /**\n * `type`은 color-stop bar의 표시 방법을 의미한다.\n * - 'solid' : 컬러스톱위치에서 다음 컬러스톱까지 solid color로 채운다.\n * - 'gradient' : 컬러스톱위치에서 다음 컬러스톱까지 gradient color로 채운다.\n */\n @property({ type: String }) type: 'solid' | 'gradient' = 'solid'\n /**\n * `min`은 color-stop bar의 위치값 범위의 최소값을 의미한다.\n */\n @property({ type: Number }) min: number = 0\n /**\n * `max`은 color-stop bar의 위치값 범위의 최대값을 의미한다.\n */\n @property({ type: Number }) max: number = 1\n /**\n * `value`은 color-stops에 의해 만들어진 color-stop 배열을 유지한다.\n */\n @property({ type: Array }) value?: ColorStop[]\n @property({ type: Object }) focused: any\n\n @query('#colorbar') colorbar!: HTMLElement\n @query('#color-editor') colorEditor!: OxInputColor\n\n private _dragImage?: HTMLImageElement\n\n connectedCallback() {\n super.connectedCallback()\n\n this._dragImage = new Image()\n this._dragImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='\n }\n\n firstUpdated() {\n window.addEventListener('resize', () => {\n this.requestUpdate()\n })\n }\n\n updated(changes: PropertyValues<this>) {\n var needRerenderColorBar = false\n\n if (changes.has('value') && this.value instanceof Array) {\n var oldValue = changes.get('value')\n if (\n this.focused &&\n (!oldValue ||\n this.value.findIndex(v => v.position == this.focused.position && v.color == this.focused.color) == -1)\n ) {\n /* 이전 값이 없었던 경우에 focused를 클리어시킨다.\n * 이전 값이 있던 경우에도, focused는 이 에디터 내부에서만 선택될 수 있으며, 수정될 수 있으므로 동일한 포지션을 갖는 value가 없으면, 새로운 에디터가 시작된 것으로 판단하여 focused를 클리어시킨다.\n */\n this.focused = null\n }\n\n if (!deepEquals(oldValue, this.value)) {\n needRerenderColorBar = true\n }\n }\n\n if (needRerenderColorBar || changes.has('min') || changes.has('max')) {\n if (!this.value) {\n this.value = [\n { color: 'white', position: this.min },\n { color: 'white', position: this.max }\n ]\n }\n\n this._renderColorBar(this.min, this.max, this.type)\n this.requestUpdate()\n }\n }\n\n render() {\n return html`\n <div id=\"color-stops\">\n <div id=\"colorbar\" @dblclick=${(e: MouseEvent) => this._onDblClickColorbar(e)}>\n <div\n id=\"markers\"\n @dblclick=${(e: MouseEvent) => this._onDblClickMarkers(e)}\n @mousedown=${(e: MouseEvent) => this._onMouseDown(e)}\n @dragstart=${(e: DragEvent) => this._onDragStart(e)}\n @drag=${this._throttled(100, this._onDrag.bind(this))}\n @dragend=${(e: DragEvent) => this._onDragEnd(e)}\n >\n ${this._refinedValue(this.value).map(\n (item, index) => html`\n <div\n .style=\"background-color:${item.color};margin-left:${this._calculatePosition(\n item.position,\n this.min,\n this.max\n )}px;\"\n marker-index=${index}\n draggable=\"true\"\n ></div>\n `\n )}\n </div>\n </div>\n </div>\n\n <label class=\"icon-only-label color\"></label>\n <ox-input-color\n id=\"color-editor\"\n .value=${this.focused && this.focused.color}\n @change=${(e: Event) => this._onChangeSubComponent(e)}\n >\n </ox-input-color>\n\n <label class=\"icon-only-label position\"></label>\n <input\n type=\"number\"\n id=\"color-position\"\n .value=${this.focused && this.focused.position}\n @change=${(e: Event) => this._onChangeSubComponent(e)}\n step=\"0.01\"\n />\n `\n }\n\n _refinedValue(value: any) {\n return value instanceof Array ? value : []\n }\n\n _setFocused(index: number) {\n if (this.focused && this.focused.index === index) {\n return\n }\n\n var marker = this.renderRoot.querySelector(`#markers div[marker-index='${index}']`) as HTMLElement\n var olds = this.renderRoot.querySelectorAll('#markers div[focused]')\n olds.length > 0 && olds.forEach(old => old.removeAttribute('focused'))\n marker && marker.setAttribute('focused', '')\n\n if (!marker) {\n this.focused = null\n return\n }\n\n var colorStop = this.value![index]\n\n this._changeFocused({\n index: index,\n color: colorStop.color,\n position: Math.max(this.min, Math.min(colorStop.position, this.max))\n })\n }\n\n _changeFocused(focused: any) {\n if (!focused) {\n this._setFocused(-1) // clear focused marker\n\n return\n }\n\n this.focused = focused\n\n this.value = this.value!.map((colorStop, index): ColorStop => {\n if (index != focused.index) {\n return colorStop\n }\n\n return {\n color: focused.color,\n position: focused.position\n }\n }).sort((a: ColorStop, b: ColorStop) => {\n return b.position < a.position ? 1 : -1\n })\n\n var colorStop = this.value[focused.index]\n\n if (focused.position != colorStop.position || focused.color != colorStop.color) {\n var index = -1\n for (var i = 0; i < this.value.length; i++) {\n colorStop = this.value[i]\n if (focused.position == colorStop.position && focused.color == colorStop.color) {\n index = i\n break\n }\n }\n\n this._setFocused(index)\n }\n }\n\n _renderColorBar(min: number, max: number, type: 'solid' | 'gradient') {\n var value = this._refinedValue(this.value)\n var gradient = ''\n\n if (value instanceof Array && value.length > 0) {\n if (this.type == 'gradient') {\n var stopsStrings = (value || []).map(function (stop) {\n var position = (stop.position - min) / (max - min)\n return `${stop.color} ${position * 100}%`\n })\n } else {\n var stops = value || []\n var last: ColorStop | undefined\n var last_position = 0\n var stopsStrings = stops.map(function (stop) {\n var stop_position = (stop.position - min) / (max - min)\n if (last) {\n last_position = (last.position - min) / (max - min)\n var step = `${stop.color} ${last_position * 100}%, ${stop.color} ${stop_position * 100}%`\n } else {\n var step = `${stop.color} ${stop_position * 100}%`\n }\n last = stop\n return step\n })\n if (last) {\n last_position = (last.position - min) / (max - min)\n stopsStrings.push(`${last.color} ${last_position * 100}%, white ${last_position * 100}%, white 100%`)\n }\n }\n\n gradient = stopsStrings.join(',')\n } else {\n gradient = 'black 0%, black 100%'\n }\n\n this.colorbar!.style.background = `linear-gradient(to right, ${gradient})`\n /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */\n }\n\n _onChangeSubComponent(e: Event) {\n var element = e.target as HTMLInputElement\n var id = element.id\n\n if (!this.focused) {\n return\n }\n\n switch (id) {\n case 'color-editor':\n this._changeFocused({\n ...this.focused,\n color: element.value\n })\n break\n case 'color-position':\n this._changeFocused({\n ...this.focused,\n position: Math.max(this.min, Math.min(Number(element.value), this.max))\n })\n break\n }\n\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n\n _onDblClickColorbar(e: MouseEvent) {\n /* 마커를 클릭한 경우를 걸러낸다. */\n if (e.target !== this.colorbar) return\n\n var width = this.colorbar.offsetWidth\n var position = this.min + (this.max - this.min) * (e.offsetX / width)\n var colorStops = this.value ? this.value.slice() : []\n\n for (var i = 0; i < colorStops.length; i++) {\n if (colorStops[i].position > position) break\n }\n\n colorStops.splice(i, 0, {\n position: position,\n color: '#fff'\n })\n\n this.value = colorStops\n\n this.focused = null\n this._setFocused(i)\n\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n\n _onDblClickMarkers(e: MouseEvent) {\n this.colorEditor.showPicker()\n }\n\n _onMouseDown(e: MouseEvent) {\n var marker = e.target as HTMLElement\n var index = marker.getAttribute('marker-index')\n\n this._setFocused(Number(index))\n }\n\n private dragstart: { position: number; x: number; y: number } = { position: 0, x: 0, y: 0 }\n\n _onDragStart(e: DragEvent) {\n /* drag 시에 ghost image를 보이지 않게 하려고 함 */\n e.dataTransfer?.setDragImage(this._dragImage!, 0, 0)\n\n this.dragstart = {\n position: this.focused.position,\n x: e.clientX,\n y: e.clientY\n }\n }\n\n // TODO onDrag 이벤트가 계속 발생하므로 처리하는 성능 저하됨. 그래서 throttling 하도록 함\n _throttled(delay: number, fn: (...args: any[]) => any) {\n let lastCall = 0\n return function (...args: any[]) {\n const now = new Date().getTime()\n if (now - lastCall < delay) {\n return\n }\n lastCall = now\n return fn(...args)\n }\n }\n\n _onDrag(e: DragEvent) {\n if (e.clientX <= 0) {\n return\n }\n\n var width = this.colorbar.offsetWidth\n var position = this.dragstart.position + ((e.clientX - this.dragstart.x) / width) * (this.max - this.min)\n\n if (position != this.focused.position) {\n this._changeFocused({\n ...this.focused,\n position: Math.max(this.min, Math.min(position, this.max))\n })\n\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n }\n\n _onDragEnd(e: DragEvent) {\n if (e.clientY - this.dragstart.y > 40) {\n this.value!.splice(this.focused.index, 1)\n this.value = this.value!.slice()\n\n this._setFocused(-1)\n\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n }\n\n _calculatePosition(position: number, min: number, max: number) {\n /* TODO 7 ==> 마커 폭의 절반으로 계산해야함. */\n var calculated = position\n\n if (calculated > this.max) calculated = this.max\n else if (calculated < this.min) calculated = this.min\n\n var width = (this.colorbar && this.colorbar.offsetWidth) || 0\n\n return ((calculated - this.min) / (this.max - this.min)) * width - 7\n }\n\n protected appendFormData({ formData }: FormDataEvent): void {\n if (!this.name) return\n\n const value = this.value\n\n formData.append(\n this.name!,\n typeof value === 'string' ? value : value === undefined || value === null ? '' : JSON.stringify(value)\n )\n }\n}\n"]}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import '@operato/color-picker/paper-color-picker.js';
5
+ import { OxFormField } from './ox-form-field';
6
+ /**
7
+ 색상을 입력하는데 사용되는 입력 컴포넌트이다.
8
+ 화면상에는 두개의 입력 필드가 보이며, 하나는 색상값을 키보드로 직접 입력하는 입력 픽드이며,
9
+ 다른 하나는 마우스로 클릭하여 컬러 파레트를 팝업 시키는 입력 필드이다.
10
+ 컬러 파레트를 팝업시키는 입력필드는 현재 입력된 색상으로 표시된다.
11
+
12
+ 색상값을 직접 입력하는 필드에서는 'white', 'red', 'yellow' 등 색상의미 단어를 사용할 수도 있고,
13
+ #fff, #123456 와 같이 스타일에서 지정하는 방식의 3자리 및 6자리 숫자 표현도 가능하다.
14
+ 컬러 파레트를 팝업시키는 입력 필드에서 색상을 지정하게되면, 모두 6자리 숫자 표현방식만을 사용한다.
15
+
16
+ 의미 단어를 지원하는 색상은 다음과 같다.
17
+
18
+ aliceblue : #f0f8ff<br>
19
+ antiquewhite : #faebd7<br>
20
+ aqua : #00ffff<br>
21
+ aquamarine : #7fffd4<br>
22
+ azure : #f0ffff<br>
23
+ beige : #f5f5dc<br>
24
+ bisque : #ffe4c4<br>
25
+ black : #000000<br>
26
+ blanchedalmond : #ffebcd<br>
27
+ blue : #0000ff<br>
28
+ blueviolet : #8a2be2<br>
29
+ brown : #a52a2a<br>
30
+ burlywood : #deb887<br>
31
+ cadetblue : #5f9ea0<br>
32
+ chartreuse : #7fff00<br>
33
+ chocolate : #d2691e<br>
34
+ coral : #ff7f50<br>
35
+ cornflowerblue : #6495ed<br>
36
+ cornsilk : #fff8dc<br>
37
+ crimson : #dc143c<br>
38
+ cyan : #00ffff<br>
39
+ darkblue : #00008b<br>
40
+ darkcyan : #008b8b<br>
41
+ darkgoldenrod : #b8860b<br>
42
+ darkgray : #a9a9a9<br>
43
+ darkgreen : #006400<br>
44
+ darkkhaki : #bdb76b<br>
45
+ darkmagenta : #8b008b<br>
46
+ darkolivegreen : #556b2f<br>
47
+ darkorange : #ff8c00<br>
48
+ darkorchid : #9932cc<br>
49
+ darkred : #8b0000<br>
50
+ darksalmon : #e9967a<br>
51
+ darkseagreen : #8fbc8f<br>
52
+ darkslateblue : #483d8b<br>
53
+ darkslategray : #2f4f4f<br>
54
+ darkturquoise : #00ced1<br>
55
+ darkviolet : #9400d3<br>
56
+ deeppink : #ff1493<br>
57
+ deepskyblue : #00bfff<br>
58
+ dimgray : #696969<br>
59
+ dodgerblue : #1e90ff<br>
60
+ firebrick : #b22222<br>
61
+ floralwhite : #fffaf0<br>
62
+ forestgreen : #228b22<br>
63
+ fuchsia : #ff00ff<br>
64
+ gainsboro : #dcdcdc<br>
65
+ ghostwhite : #f8f8ff<br>
66
+ gold : #ffd700<br>
67
+ goldenrod : #daa520<br>
68
+ gray : #808080<br>
69
+ green : #008000<br>
70
+ greenyellow : #adff2f<br>
71
+ honeydew : #f0fff0<br>
72
+ hotpink : #ff69b4<br>
73
+ indianred : #cd5c5c<br>
74
+ indigo : #4b0082<br>
75
+ ivory : #fffff0<br>
76
+ khaki : #f0e68c<br>
77
+ lavender : #e6e6fa<br>
78
+ lavenderblush : #fff0f5<br>
79
+ lawngreen : #7cfc00<br>
80
+ lemonchiffon : #fffacd<br>
81
+ lightblue : #add8e6<br>
82
+ lightcoral : #f08080<br>
83
+ lightcyan : #e0ffff<br>
84
+ lightgoldenrodyellow : #fafad2<br>
85
+ lightgrey : #d3d3d3<br>
86
+ lightgreen : #90ee90<br>
87
+ lightpink : #ffb6c1<br>
88
+ lightsalmon : #ffa07a<br>
89
+ lightseagreen : #20b2aa<br>
90
+ lightskyblue : #87cefa<br>
91
+ lightslategray : #778899<br>
92
+ lightsteelblue : #b0c4de<br>
93
+ lightyellow : #ffffe0<br>
94
+ lime : #00ff00<br>
95
+ limegreen : #32cd32<br>
96
+ linen : #faf0e6<br>
97
+ magenta : #ff00ff<br>
98
+ maroon : #800000<br>
99
+ mediumaquamarine : #66cdaa<br>
100
+ mediumblue : #0000cd<br>
101
+ mediumorchid : #ba55d3<br>
102
+ mediumpurple : #9370d8<br>
103
+ mediumseagreen : #3cb371<br>
104
+ mediumslateblue : #7b68ee<br>
105
+ mediumspringgreen : #00fa9a<br>
106
+ mediumturquoise : #48d1cc<br>
107
+ mediumvioletred : #c71585<br>
108
+ midnightblue : #191970<br>
109
+ mintcream : #f5fffa<br>
110
+ mistyrose : #ffe4e1<br>
111
+ moccasin : #ffe4b5<br>
112
+ navajowhite : #ffdead<br>
113
+ navy : #000080<br>
114
+ oldlace : #fdf5e6<br>
115
+ olive : #808000<br>
116
+ olivedrab : #6b8e23<br>
117
+ orange : #ffa500<br>
118
+ orangered : #ff4500<br>
119
+ orchid : #da70d6<br>
120
+ palegoldenrod : #eee8aa<br>
121
+ palegreen : #98fb98<br>
122
+ paleturquoise : #afeeee<br>
123
+ palevioletred : #d87093<br>
124
+ papayawhip : #ffefd5<br>
125
+ peachpuff : #ffdab9<br>
126
+ peru : #cd853f<br>
127
+ pink : #ffc0cb<br>
128
+ plum : #dda0dd<br>
129
+ powderblue : #b0e0e6<br>
130
+ purple : #800080<br>
131
+ red : #ff0000<br>
132
+ rosybrown : #bc8f8f<br>
133
+ royalblue : #4169e1<br>
134
+ saddlebrown : #8b4513<br>
135
+ salmon : #fa8072<br>
136
+ sandybrown : #f4a460<br>
137
+ seagreen : #2e8b57<br>
138
+ seashell : #fff5ee<br>
139
+ sienna : #a0522d<br>
140
+ silver : #c0c0c0<br>
141
+ skyblue : #87ceeb<br>
142
+ slateblue : #6a5acd<br>
143
+ slategray : #708090<br>
144
+ snow : #fffafa<br>
145
+ springgreen : #00ff7f<br>
146
+ steelblue : #4682b4<br>
147
+ tan : #d2b48c<br>
148
+ teal : #008080<br>
149
+ thistle : #d8bfd8<br>
150
+ tomato : #ff6347<br>
151
+ turquoise : #40e0d0<br>
152
+ violet : #ee82ee<br>
153
+ wheat : #f5deb3<br>
154
+ white : #ffffff<br>
155
+ whitesmoke : #f5f5f5<br>
156
+ yellow : #ffff00<br>
157
+ yellowgreen : #9acd32<br>
158
+
159
+ Example:
160
+
161
+ <ox-input-color .value=${color}>
162
+ </ox-input-color>
163
+ */
164
+ export declare class OxInputColor extends OxFormField {
165
+ static styles: import("lit").CSSResult;
166
+ value?: string;
167
+ properties: any;
168
+ render(): import("lit-html").TemplateResult<1>;
169
+ set colorString(colorString: string);
170
+ _thumbnail(): string;
171
+ _onInputChanged(e: Event): void;
172
+ /**
173
+ * 외부에서 호출 가능한 메쏘드임.
174
+ */
175
+ showPicker(): void;
176
+ }