@skbkontur/side-menu 4.0.6 → 4.0.8
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.
- package/CHANGELOG.md +19 -0
- package/README.md +12 -12
- package/package.json +4 -4
- package/src/SideMenu/SideMenu.d.ts +30 -9
- package/src/SideMenuDropdown/SideMenuDropdown.d.ts +2 -0
- package/src/SideMenuHeader/SideMenuHeader.d.ts +1 -0
- package/src/SideMenuItem/SideMenuItem.d.ts +1 -0
- package/src/SideMenuLink/SideMenuLink.d.ts +2 -0
- package/src/internal/ClickableElement.d.ts +9 -1
- package/src/internal/SideMenuLogotype.js +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [4.0.8](/compare/@skbkontur/side-menu@4.0.7...@skbkontur/side-menu@4.0.8) (2026-07-10)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @skbkontur/side-menu
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [4.0.7](/compare/@skbkontur/side-menu@4.0.6...@skbkontur/side-menu@4.0.7) (2026-07-07)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **Logotype:** deprecate konturLogo, update docs Logos → CdnLogo 4bc8889
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [4.0.6](/compare/@skbkontur/side-menu@4.0.5...@skbkontur/side-menu@4.0.6) (2026-05-19)
|
|
7
26
|
|
|
8
27
|
**Note:** Version bump only for package @skbkontur/side-menu
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ const myTheme = ThemeFactory.create<SideMenuThemeIn>({
|
|
|
21
21
|
|
|
22
22
|
```jsx harmony
|
|
23
23
|
import { getKonturAvatarUrl } from '@skbkontur/react-ui-addons';
|
|
24
|
-
import {
|
|
24
|
+
import { CdnLogo } from '@skbkontur/ui-cdn-components';
|
|
25
25
|
import { ThemeContext, ThemeFactory, MenuItem, MenuSeparator } from '@skbkontur/react-ui';
|
|
26
26
|
import { SideMenu } from '@skbkontur/side-menu';
|
|
27
27
|
import { IconDocTextRegular24 } from '@skbkontur/icons/IconDocTextRegular24';
|
|
@@ -37,7 +37,7 @@ import { IconAttachLinkRegular24 } from '@skbkontur/icons/IconAttachLinkRegular2
|
|
|
37
37
|
<div style={{height: '600px', position: 'relative'}}>
|
|
38
38
|
<ThemeContext.Provider value={ThemeFactory.create({ sideMenuProductColor: '#64b419' })}>
|
|
39
39
|
<SideMenu>
|
|
40
|
-
<SideMenu.Header
|
|
40
|
+
<SideMenu.Header productLogo={<CdnLogo logo="ofd" />}/>
|
|
41
41
|
<SideMenu.Body>
|
|
42
42
|
<SideMenu.Item icon={<IconDocTextRegular24/>} caption={'Документы к подписанию'} marker={'2'}>
|
|
43
43
|
<SideMenu.SubItem caption={'Входящие'}/>
|
|
@@ -100,7 +100,7 @@ import { IconAttachLinkRegular24 } from '@skbkontur/icons/IconAttachLinkRegular2
|
|
|
100
100
|
|
|
101
101
|
```jsx harmony
|
|
102
102
|
import { getKonturAvatarUrl } from '@skbkontur/react-ui-addons';
|
|
103
|
-
import {
|
|
103
|
+
import { CdnLogo } from '@skbkontur/ui-cdn-components';
|
|
104
104
|
import { ThemeContext, ThemeFactory, MenuItem, Modal, Input, MenuSeparator } from '@skbkontur/react-ui';
|
|
105
105
|
import { SideMenu } from '@skbkontur/side-menu';
|
|
106
106
|
import { IconDocTextRegular24 } from '@skbkontur/icons/IconDocTextRegular24';
|
|
@@ -145,7 +145,7 @@ const renderModal = () => {
|
|
|
145
145
|
<div style={{height: '600px', width: '100%', position: 'relative', display: 'flex'}}>
|
|
146
146
|
<ThemeContext.Provider value={ThemeFactory.create({ sideMenuProductColor: '#b750d1' })}>
|
|
147
147
|
<SideMenu isSeparatedMenu={true}>
|
|
148
|
-
<SideMenu.Header
|
|
148
|
+
<SideMenu.Header productLogo={<CdnLogo logo="extern" />} withWidget={false}/>
|
|
149
149
|
<SideMenu.Body>
|
|
150
150
|
<SideMenu.Item icon={<IconDocTextRegular24/>} caption={'Документы'} marker={'2'}>
|
|
151
151
|
<SideMenu.SubItem caption={'Входящие'} marker={'5'}>
|
|
@@ -225,7 +225,7 @@ const renderModal = () => {
|
|
|
225
225
|
```jsx harmony
|
|
226
226
|
import { useState } from 'react';
|
|
227
227
|
import { getKonturAvatarUrl } from '@skbkontur/react-ui-addons';
|
|
228
|
-
import {
|
|
228
|
+
import { CdnLogo } from '@skbkontur/ui-cdn-components';
|
|
229
229
|
import { ThemeContext, ThemeFactory, MenuItem, Select, Switcher, MenuSeparator} from '@skbkontur/react-ui';
|
|
230
230
|
import { SideMenu } from '@skbkontur/side-menu';
|
|
231
231
|
import { IconDocTextRegular24 } from '@skbkontur/icons/IconDocTextRegular24';
|
|
@@ -268,7 +268,7 @@ const items = [
|
|
|
268
268
|
<div style={{ height: '600px', display: 'flex', position: 'relative' }}>
|
|
269
269
|
<ThemeContext.Provider value={ThemeFactory.create({ sideMenuProductColor: '#64b419' })}>
|
|
270
270
|
<SideMenu activeItem={activeItem} onActiveItemChange={setActiveItem} isSeparatedMenu={isSeparatedMenu}>
|
|
271
|
-
<SideMenu.Header
|
|
271
|
+
<SideMenu.Header productLogo={<CdnLogo logo="ofd" />} withWidget={false} />
|
|
272
272
|
<SideMenu.Body>
|
|
273
273
|
<SideMenu.Item icon={<IconDocTextRegular24 />} caption={'Документы к подписанию id=100'} marker={'2'} id={'100'}>
|
|
274
274
|
<SideMenu.SubItem caption={'Входящие id=110'} id={'110'} />
|
|
@@ -508,7 +508,7 @@ import { SideMenu } from '@skbkontur/side-menu';
|
|
|
508
508
|
#### Пример кастомизации
|
|
509
509
|
|
|
510
510
|
```jsx harmony
|
|
511
|
-
import {
|
|
511
|
+
import { CdnLogo } from '@skbkontur/ui-cdn-components';
|
|
512
512
|
import { SideMenu } from '@skbkontur/side-menu';
|
|
513
513
|
import { IconDocTextRegular24 } from '@skbkontur/icons/IconDocTextRegular24';
|
|
514
514
|
import { IconSettingsGearRegular24 } from '@skbkontur/icons/IconSettingsGearRegular24';
|
|
@@ -517,7 +517,7 @@ import { ThemeContext, ThemeFactory } from '@skbkontur/react-ui';
|
|
|
517
517
|
<div style={{ height: '200px', position: 'relative' }}>
|
|
518
518
|
<ThemeContext.Provider value={ThemeFactory.create({ sideMenuWidth: '300px', sideMenuIconSize: '32px', sideMenuProductColor: '#64b419' })}>
|
|
519
519
|
<SideMenu>
|
|
520
|
-
<SideMenu.Header
|
|
520
|
+
<SideMenu.Header productLogo={<CdnLogo logo="ofd" />} />
|
|
521
521
|
<SideMenu.Body>
|
|
522
522
|
<SideMenu.Item icon={<IconDocTextRegular24 />} caption={'Документы к подписанию'} marker={'2'} />
|
|
523
523
|
</SideMenu.Body>
|
|
@@ -532,7 +532,7 @@ import { ThemeContext, ThemeFactory } from '@skbkontur/react-ui';
|
|
|
532
532
|
#### Пример с использованием пропа `isOpen`
|
|
533
533
|
|
|
534
534
|
```jsx harmony
|
|
535
|
-
import {
|
|
535
|
+
import { CdnLogo } from '@skbkontur/ui-cdn-components';
|
|
536
536
|
import { SideMenu } from '@skbkontur/side-menu';
|
|
537
537
|
import { IconDocTextRegular24 } from '@skbkontur/icons/IconDocTextRegular24';
|
|
538
538
|
import { IconSettingsGearRegular24 } from '@skbkontur/icons/IconSettingsGearRegular24';
|
|
@@ -544,7 +544,7 @@ const [isOpen, setIsOpen] = React.useState(true);
|
|
|
544
544
|
<ThemeContext.Provider
|
|
545
545
|
value={ThemeFactory.create({ sideMenuWidth: '300px', sideMenuProductColor: '#64b419' })}>
|
|
546
546
|
<SideMenu isOpen={isOpen} onOpen={() => console.log('onOpen')} onClose={() => console.log('onClose')}>
|
|
547
|
-
<SideMenu.Header
|
|
547
|
+
<SideMenu.Header productLogo={<CdnLogo logo="ofd" />} />
|
|
548
548
|
<SideMenu.Body>
|
|
549
549
|
<SideMenu.Item icon={<IconDocTextRegular24 />} caption={'Документы к подписанию'} />
|
|
550
550
|
</SideMenu.Body>
|
|
@@ -562,7 +562,7 @@ const [isOpen, setIsOpen] = React.useState(true);
|
|
|
562
562
|
#### Пример с использованием пропа `isPinned`
|
|
563
563
|
|
|
564
564
|
```jsx harmony
|
|
565
|
-
import {
|
|
565
|
+
import { CdnLogo } from '@skbkontur/ui-cdn-components';
|
|
566
566
|
import { SideMenu } from '@skbkontur/side-menu';
|
|
567
567
|
import { IconDocTextRegular24 } from '@skbkontur/icons/IconDocTextRegular24';
|
|
568
568
|
import { IconSettingsGearRegular24 } from '@skbkontur/icons/IconSettingsGearRegular24';
|
|
@@ -583,7 +583,7 @@ React.useEffect(() => {
|
|
|
583
583
|
onPinnedValueChange={(isPinned) => {
|
|
584
584
|
localStorage.setItem('sideMenuIsPinned', String(isPinned));
|
|
585
585
|
}}>
|
|
586
|
-
<SideMenu.Header
|
|
586
|
+
<SideMenu.Header productLogo={<CdnLogo logo="ofd" />} />
|
|
587
587
|
<SideMenu.Body>
|
|
588
588
|
<SideMenu.Item icon={<IconDocTextRegular24 />} caption={'Документы к подписанию'} />
|
|
589
589
|
</SideMenu.Body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skbkontur/side-menu",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Kontur",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"@skbkontur/bell-widget-npm-loader": "^0.3.0",
|
|
29
29
|
"@skbkontur/colors": "^2.1.7",
|
|
30
30
|
"@skbkontur/empty-state": "^2.0.2",
|
|
31
|
-
"@skbkontur/icons": "
|
|
32
|
-
"@skbkontur/react-ui-addons": "^6.0.
|
|
31
|
+
"@skbkontur/icons": "^2.0.0",
|
|
32
|
+
"@skbkontur/react-ui-addons": "^6.0.6",
|
|
33
33
|
"@skbkontur/widget-consumer-react-utils": "^1.6.12",
|
|
34
34
|
"tslib": "^2.8.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@skbkontur/ui-cdn-components": "^1.
|
|
37
|
+
"@skbkontur/ui-cdn-components": "^2.1.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@skbkontur/react-ui": ">=6 <7",
|
|
@@ -16,45 +16,66 @@ import { SideMenuSubLink } from '../SideMenuSubLink/SideMenuSubLink.js';
|
|
|
16
16
|
export type showScrollBarType = 'always' | 'scroll' | 'hover' | 'never';
|
|
17
17
|
export interface SideMenuProps extends CommonProps {
|
|
18
18
|
children?: React.ReactNode;
|
|
19
|
+
/**
|
|
20
|
+
* Размер контента бокового меню.
|
|
21
|
+
*/
|
|
19
22
|
size?: 'small' | 'large';
|
|
20
23
|
/**
|
|
21
|
-
*
|
|
24
|
+
* Отображает пункты меню второго уровня в отдельной колонке, а не раскрывающимся списком.
|
|
22
25
|
*/
|
|
23
26
|
isSeparatedMenu?: boolean;
|
|
24
27
|
/**
|
|
25
|
-
*
|
|
28
|
+
* Закрепляет свёрнутое до иконок боковое меню на экране. Работает только на широких экранах.
|
|
26
29
|
*/
|
|
27
30
|
isPinned?: boolean;
|
|
28
31
|
/**
|
|
29
|
-
*
|
|
32
|
+
* Событие закреплённого состояния. Работает только на широких экранах.
|
|
30
33
|
*/
|
|
31
34
|
onPinnedValueChange?: (isPinned: boolean) => void;
|
|
32
35
|
/**
|
|
33
|
-
*
|
|
36
|
+
* Блокирует возможность сворачивать меню до иконок. Работает только на широких экранах.
|
|
34
37
|
*/
|
|
35
38
|
disableCollapsing?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Управление активным пунктом меню.
|
|
41
|
+
*/
|
|
36
42
|
activeItem?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Событие смены активного пункта меню.
|
|
45
|
+
*/
|
|
37
46
|
onActiveItemChange?: (value: string) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Меняет брейкпоинт для широкого экрана десктопа.
|
|
49
|
+
*/
|
|
38
50
|
desktopMediaQuery?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Меняет брейкпоинт для маленького экрана десктопа.
|
|
53
|
+
*/
|
|
39
54
|
narrowDesktopMediaQuery?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Меняет брейкпоинт для планшетного режима.
|
|
57
|
+
*/
|
|
40
58
|
tabletMediaQuery?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Меняет брейкпоинт для мобильного режима.
|
|
61
|
+
*/
|
|
41
62
|
mobileMediaQuery?: string;
|
|
42
63
|
/**
|
|
43
|
-
*
|
|
64
|
+
* Показывает полосу прокрутки.
|
|
44
65
|
*/
|
|
45
66
|
showScrollBar?: showScrollBarType;
|
|
46
67
|
/**
|
|
47
|
-
*
|
|
68
|
+
* Управляет видимостью: открыто/закрыто боковое меню.
|
|
48
69
|
*
|
|
49
|
-
* Примечание: при заданном пропе `isOpen` автоматическое открытие/закрытие меню не
|
|
70
|
+
* Примечание: при заданном пропе `isOpen` автоматическое открытие/закрытие меню не работает.
|
|
50
71
|
*/
|
|
51
72
|
isOpen?: boolean;
|
|
52
73
|
/**
|
|
53
|
-
*
|
|
74
|
+
* Событие открытия меню
|
|
54
75
|
*/
|
|
55
76
|
onOpen?: () => void;
|
|
56
77
|
/**
|
|
57
|
-
*
|
|
78
|
+
* Событие закрытия меню.
|
|
58
79
|
*/
|
|
59
80
|
onClose?: () => void;
|
|
60
81
|
}
|
|
@@ -5,7 +5,9 @@ import React from 'react';
|
|
|
5
5
|
import type { SideMenuItemProps } from '../SideMenuItem/SideMenuItem.js';
|
|
6
6
|
export interface SideMenuDropdownProps extends CommonProps, Omit<DropdownMenuProps, 'caption' | 'disableAnimations'>, Pick<SideMenuItemProps, 'icon' | 'caption' | 'marker' | 'id' | 'subCaption' | '_isAvatar'> {
|
|
7
7
|
children?: React.ReactNode;
|
|
8
|
+
/** Отключает анимацию раскрытия пункта меню. */
|
|
8
9
|
disableAnimations?: boolean;
|
|
10
|
+
/** Идентификатор элемента. */
|
|
9
11
|
id?: string;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { CommonClickableElementProps } from '../internal/ClickableElement.js';
|
|
3
3
|
export interface SideMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, CommonClickableElementProps {
|
|
4
|
+
/** Компонент, используемый в качестве корневого узла. */
|
|
4
5
|
component?: React.ComponentType<any>;
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { CommonClickableElementProps } from '../internal/ClickableElement.js';
|
|
3
3
|
export interface SideMenuLinkProps<T = string> extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>, CommonClickableElementProps {
|
|
4
|
+
/** Компонент, используемый в качестве корневого узла. */
|
|
4
5
|
component?: React.ComponentType<any>;
|
|
6
|
+
/** Адрес ссылки или ресурса. */
|
|
5
7
|
href: T;
|
|
6
8
|
}
|
|
7
9
|
/**
|
|
@@ -3,14 +3,21 @@ import type { ReactNode } from 'react';
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
export interface CommonClickableElementProps extends CommonProps {
|
|
5
5
|
children?: ReactNode;
|
|
6
|
+
/** Иконка. */
|
|
6
7
|
icon: React.ReactElement;
|
|
8
|
+
/** Визуальный маркер. */
|
|
7
9
|
marker?: ReactNode;
|
|
10
|
+
/** Заголовок элемента. */
|
|
8
11
|
caption?: ReactNode;
|
|
12
|
+
/** Подзаголовок элемента. */
|
|
9
13
|
subCaption?: ReactNode;
|
|
14
|
+
/** Идентификатор элемента. */
|
|
10
15
|
id?: string;
|
|
16
|
+
/** Позволяет использовать элемент как обычную кнопку. */
|
|
11
17
|
isButton?: boolean;
|
|
18
|
+
/** Блокирует элемент. */
|
|
12
19
|
disabled?: boolean;
|
|
13
|
-
/** Отключает перенос строки у заголовка элемента, вместо этого он будет обрезаться
|
|
20
|
+
/** Отключает перенос строки у заголовка элемента, вместо этого он будет обрезаться многоточием. */
|
|
14
21
|
noWrap?: boolean;
|
|
15
22
|
/** @ignore */
|
|
16
23
|
_isSubMenu?: boolean;
|
|
@@ -23,6 +30,7 @@ export interface CommonClickableElementProps extends CommonProps {
|
|
|
23
30
|
}
|
|
24
31
|
export interface ClickableElementProps extends CommonClickableElementProps {
|
|
25
32
|
element: 'a' | 'button' | React.ComponentType<any>;
|
|
33
|
+
/** Адрес ссылки или ресурса. */
|
|
26
34
|
href?: string;
|
|
27
35
|
onClick?: React.EventHandler<React.MouseEvent>;
|
|
28
36
|
onKeyDown?: React.EventHandler<React.KeyboardEvent>;
|
|
@@ -16,9 +16,12 @@ var changeCamelCaseToKebabCase = function (str) {
|
|
|
16
16
|
.join('');
|
|
17
17
|
};
|
|
18
18
|
var getProductName = function (productLogo) {
|
|
19
|
-
var _a;
|
|
19
|
+
var _a, _b;
|
|
20
|
+
if (typeof ((_a = productLogo === null || productLogo === void 0 ? void 0 : productLogo.props) === null || _a === void 0 ? void 0 : _a.logo) === 'string') {
|
|
21
|
+
return productLogo.props.logo;
|
|
22
|
+
}
|
|
20
23
|
// @ts-expect-error: accessing private property
|
|
21
|
-
return ((
|
|
24
|
+
return ((_b = productLogo === null || productLogo === void 0 ? void 0 : productLogo.type) === null || _b === void 0 ? void 0 : _b.__KONTUR_REACT_UI__)
|
|
22
25
|
? // @ts-expect-error: accessing private property
|
|
23
26
|
changeCamelCaseToKebabCase(productLogo.type.__KONTUR_REACT_UI__.replace(/EN$/i, ''))
|
|
24
27
|
: 'kontur';
|
|
@@ -49,7 +52,8 @@ var SideMenuLogotype = forwardRef(function (_a, ref) {
|
|
|
49
52
|
var logotypeWidth = (_b = (_a = refLogotype.current) === null || _a === void 0 ? void 0 : _a.logotypeRef) === null || _b === void 0 ? void 0 : _b.clientWidth;
|
|
50
53
|
var maxWidth = parseInt(theme.sideMenuWidth) -
|
|
51
54
|
2 * parseInt(theme.sideMenuMarginX) -
|
|
52
|
-
parseInt(theme.sideMenuLogotypePaddingLeft)
|
|
55
|
+
parseInt(theme.sideMenuLogotypePaddingLeft) +
|
|
56
|
+
(withWidget ? -28 : 0);
|
|
53
57
|
if (logotypeWidth && logotypeWidth > maxWidth && !rest.size) {
|
|
54
58
|
setSize(24);
|
|
55
59
|
}
|