@iobroker/adapter-react-v5 7.0.1 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/Components/404.d.ts +3 -2
  2. package/Components/404.js +16 -15
  3. package/Components/ColorPicker.d.ts +22 -8
  4. package/Components/ColorPicker.js +34 -17
  5. package/Components/ComplexCron.js +24 -24
  6. package/Components/CopyToClipboard.d.ts +10 -1
  7. package/Components/CopyToClipboard.js +17 -8
  8. package/Components/CustomModal.d.ts +1 -1
  9. package/Components/CustomModal.js +8 -8
  10. package/Components/FileBrowser.d.ts +11 -11
  11. package/Components/FileBrowser.js +173 -164
  12. package/Components/FileViewer.js +34 -23
  13. package/Components/Icon.d.ts +16 -2
  14. package/Components/Icon.js +19 -8
  15. package/Components/IconPicker.js +10 -14
  16. package/Components/IconSelector.d.ts +1 -1
  17. package/Components/IconSelector.js +64 -74
  18. package/Components/Image.d.ts +8 -4
  19. package/Components/Image.js +13 -32
  20. package/Components/Loader.d.ts +2 -2
  21. package/Components/Loader.js +244 -241
  22. package/Components/Loaders/MV.d.ts +6 -1
  23. package/Components/Loaders/MV.js +23 -7
  24. package/Components/Loaders/PT.d.ts +7 -2
  25. package/Components/Loaders/PT.js +123 -110
  26. package/Components/Loaders/Vendor.d.ts +2 -2
  27. package/Components/Loaders/Vendor.js +22 -14
  28. package/Components/Logo.js +16 -18
  29. package/Components/MDUtils.d.ts +1 -1
  30. package/Components/MDUtils.js +8 -4
  31. package/Components/ObjectBrowser.d.ts +49 -38
  32. package/Components/ObjectBrowser.js +757 -494
  33. package/Components/Router.d.ts +1 -3
  34. package/Components/Router.js +3 -1
  35. package/Components/SaveCloseButtons.d.ts +3 -3
  36. package/Components/SaveCloseButtons.js +3 -3
  37. package/Components/Schedule.d.ts +15 -15
  38. package/Components/Schedule.js +177 -154
  39. package/Components/SelectWithIcon.d.ts +2 -2
  40. package/Components/SelectWithIcon.js +45 -34
  41. package/Components/SimpleCron/index.js +83 -43
  42. package/Components/TabContainer.js +2 -2
  43. package/Components/TabContent.js +1 -1
  44. package/Components/TabHeader.js +1 -1
  45. package/Components/TableResize.d.ts +2 -2
  46. package/Components/TableResize.js +5 -5
  47. package/Components/TextWithIcon.d.ts +1 -1
  48. package/Components/TextWithIcon.js +10 -8
  49. package/Components/ToggleThemeMenu.d.ts +2 -2
  50. package/Components/ToggleThemeMenu.js +3 -3
  51. package/Components/TreeTable.d.ts +18 -18
  52. package/Components/TreeTable.js +76 -72
  53. package/Components/UploadImage.d.ts +2 -2
  54. package/Components/UploadImage.js +330 -326
  55. package/Components/Utils.d.ts +42 -22
  56. package/Components/Utils.js +66 -65
  57. package/Components/withWidth.d.ts +2 -2
  58. package/Components/withWidth.js +10 -6
  59. package/Dialogs/ComplexCron.d.ts +2 -2
  60. package/Dialogs/ComplexCron.js +3 -3
  61. package/Dialogs/Confirm.d.ts +4 -4
  62. package/Dialogs/Confirm.js +18 -8
  63. package/Dialogs/Cron.d.ts +3 -3
  64. package/Dialogs/Cron.js +21 -17
  65. package/Dialogs/Error.d.ts +3 -3
  66. package/Dialogs/Error.js +6 -4
  67. package/Dialogs/Message.d.ts +3 -3
  68. package/Dialogs/Message.js +6 -4
  69. package/Dialogs/SelectFile.d.ts +4 -4
  70. package/Dialogs/SelectFile.js +6 -4
  71. package/Dialogs/SelectID.d.ts +12 -10
  72. package/Dialogs/SelectID.js +12 -8
  73. package/Dialogs/SimpleCron.d.ts +2 -2
  74. package/Dialogs/SimpleCron.js +2 -2
  75. package/Dialogs/TextInput.d.ts +2 -2
  76. package/Dialogs/TextInput.js +3 -3
  77. package/GenericApp.d.ts +19 -13
  78. package/GenericApp.js +177 -134
  79. package/LICENSE +22 -22
  80. package/LegacyConnection.d.ts +240 -248
  81. package/LegacyConnection.js +500 -525
  82. package/Prompt.js +7 -7
  83. package/README.md +1239 -1166
  84. package/Theme.d.ts +1 -1
  85. package/Theme.js +9 -12
  86. package/assets/devices.json +1 -0
  87. package/assets/lamp_ceiling.svg +8 -8
  88. package/assets/lamp_table.svg +7 -7
  89. package/assets/no_icon.svg +9 -9
  90. package/assets/rooms.json +1 -0
  91. package/craco-module-federation.js +62 -71
  92. package/i18n/de.json +434 -431
  93. package/i18n/en.json +434 -431
  94. package/i18n/es.json +434 -431
  95. package/i18n/fr.json +434 -431
  96. package/i18n/it.json +434 -431
  97. package/i18n/nl.json +434 -431
  98. package/i18n/pl.json +434 -431
  99. package/i18n/pt.json +434 -431
  100. package/i18n/ru.json +434 -431
  101. package/i18n/uk.json +434 -431
  102. package/i18n/zh-cn.json +434 -431
  103. package/i18n.d.ts +26 -19
  104. package/i18n.js +28 -22
  105. package/icons/IconAdapter.js +2 -2
  106. package/icons/IconAlias.js +2 -2
  107. package/icons/IconChannel.js +2 -2
  108. package/icons/IconClearFilter.js +2 -2
  109. package/icons/IconClosed.js +2 -2
  110. package/icons/IconCopy.js +2 -2
  111. package/icons/IconDevice.js +2 -2
  112. package/icons/IconDocument.js +2 -2
  113. package/icons/IconDocumentReadOnly.js +2 -2
  114. package/icons/IconExpert.js +2 -2
  115. package/icons/IconFx.js +2 -2
  116. package/icons/IconInstance.js +2 -2
  117. package/icons/IconLogout.js +2 -2
  118. package/icons/IconNoIcon.js +2 -2
  119. package/icons/IconOpen.d.ts +2 -2
  120. package/icons/IconOpen.js +2 -2
  121. package/icons/IconProps.d.ts +4 -3
  122. package/icons/IconState.d.ts +2 -2
  123. package/icons/IconState.js +2 -2
  124. package/index.css +56 -55
  125. package/modulefederation.admin.config.js +31 -31
  126. package/package.json +5 -5
  127. package/src/AdminConnection.tsx +3 -3
  128. package/src/Components/404.tsx +122 -121
  129. package/src/Components/ColorPicker.tsx +343 -315
  130. package/src/Components/ComplexCron.tsx +544 -507
  131. package/src/Components/CopyToClipboard.tsx +178 -165
  132. package/src/Components/CustomModal.tsx +170 -163
  133. package/src/Components/FileBrowser.tsx +2550 -2414
  134. package/src/Components/FileViewer.tsx +412 -393
  135. package/src/Components/Icon.tsx +238 -210
  136. package/src/Components/IconPicker.tsx +165 -149
  137. package/src/Components/IconSelector.tsx +2220 -2202
  138. package/src/Components/Image.tsx +193 -176
  139. package/src/Components/Loader.tsx +328 -304
  140. package/src/Components/Logo.tsx +176 -166
  141. package/src/Components/MDUtils.tsx +104 -100
  142. package/src/Components/ObjectBrowser.tsx +8935 -8032
  143. package/src/Components/Router.tsx +90 -90
  144. package/src/Components/SaveCloseButtons.tsx +117 -113
  145. package/src/Components/Schedule.tsx +1962 -1724
  146. package/src/Components/SelectWithIcon.tsx +239 -197
  147. package/src/Components/TabContainer.tsx +57 -55
  148. package/src/Components/TabContent.tsx +38 -37
  149. package/src/Components/TabHeader.tsx +20 -19
  150. package/src/Components/TableResize.tsx +274 -259
  151. package/src/Components/TextWithIcon.tsx +159 -148
  152. package/src/Components/ToggleThemeMenu.tsx +52 -34
  153. package/src/Components/TreeTable.tsx +1002 -919
  154. package/src/Components/UploadImage.tsx +631 -599
  155. package/src/Components/Utils.tsx +1802 -1794
  156. package/src/Components/loader.css +231 -222
  157. package/src/Components/withWidth.tsx +32 -21
  158. package/src/Connection.tsx +5 -7
  159. package/src/Dialogs/ComplexCron.tsx +123 -129
  160. package/src/Dialogs/Confirm.tsx +185 -162
  161. package/src/Dialogs/Cron.tsx +192 -182
  162. package/src/Dialogs/Error.tsx +67 -72
  163. package/src/Dialogs/Message.tsx +73 -71
  164. package/src/Dialogs/SelectFile.tsx +280 -270
  165. package/src/Dialogs/SelectID.tsx +310 -298
  166. package/src/Dialogs/SimpleCron.tsx +100 -100
  167. package/src/Dialogs/TextInput.tsx +99 -107
  168. package/src/GenericApp.tsx +1076 -976
  169. package/src/LegacyConnection.tsx +3719 -3589
  170. package/src/Prompt.tsx +22 -20
  171. package/src/Theme.tsx +472 -479
  172. package/src/icons/IconAdapter.tsx +22 -20
  173. package/src/icons/IconAlias.tsx +22 -20
  174. package/src/icons/IconChannel.tsx +60 -21
  175. package/src/icons/IconClearFilter.tsx +24 -22
  176. package/src/icons/IconClosed.tsx +22 -17
  177. package/src/icons/IconCopy.tsx +21 -16
  178. package/src/icons/IconDevice.tsx +126 -27
  179. package/src/icons/IconDocument.tsx +22 -17
  180. package/src/icons/IconDocumentReadOnly.tsx +27 -18
  181. package/src/icons/IconExpert.tsx +26 -18
  182. package/src/icons/IconFx.tsx +38 -36
  183. package/src/icons/IconInstance.tsx +22 -20
  184. package/src/icons/IconLogout.tsx +32 -30
  185. package/src/icons/IconNoIcon.tsx +21 -19
  186. package/src/icons/IconOpen.tsx +22 -17
  187. package/src/icons/IconProps.tsx +16 -15
  188. package/src/icons/IconState.tsx +38 -17
  189. package/src/index.css +56 -55
  190. package/tasks.js +91 -0
  191. package/types.d.ts +141 -134
  192. package/Components/Loaders/PT.css +0 -109
  193. package/Components/Loaders/Vendor.css +0 -13
  194. package/Components/loader.css +0 -222
  195. package/Components/types.d.ts +0 -82
  196. package/assets/devices/Alarm Systems.svg +0 -19
  197. package/assets/devices/Amplifier.svg +0 -22
  198. package/assets/devices/Awnings.svg +0 -5
  199. package/assets/devices/Battery Status.svg +0 -5
  200. package/assets/devices/Ceiling Spotlights.svg +0 -16
  201. package/assets/devices/Chandelier.svg +0 -7
  202. package/assets/devices/Climate.svg +0 -12
  203. package/assets/devices/Coffee Makers.svg +0 -6
  204. package/assets/devices/Cold Water.svg +0 -31
  205. package/assets/devices/Computer.svg +0 -21
  206. package/assets/devices/Consumption.svg +0 -8
  207. package/assets/devices/Curtains.svg +0 -43
  208. package/assets/devices/Dishwashers.svg +0 -12
  209. package/assets/devices/Doors.svg +0 -6
  210. package/assets/devices/Doorstep.svg +0 -35
  211. package/assets/devices/Dryer.svg +0 -14
  212. package/assets/devices/Fan.svg +0 -20
  213. package/assets/devices/Floor Lamps.svg +0 -5
  214. package/assets/devices/Garage Doors.svg +0 -9
  215. package/assets/devices/Gates.svg +0 -32
  216. package/assets/devices/Hairdryer.svg +0 -23
  217. package/assets/devices/Handle.svg +0 -6
  218. package/assets/devices/Hanging Lamps.svg +0 -9
  219. package/assets/devices/Heater.svg +0 -44
  220. package/assets/devices/Hoods.svg +0 -12
  221. package/assets/devices/Hot Water.svg +0 -10
  222. package/assets/devices/Humidity.svg +0 -41
  223. package/assets/devices/Iron.svg +0 -5
  224. package/assets/devices/Irrigation.svg +0 -23
  225. package/assets/devices/Led Strip.svg +0 -31
  226. package/assets/devices/Light.svg +0 -30
  227. package/assets/devices/Lightings.svg +0 -46
  228. package/assets/devices/Lock.svg +0 -19
  229. package/assets/devices/Louvre.svg +0 -7
  230. package/assets/devices/Mowing Machine.svg +0 -9
  231. package/assets/devices/Music.svg +0 -13
  232. package/assets/devices/Outdoor Blinds.svg +0 -7
  233. package/assets/devices/People.svg +0 -19
  234. package/assets/devices/Pool.svg +0 -8
  235. package/assets/devices/Power Consumption.svg +0 -13
  236. package/assets/devices/Printer.svg +0 -10
  237. package/assets/devices/Pump.svg +0 -10
  238. package/assets/devices/Receiver.svg +0 -19
  239. package/assets/devices/Sconces.svg +0 -10
  240. package/assets/devices/Security.svg +0 -34
  241. package/assets/devices/Shading.svg +0 -5
  242. package/assets/devices/Shutters.svg +0 -11
  243. package/assets/devices/SmokeDetector.svg +0 -13
  244. package/assets/devices/Sockets.svg +0 -13
  245. package/assets/devices/Speaker.svg +0 -35
  246. package/assets/devices/Stove.svg +0 -12
  247. package/assets/devices/Table Lamps.svg +0 -12
  248. package/assets/devices/Temperature Sensors.svg +0 -28
  249. package/assets/devices/Tv.svg +0 -8
  250. package/assets/devices/Vacuum Cleaner.svg +0 -16
  251. package/assets/devices/Ventilation.svg +0 -12
  252. package/assets/devices/Washing Machines.svg +0 -16
  253. package/assets/devices/Water Consumption.svg +0 -6
  254. package/assets/devices/Water Heater.svg +0 -8
  255. package/assets/devices/Water.svg +0 -40
  256. package/assets/devices/Weather.svg +0 -28
  257. package/assets/devices/Window.svg +0 -8
  258. package/assets/rooms/Anteroom.svg +0 -53
  259. package/assets/rooms/Attic.svg +0 -21
  260. package/assets/rooms/Balcony.svg +0 -13
  261. package/assets/rooms/Barn.svg +0 -6
  262. package/assets/rooms/Basement.svg +0 -5
  263. package/assets/rooms/Bathroom.svg +0 -38
  264. package/assets/rooms/Bedroom.svg +0 -5
  265. package/assets/rooms/Boiler Room.svg +0 -13
  266. package/assets/rooms/Carport.svg +0 -17
  267. package/assets/rooms/Cellar.svg +0 -89
  268. package/assets/rooms/Chamber.svg +0 -9
  269. package/assets/rooms/Corridor.svg +0 -53
  270. package/assets/rooms/Dining Area.svg +0 -37
  271. package/assets/rooms/Dining Room.svg +0 -37
  272. package/assets/rooms/Dining.svg +0 -37
  273. package/assets/rooms/Dressing Room.svg +0 -5
  274. package/assets/rooms/Driveway.svg +0 -15
  275. package/assets/rooms/Entrance.svg +0 -44
  276. package/assets/rooms/Equipment Room.svg +0 -15
  277. package/assets/rooms/Front Yard.svg +0 -64
  278. package/assets/rooms/Gallery.svg +0 -14
  279. package/assets/rooms/Garage.svg +0 -20
  280. package/assets/rooms/Garden.svg +0 -13
  281. package/assets/rooms/Ground Floor.svg +0 -95
  282. package/assets/rooms/Guest Bathroom.svg +0 -33
  283. package/assets/rooms/Guest Room.svg +0 -5
  284. package/assets/rooms/Gym.svg +0 -5
  285. package/assets/rooms/Hall.svg +0 -19
  286. package/assets/rooms/Home Theater.svg +0 -8
  287. package/assets/rooms/Kitchen.svg +0 -18
  288. package/assets/rooms/Laundry Room.svg +0 -12
  289. package/assets/rooms/Living Area.svg +0 -11
  290. package/assets/rooms/Living Room.svg +0 -10
  291. package/assets/rooms/Locker Room.svg +0 -17
  292. package/assets/rooms/Nursery.svg +0 -5
  293. package/assets/rooms/Office.svg +0 -8
  294. package/assets/rooms/Outdoors.svg +0 -7
  295. package/assets/rooms/Playroom.svg +0 -6
  296. package/assets/rooms/Pool.svg +0 -8
  297. package/assets/rooms/Rear Wall.svg +0 -30
  298. package/assets/rooms/Second Floor.svg +0 -95
  299. package/assets/rooms/Shed.svg +0 -16
  300. package/assets/rooms/Sleeping Area.svg +0 -22
  301. package/assets/rooms/Stairway.svg +0 -5
  302. package/assets/rooms/Stairwell.svg +0 -15
  303. package/assets/rooms/Storeroom.svg +0 -5
  304. package/assets/rooms/Summer House.svg +0 -27
  305. package/assets/rooms/Swimming Pool.svg +0 -21
  306. package/assets/rooms/Terrace.svg +0 -7
  307. package/assets/rooms/Toilet.svg +0 -10
  308. package/assets/rooms/Upstairs.svg +0 -6
  309. package/assets/rooms/Wardrobe.svg +0 -60
  310. package/assets/rooms/Washroom.svg +0 -20
  311. package/assets/rooms/Wc.svg +0 -10
  312. package/assets/rooms/Windscreen.svg +0 -60
  313. package/assets/rooms/Workshop.svg +0 -23
  314. package/assets/rooms/Workspace.svg +0 -8
