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,1082 +1,1082 @@
1
- import {Unit} from 'goblin-theme';
2
- import {ColorHelpers} from 'goblin-theme';
3
- import {ColorManipulator} from 'goblin-theme';
4
- import * as SpacingHelpers from 'goblin-gadgets/widgets/helpers/spacing-helpers';
5
- const to = Unit.to;
6
-
7
- function convertJustify(justify) {
8
- switch (justify) {
9
- case 'start':
10
- return 'flex-start';
11
- case 'end':
12
- return 'flex-end';
13
- case 'around':
14
- return 'space-around';
15
- case 'between':
16
- return 'space-between';
17
- default:
18
- return justify;
19
- }
20
- }
21
-
22
- function isColorGradient(color) {
23
- return (
24
- color &&
25
- (color.startsWith('linear-gradient(') ||
26
- color.startsWith('radial-gradient(') ||
27
- color.startsWith('repeating-linear-gradient('))
28
- );
29
- }
30
-
31
- /******************************************************************************/
32
-
33
- export const propNames = [
34
- 'width',
35
- 'height',
36
- 'grow',
37
- 'justify',
38
- 'zIndex',
39
- 'visibility',
40
- 'position',
41
- 'cursor',
42
- 'disabled',
43
- 'readonly',
44
- 'border',
45
- 'horizontalSpacing',
46
- 'leftSpacing',
47
- 'kind',
48
- 'text',
49
- 'heightStrategy',
50
- 'place',
51
- 'active',
52
- 'focused',
53
- 'subkind',
54
- 'badgePush',
55
- 'shortcut',
56
- 'shape',
57
- 'backgroundColor',
58
- 'activeColor',
59
- 'vpos',
60
- 'left',
61
- 'right',
62
- 'top',
63
- 'bottom',
64
- 'busy',
65
- 'focusable',
66
- 'triangleSize',
67
- 'triangleColor',
68
- 'cssUnit',
69
- ];
70
-
71
- export function mapProps(props) {
72
- return {
73
- ...props,
74
- text: Boolean(props.text),
75
- };
76
- }
77
-
78
- export default function styles(theme, props) {
79
- let {
80
- width,
81
- height,
82
- grow,
83
- justify,
84
- zIndex,
85
- visibility,
86
- position,
87
- cursor,
88
- disabled,
89
- readonly,
90
- border,
91
- horizontalSpacing,
92
- leftSpacing,
93
- kind,
94
- text,
95
- heightStrategy,
96
- place: placeProp,
97
- active,
98
- focused,
99
- subkind,
100
- badgePush,
101
- shortcut,
102
- shape,
103
- backgroundColor: backgroundColorProp,
104
- activeColor: activeColorProp,
105
- vpos,
106
- left,
107
- right,
108
- top,
109
- bottom,
110
- busy,
111
- focusable,
112
- triangleSize,
113
- triangleColor,
114
- cssUnit = 'px',
115
- } = props;
116
-
117
- const m = Unit.multiply(to(theme.shapes.containerMargin, cssUnit), 0.5);
118
-
119
- // Initialize all variables for a standard button.
120
- let boxWidth = width;
121
- let boxMinWidth = null;
122
- let boxHeight = height ? height : to(theme.shapes.lineHeight, cssUnit);
123
- let boxMaxWidth = null;
124
- let boxMaxHeight = null;
125
- let boxFlexDirection = 'row';
126
- let boxFlexGrow = grow;
127
- let boxFlexShrink = null;
128
- let boxFlexBasis = null;
129
- let boxJustifyContent = convertJustify(justify);
130
- let boxAlignItems = 'center';
131
- let boxAlignSelf = null;
132
- let boxMarginTop = to(0, cssUnit);
133
- let boxMarginRight = to(0, cssUnit);
134
- let boxMarginBottom = to(0, cssUnit);
135
- let boxMarginLeft = to(0, cssUnit);
136
- let boxPaddingTop = to(theme.shapes.boxPaddingTop, cssUnit);
137
- let boxPaddingRight = to(theme.shapes.boxPaddingRight, cssUnit);
138
- let boxPaddingBottom = to(theme.shapes.boxPaddingBottom, cssUnit);
139
- let boxPaddingLeft = to(theme.shapes.boxPaddingLeft, cssUnit);
140
- let boxZIndex = zIndex;
141
- let boxOpacity = visibility === false ? 0 : null;
142
- let borderWidth = to(theme.shapes.buttonBorderWidth, cssUnit);
143
- let borderColor = theme.palette.buttonBorderColor;
144
- let borderColorForced = null;
145
- let borderActiveColor = theme.palette.buttonBorderColor;
146
- let borderStyle = 'solid';
147
- let borderRadius = to(0, cssUnit);
148
- let boxSizing = null;
149
- let boxShadow = null;
150
- let backgroundColor = theme.palette.buttonBackground;
151
- let activeColor = theme.palette.boxActiveBackground;
152
- let borderHoverColor = null;
153
- let borderHoverStyle = null;
154
- let borderHoverWidth = null;
155
- let backgroundHoverColor = null;
156
- let boxPosition = position ? position : 'relative';
157
- cursor = cursor || 'default';
158
- let transition =
159
- (cssUnit === 'px' || cssUnit.unit === 'px') && theme.transitions.easeOut();
160
- let specialDisabled = false;
161
- let focusedShadow = theme.shapes.focusedShadow + theme.palette.focused; // FIXME: use 'to' with cssUnit
162
-
163
- disabled = disabled || readonly;
164
-
165
- // Initialize variables for button without border.
166
- if (border === 'none') {
167
- // Button without border must have same backgroundColor as parent !
168
- borderStyle = 'none';
169
- backgroundColor = null;
170
- }
171
-
172
- boxMarginRight = SpacingHelpers.getHorizontalSpacingRightMargin(
173
- theme,
174
- horizontalSpacing
175
- );
176
-
177
- if (leftSpacing === 'overlap') {
178
- boxMarginLeft = to(-1, cssUnit);
179
- }
180
-
181
- if (kind === 'disabled-light') {
182
- specialDisabled = true;
183
- }
184
-
185
- // task-logo button (usual parent container with kind='task-bar').
186
- if (kind === 'task-logo') {
187
- boxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
188
- boxMaxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
189
- boxHeight = to(theme.shapes.taskButtonHeight, cssUnit);
190
- boxFlexDirection = 'column';
191
- borderStyle = 'none';
192
- backgroundColor = theme.palette.taskLogoBackground;
193
- activeColor = theme.palette.taskTabActiveBackground;
194
- }
195
-
196
- // Task button (usual parent is container with kind='task-bar').
197
- if (kind === 'task-bar') {
198
- boxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
199
- boxMaxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
200
- boxHeight = to(theme.shapes.taskButtonHeight, cssUnit);
201
- boxFlexDirection = 'column';
202
- borderStyle = 'none none solid none';
203
- borderColor = theme.palette.taskButtonBorder;
204
- backgroundColor = theme.palette.taskButtonBackground;
205
- }
206
-
207
- // main-tab button (usual parent is container with kind='main-tab').
208
- if (kind === 'main-tab') {
209
- boxWidth = to(200, cssUnit);
210
- boxHeight = to(theme.shapes.mainTabHeight, cssUnit);
211
- boxPaddingLeft = Unit.multiply(m, 1.0);
212
- boxPaddingRight = Unit.multiply(m, 1.0);
213
- boxPaddingTop = Unit.multiply(m, 0.5);
214
- boxPaddingBottom = Unit.multiply(m, 0.5);
215
- boxMarginRight = to(1, cssUnit);
216
- borderStyle = 'none';
217
- backgroundColor = theme.palette.mainTabButtonInactiveBackground;
218
- activeColor = theme.palette.mainTabButtonActiveBackground;
219
-
220
- if (theme.look.name === 'retro') {
221
- borderRadius =
222
- `${to(25, cssUnit)} ${to(25, cssUnit)} ` +
223
- `${to(0, cssUnit)} ${to(0, cssUnit)}`;
224
- boxMarginTop = to(5, cssUnit);
225
- boxMarginRight = to(0, cssUnit);
226
- boxMarginBottom = to(0, cssUnit);
227
- boxMarginLeft = to(5, cssUnit);
228
- boxShadow =
229
- `${to(3, cssUnit)} ${to(5, cssUnit)} ` +
230
- `${to(21, cssUnit)} ${to(2, cssUnit)} rgba(0,0,0,0.7)`;
231
- }
232
- }
233
-
234
- if (kind === 'main-tab-right') {
235
- boxHeight = to(theme.shapes.mainTabHeight, cssUnit);
236
- borderStyle = 'none';
237
- backgroundColor = null;
238
- activeColor = theme.palette.mainTabButtonActiveBackground;
239
- backgroundHoverColor = theme.palette.mainTabButtonActiveBackground;
240
- }
241
-
242
- // view-tab button (usual parent is container with kind='view-tab').
243
- if (
244
- kind === 'view-tab' ||
245
- kind === 'view-tab-first' ||
246
- kind === 'view-tab-last' ||
247
- kind === 'view-tab-single'
248
- ) {
249
- boxMaxWidth = to(250, cssUnit);
250
- boxHeight = to(theme.shapes.viewTabHeight, cssUnit);
251
- if (text) {
252
- boxMarginTop = to(1, cssUnit);
253
- boxMarginRight = to(1, cssUnit);
254
- } else {
255
- // When a text button is followed by a glyph button, the glyph button must
256
- // be glued to the text button. Typically a close button: [Missions][x]
257
- boxMarginTop = to(1, cssUnit);
258
- boxMarginRight = to(1, cssUnit);
259
- boxMarginLeft = to(-1, cssUnit);
260
- }
261
- borderStyle = 'none';
262
- backgroundColor = theme.palette.viewTabButtonInactiveBackground;
263
- activeColor = theme.palette.viewTabButtonActiveBackground;
264
-
265
- if (theme.look.name === 'retro') {
266
- if (kind === 'view-tab-first') {
267
- boxMarginLeft = to(5, cssUnit);
268
- borderRadius =
269
- `${to(15, cssUnit)} ${to(0, cssUnit)} ` +
270
- `${to(0, cssUnit)} ${to(0, cssUnit)}`;
271
- }
272
- if (kind === 'view-tab-last') {
273
- borderRadius =
274
- `${to(0, cssUnit)} ${to(15, cssUnit)} ` +
275
- `${to(0, cssUnit)} ${to(0, cssUnit)}`;
276
- }
277
- if (kind === 'view-tab-single') {
278
- boxMarginLeft = to(5, cssUnit);
279
- borderRadius =
280
- `${to(15, cssUnit)} ${to(15, cssUnit)} ` +
281
- `${to(0, cssUnit)} ${to(0, cssUnit)}`;
282
- }
283
- }
284
- }
285
-
286
- if (kind === 'view-tab-right') {
287
- boxHeight = Unit.add(
288
- to(theme.shapes.containerMargin, cssUnit),
289
- to(theme.shapes.viewTabHeight, cssUnit)
290
- );
291
- borderStyle = 'none';
292
- if (text) {
293
- backgroundColor = theme.palette.viewTabRightTextBackground;
294
- } else {
295
- backgroundColor = theme.palette.viewTabBackground;
296
- }
297
- }
298
-
299
- // task-tab button (usual parent is container with kind='task-bar').
300
- if (kind === 'task-tab') {
301
- boxHeight = to(theme.shapes.taskTabHeight, cssUnit);
302
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
303
- backgroundColor = theme.palette.taskTabInactiveBackground;
304
- activeColor = theme.palette.taskTabActiveBackground;
305
- borderStyle = 'none none solid none';
306
- borderColor = theme.palette.taskButtonBorder;
307
- }
308
-
309
- // pane-navigator button (usual parent is container with kind='pane-navigator').
310
- if (kind === 'pane-navigator') {
311
- boxHeight = to(theme.shapes.paneNavigatorHeight, cssUnit);
312
- boxMarginBottom = to(-1, cssUnit);
313
- backgroundColor = theme.palette.paneNavigatorBackground;
314
- borderStyle = 'none none solid none';
315
- borderColor = theme.palette.paneNavigatorInactiveBorder;
316
- borderActiveColor = theme.palette.paneNavigatorActiveBorder;
317
- borderHoverColor = theme.palette.paneNavigatorBorderHover;
318
- backgroundHoverColor = '#ffffff00'; // transparent
319
- }
320
-
321
- // pane-hnavigator button (usual parent is container with kind='pane-hnavigator').
322
- if (kind === 'pane-hnavigator') {
323
- boxHeight = to(theme.shapes.paneNavigatorHeight, cssUnit);
324
- boxMarginBottom = to(-1, cssUnit);
325
- backgroundColor = theme.palette.paneNavigatorBackground;
326
- borderStyle = 'none none solid none';
327
- borderColor = theme.palette.paneNavigatorInactiveBorder;
328
- borderActiveColor = theme.palette.paneNavigatorActiveBorder;
329
- borderHoverColor = theme.palette.paneNavigatorBorderHover;
330
- backgroundHoverColor = '#ffffff00'; // transparent
331
- }
332
-
333
- // pane-vnavigator button (usual parent is container with kind='pane-vnavigator').
334
- if (kind === 'pane-vnavigator') {
335
- boxWidth = to(theme.shapes.vnavigatorButtonSize, cssUnit);
336
- boxHeight = to(theme.shapes.vnavigatorButtonSize, cssUnit);
337
- boxMarginBottom = to(1, cssUnit);
338
- backgroundColor = theme.palette.vnavigatorButtonInactiveBackground;
339
- borderStyle = 'none';
340
- activeColor = theme.palette.vnavigatorButtonActiveBackground;
341
- }
342
-
343
- // Footer button (usual parent is container with kind='footer').
344
- if (kind === 'button-footer') {
345
- boxHeight = to(theme.shapes.footerHeight, cssUnit);
346
- boxMarginRight = to(1, cssUnit);
347
- boxPaddingRight = m;
348
- boxPaddingLeft = m;
349
- if (text) {
350
- backgroundColor = theme.palette.footerTextBackground;
351
- } else {
352
- backgroundColor = theme.palette.footerBackground;
353
- }
354
- borderStyle = 'none';
355
- }
356
-
357
- // Notification button (usual parent is container with kind='notification-header').
358
- if (kind === 'button-notification') {
359
- boxHeight = to(32, cssUnit);
360
- backgroundColor = 'transparent';
361
- borderStyle = 'none';
362
- backgroundHoverColor = 'transparent';
363
- specialDisabled = true;
364
- }
365
- if (kind === 'notification-close') {
366
- boxMarginTop = Unit.multiply(to(theme.shapes.containerMargin, cssUnit), -1);
367
- borderStyle = 'none';
368
- backgroundColor = 'transparent';
369
- backgroundHoverColor = 'transparent';
370
- }
371
- if (kind === 'notification-extend') {
372
- boxMarginBottom = Unit.multiply(
373
- to(theme.shapes.containerMargin, cssUnit),
374
- -1
375
- );
376
- borderStyle = 'none';
377
- backgroundColor = 'transparent';
378
- backgroundHoverColor = 'transparent';
379
- }
380
-
381
- if (kind === 'check-button') {
382
- backgroundColor = 'transparent';
383
- borderStyle = 'none';
384
- backgroundHoverColor = 'transparent';
385
- focusedShadow = null;
386
- if (heightStrategy === 'compact') {
387
- boxHeight = to(22, cssUnit);
388
- }
389
- specialDisabled = true;
390
- }
391
-
392
- if (kind === 'plugin-light') {
393
- backgroundColor = 'transparent';
394
- borderStyle = 'none';
395
- backgroundHoverColor = theme.palette.pluginLightButtonBackgroundHover;
396
- focusedShadow = null;
397
- }
398
- if (kind === 'plugin-dark') {
399
- backgroundColor = 'transparent';
400
- borderStyle = 'none';
401
- backgroundHoverColor = theme.palette.pluginDarkButtonBackgroundHover;
402
- focusedShadow = null;
403
- }
404
-
405
- // Warning button (usual parent is container with kind='footer').
406
- if (kind === 'warning') {
407
- boxHeight = to(theme.shapes.footerHeight, cssUnit);
408
- boxPaddingLeft = to(theme.shapes.warningLeftPadding, cssUnit);
409
- borderStyle = 'none';
410
- backgroundColor = theme.palette.warningBackground;
411
- }
412
-
413
- // Action button (usual parent is container with kind='actions').
414
- if (kind === 'action') {
415
- let place = placeProp || 'middle';
416
- if (place === '1/1') {
417
- place = 'single';
418
- } else if (place.indexOf('/') !== -1) {
419
- const n = place.split('/');
420
- if (n.length === 2) {
421
- if (n[0] === '1') {
422
- place = 'left';
423
- } else if (n[0] === n[1]) {
424
- place = 'right';
425
- } else {
426
- place = 'middle';
427
- }
428
- }
429
- }
430
- const r = to(theme.shapes.actionRadius, cssUnit);
431
- boxHeight = to(theme.shapes.actionHeight, cssUnit);
432
- boxPaddingLeft = Unit.multiply(to(theme.shapes.actionHeight, cssUnit), 0.1);
433
- borderStyle = 'none';
434
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
435
- backgroundColor = theme.palette.actionButtonBackground;
436
- if (place === 'left') {
437
- boxMarginRight = to(1, cssUnit);
438
- borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
439
- } else if (place === 'right') {
440
- borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
441
- } else if (place === 'single') {
442
- borderRadius = r;
443
- } else {
444
- boxMarginRight = to(1, cssUnit);
445
- }
446
- }
447
-
448
- // Action button (usual parent is container with kind='actions-line-secondary').
449
- if (kind === 'secondary-action') {
450
- let place = placeProp || 'middle';
451
- if (place === '1/1') {
452
- place = 'single';
453
- } else if (place.indexOf('/') !== -1) {
454
- const n = place.split('/');
455
- if (n.length === 2) {
456
- if (n[0] === '1') {
457
- place = 'left';
458
- } else if (n[0] === n[1]) {
459
- place = 'right';
460
- } else {
461
- place = 'middle';
462
- }
463
- }
464
- }
465
- const r = to(theme.shapes.secondaryActionRadius, cssUnit);
466
- boxHeight = to(theme.shapes.secondaryActionHeight, cssUnit);
467
- borderStyle = 'none';
468
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
469
- backgroundColor = theme.palette.actionButtonBackground;
470
- boxPaddingRight = to(theme.shapes.secondaryActionPadding, cssUnit);
471
- if (place === 'left') {
472
- boxMarginRight = to(1, cssUnit);
473
- borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
474
- } else if (place === 'right') {
475
- borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
476
- } else if (place === 'single') {
477
- borderRadius = r;
478
- } else {
479
- boxMarginRight = to(1, cssUnit);
480
- }
481
- }
482
-
483
- // Subaction button (usual parent is container with kind='row-pane' and subkind='box').
484
- if (kind === 'subaction') {
485
- borderStyle = 'none';
486
- backgroundColor = theme.palette.subactionButtonBackground;
487
- }
488
-
489
- if (kind === 'table-action-frame') {
490
- let place = placeProp || 'middle';
491
- if (place === '1/1') {
492
- place = 'single';
493
- } else if (place.indexOf('/') !== -1) {
494
- const n = place.split('/');
495
- if (n.length === 2) {
496
- if (n[0] === '1') {
497
- place = 'left';
498
- } else if (n[0] === n[1]) {
499
- place = 'right';
500
- } else {
501
- place = 'middle';
502
- }
503
- }
504
- }
505
- const r = to(theme.shapes.tableActionRadius, cssUnit);
506
- boxHeight = to(theme.shapes.tableActionHeight, cssUnit);
507
- borderStyle = 'none solid solid solid';
508
- borderColor = theme.palette.tableBorder;
509
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
510
- backgroundColor = theme.palette.tableActionBackground;
511
- if (place === 'left') {
512
- borderRadius =
513
- `${to(0, cssUnit)} ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
514
- } else if (place === 'right') {
515
- borderRadius =
516
- `${to(0, cssUnit)} ${to(0, cssUnit)} ` + r + ` ${to(0, cssUnit)}`;
517
- } else if (place === 'single') {
518
- borderRadius = `${to(0, cssUnit)} ${to(0, cssUnit)} ` + r + ' ' + r;
519
- }
520
- if (grow === '0') {
521
- borderStyle = 'none';
522
- }
523
- transition = null;
524
- }
525
- if (kind === 'table-action') {
526
- boxHeight = to(theme.shapes.tableActionHeight, cssUnit);
527
- borderStyle = 'none solid solid solid';
528
- borderColor = theme.palette.tableBorder;
529
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
530
- backgroundColor = theme.palette.tableActionBackground;
531
- borderStyle = 'none';
532
- transition = null;
533
- }
534
-
535
- if (kind === 'tree-expand') {
536
- boxWidth = to(theme.shapes.treeExpandButtonWidth, cssUnit);
537
- boxMaxWidth = to(theme.shapes.treeExpandButtonWidth, cssUnit);
538
- borderStyle = 'none';
539
- backgroundColor = 'transparent';
540
- backgroundHoverColor = 'transparent';
541
- }
542
-
543
- // Combo button, place to the right of a TextFieldCombo component.
544
- if (kind === 'combo') {
545
- const w = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.8);
546
- boxWidth = w;
547
- boxMinWidth = w;
548
- boxSizing = 'content-box';
549
- activeColor = theme.palette.comboActiveBackground;
550
- borderActiveColor = theme.palette.comboActiveBackground;
551
- if (disabled) {
552
- borderColor = theme.palette.textFieldDisableText;
553
- backgroundColor = theme.palette.textFieldDisableBackground;
554
- specialDisabled = true;
555
- }
556
- backgroundHoverColor = theme.palette.comboButtonBackgroundHover;
557
- }
558
-
559
- if (kind === 'round') {
560
- const r = to(theme.shapes.actionRadius, cssUnit);
561
- borderRadius = r;
562
- borderStyle = 'none';
563
- backgroundColor = theme.palette.roundButtonBackground;
564
- }
565
-
566
- if (kind === 'identity') {
567
- const r = to(theme.shapes.actionRadius, cssUnit);
568
- boxWidth = to(theme.shapes.identityHeight, cssUnit);
569
- boxHeight = to(theme.shapes.identityHeight, cssUnit);
570
- borderRadius = r;
571
- borderStyle = 'none';
572
- backgroundColor = theme.palette.identityButtonBackground;
573
- }
574
-
575
- if (kind === 'thin-left') {
576
- const r = to(theme.shapes.thinRadius, cssUnit);
577
- boxHeight = null;
578
- borderStyle = 'none solid none none';
579
- borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
580
- borderColor = theme.palette.buttonBorder;
581
- backgroundColor = null;
582
- }
583
- if (kind === 'thin-right') {
584
- const r = to(theme.shapes.thinRadius, cssUnit);
585
- boxHeight = null;
586
- borderStyle = 'none none none solid';
587
- borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
588
- borderColor = theme.palette.buttonBorder;
589
- backgroundColor = null;
590
- }
591
-
592
- if (kind === 'menu-item') {
593
- boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
594
- boxMarginBottom = to(1, cssUnit);
595
- boxPaddingRight = to(theme.shapes.containerMargin, cssUnit);
596
- boxPaddingLeft = to(theme.shapes.containerMargin, cssUnit);
597
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
598
- borderStyle = 'none';
599
- backgroundColor = theme.palette.menuItemInactiveBackground;
600
- if (focused) {
601
- activeColor = theme.palette.menuItemFocusBackground;
602
- } else {
603
- activeColor = theme.palette.menuItemActiveBackground;
604
- }
605
- }
606
-
607
- if (kind === 'combo-item') {
608
- boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
609
- boxPaddingRight = to(theme.shapes.containerMargin, cssUnit);
610
- boxPaddingLeft = to(theme.shapes.containerMargin, cssUnit);
611
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
612
- borderStyle = 'none';
613
- backgroundColor = theme.palette.comboItemBackground;
614
- if (focused) {
615
- activeColor = theme.palette.comboItemFocused;
616
- } else {
617
- activeColor = theme.palette.comboItemActive;
618
- }
619
- backgroundHoverColor = theme.palette.comboItemHover;
620
- }
621
- if (kind === 'flat-list-combo-item') {
622
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
623
- borderStyle = 'none';
624
- backgroundColor = theme.palette.comboItemBackground;
625
- if (focused) {
626
- activeColor = theme.palette.comboItemFocused;
627
- } else {
628
- activeColor = theme.palette.comboItemActive;
629
- }
630
- borderRadius = Unit.multiply(to(theme.shapes.smoothRadius, cssUnit), 0.5);
631
- backgroundHoverColor = theme.palette.comboItemHover;
632
- }
633
-
634
- if (kind === 'combo-wrap-item') {
635
- boxMaxWidth = boxWidth ? boxWidth : null;
636
- boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
637
- boxMaxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
638
- boxPaddingRight = to(theme.shapes.containerMargin, cssUnit);
639
- boxPaddingLeft = to(theme.shapes.containerMargin, cssUnit);
640
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
641
- borderStyle = 'none';
642
- backgroundColor = theme.palette.comboItemBackground;
643
- if (focused) {
644
- activeColor = theme.palette.comboItemFocused;
645
- } else {
646
- activeColor = theme.palette.comboItemActive;
647
- }
648
- backgroundHoverColor = theme.palette.comboItemHover;
649
- }
650
-
651
- if (kind === 'glyph-item') {
652
- boxWidth = to(theme.shapes.glyphsDialogButtonWidth, cssUnit);
653
- boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
654
- boxMarginRight = to(theme.shapes.glyphsDialogButtonMargin, cssUnit);
655
- boxMarginBottom = to(theme.shapes.glyphsDialogButtonMargin, cssUnit);
656
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
657
- activeColor = theme.palette.boxActiveBackground;
658
- }
659
-
660
- if (kind === 'desk-title') {
661
- boxHeight = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 1.2);
662
- borderStyle = 'solid';
663
- borderColor = 'transparent';
664
- borderWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
665
- borderRadius = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.25);
666
- boxSizing = 'border-box';
667
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
668
- boxMarginBottom = to(3, cssUnit);
669
- backgroundColor = null;
670
- backgroundHoverColor = theme.palette.ticketGlueHilitedBackground;
671
- borderHoverStyle = 'solid';
672
- borderHoverColor = theme.palette.ticketHover;
673
- borderHoverWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
674
- activeColor = theme.palette.ticketHilitedBackground;
675
- borderActiveColor = theme.palette.ticketHilitedBackground;
676
- }
677
-
678
- if (kind === 'task-show-footer') {
679
- boxHeight = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 1.2);
680
- borderStyle = 'solid';
681
- borderColor = 'transparent';
682
- borderWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
683
- borderRadius = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.25);
684
- boxSizing = 'border-box';
685
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-end';
686
- boxMarginBottom = to(3, cssUnit);
687
- backgroundColor = null;
688
- backgroundHoverColor = theme.palette.ticketGlueHilitedBackground;
689
- borderHoverStyle = 'solid';
690
- borderHoverColor = theme.palette.ticketHover;
691
- borderHoverWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
692
- activeColor = theme.palette.ticketHilitedBackground;
693
- borderActiveColor = theme.palette.ticketHilitedBackground;
694
- }
695
-
696
- // Button with a day in Calendar component.
697
- if (
698
- kind === 'calendar' ||
699
- kind === 'calendar-navigator' ||
700
- kind === 'calendar-list' ||
701
- kind === 'calendar-title'
702
- ) {
703
- borderStyle = 'none';
704
- if (kind === 'calendar' || kind === 'calendar-navigator') {
705
- boxWidth = to(theme.shapes.calendarButtonWidth, cssUnit);
706
- }
707
- boxHeight = to(theme.shapes.calendarButtonHeight, cssUnit);
708
- transition = null;
709
- backgroundColor = 'transparent';
710
- backgroundHoverColor = ColorManipulator.lighten(activeColor, 0.3);
711
- if (subkind === 'add') {
712
- activeColor = theme.palette.calendarActiveAddBackground;
713
- } else if (subkind === 'sub') {
714
- activeColor = theme.palette.calendarActiveSubBackground;
715
- } else {
716
- activeColor = theme.palette.calendarActiveBackground;
717
- backgroundHoverColor = theme.palette.calendarHoverBackground;
718
- }
719
- if (kind === 'calendar-title') {
720
- boxPaddingLeft = to(5, cssUnit);
721
- boxPaddingRight = to(5, cssUnit);
722
- }
723
- specialDisabled = true;
724
- }
725
-
726
- if (kind === 'container') {
727
- boxHeight = null;
728
- boxAlignItems = 'stretch';
729
- borderStyle = 'none';
730
- boxPaddingTop = Unit.multiply(to(theme.shapes.lineSpacing, cssUnit), 0.5);
731
- boxPaddingBottom = Unit.multiply(
732
- to(theme.shapes.lineSpacing, cssUnit),
733
- 0.5
734
- );
735
- backgroundColor = null;
736
- activeColor = theme.palette.boxActiveBackground;
737
- }
738
-
739
- if (kind === 'container-start') {
740
- boxHeight = null;
741
- boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
742
- boxAlignItems = 'stretch';
743
- borderStyle = 'none';
744
- boxPaddingTop = Unit.multiply(to(theme.shapes.lineSpacing, cssUnit), 0.5);
745
- boxPaddingBottom = Unit.multiply(
746
- to(theme.shapes.lineSpacing, cssUnit),
747
- 0.5
748
- );
749
- backgroundColor = null;
750
- }
751
-
752
- if (kind === 'box') {
753
- boxAlignItems = 'stretch';
754
- borderStyle = 'none';
755
- boxMarginRight = m;
756
- boxMarginBottom = m;
757
- backgroundColor = theme.palette.boxBackground;
758
- activeColor = theme.palette.boxActiveBackground;
759
- }
760
-
761
- if (kind === 'chronos-navigator') {
762
- boxMarginBottom = to(1, cssUnit);
763
- borderRadius = to(theme.shapes.smoothRadius, cssUnit);
764
- backgroundHoverColor = ColorManipulator.fade(
765
- theme.palette.buttonBackground,
766
- 0.3
767
- );
768
- activeColor = theme.palette.boxActiveBackground;
769
- }
770
-
771
- if (kind === 'recurrence') {
772
- boxMinWidth = to(theme.shapes.lineHeight, cssUnit);
773
- boxMaxHeight = to(theme.shapes.lineHeight, cssUnit);
774
- activeColor = theme.palette.calendarActiveBackground;
775
- borderActiveColor = theme.palette.calendarActiveText;
776
- }
777
-
778
- if (kind === 'hover') {
779
- boxOpacity = active ? 1 : 0.00001;
780
- borderWidth = to(4, cssUnit);
781
- borderColor = theme.palette.taskBackground;
782
- backgroundHoverColor = theme.palette.buttonBackground;
783
- borderActiveColor = theme.palette.taskBackground;
784
- }
785
-
786
- if (kind === 'dynamic-toolbar-left') {
787
- borderStyle = 'none';
788
- backgroundColor = 'transparent';
789
- activeColor = theme.palette.dynamicToolbarBackground;
790
- }
791
- if (kind === 'dynamic-toolbar-top-left') {
792
- borderStyle = 'none solid solid none';
793
- backgroundColor = theme.palette.paneBackground;
794
- }
795
- if (kind === 'dynamic-toolbar-top-right') {
796
- borderStyle = 'none none solid solid';
797
- backgroundColor = theme.palette.paneBackground;
798
- }
799
- if (kind === 'dynamic-toolbar') {
800
- boxMinWidth = to(theme.shapes.toolbarButtonWidth, cssUnit);
801
- boxHeight = to(theme.shapes.toolbarButtonHeight, cssUnit);
802
- borderStyle = 'none';
803
- backgroundColor = ColorManipulator.emphasize(
804
- theme.palette.toolbarInactiveBackground,
805
- 0.1
806
- );
807
- activeColor = theme.palette.toolbarActiveBackground;
808
- }
809
- if (kind === 'toolbar') {
810
- boxMinWidth = to(theme.shapes.toolbarButtonWidth, cssUnit);
811
- boxHeight = to(theme.shapes.toolbarButtonHeight, cssUnit);
812
- borderStyle = 'none';
813
- backgroundColor = theme.palette.toolbarInactiveBackground;
814
- activeColor = theme.palette.toolbarActiveBackground;
815
- }
816
-
817
- if (kind === 'flat-combo') {
818
- backgroundColor = disabled
819
- ? theme.palette.flatComboDisableInactiveBackground
820
- : theme.palette.flatComboInactiveBackground;
821
- activeColor = disabled
822
- ? theme.palette.flatComboDisableActiveBackground
823
- : theme.palette.flatComboActiveBackground;
824
- specialDisabled = true;
825
- }
826
-
827
- if (kind === 'pane-warning') {
828
- boxWidth = to(40, cssUnit);
829
- boxHeight = to(40, cssUnit);
830
- backgroundColor = 'transparent';
831
- borderStyle = 'none';
832
- }
833
-
834
- if (!kind) {
835
- borderRadius = to(theme.shapes.smoothRadius, cssUnit);
836
- activeColor = theme.palette.boxActiveBackground;
837
- }
838
-
839
- if (theme.look.name === 'retro' && (!kind || kind === 'combo')) {
840
- backgroundColor = '#ccc';
841
- borderColor =
842
- kind === 'combo' ? '#aaa #888 #666 #999' : '#eee #666 #444 #ddd';
843
- borderWidth = to(1, cssUnit);
844
- borderStyle = 'solid';
845
- boxShadow =
846
- `rgba(0, 0, 0, 0.4) ` +
847
- `${to(2, cssUnit)} ${to(3, cssUnit)} ` +
848
- `${to(10, cssUnit)} ${to(0, cssUnit)}`;
849
-
850
- if (disabled) {
851
- backgroundColor = theme.palette.buttonDisableBackground;
852
- specialDisabled = true;
853
- }
854
- }
855
-
856
- if (badgePush) {
857
- boxPaddingRight = Unit.add(
858
- to(boxPaddingRight, cssUnit),
859
- to(theme.shapes.badgeHeight, cssUnit)
860
- );
861
- }
862
- if (
863
- shortcut &&
864
- kind !== 'menu-item' &&
865
- kind !== 'combo-item' &&
866
- kind !== 'flat-list-combo-item' &&
867
- kind !== 'task-bar' &&
868
- kind !== 'task-logo'
869
- ) {
870
- boxPaddingRight = Unit.add(boxPaddingRight, m);
871
- }
872
-
873
- if (shape) {
874
- const r = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.5);
875
- const s = to(theme.shapes.smoothRadius, cssUnit);
876
- if (shape === 'rounded') {
877
- borderRadius = r;
878
- } else if (shape === 'left-rounded') {
879
- borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
880
- } else if (shape === 'right-rounded') {
881
- borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
882
- } else if (shape === 'smooth') {
883
- borderRadius = s;
884
- } else if (shape === 'left-smooth') {
885
- borderRadius = s + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + s;
886
- } else if (shape === 'right-smooth') {
887
- borderRadius = `${to(0, cssUnit)} ` + s + ' ' + s + ` ${to(0, cssUnit)}`;
888
- }
889
- }
890
-
891
- if (backgroundColorProp) {
892
- backgroundColor = ColorHelpers.getMarkColor(theme, backgroundColorProp);
893
- }
894
- if (activeColorProp) {
895
- activeColor = ColorHelpers.getMarkColor(theme, activeColorProp);
896
- }
897
-
898
- if (active || focused) {
899
- backgroundColor = activeColor;
900
- borderColor = borderActiveColor;
901
- }
902
-
903
- // Compute colors for glyph, text and hover if necessary.
904
- let buttonBackgroundColor = backgroundColor;
905
- if (!buttonBackgroundColor || buttonBackgroundColor === 'transparent') {
906
- buttonBackgroundColor = theme.palette.buttonBackground;
907
- }
908
- if (!backgroundHoverColor) {
909
- backgroundHoverColor = ColorManipulator.emphasize(
910
- buttonBackgroundColor,
911
- 0.2
912
- );
913
- }
914
-
915
- // Alter colors if component is disable.
916
- if (disabled && !specialDisabled) {
917
- borderColor = theme.palette.buttonDisableBorder;
918
- if (backgroundColor) {
919
- backgroundColor = theme.palette.buttonDisableBackground;
920
- }
921
- }
922
-
923
- if (borderColorForced) {
924
- borderColor = borderColorForced;
925
- }
926
-
927
- // If component has specific width and border, reduce the width to
928
- // take into account the thickness of the borders left and right.
929
- // Buttons without left or right border (with only bottom border) are
930
- // considered as without border (for example task button).
931
- if (
932
- boxWidth &&
933
- boxWidth !== to(0, cssUnit) &&
934
- !borderStyle.startsWith('none') &&
935
- boxSizing !== 'border-box'
936
- ) {
937
- boxWidth = Unit.sub(boxWidth, Unit.multiply(borderWidth, 2));
938
- }
939
-
940
- if (boxFlexGrow) {
941
- boxFlexShrink = '1';
942
- boxFlexBasis = '0%';
943
- }
944
-
945
- if (vpos === 'top') {
946
- boxAlignSelf = 'flex-start';
947
- } else if (vpos === 'first-line') {
948
- boxAlignSelf = 'flex-start';
949
- boxMarginTop = to(3, cssUnit);
950
- }
951
-
952
- if (!boxJustifyContent) {
953
- boxJustifyContent = 'center';
954
- }
955
- if (boxJustifyContent === 'none') {
956
- boxJustifyContent = null;
957
- }
958
-
959
- const isGradient = isColorGradient(backgroundColor);
960
-
961
- const boxStyle = {
962
- opacity: boxOpacity,
963
- overflow: 'hidden',
964
- width: boxWidth,
965
- minWidth: boxMinWidth,
966
- maxWidth: boxMaxWidth,
967
- height: boxHeight,
968
- minHeight: boxHeight,
969
- maxHeight: boxMaxHeight,
970
- left: left,
971
- right: right,
972
- top: top,
973
- bottom: bottom,
974
- display: 'flex',
975
- flexDirection: boxFlexDirection,
976
- flexGrow: boxFlexGrow,
977
- flexShrink: boxFlexShrink,
978
- flexBasis: boxFlexBasis,
979
- justifyContent: boxJustifyContent,
980
- alignItems: boxAlignItems,
981
- alignSelf: boxAlignSelf,
982
- borderWidth: borderWidth,
983
- borderColor: borderColor,
984
- borderStyle: borderStyle,
985
- borderRadius: borderRadius,
986
- boxSizing: boxSizing,
987
- boxShadow: boxShadow,
988
- paddingTop: boxPaddingTop,
989
- paddingRight: boxPaddingRight,
990
- paddingBottom: boxPaddingBottom,
991
- paddingLeft: boxPaddingLeft,
992
- marginTop: boxMarginTop,
993
- marginRight: boxMarginRight,
994
- marginBottom: boxMarginBottom,
995
- marginLeft: boxMarginLeft,
996
- backgroundColor: isGradient ? null : backgroundColor,
997
- background: isGradient ? backgroundColor : null,
998
- position: boxPosition,
999
- transition: transition,
1000
- zIndex: boxZIndex,
1001
- textDecoration: 'none',
1002
- userSelect: 'none',
1003
- cursor: cursor,
1004
- };
1005
-
1006
- if (!disabled && !busy && boxOpacity !== 0) {
1007
- const isGradient = isColorGradient(backgroundHoverColor);
1008
- boxStyle[':hover'] = {
1009
- borderColor: borderHoverColor,
1010
- borderStyle: borderHoverStyle,
1011
- borderWidth: borderHoverWidth,
1012
- backgroundColor: isGradient ? null : backgroundHoverColor,
1013
- background: isGradient ? backgroundHoverColor : null,
1014
- opacity: 1.0,
1015
- };
1016
- boxStyle[':active'] = {
1017
- backgroundColor: backgroundColor
1018
- ? ColorManipulator.darken(backgroundColor, 0.1)
1019
- : 'rgba(0, 0, 0, 0.1)',
1020
- };
1021
- }
1022
-
1023
- if (focusable) {
1024
- boxStyle[':focus'] = {
1025
- outline: 'none',
1026
- boxShadow: focusedShadow,
1027
- };
1028
- } else {
1029
- boxStyle[':focus'] = {
1030
- outline: 'none',
1031
- };
1032
- }
1033
-
1034
- // Generate a triangle with subtle css, see:
1035
- // https://css-tricks.com/snippets/css/css-triangle/
1036
- const d = to(triangleSize || theme.shapes.mainTabTriangleSize, cssUnit);
1037
- const triangleStyle = {
1038
- position: 'absolute',
1039
- right: '50%',
1040
- bottom: to(0, cssUnit),
1041
- borderLeft: `${d} solid transparent`,
1042
- borderRight: `${d} solid transparent`,
1043
- borderBottom: `${d} solid ${
1044
- triangleColor || theme.palette.viewTabBackground
1045
- }`,
1046
- margin: `${to(0, cssUnit)} -${d} ${to(0, cssUnit)} ${to(0, cssUnit)}`,
1047
- userSelect: 'none',
1048
- };
1049
-
1050
- const busyBoxStyle = {
1051
- position: 'absolute',
1052
- width: '100%',
1053
- height: '100%',
1054
- display: 'flex',
1055
- backgroundColor: theme.palette.busyBackground,
1056
- };
1057
-
1058
- const busyGlyphStyle = {
1059
- margin: 'auto',
1060
- color: theme.palette.busyForeground,
1061
- };
1062
-
1063
- const focusedForegroundStyle = {
1064
- position: 'absolute',
1065
- left: to(8, cssUnit),
1066
- width: `calc(100% - ${to(14, cssUnit)})`,
1067
- height: `calc(100% - ${to(14, cssUnit)})`,
1068
- backgroundColor: ColorManipulator.fade(theme.palette.focused, 0.2),
1069
- boxShadow: theme.shapes.focusedShadow + theme.palette.focused, // FIXME
1070
- borderRadius: m,
1071
- };
1072
-
1073
- return {
1074
- button: boxStyle,
1075
- triangle: triangleStyle,
1076
- busyBox: busyBoxStyle,
1077
- busyGlyph: busyGlyphStyle,
1078
- focusedForeground: focusedForegroundStyle,
1079
- };
1080
- }
1081
-
1082
- /******************************************************************************/
1
+ import {Unit} from 'goblin-theme';
2
+ import {ColorHelpers} from 'goblin-theme';
3
+ import {ColorManipulator} from 'goblin-theme';
4
+ import * as SpacingHelpers from 'goblin-gadgets/widgets/helpers/spacing-helpers';
5
+ const to = Unit.to;
6
+
7
+ function convertJustify(justify) {
8
+ switch (justify) {
9
+ case 'start':
10
+ return 'flex-start';
11
+ case 'end':
12
+ return 'flex-end';
13
+ case 'around':
14
+ return 'space-around';
15
+ case 'between':
16
+ return 'space-between';
17
+ default:
18
+ return justify;
19
+ }
20
+ }
21
+
22
+ function isColorGradient(color) {
23
+ return (
24
+ color &&
25
+ (color.startsWith('linear-gradient(') ||
26
+ color.startsWith('radial-gradient(') ||
27
+ color.startsWith('repeating-linear-gradient('))
28
+ );
29
+ }
30
+
31
+ /******************************************************************************/
32
+
33
+ export const propNames = [
34
+ 'width',
35
+ 'height',
36
+ 'grow',
37
+ 'justify',
38
+ 'zIndex',
39
+ 'visibility',
40
+ 'position',
41
+ 'cursor',
42
+ 'disabled',
43
+ 'readonly',
44
+ 'border',
45
+ 'horizontalSpacing',
46
+ 'leftSpacing',
47
+ 'kind',
48
+ 'text',
49
+ 'heightStrategy',
50
+ 'place',
51
+ 'active',
52
+ 'focused',
53
+ 'subkind',
54
+ 'badgePush',
55
+ 'shortcut',
56
+ 'shape',
57
+ 'backgroundColor',
58
+ 'activeColor',
59
+ 'vpos',
60
+ 'left',
61
+ 'right',
62
+ 'top',
63
+ 'bottom',
64
+ 'busy',
65
+ 'focusable',
66
+ 'triangleSize',
67
+ 'triangleColor',
68
+ 'cssUnit',
69
+ ];
70
+
71
+ export function mapProps(props) {
72
+ return {
73
+ ...props,
74
+ text: Boolean(props.text),
75
+ };
76
+ }
77
+
78
+ export default function styles(theme, props) {
79
+ let {
80
+ width,
81
+ height,
82
+ grow,
83
+ justify,
84
+ zIndex,
85
+ visibility,
86
+ position,
87
+ cursor,
88
+ disabled,
89
+ readonly,
90
+ border,
91
+ horizontalSpacing,
92
+ leftSpacing,
93
+ kind,
94
+ text,
95
+ heightStrategy,
96
+ place: placeProp,
97
+ active,
98
+ focused,
99
+ subkind,
100
+ badgePush,
101
+ shortcut,
102
+ shape,
103
+ backgroundColor: backgroundColorProp,
104
+ activeColor: activeColorProp,
105
+ vpos,
106
+ left,
107
+ right,
108
+ top,
109
+ bottom,
110
+ busy,
111
+ focusable,
112
+ triangleSize,
113
+ triangleColor,
114
+ cssUnit = 'px',
115
+ } = props;
116
+
117
+ const m = Unit.multiply(to(theme.shapes.containerMargin, cssUnit), 0.5);
118
+
119
+ // Initialize all variables for a standard button.
120
+ let boxWidth = width;
121
+ let boxMinWidth = null;
122
+ let boxHeight = height ? height : to(theme.shapes.lineHeight, cssUnit);
123
+ let boxMaxWidth = null;
124
+ let boxMaxHeight = null;
125
+ let boxFlexDirection = 'row';
126
+ let boxFlexGrow = grow;
127
+ let boxFlexShrink = null;
128
+ let boxFlexBasis = null;
129
+ let boxJustifyContent = convertJustify(justify);
130
+ let boxAlignItems = 'center';
131
+ let boxAlignSelf = null;
132
+ let boxMarginTop = to(0, cssUnit);
133
+ let boxMarginRight = to(0, cssUnit);
134
+ let boxMarginBottom = to(0, cssUnit);
135
+ let boxMarginLeft = to(0, cssUnit);
136
+ let boxPaddingTop = to(theme.shapes.boxPaddingTop, cssUnit);
137
+ let boxPaddingRight = to(theme.shapes.boxPaddingRight, cssUnit);
138
+ let boxPaddingBottom = to(theme.shapes.boxPaddingBottom, cssUnit);
139
+ let boxPaddingLeft = to(theme.shapes.boxPaddingLeft, cssUnit);
140
+ let boxZIndex = zIndex;
141
+ let boxOpacity = visibility === false ? 0 : null;
142
+ let borderWidth = to(theme.shapes.buttonBorderWidth, cssUnit);
143
+ let borderColor = theme.palette.buttonBorderColor;
144
+ let borderColorForced = null;
145
+ let borderActiveColor = theme.palette.buttonBorderColor;
146
+ let borderStyle = 'solid';
147
+ let borderRadius = to(0, cssUnit);
148
+ let boxSizing = null;
149
+ let boxShadow = null;
150
+ let backgroundColor = theme.palette.buttonBackground;
151
+ let activeColor = theme.palette.boxActiveBackground;
152
+ let borderHoverColor = null;
153
+ let borderHoverStyle = null;
154
+ let borderHoverWidth = null;
155
+ let backgroundHoverColor = null;
156
+ let boxPosition = position ? position : 'relative';
157
+ cursor = cursor || 'default';
158
+ let transition =
159
+ (cssUnit === 'px' || cssUnit.unit === 'px') && theme.transitions.easeOut();
160
+ let specialDisabled = false;
161
+ let focusedShadow = theme.shapes.focusedShadow + theme.palette.focused; // FIXME: use 'to' with cssUnit
162
+
163
+ disabled = disabled || readonly;
164
+
165
+ // Initialize variables for button without border.
166
+ if (border === 'none') {
167
+ // Button without border must have same backgroundColor as parent !
168
+ borderStyle = 'none';
169
+ backgroundColor = null;
170
+ }
171
+
172
+ boxMarginRight = SpacingHelpers.getHorizontalSpacingRightMargin(
173
+ theme,
174
+ horizontalSpacing
175
+ );
176
+
177
+ if (leftSpacing === 'overlap') {
178
+ boxMarginLeft = to(-1, cssUnit);
179
+ }
180
+
181
+ if (kind === 'disabled-light') {
182
+ specialDisabled = true;
183
+ }
184
+
185
+ // task-logo button (usual parent container with kind='task-bar').
186
+ if (kind === 'task-logo') {
187
+ boxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
188
+ boxMaxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
189
+ boxHeight = to(theme.shapes.taskButtonHeight, cssUnit);
190
+ boxFlexDirection = 'column';
191
+ borderStyle = 'none';
192
+ backgroundColor = theme.palette.taskLogoBackground;
193
+ activeColor = theme.palette.taskTabActiveBackground;
194
+ }
195
+
196
+ // Task button (usual parent is container with kind='task-bar').
197
+ if (kind === 'task-bar') {
198
+ boxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
199
+ boxMaxWidth = to(theme.shapes.taskButtonWidth, cssUnit);
200
+ boxHeight = to(theme.shapes.taskButtonHeight, cssUnit);
201
+ boxFlexDirection = 'column';
202
+ borderStyle = 'none none solid none';
203
+ borderColor = theme.palette.taskButtonBorder;
204
+ backgroundColor = theme.palette.taskButtonBackground;
205
+ }
206
+
207
+ // main-tab button (usual parent is container with kind='main-tab').
208
+ if (kind === 'main-tab') {
209
+ boxWidth = to(200, cssUnit);
210
+ boxHeight = to(theme.shapes.mainTabHeight, cssUnit);
211
+ boxPaddingLeft = Unit.multiply(m, 1.0);
212
+ boxPaddingRight = Unit.multiply(m, 1.0);
213
+ boxPaddingTop = Unit.multiply(m, 0.5);
214
+ boxPaddingBottom = Unit.multiply(m, 0.5);
215
+ boxMarginRight = to(1, cssUnit);
216
+ borderStyle = 'none';
217
+ backgroundColor = theme.palette.mainTabButtonInactiveBackground;
218
+ activeColor = theme.palette.mainTabButtonActiveBackground;
219
+
220
+ if (theme.look.name === 'retro') {
221
+ borderRadius =
222
+ `${to(25, cssUnit)} ${to(25, cssUnit)} ` +
223
+ `${to(0, cssUnit)} ${to(0, cssUnit)}`;
224
+ boxMarginTop = to(5, cssUnit);
225
+ boxMarginRight = to(0, cssUnit);
226
+ boxMarginBottom = to(0, cssUnit);
227
+ boxMarginLeft = to(5, cssUnit);
228
+ boxShadow =
229
+ `${to(3, cssUnit)} ${to(5, cssUnit)} ` +
230
+ `${to(21, cssUnit)} ${to(2, cssUnit)} rgba(0,0,0,0.7)`;
231
+ }
232
+ }
233
+
234
+ if (kind === 'main-tab-right') {
235
+ boxHeight = to(theme.shapes.mainTabHeight, cssUnit);
236
+ borderStyle = 'none';
237
+ backgroundColor = null;
238
+ activeColor = theme.palette.mainTabButtonActiveBackground;
239
+ backgroundHoverColor = theme.palette.mainTabButtonActiveBackground;
240
+ }
241
+
242
+ // view-tab button (usual parent is container with kind='view-tab').
243
+ if (
244
+ kind === 'view-tab' ||
245
+ kind === 'view-tab-first' ||
246
+ kind === 'view-tab-last' ||
247
+ kind === 'view-tab-single'
248
+ ) {
249
+ boxMaxWidth = to(250, cssUnit);
250
+ boxHeight = to(theme.shapes.viewTabHeight, cssUnit);
251
+ if (text) {
252
+ boxMarginTop = to(1, cssUnit);
253
+ boxMarginRight = to(1, cssUnit);
254
+ } else {
255
+ // When a text button is followed by a glyph button, the glyph button must
256
+ // be glued to the text button. Typically a close button: [Missions][x]
257
+ boxMarginTop = to(1, cssUnit);
258
+ boxMarginRight = to(1, cssUnit);
259
+ boxMarginLeft = to(-1, cssUnit);
260
+ }
261
+ borderStyle = 'none';
262
+ backgroundColor = theme.palette.viewTabButtonInactiveBackground;
263
+ activeColor = theme.palette.viewTabButtonActiveBackground;
264
+
265
+ if (theme.look.name === 'retro') {
266
+ if (kind === 'view-tab-first') {
267
+ boxMarginLeft = to(5, cssUnit);
268
+ borderRadius =
269
+ `${to(15, cssUnit)} ${to(0, cssUnit)} ` +
270
+ `${to(0, cssUnit)} ${to(0, cssUnit)}`;
271
+ }
272
+ if (kind === 'view-tab-last') {
273
+ borderRadius =
274
+ `${to(0, cssUnit)} ${to(15, cssUnit)} ` +
275
+ `${to(0, cssUnit)} ${to(0, cssUnit)}`;
276
+ }
277
+ if (kind === 'view-tab-single') {
278
+ boxMarginLeft = to(5, cssUnit);
279
+ borderRadius =
280
+ `${to(15, cssUnit)} ${to(15, cssUnit)} ` +
281
+ `${to(0, cssUnit)} ${to(0, cssUnit)}`;
282
+ }
283
+ }
284
+ }
285
+
286
+ if (kind === 'view-tab-right') {
287
+ boxHeight = Unit.add(
288
+ to(theme.shapes.containerMargin, cssUnit),
289
+ to(theme.shapes.viewTabHeight, cssUnit)
290
+ );
291
+ borderStyle = 'none';
292
+ if (text) {
293
+ backgroundColor = theme.palette.viewTabRightTextBackground;
294
+ } else {
295
+ backgroundColor = theme.palette.viewTabBackground;
296
+ }
297
+ }
298
+
299
+ // task-tab button (usual parent is container with kind='task-bar').
300
+ if (kind === 'task-tab') {
301
+ boxHeight = to(theme.shapes.taskTabHeight, cssUnit);
302
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
303
+ backgroundColor = theme.palette.taskTabInactiveBackground;
304
+ activeColor = theme.palette.taskTabActiveBackground;
305
+ borderStyle = 'none none solid none';
306
+ borderColor = theme.palette.taskButtonBorder;
307
+ }
308
+
309
+ // pane-navigator button (usual parent is container with kind='pane-navigator').
310
+ if (kind === 'pane-navigator') {
311
+ boxHeight = to(theme.shapes.paneNavigatorHeight, cssUnit);
312
+ boxMarginBottom = to(-1, cssUnit);
313
+ backgroundColor = theme.palette.paneNavigatorBackground;
314
+ borderStyle = 'none none solid none';
315
+ borderColor = theme.palette.paneNavigatorInactiveBorder;
316
+ borderActiveColor = theme.palette.paneNavigatorActiveBorder;
317
+ borderHoverColor = theme.palette.paneNavigatorBorderHover;
318
+ backgroundHoverColor = '#ffffff00'; // transparent
319
+ }
320
+
321
+ // pane-hnavigator button (usual parent is container with kind='pane-hnavigator').
322
+ if (kind === 'pane-hnavigator') {
323
+ boxHeight = to(theme.shapes.paneNavigatorHeight, cssUnit);
324
+ boxMarginBottom = to(-1, cssUnit);
325
+ backgroundColor = theme.palette.paneNavigatorBackground;
326
+ borderStyle = 'none none solid none';
327
+ borderColor = theme.palette.paneNavigatorInactiveBorder;
328
+ borderActiveColor = theme.palette.paneNavigatorActiveBorder;
329
+ borderHoverColor = theme.palette.paneNavigatorBorderHover;
330
+ backgroundHoverColor = '#ffffff00'; // transparent
331
+ }
332
+
333
+ // pane-vnavigator button (usual parent is container with kind='pane-vnavigator').
334
+ if (kind === 'pane-vnavigator') {
335
+ boxWidth = to(theme.shapes.vnavigatorButtonSize, cssUnit);
336
+ boxHeight = to(theme.shapes.vnavigatorButtonSize, cssUnit);
337
+ boxMarginBottom = to(1, cssUnit);
338
+ backgroundColor = theme.palette.vnavigatorButtonInactiveBackground;
339
+ borderStyle = 'none';
340
+ activeColor = theme.palette.vnavigatorButtonActiveBackground;
341
+ }
342
+
343
+ // Footer button (usual parent is container with kind='footer').
344
+ if (kind === 'button-footer') {
345
+ boxHeight = to(theme.shapes.footerHeight, cssUnit);
346
+ boxMarginRight = to(1, cssUnit);
347
+ boxPaddingRight = m;
348
+ boxPaddingLeft = m;
349
+ if (text) {
350
+ backgroundColor = theme.palette.footerTextBackground;
351
+ } else {
352
+ backgroundColor = theme.palette.footerBackground;
353
+ }
354
+ borderStyle = 'none';
355
+ }
356
+
357
+ // Notification button (usual parent is container with kind='notification-header').
358
+ if (kind === 'button-notification') {
359
+ boxHeight = to(32, cssUnit);
360
+ backgroundColor = 'transparent';
361
+ borderStyle = 'none';
362
+ backgroundHoverColor = 'transparent';
363
+ specialDisabled = true;
364
+ }
365
+ if (kind === 'notification-close') {
366
+ boxMarginTop = Unit.multiply(to(theme.shapes.containerMargin, cssUnit), -1);
367
+ borderStyle = 'none';
368
+ backgroundColor = 'transparent';
369
+ backgroundHoverColor = 'transparent';
370
+ }
371
+ if (kind === 'notification-extend') {
372
+ boxMarginBottom = Unit.multiply(
373
+ to(theme.shapes.containerMargin, cssUnit),
374
+ -1
375
+ );
376
+ borderStyle = 'none';
377
+ backgroundColor = 'transparent';
378
+ backgroundHoverColor = 'transparent';
379
+ }
380
+
381
+ if (kind === 'check-button') {
382
+ backgroundColor = 'transparent';
383
+ borderStyle = 'none';
384
+ backgroundHoverColor = 'transparent';
385
+ focusedShadow = null;
386
+ if (heightStrategy === 'compact') {
387
+ boxHeight = to(22, cssUnit);
388
+ }
389
+ specialDisabled = true;
390
+ }
391
+
392
+ if (kind === 'plugin-light') {
393
+ backgroundColor = 'transparent';
394
+ borderStyle = 'none';
395
+ backgroundHoverColor = theme.palette.pluginLightButtonBackgroundHover;
396
+ focusedShadow = null;
397
+ }
398
+ if (kind === 'plugin-dark') {
399
+ backgroundColor = 'transparent';
400
+ borderStyle = 'none';
401
+ backgroundHoverColor = theme.palette.pluginDarkButtonBackgroundHover;
402
+ focusedShadow = null;
403
+ }
404
+
405
+ // Warning button (usual parent is container with kind='footer').
406
+ if (kind === 'warning') {
407
+ boxHeight = to(theme.shapes.footerHeight, cssUnit);
408
+ boxPaddingLeft = to(theme.shapes.warningLeftPadding, cssUnit);
409
+ borderStyle = 'none';
410
+ backgroundColor = theme.palette.warningBackground;
411
+ }
412
+
413
+ // Action button (usual parent is container with kind='actions').
414
+ if (kind === 'action') {
415
+ let place = placeProp || 'middle';
416
+ if (place === '1/1') {
417
+ place = 'single';
418
+ } else if (place.indexOf('/') !== -1) {
419
+ const n = place.split('/');
420
+ if (n.length === 2) {
421
+ if (n[0] === '1') {
422
+ place = 'left';
423
+ } else if (n[0] === n[1]) {
424
+ place = 'right';
425
+ } else {
426
+ place = 'middle';
427
+ }
428
+ }
429
+ }
430
+ const r = to(theme.shapes.actionRadius, cssUnit);
431
+ boxHeight = to(theme.shapes.actionHeight, cssUnit);
432
+ boxPaddingLeft = Unit.multiply(to(theme.shapes.actionHeight, cssUnit), 0.1);
433
+ borderStyle = 'none';
434
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
435
+ backgroundColor = theme.palette.actionButtonBackground;
436
+ if (place === 'left') {
437
+ boxMarginRight = to(1, cssUnit);
438
+ borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
439
+ } else if (place === 'right') {
440
+ borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
441
+ } else if (place === 'single') {
442
+ borderRadius = r;
443
+ } else {
444
+ boxMarginRight = to(1, cssUnit);
445
+ }
446
+ }
447
+
448
+ // Action button (usual parent is container with kind='actions-line-secondary').
449
+ if (kind === 'secondary-action') {
450
+ let place = placeProp || 'middle';
451
+ if (place === '1/1') {
452
+ place = 'single';
453
+ } else if (place.indexOf('/') !== -1) {
454
+ const n = place.split('/');
455
+ if (n.length === 2) {
456
+ if (n[0] === '1') {
457
+ place = 'left';
458
+ } else if (n[0] === n[1]) {
459
+ place = 'right';
460
+ } else {
461
+ place = 'middle';
462
+ }
463
+ }
464
+ }
465
+ const r = to(theme.shapes.secondaryActionRadius, cssUnit);
466
+ boxHeight = to(theme.shapes.secondaryActionHeight, cssUnit);
467
+ borderStyle = 'none';
468
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
469
+ backgroundColor = theme.palette.actionButtonBackground;
470
+ boxPaddingRight = to(theme.shapes.secondaryActionPadding, cssUnit);
471
+ if (place === 'left') {
472
+ boxMarginRight = to(1, cssUnit);
473
+ borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
474
+ } else if (place === 'right') {
475
+ borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
476
+ } else if (place === 'single') {
477
+ borderRadius = r;
478
+ } else {
479
+ boxMarginRight = to(1, cssUnit);
480
+ }
481
+ }
482
+
483
+ // Subaction button (usual parent is container with kind='row-pane' and subkind='box').
484
+ if (kind === 'subaction') {
485
+ borderStyle = 'none';
486
+ backgroundColor = theme.palette.subactionButtonBackground;
487
+ }
488
+
489
+ if (kind === 'table-action-frame') {
490
+ let place = placeProp || 'middle';
491
+ if (place === '1/1') {
492
+ place = 'single';
493
+ } else if (place.indexOf('/') !== -1) {
494
+ const n = place.split('/');
495
+ if (n.length === 2) {
496
+ if (n[0] === '1') {
497
+ place = 'left';
498
+ } else if (n[0] === n[1]) {
499
+ place = 'right';
500
+ } else {
501
+ place = 'middle';
502
+ }
503
+ }
504
+ }
505
+ const r = to(theme.shapes.tableActionRadius, cssUnit);
506
+ boxHeight = to(theme.shapes.tableActionHeight, cssUnit);
507
+ borderStyle = 'none solid solid solid';
508
+ borderColor = theme.palette.tableBorder;
509
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
510
+ backgroundColor = theme.palette.tableActionBackground;
511
+ if (place === 'left') {
512
+ borderRadius =
513
+ `${to(0, cssUnit)} ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
514
+ } else if (place === 'right') {
515
+ borderRadius =
516
+ `${to(0, cssUnit)} ${to(0, cssUnit)} ` + r + ` ${to(0, cssUnit)}`;
517
+ } else if (place === 'single') {
518
+ borderRadius = `${to(0, cssUnit)} ${to(0, cssUnit)} ` + r + ' ' + r;
519
+ }
520
+ if (grow === '0') {
521
+ borderStyle = 'none';
522
+ }
523
+ transition = null;
524
+ }
525
+ if (kind === 'table-action') {
526
+ boxHeight = to(theme.shapes.tableActionHeight, cssUnit);
527
+ borderStyle = 'none solid solid solid';
528
+ borderColor = theme.palette.tableBorder;
529
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'none';
530
+ backgroundColor = theme.palette.tableActionBackground;
531
+ borderStyle = 'none';
532
+ transition = null;
533
+ }
534
+
535
+ if (kind === 'tree-expand') {
536
+ boxWidth = to(theme.shapes.treeExpandButtonWidth, cssUnit);
537
+ boxMaxWidth = to(theme.shapes.treeExpandButtonWidth, cssUnit);
538
+ borderStyle = 'none';
539
+ backgroundColor = 'transparent';
540
+ backgroundHoverColor = 'transparent';
541
+ }
542
+
543
+ // Combo button, place to the right of a TextFieldCombo component.
544
+ if (kind === 'combo') {
545
+ const w = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.8);
546
+ boxWidth = w;
547
+ boxMinWidth = w;
548
+ boxSizing = 'content-box';
549
+ activeColor = theme.palette.comboActiveBackground;
550
+ borderActiveColor = theme.palette.comboActiveBackground;
551
+ if (disabled) {
552
+ borderColor = theme.palette.textFieldDisableText;
553
+ backgroundColor = theme.palette.textFieldDisableBackground;
554
+ specialDisabled = true;
555
+ }
556
+ backgroundHoverColor = theme.palette.comboButtonBackgroundHover;
557
+ }
558
+
559
+ if (kind === 'round') {
560
+ const r = to(theme.shapes.actionRadius, cssUnit);
561
+ borderRadius = r;
562
+ borderStyle = 'none';
563
+ backgroundColor = theme.palette.roundButtonBackground;
564
+ }
565
+
566
+ if (kind === 'identity') {
567
+ const r = to(theme.shapes.actionRadius, cssUnit);
568
+ boxWidth = to(theme.shapes.identityHeight, cssUnit);
569
+ boxHeight = to(theme.shapes.identityHeight, cssUnit);
570
+ borderRadius = r;
571
+ borderStyle = 'none';
572
+ backgroundColor = theme.palette.identityButtonBackground;
573
+ }
574
+
575
+ if (kind === 'thin-left') {
576
+ const r = to(theme.shapes.thinRadius, cssUnit);
577
+ boxHeight = null;
578
+ borderStyle = 'none solid none none';
579
+ borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
580
+ borderColor = theme.palette.buttonBorder;
581
+ backgroundColor = null;
582
+ }
583
+ if (kind === 'thin-right') {
584
+ const r = to(theme.shapes.thinRadius, cssUnit);
585
+ boxHeight = null;
586
+ borderStyle = 'none none none solid';
587
+ borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
588
+ borderColor = theme.palette.buttonBorder;
589
+ backgroundColor = null;
590
+ }
591
+
592
+ if (kind === 'menu-item') {
593
+ boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
594
+ boxMarginBottom = to(1, cssUnit);
595
+ boxPaddingRight = to(theme.shapes.containerMargin, cssUnit);
596
+ boxPaddingLeft = to(theme.shapes.containerMargin, cssUnit);
597
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
598
+ borderStyle = 'none';
599
+ backgroundColor = theme.palette.menuItemInactiveBackground;
600
+ if (focused) {
601
+ activeColor = theme.palette.menuItemFocusBackground;
602
+ } else {
603
+ activeColor = theme.palette.menuItemActiveBackground;
604
+ }
605
+ }
606
+
607
+ if (kind === 'combo-item') {
608
+ boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
609
+ boxPaddingRight = to(theme.shapes.containerMargin, cssUnit);
610
+ boxPaddingLeft = to(theme.shapes.containerMargin, cssUnit);
611
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
612
+ borderStyle = 'none';
613
+ backgroundColor = theme.palette.comboItemBackground;
614
+ if (focused) {
615
+ activeColor = theme.palette.comboItemFocused;
616
+ } else {
617
+ activeColor = theme.palette.comboItemActive;
618
+ }
619
+ backgroundHoverColor = theme.palette.comboItemHover;
620
+ }
621
+ if (kind === 'flat-list-combo-item') {
622
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
623
+ borderStyle = 'none';
624
+ backgroundColor = theme.palette.comboItemBackground;
625
+ if (focused) {
626
+ activeColor = theme.palette.comboItemFocused;
627
+ } else {
628
+ activeColor = theme.palette.comboItemActive;
629
+ }
630
+ borderRadius = Unit.multiply(to(theme.shapes.smoothRadius, cssUnit), 0.5);
631
+ backgroundHoverColor = theme.palette.comboItemHover;
632
+ }
633
+
634
+ if (kind === 'combo-wrap-item') {
635
+ boxMaxWidth = boxWidth ? boxWidth : null;
636
+ boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
637
+ boxMaxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
638
+ boxPaddingRight = to(theme.shapes.containerMargin, cssUnit);
639
+ boxPaddingLeft = to(theme.shapes.containerMargin, cssUnit);
640
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
641
+ borderStyle = 'none';
642
+ backgroundColor = theme.palette.comboItemBackground;
643
+ if (focused) {
644
+ activeColor = theme.palette.comboItemFocused;
645
+ } else {
646
+ activeColor = theme.palette.comboItemActive;
647
+ }
648
+ backgroundHoverColor = theme.palette.comboItemHover;
649
+ }
650
+
651
+ if (kind === 'glyph-item') {
652
+ boxWidth = to(theme.shapes.glyphsDialogButtonWidth, cssUnit);
653
+ boxHeight = to(theme.shapes.menuButtonHeight, cssUnit);
654
+ boxMarginRight = to(theme.shapes.glyphsDialogButtonMargin, cssUnit);
655
+ boxMarginBottom = to(theme.shapes.glyphsDialogButtonMargin, cssUnit);
656
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
657
+ activeColor = theme.palette.boxActiveBackground;
658
+ }
659
+
660
+ if (kind === 'desk-title') {
661
+ boxHeight = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 1.2);
662
+ borderStyle = 'solid';
663
+ borderColor = 'transparent';
664
+ borderWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
665
+ borderRadius = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.25);
666
+ boxSizing = 'border-box';
667
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
668
+ boxMarginBottom = to(3, cssUnit);
669
+ backgroundColor = null;
670
+ backgroundHoverColor = theme.palette.ticketGlueHilitedBackground;
671
+ borderHoverStyle = 'solid';
672
+ borderHoverColor = theme.palette.ticketHover;
673
+ borderHoverWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
674
+ activeColor = theme.palette.ticketHilitedBackground;
675
+ borderActiveColor = theme.palette.ticketHilitedBackground;
676
+ }
677
+
678
+ if (kind === 'task-show-footer') {
679
+ boxHeight = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 1.2);
680
+ borderStyle = 'solid';
681
+ borderColor = 'transparent';
682
+ borderWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
683
+ borderRadius = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.25);
684
+ boxSizing = 'border-box';
685
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-end';
686
+ boxMarginBottom = to(3, cssUnit);
687
+ backgroundColor = null;
688
+ backgroundHoverColor = theme.palette.ticketGlueHilitedBackground;
689
+ borderHoverStyle = 'solid';
690
+ borderHoverColor = theme.palette.ticketHover;
691
+ borderHoverWidth = to(theme.shapes.ticketHoverThickness, cssUnit);
692
+ activeColor = theme.palette.ticketHilitedBackground;
693
+ borderActiveColor = theme.palette.ticketHilitedBackground;
694
+ }
695
+
696
+ // Button with a day in Calendar component.
697
+ if (
698
+ kind === 'calendar' ||
699
+ kind === 'calendar-navigator' ||
700
+ kind === 'calendar-list' ||
701
+ kind === 'calendar-title'
702
+ ) {
703
+ borderStyle = 'none';
704
+ if (kind === 'calendar' || kind === 'calendar-navigator') {
705
+ boxWidth = to(theme.shapes.calendarButtonWidth, cssUnit);
706
+ }
707
+ boxHeight = to(theme.shapes.calendarButtonHeight, cssUnit);
708
+ transition = null;
709
+ backgroundColor = 'transparent';
710
+ backgroundHoverColor = ColorManipulator.lighten(activeColor, 0.3);
711
+ if (subkind === 'add') {
712
+ activeColor = theme.palette.calendarActiveAddBackground;
713
+ } else if (subkind === 'sub') {
714
+ activeColor = theme.palette.calendarActiveSubBackground;
715
+ } else {
716
+ activeColor = theme.palette.calendarActiveBackground;
717
+ backgroundHoverColor = theme.palette.calendarHoverBackground;
718
+ }
719
+ if (kind === 'calendar-title') {
720
+ boxPaddingLeft = to(5, cssUnit);
721
+ boxPaddingRight = to(5, cssUnit);
722
+ }
723
+ specialDisabled = true;
724
+ }
725
+
726
+ if (kind === 'container') {
727
+ boxHeight = null;
728
+ boxAlignItems = 'stretch';
729
+ borderStyle = 'none';
730
+ boxPaddingTop = Unit.multiply(to(theme.shapes.lineSpacing, cssUnit), 0.5);
731
+ boxPaddingBottom = Unit.multiply(
732
+ to(theme.shapes.lineSpacing, cssUnit),
733
+ 0.5
734
+ );
735
+ backgroundColor = null;
736
+ activeColor = theme.palette.boxActiveBackground;
737
+ }
738
+
739
+ if (kind === 'container-start') {
740
+ boxHeight = null;
741
+ boxJustifyContent = boxJustifyContent ? boxJustifyContent : 'flex-start';
742
+ boxAlignItems = 'stretch';
743
+ borderStyle = 'none';
744
+ boxPaddingTop = Unit.multiply(to(theme.shapes.lineSpacing, cssUnit), 0.5);
745
+ boxPaddingBottom = Unit.multiply(
746
+ to(theme.shapes.lineSpacing, cssUnit),
747
+ 0.5
748
+ );
749
+ backgroundColor = null;
750
+ }
751
+
752
+ if (kind === 'box') {
753
+ boxAlignItems = 'stretch';
754
+ borderStyle = 'none';
755
+ boxMarginRight = m;
756
+ boxMarginBottom = m;
757
+ backgroundColor = theme.palette.boxBackground;
758
+ activeColor = theme.palette.boxActiveBackground;
759
+ }
760
+
761
+ if (kind === 'chronos-navigator') {
762
+ boxMarginBottom = to(1, cssUnit);
763
+ borderRadius = to(theme.shapes.smoothRadius, cssUnit);
764
+ backgroundHoverColor = ColorManipulator.fade(
765
+ theme.palette.buttonBackground,
766
+ 0.3
767
+ );
768
+ activeColor = theme.palette.boxActiveBackground;
769
+ }
770
+
771
+ if (kind === 'recurrence') {
772
+ boxMinWidth = to(theme.shapes.lineHeight, cssUnit);
773
+ boxMaxHeight = to(theme.shapes.lineHeight, cssUnit);
774
+ activeColor = theme.palette.calendarActiveBackground;
775
+ borderActiveColor = theme.palette.calendarActiveText;
776
+ }
777
+
778
+ if (kind === 'hover') {
779
+ boxOpacity = active ? 1 : 0.00001;
780
+ borderWidth = to(4, cssUnit);
781
+ borderColor = theme.palette.taskBackground;
782
+ backgroundHoverColor = theme.palette.buttonBackground;
783
+ borderActiveColor = theme.palette.taskBackground;
784
+ }
785
+
786
+ if (kind === 'dynamic-toolbar-left') {
787
+ borderStyle = 'none';
788
+ backgroundColor = 'transparent';
789
+ activeColor = theme.palette.dynamicToolbarBackground;
790
+ }
791
+ if (kind === 'dynamic-toolbar-top-left') {
792
+ borderStyle = 'none solid solid none';
793
+ backgroundColor = theme.palette.paneBackground;
794
+ }
795
+ if (kind === 'dynamic-toolbar-top-right') {
796
+ borderStyle = 'none none solid solid';
797
+ backgroundColor = theme.palette.paneBackground;
798
+ }
799
+ if (kind === 'dynamic-toolbar') {
800
+ boxMinWidth = to(theme.shapes.toolbarButtonWidth, cssUnit);
801
+ boxHeight = to(theme.shapes.toolbarButtonHeight, cssUnit);
802
+ borderStyle = 'none';
803
+ backgroundColor = ColorManipulator.emphasize(
804
+ theme.palette.toolbarInactiveBackground,
805
+ 0.1
806
+ );
807
+ activeColor = theme.palette.toolbarActiveBackground;
808
+ }
809
+ if (kind === 'toolbar') {
810
+ boxMinWidth = to(theme.shapes.toolbarButtonWidth, cssUnit);
811
+ boxHeight = to(theme.shapes.toolbarButtonHeight, cssUnit);
812
+ borderStyle = 'none';
813
+ backgroundColor = theme.palette.toolbarInactiveBackground;
814
+ activeColor = theme.palette.toolbarActiveBackground;
815
+ }
816
+
817
+ if (kind === 'flat-combo') {
818
+ backgroundColor = disabled
819
+ ? theme.palette.flatComboDisableInactiveBackground
820
+ : theme.palette.flatComboInactiveBackground;
821
+ activeColor = disabled
822
+ ? theme.palette.flatComboDisableActiveBackground
823
+ : theme.palette.flatComboActiveBackground;
824
+ specialDisabled = true;
825
+ }
826
+
827
+ if (kind === 'pane-warning') {
828
+ boxWidth = to(40, cssUnit);
829
+ boxHeight = to(40, cssUnit);
830
+ backgroundColor = 'transparent';
831
+ borderStyle = 'none';
832
+ }
833
+
834
+ if (!kind) {
835
+ borderRadius = to(theme.shapes.smoothRadius, cssUnit);
836
+ activeColor = theme.palette.boxActiveBackground;
837
+ }
838
+
839
+ if (theme.look.name === 'retro' && (!kind || kind === 'combo')) {
840
+ backgroundColor = '#ccc';
841
+ borderColor =
842
+ kind === 'combo' ? '#aaa #888 #666 #999' : '#eee #666 #444 #ddd';
843
+ borderWidth = to(1, cssUnit);
844
+ borderStyle = 'solid';
845
+ boxShadow =
846
+ `rgba(0, 0, 0, 0.4) ` +
847
+ `${to(2, cssUnit)} ${to(3, cssUnit)} ` +
848
+ `${to(10, cssUnit)} ${to(0, cssUnit)}`;
849
+
850
+ if (disabled) {
851
+ backgroundColor = theme.palette.buttonDisableBackground;
852
+ specialDisabled = true;
853
+ }
854
+ }
855
+
856
+ if (badgePush) {
857
+ boxPaddingRight = Unit.add(
858
+ to(boxPaddingRight, cssUnit),
859
+ to(theme.shapes.badgeHeight, cssUnit)
860
+ );
861
+ }
862
+ if (
863
+ shortcut &&
864
+ kind !== 'menu-item' &&
865
+ kind !== 'combo-item' &&
866
+ kind !== 'flat-list-combo-item' &&
867
+ kind !== 'task-bar' &&
868
+ kind !== 'task-logo'
869
+ ) {
870
+ boxPaddingRight = Unit.add(boxPaddingRight, m);
871
+ }
872
+
873
+ if (shape) {
874
+ const r = Unit.multiply(to(theme.shapes.lineHeight, cssUnit), 0.5);
875
+ const s = to(theme.shapes.smoothRadius, cssUnit);
876
+ if (shape === 'rounded') {
877
+ borderRadius = r;
878
+ } else if (shape === 'left-rounded') {
879
+ borderRadius = r + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + r;
880
+ } else if (shape === 'right-rounded') {
881
+ borderRadius = `${to(0, cssUnit)} ` + r + ' ' + r + ` ${to(0, cssUnit)}`;
882
+ } else if (shape === 'smooth') {
883
+ borderRadius = s;
884
+ } else if (shape === 'left-smooth') {
885
+ borderRadius = s + ` ${to(0, cssUnit)} ${to(0, cssUnit)} ` + s;
886
+ } else if (shape === 'right-smooth') {
887
+ borderRadius = `${to(0, cssUnit)} ` + s + ' ' + s + ` ${to(0, cssUnit)}`;
888
+ }
889
+ }
890
+
891
+ if (backgroundColorProp) {
892
+ backgroundColor = ColorHelpers.getMarkColor(theme, backgroundColorProp);
893
+ }
894
+ if (activeColorProp) {
895
+ activeColor = ColorHelpers.getMarkColor(theme, activeColorProp);
896
+ }
897
+
898
+ if (active || focused) {
899
+ backgroundColor = activeColor;
900
+ borderColor = borderActiveColor;
901
+ }
902
+
903
+ // Compute colors for glyph, text and hover if necessary.
904
+ let buttonBackgroundColor = backgroundColor;
905
+ if (!buttonBackgroundColor || buttonBackgroundColor === 'transparent') {
906
+ buttonBackgroundColor = theme.palette.buttonBackground;
907
+ }
908
+ if (!backgroundHoverColor) {
909
+ backgroundHoverColor = ColorManipulator.emphasize(
910
+ buttonBackgroundColor,
911
+ 0.2
912
+ );
913
+ }
914
+
915
+ // Alter colors if component is disable.
916
+ if (disabled && !specialDisabled) {
917
+ borderColor = theme.palette.buttonDisableBorder;
918
+ if (backgroundColor) {
919
+ backgroundColor = theme.palette.buttonDisableBackground;
920
+ }
921
+ }
922
+
923
+ if (borderColorForced) {
924
+ borderColor = borderColorForced;
925
+ }
926
+
927
+ // If component has specific width and border, reduce the width to
928
+ // take into account the thickness of the borders left and right.
929
+ // Buttons without left or right border (with only bottom border) are
930
+ // considered as without border (for example task button).
931
+ if (
932
+ boxWidth &&
933
+ boxWidth !== to(0, cssUnit) &&
934
+ !borderStyle.startsWith('none') &&
935
+ boxSizing !== 'border-box'
936
+ ) {
937
+ boxWidth = Unit.sub(boxWidth, Unit.multiply(borderWidth, 2));
938
+ }
939
+
940
+ if (boxFlexGrow) {
941
+ boxFlexShrink = '1';
942
+ boxFlexBasis = '0%';
943
+ }
944
+
945
+ if (vpos === 'top') {
946
+ boxAlignSelf = 'flex-start';
947
+ } else if (vpos === 'first-line') {
948
+ boxAlignSelf = 'flex-start';
949
+ boxMarginTop = to(3, cssUnit);
950
+ }
951
+
952
+ if (!boxJustifyContent) {
953
+ boxJustifyContent = 'center';
954
+ }
955
+ if (boxJustifyContent === 'none') {
956
+ boxJustifyContent = null;
957
+ }
958
+
959
+ const isGradient = isColorGradient(backgroundColor);
960
+
961
+ const boxStyle = {
962
+ opacity: boxOpacity,
963
+ overflow: 'hidden',
964
+ width: boxWidth,
965
+ minWidth: boxMinWidth,
966
+ maxWidth: boxMaxWidth,
967
+ height: boxHeight,
968
+ minHeight: boxHeight,
969
+ maxHeight: boxMaxHeight,
970
+ left: left,
971
+ right: right,
972
+ top: top,
973
+ bottom: bottom,
974
+ display: 'flex',
975
+ flexDirection: boxFlexDirection,
976
+ flexGrow: boxFlexGrow,
977
+ flexShrink: boxFlexShrink,
978
+ flexBasis: boxFlexBasis,
979
+ justifyContent: boxJustifyContent,
980
+ alignItems: boxAlignItems,
981
+ alignSelf: boxAlignSelf,
982
+ borderWidth: borderWidth,
983
+ borderColor: borderColor,
984
+ borderStyle: borderStyle,
985
+ borderRadius: borderRadius,
986
+ boxSizing: boxSizing,
987
+ boxShadow: boxShadow,
988
+ paddingTop: boxPaddingTop,
989
+ paddingRight: boxPaddingRight,
990
+ paddingBottom: boxPaddingBottom,
991
+ paddingLeft: boxPaddingLeft,
992
+ marginTop: boxMarginTop,
993
+ marginRight: boxMarginRight,
994
+ marginBottom: boxMarginBottom,
995
+ marginLeft: boxMarginLeft,
996
+ backgroundColor: isGradient ? null : backgroundColor,
997
+ background: isGradient ? backgroundColor : null,
998
+ position: boxPosition,
999
+ transition: transition,
1000
+ zIndex: boxZIndex,
1001
+ textDecoration: 'none',
1002
+ userSelect: 'none',
1003
+ cursor: cursor,
1004
+ };
1005
+
1006
+ if (!disabled && !busy && boxOpacity !== 0) {
1007
+ const isGradient = isColorGradient(backgroundHoverColor);
1008
+ boxStyle[':hover'] = {
1009
+ borderColor: borderHoverColor,
1010
+ borderStyle: borderHoverStyle,
1011
+ borderWidth: borderHoverWidth,
1012
+ backgroundColor: isGradient ? null : backgroundHoverColor,
1013
+ background: isGradient ? backgroundHoverColor : null,
1014
+ opacity: 1.0,
1015
+ };
1016
+ boxStyle[':active'] = {
1017
+ backgroundColor: backgroundColor
1018
+ ? ColorManipulator.darken(backgroundColor, 0.1)
1019
+ : 'rgba(0, 0, 0, 0.1)',
1020
+ };
1021
+ }
1022
+
1023
+ if (focusable) {
1024
+ boxStyle[':focus'] = {
1025
+ outline: 'none',
1026
+ boxShadow: focusedShadow,
1027
+ };
1028
+ } else {
1029
+ boxStyle[':focus'] = {
1030
+ outline: 'none',
1031
+ };
1032
+ }
1033
+
1034
+ // Generate a triangle with subtle css, see:
1035
+ // https://css-tricks.com/snippets/css/css-triangle/
1036
+ const d = to(triangleSize || theme.shapes.mainTabTriangleSize, cssUnit);
1037
+ const triangleStyle = {
1038
+ position: 'absolute',
1039
+ right: '50%',
1040
+ bottom: to(0, cssUnit),
1041
+ borderLeft: `${d} solid transparent`,
1042
+ borderRight: `${d} solid transparent`,
1043
+ borderBottom: `${d} solid ${
1044
+ triangleColor || theme.palette.viewTabBackground
1045
+ }`,
1046
+ margin: `${to(0, cssUnit)} -${d} ${to(0, cssUnit)} ${to(0, cssUnit)}`,
1047
+ userSelect: 'none',
1048
+ };
1049
+
1050
+ const busyBoxStyle = {
1051
+ position: 'absolute',
1052
+ width: '100%',
1053
+ height: '100%',
1054
+ display: 'flex',
1055
+ backgroundColor: theme.palette.busyBackground,
1056
+ };
1057
+
1058
+ const busyGlyphStyle = {
1059
+ margin: 'auto',
1060
+ color: theme.palette.busyForeground,
1061
+ };
1062
+
1063
+ const focusedForegroundStyle = {
1064
+ position: 'absolute',
1065
+ left: to(8, cssUnit),
1066
+ width: `calc(100% - ${to(14, cssUnit)})`,
1067
+ height: `calc(100% - ${to(14, cssUnit)})`,
1068
+ backgroundColor: ColorManipulator.fade(theme.palette.focused, 0.2),
1069
+ boxShadow: theme.shapes.focusedShadow + theme.palette.focused, // FIXME
1070
+ borderRadius: m,
1071
+ };
1072
+
1073
+ return {
1074
+ button: boxStyle,
1075
+ triangle: triangleStyle,
1076
+ busyBox: busyBoxStyle,
1077
+ busyGlyph: busyGlyphStyle,
1078
+ focusedForeground: focusedForegroundStyle,
1079
+ };
1080
+ }
1081
+
1082
+ /******************************************************************************/