tweak-ui 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -7
- package/README.md +32 -32
- package/dist/lib/builder.d.ts +166 -162
- package/dist/lib/builder.d.ts.map +1 -1
- package/dist/lib/builder.js +250 -0
- package/dist/lib/builder.js.map +1 -0
- package/dist/lib/color-formats/array-format.d.ts +8 -8
- package/dist/lib/color-formats/array-format.js +18 -0
- package/dist/lib/color-formats/array-format.js.map +1 -0
- package/dist/lib/color-formats/converter.d.ts +18 -18
- package/dist/lib/color-formats/converter.js +85 -0
- package/dist/lib/color-formats/converter.js.map +1 -0
- package/dist/lib/color-formats/css-string-format.d.ts +7 -7
- package/dist/lib/color-formats/css-string-format.js +28 -0
- package/dist/lib/color-formats/css-string-format.js.map +1 -0
- package/dist/lib/color-formats/formatter.d.ts +8 -8
- package/dist/lib/color-formats/formatter.js +35 -0
- package/dist/lib/color-formats/formatter.js.map +1 -0
- package/dist/lib/color-formats/hex-string-format.d.ts +7 -7
- package/dist/lib/color-formats/hex-string-format.js +28 -0
- package/dist/lib/color-formats/hex-string-format.js.map +1 -0
- package/dist/lib/color-formats/index.d.ts +3 -3
- package/dist/lib/color-formats/index.js +4 -0
- package/dist/lib/color-formats/index.js.map +1 -0
- package/dist/lib/color-formats/number-format.d.ts +8 -8
- package/dist/lib/color-formats/number-format.js +23 -0
- package/dist/lib/color-formats/number-format.js.map +1 -0
- package/dist/lib/color-formats/object-format.d.ts +14 -14
- package/dist/lib/color-formats/object-format.js +23 -0
- package/dist/lib/color-formats/object-format.js.map +1 -0
- package/dist/lib/color-formats/types.d.ts +101 -101
- package/dist/lib/color-formats/types.js +2 -0
- package/dist/lib/color-formats/types.js.map +1 -0
- package/dist/lib/components/button.d.ts +28 -28
- package/dist/lib/components/button.d.ts.map +1 -1
- package/dist/lib/components/button.js +15 -0
- package/dist/lib/components/button.js.map +1 -0
- package/dist/lib/components/content.d.ts +21 -21
- package/dist/lib/components/content.d.ts.map +1 -1
- package/dist/lib/components/content.js +10 -0
- package/dist/lib/components/content.js.map +1 -0
- package/dist/lib/components/controls/angle.d.ts +51 -51
- package/dist/lib/components/controls/angle.d.ts.map +1 -1
- package/dist/lib/components/controls/angle.js +201 -0
- package/dist/lib/components/controls/angle.js.map +1 -0
- package/dist/lib/components/controls/checkbox.d.ts +28 -28
- package/dist/lib/components/controls/checkbox.d.ts.map +1 -1
- package/dist/lib/components/controls/checkbox.js +31 -0
- package/dist/lib/components/controls/checkbox.js.map +1 -0
- package/dist/lib/components/controls/color-picker.d.ts +56 -56
- package/dist/lib/components/controls/color-picker.d.ts.map +1 -1
- package/dist/lib/components/controls/color-picker.js +267 -0
- package/dist/lib/components/controls/color-picker.js.map +1 -0
- package/dist/lib/components/controls/color.d.ts +51 -51
- package/dist/lib/components/controls/color.d.ts.map +1 -1
- package/dist/lib/components/controls/color.js +77 -0
- package/dist/lib/components/controls/color.js.map +1 -0
- package/dist/lib/components/controls/index.d.ts +10 -10
- package/dist/lib/components/controls/index.js +11 -0
- package/dist/lib/components/controls/index.js.map +1 -0
- package/dist/lib/components/controls/number.d.ts +47 -47
- package/dist/lib/components/controls/number.d.ts.map +1 -1
- package/dist/lib/components/controls/number.js +142 -0
- package/dist/lib/components/controls/number.js.map +1 -0
- package/dist/lib/components/controls/point.d.ts +47 -47
- package/dist/lib/components/controls/point.d.ts.map +1 -1
- package/dist/lib/components/controls/point.js +137 -0
- package/dist/lib/components/controls/point.js.map +1 -0
- package/dist/lib/components/controls/position.d.ts +55 -55
- package/dist/lib/components/controls/position.d.ts.map +1 -1
- package/dist/lib/components/controls/position.js +36 -0
- package/dist/lib/components/controls/position.js.map +1 -0
- package/dist/lib/components/controls/select.d.ts +59 -59
- package/dist/lib/components/controls/select.d.ts.map +1 -1
- package/dist/lib/components/controls/select.js +132 -0
- package/dist/lib/components/controls/select.js.map +1 -0
- package/dist/lib/components/controls/spherical.d.ts +74 -74
- package/dist/lib/components/controls/spherical.d.ts.map +1 -1
- package/dist/lib/components/controls/spherical.js +302 -0
- package/dist/lib/components/controls/spherical.js.map +1 -0
- package/dist/lib/components/controls/text.d.ts +35 -35
- package/dist/lib/components/controls/text.d.ts.map +1 -1
- package/dist/lib/components/controls/text.js +24 -0
- package/dist/lib/components/controls/text.js.map +1 -0
- package/dist/lib/components/groups/accordion.d.ts +21 -21
- package/dist/lib/components/groups/accordion.d.ts.map +1 -1
- package/dist/lib/components/groups/accordion.js +34 -0
- package/dist/lib/components/groups/accordion.js.map +1 -0
- package/dist/lib/components/groups/container.d.ts +24 -24
- package/dist/lib/components/groups/container.d.ts.map +1 -1
- package/dist/lib/components/groups/container.js +19 -0
- package/dist/lib/components/groups/container.js.map +1 -0
- package/dist/lib/components/groups/group.d.ts +48 -48
- package/dist/lib/components/groups/group.d.ts.map +1 -1
- package/dist/lib/components/groups/group.js +50 -0
- package/dist/lib/components/groups/group.js.map +1 -0
- package/dist/lib/components/groups/index.d.ts +4 -4
- package/dist/lib/components/groups/index.js +5 -0
- package/dist/lib/components/groups/index.js.map +1 -0
- package/dist/lib/components/groups/tabs.d.ts +21 -21
- package/dist/lib/components/groups/tabs.d.ts.map +1 -1
- package/dist/lib/components/groups/tabs.js +31 -0
- package/dist/lib/components/groups/tabs.js.map +1 -0
- package/dist/lib/components/image.d.ts +36 -36
- package/dist/lib/components/image.d.ts.map +1 -1
- package/dist/lib/components/image.js +46 -0
- package/dist/lib/components/image.js.map +1 -0
- package/dist/lib/components/index.d.ts +5 -5
- package/dist/lib/components/index.js +6 -0
- package/dist/lib/components/index.js.map +1 -0
- package/dist/lib/core/index.d.ts +4 -4
- package/dist/lib/core/index.js +5 -0
- package/dist/lib/core/index.js.map +1 -0
- package/dist/lib/core/registry.d.ts +17 -17
- package/dist/lib/core/registry.js +30 -0
- package/dist/lib/core/registry.js.map +1 -0
- package/dist/lib/core/render.d.ts +9 -9
- package/dist/lib/core/render.d.ts.map +1 -1
- package/dist/lib/core/render.js +19 -0
- package/dist/lib/core/render.js.map +1 -0
- package/dist/lib/core/types.d.ts +87 -87
- package/dist/lib/core/types.d.ts.map +1 -1
- package/dist/lib/core/types.js +2 -0
- package/dist/lib/core/types.js.map +1 -0
- package/dist/lib/core/utils.d.ts +93 -93
- package/dist/lib/core/utils.d.ts.map +1 -1
- package/dist/lib/core/utils.js +193 -0
- package/dist/lib/core/utils.js.map +1 -0
- package/dist/lib/core/value-accessor.d.ts +17 -17
- package/dist/lib/core/value-accessor.js +52 -0
- package/dist/lib/core/value-accessor.js.map +1 -0
- package/dist/lib/index.d.ts +21 -27
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +29 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mount.d.ts +45 -45
- package/dist/lib/mount.js +85 -0
- package/dist/lib/mount.js.map +1 -0
- package/dist/tweak-ui.css +133 -138
- package/dist/tweak-ui.css.map +1 -1
- package/dist/tweak-ui.min.css +1 -1
- package/dist/tweak-ui.min.css.map +1 -1
- package/dist/tweak-ui.module.js +2733 -2380
- package/dist/tweak-ui.module.js.map +1 -1
- package/dist/tweak-ui.umd.js +1 -4403
- package/dist/tweak-ui.umd.js.map +1 -1
- package/package.json +25 -42
- package/dist/index.html +0 -1061
- package/dist/lib/color-formats/array-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/array-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/converter.spec.d.ts +0 -2
- package/dist/lib/color-formats/converter.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/css-string-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/css-string-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/formatter.spec.d.ts +0 -2
- package/dist/lib/color-formats/formatter.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/hex-string-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/hex-string-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/number-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/number-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/object-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/object-format.spec.d.ts.map +0 -1
- package/dist/scss/_style.scss +0 -120
- package/dist/scss/_themes.scss +0 -23
- package/dist/scss/_utils.scss +0 -24
- package/dist/scss/_variables.scss +0 -30
- package/dist/scss/controls/_angle.scss +0 -64
- package/dist/scss/controls/_button.scss +0 -0
- package/dist/scss/controls/_checkbox.scss +0 -19
- package/dist/scss/controls/_color-picker.scss +0 -124
- package/dist/scss/controls/_color.scss +0 -14
- package/dist/scss/controls/_container.scss +0 -13
- package/dist/scss/controls/_group.scss +0 -69
- package/dist/scss/controls/_image.scss +0 -27
- package/dist/scss/controls/_number.scss +0 -38
- package/dist/scss/controls/_point.scss +0 -36
- package/dist/scss/controls/_position.scss +0 -9
- package/dist/scss/controls/_select.scss +0 -0
- package/dist/scss/controls/_spherical.scss +0 -87
- package/dist/scss/controls/_tabs.scss +0 -38
- package/dist/scss/controls/_text.scss +0 -0
- package/dist/scss/index.scss +0 -21
- package/dist/tweak-ui.umd.min.js +0 -17
- package/dist/tweak-ui.umd.min.js.map +0 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// tslint:disable:no-bitwise
|
|
2
|
+
import m from 'mithril';
|
|
3
|
+
import { getColorFormatter, hsv2rgb, rgb2hsv, } from '../../color-formats';
|
|
4
|
+
import { getValue, component, setValue, } from '../../core';
|
|
5
|
+
import { call, clamp, use, twuiClass, getTouchPoint, } from '../../core/utils';
|
|
6
|
+
component('color-picker', (node) => {
|
|
7
|
+
let hue = 0; // range [0,1]
|
|
8
|
+
let sat = 0; // range [0,1]
|
|
9
|
+
let val = 0; // range [0,1]
|
|
10
|
+
let a = 0; // range [0,1]
|
|
11
|
+
function getHSVA(s = sat, v = val) {
|
|
12
|
+
return {
|
|
13
|
+
h: hue * 360,
|
|
14
|
+
s: s,
|
|
15
|
+
v: v,
|
|
16
|
+
a: a,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function getRGB(s = sat, v = val) {
|
|
20
|
+
return hsv2rgb(getHSVA(s, v));
|
|
21
|
+
}
|
|
22
|
+
function getRGBA(s = sat, v = val, alpha = a) {
|
|
23
|
+
return Object.assign(Object.assign({}, getRGB(s, v)), { a: alpha });
|
|
24
|
+
}
|
|
25
|
+
function setHSV(hsv) {
|
|
26
|
+
hue = hsv.h / 360;
|
|
27
|
+
sat = hsv.s;
|
|
28
|
+
val = hsv.v;
|
|
29
|
+
}
|
|
30
|
+
function setHSVA(hsv) {
|
|
31
|
+
setHSV(hsv);
|
|
32
|
+
a = hsv.a;
|
|
33
|
+
}
|
|
34
|
+
function getHexRGB(s, v) {
|
|
35
|
+
return getColorFormatter('#rgb').format(getRGBA(s, v));
|
|
36
|
+
}
|
|
37
|
+
function getHexRGBA(s, v) {
|
|
38
|
+
return getColorFormatter('#rgba').format(getRGBA(s, v));
|
|
39
|
+
}
|
|
40
|
+
function getCssRGBA(s = sat, v = val, alpha = a) {
|
|
41
|
+
return getColorFormatter('rgba()').format(getRGBA(s, v, alpha));
|
|
42
|
+
}
|
|
43
|
+
function parseInput(value, format) {
|
|
44
|
+
const rgba = getColorFormatter(format || 'rgb').parse(value);
|
|
45
|
+
setHSVA(Object.assign(Object.assign({}, rgb2hsv(rgba)), { a: rgba.a }));
|
|
46
|
+
}
|
|
47
|
+
function formatOutput(format) {
|
|
48
|
+
return getColorFormatter(format).format(getRGBA());
|
|
49
|
+
}
|
|
50
|
+
function triggerInput() {
|
|
51
|
+
use(node.attrs.data, (data) => {
|
|
52
|
+
const value = formatOutput(data.format);
|
|
53
|
+
const written = setValue(data, value);
|
|
54
|
+
call(data.onInput, data, written);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function triggerChange() {
|
|
58
|
+
use(node.attrs.data, (data) => {
|
|
59
|
+
const value = formatOutput(data.format);
|
|
60
|
+
const written = setValue(data, value);
|
|
61
|
+
call(data.onChange, data, written);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function hasAlpha() {
|
|
65
|
+
return use(node.attrs.data, (data) => {
|
|
66
|
+
return data.format && data.format.match(/a/i);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//
|
|
70
|
+
// manual input
|
|
71
|
+
//
|
|
72
|
+
function inputR(e) {
|
|
73
|
+
input(e, 'r');
|
|
74
|
+
}
|
|
75
|
+
function inputG(e) {
|
|
76
|
+
input(e, 'g');
|
|
77
|
+
}
|
|
78
|
+
function inputB(e) {
|
|
79
|
+
input(e, 'b');
|
|
80
|
+
}
|
|
81
|
+
function input(e, field) {
|
|
82
|
+
const color = getRGBA();
|
|
83
|
+
color[field] = parseInt(e.target.value, 10) / 255;
|
|
84
|
+
setHSV(rgb2hsv(color));
|
|
85
|
+
triggerInput();
|
|
86
|
+
triggerChange();
|
|
87
|
+
}
|
|
88
|
+
function inputHex(e) {
|
|
89
|
+
parseInput(e.target.value, hasAlpha() ? 'rgba' : 'rgb');
|
|
90
|
+
triggerInput();
|
|
91
|
+
triggerChange();
|
|
92
|
+
}
|
|
93
|
+
//
|
|
94
|
+
// drag input
|
|
95
|
+
//
|
|
96
|
+
let target;
|
|
97
|
+
let kind;
|
|
98
|
+
function beginPickSV(e) {
|
|
99
|
+
kind = 'sv';
|
|
100
|
+
enableDrag(e.target);
|
|
101
|
+
onMouseMove(e);
|
|
102
|
+
}
|
|
103
|
+
function beginPickH(e) {
|
|
104
|
+
kind = 'h';
|
|
105
|
+
enableDrag(e.target);
|
|
106
|
+
onMouseMove(e);
|
|
107
|
+
}
|
|
108
|
+
function beginPickA(e) {
|
|
109
|
+
kind = 'a';
|
|
110
|
+
enableDrag(e.target);
|
|
111
|
+
onMouseMove(e);
|
|
112
|
+
}
|
|
113
|
+
function enableDrag(el) {
|
|
114
|
+
disableDrag();
|
|
115
|
+
target = el;
|
|
116
|
+
const options = { passive: false };
|
|
117
|
+
document.addEventListener('mousemove', onMouseMove, options);
|
|
118
|
+
document.addEventListener('mouseup', onMouseUp, options);
|
|
119
|
+
document.addEventListener('touchmove', onMouseMove, options);
|
|
120
|
+
document.addEventListener('touchend', onMouseUp, options);
|
|
121
|
+
document.addEventListener('touchcancel', onMouseUp, options);
|
|
122
|
+
}
|
|
123
|
+
function disableDrag() {
|
|
124
|
+
document.removeEventListener('mousemove', onMouseMove);
|
|
125
|
+
document.removeEventListener('mouseup', onMouseUp);
|
|
126
|
+
document.removeEventListener('touchmove', onMouseMove);
|
|
127
|
+
document.removeEventListener('touchend', onMouseUp);
|
|
128
|
+
document.removeEventListener('touchcancel', onMouseUp);
|
|
129
|
+
}
|
|
130
|
+
function onMouseMove(e) {
|
|
131
|
+
if (!target) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
const rect = target.getBoundingClientRect();
|
|
136
|
+
const tx = window.pageXOffset || document.documentElement.scrollLeft;
|
|
137
|
+
const ty = window.pageYOffset || document.documentElement.scrollTop;
|
|
138
|
+
const cw = target.clientWidth;
|
|
139
|
+
const ch = target.clientHeight;
|
|
140
|
+
let [cx, cy] = getTouchPoint(e);
|
|
141
|
+
cx = clamp((cx - tx - rect.left) / cw, 0, 1);
|
|
142
|
+
cy = clamp((cy - ty - rect.top) / ch, 0, 1);
|
|
143
|
+
if (kind === 'sv') {
|
|
144
|
+
sat = cx;
|
|
145
|
+
val = 1 - cy;
|
|
146
|
+
}
|
|
147
|
+
if (kind === 'h') {
|
|
148
|
+
hue = 1 - cx;
|
|
149
|
+
}
|
|
150
|
+
if (kind === 'a') {
|
|
151
|
+
a = cx;
|
|
152
|
+
}
|
|
153
|
+
triggerInput();
|
|
154
|
+
m.redraw();
|
|
155
|
+
}
|
|
156
|
+
function onMouseUp() {
|
|
157
|
+
if (target != null) {
|
|
158
|
+
target = null;
|
|
159
|
+
disableDrag();
|
|
160
|
+
triggerChange();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
onremove: () => {
|
|
165
|
+
disableDrag();
|
|
166
|
+
},
|
|
167
|
+
oninit: () => {
|
|
168
|
+
use(node.attrs.data, (data) => {
|
|
169
|
+
parseInput(getValue(data), data.format);
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
view: () => {
|
|
173
|
+
return use(node.attrs.data, (data) => {
|
|
174
|
+
const rgba = getRGBA();
|
|
175
|
+
return m('div', {
|
|
176
|
+
class: twuiClass(data.type),
|
|
177
|
+
}, m('.color-picker-inputs', m("input.input-hex[type='text']", {
|
|
178
|
+
value: hasAlpha() ? getHexRGBA() : getHexRGB(),
|
|
179
|
+
onchange: inputHex,
|
|
180
|
+
}), m("input.input-r[type='number']", {
|
|
181
|
+
min: 0,
|
|
182
|
+
max: 255,
|
|
183
|
+
step: 1,
|
|
184
|
+
value: Math.round(rgba.r * 255),
|
|
185
|
+
onchange: inputR,
|
|
186
|
+
}), m("input.input-g[type='number']", {
|
|
187
|
+
min: 0,
|
|
188
|
+
max: 255,
|
|
189
|
+
step: 1,
|
|
190
|
+
value: Math.round(rgba.g * 255),
|
|
191
|
+
onchange: inputG,
|
|
192
|
+
}), m("input.input-b[type='number']", {
|
|
193
|
+
min: 0,
|
|
194
|
+
max: 255,
|
|
195
|
+
step: 1,
|
|
196
|
+
value: Math.round(rgba.b * 255),
|
|
197
|
+
onchange: inputB,
|
|
198
|
+
})), m('.color-picker-panel', m('.color-picker-sv', {
|
|
199
|
+
tabindex: 0,
|
|
200
|
+
onmousedown: beginPickSV,
|
|
201
|
+
ontouchstart: beginPickSV,
|
|
202
|
+
style: {
|
|
203
|
+
'background-color': `${getCssRGBA(1, 1, 1)}`,
|
|
204
|
+
'user-select': 'none',
|
|
205
|
+
},
|
|
206
|
+
}, m('.color-picker-sv-bg', {
|
|
207
|
+
style: {
|
|
208
|
+
background: 'linear-gradient(to right,rgba(255,255,255,1),rgba(255,255,255,0))',
|
|
209
|
+
'user-select': 'none',
|
|
210
|
+
'pointer-events': 'none',
|
|
211
|
+
},
|
|
212
|
+
}), m('.color-picker-sv-bg', {
|
|
213
|
+
style: {
|
|
214
|
+
background: 'linear-gradient(to top,rgba(0,0,0,1),rgba(0,0,0,0))',
|
|
215
|
+
'user-select': 'none',
|
|
216
|
+
'pointer-events': 'none',
|
|
217
|
+
},
|
|
218
|
+
}), m('.color-picker-sv-cursor', {
|
|
219
|
+
style: {
|
|
220
|
+
'user-select': 'none',
|
|
221
|
+
'pointer-events': 'none',
|
|
222
|
+
'background-color': `${getCssRGBA(hue, sat, 1)}`,
|
|
223
|
+
left: `${sat * 100}%`,
|
|
224
|
+
top: `${(1 - val) * 100}%`,
|
|
225
|
+
},
|
|
226
|
+
})), m('.color-picker-h', {
|
|
227
|
+
tabindex: 0,
|
|
228
|
+
onmousedown: beginPickH,
|
|
229
|
+
ontouchstart: beginPickH,
|
|
230
|
+
style: {
|
|
231
|
+
'user-select': 'none',
|
|
232
|
+
background: 'linear-gradient(to right, #f00 0, #f0f 17% , #00f 33% , #0ff 50% , #0f0 67% , #ff0 83% , #f00 100%)',
|
|
233
|
+
},
|
|
234
|
+
}, m('.color-picker-h-cursor', {
|
|
235
|
+
style: {
|
|
236
|
+
'user-select': 'none',
|
|
237
|
+
'pointer-events': 'none',
|
|
238
|
+
'background-color': `${getCssRGBA(1, 1, 1)}`,
|
|
239
|
+
position: 'absolute',
|
|
240
|
+
left: `${(1 - hue) * 100}%`,
|
|
241
|
+
},
|
|
242
|
+
})), !hasAlpha()
|
|
243
|
+
? null
|
|
244
|
+
: m('.color-picker-a', {
|
|
245
|
+
tabindex: 0,
|
|
246
|
+
onmousedown: beginPickA,
|
|
247
|
+
ontouchstart: beginPickA,
|
|
248
|
+
style: {
|
|
249
|
+
'user-select': 'none',
|
|
250
|
+
},
|
|
251
|
+
}, m('.color-picker-a-bg', {
|
|
252
|
+
style: {
|
|
253
|
+
background: `linear-gradient(to right, ${getCssRGBA(sat, val, 0)}, ${getCssRGBA(sat, val, 1)})`,
|
|
254
|
+
},
|
|
255
|
+
}), m('.color-picker-a-cursor', {
|
|
256
|
+
style: {
|
|
257
|
+
'user-select': 'none',
|
|
258
|
+
'pointer-events': 'none',
|
|
259
|
+
position: 'absolute',
|
|
260
|
+
left: `${a * 100}%`,
|
|
261
|
+
},
|
|
262
|
+
}))));
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
});
|
|
267
|
+
//# sourceMappingURL=color-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-picker.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/color-picker.ts"],"names":[],"mappings":"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","sourcesContent":["// tslint:disable:no-bitwise\r\nimport m from 'mithril'\r\n\r\nimport {\r\n getColorFormatter,\r\n HSV,\r\n hsv2rgb,\r\n HSVA,\r\n rgb2hsv,\r\n RGBA,\r\n} from '../../color-formats'\r\nimport {\r\n getValue,\r\n component,\r\n setValue,\r\n ComponentModel,\r\n ValueSource,\r\n ComponentAttrs,\r\n} from '../../core'\r\nimport {\r\n call,\r\n clamp,\r\n use,\r\n twuiClass,\r\n getTouchPoint,\r\n} from '../../core/utils'\r\n\r\n/**\r\n * Color picker component attributes\r\n *\r\n * @public\r\n */\r\nexport type ColorPickerAttrs = ComponentAttrs<ColorPickerModel>\r\n\r\n/**\r\n * Color picker component model\r\n *\r\n * @public\r\n */\r\nexport interface ColorPickerModel<T = unknown, V = number | string | number[]>\r\n extends ComponentModel,\r\n ValueSource<T, V> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'color-picker'\r\n /**\r\n * If `target` and `property` are not set, then this is used as the control value\r\n *\r\n * @remarks\r\n * The format is determined by the `format` property.\r\n *\r\n * It is allowed to omit the '#' character but the '#' will be added on change\r\n *\r\n * It is allowed to use single character form per component (#f00 instead of #ff0000)\r\n * but it will always be written back as #ff0000 on change\r\n */\r\n value?: V\r\n /**\r\n * The format of the string value. Defaults to 'rgb'\r\n *\r\n * @remarks\r\n * This must be a combination of the letters `r`, `g`, `b` and `a`.\r\n *\r\n * A prefix of `#` indicates the input/output is a hex string. e.g. #rgba\r\n *\r\n * A prefix of `0x` indicates the input is a number. e.g. 0xrgba\r\n *\r\n * A prefix of `[]` indicates the input is an array of numbers. e.g. `[]rgba`\r\n *\r\n * If a prefix is missing `#` is assumed\r\n */\r\n format?: string\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (model: ColorPickerModel<T, V>, value: unknown) => void\r\n /**\r\n * This is called once the control value is committed by the user.\r\n *\r\n * @remarks\r\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\r\n */\r\n onChange?: (model: ColorPickerModel<T, V>, value: unknown) => void\r\n}\r\n\r\ncomponent<ColorPickerAttrs>('color-picker', (node) => {\r\n let hue = 0 // range [0,1]\r\n let sat = 0 // range [0,1]\r\n let val = 0 // range [0,1]\r\n let a = 0 // range [0,1]\r\n\r\n function getHSVA(s = sat, v = val): HSVA {\r\n return {\r\n h: hue * 360,\r\n s: s,\r\n v: v,\r\n a: a,\r\n }\r\n }\r\n\r\n function getRGB(s = sat, v = val) {\r\n return hsv2rgb(getHSVA(s, v))\r\n }\r\n\r\n function getRGBA(s = sat, v = val, alpha = a): RGBA {\r\n return { ...getRGB(s, v), a: alpha }\r\n }\r\n\r\n function setHSV(hsv: HSV) {\r\n hue = hsv.h / 360\r\n sat = hsv.s\r\n val = hsv.v\r\n }\r\n\r\n function setHSVA(hsv: HSVA) {\r\n setHSV(hsv)\r\n a = hsv.a\r\n }\r\n\r\n function getHexRGB(s?: number, v?: number) {\r\n return getColorFormatter('#rgb').format(getRGBA(s, v))\r\n }\r\n\r\n function getHexRGBA(s?: number, v?: number) {\r\n return getColorFormatter('#rgba').format(getRGBA(s, v))\r\n }\r\n\r\n function getCssRGBA(s = sat, v = val, alpha: number = a) {\r\n return getColorFormatter('rgba()').format(getRGBA(s, v, alpha))\r\n }\r\n\r\n function parseInput(value: string | number | number[], format: string) {\r\n const rgba = getColorFormatter(format || 'rgb').parse(value)\r\n setHSVA({\r\n ...rgb2hsv(rgba),\r\n a: rgba.a,\r\n })\r\n }\r\n\r\n function formatOutput(format: string) {\r\n return getColorFormatter(format).format(getRGBA())\r\n }\r\n\r\n function triggerInput() {\r\n use(node.attrs.data, (data) => {\r\n const value = formatOutput(data.format)\r\n const written = setValue(data, value)\r\n call(data.onInput, data, written)\r\n })\r\n }\r\n\r\n function triggerChange() {\r\n use(node.attrs.data, (data) => {\r\n const value = formatOutput(data.format)\r\n const written = setValue(data, value)\r\n call(data.onChange, data, written)\r\n })\r\n }\r\n\r\n function hasAlpha() {\r\n return use(node.attrs.data, (data) => {\r\n return data.format && data.format.match(/a/i)\r\n })\r\n }\r\n\r\n //\r\n // manual input\r\n //\r\n\r\n function inputR(e: Event) {\r\n input(e, 'r')\r\n }\r\n\r\n function inputG(e: Event) {\r\n input(e, 'g')\r\n }\r\n\r\n function inputB(e: Event) {\r\n input(e, 'b')\r\n }\r\n\r\n function input(e: Event, field: keyof RGBA) {\r\n const color = getRGBA()\r\n color[field] = parseInt((e.target as HTMLInputElement).value, 10) / 255\r\n setHSV(rgb2hsv(color))\r\n triggerInput()\r\n triggerChange()\r\n }\r\n\r\n function inputHex(e: Event) {\r\n parseInput(\r\n (e.target as HTMLInputElement).value,\r\n hasAlpha() ? 'rgba' : 'rgb',\r\n )\r\n triggerInput()\r\n triggerChange()\r\n }\r\n\r\n //\r\n // drag input\r\n //\r\n\r\n let target: HTMLElement\r\n let kind: 'sv' | 'h' | 'a'\r\n function beginPickSV(e: MouseEvent) {\r\n kind = 'sv'\r\n enableDrag(e.target as HTMLElement)\r\n onMouseMove(e)\r\n }\r\n\r\n function beginPickH(e: MouseEvent) {\r\n kind = 'h'\r\n enableDrag(e.target as HTMLElement)\r\n onMouseMove(e)\r\n }\r\n\r\n function beginPickA(e: MouseEvent) {\r\n kind = 'a'\r\n enableDrag(e.target as HTMLElement)\r\n onMouseMove(e)\r\n }\r\n\r\n function enableDrag(el: HTMLElement) {\r\n disableDrag()\r\n target = el\r\n const options = { passive: false }\r\n document.addEventListener('mousemove', onMouseMove, options)\r\n document.addEventListener('mouseup', onMouseUp, options)\r\n document.addEventListener('touchmove', onMouseMove, options)\r\n document.addEventListener('touchend', onMouseUp, options)\r\n document.addEventListener('touchcancel', onMouseUp, options)\r\n }\r\n\r\n function disableDrag() {\r\n document.removeEventListener('mousemove', onMouseMove)\r\n document.removeEventListener('mouseup', onMouseUp)\r\n document.removeEventListener('touchmove', onMouseMove)\r\n document.removeEventListener('touchend', onMouseUp)\r\n document.removeEventListener('touchcancel', onMouseUp)\r\n }\r\n\r\n function onMouseMove(e: MouseEvent) {\r\n if (!target) {\r\n return\r\n }\r\n e.preventDefault()\r\n\r\n const rect = target.getBoundingClientRect()\r\n const tx = window.pageXOffset || document.documentElement.scrollLeft\r\n const ty = window.pageYOffset || document.documentElement.scrollTop\r\n const cw = target.clientWidth\r\n const ch = target.clientHeight\r\n let [cx, cy] = getTouchPoint(e)\r\n cx = clamp((cx - tx - rect.left) / cw, 0, 1)\r\n cy = clamp((cy - ty - rect.top) / ch, 0, 1)\r\n\r\n if (kind === 'sv') {\r\n sat = cx\r\n val = 1 - cy\r\n }\r\n if (kind === 'h') {\r\n hue = 1 - cx\r\n }\r\n if (kind === 'a') {\r\n a = cx\r\n }\r\n\r\n triggerInput()\r\n m.redraw()\r\n }\r\n\r\n function onMouseUp() {\r\n if (target != null) {\r\n target = null\r\n disableDrag()\r\n triggerChange()\r\n }\r\n }\r\n\r\n return {\r\n onremove: () => {\r\n disableDrag()\r\n },\r\n oninit: () => {\r\n use(node.attrs.data, (data) => {\r\n parseInput(getValue(data), data.format)\r\n })\r\n },\r\n view: () => {\r\n return use(node.attrs.data, (data) => {\r\n const rgba = getRGBA()\r\n return m(\r\n 'div',\r\n {\r\n class: twuiClass(data.type),\r\n },\r\n m(\r\n '.color-picker-inputs',\r\n m(\"input.input-hex[type='text']\", {\r\n value: hasAlpha() ? getHexRGBA() : getHexRGB(),\r\n onchange: inputHex,\r\n }),\r\n m(\"input.input-r[type='number']\", {\r\n min: 0,\r\n max: 255,\r\n step: 1,\r\n value: Math.round(rgba.r * 255),\r\n onchange: inputR,\r\n }),\r\n m(\"input.input-g[type='number']\", {\r\n min: 0,\r\n max: 255,\r\n step: 1,\r\n value: Math.round(rgba.g * 255),\r\n onchange: inputG,\r\n }),\r\n m(\"input.input-b[type='number']\", {\r\n min: 0,\r\n max: 255,\r\n step: 1,\r\n value: Math.round(rgba.b * 255),\r\n onchange: inputB,\r\n }),\r\n ),\r\n m(\r\n '.color-picker-panel',\r\n m(\r\n '.color-picker-sv',\r\n {\r\n tabindex: 0,\r\n onmousedown: beginPickSV,\r\n ontouchstart: beginPickSV,\r\n style: {\r\n 'background-color': `${getCssRGBA(1, 1, 1)}`,\r\n 'user-select': 'none',\r\n },\r\n },\r\n m('.color-picker-sv-bg', {\r\n style: {\r\n background:\r\n 'linear-gradient(to right,rgba(255,255,255,1),rgba(255,255,255,0))',\r\n 'user-select': 'none',\r\n 'pointer-events': 'none',\r\n },\r\n }),\r\n m('.color-picker-sv-bg', {\r\n style: {\r\n background:\r\n 'linear-gradient(to top,rgba(0,0,0,1),rgba(0,0,0,0))',\r\n 'user-select': 'none',\r\n 'pointer-events': 'none',\r\n },\r\n }),\r\n m('.color-picker-sv-cursor', {\r\n style: {\r\n 'user-select': 'none',\r\n 'pointer-events': 'none',\r\n 'background-color': `${getCssRGBA(hue, sat, 1)}`,\r\n left: `${sat * 100}%`,\r\n top: `${(1 - val) * 100}%`,\r\n },\r\n }),\r\n ),\r\n m(\r\n '.color-picker-h',\r\n {\r\n tabindex: 0,\r\n onmousedown: beginPickH,\r\n ontouchstart: beginPickH,\r\n style: {\r\n 'user-select': 'none',\r\n background:\r\n 'linear-gradient(to right, #f00 0, #f0f 17% , #00f 33% , #0ff 50% , #0f0 67% , #ff0 83% , #f00 100%)',\r\n },\r\n },\r\n m('.color-picker-h-cursor', {\r\n style: {\r\n 'user-select': 'none',\r\n 'pointer-events': 'none',\r\n 'background-color': `${getCssRGBA(1, 1, 1)}`,\r\n position: 'absolute',\r\n left: `${(1 - hue) * 100}%`,\r\n },\r\n }),\r\n ),\r\n !hasAlpha()\r\n ? null\r\n : m(\r\n '.color-picker-a',\r\n {\r\n tabindex: 0,\r\n onmousedown: beginPickA,\r\n ontouchstart: beginPickA,\r\n style: {\r\n 'user-select': 'none',\r\n },\r\n },\r\n m('.color-picker-a-bg', {\r\n style: {\r\n background: `linear-gradient(to right, ${getCssRGBA(\r\n sat,\r\n val,\r\n 0,\r\n )}, ${getCssRGBA(sat, val, 1)})`,\r\n },\r\n }),\r\n m('.color-picker-a-cursor', {\r\n style: {\r\n 'user-select': 'none',\r\n 'pointer-events': 'none',\r\n position: 'absolute',\r\n left: `${a * 100}%`,\r\n },\r\n }),\r\n ),\r\n ),\r\n )\r\n })\r\n },\r\n }\r\n})\r\n"]}
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { ComponentModel, ValueSource, ComponentAttrs } from '../../core';
|
|
2
|
-
/**
|
|
3
|
-
* Color component attributes
|
|
4
|
-
* @public
|
|
5
|
-
*/
|
|
6
|
-
export
|
|
7
|
-
/**
|
|
8
|
-
* Color component model
|
|
9
|
-
* @public
|
|
10
|
-
*/
|
|
11
|
-
export interface ColorModel<T = unknown, V = number | string | number[]> extends ComponentModel, ValueSource<T, V> {
|
|
12
|
-
/**
|
|
13
|
-
* The type name of the control
|
|
14
|
-
*/
|
|
15
|
-
type: 'color';
|
|
16
|
-
/**
|
|
17
|
-
* The color value as a string.
|
|
18
|
-
*
|
|
19
|
-
* @remarks
|
|
20
|
-
* The format is determined by the `format` property.
|
|
21
|
-
*
|
|
22
|
-
* It is allowed to omit the '#' character but the '#' will be added on change
|
|
23
|
-
*
|
|
24
|
-
* It is allowed to use single character form per component (#f00 instead of #ff0000)
|
|
25
|
-
* but it will always be written back as #ff0000 on change
|
|
26
|
-
*/
|
|
27
|
-
value?: V;
|
|
28
|
-
/**
|
|
29
|
-
* The format of the string value. Defaults to 'rgb'
|
|
30
|
-
*
|
|
31
|
-
* @remarks
|
|
32
|
-
* This must be a combination of the letters r, g, b and a
|
|
33
|
-
* and it must match the input value.
|
|
34
|
-
*/
|
|
35
|
-
format?: string;
|
|
36
|
-
/**
|
|
37
|
-
* Whether each component is normalized to range [0:1]
|
|
38
|
-
*/
|
|
39
|
-
normalized?: boolean;
|
|
40
|
-
/**
|
|
41
|
-
* This is called when the control value has been changed.
|
|
42
|
-
*/
|
|
43
|
-
onInput?: (model: ColorModel<T, V>, value: unknown) => void;
|
|
44
|
-
/**
|
|
45
|
-
* This is called once the control value is committed by the user.
|
|
46
|
-
*
|
|
47
|
-
* @remarks
|
|
48
|
-
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
49
|
-
*/
|
|
50
|
-
onChange?: (model: ColorModel<T, V>, value: unknown) => void;
|
|
51
|
-
}
|
|
1
|
+
import { ComponentModel, ValueSource, ComponentAttrs } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* Color component attributes
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type ColorAttrs = ComponentAttrs<ColorModel>;
|
|
7
|
+
/**
|
|
8
|
+
* Color component model
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface ColorModel<T = unknown, V = number | string | number[]> extends ComponentModel, ValueSource<T, V> {
|
|
12
|
+
/**
|
|
13
|
+
* The type name of the control
|
|
14
|
+
*/
|
|
15
|
+
type: 'color';
|
|
16
|
+
/**
|
|
17
|
+
* The color value as a string.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* The format is determined by the `format` property.
|
|
21
|
+
*
|
|
22
|
+
* It is allowed to omit the '#' character but the '#' will be added on change
|
|
23
|
+
*
|
|
24
|
+
* It is allowed to use single character form per component (#f00 instead of #ff0000)
|
|
25
|
+
* but it will always be written back as #ff0000 on change
|
|
26
|
+
*/
|
|
27
|
+
value?: V;
|
|
28
|
+
/**
|
|
29
|
+
* The format of the string value. Defaults to 'rgb'
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* This must be a combination of the letters r, g, b and a
|
|
33
|
+
* and it must match the input value.
|
|
34
|
+
*/
|
|
35
|
+
format?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Whether each component is normalized to range [0:1]
|
|
38
|
+
*/
|
|
39
|
+
normalized?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* This is called when the control value has been changed.
|
|
42
|
+
*/
|
|
43
|
+
onInput?: (model: ColorModel<T, V>, value: unknown) => void;
|
|
44
|
+
/**
|
|
45
|
+
* This is called once the control value is committed by the user.
|
|
46
|
+
*
|
|
47
|
+
* @remarks
|
|
48
|
+
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
49
|
+
*/
|
|
50
|
+
onChange?: (model: ColorModel<T, V>, value: unknown) => void;
|
|
51
|
+
}
|
|
52
52
|
//# sourceMappingURL=color.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/color.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAA;AAcnB;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/color.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAA;AAcnB;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AAEnD;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CACrE,SAAQ,cAAc,EACpB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IACnB;;OAEG;IACH,IAAI,EAAE,OAAO,CAAA;IACb;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,CAAC,CAAA;IACT;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3D;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAC7D"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { getColorFormatter } from '../../color-formats';
|
|
3
|
+
import { getValue, component, setValue, renderModel, } from '../../core';
|
|
4
|
+
import { call, isArray, isNumber, isObject, isString, padLeft, twuiClass, cssClass, } from '../../core/utils';
|
|
5
|
+
component('color', () => {
|
|
6
|
+
let data;
|
|
7
|
+
let opened = false;
|
|
8
|
+
let value;
|
|
9
|
+
let rgba;
|
|
10
|
+
const rgbaFromatter = getColorFormatter('rgba()');
|
|
11
|
+
function fetchState(node) {
|
|
12
|
+
data = node.attrs.data;
|
|
13
|
+
value = getValue(data);
|
|
14
|
+
rgba = rgbaFromatter.format(getColorFormatter(data.format).parse(value));
|
|
15
|
+
}
|
|
16
|
+
function toggle() {
|
|
17
|
+
opened = !opened;
|
|
18
|
+
}
|
|
19
|
+
function onPickerInput(p, v) {
|
|
20
|
+
const written = setValue(data, v);
|
|
21
|
+
call(data.onInput, data, written);
|
|
22
|
+
}
|
|
23
|
+
function onPickerChange(p, v) {
|
|
24
|
+
const written = setValue(data, v);
|
|
25
|
+
call(data.onChange, data, written);
|
|
26
|
+
}
|
|
27
|
+
function getText() {
|
|
28
|
+
if (isString(value)) {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
if (isNumber(value)) {
|
|
32
|
+
return '0x' + padLeft(value.toString(16), 8, '0');
|
|
33
|
+
}
|
|
34
|
+
if (isArray(value)) {
|
|
35
|
+
return value
|
|
36
|
+
.map((it) => (it < 1 && it > 0 ? it.toFixed(2) : it))
|
|
37
|
+
.join(' , ');
|
|
38
|
+
}
|
|
39
|
+
if (isObject(value)) {
|
|
40
|
+
return Object.keys(value)
|
|
41
|
+
.map((k) => {
|
|
42
|
+
const it = value[k];
|
|
43
|
+
return `${k}: ${it < 1 && it > 0 ? it.toFixed(2) : it}`;
|
|
44
|
+
})
|
|
45
|
+
.join(' ');
|
|
46
|
+
}
|
|
47
|
+
if (value == null) {
|
|
48
|
+
return 'null';
|
|
49
|
+
}
|
|
50
|
+
return '?';
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
oninit: (node) => {
|
|
54
|
+
fetchState(node);
|
|
55
|
+
},
|
|
56
|
+
onupdate: (node) => {
|
|
57
|
+
fetchState(node);
|
|
58
|
+
},
|
|
59
|
+
view: () => m('div', {
|
|
60
|
+
class: cssClass({
|
|
61
|
+
[twuiClass(data.type)]: true,
|
|
62
|
+
[twuiClass(data.type + '-open')]: opened,
|
|
63
|
+
}),
|
|
64
|
+
}, m("button[type='button']", {
|
|
65
|
+
style: { 'background-color': rgba },
|
|
66
|
+
onclick: toggle,
|
|
67
|
+
}, getText() || '?'), renderModel({
|
|
68
|
+
type: 'color-picker',
|
|
69
|
+
value: value,
|
|
70
|
+
format: data.format,
|
|
71
|
+
onInput: onPickerInput,
|
|
72
|
+
onChange: onPickerChange,
|
|
73
|
+
hidden: !opened,
|
|
74
|
+
})),
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/color.ts"],"names":[],"mappings":"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","sourcesContent":["import m, { Vnode } from 'mithril'\r\n\r\nimport { getColorFormatter } from '../../color-formats'\r\nimport { ColorPickerModel } from './color-picker'\r\nimport {\r\n getValue,\r\n component,\r\n setValue,\r\n renderModel,\r\n ComponentModel,\r\n ValueSource,\r\n ComponentAttrs,\r\n} from '../../core'\r\nimport {\r\n call,\r\n isArray,\r\n isNumber,\r\n isObject,\r\n isString,\r\n padLeft,\r\n use,\r\n twuiClass,\r\n cssClass,\r\n viewFn,\r\n} from '../../core/utils'\r\n\r\n/**\r\n * Color component attributes\r\n * @public\r\n */\r\nexport type ColorAttrs = ComponentAttrs<ColorModel>\r\n\r\n/**\r\n * Color component model\r\n * @public\r\n */\r\nexport interface ColorModel<T = unknown, V = number | string | number[]>\r\n extends ComponentModel,\r\n ValueSource<T, V> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'color'\r\n /**\r\n * The color value as a string.\r\n *\r\n * @remarks\r\n * The format is determined by the `format` property.\r\n *\r\n * It is allowed to omit the '#' character but the '#' will be added on change\r\n *\r\n * It is allowed to use single character form per component (#f00 instead of #ff0000)\r\n * but it will always be written back as #ff0000 on change\r\n */\r\n value?: V\r\n /**\r\n * The format of the string value. Defaults to 'rgb'\r\n *\r\n * @remarks\r\n * This must be a combination of the letters r, g, b and a\r\n * and it must match the input value.\r\n */\r\n format?: string\r\n /**\r\n * Whether each component is normalized to range [0:1]\r\n */\r\n normalized?: boolean\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (model: ColorModel<T, V>, value: unknown) => void\r\n /**\r\n * This is called once the control value is committed by the user.\r\n *\r\n * @remarks\r\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\r\n */\r\n onChange?: (model: ColorModel<T, V>, value: unknown) => void\r\n}\r\n\r\ncomponent<ColorAttrs>('color', () => {\r\n let data: ColorModel\r\n let opened = false\r\n let value: number | string | number[]\r\n let rgba: string\r\n\r\n const rgbaFromatter = getColorFormatter('rgba()')\r\n\r\n function fetchState(node: Vnode<ColorAttrs>) {\r\n data = node.attrs.data\r\n value = getValue(data)\r\n rgba = rgbaFromatter.format(getColorFormatter(data.format).parse(value))\r\n }\r\n\r\n function toggle() {\r\n opened = !opened\r\n }\r\n function onPickerInput(p: ColorPickerModel, v: any) {\r\n const written = setValue(data, v)\r\n call(data.onInput, data, written)\r\n }\r\n\r\n function onPickerChange(p: ColorPickerModel, v: any) {\r\n const written = setValue(data, v)\r\n call(data.onChange, data, written)\r\n }\r\n\r\n function getText() {\r\n if (isString(value)) {\r\n return value\r\n }\r\n if (isNumber(value)) {\r\n return '0x' + padLeft(value.toString(16), 8, '0')\r\n }\r\n if (isArray(value)) {\r\n return value\r\n .map((it: number) => (it < 1 && it > 0 ? it.toFixed(2) : it))\r\n .join(' , ')\r\n }\r\n if (isObject(value)) {\r\n return Object.keys(value)\r\n .map((k) => {\r\n const it = (value as any)[k]\r\n return `${k}: ${it < 1 && it > 0 ? it.toFixed(2) : it}`\r\n })\r\n .join(' ')\r\n }\r\n if (value == null) {\r\n return 'null'\r\n }\r\n return '?'\r\n }\r\n\r\n return {\r\n oninit: (node) => {\r\n fetchState(node)\r\n },\r\n onupdate: (node) => {\r\n fetchState(node)\r\n },\r\n view: () =>\r\n m(\r\n 'div',\r\n {\r\n class: cssClass({\r\n [twuiClass(data.type)]: true,\r\n [twuiClass(data.type + '-open')]: opened,\r\n }),\r\n },\r\n m(\r\n \"button[type='button']\",\r\n {\r\n style: { 'background-color': rgba },\r\n onclick: toggle,\r\n },\r\n getText() || '?',\r\n ),\r\n renderModel<ColorPickerModel>({\r\n type: 'color-picker',\r\n value: value,\r\n format: data.format,\r\n onInput: onPickerInput,\r\n onChange: onPickerChange,\r\n hidden: !opened,\r\n }),\r\n ),\r\n }\r\n})\r\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export * from './angle';
|
|
2
|
-
export * from './checkbox';
|
|
3
|
-
export * from './color-picker';
|
|
4
|
-
export * from './color';
|
|
5
|
-
export * from './number';
|
|
6
|
-
export * from './point';
|
|
7
|
-
export * from './position';
|
|
8
|
-
export * from './select';
|
|
9
|
-
export * from './spherical';
|
|
10
|
-
export * from './text';
|
|
1
|
+
export * from './angle';
|
|
2
|
+
export * from './checkbox';
|
|
3
|
+
export * from './color-picker';
|
|
4
|
+
export * from './color';
|
|
5
|
+
export * from './number';
|
|
6
|
+
export * from './point';
|
|
7
|
+
export * from './position';
|
|
8
|
+
export * from './select';
|
|
9
|
+
export * from './spherical';
|
|
10
|
+
export * from './text';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './angle';
|
|
2
|
+
export * from './checkbox';
|
|
3
|
+
export * from './color-picker';
|
|
4
|
+
export * from './color';
|
|
5
|
+
export * from './number';
|
|
6
|
+
export * from './point';
|
|
7
|
+
export * from './position';
|
|
8
|
+
export * from './select';
|
|
9
|
+
export * from './spherical';
|
|
10
|
+
export * from './text';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA","sourcesContent":["export * from './angle'\r\nexport * from './checkbox'\r\nexport * from './color-picker'\r\nexport * from './color'\r\nexport * from './number'\r\nexport * from './point'\r\nexport * from './position'\r\nexport * from './select'\r\nexport * from './spherical'\r\nexport * from './text'\r\n"]}
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { ComponentModel, ComponentAttrs, ValueSource } from '../../core';
|
|
2
|
-
/**
|
|
3
|
-
* Number component attributes
|
|
4
|
-
* @public
|
|
5
|
-
*/
|
|
6
|
-
export
|
|
7
|
-
/**
|
|
8
|
-
* Number component model
|
|
9
|
-
* @public
|
|
10
|
-
*/
|
|
11
|
-
export interface NumberModel<T = unknown> extends ComponentModel, ValueSource<T, number> {
|
|
12
|
-
/**
|
|
13
|
-
* The type name of the control
|
|
14
|
-
*/
|
|
15
|
-
type: 'number' | 'slider';
|
|
16
|
-
/**
|
|
17
|
-
* The placeholder text
|
|
18
|
-
*/
|
|
19
|
-
placeholder?: string;
|
|
20
|
-
/**
|
|
21
|
-
* The min value
|
|
22
|
-
*/
|
|
23
|
-
min?: number;
|
|
24
|
-
/**
|
|
25
|
-
* The max value
|
|
26
|
-
*/
|
|
27
|
-
max?: number;
|
|
28
|
-
/**
|
|
29
|
-
* The step value
|
|
30
|
-
*/
|
|
31
|
-
step?: number;
|
|
32
|
-
/**
|
|
33
|
-
* This is called when the control value has been changed.
|
|
34
|
-
*/
|
|
35
|
-
onInput?: (model: NumberModel<T>, value: unknown) => void;
|
|
36
|
-
/**
|
|
37
|
-
* This is called once the control value is committed by the user.
|
|
38
|
-
*
|
|
39
|
-
* @remarks
|
|
40
|
-
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
41
|
-
*/
|
|
42
|
-
onChange?: (model: NumberModel<T>, value: unknown) => void;
|
|
43
|
-
/**
|
|
44
|
-
* Disables the control input
|
|
45
|
-
*/
|
|
46
|
-
disabled?: boolean;
|
|
47
|
-
}
|
|
1
|
+
import { ComponentModel, ComponentAttrs, ValueSource } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* Number component attributes
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type NumberAttrs = ComponentAttrs<NumberModel>;
|
|
7
|
+
/**
|
|
8
|
+
* Number component model
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface NumberModel<T = unknown> extends ComponentModel, ValueSource<T, number> {
|
|
12
|
+
/**
|
|
13
|
+
* The type name of the control
|
|
14
|
+
*/
|
|
15
|
+
type: 'number' | 'slider';
|
|
16
|
+
/**
|
|
17
|
+
* The placeholder text
|
|
18
|
+
*/
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/**
|
|
21
|
+
* The min value
|
|
22
|
+
*/
|
|
23
|
+
min?: number;
|
|
24
|
+
/**
|
|
25
|
+
* The max value
|
|
26
|
+
*/
|
|
27
|
+
max?: number;
|
|
28
|
+
/**
|
|
29
|
+
* The step value
|
|
30
|
+
*/
|
|
31
|
+
step?: number;
|
|
32
|
+
/**
|
|
33
|
+
* This is called when the control value has been changed.
|
|
34
|
+
*/
|
|
35
|
+
onInput?: (model: NumberModel<T>, value: unknown) => void;
|
|
36
|
+
/**
|
|
37
|
+
* This is called once the control value is committed by the user.
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
41
|
+
*/
|
|
42
|
+
onChange?: (model: NumberModel<T>, value: unknown) => void;
|
|
43
|
+
/**
|
|
44
|
+
* Disables the control input
|
|
45
|
+
*/
|
|
46
|
+
disabled?: boolean;
|
|
47
|
+
}
|
|
48
48
|
//# sourceMappingURL=number.d.ts.map
|