@geotab/zenith 3.5.0 → 3.5.1-beta.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 (57) hide show
  1. package/README.md +4 -0
  2. package/dist/index.css +57 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +5 -3
  5. package/dist/list/hooks/useDragAndDrop.d.ts +19 -1
  6. package/dist/list/hooks/useDragAndDrop.js +65 -26
  7. package/dist/list/utils/findElement.d.ts +1 -0
  8. package/dist/list/utils/findElement.js +13 -0
  9. package/dist/list/utils/findItemPosition.d.ts +1 -1
  10. package/dist/list/utils/findItemPosition.js +2 -2
  11. package/dist/list/utils/isDragNotClick.d.ts +6 -0
  12. package/dist/list/utils/isDragNotClick.js +9 -0
  13. package/dist/nav/context/nav.context.d.ts +2 -0
  14. package/dist/nav/context/nav.context.js +3 -1
  15. package/dist/nav/nav.js +20 -8
  16. package/dist/nav/navEditList/navEditList.d.ts +7 -0
  17. package/dist/nav/navEditList/navEditList.js +22 -0
  18. package/dist/nav/navEditList/navEditListUtils.d.ts +3 -0
  19. package/dist/nav/navEditList/navEditListUtils.js +14 -0
  20. package/dist/nav/navEditSection/navEditSection.d.ts +3 -0
  21. package/dist/nav/navEditSection/navEditSection.js +7 -0
  22. package/dist/nav/navFooter/navEditFooter/navEditFooter.d.ts +11 -0
  23. package/dist/nav/navFooter/navEditFooter/navEditFooter.js +110 -0
  24. package/dist/nav/navFooter/navFooter.d.ts +2 -7
  25. package/dist/nav/navFooter/navFooter.js +4 -4
  26. package/dist/nav/navItem/navActionItem.d.ts +14 -0
  27. package/dist/nav/navItem/navActionItem.js +15 -0
  28. package/esm/index.d.ts +1 -0
  29. package/esm/index.js +1 -0
  30. package/esm/list/hooks/useDragAndDrop.d.ts +19 -1
  31. package/esm/list/hooks/useDragAndDrop.js +65 -26
  32. package/esm/list/utils/findElement.d.ts +1 -0
  33. package/esm/list/utils/findElement.js +9 -0
  34. package/esm/list/utils/findItemPosition.d.ts +1 -1
  35. package/esm/list/utils/findItemPosition.js +2 -2
  36. package/esm/list/utils/isDragNotClick.d.ts +6 -0
  37. package/esm/list/utils/isDragNotClick.js +5 -0
  38. package/esm/nav/context/nav.context.d.ts +2 -0
  39. package/esm/nav/context/nav.context.js +3 -1
  40. package/esm/nav/nav.js +21 -9
  41. package/esm/nav/navEditList/navEditList.d.ts +7 -0
  42. package/esm/nav/navEditList/navEditList.js +18 -0
  43. package/esm/nav/navEditList/navEditListUtils.d.ts +3 -0
  44. package/esm/nav/navEditList/navEditListUtils.js +10 -0
  45. package/esm/nav/navEditSection/navEditSection.d.ts +3 -0
  46. package/esm/nav/navEditSection/navEditSection.js +3 -0
  47. package/esm/nav/navFooter/navEditFooter/navEditFooter.d.ts +11 -0
  48. package/esm/nav/navFooter/navEditFooter/navEditFooter.js +101 -0
  49. package/esm/nav/navFooter/navFooter.d.ts +2 -7
  50. package/esm/nav/navFooter/navFooter.js +4 -4
  51. package/esm/nav/navItem/navActionItem.d.ts +14 -0
  52. package/esm/nav/navItem/navActionItem.js +11 -0
  53. package/package.json +4 -4
  54. package/dist/list/utils/findListElement.d.ts +0 -1
  55. package/dist/list/utils/findListElement.js +0 -13
  56. package/esm/list/utils/findListElement.d.ts +0 -1
  57. package/esm/list/utils/findListElement.js +0 -9
package/README.md CHANGED
@@ -47,6 +47,10 @@ Zenith library provides components defined in Zenith Design System. It includes
47
47
 
48
48
  ## Change log
49
49
 
50
+ ### 3.5.1
51
+
52
+ Edit mode in the `Nav` component has been added.
53
+
50
54
  ### 3.5.0
51
55
 
52
56
  Accessibility improvements, new DateInput control in FiltersBar, custom chart legend formatting, and new languages support. Plus several performance and stability fixes.
package/dist/index.css CHANGED
@@ -14397,6 +14397,7 @@ button.zen-summary__clickable {
14397
14397
  }
14398
14398
  .zen-nav {
14399
14399
  --nav-gap: 16px;
14400
+ --nav-items-gap: 8px;
14400
14401
  --nav-bottom-padding: 12px;
14401
14402
  --nav-top-padding: 9px;
14402
14403
  --nav-left-right-padding: 12px;
@@ -14827,6 +14828,62 @@ button.zen-summary__clickable {
14827
14828
  background: var(--backgrounds-content-0);
14828
14829
  border-top: 1px solid var(--borders-general);
14829
14830
  }
14831
+ .zen-nav-edit-footer {
14832
+ position: absolute;
14833
+ left: 0px;
14834
+ bottom: 0px;
14835
+ padding: 12px;
14836
+ width: calc(100% - 24px);
14837
+ display: flex;
14838
+ flex-direction: row;
14839
+ justify-content: space-between;
14840
+ }
14841
+ .zen-nav-edit-footer__button {
14842
+ width: calc(50% - 4px);
14843
+ }
14844
+ .zen-nav-edit-footer__button--with-margin {
14845
+ margin-bottom: 8px;
14846
+ }
14847
+ .zen-nav-edit-footer--mobile {
14848
+ flex-direction: column;
14849
+ bottom: 48px;
14850
+ }
14851
+ .zen-nav-edit-footer--mobile .zen-nav-edit-footer__button {
14852
+ width: 100%;
14853
+ }
14854
+ .zen-nav-edit-section {
14855
+ display: flex;
14856
+ flex-direction: column;
14857
+ gap: var(--nav-gap);
14858
+ }
14859
+ .zen-nav-edit-list {
14860
+ display: flex;
14861
+ flex-direction: column;
14862
+ gap: var(--nav-items-gap);
14863
+ }
14864
+ .zen-nav-edit-list__header {
14865
+ font-family: var(--main-font);
14866
+ font-size: 14px;
14867
+ font-style: normal;
14868
+ font-weight: 500;
14869
+ letter-spacing: 0.16px;
14870
+ line-height: 16px;
14871
+ text-transform: none;
14872
+ color: var(--text-secondary);
14873
+ margin: 0;
14874
+ }
14875
+ .zen-nav-edit-list__header--no-gap {
14876
+ margin-bottom: calc(var(--nav-items-gap) * -1);
14877
+ }
14878
+ .zen-nav-edit-list .zen-nav-edit-list__item--placeholder {
14879
+ list-style-type: none;
14880
+ }
14881
+ .zen-nav-edit-list .zen-nav-edit-list__item--dragging {
14882
+ display: none;
14883
+ }
14884
+ .zen-nav-edit-list__item--dragged {
14885
+ background-color: var(--backgrounds-hover);
14886
+ }
14830
14887
  .zen-push {
14831
14888
  box-sizing: border-box;
14832
14889
  font-family: var(--main-font);
package/dist/index.d.ts CHANGED
@@ -697,6 +697,7 @@ export { type IItemData, ItemData } from "./list/itemData/itemData";
697
697
  export { type IList, List } from "./list/list";
698
698
  export { type IListItem, ListItem } from "./list/listItem/listItem";
699
699
  export { changeOrder } from "./list/utils/changeOrder";
700
+ export { isDragNotClick } from "./list/utils/isDragNotClick";
700
701
  export { type IControlledMenu, ControlledMenu } from "./menu/controlledMenu";
701
702
  export { type IMenu, Menu } from "./menu/menu";
702
703
  export { findFirstFocusable } from "./menu/utils/findFirstFocusable";
package/dist/index.js CHANGED
@@ -15,9 +15,9 @@ exports.IconMove = exports.IconMouseScrollUp = exports.IconMouseScrollDown = exp
15
15
  exports.IconPullRequest = exports.IconProcessor = exports.IconPrinter = exports.IconPound = exports.IconPlusSquare = exports.IconPlusLines = exports.IconPlusFile = exports.IconPlusCircle = exports.IconPlus = exports.IconPlay = exports.IconPinLocation3 = exports.IconPinLocation2 = exports.IconPinLocation = exports.IconPin2 = exports.IconPin = exports.IconPhoneMobile = exports.IconPhone = exports.IconPerformance = exports.IconPercent = exports.IconPeopleLike = exports.IconPeopleGroup2 = exports.IconPeopleGroup = exports.IconPeople = exports.IconPencil2 = exports.IconPencil = exports.IconPause = exports.IconPassword = exports.IconPaperPlane = exports.IconPackage3 = exports.IconPackage2 = exports.IconPackage = exports.IconPDF = exports.IconOptAlt = exports.IconOpt = exports.IconOpen2 = exports.IconOpen = exports.IconOnDuty = exports.IconNumberedList = exports.IconNotifications = exports.IconNotificationOff = exports.IconNotificationBell = exports.IconNotificationAlarm = exports.IconNote = exports.IconNewspaper = exports.IconNews = exports.IconNavigationFooterExpanded = exports.IconNavigationFooterCollapsed = exports.IconMyGeotab = exports.IconMyAdmin = exports.IconMove2 = void 0;
16
16
  exports.IconSortHorizontal = exports.IconSort2Vertical = exports.IconSort2Horizontal = exports.IconSmiley = exports.IconSign = exports.IconSidebar = exports.IconShield4 = exports.IconShield3 = exports.IconShield2 = exports.IconShield = exports.IconShare3 = exports.IconShare = exports.IconSettings8 = exports.IconSettings7 = exports.IconSettings6 = exports.IconSettings4 = exports.IconSettings3 = exports.IconSettings2 = exports.IconSettings1 = exports.IconServer3 = exports.IconServer2 = exports.IconServer = exports.IconSend = exports.IconSecuredLines = exports.IconSecured = exports.IconSeatbelt = exports.IconSearchPage = exports.IconSearchLines = exports.IconSearchDocument = exports.IconSearch = exports.IconSdCard = exports.IconRuler = exports.IconRoute = exports.IconRotateRepeat2 = exports.IconRotateRepeat = exports.IconRotateCounterclockwise = exports.IconRotateClockwise = exports.IconResizeSmall = exports.IconResizeBig = exports.IconRepeat2 = exports.IconRepeat = exports.IconRemovePeople = exports.IconRefrigeration = exports.IconRedo2 = exports.IconRedo = exports.IconRecord = exports.IconReceipt = exports.IconRadar = exports.IconQuestion = exports.IconPuzzle = void 0;
17
17
  exports.IconWatch = exports.IconWarning = exports.IconWallet1 = exports.IconWallet = exports.IconVolumeOn = exports.IconVolumeOff = exports.IconVolumeMinimum = exports.IconVolumeHalf = exports.IconVolumeFull = exports.IconVolumeDown = exports.IconVoice = exports.IconVisitPage = exports.IconVideoReplay = exports.IconVideo2 = exports.IconVideo = exports.IconUsbHub = exports.IconUsb = exports.IconUpload = exports.IconUnlocked = exports.IconUndock = exports.IconUndo2 = exports.IconUndo = exports.IconUnderline = exports.IconUmbrella = exports.IconTrailer = exports.IconThumbsUp = exports.IconThumbsDown = exports.IconThermometer = exports.IconThermograph = exports.IconTextSize = exports.IconTelevision2 = exports.IconTelevision = exports.IconTarget3 = exports.IconTarget2 = exports.IconTarget = exports.IconTachographTimeCard = exports.IconTachograph = exports.IconTable = exports.IconSupport = exports.IconSun = exports.IconStrikeThrough = exports.IconStore = exports.IconStorage = exports.IconStopwatch = exports.IconStarFilled = exports.IconStarAi = exports.IconStar = exports.IconSquare = exports.IconSpeaker = exports.IconSortVertical = void 0;
18
- exports.PageHeader = exports.PageHeaderDisplayName = exports.Notification = exports.getPredefinedFocusableItem = exports.DialogContentNew = exports.Modal = exports.MobileSheet = exports.MiniTabs = exports.MiniTabsSize = exports.isLink = exports.isButton = exports.findPrevFocusable = exports.findNextFocusable = exports.findLastFocusable = exports.findFirstFocusable = exports.Menu = exports.ControlledMenu = exports.changeOrder = exports.ListItem = exports.List = exports.ItemData = exports.ItemCompact = exports.LineChartMini = exports.getDefaultDatasetStyle = exports.htmlLegendPlugin = exports.LEGEND_PLUGIN_ID = exports.LineChart = exports.useLayoutSize = exports.LayoutFullScreenProvider = exports.useLayoutFullScreen = exports.LayoutFullScreenElementProvider = exports.useLayoutFullScreenElement = exports.Layout = exports.ImageNothingFound = exports.ImageNoMatchingAssets = exports.ImageLooking = exports.ImageAdjustFilter = exports.IconZoom2 = exports.IconZoom = exports.IconZone = exports.IconYen = exports.IconWrite = exports.IconWrench = exports.IconWorld = exports.IconWorkday = exports.IconWifi2 = exports.IconWifi = exports.IconWhisper = exports.IconWebcam = exports.IconWatch2 = void 0;
19
- exports.MainColumn = exports.ActionsColumn = exports.getSortableValue = exports.ColumnSortDirection = exports.getEmptySelection = exports.Table = exports.useNestedRows = exports.NestedData = exports.TabBarContent = exports.TabBar = exports.SummaryTileBarDisplayName = exports.SummaryTileBar = exports.getTypeClassName = exports.SummaryTileTrigger = exports.SummaryTile = exports.SummaryTileDisplayName = exports.SummaryTileSize = exports.SummaryTileType = exports.Summary = exports.Summaries = exports.Stepper = exports.SortControl = exports.SortDirections = exports.Skeleton = exports.LazyContent = exports.SidePanel = exports.CUSTOM_POPUP_COMPONENT_CLASSNAME = exports.SidePanelCloseReason = exports.isChildPopup = exports.SelectField = exports.Select = exports.SearchInput = exports.Range = exports.RadioGroup = exports.Radio = exports.ProgressBar = exports.ProgreesBarSize = exports.ProgressBarType = exports.PrimaryIcon = exports.Popup = exports.PillExpandable = exports.Pill = exports.PaginationType = exports.Pagination = exports.PageLayout = exports.PageContentLayout = exports.PageHeaderMenu = exports.PageHeaderMenuDisplayName = exports.PageHeaderButton = exports.PageHeaderButtonDisplayName = void 0;
20
- exports.Waiting = exports.UserFormatProvider = exports.useDrive = exports.ThemeProvider = exports.ThemeDrive = exports.ThemeDark = exports.useLanguage = exports.injectString = exports.dictionaries = exports.LanguageProvider = exports.getFirstFocusableItem = exports.getNewFocusableItem = exports.HeaderButtonsProvider = exports.AbortablePromise = exports.Tooltip = exports.removeArrowClasses = exports.calculateArrowPosition = exports.ToggleButtonRaw = exports.ToggleButton = exports.Toast = exports.useToast = exports.TimePicker = exports.TextareaRaw = exports.Textarea = exports.TextInputRaw = exports.TextInput = exports.TextIconButton = exports.ButtonIconPosition = exports.Tabs = exports.TabsDisplayName = exports.ActionLinkColumn = exports.CheckboxColumn = void 0;
18
+ exports.PageHeaderDisplayName = exports.Notification = exports.getPredefinedFocusableItem = exports.DialogContentNew = exports.Modal = exports.MobileSheet = exports.MiniTabs = exports.MiniTabsSize = exports.isLink = exports.isButton = exports.findPrevFocusable = exports.findNextFocusable = exports.findLastFocusable = exports.findFirstFocusable = exports.Menu = exports.ControlledMenu = exports.isDragNotClick = exports.changeOrder = exports.ListItem = exports.List = exports.ItemData = exports.ItemCompact = exports.LineChartMini = exports.getDefaultDatasetStyle = exports.htmlLegendPlugin = exports.LEGEND_PLUGIN_ID = exports.LineChart = exports.useLayoutSize = exports.LayoutFullScreenProvider = exports.useLayoutFullScreen = exports.LayoutFullScreenElementProvider = exports.useLayoutFullScreenElement = exports.Layout = exports.ImageNothingFound = exports.ImageNoMatchingAssets = exports.ImageLooking = exports.ImageAdjustFilter = exports.IconZoom2 = exports.IconZoom = exports.IconZone = exports.IconYen = exports.IconWrite = exports.IconWrench = exports.IconWorld = exports.IconWorkday = exports.IconWifi2 = exports.IconWifi = exports.IconWhisper = exports.IconWebcam = exports.IconWatch2 = void 0;
19
+ exports.ActionsColumn = exports.getSortableValue = exports.ColumnSortDirection = exports.getEmptySelection = exports.Table = exports.useNestedRows = exports.NestedData = exports.TabBarContent = exports.TabBar = exports.SummaryTileBarDisplayName = exports.SummaryTileBar = exports.getTypeClassName = exports.SummaryTileTrigger = exports.SummaryTile = exports.SummaryTileDisplayName = exports.SummaryTileSize = exports.SummaryTileType = exports.Summary = exports.Summaries = exports.Stepper = exports.SortControl = exports.SortDirections = exports.Skeleton = exports.LazyContent = exports.SidePanel = exports.CUSTOM_POPUP_COMPONENT_CLASSNAME = exports.SidePanelCloseReason = exports.isChildPopup = exports.SelectField = exports.Select = exports.SearchInput = exports.Range = exports.RadioGroup = exports.Radio = exports.ProgressBar = exports.ProgreesBarSize = exports.ProgressBarType = exports.PrimaryIcon = exports.Popup = exports.PillExpandable = exports.Pill = exports.PaginationType = exports.Pagination = exports.PageLayout = exports.PageContentLayout = exports.PageHeaderMenu = exports.PageHeaderMenuDisplayName = exports.PageHeaderButton = exports.PageHeaderButtonDisplayName = exports.PageHeader = void 0;
20
+ exports.Waiting = exports.UserFormatProvider = exports.useDrive = exports.ThemeProvider = exports.ThemeDrive = exports.ThemeDark = exports.useLanguage = exports.injectString = exports.dictionaries = exports.LanguageProvider = exports.getFirstFocusableItem = exports.getNewFocusableItem = exports.HeaderButtonsProvider = exports.AbortablePromise = exports.Tooltip = exports.removeArrowClasses = exports.calculateArrowPosition = exports.ToggleButtonRaw = exports.ToggleButton = exports.Toast = exports.useToast = exports.TimePicker = exports.TextareaRaw = exports.Textarea = exports.TextInputRaw = exports.TextInput = exports.TextIconButton = exports.ButtonIconPosition = exports.Tabs = exports.TabsDisplayName = exports.ActionLinkColumn = exports.CheckboxColumn = exports.MainColumn = void 0;
21
21
  /* eslint-disable max-len */
22
22
  var absolute_1 = require("./absolute/absolute");
23
23
  Object.defineProperty(exports, "Absolute", { enumerable: true, get: function () { return absolute_1.Absolute; } });
@@ -1487,6 +1487,8 @@ var listItem_1 = require("./list/listItem/listItem");
1487
1487
  Object.defineProperty(exports, "ListItem", { enumerable: true, get: function () { return listItem_1.ListItem; } });
1488
1488
  var changeOrder_1 = require("./list/utils/changeOrder");
1489
1489
  Object.defineProperty(exports, "changeOrder", { enumerable: true, get: function () { return changeOrder_1.changeOrder; } });
1490
+ var isDragNotClick_1 = require("./list/utils/isDragNotClick");
1491
+ Object.defineProperty(exports, "isDragNotClick", { enumerable: true, get: function () { return isDragNotClick_1.isDragNotClick; } });
1490
1492
  var controlledMenu_1 = require("./menu/controlledMenu");
1491
1493
  Object.defineProperty(exports, "ControlledMenu", { enumerable: true, get: function () { return controlledMenu_1.ControlledMenu; } });
1492
1494
  var menu_1 = require("./menu/menu");
@@ -1,4 +1,22 @@
1
1
  import { RefObject } from "react";
2
- export declare const useDragAndDrop: (containerRef: RefObject<HTMLElement | null>, onChangeOrder: (startPosition: number, endPosition: number) => void) => {
2
+ interface IMarkerClasses {
3
+ general: string;
4
+ placeholder: string;
5
+ dragging: string;
6
+ dragged?: string;
7
+ }
8
+ /**
9
+ * A custom React hook that provides drag-and-drop functionality for reorderable list items.
10
+ * @param containerRef - A React ref pointing to the container element that holds the draggable items
11
+ * @param onChangeOrder - Callback function invoked when an item is dropped at a new position.
12
+ * Receives the start position and end position of the dragged item
13
+ * @param marksClassNames - Optional custom CSS class names for marking different states of list items.
14
+ * If not provided, defaults to 'zen-list-item' based classes
15
+ * @param onBeforeDragOver - Optional callback function called before placing the placeholder at a new position.
16
+ * Receives the target position and should return false to prevent the drag operation.
17
+ * @returns An object containing the `onDragStart` event handler to be attached to draggable elements
18
+ */
19
+ export declare const useDragAndDrop: (containerRef: RefObject<HTMLElement | null>, onChangeOrder: (startPosition: number, endPosition: number) => void, marksClassNames?: IMarkerClasses, onBeforeDragOver?: (endPosition: number) => boolean) => {
3
20
  onDragStart: (e: React.PointerEvent<HTMLElement>) => void;
4
21
  };
22
+ export {};
@@ -3,33 +3,55 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useDragAndDrop = void 0;
4
4
  const react_1 = require("react");
5
5
  const getScrollableParent_1 = require("../../utils/getScrollableParent");
6
- const findListElement_1 = require("../utils/findListElement");
6
+ const findElement_1 = require("../utils/findElement");
7
7
  const useContainerScroll_1 = require("./useContainerScroll");
8
8
  const findItemPosition_1 = require("../utils/findItemPosition");
9
- const useDragAndDrop = (containerRef, onChangeOrder) => {
9
+ const isDragNotClick_1 = require("../utils/isDragNotClick");
10
+ /**
11
+ * A custom React hook that provides drag-and-drop functionality for reorderable list items.
12
+ * @param containerRef - A React ref pointing to the container element that holds the draggable items
13
+ * @param onChangeOrder - Callback function invoked when an item is dropped at a new position.
14
+ * Receives the start position and end position of the dragged item
15
+ * @param marksClassNames - Optional custom CSS class names for marking different states of list items.
16
+ * If not provided, defaults to 'zen-list-item' based classes
17
+ * @param onBeforeDragOver - Optional callback function called before placing the placeholder at a new position.
18
+ * Receives the target position and should return false to prevent the drag operation.
19
+ * @returns An object containing the `onDragStart` event handler to be attached to draggable elements
20
+ */
21
+ const useDragAndDrop = (containerRef, onChangeOrder, marksClassNames, onBeforeDragOver) => {
10
22
  const dragImageRef = (0, react_1.useRef)(null);
11
23
  const dragMoveRef = (0, react_1.useRef)(undefined);
12
24
  const { moveScroll, cancelMoveScroll } = (0, useContainerScroll_1.useContainerScroll)();
25
+ const cssMarks = marksClassNames
26
+ ? marksClassNames
27
+ : {
28
+ general: "zen-list-item",
29
+ placeholder: "zen-list-item--placeholder",
30
+ dragging: "zen-list-item--dragging"
31
+ };
13
32
  const getPlaceholder = (0, react_1.useCallback)((height) => {
14
33
  const placeholder = document.createElement("li");
15
- placeholder.className = "zen-list-item zen-list-item--placeholder";
34
+ placeholder.className = `${cssMarks.general} ${cssMarks.placeholder}`;
16
35
  placeholder.style.height = height + "px";
17
36
  return placeholder;
18
- }, []);
37
+ }, [cssMarks.general, cssMarks.placeholder]);
19
38
  const removePlaceholders = (0, react_1.useCallback)((element) => {
20
- const placeholders = element.querySelectorAll(".zen-list-item--placeholder");
39
+ const placeholders = element.querySelectorAll(`.${cssMarks.placeholder}`);
21
40
  for (const placeholder of placeholders) {
22
41
  placeholder.remove();
23
42
  }
24
- }, []);
43
+ }, [cssMarks.placeholder]);
25
44
  const setPlaceholder = (0, react_1.useCallback)((element) => {
26
45
  if (!containerRef.current) {
27
46
  return;
28
47
  }
29
- const items = containerRef.current.querySelectorAll(".zen-list-item");
48
+ const items = containerRef.current.querySelectorAll(`.${cssMarks.general}`);
30
49
  const rect = element.getBoundingClientRect();
31
50
  const listRect = containerRef.current.getBoundingClientRect();
32
51
  if (rect.top < listRect.top) {
52
+ if (onBeforeDragOver && !onBeforeDragOver(0)) {
53
+ return;
54
+ }
33
55
  // If the dragged element is above the list, insert placeholder at the top
34
56
  const placeholder = getPlaceholder(rect.height);
35
57
  removePlaceholders(containerRef.current);
@@ -43,18 +65,25 @@ const useDragAndDrop = (containerRef, onChangeOrder) => {
43
65
  return;
44
66
  }
45
67
  if (rect.top > listRect.bottom) {
68
+ if (onBeforeDragOver && !onBeforeDragOver(items.length)) {
69
+ return;
70
+ }
46
71
  const placeholder = getPlaceholder(rect.height);
47
72
  removePlaceholders(containerRef.current);
48
73
  containerRef.current.appendChild(placeholder);
49
74
  return;
50
75
  }
51
76
  const dragItemTopOffset = 4;
52
- for (const item of items) {
53
- if (item.classList.contains("zen-list-item--placeholder") || item.classList.contains("zen-list-item--dragging")) {
77
+ for (let i = 0; i < items.length; i++) {
78
+ const item = items[i];
79
+ if (item.classList.contains(cssMarks.placeholder) || item.classList.contains(cssMarks.dragging)) {
54
80
  continue;
55
81
  }
56
82
  const itemRect = item.getBoundingClientRect();
57
83
  if (item !== element && rect.top > itemRect.top + dragItemTopOffset && rect.top <= itemRect.bottom) {
84
+ if (onBeforeDragOver && !onBeforeDragOver(i + 1)) {
85
+ return;
86
+ }
58
87
  const placeholder = getPlaceholder(rect.height);
59
88
  removePlaceholders(containerRef.current);
60
89
  const next = item.nextSibling;
@@ -67,19 +96,24 @@ const useDragAndDrop = (containerRef, onChangeOrder) => {
67
96
  return;
68
97
  }
69
98
  }
70
- }, [containerRef, getPlaceholder, removePlaceholders]);
99
+ }, [containerRef, getPlaceholder, removePlaceholders, onBeforeDragOver, cssMarks.general, cssMarks.placeholder, cssMarks.dragging]);
71
100
  const onDragStart = (0, react_1.useCallback)((e) => {
72
- const listItemElement = (0, findListElement_1.findListElement)(e.currentTarget);
101
+ e.preventDefault();
102
+ const listItemElement = (0, findElement_1.findElement)(e.currentTarget, cssMarks.general);
73
103
  if (!listItemElement) {
74
104
  return;
75
105
  }
76
- const startPosition = (0, findItemPosition_1.findItemPosition)(listItemElement);
106
+ const startPosition = (0, findItemPosition_1.findItemPosition)(listItemElement, cssMarks.dragging);
77
107
  const rect = listItemElement.getBoundingClientRect();
78
108
  const offset = {
79
109
  x: e.clientX - rect.left,
80
110
  y: e.clientY - rect.top
81
111
  };
112
+ const initialCoords = { x: e.clientX, y: e.clientY };
82
113
  const div = listItemElement.cloneNode(true);
114
+ if (cssMarks.dragged) {
115
+ div.classList.add(cssMarks.dragged);
116
+ }
83
117
  document.body.appendChild(div);
84
118
  dragImageRef.current = div;
85
119
  div.style.position = "absolute";
@@ -87,16 +121,25 @@ const useDragAndDrop = (containerRef, onChangeOrder) => {
87
121
  div.style.top = (e.clientY - offset.y) + "px";
88
122
  div.style.width = listItemElement.offsetWidth + "px";
89
123
  div.style.height = listItemElement.offsetHeight + "px";
124
+ let isDragStarted = false;
90
125
  dragMoveRef.current = (moveEvent) => {
91
126
  if (!dragImageRef.current) {
92
127
  return;
93
128
  }
94
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
95
- const pageScroll = window ? window.scrollY : 0;
96
- dragImageRef.current.style.left = (moveEvent.clientX - offset.x) + "px";
97
- dragImageRef.current.style.top = (pageScroll + moveEvent.clientY - offset.y) + "px";
98
- setPlaceholder(dragImageRef.current);
99
- moveEvent.preventDefault();
129
+ if (isDragStarted || (0, isDragNotClick_1.isDragNotClick)(initialCoords, { x: moveEvent.clientX, y: moveEvent.clientY })) {
130
+ if (!isDragStarted) {
131
+ isDragStarted = true;
132
+ listItemElement.classList.add(cssMarks.dragging);
133
+ const scrollableParent = (0, getScrollableParent_1.getScrollableParent)(containerRef.current);
134
+ moveScroll((scrollableParent || containerRef.current), dragImageRef.current, () => setPlaceholder(dragImageRef.current));
135
+ }
136
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
137
+ const pageScroll = window ? window.scrollY : 0;
138
+ dragImageRef.current.style.left = (moveEvent.clientX - offset.x) + "px";
139
+ dragImageRef.current.style.top = (pageScroll + moveEvent.clientY - offset.y) + "px";
140
+ setPlaceholder(dragImageRef.current);
141
+ moveEvent.preventDefault();
142
+ }
100
143
  };
101
144
  const onDragEnd = () => {
102
145
  var _a;
@@ -107,9 +150,9 @@ const useDragAndDrop = (containerRef, onChangeOrder) => {
107
150
  if (dragMoveRef.current) {
108
151
  document.body.removeEventListener("pointermove", dragMoveRef.current, false);
109
152
  }
110
- const placeholderElement = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(".zen-list-item--placeholder");
111
- const endPosition = placeholderElement ? (0, findItemPosition_1.findItemPosition)(placeholderElement) : null;
112
- listItemElement.classList.remove("zen-list-item--dragging");
153
+ const placeholderElement = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(`.${cssMarks.placeholder}`);
154
+ const endPosition = placeholderElement ? (0, findItemPosition_1.findItemPosition)(placeholderElement, cssMarks.dragging) : null;
155
+ listItemElement.classList.remove(cssMarks.dragging);
113
156
  if (containerRef.current) {
114
157
  removePlaceholders(containerRef.current);
115
158
  }
@@ -124,11 +167,7 @@ const useDragAndDrop = (containerRef, onChangeOrder) => {
124
167
  document.body.addEventListener("pointermove", dragMoveRef.current, false);
125
168
  document.body.addEventListener("pointerup", onDragEnd, false);
126
169
  document.addEventListener("mouseleave", onDragEnd);
127
- listItemElement.classList.add("zen-list-item--dragging");
128
- setPlaceholder(dragImageRef.current);
129
- const scrollableParent = (0, getScrollableParent_1.getScrollableParent)(containerRef.current);
130
- moveScroll((scrollableParent || containerRef.current), dragImageRef.current, () => setPlaceholder(dragImageRef.current));
131
- }, [cancelMoveScroll, containerRef, moveScroll, onChangeOrder, removePlaceholders, setPlaceholder]);
170
+ }, [cancelMoveScroll, containerRef, moveScroll, onChangeOrder, removePlaceholders, setPlaceholder, cssMarks.general, cssMarks.placeholder, cssMarks.dragging, cssMarks.dragged]);
132
171
  return { onDragStart };
133
172
  };
134
173
  exports.useDragAndDrop = useDragAndDrop;
@@ -0,0 +1 @@
1
+ export declare const findElement: (element: HTMLElement, className: string) => HTMLElement | null;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findElement = void 0;
4
+ const findElement = (element, className) => {
5
+ if (element.classList.contains(className)) {
6
+ return element;
7
+ }
8
+ if (element.parentElement) {
9
+ return (0, exports.findElement)(element.parentElement, className);
10
+ }
11
+ return null;
12
+ };
13
+ exports.findElement = findElement;
@@ -1 +1 @@
1
- export declare const findItemPosition: (element: HTMLElement) => number;
1
+ export declare const findItemPosition: (element: HTMLElement, draggingClass?: string) => number;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findItemPosition = void 0;
4
- const findItemPosition = (element) => {
4
+ const findItemPosition = (element, draggingClass = "zen-list-item--dragging") => {
5
5
  const parent = element.parentElement;
6
6
  if (!parent) {
7
7
  return -1;
@@ -9,7 +9,7 @@ const findItemPosition = (element) => {
9
9
  let ignoreOriginalElement = false;
10
10
  for (let i = 0; i < parent.children.length; i++) {
11
11
  const currentChild = parent.children[i];
12
- ignoreOriginalElement = ignoreOriginalElement || currentChild.classList.contains("zen-list-item--dragging");
12
+ ignoreOriginalElement = ignoreOriginalElement || currentChild.classList.contains(draggingClass);
13
13
  if (currentChild === element) {
14
14
  return i - (ignoreOriginalElement ? 1 : 0);
15
15
  }
@@ -0,0 +1,6 @@
1
+ interface ICoord {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export declare const isDragNotClick: (initialCoords: ICoord, currentCoords: ICoord, threshold?: number) => boolean;
6
+ export {};
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isDragNotClick = void 0;
4
+ const isDragNotClick = (initialCoords, currentCoords, threshold = 5) => {
5
+ const xShift = initialCoords.x - currentCoords.x;
6
+ const yShift = initialCoords.y - currentCoords.y;
7
+ return Math.sqrt(xShift * xShift + yShift * yShift) > threshold;
8
+ };
9
+ exports.isDragNotClick = isDragNotClick;
@@ -7,6 +7,8 @@ export interface INavContext {
7
7
  searchOpen?: boolean;
8
8
  onSearchToggle?: (isOpen: boolean) => void;
9
9
  onNavigate?: () => void;
10
+ isEditState?: boolean;
11
+ onEditStateToggle?: (isEdit: boolean) => void;
10
12
  }
11
13
  /**
12
14
  * @beta This component is not fully ready yet and may change in future releases.
@@ -12,7 +12,9 @@ exports.NavContext = (0, react_1.createContext)({
12
12
  onSearch: undefined,
13
13
  searchOpen: false,
14
14
  onSearchToggle: undefined,
15
- onNavigate: undefined
15
+ onNavigate: undefined,
16
+ isEditState: false,
17
+ onEditStateToggle: undefined
16
18
  });
17
19
  /**
18
20
  * @beta This component is not fully ready yet and may change in future releases.
package/dist/nav/nav.js CHANGED
@@ -13,6 +13,7 @@ const navMobileBar_1 = require("./navMobileBar/navMobileBar");
13
13
  const useMobile_1 = require("../commonHelpers/hooks/useMobile");
14
14
  const focusableSelector_1 = require("../utils/focusableSelector");
15
15
  const NavContent = ({ children }) => {
16
+ const { isEditState } = (0, nav_context_1.useNavContext)();
16
17
  const contentRef = (0, react_1.useRef)(null);
17
18
  const [hasScrollbar, setHasScrollbar] = (0, react_1.useState)(false);
18
19
  const [showTopShadow, setShowTopShadow] = (0, react_1.useState)(false);
@@ -43,8 +44,8 @@ const NavContent = ({ children }) => {
43
44
  }, [handleResize]);
44
45
  return (0, jsx_runtime_1.jsx)("div", { ref: contentRef, onScroll: handleScroll, className: (0, classNames_1.classNames)([
45
46
  "zen-nav__content",
46
- showTopShadow ? "zen-nav__content--show-top-shadow" : "",
47
- showBottomShadow ? "zen-nav__content--show-bottom-shadow" : "",
47
+ showTopShadow && !isEditState ? "zen-nav__content--show-top-shadow" : "",
48
+ showBottomShadow && !isEditState ? "zen-nav__content--show-bottom-shadow" : "",
48
49
  hasScrollbar ? "zen-nav__content--has-scrollbar" : "",
49
50
  hasOverlayScrollbar ? "zen-nav__content--overlay-scrollbar" : ""
50
51
  ]), children: (0, jsx_runtime_1.jsx)("div", { className: "zen-nav__content-inner", children: children }) });
@@ -56,6 +57,7 @@ const Nav = ({ children, className, collapsed = false, onCollapseToggle, onMenuV
56
57
  const [isMobileMenuOpen, setIsMobileMenuOpen] = (0, react_1.useState)(false);
57
58
  const menuRef = (0, react_1.useRef)(null);
58
59
  const [isSearchOpen, setIsSearchOpen] = (0, react_1.useState)(false);
60
+ const [isEditState, setIsEditState] = (0, react_1.useState)(false);
59
61
  const [searchTerm, setSearchTerm] = (0, react_1.useState)("");
60
62
  const isMobile = (0, useMobile_1.useMobile)();
61
63
  const prevIsMobileRef = (0, react_1.useRef)(false);
@@ -71,16 +73,18 @@ const Nav = ({ children, className, collapsed = false, onCollapseToggle, onMenuV
71
73
  }
72
74
  }, [isMobile, isMobileMenuOpen]);
73
75
  const childrenArray = react_1.Children.toArray(children);
74
- const header = childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavHeader"; });
76
+ const header = isEditState ? undefined : childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavHeader"; });
75
77
  const sections = childrenArray.filter(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavSection"; });
76
78
  const footer = childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavFooter"; });
79
+ const editFooter = childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.displayName) === "NavEditFooter"; });
77
80
  const secondarySections = sections.map(section => (0, navUtils_1.filterPrimaryNavItems)(section, true)).filter(section => !!section && react_1.Children.count(section.props.children) > 0);
78
81
  const primarySections = sections.map(section => (0, navUtils_1.filterPrimaryNavItems)(section, false)).filter(section => !!section && react_1.Children.count(section.props.children) > 0);
79
82
  const sectionsToRender = isMobile ? secondarySections : sections;
80
83
  const secondaryFooter = footer && (0, navUtils_1.filterPrimaryNavItems)(footer, true);
81
84
  const primaryFooter = footer && (0, navUtils_1.filterPrimaryNavItems)(footer, false);
82
- const footerToRender = isMobile ? secondaryFooter : footer;
85
+ const footerToRender = isEditState ? editFooter : (isMobile ? secondaryFooter : footer);
83
86
  const primaryItems = [...primarySections, ...(primaryFooter ? [primaryFooter] : [])].flatMap(e => (0, navUtils_1.collectNavItems)(e));
87
+ const editListItems = childrenArray.find(child => { var _a; return ((_a = child.type) === null || _a === void 0 ? void 0 : _a.name) === "NavEditSection"; });
84
88
  const onSearchOpen = (0, react_1.useCallback)((isOpen) => {
85
89
  isOpen && onCollapseToggle && onCollapseToggle(false);
86
90
  setIsSearchOpen(isOpen || isMobile);
@@ -88,6 +92,10 @@ const Nav = ({ children, className, collapsed = false, onCollapseToggle, onMenuV
88
92
  const onMobileMenuToggle = (0, react_1.useCallback)(() => {
89
93
  setIsMobileMenuOpen(!isMobileMenuOpen);
90
94
  }, [isMobileMenuOpen, setIsMobileMenuOpen]);
95
+ const onEditStateToggle = (0, react_1.useCallback)((isEdit) => {
96
+ isEdit && onCollapseToggle && onCollapseToggle(false);
97
+ editListItems && editFooter && setIsEditState(isEdit);
98
+ }, [onCollapseToggle, setIsEditState, editListItems, editFooter]);
91
99
  (0, react_1.useEffect)(() => {
92
100
  const wasMobile = prevIsMobileRef.current;
93
101
  prevIsMobileRef.current = isMobile;
@@ -122,14 +130,18 @@ const Nav = ({ children, className, collapsed = false, onCollapseToggle, onMenuV
122
130
  collapsed,
123
131
  onCollapseToggle,
124
132
  searchOpen: isSearchOpen,
133
+ isEditState: isEditState,
134
+ onEditStateToggle,
125
135
  onSearchToggle: onSearchOpen,
126
136
  searchTerm,
127
137
  onSearch: setSearchTerm,
128
138
  onNavigate: () => setIsMobileMenuOpen(false)
129
139
  }, children: [(!isMobile || isMobileMenuOpen)
130
- ? (0, jsx_runtime_1.jsxs)("div", { ref: menuRef, className: (0, classNames_1.classNames)(["zen-nav", isMobile ? "zen-nav--mobile" : "", collapsed ? "zen-nav--collapsed" : "", className || ""]), children: [header ? (0, react_1.cloneElement)(header, Object.assign(Object.assign({}, header.props), { className: (0, classNames_1.classNames)(["zen-nav__header", header.props.className || ""]) })) : null, (0, jsx_runtime_1.jsx)(NavContent, { children: sectionsToRender.map((section, index) => ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, react_1.cloneElement)(section, {
131
- className: (0, classNames_1.classNames)(["zen-nav__section", section.props.className || ""])
132
- }), isMobile || index < sectionsToRender.length - 1 ? (0, jsx_runtime_1.jsx)(navDivider_1.NavDivider, {}) : null] }, index))) }), footerToRender] })
133
- : null, mobileBarContainer && isMobile && (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)(navMobileBar_1.NavMobileBar, { onMenuToggle: onMobileMenuToggle, isMenuOpen: isMobileMenuOpen, children: primaryItems }), mobileBarContainer)] });
140
+ ? (0, jsx_runtime_1.jsxs)("div", { ref: menuRef, className: (0, classNames_1.classNames)(["zen-nav", isMobile ? "zen-nav--mobile" : "", collapsed ? "zen-nav--collapsed" : "", className || ""]), children: [header ? (0, react_1.cloneElement)(header, Object.assign(Object.assign({}, header.props), { className: (0, classNames_1.classNames)(["zen-nav__header", header.props.className || ""]) })) : null, (0, jsx_runtime_1.jsx)(NavContent, { children: isEditState
141
+ ? editListItems
142
+ : sectionsToRender.map((section, index) => ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, react_1.cloneElement)(section, {
143
+ className: (0, classNames_1.classNames)(["zen-nav__section", section.props.className || ""])
144
+ }), isMobile || index < sectionsToRender.length - 1 ? (0, jsx_runtime_1.jsx)(navDivider_1.NavDivider, {}) : null] }, index))) }), footerToRender] })
145
+ : null, mobileBarContainer && isMobile && (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)(navMobileBar_1.NavMobileBar, { onMenuToggle: onMobileMenuToggle, isMenuOpen: isMobileMenuOpen, children: editListItems ? editListItems : primaryItems }), mobileBarContainer)] });
134
146
  };
135
147
  exports.Nav = Nav;
@@ -0,0 +1,7 @@
1
+ import "./navEditList.less";
2
+ import { IZenComponentProps } from "../../commonHelpers/zenComponent";
3
+ export interface INavEditList extends IZenComponentProps {
4
+ onItemsChangeOrder?: (startPosition: number, endPosition: number) => void;
5
+ onBeforeItemDrag?: (position: number) => boolean;
6
+ }
7
+ export declare const NavEditList: ({ children, className, onItemsChangeOrder, onBeforeItemDrag }: INavEditList) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NavEditList = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const useDragAndDrop_1 = require("../../list/hooks/useDragAndDrop");
7
+ const classNames_1 = require("../../commonHelpers/classNames/classNames");
8
+ const navEditListUtils_1 = require("./navEditListUtils");
9
+ const marksClassNames = {
10
+ general: "zen-nav-edit-list__item",
11
+ placeholder: "zen-nav-edit-list__item--placeholder",
12
+ dragging: "zen-nav-edit-list__item--dragging",
13
+ dragged: "zen-nav-edit-list__item--dragged"
14
+ };
15
+ const NavEditList = ({ children, className, onItemsChangeOrder, onBeforeItemDrag }) => {
16
+ const appsListRef = (0, react_1.useRef)(null);
17
+ const dragHandler = onItemsChangeOrder ? onItemsChangeOrder : () => { };
18
+ const { onDragStart } = (0, useDragAndDrop_1.useDragAndDrop)(appsListRef, dragHandler, marksClassNames, onBeforeItemDrag);
19
+ const childrenArray = (0, react_1.useMemo)(() => onItemsChangeOrder ? react_1.Children.map(children, child => (0, navEditListUtils_1.attachDndHandler)(child, onDragStart)) : children, [children, onItemsChangeOrder, onDragStart]);
20
+ return (0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-nav-edit-list", className || ""]), ref: appsListRef, children: childrenArray });
21
+ };
22
+ exports.NavEditList = NavEditList;
@@ -0,0 +1,3 @@
1
+ import { PointerEvent, ReactElement } from "react";
2
+ import { INavActionItem } from "../navItem/navActionItem";
3
+ export declare const attachDndHandler: (item: ReactElement<INavActionItem>, onPointerDown: (e: PointerEvent<HTMLElement>) => void) => ReactElement<INavActionItem, string | import("react").JSXElementConstructor<any>>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.attachDndHandler = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const navActionItem_1 = require("../navItem/navActionItem");
7
+ const iconGrab_1 = require("../../icons/iconGrab");
8
+ const attachDndHandler = (item, onPointerDown) => {
9
+ if (item.type === navActionItem_1.NavActionItem) {
10
+ return (0, react_1.cloneElement)(item, Object.assign(Object.assign({}, item.props), { startNode: (0, jsx_runtime_1.jsx)("div", { className: "zen-nav-item__dnd", onPointerDown: onPointerDown, children: (0, jsx_runtime_1.jsx)(iconGrab_1.IconGrab, { size: "large" }) }) }));
11
+ }
12
+ return item;
13
+ };
14
+ exports.attachDndHandler = attachDndHandler;
@@ -0,0 +1,3 @@
1
+ import "./navEditSection.less";
2
+ import { IZenComponentProps } from "../../commonHelpers/zenComponent";
3
+ export declare const NavEditSection: ({ children, className }: IZenComponentProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NavEditSection = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const classNames_1 = require("../../commonHelpers/classNames/classNames");
6
+ const NavEditSection = ({ children, className }) => (0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-nav-edit-section", className || ""]), children: children });
7
+ exports.NavEditSection = NavEditSection;
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import "./navEditFooter.less";
3
+ import { IZenComponentProps } from "../../../commonHelpers/zenComponent";
4
+ /**
5
+ * @beta This component is not fully ready yet and may change in future releases.
6
+ */
7
+ export interface INavEditFooter extends IZenComponentProps {
8
+ handleSaveClick: () => void;
9
+ handleCancelClick: () => void;
10
+ }
11
+ export declare const NavEditFooter: React.FC<INavEditFooter>;