@zohodesk/components 1.6.24 → 1.6.26

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 (261) hide show
  1. package/CHANGELOG.md +2042 -0
  2. package/README.md +16 -2027
  3. package/assets/Appearance/dark/mode/Component_DarkMode.module.css +321 -330
  4. package/assets/Appearance/dark/mode/Component_v1_DarkMode.module.css +64 -79
  5. package/assets/Appearance/dark/themes/blue/blue_ComponentTheme_DarkTheme.module.css +29 -33
  6. package/assets/Appearance/dark/themes/blue/blue_componentsCTA_DarkModifyCategory.module.css +13 -13
  7. package/assets/Appearance/dark/themes/green/green_ComponentTheme_DarkTheme.module.css +29 -33
  8. package/assets/Appearance/dark/themes/green/green_componentsCTA_DarkModifyCategory.module.css +13 -13
  9. package/assets/Appearance/dark/themes/orange/orange_ComponentTheme_DarkTheme.module.css +29 -33
  10. package/assets/Appearance/dark/themes/orange/orange_componentsCTA_DarkModifyCategory.module.css +13 -13
  11. package/assets/Appearance/dark/themes/red/red_ComponentTheme_DarkTheme.module.css +29 -33
  12. package/assets/Appearance/dark/themes/red/red_componentsCTA_DarkModifyCategory.module.css +13 -13
  13. package/assets/Appearance/dark/themes/yellow/yellow_ComponentTheme_DarkTheme.module.css +29 -33
  14. package/assets/Appearance/dark/themes/yellow/yellow_componentsCTA_DarkModifyCategory.module.css +13 -13
  15. package/assets/Appearance/light/mode/Component_LightMode.module.css +321 -330
  16. package/assets/Appearance/light/mode/Component_v1_LightMode.module.css +64 -79
  17. package/assets/Appearance/light/themes/blue/blue_ComponentTheme_LightTheme.module.css +29 -33
  18. package/assets/Appearance/light/themes/blue/blue_componentsCTA_LightModifyCategory.module.css +13 -13
  19. package/assets/Appearance/light/themes/green/green_ComponentTheme_LightTheme.module.css +29 -33
  20. package/assets/Appearance/light/themes/green/green_componentsCTA_LightModifyCategory.module.css +13 -13
  21. package/assets/Appearance/light/themes/orange/orange_ComponentTheme_LightTheme.module.css +29 -33
  22. package/assets/Appearance/light/themes/orange/orange_componentsCTA_LightModifyCategory.module.css +13 -13
  23. package/assets/Appearance/light/themes/red/red_ComponentTheme_LightTheme.module.css +29 -33
  24. package/assets/Appearance/light/themes/red/red_componentsCTA_LightModifyCategory.module.css +13 -13
  25. package/assets/Appearance/light/themes/yellow/yellow_ComponentTheme_LightTheme.module.css +29 -33
  26. package/assets/Appearance/light/themes/yellow/yellow_componentsCTA_LightModifyCategory.module.css +13 -13
  27. package/assets/Appearance/pureDark/mode/Component_PureDarkMode.module.css +321 -330
  28. package/assets/Appearance/pureDark/mode/Component_v1_PureDarkMode.module.css +64 -79
  29. package/assets/Appearance/pureDark/themes/blue/blue_ComponentTheme_PureDarkTheme.module.css +29 -33
  30. package/assets/Appearance/pureDark/themes/blue/blue_componentsCTA_PureDarkModifyCategory.module.css +13 -13
  31. package/assets/Appearance/pureDark/themes/green/green_ComponentTheme_PureDarkTheme.module.css +29 -33
  32. package/assets/Appearance/pureDark/themes/green/green_componentsCTA_PureDarkModifyCategory.module.css +13 -13
  33. package/assets/Appearance/pureDark/themes/orange/orange_ComponentTheme_PureDarkTheme.module.css +29 -33
  34. package/assets/Appearance/pureDark/themes/orange/orange_componentsCTA_PureDarkModifyCategory.module.css +13 -13
  35. package/assets/Appearance/pureDark/themes/red/red_ComponentTheme_PureDarkTheme.module.css +29 -33
  36. package/assets/Appearance/pureDark/themes/red/red_componentsCTA_PureDarkModifyCategory.module.css +13 -13
  37. package/assets/Appearance/pureDark/themes/yellow/yellow_ComponentTheme_PureDarkTheme.module.css +29 -33
  38. package/assets/Appearance/pureDark/themes/yellow/yellow_componentsCTA_PureDarkModifyCategory.module.css +13 -13
  39. package/es/Accordion/Accordion.js +1 -6
  40. package/es/Accordion/AccordionItem.js +1 -6
  41. package/es/Animation/Animation.js +1 -8
  42. package/es/AppContainer/AppContainer.js +1 -6
  43. package/es/AppContainer/__tests__/__snapshots__/AppContainer.spec.js.snap +16 -16
  44. package/es/Avatar/Avatar.js +1 -6
  45. package/es/AvatarTeam/AvatarTeam.js +1 -7
  46. package/es/Button/Button.js +1 -6
  47. package/es/Buttongroup/Buttongroup.js +1 -14
  48. package/es/Card/Card.js +1 -9
  49. package/es/Card/__tests__/__snapshots__/Card.spec.js.snap +17 -17
  50. package/es/Card/__tests__/__snapshots__/CardContent.spec.js.snap +12 -12
  51. package/es/Card/__tests__/__snapshots__/CardHeader.spec.js.snap +4 -4
  52. package/es/CheckBox/CheckBox.js +1 -6
  53. package/es/CheckBox/__tests__/__snapshots__/CheckBox.spec.js.snap +88 -88
  54. package/es/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +48 -48
  55. package/es/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +30 -30
  56. package/es/DateTime/DateWidget.js +0 -10
  57. package/es/DateTime/__tests__/__snapshots__/CalendarView.spec.js.snap +49 -49
  58. package/es/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +93 -93
  59. package/es/DateTime/__tests__/__snapshots__/DateTimePopupFooter.spec.js.snap +1 -1
  60. package/es/DateTime/__tests__/__snapshots__/DateTimePopupHeader.spec.js.snap +8 -8
  61. package/es/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +7 -7
  62. package/es/DateTime/__tests__/__snapshots__/DaysRow.spec.js.snap +1 -1
  63. package/es/DateTime/__tests__/__snapshots__/Time.spec.js.snap +28 -28
  64. package/es/DropDown/DropDownHeading.js +1 -6
  65. package/es/DropDown/__tests__/__snapshots__/DropDown.spec.js.snap +2 -2
  66. package/es/Heading/Heading.js +1 -6
  67. package/es/Label/Label.js +1 -6
  68. package/es/Label/__tests__/__snapshots__/Label.spec.js.snap +4 -4
  69. package/es/ListItem/ListContainer.js +1 -6
  70. package/es/ListItem/ListItem.js +1 -6
  71. package/es/ListItem/ListItemWithAvatar.js +1 -6
  72. package/es/ListItem/ListItemWithCheckBox.js +1 -6
  73. package/es/ListItem/ListItemWithIcon.js +1 -6
  74. package/es/ListItem/ListItemWithRadio.js +1 -6
  75. package/es/ListItem/__tests__/__snapshots__/ListContainer.spec.js.snap +2 -2
  76. package/es/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +16 -16
  77. package/es/ListItem/__tests__/__snapshots__/ListItemWithAvatar.spec.js.snap +41 -41
  78. package/es/ListItem/__tests__/__snapshots__/ListItemWithCheckBox.spec.js.snap +62 -62
  79. package/es/ListItem/__tests__/__snapshots__/ListItemWithIcon.spec.js.snap +41 -41
  80. package/es/ListItem/__tests__/__snapshots__/ListItemWithRadio.spec.js.snap +62 -62
  81. package/es/Modal/Modal.js +1 -8
  82. package/es/MultiSelect/AdvancedGroupMultiSelect.js +1 -7
  83. package/es/MultiSelect/AdvancedMultiSelect.js +1 -9
  84. package/es/MultiSelect/MobileHeader/__tests__/__snapshots__/MobileHeader.spec.js.snap +3 -3
  85. package/es/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +6 -6
  86. package/es/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +50 -50
  87. package/es/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +35 -35
  88. package/es/MultiSelect/__tests__/__snapshots__/MultiSelectHeader.spec.js.snap +7 -7
  89. package/es/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +8 -8
  90. package/es/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +4 -4
  91. package/es/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +47 -47
  92. package/es/Radio/__tests__/__snapshots__/Radio.spec.js.snap +94 -94
  93. package/es/ResponsiveDropBox/__tests__/__snapshots__/ResponsiveDropBox.spec.js.snap +1 -1
  94. package/es/RippleEffect/RippleEffect.js +1 -6
  95. package/es/Select/GroupSelect.js +1 -8
  96. package/es/Select/Select.js +1 -10
  97. package/es/Select/SelectWithAvatar.js +1 -9
  98. package/es/Select/SelectWithIcon.js +1 -7
  99. package/es/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +7 -7
  100. package/es/Select/__tests__/__snapshots__/Select.spec.js.snap +831 -831
  101. package/es/Select/__tests__/__snapshots__/SelectWithAvatar.spec.js.snap +2 -2
  102. package/es/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +10 -10
  103. package/es/Switch/Switch.js +1 -6
  104. package/es/Switch/__tests__/__snapshots__/Switch.spec.js.snap +44 -44
  105. package/es/Tab/Tab.js +1 -6
  106. package/es/Tab/__tests__/__snapshots__/Tab.spec.js.snap +2 -2
  107. package/es/Tab/__tests__/__snapshots__/TabContent.spec.js.snap +1 -1
  108. package/es/Tab/__tests__/__snapshots__/TabContentWrapper.spec.js.snap +1 -1
  109. package/es/Tab/__tests__/__snapshots__/TabLayout.spec.js.snap +40 -40
  110. package/es/Tab/__tests__/__snapshots__/TabWrapper.spec.js.snap +1 -1
  111. package/es/Tab/__tests__/__snapshots__/Tabs.spec.js.snap +4 -4
  112. package/es/Tag/Tag.js +1 -6
  113. package/es/Tag/__tests__/__snapshots__/Tag.spec.js.snap +94 -94
  114. package/es/TextBox/TextBox.js +1 -8
  115. package/es/TextBoxIcon/TextBoxIcon.js +1 -8
  116. package/es/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +167 -167
  117. package/es/Textarea/Textarea.js +1 -8
  118. package/es/Tooltip/Tooltip.js +1 -8
  119. package/es/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +1 -5
  120. package/es/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +1 -5
  121. package/es/semantic/Button/Button.js +1 -6
  122. package/es/shared/ArrowIcon/__tests__/__snapshots__/ArrowIcon.spec.js.snap +20 -20
  123. package/es/shared/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +19 -19
  124. package/es/v1/Button/Button.js +198 -114
  125. package/es/v1/Button/README.md +110 -44
  126. package/es/v1/Button/__tests__/Button.spec.js +139 -48
  127. package/es/v1/Button/__tests__/__snapshots__/Button.spec.js.snap +1236 -340
  128. package/es/v1/Button/constants/index.js +29 -23
  129. package/es/v1/Button/constants/presets.js +160 -0
  130. package/es/v1/Button/css/Button_v1.module.css +33 -16
  131. package/es/v1/Button/css/cssJSLogic.js +56 -29
  132. package/es/v1/Button/props/defaultProps.js +5 -6
  133. package/es/v1/Button/props/propTypes.js +26 -8
  134. package/es/v1/Label/__tests__/__snapshots__/Label.spec.js.snap +24 -24
  135. package/es/v1/Switch/__tests__/__snapshots__/Switch.spec.js.snap +14 -14
  136. package/es/v1/helpers/colorHelpers/__tests__/colorHelper.spec.js +357 -0
  137. package/es/v1/helpers/colorHelpers/background/backgroundColor.module.css +38 -534
  138. package/es/v1/helpers/colorHelpers/border/borderColor.module.css +28 -412
  139. package/es/v1/helpers/colorHelpers/colorHelper.js +120 -139
  140. package/es/v1/helpers/colorHelpers/constants/index.js +45 -4
  141. package/es/v1/helpers/colorHelpers/index.js +0 -1
  142. package/es/v1/helpers/colorHelpers/paletteUtilities.README.md +141 -336
  143. package/es/v1/helpers/colorHelpers/text/textColor.module.css +79 -295
  144. package/es/v1/shared/{Loader/Loader.js → Spinner/Spinner.js} +5 -5
  145. package/es/v1/shared/{Loader/__tests__/Loader.spec.js → Spinner/__tests__/Spinner.spec.js} +4 -4
  146. package/{lib/v1/shared/Loader/__tests__/__snapshots__/Loader.spec.js.snap → es/v1/shared/Spinner/__tests__/__snapshots__/Spinner.spec.js.snap} +2 -2
  147. package/lib/Accordion/Accordion.js +1 -6
  148. package/lib/Accordion/AccordionItem.js +1 -6
  149. package/lib/Animation/Animation.js +1 -8
  150. package/lib/AppContainer/AppContainer.js +1 -6
  151. package/lib/AppContainer/__tests__/__snapshots__/AppContainer.spec.js.snap +16 -16
  152. package/lib/Avatar/Avatar.js +1 -6
  153. package/lib/AvatarTeam/AvatarTeam.js +1 -7
  154. package/lib/Button/Button.js +1 -7
  155. package/lib/Buttongroup/Buttongroup.js +1 -14
  156. package/lib/Card/Card.js +1 -8
  157. package/lib/Card/__tests__/__snapshots__/Card.spec.js.snap +17 -17
  158. package/lib/Card/__tests__/__snapshots__/CardContent.spec.js.snap +12 -12
  159. package/lib/Card/__tests__/__snapshots__/CardHeader.spec.js.snap +4 -4
  160. package/lib/CheckBox/CheckBox.js +1 -6
  161. package/lib/CheckBox/__tests__/__snapshots__/CheckBox.spec.js.snap +88 -88
  162. package/lib/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +48 -48
  163. package/lib/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +30 -30
  164. package/lib/DateTime/DateWidget.js +0 -10
  165. package/lib/DateTime/__tests__/__snapshots__/CalendarView.spec.js.snap +49 -49
  166. package/lib/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +93 -93
  167. package/lib/DateTime/__tests__/__snapshots__/DateTimePopupFooter.spec.js.snap +1 -1
  168. package/lib/DateTime/__tests__/__snapshots__/DateTimePopupHeader.spec.js.snap +8 -8
  169. package/lib/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +7 -7
  170. package/lib/DateTime/__tests__/__snapshots__/DaysRow.spec.js.snap +1 -1
  171. package/lib/DateTime/__tests__/__snapshots__/Time.spec.js.snap +28 -28
  172. package/lib/DropDown/DropDownHeading.js +1 -6
  173. package/lib/DropDown/__tests__/__snapshots__/DropDown.spec.js.snap +2 -2
  174. package/lib/Heading/Heading.js +1 -6
  175. package/lib/Label/Label.js +1 -6
  176. package/lib/Label/__tests__/__snapshots__/Label.spec.js.snap +4 -4
  177. package/lib/ListItem/ListContainer.js +1 -7
  178. package/lib/ListItem/ListItem.js +1 -6
  179. package/lib/ListItem/ListItemWithAvatar.js +1 -6
  180. package/lib/ListItem/ListItemWithCheckBox.js +1 -6
  181. package/lib/ListItem/ListItemWithIcon.js +1 -6
  182. package/lib/ListItem/ListItemWithRadio.js +1 -6
  183. package/lib/ListItem/__tests__/__snapshots__/ListContainer.spec.js.snap +2 -2
  184. package/lib/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +16 -16
  185. package/lib/ListItem/__tests__/__snapshots__/ListItemWithAvatar.spec.js.snap +41 -41
  186. package/lib/ListItem/__tests__/__snapshots__/ListItemWithCheckBox.spec.js.snap +62 -62
  187. package/lib/ListItem/__tests__/__snapshots__/ListItemWithIcon.spec.js.snap +41 -41
  188. package/lib/ListItem/__tests__/__snapshots__/ListItemWithRadio.spec.js.snap +62 -62
  189. package/lib/Modal/Modal.js +1 -8
  190. package/lib/MultiSelect/AdvancedGroupMultiSelect.js +1 -7
  191. package/lib/MultiSelect/AdvancedMultiSelect.js +1 -9
  192. package/lib/MultiSelect/MobileHeader/__tests__/__snapshots__/MobileHeader.spec.js.snap +3 -3
  193. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +6 -6
  194. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +50 -50
  195. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +35 -35
  196. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelectHeader.spec.js.snap +7 -7
  197. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +8 -8
  198. package/lib/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +4 -4
  199. package/lib/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +47 -47
  200. package/lib/Radio/__tests__/__snapshots__/Radio.spec.js.snap +94 -94
  201. package/lib/ResponsiveDropBox/__tests__/__snapshots__/ResponsiveDropBox.spec.js.snap +1 -1
  202. package/lib/RippleEffect/RippleEffect.js +1 -6
  203. package/lib/Select/GroupSelect.js +1 -9
  204. package/lib/Select/Select.js +1 -11
  205. package/lib/Select/SelectWithAvatar.js +1 -9
  206. package/lib/Select/SelectWithIcon.js +1 -7
  207. package/lib/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +7 -7
  208. package/lib/Select/__tests__/__snapshots__/Select.spec.js.snap +831 -831
  209. package/lib/Select/__tests__/__snapshots__/SelectWithAvatar.spec.js.snap +2 -2
  210. package/lib/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +10 -10
  211. package/lib/Switch/Switch.js +1 -6
  212. package/lib/Switch/__tests__/__snapshots__/Switch.spec.js.snap +44 -44
  213. package/lib/Tab/Tab.js +1 -6
  214. package/lib/Tab/__tests__/__snapshots__/Tab.spec.js.snap +2 -2
  215. package/lib/Tab/__tests__/__snapshots__/TabContent.spec.js.snap +1 -1
  216. package/lib/Tab/__tests__/__snapshots__/TabContentWrapper.spec.js.snap +1 -1
  217. package/lib/Tab/__tests__/__snapshots__/TabLayout.spec.js.snap +40 -40
  218. package/lib/Tab/__tests__/__snapshots__/TabWrapper.spec.js.snap +1 -1
  219. package/lib/Tab/__tests__/__snapshots__/Tabs.spec.js.snap +4 -4
  220. package/lib/Tag/Tag.js +1 -6
  221. package/lib/Tag/__tests__/__snapshots__/Tag.spec.js.snap +94 -94
  222. package/lib/TextBox/TextBox.js +1 -8
  223. package/lib/TextBoxIcon/TextBoxIcon.js +1 -8
  224. package/lib/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +167 -167
  225. package/lib/Textarea/Textarea.js +1 -8
  226. package/lib/Tooltip/Tooltip.js +1 -8
  227. package/lib/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +1 -5
  228. package/lib/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +1 -5
  229. package/lib/semantic/Button/Button.js +1 -6
  230. package/lib/shared/ArrowIcon/__tests__/__snapshots__/ArrowIcon.spec.js.snap +20 -20
  231. package/lib/shared/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +19 -19
  232. package/lib/v1/Button/Button.js +208 -124
  233. package/lib/v1/Button/README.md +110 -44
  234. package/lib/v1/Button/__tests__/Button.spec.js +195 -88
  235. package/lib/v1/Button/__tests__/__snapshots__/Button.spec.js.snap +1236 -340
  236. package/lib/v1/Button/constants/index.js +34 -31
  237. package/lib/v1/Button/constants/presets.js +179 -0
  238. package/lib/v1/Button/css/Button_v1.module.css +33 -16
  239. package/lib/v1/Button/css/cssJSLogic.js +45 -25
  240. package/lib/v1/Button/props/defaultProps.js +4 -5
  241. package/lib/v1/Button/props/propTypes.js +41 -7
  242. package/lib/v1/Label/__tests__/__snapshots__/Label.spec.js.snap +24 -24
  243. package/lib/v1/Switch/__tests__/__snapshots__/Switch.spec.js.snap +14 -14
  244. package/lib/v1/helpers/colorHelpers/__tests__/colorHelper.spec.js +363 -0
  245. package/lib/v1/helpers/colorHelpers/background/backgroundColor.module.css +38 -534
  246. package/lib/v1/helpers/colorHelpers/border/borderColor.module.css +28 -412
  247. package/lib/v1/helpers/colorHelpers/colorHelper.js +130 -153
  248. package/lib/v1/helpers/colorHelpers/constants/index.js +45 -4
  249. package/lib/v1/helpers/colorHelpers/index.js +2 -24
  250. package/lib/v1/helpers/colorHelpers/paletteUtilities.README.md +141 -336
  251. package/lib/v1/helpers/colorHelpers/text/textColor.module.css +79 -295
  252. package/lib/v1/shared/{Loader/Loader.js → Spinner/Spinner.js} +8 -8
  253. package/lib/v1/shared/{Loader/__tests__/Loader.spec.js → Spinner/__tests__/Spinner.spec.js} +4 -4
  254. package/{es/v1/shared/Loader/__tests__/__snapshots__/Loader.spec.js.snap → lib/v1/shared/Spinner/__tests__/__snapshots__/Spinner.spec.js.snap} +2 -2
  255. package/package.json +19 -19
  256. /package/es/v1/shared/{Loader/Loader_v1.module.css → Spinner/Spinner_v1.module.css} +0 -0
  257. /package/es/v1/shared/{Loader → Spinner}/props/defaultProps.js +0 -0
  258. /package/es/v1/shared/{Loader → Spinner}/props/propTypes.js +0 -0
  259. /package/lib/v1/shared/{Loader/Loader_v1.module.css → Spinner/Spinner_v1.module.css} +0 -0
  260. /package/lib/v1/shared/{Loader → Spinner}/props/defaultProps.js +0 -0
  261. /package/lib/v1/shared/{Loader → Spinner}/props/propTypes.js +0 -0
