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.
Files changed (184) hide show
  1. package/LICENSE +7 -7
  2. package/README.md +32 -32
  3. package/dist/lib/builder.d.ts +166 -162
  4. package/dist/lib/builder.d.ts.map +1 -1
  5. package/dist/lib/builder.js +250 -0
  6. package/dist/lib/builder.js.map +1 -0
  7. package/dist/lib/color-formats/array-format.d.ts +8 -8
  8. package/dist/lib/color-formats/array-format.js +18 -0
  9. package/dist/lib/color-formats/array-format.js.map +1 -0
  10. package/dist/lib/color-formats/converter.d.ts +18 -18
  11. package/dist/lib/color-formats/converter.js +85 -0
  12. package/dist/lib/color-formats/converter.js.map +1 -0
  13. package/dist/lib/color-formats/css-string-format.d.ts +7 -7
  14. package/dist/lib/color-formats/css-string-format.js +28 -0
  15. package/dist/lib/color-formats/css-string-format.js.map +1 -0
  16. package/dist/lib/color-formats/formatter.d.ts +8 -8
  17. package/dist/lib/color-formats/formatter.js +35 -0
  18. package/dist/lib/color-formats/formatter.js.map +1 -0
  19. package/dist/lib/color-formats/hex-string-format.d.ts +7 -7
  20. package/dist/lib/color-formats/hex-string-format.js +28 -0
  21. package/dist/lib/color-formats/hex-string-format.js.map +1 -0
  22. package/dist/lib/color-formats/index.d.ts +3 -3
  23. package/dist/lib/color-formats/index.js +4 -0
  24. package/dist/lib/color-formats/index.js.map +1 -0
  25. package/dist/lib/color-formats/number-format.d.ts +8 -8
  26. package/dist/lib/color-formats/number-format.js +23 -0
  27. package/dist/lib/color-formats/number-format.js.map +1 -0
  28. package/dist/lib/color-formats/object-format.d.ts +14 -14
  29. package/dist/lib/color-formats/object-format.js +23 -0
  30. package/dist/lib/color-formats/object-format.js.map +1 -0
  31. package/dist/lib/color-formats/types.d.ts +101 -101
  32. package/dist/lib/color-formats/types.js +2 -0
  33. package/dist/lib/color-formats/types.js.map +1 -0
  34. package/dist/lib/components/button.d.ts +28 -28
  35. package/dist/lib/components/button.d.ts.map +1 -1
  36. package/dist/lib/components/button.js +15 -0
  37. package/dist/lib/components/button.js.map +1 -0
  38. package/dist/lib/components/content.d.ts +21 -21
  39. package/dist/lib/components/content.d.ts.map +1 -1
  40. package/dist/lib/components/content.js +10 -0
  41. package/dist/lib/components/content.js.map +1 -0
  42. package/dist/lib/components/controls/angle.d.ts +51 -51
  43. package/dist/lib/components/controls/angle.d.ts.map +1 -1
  44. package/dist/lib/components/controls/angle.js +201 -0
  45. package/dist/lib/components/controls/angle.js.map +1 -0
  46. package/dist/lib/components/controls/checkbox.d.ts +28 -28
  47. package/dist/lib/components/controls/checkbox.d.ts.map +1 -1
  48. package/dist/lib/components/controls/checkbox.js +31 -0
  49. package/dist/lib/components/controls/checkbox.js.map +1 -0
  50. package/dist/lib/components/controls/color-picker.d.ts +56 -56
  51. package/dist/lib/components/controls/color-picker.d.ts.map +1 -1
  52. package/dist/lib/components/controls/color-picker.js +267 -0
  53. package/dist/lib/components/controls/color-picker.js.map +1 -0
  54. package/dist/lib/components/controls/color.d.ts +51 -51
  55. package/dist/lib/components/controls/color.d.ts.map +1 -1
  56. package/dist/lib/components/controls/color.js +77 -0
  57. package/dist/lib/components/controls/color.js.map +1 -0
  58. package/dist/lib/components/controls/index.d.ts +10 -10
  59. package/dist/lib/components/controls/index.js +11 -0
  60. package/dist/lib/components/controls/index.js.map +1 -0
  61. package/dist/lib/components/controls/number.d.ts +47 -47
  62. package/dist/lib/components/controls/number.d.ts.map +1 -1
  63. package/dist/lib/components/controls/number.js +142 -0
  64. package/dist/lib/components/controls/number.js.map +1 -0
  65. package/dist/lib/components/controls/point.d.ts +47 -47
  66. package/dist/lib/components/controls/point.d.ts.map +1 -1
  67. package/dist/lib/components/controls/point.js +137 -0
  68. package/dist/lib/components/controls/point.js.map +1 -0
  69. package/dist/lib/components/controls/position.d.ts +55 -55
  70. package/dist/lib/components/controls/position.d.ts.map +1 -1
  71. package/dist/lib/components/controls/position.js +36 -0
  72. package/dist/lib/components/controls/position.js.map +1 -0
  73. package/dist/lib/components/controls/select.d.ts +59 -59
  74. package/dist/lib/components/controls/select.d.ts.map +1 -1
  75. package/dist/lib/components/controls/select.js +132 -0
  76. package/dist/lib/components/controls/select.js.map +1 -0
  77. package/dist/lib/components/controls/spherical.d.ts +74 -74
  78. package/dist/lib/components/controls/spherical.d.ts.map +1 -1
  79. package/dist/lib/components/controls/spherical.js +302 -0
  80. package/dist/lib/components/controls/spherical.js.map +1 -0
  81. package/dist/lib/components/controls/text.d.ts +35 -35
  82. package/dist/lib/components/controls/text.d.ts.map +1 -1
  83. package/dist/lib/components/controls/text.js +24 -0
  84. package/dist/lib/components/controls/text.js.map +1 -0
  85. package/dist/lib/components/groups/accordion.d.ts +21 -21
  86. package/dist/lib/components/groups/accordion.d.ts.map +1 -1
  87. package/dist/lib/components/groups/accordion.js +34 -0
  88. package/dist/lib/components/groups/accordion.js.map +1 -0
  89. package/dist/lib/components/groups/container.d.ts +24 -24
  90. package/dist/lib/components/groups/container.d.ts.map +1 -1
  91. package/dist/lib/components/groups/container.js +19 -0
  92. package/dist/lib/components/groups/container.js.map +1 -0
  93. package/dist/lib/components/groups/group.d.ts +48 -48
  94. package/dist/lib/components/groups/group.d.ts.map +1 -1
  95. package/dist/lib/components/groups/group.js +50 -0
  96. package/dist/lib/components/groups/group.js.map +1 -0
  97. package/dist/lib/components/groups/index.d.ts +4 -4
  98. package/dist/lib/components/groups/index.js +5 -0
  99. package/dist/lib/components/groups/index.js.map +1 -0
  100. package/dist/lib/components/groups/tabs.d.ts +21 -21
  101. package/dist/lib/components/groups/tabs.d.ts.map +1 -1
  102. package/dist/lib/components/groups/tabs.js +31 -0
  103. package/dist/lib/components/groups/tabs.js.map +1 -0
  104. package/dist/lib/components/image.d.ts +36 -36
  105. package/dist/lib/components/image.d.ts.map +1 -1
  106. package/dist/lib/components/image.js +46 -0
  107. package/dist/lib/components/image.js.map +1 -0
  108. package/dist/lib/components/index.d.ts +5 -5
  109. package/dist/lib/components/index.js +6 -0
  110. package/dist/lib/components/index.js.map +1 -0
  111. package/dist/lib/core/index.d.ts +4 -4
  112. package/dist/lib/core/index.js +5 -0
  113. package/dist/lib/core/index.js.map +1 -0
  114. package/dist/lib/core/registry.d.ts +17 -17
  115. package/dist/lib/core/registry.js +30 -0
  116. package/dist/lib/core/registry.js.map +1 -0
  117. package/dist/lib/core/render.d.ts +9 -9
  118. package/dist/lib/core/render.d.ts.map +1 -1
  119. package/dist/lib/core/render.js +19 -0
  120. package/dist/lib/core/render.js.map +1 -0
  121. package/dist/lib/core/types.d.ts +87 -87
  122. package/dist/lib/core/types.d.ts.map +1 -1
  123. package/dist/lib/core/types.js +2 -0
  124. package/dist/lib/core/types.js.map +1 -0
  125. package/dist/lib/core/utils.d.ts +93 -93
  126. package/dist/lib/core/utils.d.ts.map +1 -1
  127. package/dist/lib/core/utils.js +193 -0
  128. package/dist/lib/core/utils.js.map +1 -0
  129. package/dist/lib/core/value-accessor.d.ts +17 -17
  130. package/dist/lib/core/value-accessor.js +52 -0
  131. package/dist/lib/core/value-accessor.js.map +1 -0
  132. package/dist/lib/index.d.ts +21 -27
  133. package/dist/lib/index.d.ts.map +1 -1
  134. package/dist/lib/index.js +29 -0
  135. package/dist/lib/index.js.map +1 -0
  136. package/dist/lib/mount.d.ts +45 -45
  137. package/dist/lib/mount.js +85 -0
  138. package/dist/lib/mount.js.map +1 -0
  139. package/dist/tweak-ui.css +133 -138
  140. package/dist/tweak-ui.css.map +1 -1
  141. package/dist/tweak-ui.min.css +1 -1
  142. package/dist/tweak-ui.min.css.map +1 -1
  143. package/dist/tweak-ui.module.js +2733 -2380
  144. package/dist/tweak-ui.module.js.map +1 -1
  145. package/dist/tweak-ui.umd.js +1 -4403
  146. package/dist/tweak-ui.umd.js.map +1 -1
  147. package/package.json +25 -42
  148. package/dist/index.html +0 -1061
  149. package/dist/lib/color-formats/array-format.spec.d.ts +0 -2
  150. package/dist/lib/color-formats/array-format.spec.d.ts.map +0 -1
  151. package/dist/lib/color-formats/converter.spec.d.ts +0 -2
  152. package/dist/lib/color-formats/converter.spec.d.ts.map +0 -1
  153. package/dist/lib/color-formats/css-string-format.spec.d.ts +0 -2
  154. package/dist/lib/color-formats/css-string-format.spec.d.ts.map +0 -1
  155. package/dist/lib/color-formats/formatter.spec.d.ts +0 -2
  156. package/dist/lib/color-formats/formatter.spec.d.ts.map +0 -1
  157. package/dist/lib/color-formats/hex-string-format.spec.d.ts +0 -2
  158. package/dist/lib/color-formats/hex-string-format.spec.d.ts.map +0 -1
  159. package/dist/lib/color-formats/number-format.spec.d.ts +0 -2
  160. package/dist/lib/color-formats/number-format.spec.d.ts.map +0 -1
  161. package/dist/lib/color-formats/object-format.spec.d.ts +0 -2
  162. package/dist/lib/color-formats/object-format.spec.d.ts.map +0 -1
  163. package/dist/scss/_style.scss +0 -120
  164. package/dist/scss/_themes.scss +0 -23
  165. package/dist/scss/_utils.scss +0 -24
  166. package/dist/scss/_variables.scss +0 -30
  167. package/dist/scss/controls/_angle.scss +0 -64
  168. package/dist/scss/controls/_button.scss +0 -0
  169. package/dist/scss/controls/_checkbox.scss +0 -19
  170. package/dist/scss/controls/_color-picker.scss +0 -124
  171. package/dist/scss/controls/_color.scss +0 -14
  172. package/dist/scss/controls/_container.scss +0 -13
  173. package/dist/scss/controls/_group.scss +0 -69
  174. package/dist/scss/controls/_image.scss +0 -27
  175. package/dist/scss/controls/_number.scss +0 -38
  176. package/dist/scss/controls/_point.scss +0 -36
  177. package/dist/scss/controls/_position.scss +0 -9
  178. package/dist/scss/controls/_select.scss +0 -0
  179. package/dist/scss/controls/_spherical.scss +0 -87
  180. package/dist/scss/controls/_tabs.scss +0 -38
  181. package/dist/scss/controls/_text.scss +0 -0
  182. package/dist/scss/index.scss +0 -21
  183. package/dist/tweak-ui.umd.min.js +0 -17
  184. 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 declare 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
