@astral/ui 4.71.4 → 4.73.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 (158) hide show
  1. package/components/PageAside/MobileAsideButton/MobileAsideButton.d.ts +6 -0
  2. package/components/PageAside/MobileAsideButton/MobileAsideButton.js +13 -0
  3. package/components/PageAside/MobileAsideButton/index.d.ts +1 -0
  4. package/components/PageAside/MobileAsideButton/index.js +1 -0
  5. package/components/PageAside/MobileAsideButton/styles.d.ts +22 -0
  6. package/components/PageAside/MobileAsideButton/styles.js +31 -0
  7. package/components/PageAside/PageAside.d.ts +2 -9
  8. package/components/PageAside/PageAside.js +21 -4
  9. package/components/PageAside/constants.d.ts +5 -0
  10. package/components/PageAside/constants.js +6 -0
  11. package/components/PageAside/hooks/index.d.ts +1 -0
  12. package/components/PageAside/hooks/index.js +1 -0
  13. package/components/PageAside/hooks/usePageAside/index.d.ts +1 -0
  14. package/components/PageAside/hooks/usePageAside/index.js +1 -0
  15. package/components/PageAside/hooks/usePageAside/usePageAside.d.ts +9 -0
  16. package/components/PageAside/hooks/usePageAside/usePageAside.js +17 -0
  17. package/components/PageAside/index.d.ts +4 -0
  18. package/components/PageAside/index.js +3 -0
  19. package/components/PageAside/public.d.ts +3 -1
  20. package/components/PageAside/public.js +1 -0
  21. package/components/PageAside/styles.d.ts +15 -0
  22. package/components/PageAside/styles.js +36 -7
  23. package/components/PageAside/types.d.ts +24 -0
  24. package/components/PageAside/types.js +1 -0
  25. package/components/PageAsideBlock/styles.js +2 -2
  26. package/components/PageAsideNavigation/PageAsideNavigation.d.ts +2 -0
  27. package/components/PageAsideNavigation/PageAsideNavigation.js +9 -0
  28. package/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.d.ts +18 -0
  29. package/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.js +18 -0
  30. package/components/PageAsideNavigation/PageAsideNavigationItem/constants.d.ts +4 -0
  31. package/components/PageAsideNavigation/PageAsideNavigationItem/constants.js +5 -0
  32. package/components/PageAsideNavigation/PageAsideNavigationItem/index.d.ts +3 -0
  33. package/components/PageAsideNavigation/PageAsideNavigationItem/index.js +2 -0
  34. package/components/PageAsideNavigation/PageAsideNavigationItem/styles.d.ts +9 -0
  35. package/components/PageAsideNavigation/PageAsideNavigationItem/styles.js +113 -0
  36. package/components/PageAsideNavigation/PageAsideNavigationItem/types.d.ts +26 -0
  37. package/components/PageAsideNavigation/PageAsideNavigationItem/types.js +1 -0
  38. package/components/PageAsideNavigation/constants.d.ts +3 -0
  39. package/components/PageAsideNavigation/constants.js +4 -0
  40. package/components/PageAsideNavigation/index.d.ts +4 -0
  41. package/components/PageAsideNavigation/index.js +3 -0
  42. package/components/PageAsideNavigation/public.d.ts +3 -0
  43. package/components/PageAsideNavigation/public.js +3 -0
  44. package/components/PageAsideNavigation/styles.d.ts +13 -0
  45. package/components/PageAsideNavigation/styles.js +48 -0
  46. package/components/PageAsideNavigation/types.d.ts +17 -0
  47. package/components/PageAsideNavigation/types.js +1 -0
  48. package/components/PageContent/PageContentHeader/Description/Description.d.ts +2 -1
  49. package/components/PageContent/PageContentHeader/Description/Description.js +4 -4
  50. package/components/PageContent/PageContentHeader/PageContentHeader.js +2 -1
  51. package/components/PageContent/PageContentHeader/constants.d.ts +4 -0
  52. package/components/PageContent/PageContentHeader/constants.js +5 -0
  53. package/components/PageContent/PageContentHeader/styles.js +7 -0
  54. package/components/PageHeader/HeaderContent/styles.js +0 -2
  55. package/components/PageHeader/PageHeader.js +11 -1
  56. package/components/PageHeader/styles.js +7 -5
  57. package/components/PagePinnableAside/PagePinnableAside.d.ts +1 -1
  58. package/components/PagePinnableAside/PagePinnableAside.js +16 -4
  59. package/components/PagePinnableAside/constants.d.ts +2 -0
  60. package/components/PagePinnableAside/constants.js +2 -0
  61. package/components/PagePinnableAside/styles.js +8 -11
  62. package/components/PagePinnableAside/types.d.ts +17 -1
  63. package/components/PagePinnableAside/useLogic/useLogic.d.ts +4 -2
  64. package/components/PagePinnableAside/useLogic/useLogic.js +10 -2
  65. package/components/Tabs/Tabs.js +2 -2
  66. package/components/Tabs/hooks/index.d.ts +1 -1
  67. package/components/Tabs/hooks/index.js +1 -1
  68. package/components/useScrollToActiveElement/index.d.ts +1 -0
  69. package/components/useScrollToActiveElement/index.js +1 -0
  70. package/components/useScrollToActiveElement/useScrollToActiveElement.d.ts +9 -0
  71. package/components/useScrollToActiveElement/useScrollToActiveElement.js +29 -0
  72. package/node/components/PageAside/MobileAsideButton/MobileAsideButton.d.ts +6 -0
  73. package/node/components/PageAside/MobileAsideButton/MobileAsideButton.js +17 -0
  74. package/node/components/PageAside/MobileAsideButton/index.d.ts +1 -0
  75. package/node/components/PageAside/MobileAsideButton/index.js +5 -0
  76. package/node/components/PageAside/MobileAsideButton/styles.d.ts +22 -0
  77. package/node/components/PageAside/MobileAsideButton/styles.js +34 -0
  78. package/node/components/PageAside/PageAside.d.ts +2 -9
  79. package/node/components/PageAside/PageAside.js +19 -2
  80. package/node/components/PageAside/constants.d.ts +5 -0
  81. package/node/components/PageAside/constants.js +7 -1
  82. package/node/components/PageAside/hooks/index.d.ts +1 -0
  83. package/node/components/{Tabs/hooks/useScrollToActiveTab → PageAside/hooks}/index.js +1 -1
  84. package/node/components/PageAside/hooks/usePageAside/index.d.ts +1 -0
  85. package/node/components/PageAside/hooks/usePageAside/index.js +17 -0
  86. package/node/components/PageAside/hooks/usePageAside/usePageAside.d.ts +9 -0
  87. package/node/components/PageAside/hooks/usePageAside/usePageAside.js +21 -0
  88. package/node/components/PageAside/index.d.ts +4 -0
  89. package/node/components/PageAside/index.js +7 -1
  90. package/node/components/PageAside/public.d.ts +3 -1
  91. package/node/components/PageAside/public.js +3 -1
  92. package/node/components/PageAside/styles.d.ts +15 -0
  93. package/node/components/PageAside/styles.js +38 -9
  94. package/node/components/PageAside/types.d.ts +24 -0
  95. package/node/components/PageAside/types.js +2 -0
  96. package/node/components/PageAsideBlock/styles.js +2 -2
  97. package/node/components/PageAsideNavigation/PageAsideNavigation.d.ts +2 -0
  98. package/node/components/PageAsideNavigation/PageAsideNavigation.js +13 -0
  99. package/node/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.d.ts +18 -0
  100. package/node/components/PageAsideNavigation/PageAsideNavigationItem/PageAsideNavigationItem.js +22 -0
  101. package/node/components/PageAsideNavigation/PageAsideNavigationItem/constants.d.ts +4 -0
  102. package/node/components/PageAsideNavigation/PageAsideNavigationItem/constants.js +8 -0
  103. package/node/components/PageAsideNavigation/PageAsideNavigationItem/index.d.ts +3 -0
  104. package/node/components/PageAsideNavigation/PageAsideNavigationItem/index.js +7 -0
  105. package/node/components/PageAsideNavigation/PageAsideNavigationItem/styles.d.ts +9 -0
  106. package/node/components/PageAsideNavigation/PageAsideNavigationItem/styles.js +116 -0
  107. package/node/components/PageAsideNavigation/PageAsideNavigationItem/types.d.ts +26 -0
  108. package/node/components/PageAsideNavigation/PageAsideNavigationItem/types.js +2 -0
  109. package/node/components/PageAsideNavigation/constants.d.ts +3 -0
  110. package/node/components/PageAsideNavigation/constants.js +7 -0
  111. package/node/components/PageAsideNavigation/index.d.ts +4 -0
  112. package/node/components/PageAsideNavigation/index.js +10 -0
  113. package/node/components/PageAsideNavigation/public.d.ts +3 -0
  114. package/node/components/PageAsideNavigation/public.js +10 -0
  115. package/node/components/PageAsideNavigation/styles.d.ts +13 -0
  116. package/node/components/PageAsideNavigation/styles.js +51 -0
  117. package/node/components/PageAsideNavigation/types.d.ts +17 -0
  118. package/node/components/PageAsideNavigation/types.js +2 -0
  119. package/node/components/PageContent/PageContentHeader/Description/Description.d.ts +2 -1
  120. package/node/components/PageContent/PageContentHeader/Description/Description.js +4 -4
  121. package/node/components/PageContent/PageContentHeader/PageContentHeader.js +2 -1
  122. package/node/components/PageContent/PageContentHeader/constants.d.ts +4 -0
  123. package/node/components/PageContent/PageContentHeader/constants.js +8 -0
  124. package/node/components/PageContent/PageContentHeader/styles.js +7 -0
  125. package/node/components/PageHeader/HeaderContent/styles.js +0 -2
  126. package/node/components/PageHeader/PageHeader.js +11 -1
  127. package/node/components/PageHeader/styles.js +18 -16
  128. package/node/components/PagePinnableAside/PagePinnableAside.d.ts +1 -1
  129. package/node/components/PagePinnableAside/PagePinnableAside.js +16 -4
  130. package/node/components/PagePinnableAside/constants.d.ts +2 -0
  131. package/node/components/PagePinnableAside/constants.js +2 -0
  132. package/node/components/PagePinnableAside/styles.js +10 -13
  133. package/node/components/PagePinnableAside/types.d.ts +17 -1
  134. package/node/components/PagePinnableAside/useLogic/useLogic.d.ts +4 -2
  135. package/node/components/PagePinnableAside/useLogic/useLogic.js +10 -2
  136. package/node/components/Tabs/Tabs.js +2 -2
  137. package/node/components/Tabs/hooks/index.d.ts +1 -1
  138. package/node/components/Tabs/hooks/index.js +1 -1
  139. package/node/components/useScrollToActiveElement/index.d.ts +1 -0
  140. package/node/components/useScrollToActiveElement/index.js +17 -0
  141. package/node/components/useScrollToActiveElement/useScrollToActiveElement.d.ts +9 -0
  142. package/node/components/useScrollToActiveElement/useScrollToActiveElement.js +33 -0
  143. package/package.json +1 -1
  144. package/components/DashboardLayout/Sidebar/MenuSidebarButton/types.d.ts +0 -0
  145. package/components/DashboardLayout/Sidebar/MenuSidebarButton/types.js +0 -1
  146. package/components/DashboardLayout/Sidebar/Sidebar.d.ts +0 -0
  147. package/components/DashboardLayout/Sidebar/Sidebar.js +0 -1
  148. package/components/Tabs/hooks/useScrollToActiveTab/index.d.ts +0 -1
  149. package/components/Tabs/hooks/useScrollToActiveTab/index.js +0 -1
  150. package/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.d.ts +0 -4
  151. package/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.js +0 -24
  152. package/node/components/DashboardLayout/Sidebar/MenuSidebarButton/types.d.ts +0 -0
  153. package/node/components/DashboardLayout/Sidebar/MenuSidebarButton/types.js +0 -1
  154. package/node/components/DashboardLayout/Sidebar/Sidebar.d.ts +0 -0
  155. package/node/components/DashboardLayout/Sidebar/Sidebar.js +0 -1
  156. package/node/components/Tabs/hooks/useScrollToActiveTab/index.d.ts +0 -1
  157. package/node/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.d.ts +0 -4
  158. package/node/components/Tabs/hooks/useScrollToActiveTab/useScrollToActiveTab.js +0 -28
