muigui 0.0.1 → 0.0.3

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 (72) hide show
  1. package/README.md +72 -7
  2. package/package.json +10 -6
  3. package/src/controllers/Button.js +34 -0
  4. package/src/controllers/Canvas.js +17 -0
  5. package/src/controllers/Checkbox.js +11 -0
  6. package/src/controllers/Color.js +31 -0
  7. package/src/controllers/ColorChooser.js +12 -0
  8. package/src/controllers/Container.js +58 -0
  9. package/src/controllers/Controller.js +138 -0
  10. package/src/controllers/Direction.js +23 -0
  11. package/src/controllers/Divider.js +9 -0
  12. package/src/controllers/Folder.js +37 -0
  13. package/src/controllers/Label.js +14 -0
  14. package/src/controllers/LabelController.js +32 -0
  15. package/src/controllers/PopDownController.js +84 -0
  16. package/src/controllers/RadioGrid.js +17 -0
  17. package/src/controllers/Range.js +11 -0
  18. package/src/controllers/Select.js +14 -0
  19. package/src/controllers/Slider.js +12 -0
  20. package/src/controllers/TabHolder.js +36 -0
  21. package/src/controllers/Text.js +10 -0
  22. package/src/controllers/TextNumber.js +18 -0
  23. package/src/controllers/ValueController.js +107 -0
  24. package/src/controllers/Vec2.js +50 -0
  25. package/src/controllers/create-controller.js +49 -0
  26. package/src/layout/Column.js +7 -0
  27. package/src/layout/Frame.js +11 -0
  28. package/src/layout/Grid.js +7 -0
  29. package/src/layout/Layout.js +47 -0
  30. package/src/layout/Row.js +7 -0
  31. package/src/libs/assert.js +5 -0
  32. package/src/libs/color-utils.js +406 -0
  33. package/src/libs/conversions.js +14 -0
  34. package/src/libs/css-utils.js +3 -0
  35. package/src/libs/elem.js +8 -3
  36. package/src/libs/emitter.js +68 -0
  37. package/src/libs/iterable-array.js +57 -0
  38. package/src/libs/key-values.js +25 -0
  39. package/src/libs/keyboard.js +32 -0
  40. package/src/libs/resize-helpers.js +22 -0
  41. package/src/libs/svg.js +33 -0
  42. package/src/libs/taskrunner.js +56 -0
  43. package/src/libs/touch.js +50 -0
  44. package/src/libs/utils.js +38 -2
  45. package/src/libs/wheel.js +10 -0
  46. package/src/muigui.js +79 -19
  47. package/src/styles/muigui.css.js +641 -0
  48. package/src/umd.js +3 -0
  49. package/src/views/CheckboxView.js +21 -0
  50. package/src/views/ColorChooserView.js +124 -0
  51. package/src/views/ColorView.js +50 -0
  52. package/src/views/DirectionView.js +127 -0
  53. package/src/views/EditView.js +100 -0
  54. package/src/views/ElementView.js +8 -0
  55. package/src/views/GridView.js +15 -0
  56. package/src/views/NumberView.js +67 -0
  57. package/src/views/RadioGridView.js +46 -0
  58. package/src/views/RangeView.js +73 -0
  59. package/src/views/SelectView.js +23 -0
  60. package/src/views/SliderView.js +194 -0
  61. package/src/views/TextView.js +49 -0
  62. package/src/views/ValueView.js +11 -0
  63. package/src/views/Vec2View.js +51 -0
  64. package/src/views/View.js +56 -0
  65. package/src/widgets/checkbox.js +0 -0
  66. package/src/widgets/divider.js +0 -0
  67. package/src/widgets/menu.js +0 -0
  68. package/src/widgets/radio.js +0 -0
  69. package/src/widgets/select.js +0 -1
  70. package/src/widgets/slider.js +0 -41
  71. package/src/widgets/text.js +0 -0
  72. package/src/widgets/widget.js +0 -51
