goblin-gadgets 3.2.2 → 3.2.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 (361) hide show
  1. package/.editorconfig +9 -9
  2. package/.eslintrc.js +28 -28
  3. package/.zou-flow +2 -2
  4. package/builders/builders.js +5 -5
  5. package/builders/gadget.js +85 -85
  6. package/calendar-boards-gadget.js +64 -64
  7. package/demo-gadget.js +17 -17
  8. package/glyphs-dialog.js +13 -13
  9. package/login-dialog.js +13 -13
  10. package/package.json +46 -46
  11. package/pivot-gadget.js +18 -18
  12. package/stack-navigation.js +13 -13
  13. package/table-gadget.js +102 -102
  14. package/test/code-parser.spec.js +61 -61
  15. package/tree-gadget.js +70 -70
  16. package/types/types.js +455 -455
  17. package/widgets/accordion/styles.js +16 -16
  18. package/widgets/accordion/widget.js +90 -90
  19. package/widgets/analog-clock/props.js +102 -102
  20. package/widgets/analog-clock/scenarios.js +43 -43
  21. package/widgets/analog-clock/styles.js +754 -754
  22. package/widgets/analog-clock/widget.js +404 -404
  23. package/widgets/animated-container/animations.js +566 -566
  24. package/widgets/animated-container/styles.js +36 -36
  25. package/widgets/animated-container/widget.js +24 -24
  26. package/widgets/badge/styles.js +107 -107
  27. package/widgets/badge/widget.js +33 -33
  28. package/widgets/button/props.js +377 -377
  29. package/widgets/button/scenarios.js +54 -54
  30. package/widgets/button/styles.js +1082 -1082
  31. package/widgets/button/widget.js +426 -426
  32. package/widgets/button-combo/styles.js +73 -73
  33. package/widgets/button-combo/widget.js +297 -297
  34. package/widgets/calendar/props.js +207 -207
  35. package/widgets/calendar/scenarios.js +50 -50
  36. package/widgets/calendar/styles.js +198 -198
  37. package/widgets/calendar/widget.js +895 -895
  38. package/widgets/calendar-boards/styles.js +29 -29
  39. package/widgets/calendar-boards/widget.js +215 -215
  40. package/widgets/calendar-button/styles.js +273 -273
  41. package/widgets/calendar-button/widget.js +94 -94
  42. package/widgets/calendar-list/styles.js +35 -35
  43. package/widgets/calendar-list/widget.js +223 -223
  44. package/widgets/calendar-recurrence/widget.js +183 -183
  45. package/widgets/carousel/props.js +104 -104
  46. package/widgets/carousel/scenarios.js +163 -163
  47. package/widgets/carousel/styles.js +133 -133
  48. package/widgets/carousel/widget.js +491 -491
  49. package/widgets/carousel-bullet/styles.js +29 -29
  50. package/widgets/carousel-bullet/widget.js +25 -25
  51. package/widgets/carousel-button/styles.js +71 -71
  52. package/widgets/carousel-button/widget.js +33 -33
  53. package/widgets/carousel-item/styles.js +21 -21
  54. package/widgets/carousel-item/widget.js +24 -24
  55. package/widgets/chat-balloon/props.js +65 -65
  56. package/widgets/chat-balloon/scenarios.js +47 -47
  57. package/widgets/chat-balloon/styles.js +193 -193
  58. package/widgets/chat-balloon/widget.js +62 -62
  59. package/widgets/chat-dialog/styles.js +15 -15
  60. package/widgets/chat-dialog/widget.js +62 -62
  61. package/widgets/check-list/styles.js +66 -66
  62. package/widgets/check-list/widget.js +168 -168
  63. package/widgets/checkbox/widget.js +15 -15
  64. package/widgets/checkbox-nc/props.js +191 -191
  65. package/widgets/checkbox-nc/scenarios.js +41 -41
  66. package/widgets/checkbox-nc/styles.js +122 -122
  67. package/widgets/checkbox-nc/widget.js +116 -116
  68. package/widgets/clock-combo/styles.js +174 -174
  69. package/widgets/clock-combo/widget.js +390 -390
  70. package/widgets/color-picker/props.js +145 -145
  71. package/widgets/color-picker/scenarios.js +34 -34
  72. package/widgets/color-picker/styles.js +209 -209
  73. package/widgets/color-picker/widget.js +735 -735
  74. package/widgets/colored-container/props.js +34 -34
  75. package/widgets/colored-container/scenarios.js +54 -54
  76. package/widgets/colored-container/styles.js +100 -100
  77. package/widgets/colored-container/widget.js +27 -27
  78. package/widgets/combo/styles.js +69 -69
  79. package/widgets/combo/widget.js +224 -224
  80. package/widgets/combo-container/styles.js +66 -66
  81. package/widgets/combo-container/widget.js +188 -188
  82. package/widgets/command-button/widget.js +39 -39
  83. package/widgets/container/props.js +295 -295
  84. package/widgets/container/scenarios.js +47 -47
  85. package/widgets/container/styles.js +1439 -1439
  86. package/widgets/container/widget.js +279 -279
  87. package/widgets/demo/widget.js +24 -24
  88. package/widgets/dialog/styles.js +29 -29
  89. package/widgets/dialog/widget.js +26 -26
  90. package/widgets/dialog-modal/props.js +126 -126
  91. package/widgets/dialog-modal/styles.js +234 -234
  92. package/widgets/dialog-modal/widget.js +273 -273
  93. package/widgets/dialog-resizable/props.js +1 -1
  94. package/widgets/dialog-resizable/scenarios.js +18 -18
  95. package/widgets/dialog-resizable/widget.js +367 -367
  96. package/widgets/dialog-resizable-nc/props.js +150 -150
  97. package/widgets/dialog-resizable-nc/scenarios.js +18 -18
  98. package/widgets/dialog-resizable-nc/styles.js +259 -259
  99. package/widgets/dialog-resizable-nc/widget.js +197 -197
  100. package/widgets/directory-input/widget.js +18 -18
  101. package/widgets/directory-input-nc/widget.js +20 -20
  102. package/widgets/document-container/getPath.js +43 -43
  103. package/widgets/document-container/props.js +79 -79
  104. package/widgets/document-container/scenarios.js +39 -39
  105. package/widgets/document-container/styles.js +69 -69
  106. package/widgets/document-container/widget.js +53 -53
  107. package/widgets/drag-cab/styles.js +56 -56
  108. package/widgets/drag-cab/widget.js +285 -285
  109. package/widgets/drag-carrier/styles.js +21 -21
  110. package/widgets/drag-carrier/widget.js +780 -780
  111. package/widgets/dynamic-toolbar/styles.js +110 -110
  112. package/widgets/dynamic-toolbar/widget.js +128 -128
  113. package/widgets/field/readonly/label.js +39 -39
  114. package/widgets/field/widget.js +1743 -1743
  115. package/widgets/file-input/widget.js +18 -18
  116. package/widgets/file-input-nc/styles.js +38 -38
  117. package/widgets/file-input-nc/widget.js +88 -88
  118. package/widgets/flat-combo/styles.js +21 -21
  119. package/widgets/flat-combo/widget.js +61 -61
  120. package/widgets/flat-list/styles.js +30 -30
  121. package/widgets/flat-list/widget.js +219 -219
  122. package/widgets/flying-balloon/styles.js +52 -52
  123. package/widgets/flying-balloon/widget.js +43 -43
  124. package/widgets/fragment/widget.js +26 -26
  125. package/widgets/full-screen/props.js +27 -27
  126. package/widgets/full-screen/styles.js +32 -32
  127. package/widgets/full-screen/widget.js +40 -40
  128. package/widgets/gauge/props.js +71 -71
  129. package/widgets/gauge/scenarios.js +83 -83
  130. package/widgets/gauge/styles.js +183 -183
  131. package/widgets/gauge/widget.js +36 -36
  132. package/widgets/glyph-detail/service.js +9 -9
  133. package/widgets/glyph-detail/widget.js +109 -109
  134. package/widgets/glyphs-dialog/service.js +94 -94
  135. package/widgets/glyphs-dialog/styles.js +37 -37
  136. package/widgets/glyphs-dialog/widget.js +236 -236
  137. package/widgets/goblin-editor/widget.js +146 -146
  138. package/widgets/guild-entry/props.js +53 -53
  139. package/widgets/guild-entry/scenarios.js +26 -26
  140. package/widgets/guild-entry/styles.js +98 -98
  141. package/widgets/guild-entry/widget.js +126 -126
  142. package/widgets/guild-user-logo/guild-helpers.js +77 -77
  143. package/widgets/guild-user-logo/props.js +48 -48
  144. package/widgets/guild-user-logo/scenarios.js +64 -64
  145. package/widgets/guild-user-logo/styles.js +114 -114
  146. package/widgets/guild-user-logo/widget.js +81 -81
  147. package/widgets/guild-user-profile/props.js +73 -73
  148. package/widgets/guild-user-profile/scenarios.js +54 -54
  149. package/widgets/guild-user-profile/styles.js +162 -162
  150. package/widgets/guild-user-profile/widget.js +202 -202
  151. package/widgets/helpers/combo-helpers.js +218 -218
  152. package/widgets/helpers/geom-helpers.js +80 -80
  153. package/widgets/helpers/rect-helpers.js +10 -10
  154. package/widgets/helpers/shortcut-helpers.js +56 -56
  155. package/widgets/helpers/spacing-helpers.js +26 -26
  156. package/widgets/helpers/svg-helpers.js +151 -151
  157. package/widgets/helpers/table-helpers.js +68 -68
  158. package/widgets/hinter/styles.js +79 -79
  159. package/widgets/hinter/widget.js +205 -205
  160. package/widgets/hinter-column/widget.js +49 -49
  161. package/widgets/hinter-field/reducer.js +18 -18
  162. package/widgets/hinter-field/widget.js +176 -176
  163. package/widgets/hinter-field-nc/props.js +114 -114
  164. package/widgets/hinter-field-nc/scenarios.js +47 -47
  165. package/widgets/hinter-field-nc/widget.js +191 -191
  166. package/widgets/input-wrapper/widget.js +157 -157
  167. package/widgets/key-trap.js +96 -96
  168. package/widgets/label/props.js +1 -1
  169. package/widgets/label/scenarios.js +1 -1
  170. package/widgets/label/widget.js +7 -7
  171. package/widgets/label-nc/props.js +308 -308
  172. package/widgets/label-nc/scenarios.js +29 -29
  173. package/widgets/label-nc/styles.js +1218 -1218
  174. package/widgets/label-nc/widget.js +314 -314
  175. package/widgets/label-row/props.js +1 -1
  176. package/widgets/label-row/scenarios.js +1 -1
  177. package/widgets/label-row/widget.js +7 -7
  178. package/widgets/label-row-nc/props.js +94 -94
  179. package/widgets/label-row-nc/scenarios.js +46 -46
  180. package/widgets/label-row-nc/widget.js +81 -81
  181. package/widgets/label-text-field/styles.js +55 -55
  182. package/widgets/label-text-field/widget.js +178 -178
  183. package/widgets/launcher/props.js +177 -177
  184. package/widgets/launcher/scenarios.js +55 -55
  185. package/widgets/launcher/styles.js +46 -46
  186. package/widgets/launcher/widget.js +79 -79
  187. package/widgets/launcher-blob/props.js +25 -25
  188. package/widgets/launcher-blob/scenarios.js +24 -24
  189. package/widgets/launcher-blob/styles.js +62 -62
  190. package/widgets/launcher-blob/widget.js +50 -50
  191. package/widgets/list/widget.js +211 -211
  192. package/widgets/login-dialog/service.js +117 -117
  193. package/widgets/login-dialog/widget.js +117 -117
  194. package/widgets/map/reaflet.js +208 -208
  195. package/widgets/map/widget.js +67 -67
  196. package/widgets/markdown/styles.js +85 -85
  197. package/widgets/markdown/widget.js +31 -31
  198. package/widgets/notification/styles.js +97 -97
  199. package/widgets/notification/widget.js +207 -207
  200. package/widgets/pivot/custom.css +320 -320
  201. package/widgets/pivot/widget.js +42 -42
  202. package/widgets/radio-list/styles.js +48 -48
  203. package/widgets/radio-list/widget.js +111 -111
  204. package/widgets/resizable-container/styles.js +108 -108
  205. package/widgets/resizable-container/widget.js +225 -225
  206. package/widgets/retro-action-button/helpers.js +106 -106
  207. package/widgets/retro-action-button/styles.js +285 -285
  208. package/widgets/retro-action-button/widget.js +364 -364
  209. package/widgets/retro-badge-button/styles.js +87 -87
  210. package/widgets/retro-badge-button/widget.js +251 -251
  211. package/widgets/retro-gear/helpers.js +156 -156
  212. package/widgets/retro-gear/styles.js +130 -130
  213. package/widgets/retro-gear/widget.js +51 -51
  214. package/widgets/retro-illuminated-button/styles.js +274 -274
  215. package/widgets/retro-illuminated-button/widget.js +147 -147
  216. package/widgets/retro-panel/helpers.js +57 -57
  217. package/widgets/retro-panel/styles.js +293 -293
  218. package/widgets/retro-panel/widget.js +239 -239
  219. package/widgets/retro-screw/styles.js +80 -80
  220. package/widgets/retro-screw/widget.js +25 -25
  221. package/widgets/rocket/props.js +124 -124
  222. package/widgets/rocket/scenarios.js +71 -71
  223. package/widgets/rocket/styles.js +306 -306
  224. package/widgets/rocket/widget.js +225 -225
  225. package/widgets/samples-monitor/helpers.js +147 -147
  226. package/widgets/samples-monitor/styles.js +529 -529
  227. package/widgets/samples-monitor/widget.js +516 -516
  228. package/widgets/scrollable-container/styles.js +58 -58
  229. package/widgets/scrollable-container/widget.js +132 -132
  230. package/widgets/scrollable-linkable-container/reducer.js +18 -18
  231. package/widgets/scrollable-linkable-container/styles.js +42 -42
  232. package/widgets/scrollable-linkable-container/widget.js +78 -78
  233. package/widgets/select/styles.js +68 -68
  234. package/widgets/select/widget.js +119 -119
  235. package/widgets/separator/props.js +46 -46
  236. package/widgets/separator/styles.js +116 -116
  237. package/widgets/separator/widget.js +27 -27
  238. package/widgets/slider/props.js +136 -136
  239. package/widgets/slider/scenarios.js +74 -74
  240. package/widgets/slider/styles.js +246 -246
  241. package/widgets/slider/widget.js +404 -404
  242. package/widgets/slider-circle/props.js +72 -72
  243. package/widgets/slider-circle/scenarios.js +16 -16
  244. package/widgets/slider-circle/styles.js +78 -78
  245. package/widgets/slider-circle/widget.js +154 -154
  246. package/widgets/slider-xy/props.js +87 -87
  247. package/widgets/slider-xy/scenarios.js +19 -19
  248. package/widgets/slider-xy/styles.js +102 -102
  249. package/widgets/slider-xy/widget.js +234 -234
  250. package/widgets/smiley/props.js +51 -51
  251. package/widgets/smiley/scenarios.js +58 -58
  252. package/widgets/smiley/styles.js +489 -489
  253. package/widgets/smiley/widget.js +72 -72
  254. package/widgets/spinner/props.js +31 -31
  255. package/widgets/spinner/scenarios.js +31 -31
  256. package/widgets/spinner/styles.js +49 -49
  257. package/widgets/spinner/widget.js +23 -23
  258. package/widgets/splitter/props.js +71 -71
  259. package/widgets/splitter/scenarios.js +182 -182
  260. package/widgets/splitter/styles.js +41 -41
  261. package/widgets/splitter/widget.js +455 -455
  262. package/widgets/stack-navigation/service.js +324 -324
  263. package/widgets/stack-navigation/widget.js +296 -296
  264. package/widgets/state-browser/styles.js +19 -19
  265. package/widgets/state-browser/widget.js +135 -135
  266. package/widgets/state-browser-dialog/styles.js +100 -100
  267. package/widgets/state-browser-dialog/widget.js +253 -253
  268. package/widgets/state-monitor/styles.js +50 -50
  269. package/widgets/state-monitor/widget.js +324 -324
  270. package/widgets/switch-on-off/props.js +30 -30
  271. package/widgets/switch-on-off/scenarios.js +34 -34
  272. package/widgets/switch-on-off/styles.js +63 -63
  273. package/widgets/switch-on-off/widget.js +41 -41
  274. package/widgets/table/helpers.js +160 -160
  275. package/widgets/table/props.js +658 -658
  276. package/widgets/table/reducer.js +196 -196
  277. package/widgets/table/scenarios.js +54 -54
  278. package/widgets/table/widget.js +253 -253
  279. package/widgets/table-cell/props.js +145 -145
  280. package/widgets/table-cell/styles.js +160 -160
  281. package/widgets/table-cell/widget.js +139 -139
  282. package/widgets/table-header-drag-manager/styles.js +184 -184
  283. package/widgets/table-header-drag-manager/widget.js +392 -392
  284. package/widgets/table-nc/styles.js +100 -100
  285. package/widgets/table-nc/widget.js +409 -409
  286. package/widgets/table-row/props.js +73 -73
  287. package/widgets/table-row/styles.js +82 -82
  288. package/widgets/table-row/widget.js +207 -207
  289. package/widgets/text-field/widget.js +18 -18
  290. package/widgets/text-field-combo/widget.js +21 -21
  291. package/widgets/text-field-combo-nc/props.js +300 -300
  292. package/widgets/text-field-combo-nc/scenarios.js +72 -72
  293. package/widgets/text-field-combo-nc/widget.js +339 -339
  294. package/widgets/text-field-date-interval/styles.js +37 -37
  295. package/widgets/text-field-date-interval/widget.js +162 -162
  296. package/widgets/text-field-nc/props.js +40 -40
  297. package/widgets/text-field-nc/scenarios.js +67 -67
  298. package/widgets/text-field-nc/widget.js +14 -14
  299. package/widgets/text-field-time-interval/styles.js +37 -37
  300. package/widgets/text-field-time-interval/widget.js +160 -160
  301. package/widgets/text-field-typed/widget.js +51 -51
  302. package/widgets/text-field-typed-nc/props.js +81 -81
  303. package/widgets/text-field-typed-nc/scenarios.js +105 -105
  304. package/widgets/text-field-typed-nc/styles.js +20 -20
  305. package/widgets/text-field-typed-nc/widget.js +749 -750
  306. package/widgets/text-input-info-nc/props.js +62 -62
  307. package/widgets/text-input-info-nc/widget.js +55 -55
  308. package/widgets/text-input-nc/props.js +143 -143
  309. package/widgets/text-input-nc/scenarios.js +44 -44
  310. package/widgets/text-input-nc/styles.js +242 -242
  311. package/widgets/text-input-nc/widget.js +234 -234
  312. package/widgets/ticket/getPath.js +128 -128
  313. package/widgets/ticket/props.js +181 -181
  314. package/widgets/ticket/scenarios.js +39 -39
  315. package/widgets/ticket/styles.js +332 -332
  316. package/widgets/ticket/ticket-helpers.js +33 -33
  317. package/widgets/ticket/widget.js +348 -348
  318. package/widgets/ticket-hover/styles.js +207 -207
  319. package/widgets/ticket-hover/widget.js +53 -53
  320. package/widgets/time-gauge/widget.js +64 -64
  321. package/widgets/tips/styles.js +48 -48
  322. package/widgets/tips/widget.js +171 -171
  323. package/widgets/translatable-text-field/styles.js +202 -202
  324. package/widgets/translatable-text-field/text-field.js +132 -132
  325. package/widgets/translatable-text-field/widget.js +660 -660
  326. package/widgets/tree/props.js +246 -246
  327. package/widgets/tree/scenarios.js +14 -14
  328. package/widgets/tree/styles.js +142 -142
  329. package/widgets/tree/widget.js +383 -383
  330. package/widgets/tree-cell/styles.js +140 -140
  331. package/widgets/tree-cell/widget.js +100 -100
  332. package/widgets/tree-row/styles.js +77 -77
  333. package/widgets/tree-row/widget.js +135 -135
  334. package/widgets/triangle/props.js +48 -48
  335. package/widgets/triangle/scenarios.js +33 -33
  336. package/widgets/triangle/styles.js +92 -92
  337. package/widgets/triangle/widget.js +36 -36
  338. package/widgets/well-done/widget.js +170 -170
  339. package/widgets/widget-doc/reducer.js +68 -68
  340. package/widgets/widget-doc/styles.js +15 -15
  341. package/widgets/widget-doc/widget-list.js +25 -25
  342. package/widgets/widget-doc/widget.js +89 -89
  343. package/widgets/widget-doc-menu/styles.js +12 -12
  344. package/widgets/widget-doc-menu/widget.js +79 -79
  345. package/widgets/widget-doc-preview/parse-code.js +20 -20
  346. package/widgets/widget-doc-preview/styles.js +77 -77
  347. package/widgets/widget-doc-preview/widget.js +481 -481
  348. package/widgets/widget-doc-preview-container/styles.js +60 -60
  349. package/widgets/widget-doc-preview-container/widget.js +129 -129
  350. package/widgets/widget-doc-properties/styles.js +41 -41
  351. package/widgets/widget-doc-properties/widget.js +307 -307
  352. package/widgets/widget-doc-property/styles.js +75 -75
  353. package/widgets/widget-doc-property/widget.js +108 -108
  354. package/widgets/widget-doc-property-control/styles.js +14 -14
  355. package/widgets/widget-doc-property-control/widget.js +343 -343
  356. package/widgets/wizard/service.js +2132 -2132
  357. package/widgets/wizard/styles.js +21 -21
  358. package/widgets/wizard/widget.js +927 -927
  359. package/widgets/work-dialog/styles.js +31 -31
  360. package/widgets/work-dialog/widget.js +162 -162
  361. package/wizard.js +13 -13
