@zohodesk/components 1.6.8 → 1.6.11

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 (107) hide show
  1. package/README.md +7 -0
  2. package/assets/Appearance/dark/mode/Component_v1_DarkMode.module.css +68 -0
  3. package/assets/Appearance/light/mode/Component_v1_LightMode.module.css +68 -0
  4. package/assets/Appearance/pureDark/mode/Component_v1_PureDarkMode.module.css +68 -0
  5. package/es/Buttongroup/Buttongroup.module.css +10 -30
  6. package/es/CheckBox/CheckBox.module.css +3 -10
  7. package/es/DateTime/DateTime.module.css +22 -35
  8. package/es/DateTime/YearView.module.css +8 -10
  9. package/es/DropBox/DropBoxElement/css/DropBoxElement.module.css +3 -2
  10. package/es/DropDown/DropDown.module.css +2 -1
  11. package/es/DropDown/DropDownItem.module.css +1 -8
  12. package/es/DropDown/DropDownSeparator.module.css +2 -1
  13. package/es/ListItem/ListItem.module.css +4 -15
  14. package/es/MultiSelect/MobileHeader/MobileHeader.module.css +3 -2
  15. package/es/MultiSelect/MultiSelect.module.css +21 -34
  16. package/es/MultiSelect/SelectedOptions.module.css +6 -10
  17. package/es/Radio/Radio.module.css +3 -3
  18. package/es/ResponsiveDropBox/ResponsiveDropBox.module.css +1 -1
  19. package/es/Ribbon/Ribbon.module.css +9 -12
  20. package/es/Select/Select.module.css +22 -17
  21. package/es/Switch/Switch.module.css +1 -8
  22. package/es/Tab/Tab.module.css +8 -15
  23. package/es/Tab/Tabs.module.css +12 -22
  24. package/es/Tag/Tag.module.css +4 -3
  25. package/es/Tooltip/Tooltip.module.css +3 -2
  26. package/es/shared/ArrowIcon/ArrowIcon.module.css +3 -2
  27. package/es/v1/Button/Button.js +201 -0
  28. package/es/v1/Button/README.md +110 -0
  29. package/es/v1/Button/__tests__/Button.spec.js +272 -0
  30. package/es/v1/Button/__tests__/__snapshots__/Button.spec.js.snap +1160 -0
  31. package/es/v1/Button/_shared/Loader/Loader.js +33 -0
  32. package/es/v1/Button/_shared/Loader/Loader.module.css +42 -0
  33. package/es/v1/Button/_shared/Loader/__tests__/Loader.spec.js +21 -0
  34. package/es/v1/Button/_shared/Loader/__tests__/__snapshots__/Loader.spec.js.snap +49 -0
  35. package/es/v1/Button/_shared/Loader/props/defaultProps.js +4 -0
  36. package/es/v1/Button/_shared/Loader/props/propTypes.js +7 -0
  37. package/es/v1/Button/_shared/SuccessTick/SuccessTick.js +25 -0
  38. package/es/v1/Button/_shared/SuccessTick/SuccessTick.module.css +21 -0
  39. package/es/v1/Button/_shared/SuccessTick/__tests__/SuccessTick.spec.js +21 -0
  40. package/es/v1/Button/_shared/SuccessTick/__tests__/__snapshots__/SuccessTick.spec.js.snap +31 -0
  41. package/es/v1/Button/_shared/SuccessTick/props/defaultProps.js +4 -0
  42. package/es/v1/Button/_shared/SuccessTick/props/propTypes.js +7 -0
  43. package/es/v1/Button/constants/index.js +82 -0
  44. package/es/v1/Button/css/Button_v1.module.css +119 -0
  45. package/es/v1/Button/css/cssJSLogic.js +96 -0
  46. package/es/v1/Button/index.js +2 -0
  47. package/es/v1/Button/props/defaultProps.js +26 -0
  48. package/es/v1/Button/props/propTypes.js +43 -0
  49. package/es/v1/helpers/colorHelpers/background/backgroundColor.module.css +629 -0
  50. package/es/v1/helpers/colorHelpers/border/borderColor.module.css +489 -0
  51. package/es/v1/helpers/colorHelpers/colorHelper.js +176 -0
  52. package/es/v1/helpers/colorHelpers/constants/index.js +79 -0
  53. package/es/v1/helpers/colorHelpers/index.js +4 -0
  54. package/es/v1/helpers/colorHelpers/paletteUtilities.README.md +415 -0
  55. package/es/v1/helpers/colorHelpers/text/textColor.module.css +368 -0
  56. package/lib/Buttongroup/Buttongroup.module.css +10 -30
  57. package/lib/CheckBox/CheckBox.module.css +3 -10
  58. package/lib/DateTime/DateTime.module.css +22 -35
  59. package/lib/DateTime/YearView.module.css +8 -10
  60. package/lib/DropBox/DropBoxElement/css/DropBoxElement.module.css +3 -2
  61. package/lib/DropDown/DropDown.module.css +2 -1
  62. package/lib/DropDown/DropDownItem.module.css +1 -8
  63. package/lib/DropDown/DropDownSeparator.module.css +2 -1
  64. package/lib/ListItem/ListItem.module.css +4 -15
  65. package/lib/MultiSelect/MobileHeader/MobileHeader.module.css +3 -2
  66. package/lib/MultiSelect/MultiSelect.module.css +21 -34
  67. package/lib/MultiSelect/SelectedOptions.module.css +6 -10
  68. package/lib/Radio/Radio.module.css +3 -3
  69. package/lib/ResponsiveDropBox/ResponsiveDropBox.module.css +1 -1
  70. package/lib/Ribbon/Ribbon.module.css +9 -12
  71. package/lib/Select/Select.module.css +22 -17
  72. package/lib/Switch/Switch.module.css +1 -8
  73. package/lib/Tab/Tab.module.css +8 -15
  74. package/lib/Tab/Tabs.module.css +12 -22
  75. package/lib/Tag/Tag.module.css +4 -3
  76. package/lib/Tooltip/Tooltip.module.css +3 -2
  77. package/lib/shared/ArrowIcon/ArrowIcon.module.css +3 -2
  78. package/lib/v1/Button/Button.js +239 -0
  79. package/lib/v1/Button/README.md +110 -0
  80. package/lib/v1/Button/__tests__/Button.spec.js +293 -0
  81. package/lib/v1/Button/__tests__/__snapshots__/Button.spec.js.snap +1160 -0
  82. package/lib/v1/Button/_shared/Loader/Loader.js +43 -0
  83. package/lib/v1/Button/_shared/Loader/Loader.module.css +42 -0
  84. package/lib/v1/Button/_shared/Loader/__tests__/Loader.spec.js +28 -0
  85. package/lib/v1/Button/_shared/Loader/__tests__/__snapshots__/Loader.spec.js.snap +49 -0
  86. package/lib/v1/Button/_shared/Loader/props/defaultProps.js +11 -0
  87. package/lib/v1/Button/_shared/Loader/props/propTypes.js +18 -0
  88. package/lib/v1/Button/_shared/SuccessTick/SuccessTick.js +35 -0
  89. package/lib/v1/Button/_shared/SuccessTick/SuccessTick.module.css +21 -0
  90. package/lib/v1/Button/_shared/SuccessTick/__tests__/SuccessTick.spec.js +28 -0
  91. package/lib/v1/Button/_shared/SuccessTick/__tests__/__snapshots__/SuccessTick.spec.js.snap +31 -0
  92. package/lib/v1/Button/_shared/SuccessTick/props/defaultProps.js +11 -0
  93. package/lib/v1/Button/_shared/SuccessTick/props/propTypes.js +18 -0
  94. package/lib/v1/Button/constants/index.js +114 -0
  95. package/lib/v1/Button/css/Button_v1.module.css +119 -0
  96. package/lib/v1/Button/css/cssJSLogic.js +88 -0
  97. package/lib/v1/Button/index.js +21 -0
  98. package/lib/v1/Button/props/defaultProps.js +36 -0
  99. package/lib/v1/Button/props/propTypes.js +56 -0
  100. package/lib/v1/helpers/colorHelpers/background/backgroundColor.module.css +629 -0
  101. package/lib/v1/helpers/colorHelpers/border/borderColor.module.css +489 -0
  102. package/lib/v1/helpers/colorHelpers/colorHelper.js +190 -0
  103. package/lib/v1/helpers/colorHelpers/constants/index.js +87 -0
  104. package/lib/v1/helpers/colorHelpers/index.js +57 -0
  105. package/lib/v1/helpers/colorHelpers/paletteUtilities.README.md +415 -0
  106. package/lib/v1/helpers/colorHelpers/text/textColor.module.css +368 -0
  107. package/package.json +4 -4
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _ComponentRegistry = require("@zohodesk/dotkit/es/react/ComponentRegistry");
13
+
14
+ var _Icon = _interopRequireDefault(require("@zohodesk/icons/es/Icon"));
15
+
16
+ var _Flex = _interopRequireDefault(require("@zohodesk/layout/es/Flex/Flex"));
17
+
18
+ var _Typography = _interopRequireDefault(require("../../Typography/Typography"));
19
+
20
+ var _renderNode = _interopRequireWildcard(require("@zohodesk/utils/es/renderNode"));
21
+
22
+ var _propTypes = _interopRequireDefault(require("./props/propTypes"));
23
+
24
+ var _defaultProps = _interopRequireDefault(require("./props/defaultProps"));
25
+
26
+ var _constants = require("@zohodesk/dotkit/es/utils/constants");
27
+
28
+ var _constants2 = require("./constants");
29
+
30
+ var _Loader = _interopRequireDefault(require("./_shared/Loader/Loader"));
31
+
32
+ var _SuccessTick = _interopRequireDefault(require("./_shared/SuccessTick/SuccessTick"));
33
+
34
+ var _cssJSLogic = _interopRequireDefault(require("./css/cssJSLogic"));
35
+
36
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
37
+
38
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
39
+
40
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
41
+
42
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
43
+
44
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
45
+
46
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
47
+
48
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
49
+
50
+ var getTypographySize = function getTypographySize(size) {
51
+ return _constants2.TYPOGRAPHY_SIZE_MAP[size] || '13';
52
+ };
53
+
54
+ var Button = /*#__PURE__*/(0, _react.forwardRef)(function Button(props, ref) {
55
+ var palette = props.palette,
56
+ bgAppearance = props.bgAppearance,
57
+ borderAppearance = props.borderAppearance,
58
+ variant = props.variant,
59
+ status = props.status,
60
+ loaderPlacement = props.loaderPlacement,
61
+ size = props.size,
62
+ iconName = props.iconName,
63
+ iconSize = props.iconSize,
64
+ iconPlacement = props.iconPlacement,
65
+ renderIcon = props.renderIcon,
66
+ renderBefore = props.renderBefore,
67
+ renderAfter = props.renderAfter,
68
+ renderLoader = props.renderLoader,
69
+ renderSuccess = props.renderSuccess,
70
+ children = props.children,
71
+ type = props.type,
72
+ onClick = props.onClick,
73
+ isDisabled = props.isDisabled,
74
+ isReadOnly = props.isReadOnly,
75
+ isSelected = props.isSelected,
76
+ shape = props.shape,
77
+ paletteShade = props.paletteShade,
78
+ disabledAppearance = props.disabledAppearance,
79
+ title = props.title,
80
+ customProps = props.customProps,
81
+ customAttributes = props.customAttributes,
82
+ a11yAttributes = props.a11yAttributes,
83
+ customId = props.customId,
84
+ testId = props.testId;
85
+ var isLoading = status === _constants2.STATUS.LOADING;
86
+ var isSuccess = status === _constants2.STATUS.SUCCESS;
87
+ var isDisabledState = isDisabled || isLoading;
88
+ var isInteractionDisabled = isDisabledState || isReadOnly;
89
+ var overlayActive = (isLoading || isSuccess) && loaderPlacement === _constants2.LOADER_PLACEMENT.OVERLAY;
90
+ var _customProps$text = customProps.text,
91
+ contentProps = _customProps$text === void 0 ? _constants.DUMMY_OBJECT : _customProps$text,
92
+ _customProps$icon = customProps.icon,
93
+ iconProps = _customProps$icon === void 0 ? _constants.DUMMY_OBJECT : _customProps$icon;
94
+ var iconTagAttributes = (0, _react.useMemo)(function () {
95
+ return _objectSpread(_objectSpread({}, iconProps.tagAttributes || _constants.DUMMY_OBJECT), {}, {
96
+ 'data-test-id': testId ? "".concat(testId, "_icon") : undefined
97
+ });
98
+ }, [iconProps.tagAttributes, testId]);
99
+ var classes = (0, _react.useMemo)(function () {
100
+ return (0, _cssJSLogic["default"])({
101
+ props: props
102
+ });
103
+ }, [palette, bgAppearance, borderAppearance, paletteShade, size, variant, status, isDisabled, isReadOnly, isSelected, shape, loaderPlacement, disabledAppearance, props.customClass]);
104
+ var loaderOverlayClass = classes.loaderOverlayClass,
105
+ successOverlayClass = classes.successOverlayClass,
106
+ contentWrapperClass = classes.contentWrapperClass,
107
+ textClassName = classes.textClassName,
108
+ buttonClassName = classes.buttonClassName;
109
+ var showIcon = variant !== _constants2.VARIANT.TEXT && (renderIcon || iconName);
110
+
111
+ var _handleClick = function _handleClick(event) {
112
+ if (isInteractionDisabled) {
113
+ return;
114
+ }
115
+
116
+ onClick(event);
117
+ };
118
+
119
+ var _renderLoader = function _renderLoader() {
120
+ if (!isLoading) {
121
+ return null;
122
+ }
123
+
124
+ if ((0, _renderNode.isRenderable)(renderLoader)) {
125
+ return (0, _renderNode["default"])(renderLoader, {
126
+ status: status
127
+ });
128
+ }
129
+
130
+ var loaderClassName = loaderPlacement === _constants2.LOADER_PLACEMENT.OVERLAY ? loaderOverlayClass : '';
131
+ return /*#__PURE__*/_react["default"].createElement(_Flex["default"], {
132
+ $ui_displayMode: "flex",
133
+ $ui_alignItems: "center",
134
+ $ui_justifyContent: "center",
135
+ $ui_className: loaderClassName,
136
+ testId: testId ? "".concat(testId, "_loader") : undefined
137
+ }, /*#__PURE__*/_react["default"].createElement(_Loader["default"], null));
138
+ };
139
+
140
+ var _renderSuccess = function _renderSuccess() {
141
+ if (!isSuccess) {
142
+ return null;
143
+ }
144
+
145
+ if ((0, _renderNode.isRenderable)(renderSuccess)) {
146
+ return (0, _renderNode["default"])(renderSuccess, {
147
+ status: status
148
+ });
149
+ }
150
+
151
+ var successClassName = loaderPlacement === _constants2.LOADER_PLACEMENT.OVERLAY ? successOverlayClass : '';
152
+ return /*#__PURE__*/_react["default"].createElement(_Flex["default"], {
153
+ $ui_displayMode: "flex",
154
+ $ui_alignItems: "center",
155
+ $ui_justifyContent: "center",
156
+ $ui_className: successClassName,
157
+ testId: testId ? "".concat(testId, "_success") : undefined
158
+ }, /*#__PURE__*/_react["default"].createElement(_SuccessTick["default"], null));
159
+ };
160
+
161
+ var _renderIconNode = function _renderIconNode() {
162
+ if (!showIcon) {
163
+ return null;
164
+ }
165
+
166
+ if ((0, _renderNode.isRenderable)(renderIcon)) {
167
+ return (0, _renderNode["default"])(renderIcon);
168
+ }
169
+
170
+ return /*#__PURE__*/_react["default"].createElement(_Icon["default"], _extends({}, iconProps, {
171
+ name: iconName,
172
+ size: iconSize,
173
+ tagAttributes: iconTagAttributes,
174
+ dataId: testId ? "".concat(testId, "_icon") : undefined
175
+ }));
176
+ };
177
+
178
+ var _renderBeforeNode = function _renderBeforeNode() {
179
+ if (!(0, _renderNode.isRenderable)(renderBefore)) {
180
+ return null;
181
+ }
182
+
183
+ return (0, _renderNode["default"])(renderBefore, props);
184
+ };
185
+
186
+ var _renderAfterNode = function _renderAfterNode() {
187
+ if (!(0, _renderNode.isRenderable)(renderAfter)) {
188
+ return null;
189
+ }
190
+
191
+ return (0, _renderNode["default"])(renderAfter, props);
192
+ };
193
+
194
+ var _renderContent = function _renderContent() {
195
+ var shouldShowText = variant !== _constants2.VARIANT.ICON && children !== undefined && children !== null;
196
+ var showLoaderStart = isLoading && loaderPlacement === _constants2.LOADER_PLACEMENT.START;
197
+ var showLoaderAfter = isLoading && loaderPlacement === _constants2.LOADER_PLACEMENT.END;
198
+ var showSuccessStart = isSuccess && loaderPlacement === _constants2.LOADER_PLACEMENT.START;
199
+ var showSuccessAfter = isSuccess && loaderPlacement === _constants2.LOADER_PLACEMENT.END;
200
+ return /*#__PURE__*/_react["default"].createElement(_Flex["default"], {
201
+ $ui_displayMode: "flex",
202
+ $ui_direction: "row",
203
+ $flag_shrink: true,
204
+ $ui_alignItems: "center",
205
+ $ui_justifyContent: "center",
206
+ $ui_className: contentWrapperClass
207
+ }, showLoaderStart ? _renderLoader() : null, showSuccessStart ? _renderSuccess() : null, _renderBeforeNode(), iconPlacement === _constants2.ICON_PLACEMENT.LEFT ? _renderIconNode() : null, shouldShowText ? /*#__PURE__*/_react["default"].createElement(_Typography["default"], _extends({}, contentProps, {
208
+ $ui_className: textClassName,
209
+ $ui_size: getTypographySize(size),
210
+ $flag_dotted: variant !== _constants2.VARIANT.ICON
211
+ }), children) : null, iconPlacement === _constants2.ICON_PLACEMENT.RIGHT ? _renderIconNode() : null, _renderAfterNode(), showLoaderAfter ? _renderLoader() : null, showSuccessAfter ? _renderSuccess() : null);
212
+ };
213
+
214
+ var containerAttributes = _objectSpread(_objectSpread({}, customAttributes), {}, {
215
+ 'data-id': customId,
216
+ 'data-test-id': testId,
217
+ 'data-title': title
218
+ });
219
+
220
+ return /*#__PURE__*/_react["default"].createElement("button", _extends({}, containerAttributes, a11yAttributes, {
221
+ ref: ref,
222
+ type: type,
223
+ className: buttonClassName,
224
+ "aria-busy": isLoading,
225
+ "aria-disabled": isDisabledState,
226
+ "aria-readonly": isReadOnly,
227
+ "aria-pressed": isSelected,
228
+ onClick: _handleClick
229
+ }), _renderContent(), overlayActive ? isLoading ? _renderLoader() : _renderSuccess() : null);
230
+ });
231
+ Button.propTypes = _propTypes["default"];
232
+ Button.defaultProps = _defaultProps["default"];
233
+ Button.displayName = 'Button';
234
+
235
+ var _default = (0, _ComponentRegistry.withComponentRegistrar)( /*#__PURE__*/(0, _react.memo)(Button), {
236
+ name: 'ZDC_V1_Button'
237
+ });
238
+
239
+ exports["default"] = _default;
@@ -0,0 +1,110 @@
1
+ # Button
2
+
3
+ A composable button component with palette-based theming, loading/success status states, and flexible icon/content slots.
4
+
5
+ ## Import
6
+
7
+ ```jsx
8
+ import Button from '@zohodesk/components/es/v1/Button/Button';
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Default
14
+
15
+ ```jsx
16
+ <Button customId="saveBtn" testId="saveBtn">
17
+ Save changes
18
+ </Button>
19
+ ```
20
+
21
+ ### With Palette Variants
22
+
23
+ ```jsx
24
+ <Button palette="primary">Save</Button>
25
+ <Button palette="danger">Delete</Button>
26
+ <Button palette="success">Confirm</Button>
27
+ ```
28
+
29
+ ### With Icon
30
+
31
+ ```jsx
32
+ <Button variant="icon" iconName="ZD-plus" iconSize={20} />
33
+
34
+ <Button variant="iconWithText" iconName="ZD-plus" iconPlacement="left">
35
+ Add Item
36
+ </Button>
37
+ ```
38
+
39
+ ### Loading State
40
+
41
+ ```jsx
42
+ <Button status="loading" loaderPlacement="overlay">
43
+ Saving...
44
+ </Button>
45
+
46
+ <Button status="loading" loaderPlacement="start">
47
+ Loading
48
+ </Button>
49
+ ```
50
+
51
+ ### Disabled / Read Only
52
+
53
+ ```jsx
54
+ <Button isDisabled>Disabled</Button>
55
+ <Button isReadOnly>Read Only</Button>
56
+ ```
57
+
58
+ ## Props
59
+
60
+ | Prop | Type | Default | Description |
61
+ |---|---|---|---|
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 |
67
+ | `variant` | `oneOf: text, icon, iconWithText` | `text` | Display variant |
68
+ | `size` | `oneOf: small, medium, large, full` | `medium` | Size variant |
69
+ | `status` | `oneOf: default, loading, success` | `default` | Status state |
70
+ | `loaderPlacement` | `oneOf: start, end, overlay` | `overlay` | Where loader appears |
71
+ | `iconName` | `string` | — | Icon name from `@zohodesk/icons` |
72
+ | `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 |
76
+ | `renderIcon` | `node \| func` | — | Custom icon render slot |
77
+ | `renderBefore` | `node \| func` | — | Slot before main content |
78
+ | `renderAfter` | `node \| func` | — | Slot after main content |
79
+ | `renderLoader` | `node \| func` | — | Custom loader render slot |
80
+ | `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 |
89
+
90
+ ## Customization
91
+
92
+ ### Parts
93
+
94
+ | Part | Element | Description |
95
+ |---|---|---|
96
+ | `wrapper` | `<button>` root | The outermost button element |
97
+ | `text` | Typography | The text label |
98
+
99
+ ### CSS Custom Properties
100
+
101
+ The `.varClass` block in `Button.module.css` defines local custom properties that size variants override:
102
+
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 |
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+
5
+ var _react2 = require("@testing-library/react");
6
+
7
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
8
+
9
+ var _Button = _interopRequireDefault(require("../Button"));
10
+
11
+ require("@testing-library/jest-dom");
12
+
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
14
+
15
+ afterEach(function () {
16
+ (0, _react2.cleanup)();
17
+ });
18
+ describe('Button - Component', function () {
19
+ test('Should render with the basic set of default props', function () {
20
+ var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], null)),
21
+ asFragment = _render.asFragment;
22
+
23
+ expect(asFragment()).toMatchSnapshot();
24
+ });
25
+ test('Should render with children', function () {
26
+ var _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], null, "Click Me")),
27
+ asFragment = _render2.asFragment;
28
+
29
+ expect(asFragment()).toMatchSnapshot();
30
+ });
31
+ var palette = ['default', 'primary', 'secondary', 'danger', 'success'];
32
+ test.each(palette)('Should render palette of buttons - %s', function (palette) {
33
+ var _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
34
+ palette: palette
35
+ })),
36
+ asFragment = _render3.asFragment;
37
+
38
+ expect(asFragment()).toMatchSnapshot();
39
+ });
40
+ var bgAppearance = ['default', 'onHover', 'none'];
41
+ test.each(bgAppearance)('Should render bgAppearance of buttons - %s', function (bg) {
42
+ var _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
43
+ bgAppearance: bg
44
+ })),
45
+ asFragment = _render4.asFragment;
46
+
47
+ expect(asFragment()).toMatchSnapshot();
48
+ });
49
+ var borderAppearance = ['default', 'onHover', 'none'];
50
+ test.each(borderAppearance)('Should render borderAppearance of buttons - %s', function (border) {
51
+ var _render5 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
52
+ borderAppearance: border
53
+ })),
54
+ asFragment = _render5.asFragment;
55
+
56
+ expect(asFragment()).toMatchSnapshot();
57
+ });
58
+ var variant = ['text', 'icon', 'iconWithText'];
59
+ test.each(variant)('Should render variant of buttons - %s', function (variant) {
60
+ var _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
61
+ variant: variant
62
+ })),
63
+ asFragment = _render6.asFragment;
64
+
65
+ expect(asFragment()).toMatchSnapshot();
66
+ });
67
+ var size = ['small', 'medium', 'large', 'full'];
68
+ test.each(size)('Should render Sizes of buttons - %s', function (size) {
69
+ var _render7 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
70
+ size: size
71
+ })),
72
+ asFragment = _render7.asFragment;
73
+
74
+ expect(asFragment()).toMatchSnapshot();
75
+ });
76
+ var status = ['default', 'loading', 'success'];
77
+ test.each(status)('Should render Status of buttons - %s', function (status) {
78
+ var _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
79
+ status: status
80
+ })),
81
+ asFragment = _render8.asFragment;
82
+
83
+ expect(asFragment()).toMatchSnapshot();
84
+ });
85
+ var loaderPlacement = ['start', 'end', 'overlay'];
86
+ test.each(loaderPlacement)('Should render loaderPlacement of buttons - %s', function (loaderPlacement) {
87
+ var _render9 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
88
+ status: "loading",
89
+ loaderPlacement: loaderPlacement
90
+ })),
91
+ asFragment = _render9.asFragment;
92
+
93
+ expect(asFragment()).toMatchSnapshot();
94
+ });
95
+ test('Should render with iconName and iconSize ', function () {
96
+ var _render10 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
97
+ variant: "icon",
98
+ iconName: "ZD-plus",
99
+ iconSize: 20
100
+ })),
101
+ asFragment = _render10.asFragment;
102
+
103
+ expect(asFragment()).toMatchSnapshot();
104
+ });
105
+ test('Should render with iconPlacement ', function () {
106
+ var _render11 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
107
+ variant: "iconWithText",
108
+ iconName: "ZD-plus",
109
+ iconPlacement: "right"
110
+ }, "Button")),
111
+ asFragment = _render11.asFragment;
112
+
113
+ expect(asFragment()).toMatchSnapshot();
114
+ });
115
+ test('Should render with renderIcon', function () {
116
+ var _render12 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
117
+ variant: "icon",
118
+ renderIcon: function renderIcon() {
119
+ return /*#__PURE__*/_react["default"].createElement("span", null, "CustomIcon");
120
+ }
121
+ })),
122
+ asFragment = _render12.asFragment;
123
+
124
+ expect(asFragment()).toMatchSnapshot();
125
+ });
126
+ test('Should render with renderBefore and renderAfter', function () {
127
+ var _render13 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
128
+ renderBefore: function renderBefore() {
129
+ return /*#__PURE__*/_react["default"].createElement("span", null, "Before");
130
+ },
131
+ renderAfter: function renderAfter() {
132
+ return /*#__PURE__*/_react["default"].createElement("span", null, "After");
133
+ }
134
+ }, "Button")),
135
+ asFragment = _render13.asFragment;
136
+
137
+ expect(asFragment()).toMatchSnapshot();
138
+ });
139
+ test('Should render with renderLoader', function () {
140
+ var _render14 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
141
+ status: "loading",
142
+ renderLoader: function renderLoader() {
143
+ return /*#__PURE__*/_react["default"].createElement("span", null, "Loading...");
144
+ }
145
+ })),
146
+ asFragment = _render14.asFragment;
147
+
148
+ expect(asFragment()).toMatchSnapshot();
149
+ });
150
+ test('Should render with renderSuccess', function () {
151
+ var _render15 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
152
+ status: "success",
153
+ renderSuccess: function renderSuccess() {
154
+ return /*#__PURE__*/_react["default"].createElement("span", null, "Success!");
155
+ }
156
+ })),
157
+ asFragment = _render15.asFragment;
158
+
159
+ expect(asFragment()).toMatchSnapshot();
160
+ });
161
+ var type = ['button', 'submit', 'reset'];
162
+ test.each(type)('Should render type of buttons - %s', function (type) {
163
+ var _render16 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
164
+ type: type
165
+ })),
166
+ asFragment = _render16.asFragment;
167
+
168
+ expect(asFragment()).toMatchSnapshot();
169
+ });
170
+ test('Should trigger onClick function', function () {
171
+ var onClick = jest.fn();
172
+
173
+ var _render17 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
174
+ onClick: onClick
175
+ })),
176
+ getByRole = _render17.getByRole;
177
+
178
+ _userEvent["default"].click(getByRole('button'));
179
+
180
+ expect(onClick).toHaveBeenCalled();
181
+ });
182
+ test('Should be disabled when isDisabled prop is true', function () {
183
+ var _render18 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
184
+ isDisabled: true
185
+ })),
186
+ asFragment = _render18.asFragment;
187
+
188
+ expect(asFragment()).toMatchSnapshot();
189
+ });
190
+ test('Should render with readOnly style when isReadOnly prop is true', function () {
191
+ var _render19 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
192
+ isReadOnly: true
193
+ })),
194
+ asFragment = _render19.asFragment;
195
+
196
+ expect(asFragment()).toMatchSnapshot();
197
+ });
198
+ test('Should render with selected style when isSelected prop is true', function () {
199
+ var _render20 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
200
+ isSelected: true
201
+ })),
202
+ asFragment = _render20.asFragment;
203
+
204
+ expect(asFragment()).toMatchSnapshot();
205
+ });
206
+ var shape = ['pill', 'rectangle', 'roundedRectangle'];
207
+ test.each(shape)('Should render shape of buttons - %s', function (shape) {
208
+ var _render21 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
209
+ shape: shape
210
+ })),
211
+ asFragment = _render21.asFragment;
212
+
213
+ expect(asFragment()).toMatchSnapshot();
214
+ });
215
+ var paletteShade = ['default', 'lighter'];
216
+ test.each(paletteShade)('Should render paletteShade of buttons - %s', function (shade) {
217
+ var _render22 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
218
+ paletteShade: shade
219
+ })),
220
+ asFragment = _render22.asFragment;
221
+
222
+ expect(asFragment()).toMatchSnapshot();
223
+ });
224
+ var disabledAppearance = ['none', 'dull', 'strike'];
225
+ test.each(disabledAppearance)('Should render disabledAppearance of buttons - %s', function (style) {
226
+ var _render23 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
227
+ isDisabled: true,
228
+ disabledAppearance: style
229
+ })),
230
+ asFragment = _render23.asFragment;
231
+
232
+ expect(asFragment()).toMatchSnapshot();
233
+ });
234
+ test('Should render with title attribute', function () {
235
+ var _render24 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
236
+ title: "Button test title"
237
+ })),
238
+ asFragment = _render24.asFragment;
239
+
240
+ expect(asFragment()).toMatchSnapshot();
241
+ });
242
+ test('Should apply customClass to wrapper and text', function () {
243
+ var _render25 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
244
+ customClass: {
245
+ wrapper: 'customButtonClass',
246
+ text: 'customTextClass'
247
+ }
248
+ }, "Button")),
249
+ asFragment = _render25.asFragment;
250
+
251
+ expect(asFragment()).toMatchSnapshot();
252
+ });
253
+ test('Should apply customProps to wrapper, text and icon', function () {
254
+ var _render26 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
255
+ variant: "iconWithText",
256
+ iconName: "check",
257
+ customProps: {
258
+ wrapper: {
259
+ 'data-wrapper': 'wrapperProps'
260
+ },
261
+ text: {
262
+ 'data-text': 'textProps'
263
+ },
264
+ icon: {
265
+ 'data-icon': 'iconProps'
266
+ }
267
+ }
268
+ }, "Button")),
269
+ asFragment = _render26.asFragment;
270
+
271
+ expect(asFragment()).toMatchSnapshot();
272
+ });
273
+ test('Should render with customId and testId', function () {
274
+ var _render27 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
275
+ customId: "customIdValue",
276
+ testId: "testIdValue"
277
+ })),
278
+ asFragment = _render27.asFragment;
279
+
280
+ expect(asFragment()).toMatchSnapshot();
281
+ });
282
+ test('Should apply a11yAttributes to the button', function () {
283
+ var _render28 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Button["default"], {
284
+ a11yAttributes: {
285
+ 'aria-label': 'Smart Button',
286
+ 'aria-describedby': 'button-description'
287
+ }
288
+ }, "Button")),
289
+ asFragment = _render28.asFragment;
290
+
291
+ expect(asFragment()).toMatchSnapshot();
292
+ });
293
+ });