@elliemae/ds-left-navigation 2.0.0-alpha.1 → 2.0.0-alpha.13

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 (120) hide show
  1. package/cjs/LeftNavigation.js +2 -2
  2. package/cjs/LeftNavigationContext.js +1 -5
  3. package/cjs/common/getItemBackgroundStyle.js +1 -12
  4. package/cjs/common/getLeftBorderStyle.js +3 -17
  5. package/cjs/common/getScrollbarStyle.js +1 -24
  6. package/cjs/common/index.js +0 -2
  7. package/cjs/configs/index.js +1 -1
  8. package/cjs/configs/useLeftNavConfig.js +24 -31
  9. package/cjs/configs/useLeftNavItems.js +12 -12
  10. package/cjs/configs/useLeftNavSmoothExpand.js +3 -3
  11. package/cjs/exported-related/ChevronItem/index.js +9 -5
  12. package/cjs/exported-related/Icon/index.js +7 -2
  13. package/cjs/exported-related/ItemRenderer/index.js +17 -14
  14. package/cjs/exported-related/ItemRenderer/styled.js +29 -29
  15. package/cjs/exported-related/ItemRenderer/usePropsWithDefaults.js +12 -4
  16. package/cjs/exported-related/Notifications/index.js +43 -43
  17. package/cjs/exported-related/OpenWindowItem/index.js +9 -5
  18. package/cjs/hooks/useExpandableOnClickHandler.js +7 -6
  19. package/cjs/hooks/useKeyboardNavigation.js +7 -7
  20. package/cjs/hooks/useOpenableOnClickHandler.js +8 -7
  21. package/cjs/hooks/useSelectFirstBodyItem.js +14 -4
  22. package/cjs/index.js +1 -2
  23. package/cjs/outOfTheBox/ItemControlledDrilldown/index.js +32 -31
  24. package/cjs/outOfTheBox/ItemControlledDrilldown/styled.js +9 -6
  25. package/cjs/outOfTheBox/ItemHeader/index.js +35 -26
  26. package/cjs/outOfTheBox/ItemHeader/styled.js +4 -5
  27. package/cjs/outOfTheBox/ItemLink/index.js +26 -32
  28. package/cjs/outOfTheBox/ItemLink/styled.js +1 -1
  29. package/cjs/outOfTheBox/ItemSection/index.js +16 -13
  30. package/cjs/outOfTheBox/ItemSection/styled.js +3 -3
  31. package/cjs/outOfTheBox/ItemSeparator/index.js +10 -10
  32. package/cjs/outOfTheBox/ItemSubmenu/index.js +28 -36
  33. package/cjs/outOfTheBox/ItemSubmenu/styled.js +4 -5
  34. package/cjs/outOfTheBox/ItemTextLabel/index.js +15 -13
  35. package/cjs/outOfTheBox/ItemTextLabel/styled.js +8 -5
  36. package/cjs/outOfTheBox/ItemUncontrolledDrilldown/index.js +29 -29
  37. package/cjs/outOfTheBox/ItemUncontrolledDrilldown/styled.js +9 -6
  38. package/cjs/outOfTheBox/ItemWithDate/index.js +17 -16
  39. package/cjs/outOfTheBox/ItemWithDate/styled.js +9 -6
  40. package/cjs/outOfTheBox/index.js +6 -6
  41. package/cjs/parts/LeftNavContent/index.js +17 -14
  42. package/cjs/parts/LeftNavContent/styled.js +18 -23
  43. package/cjs/parts/LeftNavContentWithScrollbar/index.js +30 -22
  44. package/cjs/parts/LeftNavFooterItem/index.js +13 -21
  45. package/cjs/parts/LeftNavFooterItem/styled.js +9 -10
  46. package/cjs/parts/LeftNavLoading/index.js +14 -11
  47. package/cjs/parts/OutOfTheBoxMapItem.js +9 -4
  48. package/cjs/prop-types.js +2 -1
  49. package/esm/LeftNavigationContext.js +0 -4
  50. package/esm/common/getItemBackgroundStyle.js +1 -12
  51. package/esm/common/getLeftBorderStyle.js +3 -17
  52. package/esm/common/getScrollbarStyle.js +1 -24
  53. package/esm/common/index.js +0 -1
  54. package/esm/configs/useLeftNavConfig.js +14 -21
  55. package/esm/configs/useLeftNavItems.js +11 -11
  56. package/esm/exported-related/ChevronItem/index.js +7 -2
  57. package/esm/exported-related/Icon/index.js +5 -0
  58. package/esm/exported-related/ItemRenderer/index.js +13 -10
  59. package/esm/exported-related/ItemRenderer/styled.js +27 -28
  60. package/esm/exported-related/ItemRenderer/usePropsWithDefaults.js +11 -3
  61. package/esm/exported-related/Notifications/index.js +41 -37
  62. package/esm/exported-related/OpenWindowItem/index.js +7 -2
  63. package/esm/hooks/useExpandableOnClickHandler.js +7 -6
  64. package/esm/hooks/useKeyboardNavigation.js +7 -7
  65. package/esm/hooks/useOpenableOnClickHandler.js +8 -7
  66. package/esm/hooks/useSelectFirstBodyItem.js +14 -4
  67. package/esm/index.js +0 -1
  68. package/esm/outOfTheBox/ItemControlledDrilldown/index.js +17 -14
  69. package/esm/outOfTheBox/ItemControlledDrilldown/styled.js +7 -4
  70. package/esm/outOfTheBox/ItemHeader/index.js +24 -15
  71. package/esm/outOfTheBox/ItemHeader/styled.js +3 -3
  72. package/esm/outOfTheBox/ItemLink/index.js +18 -24
  73. package/esm/outOfTheBox/ItemSection/index.js +11 -8
  74. package/esm/outOfTheBox/ItemSeparator/index.js +6 -6
  75. package/esm/outOfTheBox/ItemSubmenu/index.js +17 -25
  76. package/esm/outOfTheBox/ItemSubmenu/styled.js +3 -3
  77. package/esm/outOfTheBox/ItemTextLabel/index.js +11 -9
  78. package/esm/outOfTheBox/ItemTextLabel/styled.js +7 -4
  79. package/esm/outOfTheBox/ItemUncontrolledDrilldown/index.js +15 -13
  80. package/esm/outOfTheBox/ItemUncontrolledDrilldown/styled.js +7 -4
  81. package/esm/outOfTheBox/ItemWithDate/index.js +9 -8
  82. package/esm/outOfTheBox/ItemWithDate/styled.js +7 -4
  83. package/esm/outOfTheBox/index.js +6 -6
  84. package/esm/parts/LeftNavContent/index.js +5 -2
  85. package/esm/parts/LeftNavContent/styled.js +11 -16
  86. package/esm/parts/LeftNavContentWithScrollbar/index.js +16 -8
  87. package/esm/parts/LeftNavFooterItem/index.js +4 -11
  88. package/esm/parts/LeftNavFooterItem/styled.js +3 -4
  89. package/esm/parts/LeftNavLoading/index.js +13 -10
  90. package/esm/parts/OutOfTheBoxMapItem.js +5 -0
  91. package/esm/prop-types.js +2 -1
  92. package/package.json +12 -16
  93. package/types/LeftNavigation.d.ts +46 -11
  94. package/types/LeftNavigationContext.d.ts +0 -4
  95. package/types/common/index.d.ts +0 -1
  96. package/types/exported-related/ItemRenderer/styled.d.ts +3 -2
  97. package/types/hooks/useKeyboardNavigation.d.ts +1 -1
  98. package/types/hooks/useSelectFirstBodyItem.d.ts +1 -1
  99. package/types/index.d.d.ts +9 -2
  100. package/types/index.d.ts +1 -2
  101. package/types/outOfTheBox/ItemControlledDrilldown/styled.d.ts +2 -2
  102. package/types/outOfTheBox/ItemHeader/styled.d.ts +2 -2
  103. package/types/outOfTheBox/ItemLink/styled.d.ts +1 -1
  104. package/types/outOfTheBox/ItemSection/styled.d.ts +3 -3
  105. package/types/outOfTheBox/ItemSubmenu/styled.d.ts +2 -2
  106. package/types/outOfTheBox/ItemTextLabel/styled.d.ts +1 -1
  107. package/types/outOfTheBox/ItemUncontrolledDrilldown/styled.d.ts +2 -2
  108. package/types/outOfTheBox/ItemWithDate/styled.d.ts +2 -2
  109. package/types/parts/LeftNavContent/styled.d.ts +7 -11
  110. package/types/parts/LeftNavContentWithScrollbar/index.d.ts +1 -0
  111. package/types/parts/LeftNavFooterItem/styled.d.ts +10 -6
  112. package/types/prop-types.d.ts +87 -18
  113. package/cjs/common/getFocusedByKeyboardStyle.js +0 -23
  114. package/cjs/configs/useGlobalKeyListeners.js +0 -31
  115. package/cjs/package.json +0 -4
  116. package/esm/common/getFocusedByKeyboardStyle.js +0 -19
  117. package/esm/configs/useGlobalKeyListeners.js +0 -22
  118. package/esm/package.json +0 -4
  119. package/types/common/getFocusedByKeyboardStyle.d.ts +0 -4
  120. package/types/configs/useGlobalKeyListeners.d.ts +0 -6
