@astral/ui 4.72.0 → 4.73.1

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 (150) hide show
  1. package/components/DashboardLayout/Header/styles.js +21 -1
  2. package/components/MenuOrganization/OrganizationButton/styles.js +3 -0
  3. package/components/PageAside/MobileAsideButton/MobileAsideButton.d.ts +6 -0
  4. package/components/PageAside/MobileAsideButton/MobileAsideButton.js +13 -0
  5. package/components/PageAside/MobileAsideButton/index.d.ts +1 -0
  6. package/components/PageAside/MobileAsideButton/index.js +1 -0
  7. package/components/PageAside/MobileAsideButton/styles.d.ts +22 -0
  8. package/components/PageAside/MobileAsideButton/styles.js +31 -0
  9. package/components/PageAside/PageAside.d.ts +2 -9
  10. package/components/PageAside/PageAside.js +21 -4
  11. package/components/PageAside/constants.d.ts +5 -0
  12. package/components/PageAside/constants.js +6 -0
  13. package/components/PageAside/hooks/index.d.ts +1 -0
  14. package/components/PageAside/hooks/index.js +1 -0
  15. package/components/PageAside/hooks/usePageAside/index.d.ts +1 -0
  16. package/components/PageAside/hooks/usePageAside/index.js +1 -0
  17. package/components/PageAside/hooks/usePageAside/usePageAside.d.ts +9 -0
  18. package/components/PageAside/hooks/usePageAside/usePageAside.js +17 -0
  19. package/components/PageAside/index.d.ts +4 -0
  20. package/components/PageAside/index.js +3 -0
  21. package/components/PageAside/public.d.ts +3 -1
  22. package/components/PageAside/public.js +1 -0
  23. package/components/PageAside/styles.d.ts +15 -0
  24. package/components/PageAside/styles.js +36 -7
  25. package/components/PageAside/types.d.ts +24 -0
  26. package/components/PageAside/types.js +1 -0
  27. package/components/PageAsideBlock/styles.js +2 -2
  28. package/components/PageAsideNavigation/PageAsideNavigation.d.ts +2 -0
  29. package/components/PageAsideNavigation/PageAsideNavigation.js +9 -0
  30. package/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.d.ts +18 -0
  31. package/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.js +18 -0
  32. package/components/PageAsideNavigation/PageAsideNavigationItem/constants.d.ts +4 -0
  33. package/components/PageAsideNavigation/PageAsideNavigationItem/constants.js +5 -0
  34. package/components/PageAsideNavigation/PageAsideNavigationItem/index.d.ts +3 -0
  35. package/components/PageAsideNavigation/PageAsideNavigationItem/index.js +2 -0
  36. package/components/PageAsideNavigation/PageAsideNavigationItem/styles.d.ts +9 -0
  37. package/components/PageAsideNavigation/PageAsideNavigationItem/styles.js +113 -0
  38. package/components/PageAsideNavigation/PageAsideNavigationItem/types.d.ts +26 -0
  39. package/components/PageAsideNavigation/PageAsideNavigationItem/types.js +1 -0
  40. package/components/PageAsideNavigation/constants.d.ts +3 -0
  41. package/components/PageAsideNavigation/constants.js +4 -0
  42. package/components/PageAsideNavigation/index.d.ts +4 -0
  43. package/components/PageAsideNavigation/index.js +3 -0
  44. package/components/PageAsideNavigation/public.d.ts +3 -0
  45. package/components/PageAsideNavigation/public.js +3 -0
  46. package/components/PageAsideNavigation/styles.d.ts +13 -0
  47. package/components/PageAsideNavigation/styles.js +48 -0
  48. package/components/PageAsideNavigation/types.d.ts +17 -0
  49. package/components/PageAsideNavigation/types.js +1 -0
  50. package/components/PageHeader/HeaderContent/styles.js +0 -2
  51. package/components/PageHeader/PageHeader.js +11 -1
  52. package/components/PageHeader/styles.js +7 -5
  53. package/components/PagePinnableAside/PagePinnableAside.d.ts +1 -1
  54. package/components/PagePinnableAside/PagePinnableAside.js +16 -4
  55. package/components/PagePinnableAside/constants.d.ts +2 -0
  56. package/components/PagePinnableAside/constants.js +2 -0
  57. package/components/PagePinnableAside/styles.js +8 -11
  58. package/components/PagePinnableAside/types.d.ts +17 -1
  59. package/components/PagePinnableAside/useLogic/useLogic.d.ts +4 -2
  60. package/components/PagePinnableAside/useLogic/useLogic.js +10 -2
  61. package/components/Tabs/Tabs.js +2 -2
  62. package/components/Tabs/hooks/index.d.ts +1 -1
  63. package/components/Tabs/hooks/index.js +1 -1
  64. package/components/useScrollToActiveElement/index.d.ts +1 -0
  65. package/components/useScrollToActiveElement/index.js +1 -0
  66. package/components/useScrollToActiveElement/useScrollToActiveElement.d.ts +9 -0
  67. package/components/useScrollToActiveElement/useScrollToActiveElement.js +29 -0
  68. package/node/components/DashboardLayout/Header/styles.js +21 -1
  69. package/node/components/MenuOrganization/OrganizationButton/styles.js +3 -0
  70. package/node/components/PageAside/MobileAsideButton/MobileAsideButton.d.ts +6 -0
  71. package/node/components/PageAside/MobileAsideButton/MobileAsideButton.js +17 -0
  72. package/node/components/PageAside/MobileAsideButton/index.d.ts +1 -0
  73. package/node/components/PageAside/MobileAsideButton/index.js +5 -0
  74. package/node/components/PageAside/MobileAsideButton/styles.d.ts +22 -0
  75. package/node/components/PageAside/MobileAsideButton/styles.js +34 -0
  76. package/node/components/PageAside/PageAside.d.ts +2 -9
  77. package/node/components/PageAside/PageAside.js +19 -2
  78. package/node/components/PageAside/constants.d.ts +5 -0
  79. package/node/components/PageAside/constants.js +7 -1
  80. package/node/components/PageAside/hooks/index.d.ts +1 -0
  81. package/node/components/{Tabs/hooks/useScrollToActiveTab → PageAside/hooks}/index.js +1 -1
  82. package/node/components/PageAside/hooks/usePageAside/index.d.ts +1 -0
  83. package/node/components/PageAside/hooks/usePageAside/index.js +17 -0
  84. package/node/components/PageAside/hooks/usePageAside/usePageAside.d.ts +9 -0
  85. package/node/components/PageAside/hooks/usePageAside/usePageAside.js +21 -0
  86. package/node/components/PageAside/index.d.ts +4 -0
  87. package/node/components/PageAside/index.js +7 -1
  88. package/node/components/PageAside/public.d.ts +3 -1
  89. package/node/components/PageAside/public.js +3 -1
  90. package/node/components/PageAside/styles.d.ts +15 -0
  91. package/node/components/PageAside/styles.js +38 -9
  92. package/node/components/PageAside/types.d.ts +24 -0
  93. package/node/components/PageAside/types.js +2 -0
  94. package/node/components/PageAsideBlock/styles.js +2 -2
  95. package/node/components/PageAsideNavigation/PageAsideNavigation.d.ts +2 -0
  96. package/node/components/PageAsideNavigation/PageAsideNavigation.js +13 -0
  97. package/node/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.d.ts +18 -0
  98. package/node/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.js +22 -0
  99. package/node/components/PageAsideNavigation/PageAsideNavigationItem/constants.d.ts +4 -0
  100. package/node/components/PageAsideNavigation/PageAsideNavigationItem/constants.js +8 -0
  101. package/node/components/PageAsideNavigation/PageAsideNavigationItem/index.d.ts +3 -0
  102. package/node/components/PageAsideNavigation/PageAsideNavigationItem/index.js +7 -0
  103. package/node/components/PageAsideNavigation/PageAsideNavigationItem/styles.d.ts +9 -0
  104. package/node/components/PageAsideNavigation/PageAsideNavigationItem/styles.js +116 -0
  105. package/node/components/PageAsideNavigation/PageAsideNavigationItem/types.d.ts +26 -0
  106. package/node/components/PageAsideNavigation/PageAsideNavigationItem/types.js +2 -0
  107. package/node/components/PageAsideNavigation/constants.d.ts +3 -0
  108. package/node/components/PageAsideNavigation/constants.js +7 -0
  109. package/node/components/PageAsideNavigation/index.d.ts +4 -0
  110. package/node/components/PageAsideNavigation/index.js +10 -0
  111. package/node/components/PageAsideNavigation/public.d.ts +3 -0
  112. package/node/components/PageAsideNavigation/public.js +10 -0
  113. package/node/components/PageAsideNavigation/styles.d.ts +13 -0
  114. package/node/components/PageAsideNavigation/styles.js +51 -0
  115. package/node/components/PageAsideNavigation/types.d.ts +17 -0
  116. package/node/components/PageAsideNavigation/types.js +2 -0
  117. package/node/components/PageHeader/HeaderContent/styles.js +0 -2
  118. package/node/components/PageHeader/PageHeader.js +11 -1
  119. package/node/components/PageHeader/styles.js +18 -16
  120. package/node/components/PagePinnableAside/PagePinnableAside.d.ts +1 -1
  121. package/node/components/PagePinnableAside/PagePinnableAside.js +16 -4
  122. package/node/components/PagePinnableAside/constants.d.ts +2 -0
  123. package/node/components/PagePinnableAside/constants.js +2 -0
  124. package/node/components/PagePinnableAside/styles.js +10 -13
  125. package/node/components/PagePinnableAside/types.d.ts +17 -1
  126. package/node/components/PagePinnableAside/useLogic/useLogic.d.ts +4 -2
  127. package/node/components/PagePinnableAside/useLogic/useLogic.js +10 -2
  128. package/node/components/Tabs/Tabs.js +2 -2
  129. package/node/components/Tabs/hooks/index.d.ts +1 -1
  130. package/node/components/Tabs/hooks/index.js +1 -1
  131. package/node/components/useScrollToActiveElement/index.d.ts +1 -0
  132. package/node/components/useScrollToActiveElement/index.js +17 -0
  133. package/node/components/useScrollToActiveElement/useScrollToActiveElement.d.ts +9 -0
  134. package/node/components/useScrollToActiveElement/useScrollToActiveElement.js +33 -0
  135. package/package.json +1 -1
  136. package/components/DashboardLayout/Sidebar/MenuSidebarButton/types.d.ts +0 -0
  137. package/components/DashboardLayout/Sidebar/MenuSidebarButton/types.js +0 -1
  138. package/components/DashboardLayout/Sidebar/Sidebar.d.ts +0 -0
  139. package/components/DashboardLayout/Sidebar/Sidebar.js +0 -1
  140. package/components/Tabs/hooks/useScrollToActiveTab/index.d.ts +0 -1
  141. package/components/Tabs/hooks/useScrollToActiveTab/index.js +0 -1
  142. package/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.d.ts +0 -4
  143. package/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.js +0 -24
  144. package/node/components/DashboardLayout/Sidebar/MenuSidebarButton/types.d.ts +0 -0
  145. package/node/components/DashboardLayout/Sidebar/MenuSidebarButton/types.js +0 -1
  146. package/node/components/DashboardLayout/Sidebar/Sidebar.d.ts +0 -0
  147. package/node/components/DashboardLayout/Sidebar/Sidebar.js +0 -1
  148. package/node/components/Tabs/hooks/useScrollToActiveTab/index.d.ts +0 -1
  149. package/node/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.d.ts +0 -4
  150. package/node/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.js +0 -28
