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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/number.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/number.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;AAErD;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;IACtF;;OAEG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1D;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { getValue, component, setValue, } from '../../core';
|
|
3
|
+
import { call, clamp, cssClass, twuiClass, dragUtil, getTouchInTarget } from '../../core/utils';
|
|
4
|
+
const NumberComponent = () => {
|
|
5
|
+
let type;
|
|
6
|
+
let min;
|
|
7
|
+
let max;
|
|
8
|
+
let step;
|
|
9
|
+
let disabled;
|
|
10
|
+
let placeholder;
|
|
11
|
+
let isSlider;
|
|
12
|
+
let value;
|
|
13
|
+
let percent;
|
|
14
|
+
let focused;
|
|
15
|
+
let vnode;
|
|
16
|
+
// let data: NumberModel
|
|
17
|
+
function fetchState(node) {
|
|
18
|
+
vnode = node;
|
|
19
|
+
const data = node.attrs.data;
|
|
20
|
+
type = data.type;
|
|
21
|
+
isSlider = data.type === 'slider';
|
|
22
|
+
min = isSlider && data.min == null ? 0 : data.min;
|
|
23
|
+
max = isSlider && data.max == null ? 1 : data.max;
|
|
24
|
+
step = data.step;
|
|
25
|
+
value = getValue(data);
|
|
26
|
+
disabled = data.disabled;
|
|
27
|
+
percent = isSlider ? ((value - min) / (max - min)) * 100 : 0;
|
|
28
|
+
}
|
|
29
|
+
function setModelValue(e, v) {
|
|
30
|
+
v = value = clamp(isNaN(v) ? null : v, min, max);
|
|
31
|
+
const data = vnode.attrs.data;
|
|
32
|
+
const written = setValue(data, v);
|
|
33
|
+
call(e === 'input' ? data.onInput : data.onChange, data, written);
|
|
34
|
+
m.redraw();
|
|
35
|
+
}
|
|
36
|
+
function onInput(e) {
|
|
37
|
+
const el = e.target;
|
|
38
|
+
setModelValue('input', parseFloat(el.value));
|
|
39
|
+
}
|
|
40
|
+
function onChange(e) {
|
|
41
|
+
const el = e.target;
|
|
42
|
+
setModelValue('change', parseFloat(el.value));
|
|
43
|
+
}
|
|
44
|
+
function limit(v) {
|
|
45
|
+
v = clamp(v, min, max);
|
|
46
|
+
if (step != null) {
|
|
47
|
+
v = Math.round(v / step) * step;
|
|
48
|
+
}
|
|
49
|
+
return parseFloat(v.toFixed(5));
|
|
50
|
+
}
|
|
51
|
+
let drag = dragUtil({
|
|
52
|
+
onStart: (e) => {
|
|
53
|
+
drag.onMove(e);
|
|
54
|
+
},
|
|
55
|
+
onMove: (e) => {
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
const s = getTouchInTarget(e, drag.target).normalizedX;
|
|
58
|
+
setModelValue('input', limit(min + s * (max - min)));
|
|
59
|
+
},
|
|
60
|
+
onEnd: () => {
|
|
61
|
+
setModelValue('change', value);
|
|
62
|
+
drag.deactivate();
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
function onDragStart(e) {
|
|
66
|
+
if (!disabled) {
|
|
67
|
+
drag.activate(e);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function onKeydown(e) {
|
|
71
|
+
const code = e.key || e.keyCode;
|
|
72
|
+
const dir = code === 'ArrowLeft' ? -1 : code === 'ArrowRight' ? 1 : 0;
|
|
73
|
+
const add = (step || 1) * dir;
|
|
74
|
+
if (add) {
|
|
75
|
+
setModelValue('change', limit((value || 0) + add));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function onWheel(e) {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
const dir = (e.ctrlKey ? 0.5 : 1) * clamp(e.deltaY, -1, 1);
|
|
81
|
+
const add = (step || 0.2) * dir;
|
|
82
|
+
if (add) {
|
|
83
|
+
setModelValue('change', limit((value || 0) - add));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function onFocus() {
|
|
87
|
+
focused = true;
|
|
88
|
+
}
|
|
89
|
+
function onBlur() {
|
|
90
|
+
focused = false;
|
|
91
|
+
}
|
|
92
|
+
function slider() {
|
|
93
|
+
return m('.twui-progress', Object.assign({ style: 'user-select: none;', class: cssClass({
|
|
94
|
+
disabled: !!disabled,
|
|
95
|
+
}) }, (disabled
|
|
96
|
+
? {}
|
|
97
|
+
: {
|
|
98
|
+
tabindex: 0,
|
|
99
|
+
onmousedown: onDragStart,
|
|
100
|
+
ontouchstart: onDragStart,
|
|
101
|
+
onkeydown: onKeydown,
|
|
102
|
+
onwheel: onWheel,
|
|
103
|
+
})), m('.twui-progress-bar', {
|
|
104
|
+
style: {
|
|
105
|
+
width: `${percent}%`,
|
|
106
|
+
'pointer-events': 'none',
|
|
107
|
+
'user-select': 'none',
|
|
108
|
+
},
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
onremove: () => {
|
|
113
|
+
drag.deactivate();
|
|
114
|
+
},
|
|
115
|
+
oninit: (node) => {
|
|
116
|
+
fetchState(node);
|
|
117
|
+
},
|
|
118
|
+
onupdate: (node) => {
|
|
119
|
+
fetchState(node);
|
|
120
|
+
},
|
|
121
|
+
view: () => {
|
|
122
|
+
return m('div', {
|
|
123
|
+
class: twuiClass(type),
|
|
124
|
+
}, isSlider ? slider() : null, m("input[type='number']", {
|
|
125
|
+
min: min,
|
|
126
|
+
max: max,
|
|
127
|
+
step: step,
|
|
128
|
+
value: value,
|
|
129
|
+
oninput: onInput,
|
|
130
|
+
onchange: onChange,
|
|
131
|
+
onwheel: onWheel,
|
|
132
|
+
onfocus: onFocus,
|
|
133
|
+
onblur: onBlur,
|
|
134
|
+
placeholder: placeholder,
|
|
135
|
+
disabled: disabled,
|
|
136
|
+
}));
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
component('number', NumberComponent);
|
|
141
|
+
component('slider', NumberComponent);
|
|
142
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/number.ts"],"names":[],"mappings":"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","sourcesContent":["import m, { Child, ClosureComponent } from 'mithril'\r\n\r\nimport {\r\n getValue,\r\n component,\r\n setValue,\r\n ComponentModel,\r\n ComponentAttrs,\r\n ValueSource,\r\n} from '../../core'\r\nimport { call, clamp, cssClass, twuiClass, dragUtil, getTouchInTarget } from '../../core/utils'\r\n\r\n/**\r\n * Number component attributes\r\n * @public\r\n */\r\nexport type NumberAttrs = ComponentAttrs<NumberModel>\r\n\r\n/**\r\n * Number component model\r\n * @public\r\n */\r\nexport interface NumberModel<T = unknown> extends ComponentModel, ValueSource<T, number> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'number' | 'slider'\r\n /**\r\n * The placeholder text\r\n */\r\n placeholder?: string\r\n /**\r\n * The min value\r\n */\r\n min?: number\r\n /**\r\n * The max value\r\n */\r\n max?: number\r\n /**\r\n * The step value\r\n */\r\n step?: number\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (model: NumberModel<T>, 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: NumberModel<T>, value: unknown) => void\r\n /**\r\n * Disables the control input\r\n */\r\n disabled?: boolean\r\n}\r\n\r\nconst NumberComponent: ClosureComponent<NumberAttrs> = () => {\r\n let type: 'number' | 'slider'\r\n let min: number\r\n let max: number\r\n let step: number\r\n let disabled: boolean\r\n let placeholder: string\r\n let isSlider: boolean\r\n let value: number\r\n let percent: number\r\n let focused: boolean\r\n let vnode: m.Vnode<NumberAttrs>\r\n // let data: NumberModel\r\n\r\n function fetchState(node: m.Vnode<NumberAttrs>) {\r\n vnode = node\r\n const data = node.attrs.data\r\n type = data.type\r\n isSlider = data.type === 'slider'\r\n min = isSlider && data.min == null ? 0 : data.min\r\n max = isSlider && data.max == null ? 1 : data.max\r\n step = data.step\r\n value = getValue<number>(data)\r\n disabled = data.disabled\r\n percent = isSlider ? ((value - min) / (max - min)) * 100 : 0\r\n }\r\n\r\n function setModelValue(e: 'input' | 'change', v: number) {\r\n v = value = clamp(isNaN(v) ? null : v, min, max)\r\n const data = vnode.attrs.data\r\n const written = setValue(data, v)\r\n call(e === 'input' ? data.onInput : data.onChange, data, written)\r\n m.redraw()\r\n }\r\n\r\n function onInput(e: Event) {\r\n const el = e.target as HTMLInputElement\r\n setModelValue('input', parseFloat(el.value))\r\n }\r\n\r\n function onChange(e: Event) {\r\n const el = e.target as HTMLInputElement\r\n setModelValue('change', parseFloat(el.value))\r\n }\r\n\r\n function limit(v: number) {\r\n v = clamp(v, min, max)\r\n if (step != null) {\r\n v = Math.round(v / step) * step\r\n }\r\n return parseFloat(v.toFixed(5))\r\n }\r\n\r\n let drag = dragUtil({\r\n onStart: (e) => {\r\n drag.onMove(e)\r\n },\r\n onMove: (e) => {\r\n e.preventDefault()\r\n const s = getTouchInTarget(e, drag.target).normalizedX\r\n setModelValue('input', limit(min + s * (max - min)))\r\n },\r\n onEnd: () => {\r\n setModelValue('change', value)\r\n drag.deactivate()\r\n },\r\n })\r\n\r\n function onDragStart(e: MouseEvent) {\r\n if (!disabled) {\r\n drag.activate(e)\r\n }\r\n }\r\n\r\n function onKeydown(e: KeyboardEvent) {\r\n const code = e.key || e.keyCode\r\n const dir = code === 'ArrowLeft' ? -1 : code === 'ArrowRight' ? 1 : 0\r\n const add = (step || 1) * dir\r\n if (add) {\r\n setModelValue('change', limit((value || 0) + add))\r\n }\r\n }\r\n\r\n function onWheel(e: WheelEvent) {\r\n e.preventDefault()\r\n const dir = (e.ctrlKey ? 0.5 : 1) * clamp(e.deltaY, -1, 1)\r\n const add = (step || 0.2) * dir\r\n if (add) {\r\n setModelValue('change', limit((value || 0) - add))\r\n }\r\n }\r\n\r\n function onFocus() {\r\n focused = true\r\n }\r\n\r\n function onBlur() {\r\n focused = false\r\n }\r\n\r\n function slider(): Child {\r\n return m(\r\n '.twui-progress',\r\n {\r\n style: 'user-select: none;',\r\n class: cssClass({\r\n disabled: !!disabled,\r\n }),\r\n ...(disabled\r\n ? {}\r\n : {\r\n tabindex: 0,\r\n onmousedown: onDragStart,\r\n ontouchstart: onDragStart,\r\n onkeydown: onKeydown,\r\n onwheel: onWheel,\r\n }),\r\n },\r\n m('.twui-progress-bar', {\r\n style: {\r\n width: `${percent}%`,\r\n 'pointer-events': 'none',\r\n 'user-select': 'none',\r\n },\r\n }),\r\n )\r\n }\r\n\r\n return {\r\n onremove: () => {\r\n drag.deactivate()\r\n },\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 return m(\r\n 'div',\r\n {\r\n class: twuiClass(type),\r\n },\r\n isSlider ? slider() : null,\r\n m(\"input[type='number']\", {\r\n min: min,\r\n max: max,\r\n step: step,\r\n value: value,\r\n oninput: onInput,\r\n onchange: onChange,\r\n onwheel: onWheel,\r\n onfocus: onFocus,\r\n onblur: onBlur,\r\n placeholder: placeholder,\r\n disabled: disabled,\r\n }),\r\n )\r\n },\r\n }\r\n}\r\n\r\ncomponent('number', NumberComponent)\r\ncomponent('slider', NumberComponent)\r\n"]}
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { ComponentModel, ValueSource, ComponentAttrs } from '../../core';
|
|
2
|
-
/**
|
|
3
|
-
* Point component attributes
|
|
4
|
-
* @public
|
|
5
|
-
*/
|
|
6
|
-
export
|
|
7
|
-
/**
|
|
8
|
-
* Point component model
|
|
9
|
-
* @public
|
|
10
|
-
*/
|
|
11
|
-
export interface PointModel<T = unknown> extends ComponentModel, ValueSource<T, any> {
|
|
12
|
-
/**
|
|
13
|
-
* The type name of the control
|
|
14
|
-
*/
|
|
15
|
-
type: 'point';
|
|
16
|
-
/**
|
|
17
|
-
* The object field names. Defaults to `['x', 'y']`
|
|
18
|
-
*/
|
|
19
|
-
keys?: string[];
|
|
20
|
-
/**
|
|
21
|
-
* X-Axis min and max valuse
|
|
22
|
-
*/
|
|
23
|
-
xRange?: [number, number];
|
|
24
|
-
/**
|
|
25
|
-
* Y-Axis min and max valuse
|
|
26
|
-
*/
|
|
27
|
-
yRange?: [number, number];
|
|
28
|
-
/**
|
|
29
|
-
* Value to reset to when released
|
|
30
|
-
*/
|
|
31
|
-
reset?: [number, number];
|
|
32
|
-
/**
|
|
33
|
-
* Snap to grid value
|
|
34
|
-
*/
|
|
35
|
-
snap?: number;
|
|
36
|
-
/**
|
|
37
|
-
* This is called when the control value has been changed.
|
|
38
|
-
*/
|
|
39
|
-
onInput?: (model: PointModel<T>, value: number) => void;
|
|
40
|
-
/**
|
|
41
|
-
* This is called once the control value is committed by the user.
|
|
42
|
-
*
|
|
43
|
-
* @remarks
|
|
44
|
-
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
45
|
-
*/
|
|
46
|
-
onChange?: (model: PointModel<T>, value: number) => void;
|
|
47
|
-
}
|
|
1
|
+
import { ComponentModel, ValueSource, ComponentAttrs } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* Point component attributes
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type PointAttrs = ComponentAttrs<PointModel>;
|
|
7
|
+
/**
|
|
8
|
+
* Point component model
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface PointModel<T = unknown> extends ComponentModel, ValueSource<T, any> {
|
|
12
|
+
/**
|
|
13
|
+
* The type name of the control
|
|
14
|
+
*/
|
|
15
|
+
type: 'point';
|
|
16
|
+
/**
|
|
17
|
+
* The object field names. Defaults to `['x', 'y']`
|
|
18
|
+
*/
|
|
19
|
+
keys?: string[];
|
|
20
|
+
/**
|
|
21
|
+
* X-Axis min and max valuse
|
|
22
|
+
*/
|
|
23
|
+
xRange?: [number, number];
|
|
24
|
+
/**
|
|
25
|
+
* Y-Axis min and max valuse
|
|
26
|
+
*/
|
|
27
|
+
yRange?: [number, number];
|
|
28
|
+
/**
|
|
29
|
+
* Value to reset to when released
|
|
30
|
+
*/
|
|
31
|
+
reset?: [number, number];
|
|
32
|
+
/**
|
|
33
|
+
* Snap to grid value
|
|
34
|
+
*/
|
|
35
|
+
snap?: number;
|
|
36
|
+
/**
|
|
37
|
+
* This is called when the control value has been changed.
|
|
38
|
+
*/
|
|
39
|
+
onInput?: (model: PointModel<T>, value: number) => void;
|
|
40
|
+
/**
|
|
41
|
+
* This is called once the control value is committed by the user.
|
|
42
|
+
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
45
|
+
*/
|
|
46
|
+
onChange?: (model: PointModel<T>, value: number) => void;
|
|
47
|
+
}
|
|
48
48
|
//# sourceMappingURL=point.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/point.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG7F;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/point.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG7F;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AAEnD;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC;IAClF;;OAEG;IACH,IAAI,EAAE,OAAO,CAAA;IACb;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACzD"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { component, getValue } from '../../core';
|
|
3
|
+
import { call, clamp, twuiClass, getTouchPoint, dragUtil } from '../../core/utils';
|
|
4
|
+
const TYPE = 'point';
|
|
5
|
+
const DEFAULT_RANGE = [0, 1];
|
|
6
|
+
const DEFAULT_KEYS = ['x', 'y'];
|
|
7
|
+
component(TYPE, (vnode) => {
|
|
8
|
+
let kx;
|
|
9
|
+
let ky;
|
|
10
|
+
let xRange = DEFAULT_RANGE;
|
|
11
|
+
let yRange = DEFAULT_RANGE;
|
|
12
|
+
let vx = 0;
|
|
13
|
+
let vy = 0;
|
|
14
|
+
let x = 0;
|
|
15
|
+
let y = 0;
|
|
16
|
+
let rx;
|
|
17
|
+
let ry;
|
|
18
|
+
let snap;
|
|
19
|
+
function fetchValue(node) {
|
|
20
|
+
var _a;
|
|
21
|
+
const data = node.attrs.data;
|
|
22
|
+
const keys = data.keys || DEFAULT_KEYS;
|
|
23
|
+
kx = keys[0];
|
|
24
|
+
ky = keys[1];
|
|
25
|
+
const value = (_a = getValue(data)) !== null && _a !== void 0 ? _a : {
|
|
26
|
+
[kx]: vx,
|
|
27
|
+
[ky]: vy,
|
|
28
|
+
};
|
|
29
|
+
snap = data.snap;
|
|
30
|
+
vx = value[kx] || 0;
|
|
31
|
+
vy = value[ky] || 0;
|
|
32
|
+
xRange = data.xRange || xRange;
|
|
33
|
+
yRange = data.yRange || yRange;
|
|
34
|
+
x = (vx - xRange[0]) / (xRange[1] - xRange[0]);
|
|
35
|
+
y = (vy - yRange[0]) / (yRange[1] - yRange[0]);
|
|
36
|
+
const reset = data.reset;
|
|
37
|
+
if (reset) {
|
|
38
|
+
rx = (reset[0] - xRange[0]) / (xRange[1] - xRange[0]);
|
|
39
|
+
ry = (reset[1] - yRange[0]) / (yRange[1] - yRange[0]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function updateValue() {
|
|
43
|
+
vx = xRange[0] + (xRange[1] - xRange[0]) * x;
|
|
44
|
+
vy = yRange[0] + (yRange[1] - yRange[0]) * y;
|
|
45
|
+
if (snap > 0) {
|
|
46
|
+
vx = Math.floor(vx / snap) * snap;
|
|
47
|
+
vy = Math.floor(vy / snap) * snap;
|
|
48
|
+
x = (vx - xRange[0]) / (xRange[1] - xRange[0]);
|
|
49
|
+
y = (vy - yRange[0]) / (yRange[1] - yRange[0]);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function onChange(type) {
|
|
53
|
+
var _a;
|
|
54
|
+
updateValue();
|
|
55
|
+
const data = vnode.attrs.data;
|
|
56
|
+
const value = (_a = getValue(data)) !== null && _a !== void 0 ? _a : {
|
|
57
|
+
[kx]: vx,
|
|
58
|
+
[ky]: vy,
|
|
59
|
+
};
|
|
60
|
+
value[kx] = vx;
|
|
61
|
+
value[ky] = vy;
|
|
62
|
+
call(type === 'input' ? data.onInput : data.onChange, data, value);
|
|
63
|
+
}
|
|
64
|
+
function onMouseDown(e) {
|
|
65
|
+
drag.activate(e);
|
|
66
|
+
}
|
|
67
|
+
const drag = dragUtil({
|
|
68
|
+
onMove: (e) => {
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
const target = drag.target;
|
|
71
|
+
const rect = target.getBoundingClientRect();
|
|
72
|
+
const tx = window.pageXOffset || document.documentElement.scrollLeft;
|
|
73
|
+
const ty = window.pageYOffset || document.documentElement.scrollTop;
|
|
74
|
+
const cw = target.clientWidth;
|
|
75
|
+
const ch = target.clientHeight;
|
|
76
|
+
let [cx, cy] = getTouchPoint(e);
|
|
77
|
+
x = clamp((cx - tx - rect.left) / cw, 0, 1);
|
|
78
|
+
y = clamp((cy - ty - rect.top) / ch, 0, 1);
|
|
79
|
+
onChange('input');
|
|
80
|
+
m.redraw();
|
|
81
|
+
},
|
|
82
|
+
onEnd: () => {
|
|
83
|
+
drag.deactivate();
|
|
84
|
+
if (rx != null && ry != null) {
|
|
85
|
+
x = rx;
|
|
86
|
+
y = ry;
|
|
87
|
+
onChange('input');
|
|
88
|
+
}
|
|
89
|
+
onChange('change');
|
|
90
|
+
m.redraw();
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
onremove: drag.deactivate,
|
|
95
|
+
oninit: fetchValue,
|
|
96
|
+
onupdate: fetchValue,
|
|
97
|
+
view: () => m('div', {
|
|
98
|
+
class: twuiClass(TYPE),
|
|
99
|
+
tabindex: 0,
|
|
100
|
+
onmousedown: onMouseDown,
|
|
101
|
+
ontouchstart: onMouseDown,
|
|
102
|
+
}, m('.point-x-axis', {
|
|
103
|
+
style: {
|
|
104
|
+
'pointer-events': 'none',
|
|
105
|
+
position: 'absolute',
|
|
106
|
+
left: 0,
|
|
107
|
+
right: 0,
|
|
108
|
+
top: `${y * 100}%`,
|
|
109
|
+
height: `1px`,
|
|
110
|
+
},
|
|
111
|
+
}), m('.point-y-axis', {
|
|
112
|
+
style: {
|
|
113
|
+
'pointer-events': 'none',
|
|
114
|
+
position: 'absolute',
|
|
115
|
+
left: `${x * 100}%`,
|
|
116
|
+
top: 0,
|
|
117
|
+
bottom: 0,
|
|
118
|
+
width: `1px`,
|
|
119
|
+
},
|
|
120
|
+
}), m('.point-cursor', {
|
|
121
|
+
style: {
|
|
122
|
+
'pointer-events': 'none',
|
|
123
|
+
left: `${x * 100}%`,
|
|
124
|
+
top: `${y * 100}%`,
|
|
125
|
+
position: 'absolute',
|
|
126
|
+
width: '11px',
|
|
127
|
+
height: '11px',
|
|
128
|
+
'margin-top': '-5px',
|
|
129
|
+
'margin-left': '-5px',
|
|
130
|
+
border: '1px solid white',
|
|
131
|
+
'border-radius': '5px',
|
|
132
|
+
'box-shadow': '0px 0px 2px 1px rgba(0, 0, 0, 0.75)',
|
|
133
|
+
},
|
|
134
|
+
})),
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=point.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/point.ts"],"names":[],"mappings":"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","sourcesContent":["import m from 'mithril'\r\n\r\nimport { component, getValue, ComponentModel, ValueSource, ComponentAttrs } from '../../core'\r\nimport { call, clamp, use, twuiClass, viewFn, getTouchPoint, dragUtil } from '../../core/utils'\r\n\r\n/**\r\n * Point component attributes\r\n * @public\r\n */\r\nexport type PointAttrs = ComponentAttrs<PointModel>\r\n\r\n/**\r\n * Point component model\r\n * @public\r\n */\r\nexport interface PointModel<T = unknown> extends ComponentModel, ValueSource<T, any> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'point'\r\n /**\r\n * The object field names. Defaults to `['x', 'y']`\r\n */\r\n keys?: string[]\r\n /**\r\n * X-Axis min and max valuse\r\n */\r\n xRange?: [number, number]\r\n /**\r\n * Y-Axis min and max valuse\r\n */\r\n yRange?: [number, number]\r\n /**\r\n * Value to reset to when released\r\n */\r\n reset?: [number, number]\r\n /**\r\n * Snap to grid value\r\n */\r\n snap?: number\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (model: PointModel<T>, value: number) => 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: PointModel<T>, value: number) => void\r\n}\r\n\r\nconst TYPE = 'point'\r\nconst DEFAULT_RANGE = [0, 1]\r\nconst DEFAULT_KEYS = ['x', 'y']\r\ncomponent<PointAttrs>(TYPE, (vnode) => {\r\n let kx: any\r\n let ky: any\r\n let xRange = DEFAULT_RANGE\r\n let yRange = DEFAULT_RANGE\r\n let vx = 0\r\n let vy = 0\r\n let x = 0\r\n let y = 0\r\n let rx: number\r\n let ry: number\r\n let snap: number\r\n\r\n function fetchValue(node: m.Vnode<PointAttrs>) {\r\n const data = node.attrs.data\r\n const keys = data.keys || DEFAULT_KEYS\r\n kx = keys[0]\r\n ky = keys[1]\r\n const value: any = getValue(data) ?? {\r\n [kx]: vx,\r\n [ky]: vy,\r\n }\r\n snap = data.snap\r\n vx = value[kx] || 0\r\n vy = value[ky] || 0\r\n xRange = data.xRange || xRange\r\n yRange = data.yRange || yRange\r\n x = (vx - xRange[0]) / (xRange[1] - xRange[0])\r\n y = (vy - yRange[0]) / (yRange[1] - yRange[0])\r\n const reset = data.reset\r\n if (reset) {\r\n rx = (reset[0] - xRange[0]) / (xRange[1] - xRange[0])\r\n ry = (reset[1] - yRange[0]) / (yRange[1] - yRange[0])\r\n }\r\n }\r\n\r\n function updateValue() {\r\n vx = xRange[0] + (xRange[1] - xRange[0]) * x\r\n vy = yRange[0] + (yRange[1] - yRange[0]) * y\r\n if (snap > 0) {\r\n vx = Math.floor(vx / snap) * snap\r\n vy = Math.floor(vy / snap) * snap\r\n x = (vx - xRange[0]) / (xRange[1] - xRange[0])\r\n y = (vy - yRange[0]) / (yRange[1] - yRange[0])\r\n }\r\n }\r\n\r\n function onChange(type: 'change' | 'input') {\r\n updateValue()\r\n const data = vnode.attrs.data\r\n const value: any = getValue(data) ?? {\r\n [kx]: vx,\r\n [ky]: vy,\r\n }\r\n value[kx] = vx\r\n value[ky] = vy\r\n call(type === 'input' ? data.onInput : data.onChange, data, value)\r\n }\r\n\r\n function onMouseDown(e: MouseEvent) {\r\n drag.activate(e)\r\n }\r\n\r\n const drag = dragUtil({\r\n onMove: (e) => {\r\n e.preventDefault()\r\n const target = drag.target\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\r\n const cw = target.clientWidth\r\n const ch = target.clientHeight\r\n let [cx, cy] = getTouchPoint(e)\r\n x = clamp((cx - tx - rect.left) / cw, 0, 1)\r\n y = clamp((cy - ty - rect.top) / ch, 0, 1)\r\n\r\n onChange('input')\r\n m.redraw()\r\n },\r\n onEnd: () => {\r\n drag.deactivate()\r\n if (rx != null && ry != null) {\r\n x = rx\r\n y = ry\r\n onChange('input')\r\n }\r\n onChange('change')\r\n m.redraw()\r\n },\r\n })\r\n\r\n return {\r\n onremove: drag.deactivate,\r\n oninit: fetchValue,\r\n onupdate: fetchValue,\r\n view: () =>\r\n m(\r\n 'div',\r\n {\r\n class: twuiClass(TYPE),\r\n tabindex: 0,\r\n onmousedown: onMouseDown,\r\n ontouchstart: onMouseDown,\r\n },\r\n m('.point-x-axis', {\r\n style: {\r\n 'pointer-events': 'none',\r\n position: 'absolute',\r\n left: 0,\r\n right: 0,\r\n top: `${y * 100}%`,\r\n height: `1px`,\r\n },\r\n }),\r\n m('.point-y-axis', {\r\n style: {\r\n 'pointer-events': 'none',\r\n position: 'absolute',\r\n left: `${x * 100}%`,\r\n top: 0,\r\n bottom: 0,\r\n width: `1px`,\r\n },\r\n }),\r\n m('.point-cursor', {\r\n style: {\r\n 'pointer-events': 'none',\r\n left: `${x * 100}%`,\r\n top: `${y * 100}%`,\r\n position: 'absolute',\r\n width: '11px',\r\n height: '11px',\r\n 'margin-top': '-5px',\r\n 'margin-left': '-5px',\r\n border: '1px solid white',\r\n 'border-radius': '5px',\r\n 'box-shadow': '0px 0px 2px 1px rgba(0, 0, 0, 0.75)',\r\n },\r\n }),\r\n ),\r\n }\r\n})\r\n"]}
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import { ComponentAttrs, ComponentModel, ValueSource } from '../../core';
|
|
2
|
-
/**
|
|
3
|
-
* @public
|
|
4
|
-
*/
|
|
5
|
-
export
|
|
6
|
-
[key: string]: number;
|
|
7
|
-
} | {
|
|
8
|
-
[key: number]: number;
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Position component attributes
|
|
12
|
-
* @public
|
|
13
|
-
*/
|
|
14
|
-
export
|
|
15
|
-
/**
|
|
16
|
-
* Position component model
|
|
17
|
-
* @public
|
|
18
|
-
*/
|
|
19
|
-
export
|
|
20
|
-
/**
|
|
21
|
-
* The type name of the control
|
|
22
|
-
*/
|
|
23
|
-
type: 'position';
|
|
24
|
-
/**
|
|
25
|
-
* The position object field names. Defaults to `['x', 'y', 'z']`
|
|
26
|
-
*/
|
|
27
|
-
keys?: string[];
|
|
28
|
-
/**
|
|
29
|
-
* The min value
|
|
30
|
-
*/
|
|
31
|
-
min?: number;
|
|
32
|
-
/**
|
|
33
|
-
* The max value
|
|
34
|
-
*/
|
|
35
|
-
max?: number;
|
|
36
|
-
/**
|
|
37
|
-
* The step value
|
|
38
|
-
*/
|
|
39
|
-
step?: number;
|
|
40
|
-
/**
|
|
41
|
-
* This is called when the control value has been changed.
|
|
42
|
-
*/
|
|
43
|
-
onInput?: (model: PositionModel<T>, value: unknown, key?: string | number) => 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: PositionModel<T>, value: unknown, key?: string | number) => void;
|
|
51
|
-
/**
|
|
52
|
-
* Disables the control input
|
|
53
|
-
*/
|
|
54
|
-
disabled?: boolean;
|
|
55
|
-
};
|
|
1
|
+
import { ComponentAttrs, ComponentModel, ValueSource } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export type PositionValue = number[] | {
|
|
6
|
+
[key: string]: number;
|
|
7
|
+
} | {
|
|
8
|
+
[key: number]: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Position component attributes
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
export type PositionAttrs = ComponentAttrs<PositionModel>;
|
|
15
|
+
/**
|
|
16
|
+
* Position component model
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export type PositionModel<T = unknown> = ComponentModel & ValueSource<T, PositionValue> & {
|
|
20
|
+
/**
|
|
21
|
+
* The type name of the control
|
|
22
|
+
*/
|
|
23
|
+
type: 'position';
|
|
24
|
+
/**
|
|
25
|
+
* The position object field names. Defaults to `['x', 'y', 'z']`
|
|
26
|
+
*/
|
|
27
|
+
keys?: string[];
|
|
28
|
+
/**
|
|
29
|
+
* The min value
|
|
30
|
+
*/
|
|
31
|
+
min?: number;
|
|
32
|
+
/**
|
|
33
|
+
* The max value
|
|
34
|
+
*/
|
|
35
|
+
max?: number;
|
|
36
|
+
/**
|
|
37
|
+
* The step value
|
|
38
|
+
*/
|
|
39
|
+
step?: number;
|
|
40
|
+
/**
|
|
41
|
+
* This is called when the control value has been changed.
|
|
42
|
+
*/
|
|
43
|
+
onInput?: (model: PositionModel<T>, value: unknown, key?: string | number) => 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: PositionModel<T>, value: unknown, key?: string | number) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Disables the control input
|
|
53
|
+
*/
|
|
54
|
+
disabled?: boolean;
|
|
55
|
+
};
|
|
56
56
|
//# sourceMappingURL=position.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/position.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAA;AAInB;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/position.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAA;AAInB;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,MAAM,EAAE,GACR;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACzB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAA;AAE7B;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;AAEzD;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,cAAc,GACrD,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG;IAC9B;;OAEG;IACH,IAAI,EAAE,UAAU,CAAA;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,KAAK,EAAE,OAAO,EACd,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,KAClB,IAAI,CAAA;IACT;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CACT,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,KAAK,EAAE,OAAO,EACd,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,KAClB,IAAI,CAAA;IACT;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { getValue, component, setValue, renderModel, } from '../../core';
|
|
3
|
+
import { call, twuiClass, viewFn } from '../../core/utils';
|
|
4
|
+
const TYPE = 'position';
|
|
5
|
+
const defaultKeys = ['x', 'y', 'z'];
|
|
6
|
+
component(TYPE, (node) => {
|
|
7
|
+
function onChange(type, field, v) {
|
|
8
|
+
const data = node.attrs.data;
|
|
9
|
+
const value = getValue(data) || {};
|
|
10
|
+
value[field] = isNaN(v) ? null : v;
|
|
11
|
+
const written = setValue(data, value);
|
|
12
|
+
call(type === 'input' ? data.onInput : data.onChange, data, written, field);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
view: viewFn((data) => {
|
|
16
|
+
const keys = data.keys || defaultKeys;
|
|
17
|
+
const value = getValue(data);
|
|
18
|
+
return m('div', {
|
|
19
|
+
class: twuiClass(TYPE),
|
|
20
|
+
}, keys.map((field) => {
|
|
21
|
+
return renderModel({
|
|
22
|
+
type: 'number',
|
|
23
|
+
min: data.min,
|
|
24
|
+
max: data.max,
|
|
25
|
+
step: data.step,
|
|
26
|
+
value: value === null || value === void 0 ? void 0 : value[field],
|
|
27
|
+
disabled: data.disabled,
|
|
28
|
+
onInput: (_, v) => onChange('input', field, v),
|
|
29
|
+
onChange: (_, v) => onChange('change', field, v),
|
|
30
|
+
placeholder: field,
|
|
31
|
+
});
|
|
32
|
+
}));
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=position.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/position.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,SAAS,CAAA;AAEvB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,WAAW,GAIZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAoE1D,MAAM,IAAI,GAAG,UAAU,CAAA;AACvB,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AACnC,SAAS,CAAgB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;IACtC,SAAS,QAAQ,CAAC,IAAwB,EAAE,KAAa,EAAE,CAAS;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;QAC5B,MAAM,KAAK,GAAQ,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACvC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAA;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAQ,CAAA;YACnC,OAAO,CAAC,CACN,KAAK,EACL;gBACE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;aACvB,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,OAAO,WAAW,CAAc;oBAC9B,IAAI,EAAE,QAAQ;oBACd,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,KAAK,CAAC;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACtD,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;oBACxD,WAAW,EAAE,KAAK;iBACnB,CAAC,CAAA;YACJ,CAAC,CAAC,CACH,CAAA;QACH,CAAC,CAAC;KACH,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["import m from 'mithril'\r\n\r\nimport {\r\n getValue,\r\n component,\r\n setValue,\r\n renderModel,\r\n ComponentAttrs,\r\n ComponentModel,\r\n ValueSource,\r\n} from '../../core'\r\nimport { call, twuiClass, viewFn } from '../../core/utils'\r\nimport { NumberModel } from './number'\r\n\r\n/**\r\n * @public\r\n */\r\nexport type PositionValue =\r\n | number[]\r\n | { [key: string]: number }\r\n | { [key: number]: number }\r\n\r\n/**\r\n * Position component attributes\r\n * @public\r\n */\r\nexport type PositionAttrs = ComponentAttrs<PositionModel>\r\n\r\n/**\r\n * Position component model\r\n * @public\r\n */\r\nexport type PositionModel<T = unknown> = ComponentModel &\r\n ValueSource<T, PositionValue> & {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'position'\r\n /**\r\n * The position object field names. Defaults to `['x', 'y', 'z']`\r\n */\r\n keys?: string[]\r\n /**\r\n * The min value\r\n */\r\n min?: number\r\n /**\r\n * The max value\r\n */\r\n max?: number\r\n /**\r\n * The step value\r\n */\r\n step?: number\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (\r\n model: PositionModel<T>,\r\n value: unknown,\r\n key?: string | number,\r\n ) => 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?: (\r\n model: PositionModel<T>,\r\n value: unknown,\r\n key?: string | number,\r\n ) => void\r\n /**\r\n * Disables the control input\r\n */\r\n disabled?: boolean,\r\n }\r\n\r\nconst TYPE = 'position'\r\nconst defaultKeys = ['x', 'y', 'z']\r\ncomponent<PositionAttrs>(TYPE, (node) => {\r\n function onChange(type: 'input' | 'change', field: string, v: number) {\r\n const data = node.attrs.data\r\n const value: any = getValue(data) || {}\r\n value[field] = isNaN(v) ? null : v\r\n const written = setValue(data, value)\r\n call(type === 'input' ? data.onInput : data.onChange, data, written, field)\r\n }\r\n\r\n return {\r\n view: viewFn((data) => {\r\n const keys = data.keys || defaultKeys\r\n const value = getValue(data) as any\r\n return m(\r\n 'div',\r\n {\r\n class: twuiClass(TYPE),\r\n },\r\n keys.map((field) => {\r\n return renderModel<NumberModel>({\r\n type: 'number',\r\n min: data.min,\r\n max: data.max,\r\n step: data.step,\r\n value: value?.[field],\r\n disabled: data.disabled,\r\n onInput: (_, v: number) => onChange('input', field, v),\r\n onChange: (_, v: number) => onChange('change', field, v),\r\n placeholder: field,\r\n })\r\n }),\r\n )\r\n }),\r\n }\r\n})\r\n"]}
|