@@ -2,47 +2,46 @@ import Grid from '@elliemae/ds-grid';
2
2
  import styled from 'styled-components';
3
3
 
4
4
  /* eslint-disable indent */
5
+ const borderOutside = function (color) {
6
+ let weight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
7
+ return "&:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: ".concat(weight, "px solid ").concat(color, ";\n pointer-events: none;\n}");
8
+ };
5
9
  const StyledItemWrapper = /*#__PURE__*/styled(Grid).withConfig({
6
10
  componentId: "sc-11wzgfh-0"
7
11
  })(["position:relative;", ""], props => props.shadowStyle(props.theme));
8
12
 
9
- const getItemBackground = ({
10
- selectable,
11
- opened,
12
- selected,
13
- theme
14
- }) => {
13
+ const getItemBackground = _ref => {
14
+ let {
15
+ selectable,
16
+ opened,
17
+ selected,
18
+ theme
19
+ } = _ref;
15
20
  if (!selectable) return 'white';
16
21
  if (selected && !opened) return theme.colors.brand[200];
17
22
  return theme.colors.neutral['000'];
18
23
  };
19
24
 
20
- const getItemHoverBackground = ({
21
- selectable,
22
- opened,
23
- selected,
24
- theme
25
- }) => {
25
+ const getItemHoverBackground = _ref2 => {
26
+ let {
27
+ selectable,
28
+ opened,
29
+ selected,
30
+ theme
31
+ } = _ref2;
26
32
  if (!selectable) return 'white';
27
33
  if (selected && !opened) return theme.colors.brand[200];
28
- return theme.colors.neutral['080'];
34
+ return theme.colors.brand['200'];
29
35
  };
30
36
 
31
37
  const StyledItem = /*#__PURE__*/styled(Grid).withConfig({
32
38
  componentId: "sc-11wzgfh-1"
33
- })(["cursor:", ";min-height:", ";background:", ";:hover{background:", ";}:active{background:", ";}", ";outline:none;", ""], props => props.selectable && !props.opened ? 'pointer' : 'auto', props => props.minHeight, getItemBackground, getItemHoverBackground, ({
34
- selectable,
35
- theme
36
- }) => selectable ? theme.colors.brand[200] : 'white', props => props.shadowStyle(props.theme), props => props.focused && props.focusedByKey ? `
37
- &:before {
38
- content: '';
39
- position: absolute;
40
- top: 0;
41
- left: 0;
42
- right: 0;
43
- bottom: 0;
44
- border: 1px solid ${props.theme.colors.brand[600]};
45
- pointer-events: none;
46
- }` : '');
39
+ })(["cursor:", ";min-height:", ";background:", ";", ":hover{background:", ";}:active{background:", ";}", ";outline:none;", ""], props => props.selectable && !props.opened ? 'pointer' : 'auto', props => props.minHeight, getItemBackground, props => props.selected && !props.opened ? borderOutside(props.theme.colors.brand[500], 1) : '', getItemHoverBackground, _ref3 => {
40
+ let {
41
+ selectable,
42
+ theme
43
+ } = _ref3;
44
+ return selectable ? theme.colors.brand[200] : 'white';
45
+ }, props => props.shadowStyle(props.theme), props => props.tabIndex !== -1 ? ":focus {\n ".concat(borderOutside(props.theme.colors.brand[700]), "\n }") : '');
47
46
 