@@ -6,31 +6,31 @@ import React, { forwardRef, memo, useMemo } from 'react';
6
6
  import { withComponentRegistrar } from '@zohodesk/dotkit/es/react/ComponentRegistry';
7
7
  import Icon from '@zohodesk/icons/es/Icon';
8
8
  import Flex from '@zohodesk/layout/es/Flex/Flex';
9
- import Typography from "../../Typography/Typography";
10
- import { isRenderable } from '@zohodesk/utils/es/renderNode';
11
- import renderNode from '@zohodesk/utils/es/renderNode';
12
- import propTypes from "./props/propTypes";
13
- import defaultProps from "./props/defaultProps";
9
+ import renderNode, { isRenderable } from '@zohodesk/utils/es/renderNode';
14
10
  import { DUMMY_OBJECT } from '@zohodesk/dotkit/es/utils/constants';
15
11
  import { ICON_PLACEMENT, LOADER_PLACEMENT, STATUS, TYPOGRAPHY_SIZE_MAP, VARIANT } from "./constants";
16
- import Loader from "../shared/Loader/Loader";
12
+ import Typography from "../../Typography/Typography";
13
+ import Spinner from "../shared/Spinner/Spinner";
17
14
  import SuccessTick from "../shared/SuccessTick/SuccessTick";
