tweak-ui 0.4.3 → 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 -2396
- package/dist/tweak-ui.module.js.map +1 -1
- package/dist/tweak-ui.umd.js +1 -4419
- package/dist/tweak-ui.umd.js.map +1 -1
- package/package.json +25 -42
- package/dist/index.html +0 -1063
- package/dist/lib/color-formats/array-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/array-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/converter.spec.d.ts +0 -2
- package/dist/lib/color-formats/converter.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/css-string-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/css-string-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/formatter.spec.d.ts +0 -2
- package/dist/lib/color-formats/formatter.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/hex-string-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/hex-string-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/number-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/number-format.spec.d.ts.map +0 -1
- package/dist/lib/color-formats/object-format.spec.d.ts +0 -2
- package/dist/lib/color-formats/object-format.spec.d.ts.map +0 -1
- package/dist/scss/_style.scss +0 -120
- package/dist/scss/_themes.scss +0 -23
- package/dist/scss/_utils.scss +0 -24
- package/dist/scss/_variables.scss +0 -30
- package/dist/scss/controls/_angle.scss +0 -64
- package/dist/scss/controls/_button.scss +0 -0
- package/dist/scss/controls/_checkbox.scss +0 -19
- package/dist/scss/controls/_color-picker.scss +0 -124
- package/dist/scss/controls/_color.scss +0 -14
- package/dist/scss/controls/_container.scss +0 -13
- package/dist/scss/controls/_group.scss +0 -69
- package/dist/scss/controls/_image.scss +0 -27
- package/dist/scss/controls/_number.scss +0 -38
- package/dist/scss/controls/_point.scss +0 -36
- package/dist/scss/controls/_position.scss +0 -9
- package/dist/scss/controls/_select.scss +0 -0
- package/dist/scss/controls/_spherical.scss +0 -87
- package/dist/scss/controls/_tabs.scss +0 -38
- package/dist/scss/controls/_text.scss +0 -0
- package/dist/scss/index.scss +0 -21
- package/dist/tweak-ui.umd.min.js +0 -17
- package/dist/tweak-ui.umd.min.js.map +0 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { component, getValue, renderModel, setValue, } from '../../core';
|
|
3
|
+
import { call, clamp, cssClass, dragUtil, getTouchInTarget, twuiClass } from '../../core/utils';
|
|
4
|
+
const TYPE = 'spherical';
|
|
5
|
+
const KEYS = ['phi', 'theta'];
|
|
6
|
+
const SphericalComponent = (vnode) => {
|
|
7
|
+
let phi = 0; // azimuth [0, 2PI]
|
|
8
|
+
let theta = 0; // inclination [0, PI]
|
|
9
|
+
let backface = false;
|
|
10
|
+
let v2Phi = [0, 0];
|
|
11
|
+
let v2Theta = [0, 0];
|
|
12
|
+
let draggedKnob;
|
|
13
|
+
function toDeg(value) {
|
|
14
|
+
return value * (180 / Math.PI);
|
|
15
|
+
}
|
|
16
|
+
function toRad(value) {
|
|
17
|
+
return value * (Math.PI / 180);
|
|
18
|
+
}
|
|
19
|
+
function toScreen(value) {
|
|
20
|
+
return clamp((value / 2 + 0.5) * 100, 0, 100);
|
|
21
|
+
}
|
|
22
|
+
function read(node) {
|
|
23
|
+
const data = node.attrs.data;
|
|
24
|
+
const value = getValue(data) || {
|
|
25
|
+
phi: data.degree ? toDeg(phi) : phi,
|
|
26
|
+
theta: data.degree ? toDeg(theta) : theta,
|
|
27
|
+
};
|
|
28
|
+
const [kPhi, kTheta] = data.keys || KEYS;
|
|
29
|
+
return { data, value, kPhi, kTheta };
|
|
30
|
+
}
|
|
31
|
+
function fetchValue(node) {
|
|
32
|
+
const { data, value, kPhi, kTheta } = read(node);
|
|
33
|
+
phi = value[kPhi] || 0;
|
|
34
|
+
theta = value[kTheta] || 0;
|
|
35
|
+
if (data.degree) {
|
|
36
|
+
phi = toRad(phi);
|
|
37
|
+
theta = toRad(theta);
|
|
38
|
+
}
|
|
39
|
+
while (theta < 0) {
|
|
40
|
+
theta += Math.PI;
|
|
41
|
+
}
|
|
42
|
+
while (theta > Math.PI) {
|
|
43
|
+
theta -= Math.PI;
|
|
44
|
+
}
|
|
45
|
+
backface = theta > Math.PI / 2;
|
|
46
|
+
updatePositions();
|
|
47
|
+
}
|
|
48
|
+
function onChange(type) {
|
|
49
|
+
updatePositions();
|
|
50
|
+
const { data, value, kPhi, kTheta } = read(vnode);
|
|
51
|
+
value[kPhi] = data.degree ? toDeg(phi) : phi;
|
|
52
|
+
value[kTheta] = data.degree ? toDeg(theta) : theta;
|
|
53
|
+
const written = setValue(data, value);
|
|
54
|
+
call(type === 'input' ? data.onInput : data.onChange, data, written);
|
|
55
|
+
}
|
|
56
|
+
function updatePositions() {
|
|
57
|
+
v2Phi[0] = Math.cos(phi);
|
|
58
|
+
v2Phi[1] = Math.sin(phi);
|
|
59
|
+
v2Theta[0] = Math.sin(theta) * Math.cos(phi);
|
|
60
|
+
v2Theta[1] = Math.sin(theta) * Math.sin(phi);
|
|
61
|
+
}
|
|
62
|
+
function onStartPhi(e) {
|
|
63
|
+
draggedKnob = 'phi';
|
|
64
|
+
drag.activate(e);
|
|
65
|
+
}
|
|
66
|
+
function onStartTheta(e) {
|
|
67
|
+
draggedKnob = 'theta';
|
|
68
|
+
drag.activate(e);
|
|
69
|
+
}
|
|
70
|
+
let touchOffset;
|
|
71
|
+
const drag = dragUtil({
|
|
72
|
+
onStart: (e) => {
|
|
73
|
+
const touch = getTouchInTarget(e);
|
|
74
|
+
touchOffset = [
|
|
75
|
+
-(touch.x - touch.width / 2),
|
|
76
|
+
-(touch.y - touch.height / 2),
|
|
77
|
+
];
|
|
78
|
+
drag.onMove(e);
|
|
79
|
+
},
|
|
80
|
+
onMove: (e) => {
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
const position = getTouchInTarget(e, drag.target.parentElement, touchOffset);
|
|
83
|
+
const px = position.normalizedX - 0.5;
|
|
84
|
+
const py = position.normalizedY - 0.5;
|
|
85
|
+
if (draggedKnob === 'phi') {
|
|
86
|
+
// [-PI;PI]
|
|
87
|
+
phi = Math.atan2(px, py);
|
|
88
|
+
// convert to range [0;2PI]
|
|
89
|
+
phi += phi < 0 ? 2 * Math.PI : 0;
|
|
90
|
+
}
|
|
91
|
+
else if (draggedKnob === 'theta') {
|
|
92
|
+
// closest point on segment
|
|
93
|
+
// p0: [0, 0], p1: vPhi
|
|
94
|
+
const ab = v2Phi;
|
|
95
|
+
const ac = [py, px];
|
|
96
|
+
const t = (ab[0] * ac[0] + ab[1] * ac[1]) / Math.sqrt(ab[0] * ab[0] + ab[1] * ab[1]);
|
|
97
|
+
theta = Math.PI * clamp(t, 0, 0.5);
|
|
98
|
+
if (backface) {
|
|
99
|
+
theta = Math.PI - theta;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
onChange('input');
|
|
103
|
+
m.redraw();
|
|
104
|
+
},
|
|
105
|
+
onEnd: (e) => {
|
|
106
|
+
drag.deactivate();
|
|
107
|
+
draggedKnob = null;
|
|
108
|
+
onChange('change');
|
|
109
|
+
m.redraw();
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
function onPhiInput(model, value) {
|
|
113
|
+
phi = toRad(value);
|
|
114
|
+
onChange('input');
|
|
115
|
+
}
|
|
116
|
+
function onPhiChange(model, value) {
|
|
117
|
+
phi = toRad(value);
|
|
118
|
+
onChange('change');
|
|
119
|
+
}
|
|
120
|
+
function onThetaInput(model, value) {
|
|
121
|
+
theta = toRad(value);
|
|
122
|
+
onChange('input');
|
|
123
|
+
}
|
|
124
|
+
function onThetaChange(model, value) {
|
|
125
|
+
theta = toRad(value);
|
|
126
|
+
onChange('change');
|
|
127
|
+
}
|
|
128
|
+
function onBackfaceChange(model, value) {
|
|
129
|
+
backface = value;
|
|
130
|
+
theta = Math.PI - theta;
|
|
131
|
+
onChange('change');
|
|
132
|
+
setTimeout(() => m.redraw());
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
onremove: () => {
|
|
136
|
+
drag.deactivate();
|
|
137
|
+
},
|
|
138
|
+
oninit: (node) => {
|
|
139
|
+
fetchValue(node);
|
|
140
|
+
},
|
|
141
|
+
onupdate: (node) => {
|
|
142
|
+
fetchValue(node);
|
|
143
|
+
},
|
|
144
|
+
view: () => {
|
|
145
|
+
return m('div', {
|
|
146
|
+
class: twuiClass(TYPE),
|
|
147
|
+
style: {
|
|
148
|
+
'--spherical-phi': `${toDeg(-phi) + 90}deg`,
|
|
149
|
+
},
|
|
150
|
+
}, m('div.left-container', m('div.pane', {
|
|
151
|
+
style: {
|
|
152
|
+
position: 'relative',
|
|
153
|
+
width: '100%',
|
|
154
|
+
'padding-top': '100%',
|
|
155
|
+
},
|
|
156
|
+
}, m('div.phi-pane', {
|
|
157
|
+
class: cssClass({
|
|
158
|
+
'is-dragging': draggedKnob === 'phi',
|
|
159
|
+
}),
|
|
160
|
+
style: {
|
|
161
|
+
position: 'absolute',
|
|
162
|
+
top: '0.5rem',
|
|
163
|
+
left: '0.5rem',
|
|
164
|
+
width: 'calc(100% - 1rem)',
|
|
165
|
+
height: 'calc(100% - 1rem)',
|
|
166
|
+
},
|
|
167
|
+
}, m('div.phi-knob', {
|
|
168
|
+
onmousedown: onStartPhi,
|
|
169
|
+
ontouchstart: onStartPhi,
|
|
170
|
+
style: {
|
|
171
|
+
position: 'absolute',
|
|
172
|
+
width: '15px',
|
|
173
|
+
height: '15px',
|
|
174
|
+
top: `calc(${toScreen(v2Phi[0])}% - 7px)`,
|
|
175
|
+
left: `calc(${toScreen(v2Phi[1])}% - 7px)`,
|
|
176
|
+
},
|
|
177
|
+
})), m('div.theta-pane', {
|
|
178
|
+
class: cssClass({
|
|
179
|
+
'is-dragging': draggedKnob === 'theta',
|
|
180
|
+
}),
|
|
181
|
+
style: {
|
|
182
|
+
position: 'absolute',
|
|
183
|
+
top: '1.5rem',
|
|
184
|
+
left: '1.5rem',
|
|
185
|
+
width: 'calc(100% - 3rem)',
|
|
186
|
+
height: 'calc(100% - 3rem)',
|
|
187
|
+
},
|
|
188
|
+
}, m('div.theta-knob', {
|
|
189
|
+
onmousedown: onStartTheta,
|
|
190
|
+
ontouchstart: onStartTheta,
|
|
191
|
+
style: {
|
|
192
|
+
position: 'absolute',
|
|
193
|
+
width: '15px',
|
|
194
|
+
height: '15px',
|
|
195
|
+
top: `calc(${toScreen(v2Theta[0])}% - 7px)`,
|
|
196
|
+
left: `calc(${toScreen(v2Theta[1])}% - 7px)`,
|
|
197
|
+
},
|
|
198
|
+
})))), m('div.right-container', m('label', m.trust('φ')), renderModel({
|
|
199
|
+
type: 'number',
|
|
200
|
+
min: 0,
|
|
201
|
+
max: 360,
|
|
202
|
+
step: 0.1,
|
|
203
|
+
value: toDeg(phi),
|
|
204
|
+
onInput: onPhiInput,
|
|
205
|
+
onChange: onPhiChange,
|
|
206
|
+
}), m('label', m.trust('θ')), renderModel({
|
|
207
|
+
type: 'number',
|
|
208
|
+
min: 0,
|
|
209
|
+
max: 180,
|
|
210
|
+
step: 0.1,
|
|
211
|
+
value: toDeg(theta),
|
|
212
|
+
onInput: onThetaInput,
|
|
213
|
+
onChange: onThetaChange,
|
|
214
|
+
}), renderModel({
|
|
215
|
+
type: 'checkbox',
|
|
216
|
+
value: backface,
|
|
217
|
+
text: 'Backface',
|
|
218
|
+
onChange: onBackfaceChange,
|
|
219
|
+
})));
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
component(TYPE, SphericalComponent);
|
|
224
|
+
export function sphericalCodec({ axes, length, result, } = {}) {
|
|
225
|
+
axes = axes || { x: 'right', y: 'up', z: 'back' };
|
|
226
|
+
const keys = Object.keys(axes);
|
|
227
|
+
const radius = () => {
|
|
228
|
+
return (typeof length === 'function' ? length() : length) || 1;
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
decode: (value) => {
|
|
232
|
+
let x = 0;
|
|
233
|
+
let y = 0;
|
|
234
|
+
let z = 0;
|
|
235
|
+
for (const key of keys) {
|
|
236
|
+
switch (axes[key]) {
|
|
237
|
+
case 'right':
|
|
238
|
+
y = value[key];
|
|
239
|
+
break;
|
|
240
|
+
case 'left':
|
|
241
|
+
y = -value[key];
|
|
242
|
+
break;
|
|
243
|
+
case 'back':
|
|
244
|
+
x = value[key];
|
|
245
|
+
break;
|
|
246
|
+
case 'front':
|
|
247
|
+
x = -value[key];
|
|
248
|
+
break;
|
|
249
|
+
case 'up':
|
|
250
|
+
z = value[key];
|
|
251
|
+
break;
|
|
252
|
+
case 'down':
|
|
253
|
+
z = -value[key];
|
|
254
|
+
break;
|
|
255
|
+
default:
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
const r = radius();
|
|
260
|
+
x /= r;
|
|
261
|
+
y /= r;
|
|
262
|
+
z /= r;
|
|
263
|
+
return {
|
|
264
|
+
phi: Math.atan2(y, x) || 0,
|
|
265
|
+
theta: Math.atan(Math.sqrt(x * x + y * y) / z) || 0,
|
|
266
|
+
};
|
|
267
|
+
},
|
|
268
|
+
encode: ({ phi, theta }) => {
|
|
269
|
+
const r = radius();
|
|
270
|
+
const x = r * Math.sin(theta) * Math.cos(phi);
|
|
271
|
+
const y = r * Math.sin(theta) * Math.sin(phi);
|
|
272
|
+
const z = r * Math.cos(theta);
|
|
273
|
+
const value = (result === null || result === void 0 ? void 0 : result()) || {};
|
|
274
|
+
for (const key of keys) {
|
|
275
|
+
switch (axes[key]) {
|
|
276
|
+
case 'right':
|
|
277
|
+
value[key] = y;
|
|
278
|
+
break;
|
|
279
|
+
case 'left':
|
|
280
|
+
value[key] = -y;
|
|
281
|
+
break;
|
|
282
|
+
case 'back':
|
|
283
|
+
value[key] = x;
|
|
284
|
+
break;
|
|
285
|
+
case 'front':
|
|
286
|
+
value[key] = -x;
|
|
287
|
+
break;
|
|
288
|
+
case 'up':
|
|
289
|
+
value[key] = z;
|
|
290
|
+
break;
|
|
291
|
+
case 'down':
|
|
292
|
+
value[key] = -z;
|
|
293
|
+
break;
|
|
294
|
+
default:
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return value;
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=spherical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spherical.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/spherical.ts"],"names":[],"mappings":"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","sourcesContent":["import m, { FactoryComponent } from 'mithril'\r\n\r\nimport {\r\n component,\r\n getValue,\r\n renderModel,\r\n ComponentModel,\r\n ValueSource,\r\n ComponentAttrs,\r\n setValue,\r\n ValueCodec,\r\n} from '../../core'\r\nimport { call, clamp, cssClass, dragUtil, getTouchInTarget, getTouchPoint, twuiClass } from '../../core/utils'\r\nimport { NumberModel } from './number'\r\nimport { CheckboxModel } from './checkbox'\r\n\r\n/**\r\n * @public\r\n */\r\nexport type SphericalValue = number[] | { [key: string]: number } | { [key: number]: number }\r\n\r\n/**\r\n * Spherical component attributes\r\n * @public\r\n */\r\nexport type SphericalAttrs = ComponentAttrs<SphericalModel>\r\n\r\n/**\r\n * Spherical component model\r\n * @public\r\n */\r\nexport interface SphericalModel<T = unknown>\r\n extends ComponentModel,\r\n ValueSource<T, SphericalValue> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'spherical'\r\n /**\r\n * The object field names. Defaults to `['phi', 'theta']`\r\n */\r\n keys?: Array<string | number>\r\n /**\r\n * Whether to use degrees instead of radians\r\n */\r\n degree?: boolean\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (model: SphericalModel<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: SphericalModel<T>, value: unknown) => void\r\n}\r\n\r\nconst TYPE = 'spherical'\r\nconst KEYS = ['phi', 'theta']\r\nconst SphericalComponent: FactoryComponent<SphericalAttrs> = (vnode) => {\r\n let phi = 0 // azimuth [0, 2PI]\r\n let theta = 0 // inclination [0, PI]\r\n let backface = false\r\n\r\n let v2Phi = [0, 0]\r\n let v2Theta = [0, 0]\r\n\r\n let draggedKnob: 'phi' | 'theta'\r\n\r\n function toDeg(value: number) {\r\n return value * (180 / Math.PI)\r\n }\r\n function toRad(value: number) {\r\n return value * (Math.PI / 180)\r\n }\r\n function toScreen(value: number) {\r\n return clamp((value / 2 + 0.5) * 100, 0, 100)\r\n }\r\n\r\n function read(node: m.Vnode<SphericalAttrs>) {\r\n const data = node.attrs.data\r\n const value: any = getValue(data) || {\r\n phi: data.degree ? toDeg(phi) : phi,\r\n theta: data.degree ? toDeg(theta) : theta,\r\n }\r\n const [kPhi, kTheta] = data.keys || KEYS\r\n return { data, value, kPhi, kTheta }\r\n }\r\n\r\n function fetchValue(node: m.Vnode<SphericalAttrs>) {\r\n const { data, value, kPhi, kTheta } = read(node)\r\n phi = value[kPhi] || 0\r\n theta = value[kTheta] || 0\r\n if (data.degree) {\r\n phi = toRad(phi)\r\n theta = toRad(theta)\r\n }\r\n while (theta < 0) {\r\n theta += Math.PI\r\n }\r\n while (theta > Math.PI) {\r\n theta -= Math.PI\r\n }\r\n backface = theta > Math.PI / 2\r\n updatePositions()\r\n }\r\n\r\n function onChange(type: 'change' | 'input') {\r\n updatePositions()\r\n const { data, value, kPhi, kTheta } = read(vnode)\r\n value[kPhi] = data.degree ? toDeg(phi) : phi\r\n value[kTheta] = data.degree ? toDeg(theta) : theta\r\n const written = setValue(data, value)\r\n call(type === 'input' ? data.onInput : data.onChange, data, written)\r\n }\r\n\r\n function updatePositions() {\r\n v2Phi[0] = Math.cos(phi)\r\n v2Phi[1] = Math.sin(phi)\r\n v2Theta[0] = Math.sin(theta) * Math.cos(phi)\r\n v2Theta[1] = Math.sin(theta) * Math.sin(phi)\r\n }\r\n\r\n function onStartPhi(e: MouseEvent) {\r\n draggedKnob = 'phi'\r\n drag.activate(e)\r\n }\r\n function onStartTheta(e: MouseEvent) {\r\n draggedKnob = 'theta'\r\n drag.activate(e)\r\n }\r\n\r\n let touchOffset: [number, number]\r\n const drag = dragUtil({\r\n onStart: (e) => {\r\n const touch = getTouchInTarget(e)\r\n touchOffset = [\r\n -(touch.x - touch.width / 2),\r\n -(touch.y - touch.height / 2),\r\n ]\r\n drag.onMove(e)\r\n },\r\n onMove: (e) => {\r\n e.preventDefault()\r\n\r\n const position = getTouchInTarget(e, drag.target.parentElement, touchOffset)\r\n const px = position.normalizedX - 0.5\r\n const py = position.normalizedY - 0.5\r\n if (draggedKnob === 'phi') {\r\n // [-PI;PI]\r\n phi = Math.atan2(px, py)\r\n // convert to range [0;2PI]\r\n phi += phi < 0 ? 2 * Math.PI : 0\r\n } else if (draggedKnob === 'theta') {\r\n // closest point on segment\r\n // p0: [0, 0], p1: vPhi\r\n const ab = v2Phi\r\n const ac = [py, px]\r\n const t = (ab[0] * ac[0] + ab[1] * ac[1]) / Math.sqrt(ab[0] * ab[0] + ab[1] * ab[1])\r\n\r\n theta = Math.PI * clamp(t, 0, 0.5)\r\n if (backface) {\r\n theta = Math.PI - theta\r\n }\r\n }\r\n onChange('input')\r\n m.redraw()\r\n },\r\n onEnd: (e) => {\r\n drag.deactivate()\r\n draggedKnob = null\r\n onChange('change')\r\n m.redraw()\r\n },\r\n })\r\n\r\n function onPhiInput(model: unknown, value: number) {\r\n phi = toRad(value)\r\n onChange('input')\r\n }\r\n function onPhiChange(model: unknown, value: number) {\r\n phi = toRad(value)\r\n onChange('change')\r\n }\r\n\r\n function onThetaInput(model: unknown, value: number) {\r\n theta = toRad(value)\r\n onChange('input')\r\n }\r\n function onThetaChange(model: unknown, value: number) {\r\n theta = toRad(value)\r\n onChange('change')\r\n }\r\n function onBackfaceChange(model: unknown, value: boolean) {\r\n backface = value\r\n theta = Math.PI - theta\r\n onChange('change')\r\n setTimeout(() => m.redraw())\r\n }\r\n\r\n return {\r\n onremove: () => {\r\n drag.deactivate()\r\n },\r\n oninit: (node) => {\r\n fetchValue(node)\r\n },\r\n onupdate: (node) => {\r\n fetchValue(node)\r\n },\r\n view: () => {\r\n return m(\r\n 'div',\r\n {\r\n class: twuiClass(TYPE),\r\n style: {\r\n '--spherical-phi': `${toDeg(-phi) + 90}deg`,\r\n },\r\n },\r\n m(\r\n 'div.left-container',\r\n m(\r\n 'div.pane',\r\n {\r\n style: {\r\n position: 'relative',\r\n width: '100%',\r\n 'padding-top': '100%',\r\n },\r\n },\r\n m(\r\n 'div.phi-pane',\r\n {\r\n class: cssClass({\r\n 'is-dragging': draggedKnob === 'phi',\r\n }),\r\n style: {\r\n position: 'absolute',\r\n top: '0.5rem',\r\n left: '0.5rem',\r\n width: 'calc(100% - 1rem)',\r\n height: 'calc(100% - 1rem)',\r\n },\r\n },\r\n m('div.phi-knob', {\r\n onmousedown: onStartPhi,\r\n ontouchstart: onStartPhi,\r\n style: {\r\n position: 'absolute',\r\n width: '15px',\r\n height: '15px',\r\n top: `calc(${toScreen(v2Phi[0])}% - 7px)`,\r\n left: `calc(${toScreen(v2Phi[1])}% - 7px)`,\r\n },\r\n }),\r\n ),\r\n m(\r\n 'div.theta-pane',\r\n {\r\n class: cssClass({\r\n 'is-dragging': draggedKnob === 'theta',\r\n }),\r\n style: {\r\n position: 'absolute',\r\n top: '1.5rem',\r\n left: '1.5rem',\r\n width: 'calc(100% - 3rem)',\r\n height: 'calc(100% - 3rem)',\r\n },\r\n },\r\n m('div.theta-knob', {\r\n onmousedown: onStartTheta,\r\n ontouchstart: onStartTheta,\r\n style: {\r\n position: 'absolute',\r\n width: '15px',\r\n height: '15px',\r\n top: `calc(${toScreen(v2Theta[0])}% - 7px)`,\r\n left: `calc(${toScreen(v2Theta[1])}% - 7px)`,\r\n },\r\n }),\r\n ),\r\n ),\r\n ),\r\n m(\r\n 'div.right-container',\r\n m('label', m.trust('φ')),\r\n renderModel<NumberModel>({\r\n type: 'number',\r\n min: 0,\r\n max: 360,\r\n step: 0.1,\r\n value: toDeg(phi),\r\n onInput: onPhiInput,\r\n onChange: onPhiChange,\r\n }),\r\n m('label', m.trust('θ')),\r\n renderModel<NumberModel>({\r\n type: 'number',\r\n min: 0,\r\n max: 180,\r\n step: 0.1,\r\n value: toDeg(theta),\r\n onInput: onThetaInput,\r\n onChange: onThetaChange,\r\n }),\r\n renderModel<CheckboxModel>({\r\n type: 'checkbox',\r\n value: backface,\r\n text: 'Backface',\r\n onChange: onBackfaceChange,\r\n }),\r\n ),\r\n )\r\n },\r\n }\r\n}\r\n\r\ncomponent<SphericalAttrs>(TYPE, SphericalComponent)\r\n\r\n/**\r\n * Direction name\r\n * @public\r\n */\r\nexport type Direction = 'right' | 'left' | 'up' | 'down' | 'front' | 'back'\r\nexport interface SphericalCodecOptions<T> {\r\n /**\r\n * Maps object keys to cartesian axes. Defaults to `{ x: 'right', y: 'up', z: 'back' }`\r\n */\r\n axes?: Record<string | number, Direction>\r\n /**\r\n * The vector length (sphere radius). Defaults to `1`\r\n */\r\n length?: number | (() => number)\r\n /**\r\n * Gets the objec where the result should be stored. May return a new instance.\r\n */\r\n result?: () => T\r\n}\r\n\r\nexport function sphericalCodec(): ValueCodec<\r\n { x: number; y: number; z: number },\r\n { phi: number; theta: number }\r\n>\r\nexport function sphericalCodec<T>(options: SphericalCodecOptions<T>): ValueCodec<T, { phi: number; theta: number }>\r\nexport function sphericalCodec({\r\n axes,\r\n length,\r\n result,\r\n}: SphericalCodecOptions<any> = {}): ValueCodec<any, { phi: number; theta: number }> {\r\n axes = axes || { x: 'right', y: 'up', z: 'back' }\r\n const keys = Object.keys(axes)\r\n const radius = () => {\r\n return (typeof length === 'function' ? length() : length) || 1\r\n }\r\n return {\r\n decode: (value: any) => {\r\n let x: number = 0\r\n let y: number = 0\r\n let z: number = 0\r\n for (const key of keys) {\r\n switch (axes[key]) {\r\n case 'right':\r\n y = value[key]\r\n break\r\n case 'left':\r\n y = -value[key]\r\n break\r\n case 'back':\r\n x = value[key]\r\n break\r\n case 'front':\r\n x = -value[key]\r\n break\r\n case 'up':\r\n z = value[key]\r\n break\r\n case 'down':\r\n z = -value[key]\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const r = radius()\r\n x /= r\r\n y /= r\r\n z /= r\r\n return {\r\n phi: Math.atan2(y, x) || 0,\r\n theta: Math.atan(Math.sqrt(x * x + y * y) / z) || 0,\r\n }\r\n },\r\n encode: ({ phi, theta }: { phi: number; theta: number }) => {\r\n const r = radius()\r\n const x = r * Math.sin(theta) * Math.cos(phi)\r\n const y = r * Math.sin(theta) * Math.sin(phi)\r\n const z = r * Math.cos(theta)\r\n const value = result?.() || {}\r\n for (const key of keys) {\r\n switch (axes[key]) {\r\n case 'right':\r\n value[key] = y\r\n break\r\n case 'left':\r\n value[key] = -y\r\n break\r\n case 'back':\r\n value[key] = x\r\n break\r\n case 'front':\r\n value[key] = -x\r\n break\r\n case 'up':\r\n value[key] = z\r\n break\r\n case 'down':\r\n value[key] = -z\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n return value\r\n },\r\n }\r\n}\r\n"]}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import { ComponentModel, ValueSource, ComponentAttrs } from '../../core';
|
|
2
|
-
/**
|
|
3
|
-
* Text component attributes
|
|
4
|
-
* @public
|
|
5
|
-
*/
|
|
6
|
-
export
|
|
7
|
-
/**
|
|
8
|
-
* Text component model
|
|
9
|
-
* @public
|
|
10
|
-
*/
|
|
11
|
-
export interface TextModel<T = unknown> extends ComponentModel, ValueSource<T, string> {
|
|
12
|
-
/**
|
|
13
|
-
* The type name of the control
|
|
14
|
-
*/
|
|
15
|
-
type: 'text';
|
|
16
|
-
/**
|
|
17
|
-
* The placeholder text
|
|
18
|
-
*/
|
|
19
|
-
placeholder?: string;
|
|
20
|
-
/**
|
|
21
|
-
* This is called when the control value has been changed.
|
|
22
|
-
*/
|
|
23
|
-
onInput?: (model: TextModel<T>, value: unknown) => void;
|
|
24
|
-
/**
|
|
25
|
-
* This is called once the control value is committed by the user.
|
|
26
|
-
*
|
|
27
|
-
* @remarks
|
|
28
|
-
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
29
|
-
*/
|
|
30
|
-
onChange?: (model: TextModel<T>, value: unknown) => void;
|
|
31
|
-
/**
|
|
32
|
-
* Disables the control input
|
|
33
|
-
*/
|
|
34
|
-
disabled?: boolean;
|
|
35
|
-
}
|
|
1
|
+
import { ComponentModel, ValueSource, ComponentAttrs } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* Text component attributes
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type TextAttrs = ComponentAttrs<TextModel>;
|
|
7
|
+
/**
|
|
8
|
+
* Text component model
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface TextModel<T = unknown> extends ComponentModel, ValueSource<T, string> {
|
|
12
|
+
/**
|
|
13
|
+
* The type name of the control
|
|
14
|
+
*/
|
|
15
|
+
type: 'text';
|
|
16
|
+
/**
|
|
17
|
+
* The placeholder text
|
|
18
|
+
*/
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/**
|
|
21
|
+
* This is called when the control value has been changed.
|
|
22
|
+
*/
|
|
23
|
+
onInput?: (model: TextModel<T>, value: unknown) => void;
|
|
24
|
+
/**
|
|
25
|
+
* This is called once the control value is committed by the user.
|
|
26
|
+
*
|
|
27
|
+
* @remarks
|
|
28
|
+
* Unlike the `onInput` callback, this is not necessarily called for each value change.
|
|
29
|
+
*/
|
|
30
|
+
onChange?: (model: TextModel<T>, value: unknown) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Disables the control input
|
|
33
|
+
*/
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
}
|
|
36
36
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/text.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/controls/text.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO,CACpC,SAAQ,cAAc,EACpB,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACvD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACxD;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { getValue, component, setValue, } from '../../core';
|
|
3
|
+
import { call, twuiClass, viewFn } from '../../core/utils';
|
|
4
|
+
component('text', (node) => {
|
|
5
|
+
function onChange(e) {
|
|
6
|
+
const el = e.target;
|
|
7
|
+
const data = node.attrs.data;
|
|
8
|
+
const written = setValue(data, el.value);
|
|
9
|
+
call(e.type === 'input' ? data.onInput : data.onChange, data, written);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
view: viewFn((data) => {
|
|
13
|
+
return m("input[type='text']", {
|
|
14
|
+
class: twuiClass(data.type),
|
|
15
|
+
value: getValue(data),
|
|
16
|
+
oninput: onChange,
|
|
17
|
+
onchange: onChange,
|
|
18
|
+
placeholder: data.placeholder,
|
|
19
|
+
disabled: data.disabled,
|
|
20
|
+
});
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/lib/components/controls/text.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,SAAS,CAAA;AAEvB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,GAIT,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAwC1D,SAAS,CAAY,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IACpC,SAAS,QAAQ,CAAC,CAAQ;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,MAA0B,CAAA;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACxE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,OAAO,CAAC,CAAC,oBAAoB,EAAE;gBAC7B,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3B,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACrB,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAA;QACJ,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 ComponentModel,\r\n ValueSource,\r\n ComponentAttrs,\r\n} from '../../core'\r\nimport { call, twuiClass, viewFn } from '../../core/utils'\r\n\r\n/**\r\n * Text component attributes\r\n * @public\r\n */\r\nexport type TextAttrs = ComponentAttrs<TextModel>\r\n\r\n/**\r\n * Text component model\r\n * @public\r\n */\r\nexport interface TextModel<T = unknown>\r\n extends ComponentModel,\r\n ValueSource<T, string> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'text'\r\n /**\r\n * The placeholder text\r\n */\r\n placeholder?: string\r\n /**\r\n * This is called when the control value has been changed.\r\n */\r\n onInput?: (model: TextModel<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: TextModel<T>, value: unknown) => void\r\n /**\r\n * Disables the control input\r\n */\r\n disabled?: boolean\r\n}\r\n\r\ncomponent<TextAttrs>('text', (node) => {\r\n function onChange(e: Event) {\r\n const el = e.target as HTMLInputElement\r\n const data = node.attrs.data\r\n const written = setValue(data, el.value)\r\n call(e.type === 'input' ? data.onInput : data.onChange, data, written)\r\n }\r\n\r\n return {\r\n view: viewFn((data) => {\r\n return m(\"input[type='text']\", {\r\n class: twuiClass(data.type),\r\n value: getValue(data),\r\n oninput: onChange,\r\n onchange: onChange,\r\n placeholder: data.placeholder,\r\n disabled: data.disabled,\r\n })\r\n }),\r\n }\r\n})\r\n"]}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { ComponentAttrs, ComponentGroupModel } from '../../core';
|
|
2
|
-
import { GroupModel } from './group';
|
|
3
|
-
/**
|
|
4
|
-
* Accordeon component attribuets
|
|
5
|
-
* @public
|
|
6
|
-
*/
|
|
7
|
-
export
|
|
8
|
-
/**
|
|
9
|
-
* Accordeon component model
|
|
10
|
-
* @public
|
|
11
|
-
*/
|
|
12
|
-
export interface AccordeonModel extends ComponentGroupModel<GroupModel> {
|
|
13
|
-
/**
|
|
14
|
-
* The type name of the control
|
|
15
|
-
*/
|
|
16
|
-
type: 'accordion';
|
|
17
|
-
/**
|
|
18
|
-
* The index of the group that should be open initially
|
|
19
|
-
*/
|
|
20
|
-
expand?: number;
|
|
21
|
-
}
|
|
1
|
+
import { ComponentAttrs, ComponentGroupModel } from '../../core';
|
|
2
|
+
import { GroupModel } from './group';
|
|
3
|
+
/**
|
|
4
|
+
* Accordeon component attribuets
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export type AccordeonAtts = ComponentAttrs<AccordeonModel>;
|
|
8
|
+
/**
|
|
9
|
+
* Accordeon component model
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export interface AccordeonModel extends ComponentGroupModel<GroupModel> {
|
|
13
|
+
/**
|
|
14
|
+
* The type name of the control
|
|
15
|
+
*/
|
|
16
|
+
type: 'accordion';
|
|
17
|
+
/**
|
|
18
|
+
* The index of the group that should be open initially
|
|
19
|
+
*/
|
|
20
|
+
expand?: number;
|
|
21
|
+
}
|
|
22
22
|
//# sourceMappingURL=accordion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/groups/accordion.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAExF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/groups/accordion.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAExF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;AAE1D;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB,CAAC,UAAU,CAAC;IACrE;;OAEG;IACH,IAAI,EAAE,WAAW,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { component, renderModel } from '../../core';
|
|
3
|
+
import { viewFn } from '../../core/utils';
|
|
4
|
+
const TYPE = 'accordion';
|
|
5
|
+
const EMPTY = [];
|
|
6
|
+
component(TYPE, () => {
|
|
7
|
+
return {
|
|
8
|
+
view: viewFn((data) => {
|
|
9
|
+
const children = data.children || EMPTY;
|
|
10
|
+
data.expand = detectExpanded(data.expand, children);
|
|
11
|
+
return m.fragment({}, children.map((group, i) => {
|
|
12
|
+
group.type = 'group';
|
|
13
|
+
group.collapsible = true;
|
|
14
|
+
group.collapsed = i !== data.expand;
|
|
15
|
+
return renderModel(group);
|
|
16
|
+
}));
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
function detectExpanded(index, list) {
|
|
21
|
+
let result = null;
|
|
22
|
+
for (let i = 0; i < list.length; i++) {
|
|
23
|
+
if (!list[i].collapsed) {
|
|
24
|
+
if (i !== index) {
|
|
25
|
+
return i;
|
|
26
|
+
}
|
|
27
|
+
if (result == null) {
|
|
28
|
+
result = i;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../../../src/lib/components/groups/accordion.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,SAAS,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAuC,MAAM,YAAY,CAAA;AACxF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAwBzC,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,MAAM,KAAK,GAAiB,EAAE,CAAA;AAE9B,SAAS,CAAgB,IAAI,EAAE,GAAG,EAAE;IAClC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAA;YACvC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YACnD,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC9C,KAAK,CAAC,IAAI,GAAG,OAAO,CAAA;gBACpB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAA;gBACxB,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAA;gBACnC,OAAO,WAAW,CAAa,KAAK,CAAC,CAAA;YACvC,CAAC,CAAC,CAAC,CAAA;QACL,CAAC,CAAC;KACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,SAAS,cAAc,CAAC,KAAa,EAAE,IAAkB;IACvD,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,CAAA;YACV,CAAC;YACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,GAAG,CAAC,CAAA;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import m from 'mithril'\r\n\r\nimport { component, renderModel, ComponentAttrs, ComponentGroupModel } from '../../core'\r\nimport { viewFn } from '../../core/utils'\r\nimport { GroupModel } from './group'\r\n\r\n/**\r\n * Accordeon component attribuets\r\n * @public\r\n */\r\nexport type AccordeonAtts = ComponentAttrs<AccordeonModel>\r\n\r\n/**\r\n * Accordeon component model\r\n * @public\r\n */\r\nexport interface AccordeonModel extends ComponentGroupModel<GroupModel> {\r\n /**\r\n * The type name of the control\r\n */\r\n type: 'accordion'\r\n /**\r\n * The index of the group that should be open initially\r\n */\r\n expand?: number\r\n}\r\n\r\nconst TYPE = 'accordion'\r\nconst EMPTY: GroupModel[] = []\r\n\r\ncomponent<AccordeonAtts>(TYPE, () => {\r\n return {\r\n view: viewFn((data) => {\r\n const children = data.children || EMPTY\r\n data.expand = detectExpanded(data.expand, children)\r\n return m.fragment({}, children.map((group, i) => {\r\n group.type = 'group'\r\n group.collapsible = true\r\n group.collapsed = i !== data.expand\r\n return renderModel<GroupModel>(group)\r\n }))\r\n }),\r\n }\r\n})\r\n\r\nfunction detectExpanded(index: number, list: GroupModel[]) {\r\n let result = null\r\n for (let i = 0; i < list.length; i++) {\r\n if (!list[i].collapsed) {\r\n if (i !== index) {\r\n return i\r\n }\r\n if (result == null) {\r\n result = i\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n"]}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { ComponentGroupModel, ComponentAttrs, ComponentModel } from '../../core';
|
|
2
|
-
/**
|
|
3
|
-
* Container component attributes
|
|
4
|
-
* @public
|
|
5
|
-
*/
|
|
6
|
-
export
|
|
7
|
-
/**
|
|
8
|
-
* Container component model
|
|
9
|
-
* @public
|
|
10
|
-
*/
|
|
11
|
-
export interface ContainerModel extends ComponentGroupModel<ComponentModel> {
|
|
12
|
-
/**
|
|
13
|
-
* Component type name
|
|
14
|
-
*/
|
|
15
|
-
type: 'container';
|
|
16
|
-
/**
|
|
17
|
-
* Enables horizontal layout
|
|
18
|
-
*/
|
|
19
|
-
horizontal?: boolean;
|
|
20
|
-
/**
|
|
21
|
-
* Custom CSS Style
|
|
22
|
-
*/
|
|
23
|
-
style?: Partial<CSSStyleDeclaration>;
|
|
24
|
-
}
|
|
1
|
+
import { ComponentGroupModel, ComponentAttrs, ComponentModel } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* Container component attributes
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type ContainerAttrs = ComponentAttrs<ContainerModel>;
|
|
7
|
+
/**
|
|
8
|
+
* Container component model
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface ContainerModel extends ComponentGroupModel<ComponentModel> {
|
|
12
|
+
/**
|
|
13
|
+
* Component type name
|
|
14
|
+
*/
|
|
15
|
+
type: 'container';
|
|
16
|
+
/**
|
|
17
|
+
* Enables horizontal layout
|
|
18
|
+
*/
|
|
19
|
+
horizontal?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Custom CSS Style
|
|
22
|
+
*/
|
|
23
|
+
style?: Partial<CSSStyleDeclaration>;
|
|
24
|
+
}
|
|
25
25
|
//# sourceMappingURL=container.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/groups/container.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/groups/container.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;AAE3D;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB,CAAC,cAAc,CAAC;IACzE;;OAEG;IACH,IAAI,EAAE,WAAW,CAAA;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACrC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import m from 'mithril';
|
|
2
|
+
import { component, renderModel, } from '../../core';
|
|
3
|
+
import { cssClass, twuiClass, viewFn } from '../../core/utils';
|
|
4
|
+
const TYPE = 'container';
|
|
5
|
+
component(TYPE, () => {
|
|
6
|
+
return {
|
|
7
|
+
view: viewFn((data) => {
|
|
8
|
+
var _a;
|
|
9
|
+
return m('div', {
|
|
10
|
+
class: cssClass({
|
|
11
|
+
[twuiClass(TYPE)]: true,
|
|
12
|
+
[twuiClass(TYPE, 'horizontal')]: data.horizontal,
|
|
13
|
+
}),
|
|
14
|
+
style: data.style,
|
|
15
|
+
}, m.fragment({}, (_a = data.children) === null || _a === void 0 ? void 0 : _a.map(renderModel)));
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../src/lib/components/groups/container.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,SAAS,CAAA;AAEvB,OAAO,EACL,SAAS,EACT,WAAW,GAIZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AA2B9D,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,SAAS,CAAiB,IAAI,EAAE,GAAG,EAAE;IACnC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;;YACpB,OAAA,CAAC,CACC,KAAK,EACL;gBACE,KAAK,EAAE,QAAQ,CAAC;oBACd,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI;oBACvB,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU;iBACjD,CAAC;gBACF,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,EACD,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAA,IAAI,CAAC,QAAQ,0CAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAChD,CAAA;SAAA,CACF;KACF,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["import m from 'mithril'\r\n\r\nimport {\r\n component,\r\n renderModel,\r\n ComponentGroupModel,\r\n ComponentAttrs,\r\n ComponentModel,\r\n} from '../../core'\r\nimport { cssClass, twuiClass, viewFn } from '../../core/utils'\r\n\r\n/**\r\n * Container component attributes\r\n * @public\r\n */\r\nexport type ContainerAttrs = ComponentAttrs<ContainerModel>\r\n\r\n/**\r\n * Container component model\r\n * @public\r\n */\r\nexport interface ContainerModel extends ComponentGroupModel<ComponentModel> {\r\n /**\r\n * Component type name\r\n */\r\n type: 'container'\r\n /**\r\n * Enables horizontal layout\r\n */\r\n horizontal?: boolean\r\n /**\r\n * Custom CSS Style\r\n */\r\n style?: Partial<CSSStyleDeclaration>\r\n}\r\n\r\nconst TYPE = 'container'\r\ncomponent<ContainerAttrs>(TYPE, () => {\r\n return {\r\n view: viewFn((data) =>\r\n m(\r\n 'div',\r\n {\r\n class: cssClass({\r\n [twuiClass(TYPE)]: true,\r\n [twuiClass(TYPE, 'horizontal')]: data.horizontal,\r\n }),\r\n style: data.style,\r\n },\r\n m.fragment({}, data.children?.map(renderModel)),\r\n ),\r\n ),\r\n }\r\n})\r\n"]}
|