tweak-ui 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/LICENSE +7 -7
  2. package/README.md +32 -32
  3. package/dist/lib/builder.d.ts +166 -162
  4. package/dist/lib/builder.d.ts.map +1 -1
  5. package/dist/lib/builder.js +250 -0
  6. package/dist/lib/builder.js.map +1 -0
  7. package/dist/lib/color-formats/array-format.d.ts +8 -8
  8. package/dist/lib/color-formats/array-format.js +18 -0
  9. package/dist/lib/color-formats/array-format.js.map +1 -0
  10. package/dist/lib/color-formats/converter.d.ts +18 -18
  11. package/dist/lib/color-formats/converter.js +85 -0
  12. package/dist/lib/color-formats/converter.js.map +1 -0
  13. package/dist/lib/color-formats/css-string-format.d.ts +7 -7
  14. package/dist/lib/color-formats/css-string-format.js +28 -0
  15. package/dist/lib/color-formats/css-string-format.js.map +1 -0
  16. package/dist/lib/color-formats/formatter.d.ts +8 -8
  17. package/dist/lib/color-formats/formatter.js +35 -0
  18. package/dist/lib/color-formats/formatter.js.map +1 -0
  19. package/dist/lib/color-formats/hex-string-format.d.ts +7 -7
  20. package/dist/lib/color-formats/hex-string-format.js +28 -0
  21. package/dist/lib/color-formats/hex-string-format.js.map +1 -0
  22. package/dist/lib/color-formats/index.d.ts +3 -3
  23. package/dist/lib/color-formats/index.js +4 -0
  24. package/dist/lib/color-formats/index.js.map +1 -0
  25. package/dist/lib/color-formats/number-format.d.ts +8 -8
  26. package/dist/lib/color-formats/number-format.js +23 -0
  27. package/dist/lib/color-formats/number-format.js.map +1 -0
  28. package/dist/lib/color-formats/object-format.d.ts +14 -14
  29. package/dist/lib/color-formats/object-format.js +23 -0
  30. package/dist/lib/color-formats/object-format.js.map +1 -0
  31. package/dist/lib/color-formats/types.d.ts +101 -101
  32. package/dist/lib/color-formats/types.js +2 -0
  33. package/dist/lib/color-formats/types.js.map +1 -0
  34. package/dist/lib/components/button.d.ts +28 -28
  35. package/dist/lib/components/button.d.ts.map +1 -1
  36. package/dist/lib/components/button.js +15 -0
  37. package/dist/lib/components/button.js.map +1 -0
  38. package/dist/lib/components/content.d.ts +21 -21
  39. package/dist/lib/components/content.d.ts.map +1 -1
  40. package/dist/lib/components/content.js +10 -0
  41. package/dist/lib/components/content.js.map +1 -0
  42. package/dist/lib/components/controls/angle.d.ts +51 -51
  43. package/dist/lib/components/controls/angle.d.ts.map +1 -1
  44. package/dist/lib/components/controls/angle.js +201 -0
  45. package/dist/lib/components/controls/angle.js.map +1 -0
  46. package/dist/lib/components/controls/checkbox.d.ts +28 -28
  47. package/dist/lib/components/controls/checkbox.d.ts.map +1 -1
  48. package/dist/lib/components/controls/checkbox.js +31 -0
  49. package/dist/lib/components/controls/checkbox.js.map +1 -0
  50. package/dist/lib/components/controls/color-picker.d.ts +56 -56
  51. package/dist/lib/components/controls/color-picker.d.ts.map +1 -1
  52. package/dist/lib/components/controls/color-picker.js +267 -0
  53. package/dist/lib/components/controls/color-picker.js.map +1 -0
  54. package/dist/lib/components/controls/color.d.ts +51 -51
  55. package/dist/lib/components/controls/color.d.ts.map +1 -1
  56. package/dist/lib/components/controls/color.js +77 -0
  57. package/dist/lib/components/controls/color.js.map +1 -0
  58. package/dist/lib/components/controls/index.d.ts +10 -10
  59. package/dist/lib/components/controls/index.js +11 -0
  60. package/dist/lib/components/controls/index.js.map +1 -0
  61. package/dist/lib/components/controls/number.d.ts +47 -47
  62. package/dist/lib/components/controls/number.d.ts.map +1 -1
  63. package/dist/lib/components/controls/number.js +142 -0
  64. package/dist/lib/components/controls/number.js.map +1 -0
  65. package/dist/lib/components/controls/point.d.ts +47 -47
  66. package/dist/lib/components/controls/point.d.ts.map +1 -1
  67. package/dist/lib/components/controls/point.js +137 -0
  68. package/dist/lib/components/controls/point.js.map +1 -0
  69. package/dist/lib/components/controls/position.d.ts +55 -55
  70. package/dist/lib/components/controls/position.d.ts.map +1 -1
  71. package/dist/lib/components/controls/position.js +36 -0
  72. package/dist/lib/components/controls/position.js.map +1 -0
  73. package/dist/lib/components/controls/select.d.ts +59 -59
  74. package/dist/lib/components/controls/select.d.ts.map +1 -1
  75. package/dist/lib/components/controls/select.js +132 -0
  76. package/dist/lib/components/controls/select.js.map +1 -0
  77. package/dist/lib/components/controls/spherical.d.ts +74 -74
  78. package/dist/lib/components/controls/spherical.d.ts.map +1 -1
  79. package/dist/lib/components/controls/spherical.js +302 -0
  80. package/dist/lib/components/controls/spherical.js.map +1 -0
  81. package/dist/lib/components/controls/text.d.ts +35 -35
  82. package/dist/lib/components/controls/text.d.ts.map +1 -1
  83. package/dist/lib/components/controls/text.js +24 -0
  84. package/dist/lib/components/controls/text.js.map +1 -0
  85. package/dist/lib/components/groups/accordion.d.ts +21 -21
  86. package/dist/lib/components/groups/accordion.d.ts.map +1 -1
  87. package/dist/lib/components/groups/accordion.js +34 -0
  88. package/dist/lib/components/groups/accordion.js.map +1 -0
  89. package/dist/lib/components/groups/container.d.ts +24 -24
  90. package/dist/lib/components/groups/container.d.ts.map +1 -1
  91. package/dist/lib/components/groups/container.js +19 -0
  92. package/dist/lib/components/groups/container.js.map +1 -0
  93. package/dist/lib/components/groups/group.d.ts +48 -48
  94. package/dist/lib/components/groups/group.d.ts.map +1 -1
  95. package/dist/lib/components/groups/group.js +50 -0
  96. package/dist/lib/components/groups/group.js.map +1 -0
  97. package/dist/lib/components/groups/index.d.ts +4 -4
  98. package/dist/lib/components/groups/index.js +5 -0
  99. package/dist/lib/components/groups/index.js.map +1 -0
  100. package/dist/lib/components/groups/tabs.d.ts +21 -21
  101. package/dist/lib/components/groups/tabs.d.ts.map +1 -1
  102. package/dist/lib/components/groups/tabs.js +31 -0
  103. package/dist/lib/components/groups/tabs.js.map +1 -0
  104. package/dist/lib/components/image.d.ts +36 -36
  105. package/dist/lib/components/image.d.ts.map +1 -1
  106. package/dist/lib/components/image.js +46 -0
  107. package/dist/lib/components/image.js.map +1 -0
  108. package/dist/lib/components/index.d.ts +5 -5
  109. package/dist/lib/components/index.js +6 -0
  110. package/dist/lib/components/index.js.map +1 -0
  111. package/dist/lib/core/index.d.ts +4 -4
  112. package/dist/lib/core/index.js +5 -0
  113. package/dist/lib/core/index.js.map +1 -0
  114. package/dist/lib/core/registry.d.ts +17 -17
  115. package/dist/lib/core/registry.js +30 -0
  116. package/dist/lib/core/registry.js.map +1 -0
  117. package/dist/lib/core/render.d.ts +9 -9
  118. package/dist/lib/core/render.d.ts.map +1 -1
  119. package/dist/lib/core/render.js +19 -0
  120. package/dist/lib/core/render.js.map +1 -0
  121. package/dist/lib/core/types.d.ts +87 -87
  122. package/dist/lib/core/types.d.ts.map +1 -1
  123. package/dist/lib/core/types.js +2 -0
  124. package/dist/lib/core/types.js.map +1 -0
  125. package/dist/lib/core/utils.d.ts +93 -93
  126. package/dist/lib/core/utils.d.ts.map +1 -1
  127. package/dist/lib/core/utils.js +193 -0
  128. package/dist/lib/core/utils.js.map +1 -0
  129. package/dist/lib/core/value-accessor.d.ts +17 -17
  130. package/dist/lib/core/value-accessor.js +52 -0
  131. package/dist/lib/core/value-accessor.js.map +1 -0
  132. package/dist/lib/index.d.ts +21 -27
  133. package/dist/lib/index.d.ts.map +1 -1
  134. package/dist/lib/index.js +29 -0
  135. package/dist/lib/index.js.map +1 -0
  136. package/dist/lib/mount.d.ts +45 -45
  137. package/dist/lib/mount.js +85 -0
  138. package/dist/lib/mount.js.map +1 -0
  139. package/dist/tweak-ui.css +133 -138
  140. package/dist/tweak-ui.css.map +1 -1
  141. package/dist/tweak-ui.min.css +1 -1
  142. package/dist/tweak-ui.min.css.map +1 -1
  143. package/dist/tweak-ui.module.js +2733 -2380
  144. package/dist/tweak-ui.module.js.map +1 -1
  145. package/dist/tweak-ui.umd.js +1 -4403
  146. package/dist/tweak-ui.umd.js.map +1 -1
  147. package/package.json +25 -42
  148. package/dist/index.html +0 -1061
  149. package/dist/lib/color-formats/array-format.spec.d.ts +0 -2
  150. package/dist/lib/color-formats/array-format.spec.d.ts.map +0 -1
  151. package/dist/lib/color-formats/converter.spec.d.ts +0 -2
  152. package/dist/lib/color-formats/converter.spec.d.ts.map +0 -1
  153. package/dist/lib/color-formats/css-string-format.spec.d.ts +0 -2
  154. package/dist/lib/color-formats/css-string-format.spec.d.ts.map +0 -1
  155. package/dist/lib/color-formats/formatter.spec.d.ts +0 -2
  156. package/dist/lib/color-formats/formatter.spec.d.ts.map +0 -1
  157. package/dist/lib/color-formats/hex-string-format.spec.d.ts +0 -2
  158. package/dist/lib/color-formats/hex-string-format.spec.d.ts.map +0 -1
  159. package/dist/lib/color-formats/number-format.spec.d.ts +0 -2
  160. package/dist/lib/color-formats/number-format.spec.d.ts.map +0 -1
  161. package/dist/lib/color-formats/object-format.spec.d.ts +0 -2
  162. package/dist/lib/color-formats/object-format.spec.d.ts.map +0 -1
  163. package/dist/scss/_style.scss +0 -120
  164. package/dist/scss/_themes.scss +0 -23
  165. package/dist/scss/_utils.scss +0 -24
  166. package/dist/scss/_variables.scss +0 -30
  167. package/dist/scss/controls/_angle.scss +0 -64
  168. package/dist/scss/controls/_button.scss +0 -0
  169. package/dist/scss/controls/_checkbox.scss +0 -19
  170. package/dist/scss/controls/_color-picker.scss +0 -124
  171. package/dist/scss/controls/_color.scss +0 -14
  172. package/dist/scss/controls/_container.scss +0 -13
  173. package/dist/scss/controls/_group.scss +0 -69
  174. package/dist/scss/controls/_image.scss +0 -27
  175. package/dist/scss/controls/_number.scss +0 -38
  176. package/dist/scss/controls/_point.scss +0 -36
  177. package/dist/scss/controls/_position.scss +0 -9
  178. package/dist/scss/controls/_select.scss +0 -0
  179. package/dist/scss/controls/_spherical.scss +0 -87
  180. package/dist/scss/controls/_tabs.scss +0 -38
  181. package/dist/scss/controls/_text.scss +0 -0
  182. package/dist/scss/index.scss +0 -21
  183. package/dist/tweak-ui.umd.min.js +0 -17
  184. package/dist/tweak-ui.umd.min.js.map +0 -1
@@ -0,0 +1,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('&phi;')), 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('&theta;')), 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('&phi;')),\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('&theta;')),\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 declare 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
- }
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,oBAAY,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"}
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 declare 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
- }
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,oBAAY,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"}
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 declare 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
- }
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,oBAAY,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"}
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"]}