package/src/Theme.tsx CHANGED
@@ -1,479 +1,472 @@
1
- import React from 'react';
2
- import { createTheme, alpha, PaletteOptions as PaletteOptionsMui } from '@mui/material/styles';
3
- import { orange, grey } from '@mui/material/colors';
4
-
5
- import { SimplePaletteColorOptions } from '@mui/material/styles/createPalette';
6
- import { ThemeOptions as ThemeOptionsMui } from '@mui/material/styles/createTheme';
7
- import { type IobTheme, type ThemeName, ThemeType } from './types';
8
-
9
- const step = (16 - 5) / 23 / 100;
10
-
11
- /**
12
- * Convert hex color in the format '#rrggbb' or '#rgb' to an RGB object.
13
- */
14
- function toInt(hex: string): { r: number; g: number; b: number } {
15
- const rgb: { r: number; g: number; b: number } = {
16
- r: 0,
17
- g: 0,
18
- b: 0,
19
- };
20
-
21
- if (hex.length === 7) {
22
- rgb.r = parseInt(hex.substr(1, 2), 16);
23
- rgb.g = parseInt(hex.substr(3, 2), 16);
24
- rgb.b = parseInt(hex.substr(5, 2), 16);
25
- } else if (hex.length === 4) {
26
- const r = hex.substr(1, 1);
27
- const g = hex.substr(2, 1);
28
- const b = hex.substr(3, 1);
29
-
30
- rgb.r = parseInt(r + r, 16);
31
- rgb.g = parseInt(g + g, 16);
32
- rgb.b = parseInt(b + b, 16);
33
- }
34
-
35
- return rgb;
36
- }
37
-
38
- /**
39
- * Convert an RGB object to a hex color string in the format '#rrggbb'.
40
- */
41
- function toHex(int: { r: number; g: number; b: number }): string {
42
- return `#${Math.round(int.r).toString(16)}${Math.round(int.g).toString(16)}${Math.round(int.b).toString(16)}`;
43
- }
44
-
45
- /** Returns the hex color string in the format '#rrggbb' */
46
- function getElevation(
47
- /** color in the format '#rrggbb' or '#rgb' */
48
- color: string,
49
- /** overlay color in the format '#rrggbb' or '#rgb' */
50
- overlayColor: string,
51
- /** elevation as an integer starting with 1 */
52
- elevation: number,
53
- ): string {
54
- const rgb: { r: number; g: number; b: number } = toInt(color);
55
- const overlay: { r: number; g: number; b: number } = toInt(overlayColor);
56
-
57
- rgb.r += overlay.r * (0.05 + step * (elevation - 1));
58
- rgb.g += overlay.g * (0.05 + step * (elevation - 1));
59
- rgb.b += overlay.b * (0.05 + step * (elevation - 1));
60
-
61
- return toHex(rgb);
62
- }
63
-
64
- /**
65
- * Get all 24 elevations of the given color and overlay.
66
- */
67
- function getElevations(
68
- /** color in the format '#rrggbb' or '#rgb' */
69
- color: string,
70
- /** overlay color in the format '#rrggbb' or '#rgb' */
71
- overlay: string,
72
- ): Record<string, React.CSSProperties> {
73
- const elevations: Record<string, React.CSSProperties> = {};
74
-
75
- for (let i = 1; i <= 24; i++) {
76
- elevations[`elevation${i}`] = {
77
- backgroundColor: getElevation(color, overlay, i),
78
- };
79
- }
80
-
81
- return elevations;
82
- }
83
-
84
- // const buttonsPalette = () => ({
85
- // palette: {
86
- // // mode: "dark",
87
- // grey: {
88
- // main: grey[300],
89
- // dark: grey[400],
90
- // },
91
- // },
92
- // });
93
-
94
- // const buttonsTheme = theme => ({
95
- // components: {
96
- // MuiButton: {
97
- // variants: [
98
- // {
99
- // props: { variant: 'contained', color: 'grey' },
100
- // style: {
101
- // color: theme.palette.getContrastText(theme.palette.grey[300]),
102
- // },
103
- // },
104
- // {
105
- // props: { variant: 'outlined', color: 'grey' },
106
- // style: {
107
- // color: theme.palette.text.primary,
108
- // borderColor:
109
- // theme.palette.mode === 'light'
110
- // ? 'rgba(0, 0, 0, 0.23)'
111
- // : 'rgba(255, 255, 255, 0.23)',
112
- // '&.Mui-disabled': {
113
- // border: `1px solid ${theme.palette.action.disabledBackground}`,
114
- // },
115
- // '&:hover': {
116
- // borderColor:
117
- // theme.palette.mode === 'light'
118
- // ? 'rgba(0, 0, 0, 0.23)'
119
- // : 'rgba(255, 255, 255, 0.23)',
120
- // backgroundColor: alpha(
121
- // theme.palette.text.primary,
122
- // theme.palette.action.hoverOpacity,
123
- // ),
124
- // },
125
- // },
126
- // },
127
- // {
128
- // props: { color: 'grey', variant: 'text' },
129
- // style: {
130
- // color: 'black',
131
- // '&:hover': {
132
- // backgroundColor: alpha(
133
- // theme.palette.text.primary,
134
- // theme.palette.action.hoverOpacity,
135
- // ),
136
- // },
137
- // },
138
- // },
139
- // ],
140
- // },
141
- // },
142
- // });
143
-
144
- interface PaletteOptions extends PaletteOptionsMui {
145
- mode: ThemeType;
146
- expert: string;
147
- grey?: {
148
- main?: string;
149
- dark?: string;
150
- 50?: string;
151
- 100?: string;
152
- 200?: string;
153
- 300?: string;
154
- 400?: string;
155
- 500?: string;
156
- 600?: string;
157
- 700?: string;
158
- 800?: string;
159
- 900?: string;
160
- A100?: string;
161
- A200?: string;
162
- A400?: string;
163
- A700?: string;
164
- };
165
- }
166
-
167
- interface ThemeOptions extends ThemeOptionsMui {
168
- name: ThemeName;
169
- palette?: PaletteOptions;
170
- toolbar?: React.CSSProperties;
171
- saveToolbar?: {
172
- background: string;
173
- button: React.CSSProperties;
174
- };
175
- }
176
-
177
- /**
178
- * The theme creation factory function.
179
- */
180
- function customTheme(type: ThemeName, overrides?: Record<string, any>): IobTheme {
181
- let options: ThemeOptions;
182
- let localOverrides: Record<string, any>;
183
-
184
- if (type === 'dark') {
185
- localOverrides = {
186
- MuiAppBar: {
187
- colorDefault: {
188
- backgroundColor: '#272727',
189
- },
190
- },
191
- MuiLink: {
192
- root: {
193
- textTransform: 'uppercase',
194
- transition: 'color .3s ease',
195
- color: orange[200],
196
- '&:hover': {
197
- color: orange[100],
198
- },
199
- },
200
- },
201
- MuiPaper: getElevations('#121212', '#fff'),
202
- };
203
-
204
- options = {
205
- name: type,
206
- palette: {
207
- mode: 'dark',
208
- background: {
209
- paper: '#121212',
210
- default: '#121212',
211
- },
212
- primary: {
213
- main: '#4dabf5',
214
- },
215
- secondary: {
216
- main: '#436a93',
217
- },
218
- expert: '#14bb00',
219
- text: {
220
- primary: '#ffffff',
221
- secondary: '#ffffff',
222
- },
223
- },
224
- };
225
- } else if (type === 'blue') {
226
- localOverrides = {
227
- MuiAppBar: {
228
- colorDefault: {
229
- backgroundColor: '#3399CC',
230
- },
231
- },
232
- MuiLink: {
233
- root: {
234
- textTransform: 'uppercase',
235
- transition: 'color .3s ease',
236
- color: orange[400],
237
- '&:hover': {
238
- color: orange[300],
239
- },
240
- },
241
- },
242
- };
243
-
244
- options = {
245
- name: type,
246
- palette: {
247
- mode: 'dark',
248
- background: {
249
- paper: '#151d21',
250
- default: '#151d21',
251
- },
252
- primary: {
253
- main: '#4dabf5',
254
- },
255
- secondary: {
256
- main: '#436a93',
257
- },
258
- expert: '#14bb00',
259
- text: {
260
- primary: '#ffffff',
261
- secondary: '#ffffff',
262
- },
263
- },
264
-
265
- };
266
- } else if (type === 'colored') {
267
- localOverrides = {
268
- MuiAppBar: {
269
- colorDefault: {
270
- backgroundColor: '#2a3135',
271
- },
272
- },
273
- MuiLink: {
274
- root: {
275
- textTransform: 'uppercase',
276
- transition: 'color .3s ease',
277
- color: orange[200],
278
- '&:hover': {
279
- color: orange[100],
280
- },
281
- },
282
- },
283
- MuiPaper: getElevations('#151d21', '#fff'),
284
- };
285
-
286
- options = {
287
- name: type,
288
- palette: {
289
- mode: 'light',
290
- primary: {
291
- main: '#3399CC',
292
- },
293
- secondary: {
294
- main: '#164477',
295
- },
296
- expert: '#96fc96',
297
- },
298
- };
299
- } else if (type === 'PT') {
300
- localOverrides = {
301
- MuiAppBar: {
302
- colorDefault: {
303
- backgroundColor: '#0F99DE',
304
- },
305
- },
306
- MuiLink: {
307
- root: {
308
- textTransform: 'uppercase',
309
- transition: 'color .3s ease',
310
- color: orange[400],
311
- '&:hover': {
312
- color: orange[300],
313
- },
314
- },
315
- },
316
- };
317
-
318
- options = {
319
- name: type,
320
- palette: {
321
- mode: 'light',
322
- primary: {
323
- main: '#0F99DE',
324
- },
325
- secondary: {
326
- main: '#88A536',
327
- },
328
- expert: '#BD1B24',
329
- },
330
-
331
- };
332
- } else if (type === 'DX') {
333
- localOverrides = {
334
- MuiAppBar: {
335
- colorDefault: {
336
- backgroundColor: '#a9a9a9',
337
- },
338
- },
339
- MuiLink: {
340
- root: {
341
- textTransform: 'uppercase',
342
- transition: 'color .3s ease',
343
- color: orange[400],
344
- '&:hover': {
345
- color: orange[300],
346
- },
347
- },
348
- },
349
- };
350
-
351
- options = {
352
- name: type,
353
- palette: {
354
- mode: 'light',
355
- primary: {
356
- main: '#F5F5F7',
357
- },
358
- secondary: {
359
- main: '#a9a9a9',
360
- },
361
- expert: '#BD1B24',
362
- text: {
363
- primary: '#007AFE',
364
- secondary: '#007AFE',
365
- disabled: '#007AFEAA',
366
- },
367
- },
368
-
369
- };
370
- } else {
371
- localOverrides = {
372
- MuiLink: {
373
- root: {
374
- textTransform: 'uppercase',
375
- transition: 'color .3s ease',
376
- color: orange[400],
377
- '&:hover': {
378
- color: orange[300],
379
- },
380
- },
381
- },
382
- };
383
-
384
- options = {
385
- name: type,
386
- palette: {
387
- mode: 'light',
388
- primary: {
389
- main: '#3399CC',
390
- dark: '#256c97',
391
- light: '#76d0fd',
392
- },
393
- secondary: {
394
- main: '#164477',
395
- },
396
- expert: '#14bb00',
397
- },
398
- };
399
- }
400
-
401
- options.toolbar = {
402
- height: 48,
403
- };
404
-
405
- options.saveToolbar = {
406
- background: (options.palette?.primary as SimplePaletteColorOptions)?.main,
407
- button: {
408
- borderRadius: 3,
409
- height: 32,
410
- },
411
- };
412
-
413
- if (options.palette) {
414
- options.palette.grey = {
415
- main: grey[300],
416
- dark: grey[400],
417
- };
418
- }
419
-
420
- const theme: IobTheme = createTheme(options) as IobTheme;
421
-
422
- const palette: PaletteOptions = (theme.palette as PaletteOptions);
423
-
424
- return createTheme(theme, {
425
- ...(overrides || undefined),
426
- components: {
427
- ...localOverrides,
428
- MuiButton: {
429
- variants: [
430
- {
431
- props: { variant: 'contained', color: 'grey' },
432
- style: {
433
- backgroundColor: palette.grey?.[300],
434
- color: palette.getContrastText && palette.grey?.[300]? palette.getContrastText(palette.grey[300]) : undefined,
435
- },
436
- },
437
- {
438
- props: { variant: 'outlined', color: 'grey' },
439
- style: {
440
- color: palette.text?.primary,
441
- borderColor:
442
- palette.mode === 'light'
443
- ? 'rgba(0, 0, 0, 0.23)'
444
- : 'rgba(255, 255, 255, 0.23)',
445
- '&.Mui-disabled': {
446
- border: `1px solid ${palette.action?.disabledBackground}`,
447
- },
448
- '&:hover': {
449
- borderColor:
450
- palette.mode === 'light'
451
- ? 'rgba(0, 0, 0, 0.23)'
452
- : 'rgba(255, 255, 255, 0.23)',
453
- backgroundColor: alpha(
454
- palette.text?.primary || '',
455
- palette.action?.hoverOpacity || 0.04,
456
- ),
457
- },
458
- },
459
- },
460
- {
461
- props: { variant: 'text', color: 'grey' },
462
- style: {
463
- color: palette.text?.primary,
464
- '&:hover': {
465
- backgroundColor: alpha(
466
- palette.text?.primary || '',
467
- palette.action?.hoverOpacity || 0.04,
468
- ),
469
- },
470
- },
471
- },
472
- ],
473
- },
474
- ...(overrides?.components || undefined),
475
- },
476
- }) as IobTheme;
477
- }
478
-
479
- export default customTheme;
1
+ import { type CSSProperties } from 'react';
2
+ import { createTheme, alpha, type PaletteOptions as PaletteOptionsMui } from '@mui/material/styles';
3
+ import { orange, grey } from '@mui/material/colors';
4
+
5
+ import type { SimplePaletteColorOptions } from '@mui/material/styles/createPalette';
6
+ import type { ThemeOptions as ThemeOptionsMui } from '@mui/material/styles/createTheme';
7
+ import type { IobTheme, ThemeName, ThemeType } from './types';
8
+
9
+ const step = (16 - 5) / 23 / 100;
10
+
11
+ /**
12
+ * Convert hex color in the format '#rrggbb' or '#rgb' to an RGB object.
13
+ */
14
+ function toInt(hex: string): { r: number; g: number; b: number } {
15
+ const rgb: { r: number; g: number; b: number } = {
16
+ r: 0,
17
+ g: 0,
18
+ b: 0,
19
+ };
20
+
21
+ if (hex.length === 7) {
22
+ rgb.r = parseInt(hex.substr(1, 2), 16);
23
+ rgb.g = parseInt(hex.substr(3, 2), 16);
24
+ rgb.b = parseInt(hex.substr(5, 2), 16);
25
+ } else if (hex.length === 4) {
26
+ const r = hex.substr(1, 1);
27
+ const g = hex.substr(2, 1);
28
+ const b = hex.substr(3, 1);
29
+
30
+ rgb.r = parseInt(r + r, 16);
31
+ rgb.g = parseInt(g + g, 16);
32
+ rgb.b = parseInt(b + b, 16);
33
+ }
34
+
35
+ return rgb;
36
+ }
37
+
38
+ /**
39
+ * Convert an RGB object to a hex color string in the format '#rrggbb'.
40
+ */
41
+ function toHex(int: { r: number; g: number; b: number }): string {
42
+ return `#${Math.round(int.r).toString(16)}${Math.round(int.g).toString(16)}${Math.round(int.b).toString(16)}`;
43
+ }
44
+
45
+ /** Returns the hex color string in the format '#rrggbb' */
46
+ function getElevation(
47
+ /** color in the format '#rrggbb' or '#rgb' */
48
+ color: string,
49
+ /** overlay color in the format '#rrggbb' or '#rgb' */
50
+ overlayColor: string,
51
+ /** elevation as an integer starting with 1 */
52
+ elevation: number,
53
+ ): string {
54
+ const rgb: { r: number; g: number; b: number } = toInt(color);
55
+ const overlay: { r: number; g: number; b: number } = toInt(overlayColor);
56
+
57
+ rgb.r += overlay.r * (0.05 + step * (elevation - 1));
58
+ rgb.g += overlay.g * (0.05 + step * (elevation - 1));
59
+ rgb.b += overlay.b * (0.05 + step * (elevation - 1));
60
+
61
+ return toHex(rgb);
62
+ }
63
+
64
+ /**
65
+ * Get all 24 elevations of the given color and overlay.
66
+ *
67
+ * @param color color in the format '#rrggbb' or '#rgb'
68
+ * @param overlay overlay color in the format '#rrggbb' or '#rgb'
69
+ */
70
+ function getElevations(color: string, overlay: string): Record<string, CSSProperties> {
71
+ const elevations: Record<string, CSSProperties> = {};
72
+
73
+ for (let i = 1; i <= 24; i++) {
74
+ elevations[`elevation${i}`] = {
75
+ backgroundColor: getElevation(color, overlay, i),
76
+ };
77
+ }
78
+
79
+ return elevations;
80
+ }
81
+
82
+ // const buttonsPalette = () => ({
83
+ // palette: {
84
+ // // mode: "dark",
85
+ // grey: {
86
+ // main: grey[300],
87
+ // dark: grey[400],
88
+ // },
89
+ // },
90
+ // });
91
+
92
+ // const buttonsTheme = theme => ({
93
+ // components: {
94
+ // MuiButton: {
95
+ // variants: [
96
+ // {
97
+ // props: { variant: 'contained', color: 'grey' },
98
+ // style: {
99
+ // color: theme.palette.getContrastText(theme.palette.grey[300]),
100
+ // },
101
+ // },
102
+ // {
103
+ // props: { variant: 'outlined', color: 'grey' },
104
+ // style: {
105
+ // color: theme.palette.text.primary,
106
+ // borderColor:
107
+ // theme.palette.mode === 'light'
108
+ // ? 'rgba(0, 0, 0, 0.23)'
109
+ // : 'rgba(255, 255, 255, 0.23)',
110
+ // '&.Mui-disabled': {
111
+ // border: `1px solid ${theme.palette.action.disabledBackground}`,
112
+ // },
113
+ // '&:hover': {
114
+ // borderColor:
115
+ // theme.palette.mode === 'light'
116
+ // ? 'rgba(0, 0, 0, 0.23)'
117
+ // : 'rgba(255, 255, 255, 0.23)',
118
+ // backgroundColor: alpha(
119
+ // theme.palette.text.primary,
120
+ // theme.palette.action.hoverOpacity,
121
+ // ),
122
+ // },
123
+ // },
124
+ // },
125
+ // {
126
+ // props: { color: 'grey', variant: 'text' },
127
+ // style: {
128
+ // color: 'black',
129
+ // '&:hover': {
130
+ // backgroundColor: alpha(
131
+ // theme.palette.text.primary,
132
+ // theme.palette.action.hoverOpacity,
133
+ // ),
134
+ // },
135
+ // },
136
+ // },
137
+ // ],
138
+ // },
139
+ // },
140
+ // });
141
+
142
+ interface PaletteOptions extends PaletteOptionsMui {
143
+ mode: ThemeType;
144
+ expert: string;
145
+ grey?: {
146
+ main?: string;
147
+ dark?: string;
148
+ 50?: string;
149
+ 100?: string;
150
+ 200?: string;
151
+ 300?: string;
152
+ 400?: string;
153
+ 500?: string;
154
+ 600?: string;
155
+ 700?: string;
156
+ 800?: string;
157
+ 900?: string;
158
+ A100?: string;
159
+ A200?: string;
160
+ A400?: string;
161
+ A700?: string;
162
+ };
163
+ }
164
+
165
+ interface ThemeOptions extends ThemeOptionsMui {
166
+ name: ThemeName;
167
+ palette?: PaletteOptions;
168
+ toolbar?: CSSProperties;
169
+ saveToolbar?: {
170
+ background: string;
171
+ button: CSSProperties;
172
+ };
173
+ }
174
+
175
+ /**
176
+ * The theme creation factory function.
177
+ */
178
+ function customTheme(type: ThemeName, overrides?: Record<string, any>): IobTheme {
179
+ let options: ThemeOptions;
180
+ let localOverrides: Record<string, any>;
181
+
182
+ if (type === 'dark') {
183
+ localOverrides = {
184
+ MuiAppBar: {
185
+ colorDefault: {
186
+ backgroundColor: '#272727',
187
+ },
188
+ },
189
+ MuiLink: {
190
+ root: {
191
+ textTransform: 'uppercase',
192
+ transition: 'color .3s ease',
193
+ color: orange[200],
194
+ '&:hover': {
195
+ color: orange[100],
196
+ },
197
+ },
198
+ },
199
+ MuiPaper: getElevations('#121212', '#fff'),
200
+ };
201
+
202
+ options = {
203
+ name: type,
204
+ palette: {
205
+ mode: 'dark',
206
+ background: {
207
+ paper: '#121212',
208
+ default: '#121212',
209
+ },
210
+ primary: {
211
+ main: '#4dabf5',
212
+ },
213
+ secondary: {
214
+ main: '#436a93',
215
+ },
216
+ expert: '#14bb00',
217
+ text: {
218
+ primary: '#ffffff',
219
+ secondary: '#ffffff',
220
+ },
221
+ },
222
+ };
223
+ } else if (type === 'blue') {
224
+ localOverrides = {
225
+ MuiAppBar: {
226
+ colorDefault: {
227
+ backgroundColor: '#3399CC',
228
+ },
229
+ },
230
+ MuiLink: {
231
+ root: {
232
+ textTransform: 'uppercase',
233
+ transition: 'color .3s ease',
234
+ color: orange[400],
235
+ '&:hover': {
236
+ color: orange[300],
237
+ },
238
+ },
239
+ },
240
+ };
241
+
242
+ options = {
243
+ name: type,
244
+ palette: {
245
+ mode: 'dark',
246
+ background: {
247
+ paper: '#151d21',
248
+ default: '#151d21',
249
+ },
250
+ primary: {
251
+ main: '#4dabf5',
252
+ },
253
+ secondary: {
254
+ main: '#436a93',
255
+ },
256
+ expert: '#14bb00',
257
+ text: {
258
+ primary: '#ffffff',
259
+ secondary: '#ffffff',
260
+ },
261
+ },
262
+ };
263
+ } else if (type === 'colored') {
264
+ localOverrides = {
265
+ MuiAppBar: {
266
+ colorDefault: {
267
+ backgroundColor: '#2a3135',
268
+ },
269
+ },
270
+ MuiLink: {
271
+ root: {
272
+ textTransform: 'uppercase',
273
+ transition: 'color .3s ease',
274
+ color: orange[200],
275
+ '&:hover': {
276
+ color: orange[100],
277
+ },
278
+ },
279
+ },
280
+ MuiPaper: getElevations('#151d21', '#fff'),
281
+ };
282
+
283
+ options = {
284
+ name: type,
285
+ palette: {
286
+ mode: 'light',
287
+ primary: {
288
+ main: '#3399CC',
289
+ },
290
+ secondary: {
291
+ main: '#164477',
292
+ },
293
+ expert: '#96fc96',
294
+ },
295
+ };
296
+ } else if (type === 'PT') {
297
+ localOverrides = {
298
+ MuiAppBar: {
299
+ colorDefault: {
300
+ backgroundColor: '#0F99DE',
301
+ },
302
+ },
303
+ MuiLink: {
304
+ root: {
305
+ textTransform: 'uppercase',
306
+ transition: 'color .3s ease',
307
+ color: orange[400],
308
+ '&:hover': {
309
+ color: orange[300],
310
+ },
311
+ },
312
+ },
313
+ };
314
+
315
+ options = {
316
+ name: type,
317
+ palette: {
318
+ mode: 'light',
319
+ primary: {
320
+ main: '#0F99DE',
321
+ },
322
+ secondary: {
323
+ main: '#88A536',
324
+ },
325
+ expert: '#BD1B24',
326
+ },
327
+ };
328
+ } else if (type === 'DX') {
329
+ localOverrides = {
330
+ MuiAppBar: {
331
+ colorDefault: {
332
+ backgroundColor: '#a9a9a9',
333
+ },
334
+ },
335
+ MuiLink: {
336
+ root: {
337
+ textTransform: 'uppercase',
338
+ transition: 'color .3s ease',
339
+ color: orange[400],
340
+ '&:hover': {
341
+ color: orange[300],
342
+ },
343
+ },
344
+ },
345
+ };
346
+
347
+ options = {
348
+ name: type,
349
+ palette: {
350
+ mode: 'light',
351
+ primary: {
352
+ main: '#F5F5F7',
353
+ },
354
+ secondary: {
355
+ main: '#a9a9a9',
356
+ },
357
+ expert: '#BD1B24',
358
+ text: {
359
+ primary: '#007AFE',
360
+ secondary: '#007AFE',
361
+ disabled: '#007AFEAA',
362
+ },
363
+ },
364
+ };
365
+ } else {
366
+ localOverrides = {
367
+ MuiLink: {
368
+ root: {
369
+ textTransform: 'uppercase',
370
+ transition: 'color .3s ease',
371
+ color: orange[400],
372
+ '&:hover': {
373
+ color: orange[300],
374
+ },
375
+ },
376
+ },
377
+ };
378
+
379
+ options = {
380
+ name: type,
381
+ palette: {
382
+ mode: 'light',
383
+ primary: {
384
+ main: '#3399CC',
385
+ dark: '#256c97',
386
+ light: '#76d0fd',
387
+ },
388
+ secondary: {
389
+ main: '#164477',
390
+ },
391
+ expert: '#14bb00',
392
+ },
393
+ };
394
+ }
395
+
396
+ options.toolbar = {
397
+ height: 48,
398
+ };
399
+
400
+ options.saveToolbar = {
401
+ background: (options.palette?.primary as SimplePaletteColorOptions)?.main,
402
+ button: {
403
+ borderRadius: 3,
404
+ height: 32,
405
+ },
406
+ };
407
+
408
+ if (options.palette) {
409
+ options.palette.grey = {
410
+ main: grey[300],
411
+ dark: grey[400],
412
+ };
413
+ }
414
+
415
+ const theme: IobTheme = createTheme(options) as IobTheme;
416
+
417
+ const palette: PaletteOptions = theme.palette as PaletteOptions;
418
+
419
+ return createTheme(theme, {
420
+ ...(overrides || undefined),
421
+ components: {
422
+ ...localOverrides,
423
+ MuiButton: {
424
+ variants: [
425
+ {
426
+ props: { variant: 'contained', color: 'grey' },
427
+ style: {
428
+ backgroundColor: palette.grey?.[300],
429
+ color:
430
+ palette.getContrastText && palette.grey?.[300]
431
+ ? palette.getContrastText(palette.grey[300])
432
+ : undefined,
433
+ },
434
+ },
435
+ {
436
+ props: { variant: 'outlined', color: 'grey' },
437
+ style: {
438
+ color: palette.text?.primary,
439
+ borderColor: palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)',
440
+ '&.Mui-disabled': {
441
+ border: `1px solid ${palette.action?.disabledBackground}`,
442
+ },
443
+ '&:hover': {
444
+ borderColor:
445
+ palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)',
446
+ backgroundColor: alpha(
447
+ palette.text?.primary || '',
448
+ palette.action?.hoverOpacity || 0.04,
449
+ ),
450
+ },
451
+ },
452
+ },
453
+ {
454
+ props: { variant: 'text', color: 'grey' },
455
+ style: {
456
+ color: palette.text?.primary,
457
+ '&:hover': {
458
+ backgroundColor: alpha(
459
+ palette.text?.primary || '',
460
+ palette.action?.hoverOpacity || 0.04,
461
+ ),
462
+ },
463
+ },
464
+ },
465
+ ],
466
+ },
467
+ ...(overrides?.components || undefined),
468
+ },
469
+ }) as IobTheme;
470
+ }
471
+
472
+ export default customTheme;