@@ -0,0 +1,641 @@
1
+ const css = `
2
+ .muigui {
3
+ --width: 250px;
4
+ --label-width: 45%;
5
+ --number-width: 40%;
6
+
7
+ --bg-color: #222222;
8
+ --color: #dddddd;
9
+ --value-color: #43e5f7;
10
+ --value-bg-color: #444444;
11
+ --disabled-color: #666666;
12
+ --menu-bg-color: #000000;
13
+ --menu-sep-color: #444444;
14
+ --hover-bg-color: #666666;
15
+ --focus-color: #88AAFF;
16
+ --range-color: #888888;
17
+ --invalid-color: #FF6666;
18
+ --selected-color: rgba(255, 255, 255, 0.3);
19
+
20
+ --button-bg-color: var(--value-bg-color);
21
+
22
+ --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
23
+ --font-size: 11px;
24
+ --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace;
25
+ --font-size-mono: 11px;
26
+
27
+ --range-left-color: var(--value-color);
28
+ --range-right-color: var(--value-bg-color);
29
+ --range-right-hover-color: var(--hover-bg-color);
30
+ --line-height: 1.7em;
31
+ --border-radius: 0px;
32
+
33
+ width: var(--width);
34
+ color: var(--color);
35
+ background-color: var(--bg-color);
36
+ font-family: var(--font-family);
37
+ font-size: var(--font-size);
38
+ box-sizing: border-box;
39
+ }
40
+ .muigui * {
41
+ box-sizing: inherit;
42
+ }
43
+
44
+ .muigui-invalid-value {
45
+ background-color: red !important;
46
+ color: white !important;
47
+ }
48
+
49
+ .muigui-grid {
50
+ display: grid;
51
+ }
52
+ .muigui-rows {
53
+ display: flex;
54
+ flex-direction: column;
55
+
56
+ min-height: 20px;
57
+ border: 2px solid red;
58
+ }
59
+ .muigui-columns {
60
+ display: flex;
61
+ flex-direction: row;
62
+
63
+ height: 20px;
64
+ border: 2px solid green;
65
+ }
66
+ .muigui-rows>*,
67
+ .muigui-columns>* {
68
+ flex: 1 1 auto;
69
+ align-items: stretch;
70
+ min-height: 0;
71
+ min-width: 0;
72
+ }
73
+
74
+ .muigui-row {
75
+ border: 2px solid yellow;
76
+ min-height: 10px
77
+ }
78
+ .muigui-column {
79
+ border: 2px solid lightgreen;
80
+ }
81
+
82
+ /* -------- */
83
+
84
+ .muigui-show { /* */ }
85
+ .muigui-hide {
86
+ display: none !important;
87
+ }
88
+ .muigui-disabled {
89
+ pointer-events: none;
90
+ --color: var(--disabled-color) !important;
91
+ --value-color: var(--disabled-color) !important;
92
+ --range-left-color: var(--disabled-color) !important;
93
+ }
94
+
95
+ .muigui canvas,
96
+ .muigui svg {
97
+ display: block;
98
+ border-radius: var(--border-radius);
99
+ }
100
+ .muigui canvas {
101
+ background-color: var(--value-bg-color);
102
+ }
103
+
104
+ .muigui-controller {
105
+ min-width: 0;
106
+ min-height: var(--line-height);
107
+ }
108
+ .muigui-root,
109
+ .muigui-menu {
110
+ display: flex;
111
+ flex-direction: column;
112
+ position: relative;
113
+ user-select: none;
114
+ height: fit-content;
115
+ margin: 0;
116
+ padding-bottom: 0.1em;
117
+ border-radius: var(--border-radius);
118
+ }
119
+ .muigui-menu {
120
+ border-bottom: 1px solid var(--menu-sep-color);
121
+ }
122
+
123
+ .muigui-root>button:nth-child(1),
124
+ .muigui-menu>button:nth-child(1) {
125
+ border-top: 1px solid var(--menu-sep-color);
126
+ border-bottom: 1px solid var(--menu-sep-color);
127
+ position: relative;
128
+ text-align: left;
129
+ color: var(--color);
130
+ background-color: var(--menu-bg-color);
131
+ min-height: var(--line-height);
132
+ padding-top: 0.2em;
133
+ padding-bottom: 0.2em;
134
+ cursor: pointer;
135
+ border-radius: var(--border-radius);
136
+ }
137
+ .muigui-root>div:nth-child(2),
138
+ .muigui-menu>div:nth-child(2) {
139
+ flex: 1 1 auto;
140
+ }
141
+
142
+ .muigui-controller {
143
+ margin-left: 0.2em;
144
+ margin-right: 0.2em;
145
+ }
146
+ .muigui-root.muigui-controller,
147
+ .muigui-menu.muigui-controller {
148
+ margin-left: 0;
149
+ margin-right: 0;
150
+ }
151
+ .muigui-controller>*:nth-child(1) {
152
+ flex: 1 0 var(--label-width);
153
+ min-width: 0;
154
+ white-space: pre;
155
+ }
156
+ .muigui-controller>label:nth-child(1) {
157
+ place-content: center start;
158
+ display: inline-grid;
159
+ overflow: hidden;
160
+ }
161
+ .muigui-controller>*:nth-child(2) {
162
+ flex: 1 1 75%;
163
+ min-width: 0;
164
+ }
165
+
166
+ /* -----------------------------------------
167
+ a label controller is [[label][value]]
168
+ */
169
+
170
+ .muigui-label-controller {
171
+ display: flex;
172
+ margin: 0.4em 0 0.4em 0;
173
+ word-wrap: initial;
174
+ align-items: stretch;
175
+ }
176
+
177
+ .muigui-value {
178
+ display: flex;
179
+ align-items: stretch;
180
+ }
181
+ .muigui-value>* {
182
+ flex: 1 1 auto;
183
+ min-width: 0;
184
+ }
185
+ .muigui-value>*:nth-child(1) {
186
+ flex: 1 1 calc(100% - var(--number-width));
187
+ }
188
+ .muigui-value>*:nth-child(2) {
189
+ flex: 1 1 var(--number-width);
190
+ margin-left: 0.2em;
191
+ }
192
+
193
+ /* fix! */
194
+ .muigui-open>button>label::before,
195
+ .muigui-closed>button>label::before {
196
+ width: 1.25em;
197
+ height: var(--line-height);
198
+ display: inline-grid;
199
+ place-content: center start;
200
+ pointer-events: none;
201
+ }
202
+ .muigui-open>button>label::before {
203
+ content: "ⓧ"; /*"▼";*/
204
+ }
205
+ .muigui-closed>button>label::before {
206
+ content: "⨁"; /*"▶";*/
207
+ }
208
+ .muigui-open>*:nth-child(2) {
209
+ transition: max-height 0.2s ease-out,
210
+ opacity 0.5s ease-out;
211
+ max-height: 100vh;
212
+ overflow: auto;
213
+ opacity: 1;
214
+ }
215
+
216
+ .muigui-closed>*:nth-child(2) {
217
+ transition: max-height 0.2s ease-out,
218
+ opacity 1s;
219
+ max-height: 0;
220
+ opacity: 0;
221
+ overflow: hidden;
222
+ }
223
+
224
+ /* ---- popdown ---- */
225
+
226
+ .muigui-pop-down-top {
227
+ display: flex;
228
+ }
229
+ /* fix? */
230
+ .muigui-value>*:nth-child(1).muigui-pop-down-top {
231
+ flex: 0;
232
+ }
233
+ .muigui-pop-down-bottom {
234
+
235
+ }
236
+
237
+ .muigui-pop-down-values {
238
+ min-width: 0;
239
+ display: flex;
240
+ }
241
+ .muigui-pop-down-values>* {
242
+ flex: 1 1 auto;
243
+ min-width: 0;
244
+ }
245
+
246
+ .muigui-value.muigui-pop-down-controller {
247
+ flex-direction: column;
248
+ }
249
+
250
+ .muigui-pop-down-top input[type=checkbox] {
251
+ -webkit-appearance: none;
252
+ appearance: none;
253
+ width: auto;
254
+ color: var(--value-color);
255
+ background-color: var(--value-bg-color);
256
+ cursor: pointer;
257
+
258
+ display: grid;
259
+ place-content: center;
260
+ margin: 0;
261
+ font: inherit;
262
+ color: currentColor;
263
+ width: 1.7em;
264
+ height: 1.7em;
265
+ transform: translateY(-0.075em);
266
+ }
267
+
268
+ .muigui-pop-down-top input[type=checkbox]::before {
269
+ content: "+";
270
+ display: grid;
271
+ place-content: center;
272
+ border-radius: calc(var(--border-radius) + 2px);
273
+ border-left: 1px solid rgba(255,255,255,0.3);
274
+ border-top: 1px solid rgba(255,255,255,0.3);
275
+ border-bottom: 1px solid rgba(0,0,0,0.2);
276
+ border-right: 1px solid rgba(0,0,0,0.2);
277
+ background-color: var(--range-color);
278
+ color: var(--value-bg-color);
279
+ width: calc(var(--line-height) - 4px);
280
+ height: calc(var(--line-height) - 4px);
281
+ }
282
+
283
+ .muigui-pop-down-top input[type=checkbox]:checked::before {
284
+ content: "X";
285
+ }
286
+
287
+
288
+ /* ---- select ---- */
289
+
290
+ .muigui select,
291
+ .muigui option,
292
+ .muigui input,
293
+ .muigui button {
294
+ color: var(--value-color);
295
+ background-color: var(--value-bg-color);
296
+ font-family: var(--font-family);
297
+ font-size: var(--font-size);
298
+ border: none;
299
+ margin: 0;
300
+ border-radius: var(--border-radius);
301
+ }
302
+ .muigui select {
303
+ appearance: none;
304
+ margin: 0;
305
+ margin-left: 0; /*?*/
306
+ overflow: hidden; /* Safari */
307
+ }
308
+
309
+ .muigui select:focus,
310
+ .muigui input:focus,
311
+ .muigui button:focus {
312
+ outline: 1px solid var(--focus-color);
313
+ }
314
+
315
+ .muigui select:hover,
316
+ .muigui option:hover,
317
+ .muigui input:hover,
318
+ .muigui button:hover {
319
+ background-color: var(--hover-bg-color);
320
+ }
321
+
322
+ /* ------ [ label ] ------ */
323
+
324
+ .muigui-label {
325
+ border-top: 1px solid var(--menu-sep-color);
326
+ border-bottom: 1px solid var(--menu-sep-color);
327
+ padding-top: 0.4em;
328
+ padding-bottom: 0.3em;
329
+ place-content: center start;
330
+ background-color: var(--menu-bg-color);
331
+ white-space: pre;
332
+ border-radius: var(--border-radius);
333
+ }
334
+
335
+ /* ------ [ divider] ------ */
336
+
337
+ .muigui-divider {
338
+ min-height: 6px;
339
+ border-top: 2px solid var(--menu-sep-color);
340
+ margin-top: 6px;
341
+ }
342
+
343
+ /* ------ [ button ] ------ */
344
+
345
+ .muigui-button {
346
+ display: grid;
347
+
348
+ }
349
+ .muigui-button button {
350
+ border: none;
351
+ color: var(--value-color);
352
+ background-color: var(--button-bg-color);
353
+ cursor: pointer;
354
+ place-content: center center;
355
+ }
356
+
357
+ /* ------ [ color ] ------ */
358
+
359
+ .muigui-color>div {
360
+ overflow: hidden;
361
+ position: relative;
362
+ margin-left: 0;
363
+ margin-right: 0; /* why? */
364
+ max-width: var(--line-height);
365
+ border-radius: var(--border-radius);
366
+ }
367
+
368
+ .muigui-color>div:focus-within {
369
+ outline: 1px solid var(--focus-color);
370
+ }
371
+
372
+ .muigui-color input[type=color] {
373
+ border: none;
374
+ padding: 0;
375
+ background: inherit;
376
+ cursor: pointer;
377
+ position: absolute;
378
+ width: 200%;
379
+ left: -10px;
380
+ top: -10px;
381
+ height: 200%;
382
+ }
383
+ .muigui-disabled canvas,
384
+ .muigui-disabled svg,
385
+ .muigui-disabled img,
386
+ .muigui-disabled .muigui-color input[type=color] {
387
+ opacity: 0.2;
388
+ }
389
+
390
+ /* ------ [ checkbox ] ------ */
391
+
392
+ .muigui-checkbox>label:nth-child(2) {
393
+ display: grid;
394
+ place-content: center start;
395
+ margin: 0;
396
+ }
397
+
398
+ .muigui-checkbox input[type=checkbox] {
399
+ -webkit-appearance: none;
400
+ appearance: none;
401
+ width: auto;
402
+ color: var(--value-color);
403
+ background-color: var(--value-bg-color);
404
+ cursor: pointer;
405
+
406
+ display: grid;
407
+ place-content: center;
408
+ margin: 0;
409
+ font: inherit;
410
+ color: currentColor;
411
+ width: 1.7em;
412
+ height: 1.7em;
413
+ transform: translateY(-0.075em);
414
+ }
415
+
416
+ .muigui-checkbox input[type=checkbox]::before {
417
+ content: "";
418
+ color: var(--value-color);
419
+ display: grid;
420
+ place-content: center;
421
+ }
422
+
423
+ .muigui-checkbox input[type=checkbox]:checked::before {
424
+ content: "✔";
425
+ }
426
+
427
+ .muigui input[type=number]::-webkit-inner-spin-button,
428
+ .muigui input[type=number]::-webkit-outer-spin-button {
429
+ -webkit-appearance: none;
430
+ appearance: none;
431
+ margin: 0;
432
+ }
433
+ .muigui input[type=number] {
434
+ -moz-appearance: textfield;
435
+ }
436
+
437
+ /* ------ [ radio grid ] ------ */
438
+
439
+ .muigui-radio-grid>div {
440
+ display: grid;
441
+ gap: 2px;
442
+ }
443
+
444
+ .muigui-radio-grid input {
445
+ appearance: none;
446
+ display: none;
447
+ }
448
+
449
+ .muigui-radio-grid button {
450
+ color: var(--color);
451
+ width: 100%;
452
+ text-align: left;
453
+ }
454
+
455
+ .muigui-radio-grid input:checked + button {
456
+ color: var(--value-color);
457
+ background-color: var(--selected-color);
458
+ }
459
+
460
+ /* ------ [ color-chooser ] ------ */
461
+
462
+ .muigui-color-chooser-cursor {
463
+ stroke-width: 1px;
464
+ stroke: white;
465
+ fill: none;
466
+ }
467
+ .muigui-color-chooser-circle {
468
+ stroke-width: 1px;
469
+ stroke: white;
470
+ fill: none;
471
+ }
472
+
473
+
474
+ /* ------ [ vec2 ] ------ */
475
+
476
+ .muigui-vec2 svg {
477
+ background-color: var(--value-bg-color);
478
+ }
479
+
480
+ .muigui-vec2-axis {
481
+ stroke: 1px;
482
+ stroke: var(--focus-color);
483
+ }
484
+
485
+ .muigui-vec2-line {
486
+ stroke-width: 1px;
487
+ stroke: var(--value-color);
488
+ fill: var(--value-color);
489
+ }
490
+
491
+ /* ------ [ direction ] ------ */
492
+
493
+ .muigui-direction svg {
494
+ background-color: rgba(0,0,0,0.2);
495
+ }
496
+
497
+ .muigui-direction:focus-within svg {
498
+ outline: none;
499
+ }
500
+ .muigui-direction-range {
501
+ fill: var(--value-bg-color);
502
+ }
503
+ .muigui-direction svg:focus {
504
+ outline: none;
505
+ }
506
+ .muigui-direction svg:focus .muigui-direction-range {
507
+ stroke-width: 0.5px;
508
+ stroke: var(--focus-color);
509
+ }
510
+
511
+ .muigui-direction-arrow {
512
+ fill: var(--value-color);
513
+ }
514
+
515
+ /* ------ [ slider ] ------ */
516
+
517
+ .muigui-slider>div {
518
+ display: flex;
519
+ align-items: stretch;
520
+ height: var(--line-height);
521
+ }
522
+ .muigui-slider svg {
523
+ flex: 1 1 auto;
524
+ }
525
+ .muigui-slider .muigui-slider-up #muigui-orientation {
526
+ transform: scale(1, -1) translateY(-100%);
527
+ }
528
+
529
+ .muigui-slider .muigui-slider-up #muigui-number-orientation {
530
+ transform: scale(1,-1);
531
+ }
532
+
533
+ .muigui-ticks {
534
+ stroke: var(--range-color);
535
+ }
536
+ .muigui-thicks {
537
+ stroke: var(--color);
538
+ stroke-width: 2px;
539
+ }
540
+ .muigui-svg-text {
541
+ fill: var(--color);
542
+ font-size: 7px;
543
+ }
544
+ .muigui-mark {
545
+ fill: var(--value-color);
546
+ }
547
+
548
+ /* ------ [ range ] ------ */
549
+
550
+
551
+ .muigui-range input[type=range] {
552
+ -webkit-appearance: none;
553
+ appearance: none;
554
+ background-color: transparent;
555
+ }
556
+
557
+ .muigui-range input[type=range]::-webkit-slider-thumb {
558
+ -webkit-appearance: none;
559
+ appearance: none;
560
+ border-radius: calc(var(--border-radius) + 2px);
561
+ border-left: 1px solid rgba(255,255,255,0.3);
562
+ border-top: 1px solid rgba(255,255,255,0.3);
563
+ border-bottom: 1px solid rgba(0,0,0,0.2);
564
+ border-right: 1px solid rgba(0,0,0,0.2);
565
+ background-color: var(--range-color);
566
+ margin-top: calc((var(--line-height) - 2px) / -2);
567
+ width: calc(var(--line-height) - 2px);
568
+ height: calc(var(--line-height) - 2px);
569
+ }
570
+
571
+ .muigui-range input[type=range]::-webkit-slider-runnable-track {
572
+ -webkit-appearance: none;
573
+ appearance: none;
574
+ border: 1px solid var(--menu-sep-color);
575
+ height: 2px;
576
+ }
577
+
578
+
579
+ /* dat.gui style - doesn't work on Safari iOS */
580
+
581
+ /*
582
+ .muigui-range input[type=range] {
583
+ cursor: ew-resize;
584
+ overflow: hidden;
585
+ }
586
+
587
+ .muigui-range input[type=range] {
588
+ -webkit-appearance: none;
589
+ appearance: none;
590
+ background-color: var(--range-right-color);
591
+ margin: 0;
592
+ }
593
+ .muigui-range input[type=range]:hover {
594
+ background-color: var(--range-right-hover-color);
595
+ }
596
+
597
+ .muigui-range input[type=range]::-webkit-slider-runnable-track {
598
+ -webkit-appearance: none;
599
+ appearance: none;
600
+ height: max-content;
601
+ color: var(--range-left-color);
602
+ margin-top: -1px;
603
+ }
604
+
605
+ .muigui-range input[type=range]::-webkit-slider-thumb {
606
+ -webkit-appearance: none;
607
+ appearance: none;
608
+ width: 0px;
609
+ height: max-content;
610
+ box-shadow: -1000px 0 0 1000px var(--range-left-color);
611
+ }
612
+ */
613
+
614
+ /* FF */
615
+ /*
616
+ .muigui-range input[type=range]::-moz-slider-progress {
617
+ background-color: var(--range-left-color);
618
+ }
619
+ .muigui-range input[type=range]::-moz-slider-thumb {
620
+ height: max-content;
621
+ width: 0;
622
+ border: none;
623
+ box-shadow: -1000px 0 0 1000px var(--range-left-color);
624
+ box-sizing: border-box;
625
+ }
626
+ */
627
+
628
+ /* ---------------------------------------------------------- */
629
+
630
+ /* needs to be at bottom to take precedence */
631
+ .muigui-auto-place {
632
+ max-height: 100%;
633
+ position: fixed;
634
+ top: 0;
635
+ right: 15px;
636
+ z-index: 100001;
637
+ }
638
+
639
+ `;
640
+ export default css;
641
+
package/src/umd.js ADDED
@@ -0,0 +1,3 @@
1
+ import GUI from './muigui.js';
2
+
3
+ export default GUI;
@@ -0,0 +1,21 @@
1
+ import { createElem } from '../libs/elem.js';
2
+ import EditView from './EditView.js';
3
+
4
+ export default class CheckboxView extends EditView {
5
+ constructor(setter, id) {
6
+ const checkboxElem = createElem('input', {
7
+ type: 'checkbox',
8
+ id,
9
+ onInput: () => {
10
+ setter.setValue(this.domElement.checked);
11
+ },
12
+ onChange: () => {
13
+ setter.setFinalValue(this.domElement.checked);
14
+ },
15
+ });
16
+ super(createElem('label', {}, [checkboxElem]));
17
+ }
18
+ updateDisplay(v) {
19
+ this.domElement.checked = v;
20
+ }
21
+ }