- }
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,oBAAY,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"}
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":"AAAA,OAAO,CAAY,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,OAAO,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,WAAW,GAIZ,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,OAAO,EAEP,SAAS,EACT,QAAQ,GAET,MAAM,kBAAkB,CAAA;AAwDzB,SAAS,CAAa,OAAO,EAAE,GAAG,EAAE;IAClC,IAAI,IAAgB,CAAA;IACpB,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,KAAiC,CAAA;IACrC,IAAI,IAAY,CAAA;IAEhB,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAEjD,SAAS,UAAU,CAAC,IAAuB;QACzC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;QACtB,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,SAAS,MAAM;QACb,MAAM,GAAG,CAAC,MAAM,CAAA;IAClB,CAAC;IACD,SAAS,aAAa,CAAC,CAAmB,EAAE,CAAM;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,cAAc,CAAC,CAAmB,EAAE,CAAM;QACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,SAAS,OAAO;QACd,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QACnD,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK;iBACT,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC5D,IAAI,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;iBACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,EAAE,GAAI,KAAa,CAAC,CAAC,CAAC,CAAA;gBAC5B,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;YACzD,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;QACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,UAAU,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjB,UAAU,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CACT,CAAC,CACC,KAAK,EACL;YACE,KAAK,EAAE,QAAQ,CAAC;gBACd,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI;gBAC5B,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM;aACzC,CAAC;SACH,EACD,CAAC,CACC,uBAAuB,EACvB;YACE,KAAK,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;YACnC,OAAO,EAAE,MAAM;SAChB,EACD,OAAO,EAAE,IAAI,GAAG,CACjB,EACD,WAAW,CAAmB;YAC5B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,aAAa;YACtB,QAAQ,EAAE,cAAc;YACxB,MAAM,EAAE,CAAC,MAAM;SAChB,CAAC,CACH;KACJ,CAAA;AACH,CAAC,CAAC,CAAA","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 declare 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
- }
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