18
15
  import cssJSLogic from "./css/cssJSLogic";
16
+ import propTypes from "./props/propTypes";
17
+ import defaultProps from "./props/defaultProps";
19
18
 
20
19
  const getTypographySize = size => TYPOGRAPHY_SIZE_MAP[size] || '13';
21
20
 
22
- const Button = /*#__PURE__*/forwardRef(function Button(props, ref) {
21
+ export const ButtonPresentational = /*#__PURE__*/forwardRef(function ButtonPresentational(props, ref) {
23
22
  const {
24
- palette,
25
- bgAppearance,
26
- borderAppearance,
23
+ isLoading,
24
+ isSuccess,
25
+ isDisabled,
26
+ isDisabledState,
27
+ overlayActive,
27
28
  variant,
28
- status,
29
+ iconPlacement,
29
30
  loaderPlacement,
30
31
  size,
31
32
  iconName,
32
33
  iconSize,
33
- iconPlacement,
34
34
  renderIcon,
35
35
  renderBefore,
36
36
  renderAfter,
@@ -38,131 +38,107 @@ const Button = /*#__PURE__*/forwardRef(function Button(props, ref) {
38
38
  renderSuccess,
39
39
  children,
40
40
  type,
41
- onClick,
42
- isDisabled,
43
- isReadOnly,
44
41
  isSelected,
45
- shape,
46
- paletteShade,
47
- disabledAppearance,
48
42
  title,
49
43
  customProps,
50
44
  customAttributes,
51
45
  a11yAttributes,
52
46
  customId,
53
- testId
47
+ testId,
48
+ dataSelectorId,
49
+ handleClick,
50
+ classNames
54
51
  } = props;
55
- const isLoading = status === STATUS.LOADING;
56
- const isSuccess = status === STATUS.SUCCESS;
57
- const isDisabledState = isDisabled || isLoading;
58
- const isInteractionDisabled = isDisabledState || isReadOnly;
59
- const overlayActive = (isLoading || isSuccess) && loaderPlacement === LOADER_PLACEMENT.OVERLAY;
60
- const {
61
- text: contentProps = DUMMY_OBJECT,
62
- icon: iconProps = DUMMY_OBJECT
63
- } = customProps;
64
- const iconTagAttributes = useMemo(() => ({ ...(iconProps.tagAttributes || DUMMY_OBJECT),
65
- 'data-test-id': testId ? `${testId}_icon` : undefined
66
- }), [iconProps.tagAttributes, testId]);
67
- const classes = useMemo(() => cssJSLogic({
68
- props
69
- }), [palette, bgAppearance, borderAppearance, paletteShade, size, variant, status, isDisabled, isReadOnly, isSelected, shape, loaderPlacement, disabledAppearance, props.customClass]);
70
52
  const {
71
53
  loaderOverlayClass,
72
54
  successOverlayClass,
73
55
  contentWrapperClass,
74
56
  textClassName,
75
57
  buttonClassName,
76
- iconClassName
77
- } = classes;
78
- const showIcon = variant !== VARIANT.TEXT && (renderIcon || iconName);
79
-
80
- const _handleClick = event => {
81
- if (isInteractionDisabled) {
82
- return;
83
- }
84
-
85
- onClick(event);
58
+ iconClassName,
59
+ loaderClassName,
60
+ successClassName
61
+ } = classNames;
62
+ const {
63
+ text: contentProps = DUMMY_OBJECT,
64
+ icon: iconProps = DUMMY_OBJECT
65
+ } = customProps || DUMMY_OBJECT;
66
+ const {
67
+ button: buttonAttributes = DUMMY_OBJECT,
68
+ contentWrapper: contentWrapperAttributes = DUMMY_OBJECT,
69
+ loader: loaderAttributes = DUMMY_OBJECT,
70
+ success: successAttributes = DUMMY_OBJECT,
71
+ icon: iconAttributes = DUMMY_OBJECT,
72
+ text: textAttributes = DUMMY_OBJECT
73
+ } = customAttributes || DUMMY_OBJECT;
74
+ const iconTagAttributes = { ...iconAttributes,
75
+ ...(testId && {
76
+ 'data-test-id': `${testId}_icon`
77
+ })
86
78
  };
87
79
 
88
80
  const _renderLoader = () => {
89
- if (!isLoading) {
90
- return null;
91
- }
92
-
93
- if (isRenderable(renderLoader)) {
94
- return renderNode(renderLoader, {
95
- status
96
- });
97
- }
98
-
99
- const loaderClassName = loaderPlacement === LOADER_PLACEMENT.OVERLAY ? loaderOverlayClass : '';
81
+ if (!isLoading) return null;
82
+ const isOverlay = loaderPlacement === LOADER_PLACEMENT.OVERLAY;
83
+ const hasCustomLoader = isRenderable(renderLoader);
84
+ if (hasCustomLoader && !isOverlay) return renderNode(renderLoader, {
85
+ status: STATUS.LOADING
86
+ });
100
87
  return /*#__PURE__*/React.createElement(Flex, {
101
88
  $ui_displayMode: "flex",
102
89
  $ui_alignItems: "center",
103
90
  $ui_justifyContent: "center",
104
- $ui_className: loaderClassName,
105
- testId: testId ? `${testId}_loader` : undefined
106
- }, /*#__PURE__*/React.createElement(Loader, null));
91
+ $ui_className: isOverlay ? loaderOverlayClass : '',
92
+ testId: testId ? `${testId}_loader` : undefined,
93
+ customId: customId ? `${customId}_loader` : undefined,
94
+ $tagAttributes_container: hasCustomLoader ? undefined : loaderAttributes
95
+ }, hasCustomLoader ? renderNode(renderLoader, {
96
+ status: STATUS.LOADING
97
+ }) : /*#__PURE__*/React.createElement(Spinner, {
98
+ customClass: loaderClassName
99
+ }));
107
100
  };
108
101
 
109
102
  const _renderSuccess = () => {
110
- if (!isSuccess) {
111
- return null;
112
- }
113
-
114
- if (isRenderable(renderSuccess)) {
115
- return renderNode(renderSuccess, {
116
- status
117
- });
118
- }
119
-
120
- const successClassName = loaderPlacement === LOADER_PLACEMENT.OVERLAY ? successOverlayClass : '';
103
+ if (!isSuccess) return null;
104
+ const isOverlay = loaderPlacement === LOADER_PLACEMENT.OVERLAY;
105
+ const hasCustomSuccess = isRenderable(renderSuccess);
106
+ if (hasCustomSuccess && !isOverlay) return renderNode(renderSuccess, {
107
+ status: STATUS.SUCCESS
108
+ });
121
109
  return /*#__PURE__*/React.createElement(Flex, {
122
110
  $ui_displayMode: "flex",
123
111
  $ui_alignItems: "center",
124
112
  $ui_justifyContent: "center",
125
- $ui_className: successClassName,
126
- testId: testId ? `${testId}_success` : undefined
127
- }, /*#__PURE__*/React.createElement(SuccessTick, null));
113
+ $ui_className: isOverlay ? successOverlayClass : '',
114
+ testId: testId ? `${testId}_success` : undefined,
115
+ customId: customId ? `${customId}_success` : undefined,
116
+ $tagAttributes_container: hasCustomSuccess ? undefined : successAttributes
117
+ }, hasCustomSuccess ? renderNode(renderSuccess, {
118
+ status: STATUS.SUCCESS
119
+ }) : /*#__PURE__*/React.createElement(SuccessTick, {
120
+ customClass: successClassName
121
+ }));
128
122
  };
129
123
 
130
124
  const _renderIconNode = () => {
131
- if (!showIcon) {
132
- return null;
133
- }
134
-
135
- if (isRenderable(renderIcon)) {
136
- return renderNode(renderIcon);
137
- }
138
-
125
+ const showIcon = variant !== VARIANT.TEXT && (renderIcon || iconName);
126
+ if (!showIcon) return null;
127
+ if (isRenderable(renderIcon)) return renderNode(renderIcon, {
128
+ iconName,
129
+ iconSize
130
+ });
139
131
  return /*#__PURE__*/React.createElement(Icon, _extends({}, iconProps, {
140
132
  iconClass: iconClassName,
141
133
  name: iconName,
142
134
  size: iconSize,
143
135
  tagAttributes: iconTagAttributes,
144
- dataId: testId ? `${testId}_icon` : undefined
136
+ dataId: customId ? `${customId}_icon` : undefined
145
137
  }));
146
138
  };
147
139
 
148
- const _renderBeforeNode = () => {
149
- if (!isRenderable(renderBefore)) {
150
- return null;
151
- }
152
-
153
- return renderNode(renderBefore, props);
154
- };
155
-
156
- const _renderAfterNode = () => {
157
- if (!isRenderable(renderAfter)) {
158
- return null;
159
- }
160
-
161
- return renderNode(renderAfter, props);
162
- };
163
-
164
140
  const _renderContent = () => {
165
- const shouldShowText = variant !== VARIANT.ICON && children !== undefined && children !== null;
141
+ const shouldShowText = variant !== VARIANT.ICON && children != null && (typeof children !== 'string' || children.trim() !== '');
166
142
  const showLoaderStart = isLoading && loaderPlacement === LOADER_PLACEMENT.START;
167
143
  const showLoaderAfter = isLoading && loaderPlacement === LOADER_PLACEMENT.END;
168
144
  const showSuccessStart = isSuccess && loaderPlacement === LOADER_PLACEMENT.START;
@@ -173,30 +149,138 @@ const Button = /*#__PURE__*/forwardRef(function Button(props, ref) {
173
149
  $flag_shrink: true,
174
150
  $ui_alignItems: "center",
175
151
  $ui_justifyContent: "center",
176
- $ui_className: contentWrapperClass
177
- }, showLoaderStart ? _renderLoader() : null, showSuccessStart ? _renderSuccess() : null, _renderBeforeNode(), iconPlacement === ICON_PLACEMENT.LEFT ? _renderIconNode() : null, shouldShowText ? /*#__PURE__*/React.createElement(Typography, _extends({}, contentProps, {
178
- $ui_className: textClassName,
179
- $ui_size: getTypographySize(size),
180
- $flag_dotted: variant !== VARIANT.ICON
181
- }), children) : null, iconPlacement === ICON_PLACEMENT.RIGHT ? _renderIconNode() : null, _renderAfterNode(), showLoaderAfter ? _renderLoader() : null, showSuccessAfter ? _renderSuccess() : null);
152
+ $ui_className: contentWrapperClass,
153
+ $tagAttributes_container: contentWrapperAttributes
154
+ }, showLoaderStart ? _renderLoader() : null, showSuccessStart ? _renderSuccess() : null, isRenderable(renderBefore) ? renderNode(renderBefore, props) : null, iconPlacement === ICON_PLACEMENT.START ? _renderIconNode() : null, shouldShowText ? typeof children === 'string' ? /*#__PURE__*/React.createElement(Typography, _extends({
155
+ size: getTypographySize(size)
156
+ }, contentProps, {
157
+ tagAttributes: textAttributes,
158
+ customClass: textClassName,
159
+ isDotted: true
160
+ }), children) : children : null, iconPlacement === ICON_PLACEMENT.END ? _renderIconNode() : null, isRenderable(renderAfter) ? renderNode(renderAfter, props) : null, showLoaderAfter ? _renderLoader() : null, showSuccessAfter ? _renderSuccess() : null);
182
161
  };