@@ -0,0 +1,3 @@
1
+ export declare const pageAsideNavigationClassnames: {
2
+ root: string;
3
+ };
@@ -0,0 +1,4 @@
1
+ import { createUIKitClassname } from '../utils/createUIKitClassname';
2
+ export const pageAsideNavigationClassnames = {
3
+ root: createUIKitClassname('page-aside-navigation'),
4
+ };
@@ -0,0 +1,4 @@
1
+ export type { PageAsideNavigationProps } from './types';
2
+ export { PageAsideNavigation } from './PageAsideNavigation';
3
+ export { PageAsideNavigationItem, type PageAsideNavigationItemProps, pageAsideNavigationItemClassnames, } from './PageAsideNavigationItem';
4
+ export { pageAsideNavigationClassnames } from './constants';
@@ -0,0 +1,3 @@
1
+ export { PageAsideNavigation } from './PageAsideNavigation';
2
+ export { PageAsideNavigationItem, pageAsideNavigationItemClassnames, } from './PageAsideNavigationItem';
3
+ export { pageAsideNavigationClassnames } from './constants';
@@ -0,0 +1,3 @@
1
+ export { pageAsideNavigationClassnames } from './constants';
2
+ export { PageAsideNavigation } from './PageAsideNavigation';
3
+ export { PageAsideNavigationItem, type PageAsideNavigationItemProps, pageAsideNavigationItemClassnames, } from './PageAsideNavigationItem';
@@ -0,0 +1,3 @@
1
+ export { pageAsideNavigationClassnames } from './constants';
2
+ export { PageAsideNavigation } from './PageAsideNavigation';
3
+ export { PageAsideNavigationItem, pageAsideNavigationItemClassnames, } from './PageAsideNavigationItem';
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ export declare const Wrapper: import("../styled").StyledComponent<{
3
+ theme?: import("@emotion/react").Theme | undefined;
4
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
5
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
6
+ export declare const NavigationList: import("../styled").StyledComponent<{
7
+ theme?: import("@emotion/react").Theme | undefined;
8
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
9
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLUListElement>, HTMLUListElement>, {}>;
10
+ export declare const AddonNavigationWrapper: import("../styled").StyledComponent<{
11
+ theme?: import("@emotion/react").Theme | undefined;
12
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
13
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
@@ -0,0 +1,48 @@
1
+ import { styled } from '../styled';
2
+ export const Wrapper = styled.div `
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: ${({ theme }) => theme.spacing(10)};
6
+
7
+ ${({ theme }) => theme.breakpoints.down('sm')} {
8
+ gap: ${({ theme }) => theme.spacing(3)};
9
+
10
+ width: 100%;
11
+ padding: ${({ theme }) => theme.spacing(0, 0, 3)};
12
+
13
+ background-color: ${({ theme }) => theme.palette.background.default};
14
+ border-bottom: 1px solid ${({ theme }) => theme.palette.components.border.default};
15
+ }
16
+ `;
17
+ export const NavigationList = styled.ul `
18
+ display: flex;
19
+ flex-direction: column;
20
+
21
+ width: 100%;
22
+ margin: 0;
23
+ padding: 0;
24
+
25
+ list-style: none;
26
+
27
+ ${({ theme }) => theme.breakpoints.down('sm')} {
28
+ /* Убираем видимую полосу прокрутки в firefox */
29
+ scrollbar-width: none;
30
+
31
+ overflow-x: auto;
32
+ flex-direction: row;
33
+ gap: ${({ theme }) => theme.spacing(2)};
34
+
35
+ padding: ${({ theme }) => theme.spacing(0, 4)};
36
+
37
+ /* Убираем видимую полосу прокрутки в chrome */
38
+ &::-webkit-scrollbar {
39
+ display: none;
40
+ }
41
+
42
+ }
43
+ `;
44
+ export const AddonNavigationWrapper = styled.div `
45
+ ${({ theme }) => theme.breakpoints.down('sm')} {
46
+ padding: ${({ theme }) => theme.spacing(0, 4)};
47
+ }
48
+ `;
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ export type PageAsideNavigationProps = {
3
+ children?: ReactNode;
4
+ /**
5
+ * Название класса, применяется к корневому компоненту
6
+ */
7
+ className?: string;
8
+ /**
9
+ * Дополнительный контент для навигации
10
+ */
11
+ addonNavigation?: ReactNode;
12
+ /**
13
+ * Позиционирование дополнительного контента для навигации
14
+ * @default 'start'
15
+ */
16
+ addonNavigationPosition?: 'start' | 'end';
17
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -17,8 +17,6 @@ export const PageSubheader = styled.div `
17
17
 
18
18
  ${({ theme }) => theme.breakpoints.down('sm')} {
19
19
  padding: ${({ theme }) => theme.spacing(0, 4, 4, 4)};
20
-
21
- border-bottom: 1px solid ${({ theme }) => theme.palette.components.border.default};
22
20
  }
23
21
  `;
24
22
  export const DesktopTitleWrapper = styled.div `
@@ -22,6 +22,12 @@ const rootCva = cva(pageHeaderClassnames.root, {
22
22
  hasActions: {
23
23
  true: pageHeaderClassnames.hasActions,
24
24
  },
25
+ hasSubheader: {
26
+ true: pageHeaderClassnames.hasSubheader,
27
+ },
28
+ hasFilters: {
29
+ true: pageHeaderClassnames.hasFilters,
30
+ },
25
31
  },
26
32
  });
27
33
  export const PageHeader = (props) => {
@@ -30,5 +36,9 @@ export const PageHeader = (props) => {
30
36
  return (_jsxs(_Fragment, { children: [_jsxs(MobileTitleWrapper, { className: mobilePageHeaderCva({
31
37
  hasTitle: Boolean(title) || isLoading,
32
38
  hasBackButton: Boolean(backButton),
33
- }), children: [_jsx(Title, { backButton: backButton, title: title, isLoading: isLoading }), mobileTitleActions && mobileTitleActions] }), _jsx(Wrapper, { className: classNames(rootCva({ hasActions: Boolean(actions) }), className), children: _jsx(HeaderContent, { breadcrumbs: breadcrumbs, backButton: backButton, title: title, description: description, actions: actions, subheader: subheader, filters: filters, isLoading: isLoading }) }), isShowMobileActions && (_jsx(MobilePageActions, { className: classNames(pageHeaderClassnames.pageHeaderActions), isLoading: isLoading, ...actions }))] }));
39
+ }), children: [_jsx(Title, { backButton: backButton, title: title, isLoading: isLoading }), mobileTitleActions && mobileTitleActions] }), _jsx(Wrapper, { className: classNames(rootCva({
40
+ hasActions: Boolean(actions),
41
+ hasSubheader: Boolean(subheader),
42
+ hasFilters: Boolean(filters),
43
+ }), className), children: _jsx(HeaderContent, { breadcrumbs: breadcrumbs, backButton: backButton, title: title, description: description, actions: actions, subheader: subheader, filters: filters, isLoading: isLoading }) }), isShowMobileActions && (_jsx(MobilePageActions, { className: classNames(pageHeaderClassnames.pageHeaderActions), isLoading: isLoading, ...actions }))] }));
34
44
  };
@@ -1,3 +1,4 @@
1
+ import { pageAsideClassnames } from '../PageAside/constants';
1
2
  import { styled } from '../styled';
2
3
  import { PAGE_HEADER_HEIGHT_MOBILE, pageHeaderClassnames } from './constants';
3
4
  export const Wrapper = styled.header `
@@ -29,6 +30,10 @@ export const Wrapper = styled.header `
29
30
  padding: unset;
30
31
 
31
32
  background-color: ${({ theme }) => theme.palette.background.default};
33
+
34
+ &.${pageHeaderClassnames.hasSubheader}, &.${pageHeaderClassnames.hasFilters} {
35
+ border-bottom: 1px solid ${({ theme }) => theme.palette.components.border.default};
36
+ }
32
37
  }
33
38
 
34
39
  .${pageHeaderClassnames.filters} {
@@ -39,10 +44,6 @@ export const Wrapper = styled.header `
39
44
  grid-column: 3;
40
45
  grid-row: 1 / -1;
41
46
  }
42
-
43
- ${({ theme }) => theme.breakpoints.down('sm')} {
44
- border-bottom: 1px solid ${({ theme }) => theme.palette.components.border.default};
45
- }
46
47
  }
47
48
 
48
49
  .${pageHeaderClassnames.quickFilters} {
@@ -77,7 +78,8 @@ export const MobileTitleWrapper = styled.div `
77
78
  /* stylelint-disable plugin/no-unsupported-browser-features */
78
79
  &:not(:has(+ .${pageHeaderClassnames.root} :is(
79
80
  .${pageHeaderClassnames.filters},
80
- .${pageHeaderClassnames.subheader}
81
+ .${pageHeaderClassnames.subheader},
82
+ .${pageAsideClassnames.mobileNavigation}
81
83
  ))) {
82
84
  border-bottom: 1px solid ${({ theme }) => theme.palette.components.border.default};
83
85
  }
@@ -2,4 +2,4 @@ import type { PagePinnableAsideProps } from './types';
2
2
  /**
3
3
  * Открепляемый aside
4
4
  */
5
- export declare const PagePinnableAside: ({ children, className, ...restProps }: PagePinnableAsideProps) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const PagePinnableAside: ({ header, children, className, navigation, ...restProps }: PagePinnableAsideProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,14 +1,26 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { createPortal } from 'react-dom';
2
3
  import { MenuOnOutlineMd } from '../../icons/MenuOnOutlineMd';
4
+ import { MobileAsideButton, pageAsideClassnames } from '../PageAside';
5
+ import { AsideHeader, MobileAsideHeader, MobileAsideNavigation, StyledDivider, } from '../PageAside/styles';
3
6
  import { PinButton } from '../PinButton';
4
7
  import { classNames } from '../utils/classNames';
8
+ import { cva } from '../utils/cva';
5
9
  import { pinnableAsideClassnames } from './constants';
6
10
  import { Aside, ChildrenWrapper, Content, Dummy, Footer } from './styles';
7
11
  import { useLogic } from './useLogic';
12
+ const asideCva = cva(pinnableAsideClassnames.root, {
13
+ variants: {
14
+ withHeader: {
15
+ true: pinnableAsideClassnames.withHeader,
16
+ },
17
+ },
18
+ });
8
19
  /**
9
20
  * Открепляемый aside
10
21
  */
11
- export const PagePinnableAside = ({ children, className, ...restProps }) => {
12
- const { isPinned, togglePin } = useLogic(restProps);
13
- return (_jsxs(Aside, { "$isPinned": isPinned, children: [_jsx(Dummy, { "$isPinned": isPinned, children: _jsx(MenuOnOutlineMd, {}) }), _jsxs(Content, { "$isPinned": isPinned, className: classNames(className, pinnableAsideClassnames.content), children: [_jsx(ChildrenWrapper, { children: children }), _jsx(Footer, { children: _jsx(PinButton, { isPinned: isPinned, isUseCollapse: false, onClick: togglePin }) })] })] }));
22
+ export const PagePinnableAside = ({ header, children, className, navigation, ...restProps }) => {
23
+ const { isPinned, togglePin, pageHeaderContainer, isMobileNavigationVisible, } = useLogic({ navigation, ...restProps });
24
+ return (_jsxs(_Fragment, { children: [isMobileNavigationVisible &&
25
+ createPortal(_jsx(MobileAsideNavigation, { className: pageAsideClassnames.mobileNavigation, children: navigation }), pageHeaderContainer), header && _jsx(MobileAsideHeader, { children: header }), _jsx(MobileAsideButton, { content: children }), _jsxs(Aside, { "$isPinned": isPinned, className: asideCva({ withHeader: Boolean(header) }), children: [_jsx(Dummy, { "$isPinned": isPinned, children: _jsx(MenuOnOutlineMd, {}) }), _jsxs(Content, { "$isPinned": isPinned, className: classNames(className, pinnableAsideClassnames.content), children: [_jsxs(ChildrenWrapper, { children: [header && (_jsxs(AsideHeader, { children: [header, _jsx(StyledDivider, {})] })), navigation, children] }), _jsx(Footer, { children: _jsx(PinButton, { isPinned: isPinned, isUseCollapse: false, onClick: togglePin }) })] })] })] }));
14
26
  };
@@ -1,4 +1,6 @@
1
1
  export declare const pinnableAsideClassnames: {
2
2
  content: string;
3
+ withHeader: string;
4
+ root: string;
3
5
  };
4
6
  export declare const ASIDE_LOCAL_STORAGE_KEY: string;
@@ -2,5 +2,7 @@ import { createUIKitClassname } from '../utils/createUIKitClassname';
2
2
  import { generateLocalStorageKey } from '../utils/generateLocalStorageKey';
3
3
  export const pinnableAsideClassnames = {
4
4
  content: createUIKitClassname('pinnable-aside__content'),
5
+ withHeader: createUIKitClassname('pinnable-aside_with-header'),
6
+ root: createUIKitClassname('pinnable-aside'),
5
7
  };
6
8
  export const ASIDE_LOCAL_STORAGE_KEY = generateLocalStorageKey('Aside', 'isPinned');
@@ -1,5 +1,6 @@
1
1
  import { FOOTER_DESKTOP_HEIGHT, FOOTER_LAPTOP_HEIGHT } from '../constants';
2
2
  import { PAGE_ASIDE_WIDTH } from '../PageAside';
3
+ import { pageAsideNavigationClassnames } from '../PageAsideNavigation/constants';
3
4
  import { css, styled } from '../styled';
4
5
  import { pinnableAsideClassnames } from './constants';
5
6
  export const Aside = styled('aside', {
@@ -21,18 +22,14 @@ export const Aside = styled('aside', {
21
22
  }
22
23
  }
23
24
 
24
- ${({ theme }) => theme.breakpoints.down('sm')} {
25
- z-index: 0;
26
-
27
- overflow: unset;
28
- order: 3;
29
-
30
- width: ${({ theme }) => `calc(100% - ${theme.spacing(8)})`};
31
- margin: ${({ theme }) => theme.spacing(0, 4, 4)};
25
+ &.${pinnableAsideClassnames.withHeader} {
26
+ & .${pageAsideNavigationClassnames.root} {
27
+ padding-top: ${({ theme }) => theme.spacing(5)};
28
+ }
29
+ }
32
30
 
33
- background-color: ${({ theme }) => theme.palette.background.default};
34
- border: 1px solid ${({ theme }) => theme.palette.components.border.default};
35
- border-radius: ${({ theme }) => theme.shape.medium};
31
+ ${({ theme }) => theme.breakpoints.down('sm')} {
32
+ display: none;
36
33
  }
37
34
  `;
38
35
  export const Dummy = styled('div', {
@@ -1,6 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  export type PagePinnableAsideProps = {
3
- children: ReactNode;
3
+ children?: ReactNode;
4
4
  /**
5
5
  * Название класса, применяется к корневому компоненту
6
6
  */
@@ -27,4 +27,20 @@ export type PagePinnableAsideProps = {
27
27
  */
28
28
  id: string;
29
29
  };
30
+ /**
31
+ * Заголовок боковой панели
32
+ */
33
+ header?: ReactNode;
34
+ /**
35
+ * Компонент для отображения навигации
36
+ * @example
37
+ * <PagePinnableAside navigation={
38
+ * <PageAsideNavigation>
39
+ * <PageAsideNavigationItem>
40
+ * Home
41
+ * </PageAsideNavigationItem>
42
+ * </PageAsideNavigation>}
43
+ * />
44
+ */
45
+ navigation?: ReactNode;
30
46
  };
@@ -1,7 +1,9 @@
1
1
  import type { PagePinnableAsideProps } from '../types';
2
- type UseLogicParams = Pick<PagePinnableAsideProps, 'isPinned' | 'onPin' | 'persistState'>;
3
- export declare const useLogic: ({ isPinned: isPinnedProp, onPin: onPinProp, persistState, }: UseLogicParams) => {
2
+ type UseLogicParams = Pick<PagePinnableAsideProps, 'isPinned' | 'onPin' | 'persistState' | 'navigation'>;
3
+ export declare const useLogic: ({ isPinned: isPinnedProp, onPin: onPinProp, persistState, navigation, }: UseLogicParams) => {
4
4
  isPinned: boolean;
5
5
  togglePin: () => void;
6
+ pageHeaderContainer: Element | null;
7
+ isMobileNavigationVisible: false | "" | 0 | 0n | Element | null | undefined;
6
8
  };
7
9
  export {};
@@ -1,7 +1,9 @@
1
1
  import { useEffect, useMemo } from 'react';
2
+ import { usePageAside } from '../../PageAside';
2
3
  import { useLocalStorage } from '../../useLocalStorage';
3
4
  import { ASIDE_LOCAL_STORAGE_KEY } from '../constants';
4
- export const useLogic = ({ isPinned: isPinnedProp, onPin: onPinProp, persistState, }) => {
5
+ export const useLogic = ({ isPinned: isPinnedProp, onPin: onPinProp, persistState, navigation, }) => {
6
+ const { pageHeaderContainer } = usePageAside({ navigation });
5
7
  useEffect(() => {
6
8
  const hasIsPinned = isPinnedProp !== undefined;
7
9
  const hasOnPin = onPinProp !== undefined;
@@ -31,5 +33,11 @@ export const useLogic = ({ isPinned: isPinnedProp, onPin: onPinProp, persistStat
31
33
  }
32
34
  setStoredValue(newValue);
33
35
  };
34
- return { isPinned, togglePin };
36
+ const isMobileNavigationVisible = navigation && pageHeaderContainer;
37
+ return {
38
+ isPinned,
39
+ togglePin,
40
+ pageHeaderContainer,
41
+ isMobileNavigationVisible,
42
+ };
35
43
  };
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useScrollToActiveTab } from './hooks';
2
+ import { useScrollToActiveElement } from '../useScrollToActiveElement';
3
3
  import { Container, Divider, StyledTabs, Wrapper } from './styles';
4
4
  export const Tabs = ({ ...tabsProps }) => {
5
- const { containerRef } = useScrollToActiveTab();
5
+ const { containerRef } = useScrollToActiveElement();
6
6
  return (_jsx(Container, { children: _jsxs(Wrapper, { children: [_jsx(StyledTabs, { ...tabsProps, ref: containerRef }), _jsx(Divider, {})] }) }));
7
7
  };
@@ -1 +1 @@
1
- export * from './useScrollToActiveTab';
1
+ export * from '../../useScrollToActiveElement';
@@ -1 +1 @@
1
- export * from './useScrollToActiveTab';
1
+ export * from '../../useScrollToActiveElement';
@@ -0,0 +1 @@
1
+ export * from './useScrollToActiveElement';
@@ -0,0 +1 @@
1
+ export * from './useScrollToActiveElement';
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ export type UseScrollToActiveElementParams = {
3
+ behavior?: ScrollBehavior;
4
+ block?: ScrollLogicalPosition;
5
+ inline?: ScrollLogicalPosition;
6
+ };
7
+ export declare const useScrollToActiveElement: <T extends HTMLElement = HTMLDivElement>(params?: UseScrollToActiveElementParams) => {
8
+ containerRef: import("react").RefObject<T | null>;
9
+ };
@@ -0,0 +1,29 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useViewportType } from '../useViewportType';
3
+ export const useScrollToActiveElement = (params) => {
4
+ const { behavior = 'smooth', block = 'nearest', inline = 'nearest', } = params || {};
5
+ const containerRef = useRef(null);
6
+ const { isMobile } = useViewportType();
7
+ useEffect(() => {
8
+ if (!containerRef.current || !isMobile) {
9
+ return;
10
+ }
11
+ const container = containerRef.current;
12
+ const performScroll = () => {
13
+ const activeItem = container.querySelector('[aria-selected="true"]');
14
+ if (activeItem) {
15
+ activeItem.scrollIntoView({
16
+ behavior,
17
+ block,
18
+ inline,
19
+ });
20
+ }
21
+ };
22
+ if (document.fonts) {
23
+ document.fonts.ready.then(() => {
24
+ performScroll();
25
+ });
26
+ }
27
+ }, []);
28
+ return { containerRef };
29
+ };
@@ -73,7 +73,9 @@ exports.HeaderSection = styled_1.styled.div `
73
73
  align-items: center;
74
74
 
75
75
  ${({ theme }) => theme.breakpoints.down('sm')} {
76
- flex-grow: 1;
76
+ flex-shrink: 0;
77
+
78
+ min-width: 0;
77
79
  }
78
80
  `;
79
81
  exports.HeaderContentSection = (0, styled_1.styled)(exports.HeaderSection) `
@@ -81,6 +83,8 @@ exports.HeaderContentSection = (0, styled_1.styled)(exports.HeaderSection) `
81
83
  justify-content: flex-end;
82
84
 
83
85
  ${({ theme }) => theme.breakpoints.down('sm')} {
86
+ flex-grow: 1;
87
+ flex-shrink: unset;
84
88
  gap: ${({ theme }) => theme.spacing(2)};
85
89
 
86
90
  &.${constants_6.dashboardLayoutHeaderClassnames.priorityFeatureMenuOrg} {
@@ -122,6 +126,7 @@ exports.HeaderContent = styled_1.styled.div `
122
126
  justify-content: space-between;
123
127
 
124
128
  ${({ theme }) => theme.breakpoints.down('sm')} {
129
+ width: 100%;
125
130
  padding: 0;
126
131
  }
127
132
  `;
@@ -130,6 +135,17 @@ exports.HeaderContent = styled_1.styled.div `
130
135
  */
131
136
  exports.PriorityFeatureWrapper = styled_1.styled.div `
132
137
  ${({ theme }) => theme.breakpoints.down('sm')} {
138
+ display: flex;
139
+ justify-content: flex-end;
140
+
141
+ min-width: 0;
142
+
143
+ &.${constants_6.dashboardLayoutHeaderClassnames.priorityFeatureMenuOrg} {
144
+ & .${constants_1.menuOrganizationClassnames.button} {
145
+ padding: ${({ theme }) => theme.spacing(2, 0)};
146
+ }
147
+ }
148
+
133
149
  &.${constants_6.dashboardLayoutHeaderClassnames.featureInSidebar} {
134
150
  position: absolute;
135
151
  z-index: ${({ theme }) => theme.zIndex.appBar - 1};
@@ -191,6 +207,10 @@ exports.PriorityFeatureWrapper = styled_1.styled.div `
191
207
  }
192
208
 
193
209
  &.${constants_6.dashboardLayoutHeaderClassnames.priorityFeatureMenuOrg} {
210
+ & .${constants_1.menuOrganizationClassnames.button} {
211
+ padding: ${({ theme }) => theme.spacing(2, 0)};
212
+ }
213
+
194
214
  & .${constants_6.dashboardLayoutHeaderClassnames.profile} {
195
215
  display: block;
196
216
  flex-grow: 1;
@@ -30,6 +30,7 @@ exports.StyledButton = (0, styled_1.styled)(Button_1.Button) `
30
30
  justify-content: space-between;
31
31
 
32
32
  width: 100%;
33
+ min-width: unset;
33
34
  max-width: unset;
34
35
 
35
36
  border-radius: 0;
@@ -51,6 +52,8 @@ exports.Container = styled_1.styled.div `
51
52
  display: flex;
52
53
  flex-direction: column;
53
54
 
55
+ /* Позволяет элементу сжиматься до ширины контейнера */
56
+ min-width: 0;
54
57
  max-width: 260px;
55
58
  `;
56
59
  exports.StyledTypography = (0, styled_1.styled)(Typography_1.Typography, {
@@ -0,0 +1,6 @@
1
+ import { type ReactNode } from 'react';
2
+ type MobileAsideButtonProps = {
3
+ content?: ReactNode;
4
+ };
5
+ export declare const MobileAsideButton: ({ content }: MobileAsideButtonProps) => import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MobileAsideButton = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ChevronDOutlineMd_1 = require("../../../icons/ChevronDOutlineMd");
6
+ const useToggle_1 = require("../../useToggle");
7
+ const styles_1 = require("./styles");
8
+ const MobileAsideButton = ({ content }) => {
9
+ const [isDrawerOpen, handleOpenDrawer, handleCloseDrawer] = (0, useToggle_1.useToggle)({
10
+ initialState: false,
11
+ });
12
+ if (!content) {
13
+ return null;
14
+ }
15
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(styles_1.StyledButton, { variant: "outlined", color: "grey", endIcon: (0, jsx_runtime_1.jsx)(ChevronDOutlineMd_1.ChevronDOutlineMd, {}), onClick: handleOpenDrawer, children: "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F" }), (0, jsx_runtime_1.jsx)(styles_1.StyledBottomDrawer, { title: "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F", open: isDrawerOpen, onClose: handleCloseDrawer, children: (0, jsx_runtime_1.jsx)(styles_1.DrawerContent, { children: content }) })] }));
16
+ };
17
+ exports.MobileAsideButton = MobileAsideButton;
@@ -0,0 +1 @@
1
+ export { MobileAsideButton } from './MobileAsideButton';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MobileAsideButton = void 0;
4
+ var MobileAsideButton_1 = require("./MobileAsideButton");
5
+ Object.defineProperty(exports, "MobileAsideButton", { enumerable: true, get: function () { return MobileAsideButton_1.MobileAsideButton; } });
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ export declare const StyledButton: import("@emotion/styled/dist/declarations/src/types").StyledComponent<Omit<import("../..").WithoutEmotionSpecific<import("@mui/material").ButtonProps>, "color" | "component" | "size" | "variant" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple"> & {
3
+ variant?: "light" | "link" | "text" | "contained" | "outlined" | undefined;
4
+ loading?: boolean | undefined;
5
+ color?: "primary" | "success" | "warning" | "error" | "grey" | undefined;
6
+ component?: import("react").ElementType | undefined;
7
+ selected?: boolean | undefined;
8
+ size?: "large" | "medium" | undefined;
9
+ } & Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, ""> & import("react").RefAttributes<HTMLButtonElement> & {
10
+ theme?: import("@emotion/react").Theme | undefined;
11
+ }, {}, {}>;
12
+ export declare const DrawerContent: import("@emotion/styled/dist/declarations/src/types").StyledComponent<{
13
+ theme?: import("@emotion/react").Theme | undefined;
14
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
15
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
16
+ export declare const StyledBottomDrawer: import("@emotion/styled/dist/declarations/src/types").StyledComponent<{
17
+ title?: string | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>[] | undefined;
18
+ drawerHeaderHeight?: number | undefined;
19
+ headerContent?: import("react").ReactNode;
20
+ } & import("../..").WithoutEmotionSpecific<Omit<import("@mui/material").DrawerProps, "title" | "anchor" | "variant">> & {
21
+ theme?: import("@emotion/react").Theme | undefined;
22
+ }, {}, {}>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StyledBottomDrawer = exports.DrawerContent = exports.StyledButton = void 0;
4
+ const material_1 = require("@mui/material");
5
+ const BottomDrawer_1 = require("../../BottomDrawer");
6
+ const constants_1 = require("../../BottomDrawer/constants");
7
+ const Button_1 = require("../../Button");
8
+ const styled_1 = require("../../styled");
9
+ exports.StyledButton = (0, styled_1.styled)(Button_1.Button) `
10
+ display: none;
11
+
12
+ ${({ theme }) => theme.breakpoints.down('sm')} {
13
+ display: flex;
14
+ order: 3;
15
+
16
+ margin: ${({ theme }) => theme.spacing(0, 4, 4)};
17
+
18
+ background-color: ${({ theme }) => theme.palette.background.default};
19
+ }
20
+ `;
21
+ exports.DrawerContent = styled_1.styled.div `
22
+ padding: ${({ theme }) => theme.spacing(4)};
23
+ `;
24
+ exports.StyledBottomDrawer = (0, styled_1.styled)(BottomDrawer_1.BottomDrawer) `
25
+ & .${material_1.paperClasses.root} {
26
+ height: calc(100vh - ${constants_1.OFFSET_TOP_SCREEN});
27
+
28
+ /* Причина игнора: прогрессивное улучшение */
29
+ /* stylelint-disable plugin/no-unsupported-browser-features */
30
+ @supports (height: 100dvh) {
31
+ height: calc(100dvh - ${constants_1.OFFSET_TOP_SCREEN});
32
+ }
33
+ }
34
+ `;
@@ -1,9 +1,2 @@
1
- import { type ReactNode } from 'react';
2
- export type PageAsideProps = {
3
- children: ReactNode;
4
- /**
5
- * Название класса, применяется к корневому компоненту
6
- */
7
- className?: string;
8
- };
9
- export declare const PageAside: ({ children, className }: PageAsideProps) => import("react/jsx-runtime").JSX.Element;
1
+ import { type PageAsideProps } from './types';
2
+ export declare const PageAside: ({ children, className, header, navigation, }: PageAsideProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,8 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PageAside = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_dom_1 = require("react-dom");
6
+ const classNames_1 = require("../utils/classNames");
7
+ const cva_1 = require("../utils/cva");
8
+ const constants_1 = require("./constants");
9
+ const hooks_1 = require("./hooks");
10
+ const MobileAsideButton_1 = require("./MobileAsideButton");
5
11
  const styles_1 = require("./styles");
6
- const PageAside = ({ children, className }) => {
7
- return (0, jsx_runtime_1.jsx)(styles_1.Wrapper, { className: className, children: children });
12
+ const asideCva = (0, cva_1.cva)(constants_1.pageAsideClassnames.root, {
13
+ variants: {
14
+ withHeader: {
15
+ true: constants_1.pageAsideClassnames.withHeader,
16
+ },
17
+ },
18
+ });
19
+ const PageAside = ({ children, className, header, navigation, }) => {
20
+ const { pageHeaderContainer, isMobileNavigationVisible } = (0, hooks_1.usePageAside)({
21
+ navigation,
22
+ });
23
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [isMobileNavigationVisible &&
24
+ (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)(styles_1.MobileAsideNavigation, { className: constants_1.pageAsideClassnames.mobileNavigation, children: navigation }), pageHeaderContainer), header && (0, jsx_runtime_1.jsx)(styles_1.MobileAsideHeader, { children: header }), (0, jsx_runtime_1.jsx)(MobileAsideButton_1.MobileAsideButton, { content: children }), (0, jsx_runtime_1.jsxs)(styles_1.Wrapper, { className: (0, classNames_1.classNames)(className, asideCva({ withHeader: Boolean(header) })), children: [header && ((0, jsx_runtime_1.jsxs)(styles_1.AsideHeader, { children: [header, (0, jsx_runtime_1.jsx)(styles_1.StyledDivider, {})] })), navigation, children] })] }));
8
25
  };
9
26
  exports.PageAside = PageAside;
@@ -1 +1,6 @@
1
1
  export declare const PAGE_ASIDE_WIDTH = "320px";
2
+ export declare const pageAsideClassnames: {
3
+ mobileNavigation: string;
4
+ withHeader: string;
5
+ root: string;
6
+ };