@dxc-technology/halstack-react 11.0.0 → 12.0.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 (276) hide show
  1. package/BackgroundColorContext.d.ts +1 -10
  2. package/BackgroundColorContext.js +3 -8
  3. package/HalstackContext.d.ts +32 -142
  4. package/HalstackContext.js +2 -2
  5. package/accordion/Accordion.accessibility.test.js +71 -0
  6. package/accordion/Accordion.js +13 -27
  7. package/accordion/Accordion.stories.tsx +7 -49
  8. package/accordion/types.d.ts +1 -1
  9. package/accordion-group/AccordionGroup.accessibility.test.js +88 -0
  10. package/accordion-group/AccordionGroup.d.ts +2 -3
  11. package/accordion-group/AccordionGroup.js +4 -4
  12. package/accordion-group/AccordionGroup.stories.tsx +23 -23
  13. package/accordion-group/AccordionGroupAccordion.js +3 -3
  14. package/accordion-group/AccordionGroupContext.d.ts +3 -0
  15. package/accordion-group/AccordionGroupContext.js +8 -0
  16. package/accordion-group/types.d.ts +1 -1
  17. package/action-icon/ActionIcon.accessibility.test.js +63 -0
  18. package/action-icon/ActionIcon.d.ts +4 -0
  19. package/action-icon/ActionIcon.js +48 -0
  20. package/action-icon/ActionIcon.stories.tsx +41 -0
  21. package/action-icon/ActionIcon.test.js +64 -0
  22. package/action-icon/types.d.ts +26 -0
  23. package/action-icon/types.js +5 -0
  24. package/alert/Alert.accessibility.test.js +95 -0
  25. package/alert/Alert.js +21 -75
  26. package/badge/Badge.accessibility.test.js +129 -0
  27. package/badge/Badge.d.ts +1 -1
  28. package/badge/Badge.js +141 -28
  29. package/badge/Badge.stories.tsx +210 -0
  30. package/badge/Badge.test.js +30 -0
  31. package/badge/types.d.ts +52 -3
  32. package/box/Box.accessibility.test.js +33 -0
  33. package/box/Box.js +2 -5
  34. package/breadcrumbs/Breadcrumbs.accessibility.test.d.ts +1 -0
  35. package/breadcrumbs/Breadcrumbs.accessibility.test.js +96 -0
  36. package/breadcrumbs/Breadcrumbs.d.ts +4 -0
  37. package/breadcrumbs/Breadcrumbs.js +79 -0
  38. package/breadcrumbs/Breadcrumbs.stories.tsx +194 -0
  39. package/breadcrumbs/Breadcrumbs.test.d.ts +1 -0
  40. package/breadcrumbs/Breadcrumbs.test.js +169 -0
  41. package/breadcrumbs/Item.d.ts +4 -0
  42. package/breadcrumbs/Item.js +52 -0
  43. package/breadcrumbs/dropdownTheme.d.ts +53 -0
  44. package/breadcrumbs/dropdownTheme.js +62 -0
  45. package/breadcrumbs/types.d.ts +16 -0
  46. package/breadcrumbs/types.js +5 -0
  47. package/bulleted-list/BulletedList.accessibility.test.js +119 -0
  48. package/bulleted-list/BulletedList.js +16 -23
  49. package/bulleted-list/BulletedList.stories.tsx +1 -2
  50. package/button/Button.accessibility.test.js +127 -0
  51. package/button/Button.js +16 -16
  52. package/button/Button.stories.tsx +34 -53
  53. package/button/Button.test.js +3 -1
  54. package/button/types.d.ts +1 -1
  55. package/card/Card.accessibility.test.js +36 -0
  56. package/card/Card.js +3 -2
  57. package/checkbox/Checkbox.accessibility.test.js +87 -0
  58. package/checkbox/Checkbox.js +31 -36
  59. package/chip/Chip.accessibility.test.js +67 -0
  60. package/chip/Chip.js +11 -6
  61. package/chip/Chip.stories.tsx +10 -25
  62. package/chip/Chip.test.js +4 -4
  63. package/common/coreTokens.d.ts +105 -14
  64. package/common/coreTokens.js +40 -22
  65. package/common/variables.d.ts +31 -138
  66. package/common/variables.js +103 -210
  67. package/container/Container.d.ts +4 -0
  68. package/container/Container.js +194 -0
  69. package/container/Container.stories.tsx +214 -0
  70. package/container/types.d.ts +74 -0
  71. package/container/types.js +5 -0
  72. package/contextual-menu/ContextualMenu.accessibility.test.js +97 -0
  73. package/contextual-menu/ContextualMenu.d.ts +5 -0
  74. package/contextual-menu/ContextualMenu.js +88 -0
  75. package/contextual-menu/ContextualMenu.stories.tsx +232 -0
  76. package/contextual-menu/ContextualMenu.test.js +205 -0
  77. package/contextual-menu/GroupItem.d.ts +4 -0
  78. package/contextual-menu/GroupItem.js +67 -0
  79. package/contextual-menu/ItemAction.d.ts +4 -0
  80. package/contextual-menu/ItemAction.js +51 -0
  81. package/contextual-menu/MenuItem.d.ts +4 -0
  82. package/contextual-menu/MenuItem.js +29 -0
  83. package/contextual-menu/SingleItem.d.ts +4 -0
  84. package/contextual-menu/SingleItem.js +38 -0
  85. package/contextual-menu/types.d.ts +58 -0
  86. package/contextual-menu/types.js +5 -0
  87. package/date-input/Calendar.js +1 -1
  88. package/date-input/DateInput.accessibility.test.js +228 -0
  89. package/date-input/DateInput.js +4 -5
  90. package/date-input/DateInput.stories.tsx +15 -8
  91. package/date-input/DatePicker.js +13 -7
  92. package/date-input/YearPicker.js +1 -1
  93. package/date-input/types.d.ts +2 -2
  94. package/dialog/Dialog.accessibility.test.js +69 -0
  95. package/dialog/Dialog.js +11 -25
  96. package/dialog/Dialog.stories.tsx +176 -0
  97. package/dialog/Dialog.test.js +1 -1
  98. package/divider/Divider.accessibility.test.js +33 -0
  99. package/divider/Divider.d.ts +4 -0
  100. package/divider/Divider.js +36 -0
  101. package/divider/Divider.stories.tsx +223 -0
  102. package/divider/Divider.test.js +38 -0
  103. package/divider/types.d.ts +21 -0
  104. package/divider/types.js +5 -0
  105. package/dropdown/Dropdown.accessibility.test.js +180 -0
  106. package/dropdown/Dropdown.js +26 -39
  107. package/dropdown/Dropdown.stories.tsx +15 -26
  108. package/dropdown/Dropdown.test.js +18 -18
  109. package/dropdown/DropdownMenu.js +4 -4
  110. package/dropdown/DropdownMenuItem.js +8 -4
  111. package/dropdown/types.d.ts +3 -5
  112. package/file-input/FileInput.accessibility.test.js +160 -0
  113. package/file-input/FileInput.js +126 -141
  114. package/file-input/FileInput.test.js +84 -110
  115. package/file-input/FileItem.js +18 -28
  116. package/file-input/types.d.ts +1 -1
  117. package/footer/Footer.accessibility.test.js +125 -0
  118. package/footer/Footer.d.ts +1 -1
  119. package/footer/Footer.js +36 -31
  120. package/footer/Footer.stories.tsx +58 -2
  121. package/footer/Icons.d.ts +1 -0
  122. package/footer/Icons.js +52 -16
  123. package/footer/types.d.ts +8 -8
  124. package/header/Header.accessibility.test.js +93 -0
  125. package/header/Header.js +20 -41
  126. package/header/Header.stories.tsx +16 -0
  127. package/header/Icons.js +1 -6
  128. package/header/types.d.ts +4 -3
  129. package/heading/Heading.accessibility.test.js +33 -0
  130. package/heading/Heading.js +1 -1
  131. package/icon/Icon.accessibility.test.js +30 -0
  132. package/icon/Icon.d.ts +4 -0
  133. package/icon/Icon.js +33 -0
  134. package/icon/Icon.stories.tsx +28 -0
  135. package/icon/types.d.ts +4 -0
  136. package/icon/types.js +5 -0
  137. package/image/Image.accessibility.test.js +56 -0
  138. package/image/Image.js +1 -1
  139. package/image/Image.stories.tsx +3 -1
  140. package/layout/ApplicationLayout.d.ts +1 -1
  141. package/layout/ApplicationLayout.js +10 -7
  142. package/layout/Icons.d.ts +0 -1
  143. package/layout/Icons.js +1 -11
  144. package/link/Link.accessibility.test.js +108 -0
  145. package/link/Link.js +8 -6
  146. package/link/Link.stories.tsx +4 -4
  147. package/link/types.d.ts +1 -1
  148. package/main.d.ts +7 -3
  149. package/main.js +37 -9
  150. package/nav-tabs/NavTabs.accessibility.test.js +44 -0
  151. package/nav-tabs/NavTabs.d.ts +1 -2
  152. package/nav-tabs/NavTabs.js +10 -7
  153. package/nav-tabs/NavTabs.stories.tsx +29 -24
  154. package/nav-tabs/NavTabs.test.js +11 -9
  155. package/nav-tabs/NavTabsContext.d.ts +3 -0
  156. package/nav-tabs/NavTabsContext.js +8 -0
  157. package/nav-tabs/Tab.js +23 -23
  158. package/nav-tabs/types.d.ts +1 -1
  159. package/number-input/NumberInput.accessibility.test.js +228 -0
  160. package/number-input/NumberInput.d.ts +0 -7
  161. package/number-input/NumberInput.js +24 -5
  162. package/number-input/NumberInput.test.js +165 -6
  163. package/number-input/NumberInputContext.d.ts +3 -0
  164. package/number-input/NumberInputContext.js +8 -0
  165. package/number-input/types.d.ts +6 -0
  166. package/package.json +16 -14
  167. package/paginator/Paginator.accessibility.test.js +79 -0
  168. package/paginator/Paginator.js +14 -14
  169. package/paragraph/Paragraph.accessibility.test.js +28 -0
  170. package/paragraph/Paragraph.js +2 -7
  171. package/password-input/PasswordInput.accessibility.test.js +153 -0
  172. package/password-input/PasswordInput.js +7 -7
  173. package/password-input/PasswordInput.stories.tsx +0 -1
  174. package/password-input/PasswordInput.test.js +4 -4
  175. package/progress-bar/ProgressBar.accessibility.test.js +35 -0
  176. package/progress-bar/ProgressBar.js +11 -15
  177. package/quick-nav/QuickNav.accessibility.test.js +57 -0
  178. package/quick-nav/QuickNav.js +1 -1
  179. package/radio-group/Radio.js +1 -1
  180. package/radio-group/RadioGroup.accessibility.test.js +97 -0
  181. package/radio-group/RadioGroup.js +3 -2
  182. package/resultset-table/ResultsetTable.accessibility.test.js +285 -0
  183. package/resultset-table/ResultsetTable.d.ts +4 -1
  184. package/resultset-table/ResultsetTable.js +25 -13
  185. package/resultset-table/ResultsetTable.stories.tsx +118 -5
  186. package/resultset-table/ResultsetTable.test.js +76 -0
  187. package/resultset-table/types.d.ts +40 -7
  188. package/select/Listbox.js +28 -16
  189. package/select/Option.js +19 -10
  190. package/select/Select.accessibility.test.js +228 -0
  191. package/select/Select.js +57 -37
  192. package/select/Select.stories.tsx +59 -111
  193. package/select/Select.test.js +387 -456
  194. package/select/types.d.ts +3 -3
  195. package/sidenav/Sidenav.accessibility.test.js +59 -0
  196. package/sidenav/Sidenav.js +21 -19
  197. package/sidenav/Sidenav.stories.tsx +4 -9
  198. package/sidenav/types.d.ts +2 -2
  199. package/slider/Slider.accessibility.test.js +104 -0
  200. package/slider/Slider.js +40 -48
  201. package/spinner/Spinner.accessibility.test.js +96 -0
  202. package/spinner/Spinner.js +12 -16
  203. package/status-light/StatusLight.accessibility.test.js +157 -0
  204. package/status-light/StatusLight.d.ts +4 -0
  205. package/status-light/StatusLight.js +51 -0
  206. package/status-light/StatusLight.stories.tsx +74 -0
  207. package/status-light/StatusLight.test.js +25 -0
  208. package/status-light/types.d.ts +17 -0
  209. package/status-light/types.js +5 -0
  210. package/switch/Switch.accessibility.test.js +98 -0
  211. package/switch/Switch.js +24 -29
  212. package/switch/Switch.stories.tsx +12 -0
  213. package/table/DropdownTheme.js +62 -0
  214. package/table/Table.accessibility.test.js +93 -0
  215. package/table/Table.d.ts +6 -2
  216. package/table/Table.js +74 -12
  217. package/table/Table.stories.tsx +309 -2
  218. package/table/Table.test.js +92 -0
  219. package/table/types.d.ts +28 -0
  220. package/tabs/Tab.js +13 -9
  221. package/tabs/Tabs.accessibility.test.js +56 -0
  222. package/tabs/Tabs.js +12 -24
  223. package/tabs/Tabs.stories.tsx +8 -4
  224. package/tabs/Tabs.test.js +19 -37
  225. package/tabs/types.d.ts +2 -2
  226. package/tag/Tag.accessibility.test.js +69 -0
  227. package/tag/Tag.js +7 -7
  228. package/tag/Tag.stories.tsx +4 -7
  229. package/tag/Tag.test.js +4 -12
  230. package/tag/types.d.ts +2 -2
  231. package/text-input/Suggestion.js +1 -1
  232. package/text-input/Suggestions.js +19 -14
  233. package/text-input/TextInput.accessibility.test.js +321 -0
  234. package/text-input/TextInput.js +84 -105
  235. package/text-input/TextInput.stories.tsx +17 -8
  236. package/text-input/TextInput.test.js +96 -79
  237. package/textarea/Textarea.accessibility.test.js +155 -0
  238. package/textarea/Textarea.js +12 -17
  239. package/textarea/Textarea.stories.tsx +0 -1
  240. package/toggle-group/ToggleGroup.accessibility.test.js +107 -0
  241. package/toggle-group/ToggleGroup.js +6 -8
  242. package/toggle-group/ToggleGroup.stories.tsx +3 -3
  243. package/toggle-group/types.d.ts +2 -2
  244. package/typography/Typography.accessibility.test.js +339 -0
  245. package/useTheme.d.ts +31 -138
  246. package/utils/BaseTypography.js +1 -1
  247. package/utils/FocusLock.js +16 -6
  248. package/wizard/Wizard.accessibility.test.js +55 -0
  249. package/wizard/Wizard.js +14 -25
  250. package/wizard/Wizard.stories.tsx +19 -0
  251. package/wizard/types.d.ts +2 -2
  252. package/common/OpenSans.css +0 -69
  253. package/common/fonts/OpenSans-Bold.ttf +0 -0
  254. package/common/fonts/OpenSans-BoldItalic.ttf +0 -0
  255. package/common/fonts/OpenSans-ExtraBold.ttf +0 -0
  256. package/common/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  257. package/common/fonts/OpenSans-Italic.ttf +0 -0
  258. package/common/fonts/OpenSans-Light.ttf +0 -0
  259. package/common/fonts/OpenSans-LightItalic.ttf +0 -0
  260. package/common/fonts/OpenSans-Regular.ttf +0 -0
  261. package/common/fonts/OpenSans-SemiBold.ttf +0 -0
  262. package/common/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  263. package/date-input/Icons.d.ts +0 -6
  264. package/date-input/Icons.js +0 -58
  265. package/paginator/Icons.d.ts +0 -5
  266. package/paginator/Icons.js +0 -40
  267. package/password-input/Icons.d.ts +0 -6
  268. package/password-input/Icons.js +0 -35
  269. package/select/Icons.d.ts +0 -10
  270. package/select/Icons.js +0 -89
  271. package/sidenav/Icons.d.ts +0 -7
  272. package/sidenav/Icons.js +0 -47
  273. package/text-input/Icons.d.ts +0 -8
  274. package/text-input/Icons.js +0 -56
  275. /package/{layout → sidenav}/SidenavContext.d.ts +0 -0
  276. /package/{layout → sidenav}/SidenavContext.js +0 -0
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
12
+ var _Dropdown = _interopRequireDefault(require("../dropdown/Dropdown"));
13
+ var _HalstackContext = require("../HalstackContext");
14
+ var _dropdownTheme = _interopRequireDefault(require("./dropdownTheme"));
15
+ var _coreTokens = _interopRequireDefault(require("../common/coreTokens"));
16
+ var _Icon = _interopRequireDefault(require("../icon/Icon"));
17
+ var _Item = _interopRequireDefault(require("./Item"));
18
+ var _Flex = _interopRequireDefault(require("../flex/Flex"));
19
+ var _templateObject;
20
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
21
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
22
+ var DxcBreadcrumbs = function DxcBreadcrumbs(_ref) {
23
+ var _ref$ariaLabel = _ref.ariaLabel,
24
+ ariaLabel = _ref$ariaLabel === void 0 ? "Breadcrumbs" : _ref$ariaLabel,
25
+ items = _ref.items,
26
+ _ref$itemsBeforeColla = _ref.itemsBeforeCollapse,
27
+ itemsBeforeCollapse = _ref$itemsBeforeColla === void 0 ? 4 : _ref$itemsBeforeColla,
28
+ onItemClick = _ref.onItemClick,
29
+ _ref$showRoot = _ref.showRoot,
30
+ showRoot = _ref$showRoot === void 0 ? true : _ref$showRoot;
31
+ var handleOnSelectOption = (0, _react.useCallback)(function (href) {
32
+ if (onItemClick) onItemClick(href);else window.location.href = href;
33
+ }, [items]);
34
+ return /*#__PURE__*/_react["default"].createElement("nav", {
35
+ "aria-label": ariaLabel
36
+ }, /*#__PURE__*/_react["default"].createElement(OrderedList, null, items && items.length > Math.max(itemsBeforeCollapse, 2) ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, showRoot && /*#__PURE__*/_react["default"].createElement(_Item["default"], {
37
+ href: items[0].href,
38
+ key: 0,
39
+ label: items[0].label
40
+ }), /*#__PURE__*/_react["default"].createElement(_Flex["default"], {
41
+ alignItems: "center",
42
+ as: "li",
43
+ key: 1
44
+ }, /*#__PURE__*/_react["default"].createElement(_HalstackContext.HalstackProvider, {
45
+ advancedTheme: _dropdownTheme["default"]
46
+ }, /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], {
47
+ caretHidden: true,
48
+ icon: /*#__PURE__*/_react["default"].createElement(_Icon["default"], {
49
+ icon: "more_horiz"
50
+ }),
51
+ margin: showRoot && {
52
+ left: "small"
53
+ },
54
+ onSelectOption: handleOnSelectOption,
55
+ options: items.slice(showRoot ? 1 : 0, -1).map(function (_ref2) {
56
+ var label = _ref2.label,
57
+ href = _ref2.href;
58
+ return {
59
+ label: label,
60
+ value: href
61
+ };
62
+ })
63
+ }))), /*#__PURE__*/_react["default"].createElement(_Item["default"], {
64
+ isCurrentPage: true,
65
+ key: 2,
66
+ label: items[items.length - 1].label
67
+ })) : items.map(function (item, index, _ref3) {
68
+ var length = _ref3.length;
69
+ return /*#__PURE__*/_react["default"].createElement(_Item["default"], {
70
+ href: item.href,
71
+ isCurrentPage: index === length - 1,
72
+ key: index,
73
+ label: item.label,
74
+ onClick: onItemClick
75
+ });
76
+ })));
77
+ };
78
+ var OrderedList = _styledComponents["default"].ol(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin: ", ";\n padding-left: ", ";\n display: flex;\n align-items: center;\n gap: ", ";\n list-style-type: none;\n\n > li:not(:first-child) {\n > a,\n > span {\n margin-left: ", ";\n }\n &::before {\n margin: ", " ", ";\n transform: rotate(15deg);\n border-right: ", " solid ", ";\n height: 1rem;\n content: \"\";\n }\n }\n"])), _coreTokens["default"].spacing_0, _coreTokens["default"].spacing_0, _coreTokens["default"].spacing_12, _coreTokens["default"].spacing_12, _coreTokens["default"].spacing_0, _coreTokens["default"].spacing_2, _coreTokens["default"].border_width_1, _coreTokens["default"].color_grey_500);
79
+ var _default = exports["default"] = DxcBreadcrumbs;
@@ -0,0 +1,194 @@
1
+ import React from "react";
2
+ import Title from "../../.storybook/components/Title";
3
+ import ExampleContainer from "../../.storybook/components/ExampleContainer";
4
+ import DxcBreadcrumbs from "./Breadcrumbs";
5
+ import DxcContainer from "../container/Container";
6
+ import { HalstackProvider } from "../HalstackContext";
7
+ import { userEvent, within } from "@storybook/testing-library";
8
+ import { disabledRules } from "../../test/accessibility/rules/specific/breadcrumbs/disabledRules";
9
+ import preview from "../../.storybook/preview";
10
+
11
+ export default {
12
+ title: "Breadcrumbs",
13
+ component: DxcBreadcrumbs,
14
+ parameters: {
15
+ a11y: {
16
+ config: {
17
+ rules: [
18
+ ...disabledRules.map((ruleId) => ({ id: ruleId, enabled: false })),
19
+ ...preview?.parameters?.a11y?.config?.rules,
20
+ ],
21
+ },
22
+ },
23
+ },
24
+ };
25
+
26
+ const items = [
27
+ {
28
+ label: "Home",
29
+ href: "/",
30
+ },
31
+ {
32
+ label: "User Menu",
33
+ href: "",
34
+ },
35
+ {
36
+ label: "Preferences",
37
+ href: "",
38
+ },
39
+ {
40
+ label: "Customization",
41
+ href: "",
42
+ },
43
+ {
44
+ label: "Dark Mode",
45
+ href: "",
46
+ },
47
+ ];
48
+
49
+ const Breadcrumbs = () => (
50
+ <>
51
+ <Title title="Default" theme="light" level={3} />
52
+ <ExampleContainer>
53
+ <DxcBreadcrumbs
54
+ items={[
55
+ {
56
+ label: "Home",
57
+ href: "/",
58
+ },
59
+ {
60
+ label: "User Menu",
61
+ href: "",
62
+ },
63
+ {
64
+ label: "Preferences",
65
+ href: "",
66
+ },
67
+ {
68
+ label: "Dark Mode",
69
+ href: "",
70
+ },
71
+ ]}
72
+ />
73
+ </ExampleContainer>
74
+ <Title title="Collapsed variant" theme="light" level={3} />
75
+ <ExampleContainer>
76
+ <DxcBreadcrumbs items={items} />
77
+ </ExampleContainer>
78
+ <Title title="Collapsed variant without root" theme="light" level={3} />
79
+ <ExampleContainer>
80
+ <DxcBreadcrumbs items={items} showRoot={false} />
81
+ </ExampleContainer>
82
+ <Title title="Collapsed variant with dropdown menu opened" theme="light" level={3} />
83
+ <ExampleContainer>
84
+ <DxcContainer height="150px">
85
+ <DxcBreadcrumbs items={items} />
86
+ </DxcContainer>
87
+ </ExampleContainer>
88
+ <Title title="Focus state" theme="light" level={3} />
89
+ <ExampleContainer pseudoState="pseudo-focus">
90
+ <DxcBreadcrumbs items={items} />
91
+ </ExampleContainer>
92
+ <Title title="Hover state" theme="light" level={3} />
93
+ <ExampleContainer pseudoState="pseudo-hover">
94
+ <DxcBreadcrumbs items={items} />
95
+ </ExampleContainer>
96
+ <Title title="Active state" theme="light" level={3} />
97
+ <ExampleContainer pseudoState="pseudo-active">
98
+ <DxcBreadcrumbs items={items} />
99
+ </ExampleContainer>
100
+ <Title title="Truncation and text ellipsis with tooltip (only when collapsed)" theme="light" level={3} />
101
+ <ExampleContainer>
102
+ <DxcContainer width="200px">
103
+ <DxcBreadcrumbs
104
+ items={[
105
+ {
106
+ label: "Root",
107
+ href: "/",
108
+ },
109
+ {
110
+ label: "Main folder",
111
+ href: "",
112
+ },
113
+ {
114
+ label: "User",
115
+ href: "",
116
+ },
117
+ {
118
+ label: "Very long label for the link",
119
+ href: "",
120
+ },
121
+ ]}
122
+ itemsBeforeCollapse={3}
123
+ />
124
+ </DxcContainer>
125
+ </ExampleContainer>
126
+ <Title title="Truncation, text ellipsis with tooltip and without root" theme="light" level={3} />
127
+ <ExampleContainer>
128
+ <DxcContainer width="200px">
129
+ <DxcBreadcrumbs
130
+ items={[
131
+ {
132
+ label: "Root",
133
+ href: "/",
134
+ },
135
+ {
136
+ label: "Main folder",
137
+ href: "",
138
+ },
139
+ {
140
+ label: "User",
141
+ href: "",
142
+ },
143
+ {
144
+ label: "Very long label for the link",
145
+ href: "",
146
+ },
147
+ ]}
148
+ itemsBeforeCollapse={3}
149
+ showRoot={false}
150
+ />
151
+ </DxcContainer>
152
+ </ExampleContainer>
153
+ <Title title="Dropdown theming doesn't affect the collapsed trigger" theme="light" level={3} />
154
+ <ExampleContainer>
155
+ <Title title="Opinionated theming" theme="light" level={4} />
156
+ <ExampleContainer>
157
+ <HalstackProvider
158
+ theme={{
159
+ dropdown: {
160
+ baseColor: "#fabada",
161
+ fontColor: "#999",
162
+ optionFontColor: "#4d4d4d",
163
+ },
164
+ }}
165
+ >
166
+ <DxcBreadcrumbs items={items} itemsBeforeCollapse={3} />
167
+ </HalstackProvider>
168
+ </ExampleContainer>
169
+ <Title title="Advanced theming" theme="light" level={4} />
170
+ <ExampleContainer>
171
+ <HalstackProvider
172
+ advancedTheme={{
173
+ dropdown: {
174
+ buttonBackgroundColor: "#fabada",
175
+ buttonHeight: "100px",
176
+ buttonBorderThickness: "2px",
177
+ buttonBorderStyle: "solid",
178
+ buttonBorderColor: "#000",
179
+ },
180
+ }}
181
+ >
182
+ <DxcBreadcrumbs items={items} itemsBeforeCollapse={3} />
183
+ </HalstackProvider>
184
+ </ExampleContainer>
185
+ </ExampleContainer>
186
+ </>
187
+ );
188
+
189
+ export const Chromatic = Breadcrumbs.bind({});
190
+ Chromatic.play = async ({ canvasElement }) => {
191
+ const canvas = within(canvasElement);
192
+ const dropdowns = canvas.getAllByRole("button");
193
+ await userEvent.click(dropdowns[2]);
194
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _Breadcrumbs = _interopRequireDefault(require("./Breadcrumbs"));
11
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
12
+ global.ResizeObserver = /*#__PURE__*/function () {
13
+ function ResizeObserver() {
14
+ (0, _classCallCheck2["default"])(this, ResizeObserver);
15
+ }
16
+ (0, _createClass2["default"])(ResizeObserver, [{
17
+ key: "observe",
18
+ value: function observe() {}
19
+ }, {
20
+ key: "unobserve",
21
+ value: function unobserve() {}
22
+ }, {
23
+ key: "disconnect",
24
+ value: function disconnect() {}
25
+ }]);
26
+ return ResizeObserver;
27
+ }();
28
+ var items = [{
29
+ label: "Home",
30
+ href: "/"
31
+ }, {
32
+ label: "User Menu",
33
+ href: ""
34
+ }, {
35
+ label: "Preferences",
36
+ href: ""
37
+ }, {
38
+ label: "Dark Mode",
39
+ href: ""
40
+ }];
41
+ describe("Breadcrumbs component tests", function () {
42
+ test("Renders with correct aria accessibility attributes", function () {
43
+ var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Breadcrumbs["default"], {
44
+ items: items,
45
+ ariaLabel: "example"
46
+ })),
47
+ getByText = _render.getByText,
48
+ getByRole = _render.getByRole;
49
+ var breadcrumbs = getByRole("navigation");
50
+ expect(breadcrumbs.getAttribute("aria-label")).toBe("example");
51
+ expect(getByText("Dark Mode").parentElement.getAttribute("aria-current")).toBe("page");
52
+ });
53
+ test("Collapsed variant renders all the items inside the dropdown menu except the root and the current page", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
54
+ var _render2, queryByText, getByText, getByRole, dropdown;
55
+ return _regenerator["default"].wrap(function _callee$(_context) {
56
+ while (1) switch (_context.prev = _context.next) {
57
+ case 0:
58
+ _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Breadcrumbs["default"], {
59
+ items: items,
60
+ itemsBeforeCollapse: 3
61
+ })), queryByText = _render2.queryByText, getByText = _render2.getByText, getByRole = _render2.getByRole;
62
+ dropdown = getByRole("button");
63
+ expect(queryByText("User Menu")).toBeFalsy();
64
+ expect(queryByText("Preferences")).toBeFalsy();
65
+ _context.next = 6;
66
+ return _userEvent["default"].click(dropdown);
67
+ case 6:
68
+ expect(getByText("User Menu")).toBeTruthy();
69
+ expect(getByText("Preferences")).toBeTruthy();
70
+ case 8:
71
+ case "end":
72
+ return _context.stop();
73
+ }
74
+ }, _callee);
75
+ })));
76
+ test("Collapsed variant, with show root set to false, renders all the items inside the dropdown menu except the current page", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
77
+ var _render3, queryByText, getByText, getByRole, dropdown;
78
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
79
+ while (1) switch (_context2.prev = _context2.next) {
80
+ case 0:
81
+ _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Breadcrumbs["default"], {
82
+ items: items,
83
+ itemsBeforeCollapse: 3,
84
+ showRoot: false
85
+ })), queryByText = _render3.queryByText, getByText = _render3.getByText, getByRole = _render3.getByRole;
86
+ dropdown = getByRole("button");
87
+ expect(queryByText("Home")).toBeFalsy();
88
+ expect(queryByText("User Menu")).toBeFalsy();
89
+ expect(queryByText("Preferences")).toBeFalsy();
90
+ _context2.next = 7;
91
+ return _userEvent["default"].click(dropdown);
92
+ case 7:
93
+ expect(getByText("Home")).toBeTruthy();
94
+ expect(getByText("User Menu")).toBeTruthy();
95
+ expect(getByText("Preferences")).toBeTruthy();
96
+ case 10:
97
+ case "end":
98
+ return _context2.stop();
99
+ }
100
+ }, _callee2);
101
+ })));
102
+ test("If itemsBeforeCollapse value is below two, ignores it and renders a collapsed variant", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
103
+ var _render4, getByText, getByRole;
104
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
105
+ while (1) switch (_context3.prev = _context3.next) {
106
+ case 0:
107
+ _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Breadcrumbs["default"], {
108
+ items: items,
109
+ itemsBeforeCollapse: -1
110
+ })), getByText = _render4.getByText, getByRole = _render4.getByRole;
111
+ expect(getByText("Home")).toBeTruthy();
112
+ expect(getByRole("button")).toBeTruthy();
113
+ expect(getByText("Dark Mode")).toBeTruthy();
114
+ case 4:
115
+ case "end":
116
+ return _context3.stop();
117
+ }
118
+ }, _callee3);
119
+ })));
120
+ test("The onClick prop from an item is properly called", function () {
121
+ var onItemClick = jest.fn();
122
+ var _render5 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Breadcrumbs["default"], {
123
+ onItemClick: onItemClick,
124
+ items: [{
125
+ label: "Home",
126
+ href: "/home"
127
+ }, {
128
+ label: "Preferences",
129
+ href: "/preferences"
130
+ }]
131
+ })),
132
+ getByText = _render5.getByText;
133
+ _userEvent["default"].click(getByText("Home"));
134
+ expect(onItemClick).toHaveBeenCalledWith("/home");
135
+ });
136
+ test("The onClick prop from an item is properly called (collapsed)", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
137
+ var onItemClick, _render6, getByText, getByRole;
138
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
139
+ while (1) switch (_context4.prev = _context4.next) {
140
+ case 0:
141
+ onItemClick = jest.fn();
142
+ _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Breadcrumbs["default"], {
143
+ onItemClick: onItemClick,
144
+ items: [{
145
+ label: "Home",
146
+ href: "/"
147
+ }, {
148
+ label: "Preferences",
149
+ href: "/"
150
+ }, {
151
+ label: "Dark Mode",
152
+ href: "/"
153
+ }],
154
+ itemsBeforeCollapse: 2
155
+ })), getByText = _render6.getByText, getByRole = _render6.getByRole;
156
+ _context4.next = 4;
157
+ return _userEvent["default"].click(getByRole("button"));
158
+ case 4:
159
+ _context4.next = 6;
160
+ return _userEvent["default"].click(getByText("Preferences"));
161
+ case 6:
162
+ expect(onItemClick).toHaveBeenCalledWith("/");
163
+ case 7:
164
+ case "end":
165
+ return _context4.stop();
166
+ }
167
+ }, _callee4);
168
+ })));
169
+ });
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { ItemPropsType } from "./types";
3
+ declare const Item: ({ isCurrentPage, href, label, onClick }: ItemPropsType) => React.JSX.Element;
4
+ export default Item;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
12
+ var _coreTokens = _interopRequireDefault(require("../common/coreTokens"));
13
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
16
+ var Item = function Item(_ref) {
17
+ var _ref$isCurrentPage = _ref.isCurrentPage,
18
+ isCurrentPage = _ref$isCurrentPage === void 0 ? false : _ref$isCurrentPage,
19
+ href = _ref.href,
20
+ label = _ref.label,
21
+ onClick = _ref.onClick;
22
+ var currentItemRef = (0, _react.useRef)(null);
23
+ var handleOnMouseEnter = function handleOnMouseEnter(event) {
24
+ var labelContainer = event.currentTarget;
25
+ var optionElement = currentItemRef === null || currentItemRef === void 0 ? void 0 : currentItemRef.current;
26
+ if (optionElement.title === "" && labelContainer.scrollWidth > labelContainer.clientWidth) optionElement.title = label;
27
+ };
28
+ var handleOnClick = function handleOnClick(event) {
29
+ if (onClick) {
30
+ event.preventDefault();
31
+ onClick(href);
32
+ }
33
+ };
34
+ return /*#__PURE__*/_react["default"].createElement(ListItem, {
35
+ "aria-current": isCurrentPage ? "page" : undefined,
36
+ isCurrentPage: isCurrentPage
37
+ }, isCurrentPage ? /*#__PURE__*/_react["default"].createElement(CurrentPage, {
38
+ ref: currentItemRef,
39
+ onMouseEnter: handleOnMouseEnter
40
+ }, label) : /*#__PURE__*/_react["default"].createElement(Link, {
41
+ href: href,
42
+ onClick: handleOnClick
43
+ }, /*#__PURE__*/_react["default"].createElement(Text, null, label)));
44
+ };
45
+ var ListItem = _styledComponents["default"].li(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n font-family: ", ";\n font-size: ", ";\n color: ", ";\n ", "\n"])), _coreTokens["default"].type_sans, _coreTokens["default"].type_scale_02, _coreTokens["default"].color_black, function (_ref2) {
46
+ var isCurrentPage = _ref2.isCurrentPage;
47
+ return isCurrentPage && "overflow: hidden;";
48
+ });
49
+ var CurrentPage = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-weight: ", ";\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: default;\n"])), _coreTokens["default"].type_semibold);
50
+ var Link = _styledComponents["default"].a(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n border-radius: ", ";\n padding: ", " ", ";\n display: inline-flex;\n align-items: center;\n height: 24px;\n color: ", ";\n text-decoration: ", ";\n cursor: pointer;\n\n &:focus {\n outline: ", " solid ", ";\n }\n"])), _coreTokens["default"].border_radius_small, _coreTokens["default"].spacing_0, _coreTokens["default"].spacing_2, _coreTokens["default"].color_black, _coreTokens["default"].type_no_line, _coreTokens["default"].border_width_2, _coreTokens["default"].color_blue_600);
51
+ var Text = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n border: ", " solid ", ";\n &:hover {\n border-bottom-color: ", ";\n }\n"])), _coreTokens["default"].border_width_1, _coreTokens["default"].color_transparent, _coreTokens["default"].color_black);
52
+ var _default = exports["default"] = Item;
@@ -0,0 +1,53 @@
1
+ declare const _default: {
2
+ dropdown: {
3
+ buttonIconSize: string;
4
+ buttonPaddingTop: string;
5
+ buttonPaddingBottom: string;
6
+ buttonPaddingLeft: string;
7
+ buttonPaddingRight: string;
8
+ buttonHeight: string;
9
+ buttonBorderRadius: string;
10
+ buttonBorderColor: string;
11
+ optionFontSize: string;
12
+ optionPaddingTop: string;
13
+ optionPaddingBottom: string;
14
+ optionPaddingLeft: string;
15
+ optionPaddingRight: string;
16
+ buttonBackgroundColor: string;
17
+ hoverButtonBackgroundColor: string;
18
+ activeButtonBackgroundColor: string;
19
+ buttonFontFamily: string;
20
+ buttonFontSize: string;
21
+ buttonFontStyle: string;
22
+ buttonFontWeight: string;
23
+ buttonFontColor: string;
24
+ buttonIconSpacing: string;
25
+ buttonIconColor: string;
26
+ buttonBorderStyle: string;
27
+ buttonBorderThickness: string;
28
+ disabledColor: string;
29
+ disabledButtonBackgroundColor: string;
30
+ disabledButtonBorderColor: string;
31
+ optionBackgroundColor: string;
32
+ hoverOptionBackgroundColor: string;
33
+ activeOptionBackgroundColor: string;
34
+ optionFontFamily: string;
35
+ optionFontStyle: string;
36
+ optionFontWeight: string;
37
+ optionFontColor: string;
38
+ optionIconSize: string;
39
+ optionIconSpacing: string;
40
+ optionIconColor: string;
41
+ caretIconSize: string;
42
+ caretIconColor: string;
43
+ caretIconSpacing: string;
44
+ borderRadius: string;
45
+ borderStyle: string;
46
+ borderThickness: string;
47
+ borderColor: string;
48
+ scrollBarThumbColor: string;
49
+ scrollBarTrackColor: string;
50
+ focusColor: string;
51
+ };
52
+ };
53
+ export default _default;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _coreTokens = _interopRequireDefault(require("../common/coreTokens"));
9
+ var _default = exports["default"] = {
10
+ dropdown: {
11
+ // Breadcrumbs tokens
12
+ buttonIconSize: _coreTokens["default"].spacing_16,
13
+ buttonPaddingTop: _coreTokens["default"].spacing_4,
14
+ buttonPaddingBottom: _coreTokens["default"].spacing_4,
15
+ buttonPaddingLeft: _coreTokens["default"].spacing_4,
16
+ buttonPaddingRight: _coreTokens["default"].spacing_4,
17
+ buttonHeight: "24px",
18
+ buttonBorderRadius: "2px",
19
+ buttonBorderColor: _coreTokens["default"].color_transparent,
20
+ optionFontSize: "14px",
21
+ optionPaddingTop: _coreTokens["default"].spacing_0,
22
+ optionPaddingBottom: _coreTokens["default"].spacing_0,
23
+ optionPaddingLeft: _coreTokens["default"].spacing_16,
24
+ optionPaddingRight: _coreTokens["default"].spacing_16,
25
+ // Dropdown tokens
26
+ buttonBackgroundColor: _coreTokens["default"].color_white,
27
+ hoverButtonBackgroundColor: _coreTokens["default"].color_grey_100,
28
+ activeButtonBackgroundColor: _coreTokens["default"].color_grey_300,
29
+ buttonFontFamily: _coreTokens["default"].type_sans,
30
+ buttonFontSize: _coreTokens["default"].type_scale_03,
31
+ buttonFontStyle: _coreTokens["default"].type_normal,
32
+ buttonFontWeight: _coreTokens["default"].type_regular,
33
+ buttonFontColor: _coreTokens["default"].color_black,
34
+ buttonIconSpacing: "10px",
35
+ buttonIconColor: _coreTokens["default"].color_black,
36
+ buttonBorderStyle: _coreTokens["default"].border_none,
37
+ buttonBorderThickness: _coreTokens["default"].border_width_0,
38
+ disabledColor: _coreTokens["default"].color_grey_500,
39
+ disabledButtonBackgroundColor: _coreTokens["default"].color_transparent,
40
+ disabledButtonBorderColor: _coreTokens["default"].color_transparent,
41
+ optionBackgroundColor: _coreTokens["default"].color_white,
42
+ hoverOptionBackgroundColor: _coreTokens["default"].color_grey_100,
43
+ activeOptionBackgroundColor: _coreTokens["default"].color_grey_300,
44
+ optionFontFamily: _coreTokens["default"].type_sans,
45
+ optionFontStyle: _coreTokens["default"].type_normal,
46
+ optionFontWeight: _coreTokens["default"].type_regular,
47
+ optionFontColor: _coreTokens["default"].color_black,
48
+ optionIconSize: "20px",
49
+ optionIconSpacing: "10px",
50
+ optionIconColor: _coreTokens["default"].color_black,
51
+ caretIconSize: "24px",
52
+ caretIconColor: _coreTokens["default"].color_black,
53
+ caretIconSpacing: "12px",
54
+ borderRadius: "4px",
55
+ borderStyle: _coreTokens["default"].border_none,
56
+ borderThickness: _coreTokens["default"].border_width_0,
57
+ borderColor: _coreTokens["default"].color_transparent,
58
+ scrollBarThumbColor: _coreTokens["default"].color_grey_700,
59
+ scrollBarTrackColor: _coreTokens["default"].color_grey_300,
60
+ focusColor: _coreTokens["default"].color_blue_600
61
+ }
62
+ };
@@ -0,0 +1,16 @@
1
+ type Item = {
2
+ href?: string;
3
+ label: string;
4
+ };
5
+ type Props = {
6
+ ariaLabel?: string;
7
+ items: Item[];
8
+ itemsBeforeCollapse?: number;
9
+ onItemClick?: (href: string) => void;
10
+ showRoot?: boolean;
11
+ };
12
+ export type ItemPropsType = Item & {
13
+ isCurrentPage?: boolean;
14
+ onClick?: (href: string) => void;
15
+ };
16
+ export default Props;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });