@gravity-ui/navigation 6.1.2 → 6.3.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.
@@ -0,0 +1,82 @@
1
+ # MobileHeader
2
+
3
+ Header for Mobile navigation. MobileHeader provides maintaining Panels except for Modals.
4
+
5
+ Includes auxiliary `MobileHeaderFooterItem` component.
6
+
7
+ ## Properties
8
+
9
+ | Name | Description | Type |
10
+ | :-------------------- | :-------------------------------------------------------------- | :--------------------------------------------------------- |
11
+ | logo | Service logo properties | `LogoProps` |
12
+ | burgerMenu | Burger menu properties | `BurgerMenuProps` |
13
+ | overlapPanel | Overlap panel properties | `OverlapPanelProps` |
14
+ | burgerCloseTitle | Burger close button title (a11y) | `string` |
15
+ | burgerOpenTitle | Burger open button title (a11y) | `string` |
16
+ | panelItems | Custom panels rendered in the header | `PanelItemProps[]` |
17
+ | topAlert | Top alert properties | `TopAlertProps` |
18
+ | renderContent | Render function for the header content | `RenderContentType` |
19
+ | sideItemRenderContent | Render function for the side item content | `RenderContentType` |
20
+ | onEvent | Inner event handler — receives the item name and the event name | `(itemName: string, eventName: MobileHeaderEvent) => void` |
21
+ | onClosePanel | Close panel handler | `() => void` |
22
+ | className | Header class name | `string` |
23
+ | contentClassName | Header content class name | `string` |
24
+
25
+ ### Usage
26
+
27
+ See storybook example `src/components/MobileHeader/__stories__/MobileHeaderShowcase`.
28
+
29
+ #### onEvent prop
30
+
31
+ [onEvent](https://github.com/gravity-ui/navigation/blob/32c6a6f58e0307745e92b041b3d96517e57589c1/src/components/MobileHeader/MobileHeader.tsx#L41) handles MobileHeader inner events.
32
+
33
+ **Custom events**
34
+
35
+ You can initiate the event via `CustomEvent`. Support values:
36
+
37
+ - `MOBILE_PANEL_TOGGLE`
38
+ - `MOBILE_PANEL_OPEN`
39
+ - `MOBILE_PANEL_CLOSE`
40
+ - `MOBILE_BURGER_OPEN`
41
+ - `MOBILE_BURGER_CLOSE`
42
+
43
+ Panel events in constant [MOBILE_HEADER_EVENT_NAMES](https://github.com/gravity-ui/navigation/blob/main/src/components/MobileHeader/constants.ts#L8-L12)
44
+
45
+ ##### Examples
46
+
47
+ **Simple event, open burger**
48
+
49
+ ```js
50
+ const customEvent = new CustomEvent('MOBILE_BURGER_OPEN');
51
+ const navRef = React.useRef < HTMLDivElement > null;
52
+ navRef?.current?.dispatchEvent(customEvent);
53
+ ```
54
+
55
+ **Panel event, open custom panel**
56
+
57
+ ```js
58
+ import {getMobileHeaderCustomEvent, MOBILE_HEADER_EVENT_NAMES} from '@gravity-ui/navigation';
59
+
60
+ const customEvent = getMobileHeaderCustomEvent(MOBILE_HEADER_EVENT_NAMES.closeEvent, {
61
+ panelName: 'user',
62
+ });
63
+
64
+ const navRef = React.useRef < HTMLDivElement > null;
65
+ navRef?.current?.dispatchEvent(customEvent);
66
+
67
+ const customEvent2 = getMobileHeaderCustomEvent('MOBILE_PANEL_TOGGLE', {panelName: 'user'});
68
+ navRef?.current?.dispatchEvent(customEvent2);
69
+ ```
70
+
71
+ Available panelName
72
+
73
+ 1. 'burger'
74
+ 2. `id` of element [panelItems prop](https://github.com/gravity-ui/navigation/blob/main/src/components/MobileHeader/MobileHeader.tsx#L38C5-L38C15)
75
+
76
+ ## MobileHeader vars
77
+
78
+ | Name | Description | Default |
79
+ | :--------------------------------- | :--------------------------------------------- | :-----: |
80
+ | z-indexes | | |
81
+ | `--gn-mobile-header-z-index` | Mobile header z-index | `100` |
82
+ | `--gn-mobile-header-panel-z-index` | Mobile header panel (Drawer component) z-index | `98` |
@@ -0,0 +1,113 @@
1
+ # Settings
2
+
3
+ The Settings component provides the layout for a settings panel with the following features.
4
+
5
+ - single-level and two-level grouping of items
6
+ - filtering of the panel's content by headers of items
7
+ - displaying of loading status and content
8
+
9
+ ## Usage
10
+
11
+ One-level settings example:
12
+
13
+ ```tsx
14
+ <Settings>
15
+ <Settings.Page title="Appearance">...</Settings.Page>
16
+ <Settings.Page title="Notifications">...</Settings.Page>
17
+ </Settings>
18
+ ```
19
+
20
+ Two-level settings example:
21
+ _Note:_ `Settings` with `view=mobile` groups `Settings.Group` are ignored.
22
+
23
+ ```tsx
24
+ <Settings>
25
+ <Settings.Group groupTitle="My service">
26
+ <Settings.Page title="Appearance">...</Settings.Page>
27
+ <Settings.Page title="Notifications">...</Settings.Page>
28
+ </Settings.Group>
29
+ <Settings.Group groupTitle="General">
30
+ <Settings.Page title="Appearance">...</Settings.Page>
31
+ <Settings.Page title="Notifications">...</Settings.Page>
32
+ </Settings.Group>
33
+ </Settings>
34
+ ```
35
+
36
+ Pages with sections example:
37
+
38
+ ```tsx
39
+ <Settings.Page title="Features" icon={'...'}>
40
+ <Settings.Section title="Common">
41
+ <Settings.Item title="Default VCS">...</Settings.Item>
42
+ <Settings.Item title="Search root">...</Settings.Item>
43
+ </Settings.Section>
44
+ <Settings.Section title="Beta functionality">...</Settings.Section>
45
+ </Settings.Page>
46
+ ```
47
+
48
+ ## Properties
49
+
50
+ | Name | Description | Type | Default |
51
+ | :----------------------------- | :------------------------------------------------------------ | :--------------------------- | :----------------- |
52
+ | loading | Flag of loading status | `boolean` | |
53
+ | renderLoading | content for loading status | `() => React.ReactNode` | |
54
+ | renderNotFound | Empty panel content | `() => React.ReactNode` | |
55
+ | initialPage | Inititial page in `/groupId/pageId` format | `string` | |
56
+ | view | Change view for Mobile | `"normal"`, `"mobile"` | `"normal"` |
57
+ | onPageChange | Page change handler | `(newPage?: string) => void` | |
58
+ | onClose | Settings close handler | `() => void` | |
59
+ | title | Page title | `string` | 'Settings' |
60
+ | filterPlaceholder | Filter placeholder text | `string` | 'Search settings' |
61
+ | emptyPlaceholder | Filter empty text | `string` | 'No results found' |
62
+ | enableMobileSettingsTabsScroll | In mobile view tabs will overflow with scroll instead of wrap | `boolean` | |
63
+
64
+ ## Settings.Group
65
+
66
+ Optional level for organizing related pages, e.g. "General" vs "Application specific".
67
+
68
+ ### Properties
69
+
70
+ | Name | Description | Type | Default |
71
+ | :--------- | :----------------- | :------- | :------ |
72
+ | id | Unique id of group | `string` | |
73
+ | groupTitle | Header of group | `string` | |
74
+
75
+ ## Settings.Page
76
+
77
+ Collection of related settings sections, e.g. "Appearance" in General group.
78
+
79
+ ### Properties
80
+
81
+ | Name | Description | Type | Default |
82
+ | :---- | :--------------------------- | :------------------------------------------------------------------------------------------ | :------ |
83
+ | id | Unique id of page in a group | `string` | |
84
+ | title | Title of page | `string` | |
85
+ | icon | Properties of icon of page | [`IconProps`](https://github.com/gravity-ui/uikit/tree/main/src/components/Icon#properties) | |
86
+
87
+ ## Settings.Section
88
+
89
+ Category of related settings, e.g. "Theme settings" in Appearance page.
90
+
91
+ ### Properties
92
+
93
+ | Name | Description | Type | Default |
94
+ | :-------- | :---------------------------------------------------------------------------- | :---------------- | :------ |
95
+ | title | Title of section | `string` | |
96
+ | header | Header of section | `React.ReactNode` | |
97
+ | withBadge | Show badge on a section and menu | `boolean` | |
98
+ | hideTitle | Hide section title. Prop is needed to hide title in simple settings on Mobile | `boolean` | |
99
+
100
+ ## Settings.Item
101
+
102
+ Individual setting with a title and control component.
103
+ ⚠️ In case with only one `Settings.Item` in `Settings.Section` the title is not shown.
104
+
105
+ ### Properties
106
+
107
+ | Name | Description | Type | Default |
108
+ | :------------------- | :--------------------------------------------------------- | :-------------------------------------------------------- | :--------- |
109
+ | title | Title of item | `string` | |
110
+ | renderTitleComponent | Cusomt header of | `(highlightedTitle?: React.ReactNode) => React.ReactNode` |
111
+ | align | Item alignment | `"top"`, `"center"` | `"center"` |
112
+ | mode | Layout for mobile. Title and control will be placed in row | `"row"` | |
113
+ | description | Description of item | `React.ReactNode` | |
@@ -0,0 +1,16 @@
1
+ # useOverflowingHorizontalListItems
2
+
3
+ A hook for determining which horizontal list items stay visible and which collapse into an overflow "more" dropdown.
4
+
5
+ ```tsx
6
+ import {useOverflowingHorizontalListItems} from '@gravity-ui/navigation';
7
+ ```
8
+
9
+ ## Properties
10
+
11
+ | Property | Type | Required | Default | Description |
12
+ | :-------------- | :----------------------- | :------: | :------ | :----------------------- |
13
+ | containerRef | `RefObject<HTMLElement>` | | | List container ref |
14
+ | items | `Array` | | | List items |
15
+ | itemSelector | `String` | | | List item selector |
16
+ | moreButtonWidth | `Number` | | | The width of more button |
@@ -15,7 +15,7 @@ import { Panels } from './Panels.js';
15
15
 
16
16
  const MENU_ITEMS_COMPOSITE_ID = 'gravity-ui/navigation-menu-items-composite-bar';
17
17
  const FirstPanel = React__default.forwardRef((_props, ref) => {
18
- const { size, onItemClick, headerDecoration, menuMoreTitle, onMenuMoreClick, renderFooter, compact, customBackground, customBackgroundClassName, className, hideCollapseButton, menuGroups, menuOverflow, collapsedMenuGroupIds, defaultCollapsedMenuGroupIds, onToggleMenuGroupCollapsed, qa, } = useAsideHeaderInnerContext();
18
+ const { size, onItemClick, headerDecoration, menuMoreTitle, onMenuMoreClick, renderFooter, compact, customBackground, customBackgroundClassName, className, hideCollapseButton, menuGroups, menuOverflow, collapsedMenuGroupIds, defaultCollapsedMenuGroupIds, onToggleMenuGroupCollapsed, aboveMenuContent, qa, } = useAsideHeaderInnerContext();
19
19
  const visibleMenuItems = useVisibleMenuItems();
20
20
  const asideRef = useRef(null);
21
21
  React__default.useEffect(() => {
@@ -27,6 +27,7 @@ const FirstPanel = React__default.forwardRef((_props, ref) => {
27
27
  customBackground && (React__default.createElement("div", { className: b('aside-custom-background', customBackgroundClassName) }, customBackground)),
28
28
  React__default.createElement("div", { className: b('aside-content', { ['with-decoration']: headerDecoration }) },
29
29
  React__default.createElement(Header, null),
30
+ aboveMenuContent,
30
31
  (visibleMenuItems === null || visibleMenuItems === undefined ? undefined : visibleMenuItems.length) ? (React__default.createElement(CompositeBar, { menuItemClassName: b('menu-item'), compositeId: MENU_ITEMS_COMPOSITE_ID, type: "menu", compact: compact, items: visibleMenuItems, menuGroups: menuGroups, menuMoreTitle: menuMoreTitle !== null && menuMoreTitle !== undefined ? menuMoreTitle : i18n('label_more'), onItemClick: onItemClick, onMoreClick: onMenuMoreClick, menuOverflow: menuOverflow, collapsedMenuGroupIds: collapsedMenuGroupIds, defaultCollapsedMenuGroupIds: defaultCollapsedMenuGroupIds, onToggleMenuGroupCollapsed: onToggleMenuGroupCollapsed })) : (React__default.createElement("div", { className: b('menu-items') })),
31
32
  React__default.createElement("div", { className: b('footer') }, renderFooter === null || renderFooter === undefined ? undefined : renderFooter({
32
33
  size,
@@ -1 +1 @@
1
- {"version":3,"file":"FirstPanel.js","sources":["../../../../../../src/components/AsideHeader/components/FirstPanel.tsx"],"sourcesContent":["import React, {useRef} from 'react';\n\nimport {setRef} from '@gravity-ui/uikit';\n\nimport {useAsideHeaderInnerContext} from '../AsideHeaderContext';\nimport i18n from '../i18n';\nimport {b} from '../utils';\n\nimport {useVisibleMenuItems} from './AllPagesPanel';\nimport {CollapseButton} from './CollapseButton/CollapseButton';\nimport {CompositeBar} from './CompositeBar';\nimport {Header} from './Header';\nimport {Panels} from './Panels';\n\nconst MENU_ITEMS_COMPOSITE_ID = 'gravity-ui/navigation-menu-items-composite-bar';\n\nexport const FirstPanel = React.forwardRef<HTMLDivElement>((_props, ref) => {\n const {\n size,\n onItemClick,\n headerDecoration,\n menuMoreTitle,\n onMenuMoreClick,\n renderFooter,\n compact,\n customBackground,\n customBackgroundClassName,\n className,\n hideCollapseButton,\n menuGroups,\n menuOverflow,\n collapsedMenuGroupIds,\n defaultCollapsedMenuGroupIds,\n onToggleMenuGroupCollapsed,\n qa,\n } = useAsideHeaderInnerContext();\n const visibleMenuItems = useVisibleMenuItems();\n\n const asideRef = useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n setRef<HTMLDivElement>(ref, asideRef.current);\n }, [ref]);\n\n return (\n <React.Fragment>\n <div\n className={b(\n 'aside',\n {'menu-overflow-scroll': menuOverflow === 'scroll' && !compact},\n className,\n )}\n style={{width: size}}\n data-qa={qa}\n >\n <div className={b('aside-popup-anchor')} ref={asideRef} />\n {customBackground && (\n <div className={b('aside-custom-background', customBackgroundClassName)}>\n {customBackground}\n </div>\n )}\n\n <div className={b('aside-content', {['with-decoration']: headerDecoration})}>\n <Header />\n {visibleMenuItems?.length ? (\n <CompositeBar\n menuItemClassName={b('menu-item')}\n compositeId={MENU_ITEMS_COMPOSITE_ID}\n type=\"menu\"\n compact={compact}\n items={visibleMenuItems}\n menuGroups={menuGroups}\n menuMoreTitle={menuMoreTitle ?? i18n('label_more')}\n onItemClick={onItemClick}\n onMoreClick={onMenuMoreClick}\n menuOverflow={menuOverflow}\n collapsedMenuGroupIds={collapsedMenuGroupIds}\n defaultCollapsedMenuGroupIds={defaultCollapsedMenuGroupIds}\n onToggleMenuGroupCollapsed={onToggleMenuGroupCollapsed}\n />\n ) : (\n <div className={b('menu-items')} />\n )}\n <div className={b('footer')}>\n {renderFooter?.({\n size,\n compact: Boolean(compact),\n asideRef,\n })}\n </div>\n {!hideCollapseButton && <CollapseButton />}\n </div>\n </div>\n <Panels />\n </React.Fragment>\n );\n});\n\nFirstPanel.displayName = 'FirstPanel';\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"FirstPanel.js","sources":["../../../../../../src/components/AsideHeader/components/FirstPanel.tsx"],"sourcesContent":["import React, {useRef} from 'react';\n\nimport {setRef} from '@gravity-ui/uikit';\n\nimport {useAsideHeaderInnerContext} from '../AsideHeaderContext';\nimport i18n from '../i18n';\nimport {b} from '../utils';\n\nimport {useVisibleMenuItems} from './AllPagesPanel';\nimport {CollapseButton} from './CollapseButton/CollapseButton';\nimport {CompositeBar} from './CompositeBar';\nimport {Header} from './Header';\nimport {Panels} from './Panels';\n\nconst MENU_ITEMS_COMPOSITE_ID = 'gravity-ui/navigation-menu-items-composite-bar';\n\nexport const FirstPanel = React.forwardRef<HTMLDivElement>((_props, ref) => {\n const {\n size,\n onItemClick,\n headerDecoration,\n menuMoreTitle,\n onMenuMoreClick,\n renderFooter,\n compact,\n customBackground,\n customBackgroundClassName,\n className,\n hideCollapseButton,\n menuGroups,\n menuOverflow,\n collapsedMenuGroupIds,\n defaultCollapsedMenuGroupIds,\n onToggleMenuGroupCollapsed,\n aboveMenuContent,\n qa,\n } = useAsideHeaderInnerContext();\n const visibleMenuItems = useVisibleMenuItems();\n\n const asideRef = useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n setRef<HTMLDivElement>(ref, asideRef.current);\n }, [ref]);\n\n return (\n <React.Fragment>\n <div\n className={b(\n 'aside',\n {'menu-overflow-scroll': menuOverflow === 'scroll' && !compact},\n className,\n )}\n style={{width: size}}\n data-qa={qa}\n >\n <div className={b('aside-popup-anchor')} ref={asideRef} />\n {customBackground && (\n <div className={b('aside-custom-background', customBackgroundClassName)}>\n {customBackground}\n </div>\n )}\n\n <div className={b('aside-content', {['with-decoration']: headerDecoration})}>\n <Header />\n {aboveMenuContent}\n {visibleMenuItems?.length ? (\n <CompositeBar\n menuItemClassName={b('menu-item')}\n compositeId={MENU_ITEMS_COMPOSITE_ID}\n type=\"menu\"\n compact={compact}\n items={visibleMenuItems}\n menuGroups={menuGroups}\n menuMoreTitle={menuMoreTitle ?? i18n('label_more')}\n onItemClick={onItemClick}\n onMoreClick={onMenuMoreClick}\n menuOverflow={menuOverflow}\n collapsedMenuGroupIds={collapsedMenuGroupIds}\n defaultCollapsedMenuGroupIds={defaultCollapsedMenuGroupIds}\n onToggleMenuGroupCollapsed={onToggleMenuGroupCollapsed}\n />\n ) : (\n <div className={b('menu-items')} />\n )}\n <div className={b('footer')}>\n {renderFooter?.({\n size,\n compact: Boolean(compact),\n asideRef,\n })}\n </div>\n {!hideCollapseButton && <CollapseButton />}\n </div>\n </div>\n <Panels />\n </React.Fragment>\n );\n});\n\nFirstPanel.displayName = 'FirstPanel';\n"],"names":["React"],"mappings":"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"}
@@ -63,6 +63,7 @@ interface AsideHeaderGeneralProps extends QAProps {
63
63
  onMenuMoreClick?: () => void;
64
64
  onAllPagesClick?: () => void;
65
65
  openModalSubscriber?: (subscriber: OpenModalSubscriber) => void;
66
+ aboveMenuContent?: React.ReactNode;
66
67
  }
67
68
  interface AsideHeaderDefaultProps {
68
69
  panelItems?: PanelItemProps[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../../src/components/AsideHeader/types.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {DrawerProps, PopupProps, QAProps} from '@gravity-ui/uikit';\n\nimport {RenderContentType} from '../Content';\nimport {LogoProps, MenuGroup, MenuItem, OpenModalSubscriber, TopAlertProps} from '../types';\n\nimport {AsideHeaderContextType} from './AsideHeaderContext';\n\nexport interface PanelItemProps extends DrawerProps {\n id: string;\n}\n\nexport interface LayoutProps {\n compact: boolean;\n className?: string;\n topAlert?: TopAlertProps;\n}\n\ninterface EditMenuProps {\n onOpenEditMode?: () => void;\n onToggleMenuItem?: (changedItem: AsideHeaderItem) => void;\n onResetSettingsToDefault?: () => void;\n enableSorting?: boolean;\n onChangeItemsOrder?: (changedItem: AsideHeaderItem, oldIndex: number, newIndex: number) => void;\n /**\n * Fired when visibility of a menu group is toggled from the All pages panel (pin on group header).\n * Use with `onMenuGroupsChanged` / controlled `menuGroups`.\n */\n onToggleMenuGroup?: (changedGroup: MenuGroup) => void;\n}\n\n/**\n * Menu overflow behavior.\n * - `collapse` — extra items collapse under a \"More\" popup (default).\n * - `scroll` — all items remain visible inside a scrollable container with a native thin scrollbar.\n *\n * In compact mode the menu always falls back to `collapse` regardless of this value\n * because a scrollbar over icon-only items is awkward.\n */\nexport type AsideHeaderMenuOverflow = 'collapse' | 'scroll';\n\ninterface AsideHeaderGeneralProps extends QAProps {\n logo?: LogoProps;\n className?: string;\n collapseTitle?: string;\n expandTitle?: string;\n menuMoreTitle?: string;\n /**\n * @see AsideHeaderMenuOverflow\n * @default 'collapse'\n */\n menuOverflow?: AsideHeaderMenuOverflow;\n topAlert?: TopAlertProps;\n customBackground?: React.ReactNode;\n customBackgroundClassName?: string;\n hideCollapseButton?: boolean;\n renderContent?: RenderContentType;\n renderFooter?: (data: {\n size: number;\n compact: boolean;\n asideRef: React.RefObject<HTMLDivElement>;\n }) => React.ReactNode;\n collapseButtonWrapper?: (\n defaultButton: React.ReactNode,\n data: {\n compact: boolean;\n onChangeCompact?: (compact: boolean) => void;\n },\n ) => React.ReactNode;\n editMenuProps?: EditMenuProps;\n onClosePanel?: () => void;\n onChangeCompact?: (compact: boolean) => void;\n onMenuMoreClick?: () => void;\n onAllPagesClick?: () => void;\n openModalSubscriber?: (subscriber: OpenModalSubscriber) => void;\n}\n\ninterface AsideHeaderDefaultProps {\n panelItems?: PanelItemProps[];\n subheaderItems?: AsideHeaderItem[];\n menuItems?: AsideHeaderItem[];\n menuGroups?: MenuGroup[];\n /**\n * Called only from **All pages** edit mode when the user toggles visibility of a **menu group** (group header pin), updating `menuGroup.hidden`.\n * Use with controlled `menuGroups`; not emitted for programmatic `menuGroups` changes outside All pages.\n */\n onMenuGroupsChanged?: (menuGroups: MenuGroup[]) => void;\n defaultMenuItems?: AsideHeaderItem[];\n onMenuItemsChanged?: (items: AsideHeaderItem[]) => void;\n headerDecoration?: boolean;\n /**\n * When provided, the map is the source of truth for which menu groups are collapsed\n * in inline (`menuOverflow: 'scroll'`) layout. Keys are `MenuGroup.id`, values mean collapsed.\n */\n collapsedMenuGroupIds?: Record<string, boolean>;\n /**\n * Initial collapsed state for groups when `collapsedMenuGroupIds` is not controlled.\n */\n defaultCollapsedMenuGroupIds?: Record<string, boolean>;\n /**\n * Called when the user toggles a group in inline layout. The parent should update\n * `collapsedMenuGroupIds` when using controlled mode.\n */\n onToggleMenuGroupCollapsed?: (groupId: string) => void;\n}\n\nexport type AsideHeaderInnerProps = AsideHeaderGeneralProps &\n AsideHeaderDefaultProps &\n AsideHeaderContextType;\n\nexport interface AsideHeaderProps\n extends AsideHeaderGeneralProps,\n LayoutProps,\n Partial<AsideHeaderDefaultProps> {}\n\nexport enum InnerPanels {\n AllPages = 'all-pages',\n}\n\n/** Menu item id for the All pages row (same value as {@link InnerPanels.AllPages}). */\nexport const ALL_PAGES_ID = InnerPanels.AllPages;\n\nexport interface AsideHeaderItem extends MenuItem {\n /**\n * @internal CompositeBar: group children rendered from the \"More\" overflow popover.\n */\n compositeBarMenuPopupItems?: AsideHeaderItem[];\n /**\n * @internal CompositeBar: optional heading in the overflow popover for a group row.\n */\n compositeBarMenuPopupTitle?: string;\n enableTooltip?: boolean;\n onItemClick?: (\n item: AsideHeaderItem,\n collapsed: boolean,\n event: React.MouseEvent<HTMLElement, MouseEvent>,\n ) => void;\n bringForward?: boolean;\n compact?: boolean;\n\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupVisible?: PopupProps['open'];\n /**\n * Floating element anchor ref object\n *\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupRef?: React.RefObject<HTMLElement>;\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupPlacement?: PopupProps['placement'];\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupOffset?: PopupProps['offset'];\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupKeepMounted?: PopupProps['keepMounted'];\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n renderPopupContent?: () => React.ReactNode;\n /**\n * This callback will be called when Escape key pressed on keyboard, or click outside was made\n * This behaviour could be disabled with `disableEscapeKeyDown`\n * and `disableOutsideClick` options\n *\n * @deprecated Use itemWrapper instead for popup functionality\n */\n onOpenChangePopup?: PopupProps['onOpenChange'];\n}\n"],"names":[],"mappings":"IAoHY;AAAZ,CAAA,UAAY,WAAW,EAAA;AACnB,IAAA,WAAA,CAAA,UAAA,CAAA,GAAA,WAAsB;AAC1B,CAAC,EAFW,WAAW,KAAX,WAAW,GAEtB,EAAA,CAAA,CAAA;AAED;AACa,MAAA,YAAY,GAAG,WAAW,CAAC;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../../src/components/AsideHeader/types.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {DrawerProps, PopupProps, QAProps} from '@gravity-ui/uikit';\n\nimport {RenderContentType} from '../Content';\nimport {LogoProps, MenuGroup, MenuItem, OpenModalSubscriber, TopAlertProps} from '../types';\n\nimport {AsideHeaderContextType} from './AsideHeaderContext';\n\nexport interface PanelItemProps extends DrawerProps {\n id: string;\n}\n\nexport interface LayoutProps {\n compact: boolean;\n className?: string;\n topAlert?: TopAlertProps;\n}\n\ninterface EditMenuProps {\n onOpenEditMode?: () => void;\n onToggleMenuItem?: (changedItem: AsideHeaderItem) => void;\n onResetSettingsToDefault?: () => void;\n enableSorting?: boolean;\n onChangeItemsOrder?: (changedItem: AsideHeaderItem, oldIndex: number, newIndex: number) => void;\n /**\n * Fired when visibility of a menu group is toggled from the All pages panel (pin on group header).\n * Use with `onMenuGroupsChanged` / controlled `menuGroups`.\n */\n onToggleMenuGroup?: (changedGroup: MenuGroup) => void;\n}\n\n/**\n * Menu overflow behavior.\n * - `collapse` — extra items collapse under a \"More\" popup (default).\n * - `scroll` — all items remain visible inside a scrollable container with a native thin scrollbar.\n *\n * In compact mode the menu always falls back to `collapse` regardless of this value\n * because a scrollbar over icon-only items is awkward.\n */\nexport type AsideHeaderMenuOverflow = 'collapse' | 'scroll';\n\ninterface AsideHeaderGeneralProps extends QAProps {\n logo?: LogoProps;\n className?: string;\n collapseTitle?: string;\n expandTitle?: string;\n menuMoreTitle?: string;\n /**\n * @see AsideHeaderMenuOverflow\n * @default 'collapse'\n */\n menuOverflow?: AsideHeaderMenuOverflow;\n topAlert?: TopAlertProps;\n customBackground?: React.ReactNode;\n customBackgroundClassName?: string;\n hideCollapseButton?: boolean;\n renderContent?: RenderContentType;\n renderFooter?: (data: {\n size: number;\n compact: boolean;\n asideRef: React.RefObject<HTMLDivElement>;\n }) => React.ReactNode;\n collapseButtonWrapper?: (\n defaultButton: React.ReactNode,\n data: {\n compact: boolean;\n onChangeCompact?: (compact: boolean) => void;\n },\n ) => React.ReactNode;\n editMenuProps?: EditMenuProps;\n onClosePanel?: () => void;\n onChangeCompact?: (compact: boolean) => void;\n onMenuMoreClick?: () => void;\n onAllPagesClick?: () => void;\n openModalSubscriber?: (subscriber: OpenModalSubscriber) => void;\n aboveMenuContent?: React.ReactNode;\n}\n\ninterface AsideHeaderDefaultProps {\n panelItems?: PanelItemProps[];\n subheaderItems?: AsideHeaderItem[];\n menuItems?: AsideHeaderItem[];\n menuGroups?: MenuGroup[];\n /**\n * Called only from **All pages** edit mode when the user toggles visibility of a **menu group** (group header pin), updating `menuGroup.hidden`.\n * Use with controlled `menuGroups`; not emitted for programmatic `menuGroups` changes outside All pages.\n */\n onMenuGroupsChanged?: (menuGroups: MenuGroup[]) => void;\n defaultMenuItems?: AsideHeaderItem[];\n onMenuItemsChanged?: (items: AsideHeaderItem[]) => void;\n headerDecoration?: boolean;\n /**\n * When provided, the map is the source of truth for which menu groups are collapsed\n * in inline (`menuOverflow: 'scroll'`) layout. Keys are `MenuGroup.id`, values mean collapsed.\n */\n collapsedMenuGroupIds?: Record<string, boolean>;\n /**\n * Initial collapsed state for groups when `collapsedMenuGroupIds` is not controlled.\n */\n defaultCollapsedMenuGroupIds?: Record<string, boolean>;\n /**\n * Called when the user toggles a group in inline layout. The parent should update\n * `collapsedMenuGroupIds` when using controlled mode.\n */\n onToggleMenuGroupCollapsed?: (groupId: string) => void;\n}\n\nexport type AsideHeaderInnerProps = AsideHeaderGeneralProps &\n AsideHeaderDefaultProps &\n AsideHeaderContextType;\n\nexport interface AsideHeaderProps\n extends AsideHeaderGeneralProps,\n LayoutProps,\n Partial<AsideHeaderDefaultProps> {}\n\nexport enum InnerPanels {\n AllPages = 'all-pages',\n}\n\n/** Menu item id for the All pages row (same value as {@link InnerPanels.AllPages}). */\nexport const ALL_PAGES_ID = InnerPanels.AllPages;\n\nexport interface AsideHeaderItem extends MenuItem {\n /**\n * @internal CompositeBar: group children rendered from the \"More\" overflow popover.\n */\n compositeBarMenuPopupItems?: AsideHeaderItem[];\n /**\n * @internal CompositeBar: optional heading in the overflow popover for a group row.\n */\n compositeBarMenuPopupTitle?: string;\n enableTooltip?: boolean;\n onItemClick?: (\n item: AsideHeaderItem,\n collapsed: boolean,\n event: React.MouseEvent<HTMLElement, MouseEvent>,\n ) => void;\n bringForward?: boolean;\n compact?: boolean;\n\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupVisible?: PopupProps['open'];\n /**\n * Floating element anchor ref object\n *\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupRef?: React.RefObject<HTMLElement>;\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupPlacement?: PopupProps['placement'];\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupOffset?: PopupProps['offset'];\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n popupKeepMounted?: PopupProps['keepMounted'];\n /**\n * @deprecated Use itemWrapper instead for popup functionality\n */\n renderPopupContent?: () => React.ReactNode;\n /**\n * This callback will be called when Escape key pressed on keyboard, or click outside was made\n * This behaviour could be disabled with `disableEscapeKeyDown`\n * and `disableOutsideClick` options\n *\n * @deprecated Use itemWrapper instead for popup functionality\n */\n onOpenChangePopup?: PopupProps['onOpenChange'];\n}\n"],"names":[],"mappings":"IAqHY;AAAZ,CAAA,UAAY,WAAW,EAAA;AACnB,IAAA,WAAA,CAAA,UAAA,CAAA,GAAA,WAAsB;AAC1B,CAAC,EAFW,WAAW,KAAX,WAAW,GAEtB,EAAA,CAAA,CAAA;AAED;AACa,MAAA,YAAY,GAAG,WAAW,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/navigation",
3
- "version": "6.1.2",
3
+ "version": "6.3.0",
4
4
  "description": "Gravity UI Navigation components",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -32,6 +32,7 @@
32
32
  "test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --passWithNoTests",
33
33
  "test-storybook": "test-storybook --url ${PR_PREVIEW_URL:-http://localhost:7008}",
34
34
  "build": "rimraf build && rollup -c",
35
+ "build:docs": "node scripts/build-docs.js",
35
36
  "lint:js": "eslint src --ext .js,.jsx,.ts,.tsx",
36
37
  "lint:styles": "stylelint '{styles,src}/**/*.scss'",
37
38
  "lint:prettier": "prettier --check '**/*.md'",
@@ -39,7 +40,7 @@
39
40
  "packages:check": "knip",
40
41
  "build-storybook": "storybook build",
41
42
  "start": "cross-env TS_NODE_PROJECT=.storybook/tsconfig.json storybook dev -p 7008",
42
- "prepublishOnly": "npm run build",
43
+ "prepublishOnly": "npm run build && npm run build:docs",
43
44
  "playwright:install": "playwright install --with-deps",
44
45
  "playwright": "playwright test --config=playwright/playwright.config.ts",
45
46
  "playwright:update": "npm run playwright -- -u",
@@ -67,6 +68,7 @@
67
68
  "@commitlint/config-conventional": "^19.6.0",
68
69
  "@doc-tools/transform": "^3.11.0",
69
70
  "@gravity-ui/eslint-config": "^3.3.0",
71
+ "@gravity-ui/gulp-utils": "^1.1.1",
70
72
  "@gravity-ui/icons": "^2.8.1",
71
73
  "@gravity-ui/prettier-config": "^1.0.0",
72
74
  "@gravity-ui/stylelint-config": "^4.0.1",