@@ -1,426 +1,426 @@
1
- //T:2019-02-27
2
- import React from 'react';
3
- import props from './props';
4
- import scenarios from './scenarios';
5
- import {registerWidget} from 'goblin-gadgets/widgets/widget-doc/widget-list';
6
- import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
7
- import Widget from 'goblin-laboratory/widgets/widget';
8
- import MouseTrap from 'mousetrap';
9
- import * as ShortcutHelpers from '../helpers/shortcut-helpers.js';
10
- import {
11
- TranslatableDiv,
12
- TranslatableA,
13
- } from 'goblin-nabu/widgets/helpers/element-helpers';
14
- import Label from 'goblin-gadgets/widgets/label/widget';
15
- import Badge from 'goblin-gadgets/widgets/badge/widget';
16
- import Spinner from 'goblin-gadgets/widgets/spinner/widget';
17
- import RetroIlluminatedButton from 'goblin-gadgets/widgets/retro-illuminated-button/widget';
18
- import RetroBadgeButton from 'goblin-gadgets/widgets/retro-badge-button/widget';
19
- import RetroActionButton from 'goblin-gadgets/widgets/retro-action-button/widget';
20
- import * as styles from './styles';
21
- import {Unit} from 'goblin-theme';
22
- const to = Unit.to;
23
-
24
- /******************************************************************************/
25
-
26
- export default class Button extends Widget {
27
- constructor() {
28
- super(...arguments);
29
- this.styles = styles;
30
-
31
- this.state = {
32
- focus: false,
33
- };
34
-
35
- this.onFocus = this.onFocus.bind(this);
36
- this.onBlur = this.onBlur.bind(this);
37
- this.onMouseDown = this.onMouseDown.bind(this);
38
- this.onMouseUp = this.onMouseUp.bind(this);
39
- this.onMouseOver = this.onMouseOver.bind(this);
40
- this.onMouseOut = this.onMouseOut.bind(this);
41
- this.onKeySpace = this.onKeySpace.bind(this);
42
- this.onClick = this.onClick.bind(this);
43
- }
44
-
45
- componentDidMount() {
46
- super.componentDidMount();
47
- }
48
-
49
- componentWillUnmount() {
50
- super.componentWillUnmount();
51
- MouseTrap.unbind('space');
52
- }
53
-
54
- get focus() {
55
- return this.state.focus;
56
- }
57
-
58
- set focus(value) {
59
- this.setState({
60
- focus: value,
61
- });
62
- }
63
-
64
- static get wiring() {
65
- return {
66
- id: 'id',
67
- kind: 'kind',
68
- text: 'text',
69
- glyph: 'glyph',
70
- };
71
- }
72
-
73
- get disabled() {
74
- return this.props.disabled || this.props.readonly || this.props.busy;
75
- }
76
-
77
- onFocus() {
78
- if (this.props.focusable && !this.disabled) {
79
- this.focus = true;
80
- MouseTrap.bind('space', this.onKeySpace, 'keydown');
81
- }
82
- }
83
-
84
- onBlur() {
85
- if (this.props.focusable && !this.disabled) {
86
- this.focus = false;
87
- MouseTrap.unbind('space');
88
- }
89
- }
90
-
91
- onKeySpace(e) {
92
- e.preventDefault();
93
-
94
- if (this.disabled && !this.props.focusable) {
95
- return;
96
- }
97
- if (this.props.onClick) {
98
- this.props.onClick();
99
- }
100
- }
101
-
102
- onMouseDown(e) {
103
- if (this.disabled) {
104
- return;
105
- }
106
- const x = this.props.mouseDown;
107
- if (x) {
108
- x(e);
109
- }
110
- }
111
-
112
- onMouseUp(e) {
113
- if (this.disabled) {
114
- return;
115
- }
116
- const x = this.props.mouseUp;
117
- if (x) {
118
- x(e);
119
- }
120
- if (e.button === 2 && this.props.onRightClick) {
121
- this.props.onRightClick(e);
122
- }
123
- }
124
-
125
- onMouseOver(e) {
126
- if (this.disabled) {
127
- return;
128
- }
129
- const x = this.props.mouseOver;
130
- if (x) {
131
- x(e);
132
- }
133
- }
134
-
135
- onMouseOut(e) {
136
- if (this.disabled) {
137
- return;
138
- }
139
- const x = this.props.mouseOut;
140
- if (x) {
141
- x(e);
142
- }
143
- }
144
-
145
- onClick(e) {
146
- if (this.disabled) {
147
- return;
148
- }
149
- if (this.props.onClick) {
150
- this.props.onClick(e);
151
- }
152
- }
153
-
154
- renderBusy() {
155
- if (this.props.busy) {
156
- const busyBoxClass = this.styles.classNames.busyBox;
157
- const busyGlyphClass = this.styles.classNames.busyGlyph;
158
- return (
159
- <div className={busyBoxClass}>
160
- <div className={busyGlyphClass}>
161
- <Spinner size="24px" />
162
- </div>
163
- </div>
164
- );
165
- } else {
166
- return null;
167
- }
168
- }
169
-
170
- renderBusy_OLD() {
171
- if (this.props.busy) {
172
- const busyBoxClass = this.styles.classNames.busyBox;
173
- const busyGlyphClass = this.styles.classNames.busyGlyph;
174
- return (
175
- <div className={busyBoxClass}>
176
- <div className={busyGlyphClass}>
177
- <FontAwesomeIcon icon={[`fas`, 'spinner']} size={'2x'} pulse />
178
- </div>
179
- </div>
180
- );
181
- } else {
182
- return null;
183
- }
184
- }
185
-
186
- renderBadge() {
187
- if (this.props.badgeValue) {
188
- return (
189
- <Badge
190
- value={this.props.badgeValue}
191
- layer={this.props.badgePosition || 'over'}
192
- shape={this.props.badgeShape}
193
- color={this.props.badgeColor}
194
- size={this.props.badgeSize}
195
- />
196
- );
197
- } else {
198
- return null;
199
- }
200
- }
201
-
202
- renderTriangle() {
203
- if (this.props.kind === 'main-tab' && this.props.active) {
204
- const triangleClass = this.styles.classNames.triangle;
205
- return <div className={triangleClass} key="triangle" />;
206
- }
207
- }
208
-
209
- renderShortcut(boxStyle) {
210
- if (this.props.shortcut) {
211
- return (
212
- <Label
213
- cssUnit={this.props.cssUnit}
214
- key="shortcut"
215
- shortcut={true}
216
- kind={this.props.kind}
217
- subkind={this.props.subkind}
218
- disabled={this.disabled}
219
- readonly={this.readonly}
220
- active={this.props.active}
221
- textColor={this.props.textColor}
222
- buttonBackgroundColor={boxStyle.backgroundColor}
223
- text={ShortcutHelpers.getShortcut(this.props.shortcut)}
224
- wrap="no"
225
- insideButton={true}
226
- />
227
- );
228
- } else {
229
- return null;
230
- }
231
- }
232
-
233
- renderLabel(boxStyle) {
234
- const {tooltip, ...otherProps} = this.props;
235
- return (
236
- <Label
237
- key="label"
238
- {...otherProps}
239
- disabled={this.disabled}
240
- grow="1"
241
- buttonBackgroundColor={boxStyle.backgroundColor}
242
- insideButton={this.props.insideButton || true}
243
- />
244
- );
245
- }
246
-
247
- renderFocusedForeground() {
248
- if (this.focus && this.props.kind === 'check-button') {
249
- const styleClass = this.styles.classNames.focusedForeground;
250
- return <div key="focusedForeground" className={styleClass} />;
251
- } else {
252
- return null;
253
- }
254
- }
255
-
256
- renderLayout() {
257
- if (this.props.kind === 'box' || this.props.kind === 'container') {
258
- return null;
259
- }
260
- const result = [];
261
- const boxStyle = Object.assign({}, this.styles.props.button);
262
- result.push(this.renderLabel(boxStyle));
263
- result.push(this.renderShortcut(boxStyle));
264
- result.push(this.renderFocusedForeground());
265
- return result;
266
- }
267
-
268
- renderRetro() {
269
- const {cssUnit = 'px'} = this.props;
270
-
271
- switch (this.props.kind) {
272
- case 'task-logo':
273
- return (
274
- <RetroIlluminatedButton
275
- width={this.context.theme.shapes.taskButtonWidth}
276
- height={this.context.theme.shapes.taskButtonHeight}
277
- margin={
278
- `${to(20, cssUnit)} ${to(0, cssUnit)} ` +
279
- `${to(40, cssUnit)} ${to(0, cssUnit)}`
280
- }
281
- material="opal"
282
- border="silver"
283
- screws="four"
284
- backgroundColor={this.context.theme.palette.taskLogoBackground}
285
- color={this.context.theme.palette.taskLabelText}
286
- glyph={this.props.glyph}
287
- glyphSize={this.context.theme.shapes.taskLogoGlyphSize}
288
- text={this.props.text}
289
- textSize={this.context.theme.shapes.taskLogoTextSize}
290
- textTransform="uppercase"
291
- textWeight="bold"
292
- onClick={this.onClick}
293
- />
294
- );
295
- case 'task-bar':
296
- return (
297
- <RetroIlluminatedButton
298
- width={this.context.theme.shapes.taskButtonWidth}
299
- height={this.context.theme.shapes.taskButtonHeight}
300
- margin={`${to(5, cssUnit)} ${to(0, cssUnit)}`}
301
- material="opal"
302
- border="gold"
303
- queue="bottom"
304
- backgroundColor={this.context.theme.palette.taskButtonBackground}
305
- color={this.context.theme.palette.taskButtonText}
306
- glyph={this.props.glyph}
307
- glyphSize={this.context.theme.shapes.taskGlyphSize}
308
- text={this.props.text}
309
- textSize={this.context.theme.shapes.taskTextSize}
310
- onClick={this.onClick}
311
- />
312
- );
313
- case 'action':
314
- case 'secondary-action':
315
- return <RetroActionButton {...this.props} />;
316
- case 'view-tab-right':
317
- return <RetroBadgeButton height={to(42, cssUnit)} {...this.props} />;
318
- default:
319
- return null;
320
- }
321
- }
322
-
323
- render() {
324
- if (this.props.show === false) {
325
- return null;
326
- }
327
-
328
- if (this.context.theme.look.name === 'retro') {
329
- const r = this.renderRetro();
330
- if (r) {
331
- return r;
332
- }
333
- }
334
-
335
- let tooltip = this.props.tooltip;
336
- if (this.props.kind === 'pane-navigator') {
337
- tooltip = this.props.text;
338
- }
339
-
340
- const propsTabIndex = {};
341
- if (this.props.focusable) {
342
- propsTabIndex.tabIndex = 0;
343
- }
344
-
345
- const boxClass = this.styles.classNames.button;
346
-
347
- if (this.props.kind === 'container' || this.props.kind === 'box') {
348
- return (
349
- <TranslatableDiv
350
- title={tooltip}
351
- workitemId={this.context.desktopId || this.getNearestId()}
352
- key={this.props.index}
353
- {...propsTabIndex}
354
- onDoubleClick={this.props.onDoubleClick}
355
- onFocus={this.onFocus}
356
- onBlur={this.onBlur}
357
- onMouseDown={this.onMouseDown}
358
- onMouseUp={this.onMouseUp}
359
- onTouchStart={this.onMouseDown}
360
- onTouchEnd={this.onMouseUp}
361
- onMouseOver={this.onMouseOver}
362
- onMouseOut={this.onMouseOut}
363
- onClick={this.onClick}
364
- className={boxClass}
365
- >
366
- {this.props.children}
367
- </TranslatableDiv>
368
- );
369
- } else if (this.props.toAnchor) {
370
- return (
371
- <TranslatableA // <AConnected
372
- msgid={tooltip}
373
- workitemId={this.context.desktopId || this.getNearestId()}
374
- key={this.props.index}
375
- {...propsTabIndex}
376
- onFocus={this.onFocus}
377
- onBlur={this.onBlur}
378
- onMouseDown={this.onMouseDown}
379
- onMouseUp={this.onMouseUp}
380
- onTouchStart={this.onMouseDown}
381
- onTouchEnd={this.onMouseUp}
382
- onMouseOver={this.onMouseOver}
383
- onMouseOut={this.onMouseOut}
384
- onClick={this.onClick}
385
- className={boxClass}
386
- href={window.location.hash + '#' + this.props.toAnchor}
387
- >
388
- {this.renderLayout()}
389
- {this.renderTriangle()}
390
- {this.renderBadge()}
391
- {this.renderBusy()}
392
- {this.props.children}
393
- </TranslatableA>
394
- );
395
- } else {
396
- return (
397
- <TranslatableDiv
398
- title={tooltip}
399
- workitemId={this.context.desktopId || this.getNearestId()}
400
- key={this.props.index}
401
- {...propsTabIndex}
402
- onFocus={this.onFocus}
403
- onBlur={this.onBlur}
404
- onMouseDown={this.onMouseDown}
405
- onMouseUp={this.onMouseUp}
406
- onTouchStart={this.onMouseDown}
407
- onTouchEnd={this.onMouseUp}
408
- onMouseOver={this.onMouseOver}
409
- onMouseOut={this.onMouseOut}
410
- onClick={this.onClick}
411
- className={boxClass}
412
- >
413
- {this.renderLayout()}
414
- {this.renderTriangle()}
415
- {this.renderBadge()}
416
- {this.renderBusy()}
417
- {this.props.children}
418
- </TranslatableDiv>
419
- );
420
- }
421
- }
422
- }
423
-
424
- /******************************************************************************/
425
-
426
- registerWidget(Button, props, scenarios);
1
+ //T:2019-02-27
2
+ import React from 'react';
3
+ import props from './props';
4
+ import scenarios from './scenarios';
5
+ import {registerWidget} from 'goblin-gadgets/widgets/widget-doc/widget-list';
6
+ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
7
+ import Widget from 'goblin-laboratory/widgets/widget';
8
+ import MouseTrap from 'mousetrap';
9
+ import * as ShortcutHelpers from '../helpers/shortcut-helpers.js';
10
+ import {
11
+ TranslatableDiv,
12
+ TranslatableA,
13
+ } from 'goblin-nabu/widgets/helpers/element-helpers';
14
+ import Label from 'goblin-gadgets/widgets/label/widget';
15
+ import Badge from 'goblin-gadgets/widgets/badge/widget';
16
+ import Spinner from 'goblin-gadgets/widgets/spinner/widget';
17
+ import RetroIlluminatedButton from 'goblin-gadgets/widgets/retro-illuminated-button/widget';
18
+ import RetroBadgeButton from 'goblin-gadgets/widgets/retro-badge-button/widget';
19
+ import RetroActionButton from 'goblin-gadgets/widgets/retro-action-button/widget';
20
+ import * as styles from './styles';
21
+ import {Unit} from 'goblin-theme';
22
+ const to = Unit.to;
23
+
24
+ /******************************************************************************/
25
+
26
+ export default class Button extends Widget {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.styles = styles;
30
+
31
+ this.state = {
32
+ focus: false,
33
+ };
34
+
35
+ this.onFocus = this.onFocus.bind(this);
36
+ this.onBlur = this.onBlur.bind(this);
37
+ this.onMouseDown = this.onMouseDown.bind(this);
38
+ this.onMouseUp = this.onMouseUp.bind(this);
39
+ this.onMouseOver = this.onMouseOver.bind(this);
40
+ this.onMouseOut = this.onMouseOut.bind(this);
41
+ this.onKeySpace = this.onKeySpace.bind(this);
42
+ this.onClick = this.onClick.bind(this);
43
+ }
44
+
45
+ componentDidMount() {
46
+ super.componentDidMount();
47
+ }
48
+
49
+ componentWillUnmount() {
50
+ super.componentWillUnmount();
51
+ MouseTrap.unbind('space');
52
+ }
53
+
54
+ get focus() {
55
+ return this.state.focus;
56
+ }
57
+
58
+ set focus(value) {
59
+ this.setState({
60
+ focus: value,
61
+ });
62
+ }
63
+
64
+ static get wiring() {
65
+ return {
66
+ id: 'id',
67
+ kind: 'kind',
68
+ text: 'text',
69
+ glyph: 'glyph',
70
+ };
71
+ }
72
+
73
+ get disabled() {
74
+ return this.props.disabled || this.props.readonly || this.props.busy;
75
+ }
76
+
77
+ onFocus() {
78
+ if (this.props.focusable && !this.disabled) {
79
+ this.focus = true;
80
+ MouseTrap.bind('space', this.onKeySpace, 'keydown');
81
+ }
82
+ }
83
+
84
+ onBlur() {
85
+ if (this.props.focusable && !this.disabled) {
86
+ this.focus = false;
87
+ MouseTrap.unbind('space');
88
+ }
89
+ }
90
+
91
+ onKeySpace(e) {
92
+ e.preventDefault();
93
+
94
+ if (this.disabled && !this.props.focusable) {
95
+ return;
96
+ }
97
+ if (this.props.onClick) {
98
+ this.props.onClick();
99
+ }
100
+ }
101
+
102
+ onMouseDown(e) {
103
+ if (this.disabled) {
104
+ return;
105
+ }
106
+ const x = this.props.mouseDown;
107
+ if (x) {
108
+ x(e);
109
+ }
110
+ }
111
+
112
+ onMouseUp(e) {
113
+ if (this.disabled) {
114
+ return;
115
+ }
116
+ const x = this.props.mouseUp;
117
+ if (x) {
118
+ x(e);
119
+ }
120
+ if (e.button === 2 && this.props.onRightClick) {
121
+ this.props.onRightClick(e);
122
+ }
123
+ }
124
+
125
+ onMouseOver(e) {
126
+ if (this.disabled) {
127
+ return;
128
+ }
129
+ const x = this.props.mouseOver;
130
+ if (x) {
131
+ x(e);
132
+ }
133
+ }
134
+
135
+ onMouseOut(e) {
136
+ if (this.disabled) {
137
+ return;
138
+ }
139
+ const x = this.props.mouseOut;
140
+ if (x) {
141
+ x(e);
142
+ }
143
+ }
144
+
145
+ onClick(e) {
146
+ if (this.disabled) {
147
+ return;
148
+ }
149
+ if (this.props.onClick) {
150
+ this.props.onClick(e);
151
+ }
152
+ }
153
+
154
+ renderBusy() {
155
+ if (this.props.busy) {
156
+ const busyBoxClass = this.styles.classNames.busyBox;
157
+ const busyGlyphClass = this.styles.classNames.busyGlyph;
158
+ return (
159
+ <div className={busyBoxClass}>
160
+ <div className={busyGlyphClass}>
161
+ <Spinner size="24px" />
162
+ </div>
163
+ </div>
164
+ );
165
+ } else {
166
+ return null;
167
+ }
168
+ }
169
+
170
+ renderBusy_OLD() {
171
+ if (this.props.busy) {
172
+ const busyBoxClass = this.styles.classNames.busyBox;
173
+ const busyGlyphClass = this.styles.classNames.busyGlyph;
174
+ return (
175
+ <div className={busyBoxClass}>
176
+ <div className={busyGlyphClass}>
177
+ <FontAwesomeIcon icon={[`fas`, 'spinner']} size={'2x'} pulse />
178
+ </div>
179
+ </div>
180
+ );
181
+ } else {
182
+ return null;
183
+ }
184
+ }
185
+
186
+ renderBadge() {
187
+ if (this.props.badgeValue) {
188
+ return (
189
+ <Badge
190
+ value={this.props.badgeValue}
191
+ layer={this.props.badgePosition || 'over'}
192
+ shape={this.props.badgeShape}
193
+ color={this.props.badgeColor}
194
+ size={this.props.badgeSize}
195
+ />
196
+ );
197
+ } else {
198
+ return null;
199
+ }
200
+ }
201
+
202
+ renderTriangle() {
203
+ if (this.props.kind === 'main-tab' && this.props.active) {
204
+ const triangleClass = this.styles.classNames.triangle;
205
+ return <div className={triangleClass} key="triangle" />;
206
+ }
207
+ }
208
+
209
+ renderShortcut(boxStyle) {
210
+ if (this.props.shortcut) {
211
+ return (
212
+ <Label
213
+ cssUnit={this.props.cssUnit}
214
+ key="shortcut"
215
+ shortcut={true}
216
+ kind={this.props.kind}
217
+ subkind={this.props.subkind}
218
+ disabled={this.disabled}
219
+ readonly={this.readonly}
220
+ active={this.props.active}
221
+ textColor={this.props.textColor}
222
+ buttonBackgroundColor={boxStyle.backgroundColor}
223
+ text={ShortcutHelpers.getShortcut(this.props.shortcut)}
224
+ wrap="no"
225
+ insideButton={true}
226
+ />
227
+ );
228
+ } else {
229
+ return null;
230
+ }
231
+ }
232
+
233
+ renderLabel(boxStyle) {
234
+ const {tooltip, ...otherProps} = this.props;
235
+ return (
236
+ <Label
237
+ key="label"
238
+ {...otherProps}
239
+ disabled={this.disabled}
240
+ grow="1"
241
+ buttonBackgroundColor={boxStyle.backgroundColor}
242
+ insideButton={this.props.insideButton || true}
243
+ />
244
+ );
245
+ }
246
+
247
+ renderFocusedForeground() {
248
+ if (this.focus && this.props.kind === 'check-button') {
249
+ const styleClass = this.styles.classNames.focusedForeground;
250
+ return <div key="focusedForeground" className={styleClass} />;
251
+ } else {
252
+ return null;
253
+ }
254
+ }
255
+
256
+ renderLayout() {
257
+ if (this.props.kind === 'box' || this.props.kind === 'container') {
258
+ return null;
259
+ }
260
+ const result = [];
261
+ const boxStyle = Object.assign({}, this.styles.props.button);
262
+ result.push(this.renderLabel(boxStyle));
263
+ result.push(this.renderShortcut(boxStyle));
264
+ result.push(this.renderFocusedForeground());
265
+ return result;
266
+ }
267
+
268
+ renderRetro() {
269
+ const {cssUnit = 'px'} = this.props;
270
+
271
+ switch (this.props.kind) {
272
+ case 'task-logo':
273
+ return (
274
+ <RetroIlluminatedButton
275
+ width={this.context.theme.shapes.taskButtonWidth}
276
+ height={this.context.theme.shapes.taskButtonHeight}
277
+ margin={
278
+ `${to(20, cssUnit)} ${to(0, cssUnit)} ` +
279
+ `${to(40, cssUnit)} ${to(0, cssUnit)}`
280
+ }
281
+ material="opal"
282
+ border="silver"
283
+ screws="four"
284
+ backgroundColor={this.context.theme.palette.taskLogoBackground}
285
+ color={this.context.theme.palette.taskLabelText}
286
+ glyph={this.props.glyph}
287
+ glyphSize={this.context.theme.shapes.taskLogoGlyphSize}
288
+ text={this.props.text}
289
+ textSize={this.context.theme.shapes.taskLogoTextSize}
290
+ textTransform="uppercase"
291
+ textWeight="bold"
292
+ onClick={this.onClick}
293
+ />
294
+ );
295
+ case 'task-bar':
296
+ return (
297
+ <RetroIlluminatedButton
298
+ width={this.context.theme.shapes.taskButtonWidth}
299
+ height={this.context.theme.shapes.taskButtonHeight}
300
+ margin={`${to(5, cssUnit)} ${to(0, cssUnit)}`}
301
+ material="opal"
302
+ border="gold"
303
+ queue="bottom"
304
+ backgroundColor={this.context.theme.palette.taskButtonBackground}
305
+ color={this.context.theme.palette.taskButtonText}
306
+ glyph={this.props.glyph}
307
+ glyphSize={this.context.theme.shapes.taskGlyphSize}
308
+ text={this.props.text}
309
+ textSize={this.context.theme.shapes.taskTextSize}
310
+ onClick={this.onClick}
311
+ />
312
+ );
313
+ case 'action':
314
+ case 'secondary-action':
315
+ return <RetroActionButton {...this.props} />;
316
+ case 'view-tab-right':
317
+ return <RetroBadgeButton height={to(42, cssUnit)} {...this.props} />;
318
+ default:
319
+ return null;
320
+ }
321
+ }
322
+
323
+ render() {
324
+ if (this.props.show === false) {
325
+ return null;
326
+ }
327
+
328
+ if (this.context.theme.look.name === 'retro') {
329
+ const r = this.renderRetro();
330
+ if (r) {
331
+ return r;
332
+ }
333
+ }
334
+
335
+ let tooltip = this.props.tooltip;
336
+ if (this.props.kind === 'pane-navigator') {
337
+ tooltip = this.props.text;
338
+ }
339
+
340
+ const propsTabIndex = {};
341
+ if (this.props.focusable) {
342
+ propsTabIndex.tabIndex = 0;
343
+ }
344
+
345
+ const boxClass = this.styles.classNames.button;
346
+
347
+ if (this.props.kind === 'container' || this.props.kind === 'box') {
348
+ return (
349
+ <TranslatableDiv
350
+ title={tooltip}
351
+ workitemId={this.context.desktopId || this.getNearestId()}
352
+ key={this.props.index}
353
+ {...propsTabIndex}
354
+ onDoubleClick={this.props.onDoubleClick}
355
+ onFocus={this.onFocus}
356
+ onBlur={this.onBlur}
357
+ onMouseDown={this.onMouseDown}
358
+ onMouseUp={this.onMouseUp}
359
+ onTouchStart={this.onMouseDown}
360
+ onTouchEnd={this.onMouseUp}
361
+ onMouseOver={this.onMouseOver}
362
+ onMouseOut={this.onMouseOut}
363
+ onClick={this.onClick}
364
+ className={boxClass}
365
+ >
366
+ {this.props.children}
367
+ </TranslatableDiv>
368
+ );
369
+ } else if (this.props.toAnchor) {
370
+ return (
371
+ <TranslatableA // <AConnected
372
+ msgid={tooltip}
373
+ workitemId={this.context.desktopId || this.getNearestId()}
374
+ key={this.props.index}
375
+ {...propsTabIndex}
376
+ onFocus={this.onFocus}
377
+ onBlur={this.onBlur}
378
+ onMouseDown={this.onMouseDown}
379
+ onMouseUp={this.onMouseUp}
380
+ onTouchStart={this.onMouseDown}
381
+ onTouchEnd={this.onMouseUp}
382
+ onMouseOver={this.onMouseOver}
383
+ onMouseOut={this.onMouseOut}
384
+ onClick={this.onClick}
385
+ className={boxClass}
386
+ href={window.location.hash + '#' + this.props.toAnchor}
387
+ >
388
+ {this.renderLayout()}
389
+ {this.renderTriangle()}
390
+ {this.renderBadge()}
391
+ {this.renderBusy()}
392
+ {this.props.children}
393
+ </TranslatableA>
394
+ );
395
+ } else {
396
+ return (
397
+ <TranslatableDiv
398
+ title={tooltip}
399
+ workitemId={this.context.desktopId || this.getNearestId()}
400
+ key={this.props.index}
401
+ {...propsTabIndex}
402
+ onFocus={this.onFocus}
403
+ onBlur={this.onBlur}
404
+ onMouseDown={this.onMouseDown}
405
+ onMouseUp={this.onMouseUp}
406
+ onTouchStart={this.onMouseDown}
407
+ onTouchEnd={this.onMouseUp}
408
+ onMouseOver={this.onMouseOver}
409
+ onMouseOut={this.onMouseOut}
410
+ onClick={this.onClick}
411
+ className={boxClass}
412
+ >
413
+ {this.renderLayout()}
414
+ {this.renderTriangle()}
415
+ {this.renderBadge()}
416
+ {this.renderBusy()}
417
+ {this.props.children}
418
+ </TranslatableDiv>
419
+ );
420
+ }
421
+ }
422
+ }
423
+
424
+ /******************************************************************************/
425
+
426
+ registerWidget(Button, props, scenarios);