@@ -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 {};
@@ -2,6 +2,7 @@ import { type ReactNode } from 'react';
2
2
  type DescriptionProps = {
3
3
  description?: ReactNode;
4
4
  isLoading?: boolean;
5
+ className?: string;
5
6
  };
6
- export declare const Description: ({ description, isLoading }: DescriptionProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Description: ({ className, description, isLoading, }: DescriptionProps) => import("react/jsx-runtime").JSX.Element;
7
8
  export {};
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Skeleton } from '../../../Skeleton';
3
3
  import { Typography } from '../../../Typography';
4
- export const Description = ({ description, isLoading }) => {
4
+ export const Description = ({ className, description, isLoading, }) => {
5
5
  if (!description && isLoading) {
6
- return _jsx(Skeleton, { height: 20, width: 300 });
6
+ return _jsx(Skeleton, { className: className, height: 20, width: 300 });
7
7
  }
8
8
  if (typeof description === 'string') {
9
- return _jsx(Typography, { variant: "body1", children: description });
9
+ return (_jsx(Typography, { className: className, variant: "body1", children: description }));
10
10
  }
11
- return (_jsx(Typography, { component: "div", variant: "body1", children: description }));
11
+ return (_jsx(Typography, { className: className, component: "div", variant: "body1", children: description }));
12
12
  };
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { pageContentHeaderClassnames } from './constants';
2
3
  import { Description } from './Description';
3
4
  import { TitleBlock, Wrapper } from './styles';
4
5
  import { Title } from './Title';
5
6
  export const PageContentHeader = ({ title, description, actions, children, isLoading, }) => {
6
- return (_jsxs(Wrapper, { children: [_jsxs(TitleBlock, { children: [_jsx(Title, { title: title, isLoading: isLoading, children: children }), _jsx(Description, { description: description, isLoading: isLoading })] }), actions && actions] }));
7
+ return (_jsxs(Wrapper, { className: pageContentHeaderClassnames.pageContentHeader, children: [_jsxs(TitleBlock, { children: [_jsx(Title, { title: title, isLoading: isLoading, children: children }), _jsx(Description, { className: pageContentHeaderClassnames.description, description: description, isLoading: isLoading })] }), actions && actions] }));
7
8
  };
@@ -0,0 +1,4 @@
1
+ export declare const pageContentHeaderClassnames: {
2
+ pageContentHeader: string;
3
+ description: string;
4
+ };
@@ -0,0 +1,5 @@
1
+ import { createUIKitClassname } from '../../utils/createUIKitClassname';
2
+ export const pageContentHeaderClassnames = {
3
+ pageContentHeader: createUIKitClassname('page-content-header'),
4
+ description: createUIKitClassname('page-content-header__description'),
5
+ };
@@ -1,4 +1,5 @@
1
1
  import { styled } from '../../styled';
2
+ import { pageContentHeaderClassnames } from './constants';
2
3
  export const Wrapper = styled.header `
3
4
  display: flex;
4
5
  gap: ${({ theme }) => theme.spacing(2)};
@@ -23,4 +24,10 @@ export const TitleBlock = styled.div `
23
24
  overflow: hidden;
24
25
  display: flex;
25
26
  flex-direction: column;
27
+
28
+ ${({ theme }) => theme.breakpoints.down('sm')} {
29
+ & .${pageContentHeaderClassnames.description} {
30
+ display: none;
31
+ }
32
+ }
26
33
  `;
@@ -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
+ };
@@ -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
+ };
@@ -1,4 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PAGE_ASIDE_WIDTH = void 0;
3
+ exports.pageAsideClassnames = exports.PAGE_ASIDE_WIDTH = void 0;
4
+ const createUIKitClassname_1 = require("../utils/createUIKitClassname");
4
5
  exports.PAGE_ASIDE_WIDTH = '320px';
6
+ exports.pageAsideClassnames = {
7
+ mobileNavigation: (0, createUIKitClassname_1.createUIKitClassname)('page-aside__mobile-navigation'),
8
+ withHeader: (0, createUIKitClassname_1.createUIKitClassname)('page-aside_with-header'),
9
+ root: (0, createUIKitClassname_1.createUIKitClassname)('page-aside'),
10
+ };
@@ -0,0 +1 @@
1
+ export * from './usePageAside';
@@ -14,4 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./useScrollToActiveTab"), exports);
17
+ __exportStar(require("./usePageAside"), exports);
@@ -0,0 +1 @@
1
+ export * from './usePageAside';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./usePageAside"), exports);