48
- export { StyledItem, StyledItemWrapper };
47
+ export { StyledItem, StyledItemWrapper, borderOutside };
@@ -1,3 +1,8 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
1
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
2
7
  import { useMemo } from 'react';
3
8
 
@@ -13,8 +18,11 @@ const itemDefaultProps = {
13
18
  closable: false,
14
19
  ariaLabel: '',
15
20
  ariaRole: 'menuitem',
16
- ariaExpanded: undefined
17
- }; // Make use Item props with defaults
21
+ ariaLive: 'off',
22
+ ariaExpanded: undefined,
23
+ ariaDescribedBy: undefined
24
+ };
25
+ const itemWithoutShadows = ['ds-left-nav-item-header', 'ds-left-nav-item-link', 'ds-left-nav-item-submenu']; // Make use Item props with defaults
18
26
 
19
27
  const usePropsWithDefaults = props => {
20
28
  const propsWithDefault = useMemo(() => {
@@ -28,7 +36,7 @@ const usePropsWithDefaults = props => {
28
36
  minHeight: '48px',
29
37
  paddingTop: '12px',
30
38
  subitems: [],
31
- shadowStyle: () => 'box-shadow: inherit',
39
+ shadowStyle: (opened, type) => theme => "box-shadow: ".concat(opened || !itemWithoutShadows.includes(type) ? 'inset 4px 0 0 0 #52A6EC' : 'inset 4px 0 0 0 white'),
32
40
  hasBorderBottom: false,
33
41
  borderBottomMr: '0px'
34
42
  }, props), {}, {
@@ -1,47 +1,51 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
2
  import 'react';
3
- import InternalNotifications from '@elliemae/ds-icons/Notifications';
4
- import ExceptionsSmallFill from '@elliemae/ds-icons/ExceptionsSmallFill';
5
- import AlertsSmallFill from '@elliemae/ds-icons/AlertsSmallFill';
6
- import MessagesSmallFill from '@elliemae/ds-icons/MessagesSmallFill';
3
+ import { Notifications as Notifications$1, ExceptionsSmallFill, AlertsSmallFill, MessagesSmallFill } from '@elliemae/ds-icons';
7
4
  import styled from 'styled-components';
8
5
  import Grid from '@elliemae/ds-grid';
9
6
 
10
7
  const StyledIcon = /*#__PURE__*/styled.div.withConfig({
11
8
  componentId: "sc-hasbsd-0"
12
9
  })(["display:flex;flex-direction:column;align-items:center;"]);
13
- const Notifications = ({
14
- exceptions = false,
15
- alerts = false,
16
- messages = false
17
- }) => /*#__PURE__*/_jsx(StyledIcon, {}, void 0, /*#__PURE__*/_jsx(InternalNotifications, {
18
- size: "m",
19
- color: ['brand-primary', 800]
20
- }), (exceptions || alerts || messages) && /*#__PURE__*/_jsx(Grid, {
21
- cols: ['1fr', '1fr', '1fr'],
22
- gutter: "xxxs",
23
- mt: "2px"
24
- }, void 0, /*#__PURE__*/_jsx(Grid, {
25
- width: "6px",
26
- height: "6px"
27
- }, void 0, exceptions && /*#__PURE__*/_jsx(ExceptionsSmallFill, {
28
- width: "6px",
29
- height: "6px",
30
- color: ['warning', 900]
31
- })), /*#__PURE__*/_jsx(Grid, {
32
- width: "6px",
33
- height: "6px"
34
- }, void 0, alerts && /*#__PURE__*/_jsx(AlertsSmallFill, {
35
- width: "6px",
36
- height: "6px",
37
- color: ['danger', 900]
38
- })), /*#__PURE__*/_jsx(Grid, {
39
- width: "6px",
40
- height: "6px"
41
- }, void 0, messages && /*#__PURE__*/_jsx(MessagesSmallFill, {
42
- width: "6px",
43
- height: "6px",
44
- color: ['success', 900]
45
- }))));
10
+ const Notifications = _ref => {
11
+ let {
12
+ exceptions = false,
13
+ alerts = false,
14
+ messages = false
15
+ } = _ref;
16
+ return /*#__PURE__*/_jsx(StyledIcon, {}, void 0, /*#__PURE__*/_jsx(Notifications$1, {
17
+ size: "m",
18
+ color: ['brand-primary', 800],
19
+ "data-testid": "left-nav-notifications-icon"
20
+ }), (exceptions || alerts || messages) && /*#__PURE__*/_jsx(Grid, {
21
+ cols: ['1fr', '1fr', '1fr'],
22
+ gutter: "xxxs",
23
+ mt: "2px"
24
+ }, void 0, /*#__PURE__*/_jsx(Grid, {
25
+ width: "6px",
26
+ height: "6px",
27
+ "data-testid": "left-nav-exceptions-icon"
28
+ }, void 0, exceptions && /*#__PURE__*/_jsx(ExceptionsSmallFill, {
29
+ width: "6px",
30
+ height: "6px",
31
+ color: ['warning', 900]
32
+ })), /*#__PURE__*/_jsx(Grid, {
33
+ width: "6px",
34
+ height: "6px",
35
+ "data-testid": "left-nav-alerts-icon"
36
+ }, void 0, alerts && /*#__PURE__*/_jsx(AlertsSmallFill, {
37
+ width: "6px",
38
+ height: "6px",
39
+ color: ['danger', 900]
40
+ })), /*#__PURE__*/_jsx(Grid, {
41
+ width: "6px",
42
+ height: "6px",
43
+ "data-testid": "left-nav-messages-icon"
44
+ }, void 0, messages && /*#__PURE__*/_jsx(MessagesSmallFill, {
45
+ width: "6px",
46
+ height: "6px",
47
+ color: ['success', 900]
48
+ }))));
49
+ };
46
50
 
47
51
  export { Notifications, Notifications as default };
@@ -1,13 +1,18 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
1
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
2
7
  import 'react';
3
8
  import styled from 'styled-components';
4
- import InternalOpenWindow from '@elliemae/ds-icons/OpenWindow';
9
+ import { OpenWindow as OpenWindow$1 } from '@elliemae/ds-icons';
5
10
  import { jsx } from 'react/jsx-runtime';
6
11
 
7
12
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
8
13
 
9
14
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
10
- const StyledOpenWindow = /*#__PURE__*/styled(InternalOpenWindow).withConfig({
15
+ const StyledOpenWindow = /*#__PURE__*/styled(OpenWindow$1).withConfig({
11
16
  componentId: "sc-g53ios-0"
12
17
  })(["cursor:pointer;:focus{outline:1px solid ", ";}"], props => props.theme.colors.brand[800]);
13
18
  const OpenWindow = props => /*#__PURE__*/jsx(StyledOpenWindow, _objectSpread({
@@ -1,12 +1,13 @@
1
1
  import { useContext, useCallback } from 'react';
2
2
  import { LeftNavContext } from '../LeftNavigationContext.js';
3
3
 
4
- const useExpandableOnClickHandler = ({
5
- id,
6
- onExpand,
7
- onOpen,
8
- selectable = true
9
- }) => {
4
+ const useExpandableOnClickHandler = _ref => {
5
+ let {
6
+ id,
7
+ onExpand,
8
+ onOpen,
9
+ selectable = true
10
+ } = _ref;
10
11
  const {
11
12
  leftNavProps: {
12
13
  expanded
@@ -19,10 +19,11 @@ const nextIndex = (index, length) => (index + 1) % length;
19
19
 
20
20
  const prevIndex = (index, length) => (index - 1 + length) % length;
21
21
 
22
- const useKeyboardNavigation = ({
23
- item,
24
- onClick
25
- }) => {
22
+ const useKeyboardNavigation = _ref => {
23
+ let {
24
+ item,
25
+ onClick
26
+ } = _ref;
26
27
  const {
27
28
  dsId,
28
29
  itemOpts: {
@@ -37,7 +38,6 @@ const useKeyboardNavigation = ({
37
38
  } = useContext(LeftNavContext);
38
39
  const currentIndex = useMemo(() => visibleItems.findIndex(visibleItemDsId => visibleItemDsId === dsId), [dsId, visibleItems]);
39
40
  const {
40
- expandedForAnimation,
41
41
  setFocusedItem,
42
42
  focusedItem,
43
43
  setSelectedItem
@@ -79,7 +79,7 @@ const useKeyboardNavigation = ({
79
79
 
80
80
  if (closable && keyCode === KEY_CODES.LEFT_ARROW) {
81
81
  onClick(e);
82
- focusAndSelect(dsId);
82
+ setFocusedItem(dsId);
83
83
  }
84
84
 
85
85
  if (keyCode === KEY_CODES.DOWN_ARROW) {
@@ -99,7 +99,7 @@ const useKeyboardNavigation = ({
99
99
  if (keyCode === KEY_CODES.END) {
100
100
  setFocusedItem(visibleItems[visibleItems.length - 1]);
101
101
  }
102
- }, [dsId, expandedForAnimation, selectable, openable, closable, onClick, visibleItemsRefs, visibleItems, focusedItem, focusAndSelect]);
102
+ }, [openable, closable, selectable, focusedItem, onClick, focusAndSelect, dsId, setFocusedItem, visibleItems, currentIndex]);
103
103
  return onKeyDown;
104
104
  };
105
105
 
@@ -1,13 +1,14 @@
1
1
  import { useContext, useCallback } from 'react';
2
2
  import { LeftNavContext } from '../LeftNavigationContext.js';
3
3
 
4
- const useOpenableOnClickHandler = ({
5
- id,
6
- opened,
7
- onExpand,
8
- onOpen,
9
- onClose
10
- }) => {
4
+ const useOpenableOnClickHandler = _ref => {
5
+ let {
6
+ id,
7
+ opened,
8
+ onExpand,
9
+ onOpen,
10
+ onClose
11
+ } = _ref;
11
12
  const {
12
13
  leftNavProps: {
13
14
  expanded
@@ -1,3 +1,6 @@
1
+ import 'core-js/modules/esnext.async-iterator.some.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.some.js';
1
4
  import { useEffect } from 'react';
2
5
  import { ITEM_TYPES } from '../exported-related/constants.js';
3
6
 
@@ -10,13 +13,20 @@ const isSelectableOutOfTheBox = elem => typeof elem.type === 'string' && elem.ty
10
13
 
11
14
  const isSelectableCustom = elem => elem.itemOpts.selectable;
12
15
 
13
- const useSelectFirstBodyItem = (items, openedItem, setSelectedItem) => {
16
+ const isItemInsideTheTree = (item, itemID) => {
17
+ var _item$itemOpts, _item$itemOpts$items;
18
+
19
+ return item.dsId === itemID || (item === null || item === void 0 ? void 0 : (_item$itemOpts = item.itemOpts) === null || _item$itemOpts === void 0 ? void 0 : (_item$itemOpts$items = _item$itemOpts.items) === null || _item$itemOpts$items === void 0 ? void 0 : _item$itemOpts$items.some(it => isItemInsideTheTree(it, itemID)));
20
+ };
21
+
22
+ const useSelectFirstBodyItem = (items, openedItem, selectedItem, setSelectedItem, disableDefaultSelection) => {
14
23
  useEffect(() => {
15
- if (items && items.length && openedItem) {
24
+ if (!disableDefaultSelection && items && items.length && openedItem) {
16
25
  const index = items.findIndex(elem => isSelectableOutOfTheBox(elem) || isSelectableCustom(elem));
17
- if (index !== -1) setSelectedItem(items[index].dsId);
26
+ const isItemInside = items.some(it => isItemInsideTheTree(it, selectedItem));
27
+ if (isItemInside) setSelectedItem(selectedItem);else if (index !== -1) setSelectedItem(items[index].dsId);
18
28
  }
19
- }, [openedItem]);
29
+ }, [openedItem, setSelectedItem, disableDefaultSelection]);
20
30
  };
21
31
 
22
32
  export { useSelectFirstBodyItem };
package/esm/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import 'overlayscrollbars/css/OverlayScrollbars.css';
2
1
  export { LeftNavItemOptionsSchema, LeftNavItemPropsSchema } from './prop-types.js';
3
2
  export { LeftNavigation, LeftNavigationWithSchema, LeftNavigation as default } from './LeftNavigation.js';
4
3
  export { CHEVRON_BACK_DS_ID, FOOTER_DS_ID, FOOTER_MENU_CLOSE_DS_ID, ITEM_TYPES, LABEL_OVERFLOW } from './exported-related/constants.js';
@@ -1,30 +1,32 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
1
6
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
7
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
8
+ import 'core-js/modules/esnext.async-iterator.map.js';
9
+ import 'core-js/modules/esnext.iterator.map.js';
3
10
  import { useMemo } from 'react';
4
11
  import Grid from '@elliemae/ds-grid';
5
12
  import { SimpleTruncatedTooltipText } from '@elliemae/ds-truncated-tooltip-text';
6
- import ArrowheadRight from '@elliemae/ds-icons/ArrowheadRight';
7
- import ArrowheadDown from '@elliemae/ds-icons/ArrowheadDown';
13
+ import { ArrowheadDown, ArrowheadRight } from '@elliemae/ds-icons';
8
14
  import { ITEM_TYPES } from '../../exported-related/constants.js';
9
15
  import { ItemRenderer } from '../../exported-related/ItemRenderer/index.js';
10
- import '@elliemae/ds-icons/ChevronSmallRight';
11
16
  import 'react/jsx-runtime';
12
- import '@elliemae/ds-icons/Notifications';
13
- import '@elliemae/ds-icons/ExceptionsSmallFill';
14
- import '@elliemae/ds-icons/AlertsSmallFill';
15
- import '@elliemae/ds-icons/MessagesSmallFill';
16
17
  import 'styled-components';
17
- import '@elliemae/ds-icons/OpenWindow';
18
18
  import { StyledLabel, StyledDate } from './styled.js';
19
19
  import { ItemSeparator } from '../ItemSeparator/index.js';
20
20
  import { ItemWithDate } from '../ItemWithDate/index.js';
21
+ import { ItemTextLabel } from '../ItemTextLabel/index.js';
21
22
 
22
23
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
23
24
 
24
25
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
25
26
  const outOfTheBoxSubitemsComponents = {
26
27
  [ITEM_TYPES.LEFT_NAV_ITEM_SEPARATOR]: ItemSeparator,
27
- [ITEM_TYPES.LEFT_NAV_ITEM_WITH_DATE]: ItemWithDate
28
+ [ITEM_TYPES.LEFT_NAV_ITEM_WITH_DATE]: ItemWithDate,
29
+ [ITEM_TYPES.LEFT_NAV_ITEM_TEXT_LABEL]: ItemTextLabel
28
30
  };
29
31
 
30
32
  const OutOfTheBoxMapSubitem = props => {
@@ -38,10 +40,10 @@ const OutOfTheBoxMapSubitem = props => {
38
40
  } = props;
39
41
 
40
42
  if (typeof type === 'string' && !!outOfTheBoxSubitemsComponents[type]) {
41
- var _item$itemOpts;
43
+ var _item$itemOpts$indent, _item$itemOpts;
42
44
 
43
45
  const OutOfTheBoxComponent = outOfTheBoxSubitemsComponents[type];
44
- const currentIndent = ((_item$itemOpts = item.itemOpts) === null || _item$itemOpts === void 0 ? void 0 : _item$itemOpts.indent) ?? 0;
46
+ const currentIndent = (_item$itemOpts$indent = (_item$itemOpts = item.itemOpts) === null || _item$itemOpts === void 0 ? void 0 : _item$itemOpts.indent) !== null && _item$itemOpts$indent !== void 0 ? _item$itemOpts$indent : 0;
45
47
 
46
48
  const newItem = _objectSpread(_objectSpread({}, item), {}, {
47
49
  itemOpts: _objectSpread(_objectSpread({}, item.itemOpts), {}, {
@@ -74,7 +76,8 @@ const ItemControlledDrilldown = props => {
74
76
  labelBold,
75
77
  labelColor,
76
78
  isOpened,
77
- items
79
+ items,
80
+ labelDataTestId
78
81
  }
79
82
  },
80
83
  ctx,
@@ -104,7 +107,7 @@ const ItemControlledDrilldown = props => {
104
107
  item: _objectSpread(_objectSpread({}, item), {}, {
105
108
  itemOpts: _objectSpread(_objectSpread({
106
109
  ariaExpanded: isOpened,
107
- ariaRole: 'menu'
110
+ ariaRole: 'menuitem'
108
111
  }, item.itemOpts), {}, {
109
112
  openable: !isOpened,
110
113
  closable: isOpened
@@ -119,7 +122,7 @@ const ItemControlledDrilldown = props => {
119
122
  mt: "-2px"
120
123
  }, void 0, arrowIcon), /*#__PURE__*/_jsx(StyledLabel, {
121
124
  pb: "xxxs",
122
- "data-testid": "leftnav-list-item-label",
125
+ "data-testid": labelDataTestId || 'leftnav-list-item-label',
123
126
  labelOverflow: labelOverflow,
124
127
  labelBold: labelBold,
125
128
  labelColor: labelColor
@@ -3,10 +3,13 @@ import Grid from '@elliemae/ds-grid';
3
3
 
4
4
  const StyledLabel = /*#__PURE__*/styled(Grid).withConfig({
5
5
  componentId: "sc-1tjij7e-0"
6
- })(["font-size:13px;font-weight:", ";color:", ";line-height:14px;word-break:", ";"], props => props.labelBold ? props.theme.fontWeights.semibold : props.theme.fontWeights.regular, ({
7
- labelColor,
8
- theme
9
- }) => labelColor ? theme.colors[labelColor[0]][labelColor[1]] : theme.colors.neutral[800], props => props.labelOverflow === 'wrapAll' ? 'break-all' : 'normal');
6
+ })(["font-size:13px;font-weight:", ";color:", ";line-height:14px;word-break:", ";"], props => props.labelBold ? props.theme.fontWeights.semibold : props.theme.fontWeights.regular, _ref => {
7
+ let {
8
+ labelColor,
9
+ theme
10
+ } = _ref;
11
+ return labelColor ? theme.colors[labelColor[0]][labelColor[1]] : theme.colors.neutral[800];
12
+ }, props => props.labelOverflow === 'wrapAll' ? 'break-all' : 'normal');
10
13
  const StyledDate = /*#__PURE__*/styled(Grid).withConfig({
11
14
  componentId: "sc-1tjij7e-1"
12
15
  })(["font-size:12px;color:", ";line-height:14px;"], props => props.theme.colors.neutral[600]);
@@ -1,24 +1,29 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
1
6
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
7
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
3
- import 'react';
8
+ import { useCallback } from 'react';
4
9
  import Grid from '@elliemae/ds-grid';
5
10
  import { SimpleTruncatedTooltipText } from '@elliemae/ds-truncated-tooltip-text';
6
11
  import { CHEVRON_BACK_DS_ID } from '../../exported-related/constants.js';
7
12
  import { ItemRenderer } from '../../exported-related/ItemRenderer/index.js';
8
- import '@elliemae/ds-icons/ChevronSmallRight';
13
+ import '@elliemae/ds-icons';
9
14
  import 'react/jsx-runtime';
10
- import '@elliemae/ds-icons/Notifications';
11
- import '@elliemae/ds-icons/ExceptionsSmallFill';
12
- import '@elliemae/ds-icons/AlertsSmallFill';
13
- import '@elliemae/ds-icons/MessagesSmallFill';
14
15
  import 'styled-components';
15
- import '@elliemae/ds-icons/OpenWindow';
16
16
  import { StyledChevronLeft, StyledLabel } from './styled.js';
17
17
 
18
18
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
19
19
 
20
20
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
21
+
22
+ const notOpenedShadowStyle = isSelected => theme => "\n box-shadow: inset 4px 0 0 0 ".concat(isSelected ? theme.colors.brand[400] : 'transparent', ";\n\n :hover {\n box-shadow: inset 4px 0 0 0 ").concat(isSelected ? theme.colors.brand[400] : theme.colors.brand[300], ";\n }\n\n :active {\n box-shadow: inset 4px 0 0 0 ").concat(theme.colors.brand[400], ";\n }\n");
23
+
21
24
  const ItemHeader = props => {
25
+ var _item$itemOpts$ariaLa;
26
+
22
27
  const {
23
28
  item,
24
29
  item: {
@@ -26,7 +31,8 @@ const ItemHeader = props => {
26
31
  itemOpts: {
27
32
  label,
28
33
  RightComponent,
29
- BottomComponent
34
+ BottomComponent,
35
+ labelDataTestId
30
36
  },
31
37
  CollapsedComponent = () => null
32
38
  },
@@ -38,12 +44,15 @@ const ItemHeader = props => {
38
44
  onItemClick
39
45
  },
40
46
  expandedForAnimation,
41
- setSelectedItem,
42
- setFocusedItem
47
+ setFocusedItem,
48
+ selectedItem,
49
+ selectedParent
43
50
  }
44
51
  } = props;
45
52
  const opened = openedItem === dsId;
46
- const ariaLabel = item.itemOpts.ariaLabel ?? (typeof label === 'string' ? label : 'menuitem');
53
+ const ariaLabel = (_item$itemOpts$ariaLa = item.itemOpts.ariaLabel) !== null && _item$itemOpts$ariaLa !== void 0 ? _item$itemOpts$ariaLa : typeof label === 'string' ? label : 'menuitem';
54
+ const isSelected = selectedItem === dsId || selectedParent === dsId;
55
+ const shadowStyle = useCallback(opened => theme => !opened ? notOpenedShadowStyle(isSelected)(theme) : "box-shadow: inset 4px 0 0 0 #52A6EC", [isSelected, openedItem]);
47
56
  return /*#__PURE__*/_jsx(ItemRenderer, {
48
57
  item: _objectSpread(_objectSpread({}, item), {}, {
49
58
  itemOpts: _objectSpread(_objectSpread({
@@ -56,7 +65,8 @@ const ItemHeader = props => {
56
65
  })
57
66
  }),
58
67
  hasBorderBottom: true,
59
- borderBottomMr: opened ? '12px' : '0px'
68
+ borderBottomMr: opened ? '12px' : '0px',
69
+ shadowStyle: shadowStyle
60
70
  }, void 0, /*#__PURE__*/_jsx(Grid, {
61
71
  cols: opened ? ['auto', 'auto'] : ['38px'],
62
72
  gutter: "1px",
@@ -68,7 +78,6 @@ const ItemHeader = props => {
68
78
  color: ['brand-primary', 800],
69
79
  onClick: e => {
70
80
  onItemClick(item, e);
71
- setSelectedItem(dsId);
72
81
  },
73
82
  "data-testid": "leftnav-leftcomponent-chevron",
74
83
  tabIndex: 0,
@@ -77,7 +86,7 @@ const ItemHeader = props => {
77
86
  setFocusedItem(CHEVRON_BACK_DS_ID);
78
87
  },
79
88
  role: "button",
80
- "aria-label": `Close ${ariaLabel}`
89
+ "aria-label": "Close ".concat(ariaLabel)
81
90
  }), /*#__PURE__*/_jsx(CollapsedComponent, {
82
91
  item: item,
83
92
  ctx: ctx
@@ -85,7 +94,7 @@ const ItemHeader = props => {
85
94
  ml: opened ? 'xxs' : '1px',
86
95
  mt: "xxxs",
87
96
  mb: "15px",
88
- "data-testid": "leftnav-itemlabel",
97
+ "data-testid": labelDataTestId || 'leftnav-itemlabel',
89
98
  labelOverflow: labelOverflow
90
99
  }, void 0, labelOverflow === 'truncate' ? /*#__PURE__*/_jsx(SimpleTruncatedTooltipText, {
91
100
  value: label,
@@ -1,12 +1,12 @@
1
1
  import Grid from '@elliemae/ds-grid';
2
- import ChevronLeft from '@elliemae/ds-icons/ChevronSmallLeft';
2
+ import { ChevronSmallLeft } from '@elliemae/ds-icons';
3
3
  import styled from 'styled-components';
4
4
 
5
5
  const StyledLabel = /*#__PURE__*/styled(Grid).withConfig({
6
6
  componentId: "sc-m5k4h8-0"
7
7
  })(["font-size:14px;color:", ";word-break:", ";"], props => props.theme.colors.neutral[800], props => props.labelOverflow === 'wrapAll' ? 'break-all' : 'normal');
8
- const StyledChevronLeft = /*#__PURE__*/styled(ChevronLeft).withConfig({
8
+ const StyledChevronLeft = /*#__PURE__*/styled(ChevronSmallLeft).withConfig({
9
9
  componentId: "sc-m5k4h8-1"
10
- })(["cursor:pointer;:focus{outline:1px solid ", ";}"], props => props.theme.colors.brand[800]);
10
+ })(["cursor:pointer;:focus{outline:2px solid ", ";}"], props => props.theme.colors.brand[800]);
11
11
 
12
12
  export { StyledChevronLeft, StyledLabel };