183
162
 
184
- const containerAttributes = { ...customAttributes,
185
- 'data-id': customId,
186
- 'data-test-id': testId,
187
- 'data-title': title
163
+ const containerAttributes = { ...buttonAttributes,
164
+ ...(customId && {
165
+ 'data-id': isDisabled ? `${customId}_disabled` : customId
166
+ }),
167
+ ...(testId && {
168
+ 'data-test-id': isDisabled ? `${testId}_disabled` : testId
169
+ }),
170
+ ...(dataSelectorId && {
171
+ 'data-selector-id': dataSelectorId
172
+ }),
173
+ ...(title && {
174
+ 'data-title': title
175
+ })
188
176
  };
189
- return /*#__PURE__*/React.createElement("button", _extends({}, containerAttributes, a11yAttributes, {
177
+ return /*#__PURE__*/React.createElement("button", _extends({}, containerAttributes, {
178
+ "aria-busy": isLoading,
179
+ "aria-disabled": isDisabledState,
180
+ "aria-pressed": isSelected
181
+ }, a11yAttributes, {
190
182
  ref: ref,
191
183
  type: type,
192
184
  className: cn(buttonClassName),
193
- "aria-busy": isLoading,
194
- "aria-disabled": isDisabledState,
195
- "aria-readonly": isReadOnly,
196
- "aria-pressed": isSelected,
197
- onClick: _handleClick
185
+ onClick: handleClick
198
186
  }), _renderContent(), overlayActive ? isLoading ? _renderLoader() : _renderSuccess() : null);
199
187
  });
188
+ ButtonPresentational.displayName = 'ButtonPresentational';
189
+ const Button = /*#__PURE__*/forwardRef(function Button(props, ref) {
190
+ const {
191
+ palette,
192
+ appearance,
193
+ hoverAppearance,
194
+ selectedAppearance,
195
+ variant,
196
+ status,
197
+ loaderPlacement,
198
+ size,
199
+ iconName,
200
+ iconSize,
201
+ iconPlacement,
202
+ renderIcon,
203
+ renderBefore,
204
+ renderAfter,
205
+ renderLoader,
206
+ renderSuccess,
207
+ children,
208
+ type,
209
+ onClick,
210
+ isDisabled,
211
+ isSelected,
212
+ shape,
213
+ disabledAppearance,
214
+ title,
215
+ customProps,
216
+ customAttributes,
217
+ a11yAttributes,
218
+ customId,
219
+ testId,
220
+ dataSelectorId,
221
+ customClass
222
+ } = props;
223
+ const isLoading = status === STATUS.LOADING;
224
+ const isSuccess = status === STATUS.SUCCESS;
225
+ const isDisabledState = isDisabled || isLoading;
226
+ const overlayActive = (isLoading || isSuccess) && loaderPlacement === LOADER_PLACEMENT.OVERLAY;
227
+ const classNames = useMemo(() => cssJSLogic({
228
+ props: {
229
+ palette,
230
+ appearance,
231
+ hoverAppearance,
232
+ selectedAppearance,
233
+ size,
234
+ variant,
235
+ status,
236
+ isDisabled,
237
+ isSelected,
238
+ shape,
239
+ loaderPlacement,
240
+ disabledAppearance,
241
+ customClass
242
+ }
243
+ }), [palette, appearance, hoverAppearance, selectedAppearance, size, variant, status, isDisabled, isSelected, shape, loaderPlacement, disabledAppearance, customClass]);
244
+
245
+ const handleClick = event => {
246
+ if (isDisabledState) return;
247
+ onClick(event);
248
+ };
249
+
250
+ const essentials = {
251
+ isLoading,
252
+ isSuccess,
253
+ isDisabled,
254
+ isDisabledState,
255
+ overlayActive,
256
+ variant,
257
+ iconPlacement,
258
+ loaderPlacement,
259
+ size,
260
+ iconName,
261
+ iconSize,
262
+ renderIcon,
263
+ renderBefore,
264
+ renderAfter,
265
+ renderLoader,
266
+ renderSuccess,
267
+ children,
268
+ type,
269
+ isSelected,
270
+ title,
271
+ customProps,
272
+ customAttributes,
273
+ a11yAttributes,
274
+ customId,
275
+ testId,
276
+ dataSelectorId,
277
+ handleClick
278
+ };
279
+ return /*#__PURE__*/React.createElement(ButtonPresentational, _extends({}, essentials, {
280
+ classNames: classNames,
281
+ ref: ref
282
+ }));
283
+ });
200
284
  Button.propTypes = propTypes;
201
285
  Button.defaultProps = defaultProps;
202
286
  Button.displayName = 'Button';
@@ -18,93 +18,159 @@ import Button from '@zohodesk/components/es/v1/Button/Button';
18
18
  </Button>
19
19
  ```
20
20
 
21
- ### With Palette Variants
21
+ ### With Palette
22
22
 
23
23
  ```jsx
24
- <Button palette="primary">Save</Button>
24
+ <Button palette="brand">Save</Button>
25
25
  <Button palette="danger">Delete</Button>
26
26
  <Button palette="success">Confirm</Button>
27
27
  ```
28
28
 
29
+ ### With Appearance
30
+
31
+ `appearance`, `hoverAppearance`, and `selectedAppearance` are objects with optional `bg`, `border`, and `text` keys. Each key accepts `true` (use palette color), `false` (suppress), or a palette name string.
32
+
33
+ ```jsx
34
+ <Button palette="brand" appearance={{ bg: false, border: true }}>
35
+ Ghost
36
+ </Button>
37
+
38
+ <Button
39
+ palette="brand"
40
+ appearance={{ bg: false, border: true }}
41
+ hoverAppearance={{ bg: false, border: true }}
42
+ selectedAppearance={{ bg: false, border: true }}
43
+ >
44
+ Ghost with states
45
+ </Button>
46
+ ```
47
+
48
+ ### Using Presets
49
+
50
+ ```jsx
51
+ import {
52
+ BRAND_GHOST,
53
+ BRAND_TEXT_ONLY,
54
+ SECONDARY_GHOST_BRAND_TINTED_ONSELECT,
55
+ SECONDARY_GHOST_CANCEL,
56
+ BRAND_TINTED_OUTLINE,
57
+ BRAND_TEXT_TINTED_HOVER
58
+ } from '@zohodesk/components/es/v1/Button/constants/presets';
59
+
60
+ <Button {...BRAND_GHOST}>Brand Ghost</Button>
61
+ <Button {...BRAND_TEXT_ONLY}>Brand Text Only</Button>
62
+ <Button {...SECONDARY_GHOST_BRAND_TINTED_ONSELECT}>Secondary Ghost</Button>
63
+ ```
64
+
29
65
  ### With Icon
30
66
 
31
67
  ```jsx
32
68
  <Button variant="icon" iconName="ZD-plus" iconSize={20} />
33
69
 
34
- <Button variant="iconWithText" iconName="ZD-plus" iconPlacement="left">
70
+ <Button variant="iconWithText" iconName="ZD-plus" iconPlacement="start">
35
71
  Add Item
36
72
  </Button>
37
73
  ```
38
74
 
39
- ### Loading State
75
+ ### Loading / Success State
40
76
 
41
77
  ```jsx
42
- <Button status="loading" loaderPlacement="overlay">
43
- Saving...
44
- </Button>
45
-
46
- <Button status="loading" loaderPlacement="start">
47
- Loading
48
- </Button>
78
+ <Button status="loading" loaderPlacement="overlay">Saving...</Button>
79
+ <Button status="loading" loaderPlacement="start">Loading</Button>
80
+ <Button status="success">Done</Button>
49
81
  ```
50
82
 
51
- ### Disabled / Read Only
83
+ ### Disabled
52
84
 
53
85
  ```jsx
54
86
  <Button isDisabled>Disabled</Button>
55
- <Button isReadOnly>Read Only</Button>
87
+ <Button isDisabled disabledAppearance="strike">Disabled Strike</Button>
88
+ ```
89
+
90
+ ### Shape
91
+
92
+ ```jsx
93
+ <Button shape="pill">Pill</Button>
94
+ <Button shape="rectangle">Rectangle</Button>
95
+ <Button shape="roundedRectangle">Rounded</Button>
56
96
  ```
57
97
 
58
98
  ## Props
59
99
 
60
100
  | Prop | Type | Default | Description |
61
101
  |---|---|---|---|
62
- | `customId` | `string` | — | `data-id` attribute for automation |
63
- | `testId` | `string` | — | `data-test-id` attribute for testing |
64
- | `palette` | `oneOf: default, primary, secondary, danger, success` | `default` | Color palette |
65
- | `bgAppearance` | `oneOf: filled, onHover, none` | `filled` | Background behavior |
66
- | `borderAppearance` | `oneOf: default, onHover, none` | `default` | Border behavior |
102
+ | `palette` | `oneOf: brand, brandLighter, info, infoLighter, secondary, secondaryLighter, danger, dangerLighter, success, successLighter, warning, warningLighter` | `''` | Color palette |
103
+ | `appearance` | `{ bg?, border?, text? }` | `{ bg: true, text: true }` | Color treatments at rest. Values: `true`, `false`, or a palette name |
104
+ | `hoverAppearance` | `{ bg?, border?, text? }` | `{ bg: true, text: true }` | Color treatments on hover/focus/active |
105
+ | `selectedAppearance` | `{ bg?, border?, text? }` | `{ bg: true, text: true }` | Color treatments when `isSelected` is true |
67
106
  | `variant` | `oneOf: text, icon, iconWithText` | `text` | Display variant |
68
107
  | `size` | `oneOf: small, medium, large, full` | `medium` | Size variant |
69
108
  | `status` | `oneOf: default, loading, success` | `default` | Status state |
70
- | `loaderPlacement` | `oneOf: start, end, overlay` | `overlay` | Where loader appears |
109
+ | `loaderPlacement` | `oneOf: start, end, overlay` | `overlay` | Where the loader appears |
110
+ | `shape` | `oneOf: pill, rectangle, roundedRectangle` | `roundedRectangle` | Border shape |
71
111
  | `iconName` | `string` | — | Icon name from `@zohodesk/icons` |
72
112
  | `iconSize` | `number` | `16` | Icon size in pixels |
73
- | `iconPlacement` | `oneOf: left, right` | `left` | Icon position relative to text |
74
- | `paletteShade` | `oneOf: default, lighter` | `default` | Shade variant |
75
- | `disabledAppearance` | `oneOf: none, dull, strike` | `dull` | Disabled visual style |
113
+ | `iconPlacement` | `oneOf: start, end` | `start` | Icon position relative to text |
114
+ | `disabledAppearance` | `oneOf: none, dull, strike` | `dull` | Visual style when disabled |
115
+ | `isDisabled` | `bool` | `false` | Disables the button |
116
+ | `isSelected` | `bool` | `false` | Selected/pressed state (`aria-pressed`) |
117
+ | `type` | `oneOf: button, submit, reset` | `button` | HTML button type |
118
+ | `onClick` | `func` | — | Click handler (suppressed when disabled or loading) |
119
+ | `title` | `string` | — | Tooltip / `data-title` attribute |
120
+ | `children` | `node` | — | Button label content |
76
121
  | `renderIcon` | `node \| func` | — | Custom icon render slot |
77
122
  | `renderBefore` | `node \| func` | — | Slot before main content |
78
123
  | `renderAfter` | `node \| func` | — | Slot after main content |
79
124
  | `renderLoader` | `node \| func` | — | Custom loader render slot |
80
125
  | `renderSuccess` | `node \| func` | — | Custom success render slot |
81
- | `children` | `node` | — | Button text content |
82
- | `type` | `oneOf: button, submit, reset` | `button` | HTML button type |
83
- | `onClick` | `func` | — | Click event handler |
84
- | `isDisabled` | `bool` | `false` | Disables the button |
85
- | `isReadOnly` | `bool` | `false` | Read-only state |
86
- | `isSelected` | `bool` | `false` | Selected/pressed state |
87
- | `isRounded` | `bool` | `false` | Rounded border radius |
88
- | `title` | `string` | — | Title/tooltip text |
126
+ | `customId` | `string` | — | `data-id` attribute |
127
+ | `testId` | `string` | — | `data-test-id` attribute |
128
+ | `dataSelectorId` | `string` | — | `data-selector-id` attribute |
129
+ | `a11yAttributes` | `object` | `{}` | Extra ARIA/accessibility attributes spread onto `<button>` |
130
+ | `customClass` | `{ wrapper?, text?, icon?, loader?, success? }` | `{}` | CSS class overrides per part |
131
+ | `customProps` | `{ text?, icon? }` | `{}` | Extra props forwarded to text/icon sub-elements |
132
+ | `customAttributes` | `{ button?, contentWrapper?, loader?, success?, icon?, text? }` | `{}` | Extra HTML attributes per internal element |
133
+
134
+ ## Presets
135
+
136
+ Ready-made palette + appearance combinations exported from `constants/presets`:
137
+
138
+ | Name | Palette | Appearance | Description |
139
+ |---|---|---|---|
140
+ | `BRAND_GHOST` | `brand` | `{ bg: false, border: true }` | Transparent bg, brand border |
141
+ | `BRAND_TEXT_ONLY` | `brand` | `{ bg: false }` | Text only, no border |
142
+ | `BRAND_TINTED_OUTLINE` | `brandLighter` | `{ border: true }` | Tinted fill, brand border |
143
+ | `SUCCESS_GHOST` | `success` | `{ bg: false, border: true }` | Transparent bg, success border |
144
+ | `SUCCESS_TEXT_ONLY` | `success` | `{ bg: false }` | Text only, no border |
145
+ | `SUCCESS_TINTED_OUTLINE` | `successLighter` | `{ border: true }` | Tinted fill, success border |
146
+ | `SECONDARY_GHOST_BRAND_TINTED_ONSELECT` | `secondary` | `{ bg: false, border: true }` | Secondary ghost; selected state switches to brand tint |
147
+ | `SECONDARY_GHOST_CANCEL` | `secondary` | `{ bg: false, border: true }` | Secondary ghost without a selected state; cancel / dismiss buttons |
148
+ | `BLACK_TEXT_BRAND_ONHOVER` | `brand` | `{ bg: false, text: 'black' }` | Black text, brand color on hover |
149
+ | `BRAND_BG_ONSELECT` | `brand` | `{ bg: false, border: true }` | Ghost without a defined selected state |
150
+ | `BRAND_TEXT_TINTED_HOVER` | `brandLighter` | `{ bg: false }` | Ghost that becomes tinted on hover |
151
+ | `BRAND_TEXT_TINTED_DANGER_HOVER` | `brandLighter` | `{ bg: false }` | Ghost that becomes danger-tinted on hover |
89
152
 
90
153
  ## Customization
91
154
 
92
155
  ### Parts
93
156
 
94
- | Part | Element | Description |
157
+ | Part key | Element | Description |
95
158
  |---|---|---|
96
- | `wrapper` | `<button>` root | The outermost button element |
97
- | `text` | Typography | The text label |
98
-
99
- ### CSS Custom Properties
159
+ | `button` | `<button>` | Outermost button element |
160
+ | `contentWrapper` | Inner `<Flex>` | Wraps icon + text content |
161
+ | `text` | `<Typography>` | Text label |
162
+ | `icon` | `<Icon>` | Icon element |
163
+ | `loader` | `<Flex>` | Loader wrapper |
164
+ | `success` | `<Flex>` | Success tick wrapper |
100
165
 
101
- The `.varClass` block in `Button.module.css` defines local custom properties that size variants override:
166
+ Pass class overrides via `customClass`, extra props via `customProps`, or arbitrary HTML attributes via `customAttributes`.
102
167
 
103
- | Property | Default | Description |
104
- |---|---|---|
105
- | `--local-Button-radius` | `4px` | Border radius |
106
- | `--local-Button-gap` | `8px` | Content gap |
107
- | `--local-Button-padding-block` | `6px` | Block padding |
108
- | `--local-Button-padding-inline` | `15px` | Inline padding |
109
- | `--local-Button-min-width` | `90px` | Minimum width |
110
- | `--local-Button-spinner-size` | `16px` | Spinner/tick size |
168
+ ```jsx
169
+ <Button
170
+ customClass={{ wrapper: 'myBtn', text: 'myBtnText' }}
171
+ customAttributes={{ button: { 'data-analytics': 'save' } }}
172
+ a11yAttributes={{ 'aria-label': 'Save document' }}
173
+ >
174
+ Save
175
+ </Button>
176
+ ```