diff --git a/MIGRATION_GUIDE_v5.md b/MIGRATION_GUIDE_v5.md index 12b2d31c..32767eb1 100644 --- a/MIGRATION_GUIDE_v5.md +++ b/MIGRATION_GUIDE_v5.md @@ -90,3 +90,107 @@ The following variables have been replaced with zone-specific alternatives: 2. **Footer icons**: Replace `--gn-aside-header-general-item-icon-color` with `--gn-aside-bottom-item-icon-color` 3. **Subheader current icons**: Replace `--gn-aside-header-item-current-icon-color` with `--gn-aside-top-item-current-icon-color` 4. **Footer current icons**: Replace `--gn-aside-header-item-current-icon-color` with `--gn-aside-bottom-item-current-icon-color` + +## Breaking Changes: Prop Renaming (`compact` → `pinned`/`isExpanded`) + +The `compact` prop and related APIs have been renamed to use clearer semantics with **inverted boolean logic**. + +### Main Prop Changes + +| Old Prop/Parameter | New Prop/Parameter | Notes | +| --------------------------------------------- | ------------------------------------------ | ----------------------------------------------- | +| `compact: boolean` | `pinned: boolean` | **Inverted!** `compact: true` → `pinned: false` | +| `onChangeCompact` | `onChangePinned` | Callback receives inverted value | +| `AsideHeaderItem.compact` | `AsideHeaderItem.isExpanded` | Used by `FooterItem` | +| `renderFooter({ compact })` | `renderFooter({ isExpanded })` | Parameter renamed (AsideHeader) | +| `collapseButtonWrapper(_, { compact })` | `collapseButtonWrapper(_, { isExpanded })` | Parameter renamed | +| `MenuItem.itemWrapper opts.compact` | `MenuItem.itemWrapper opts.pinned` | In itemWrapper callback | +| `LogoProps.wrapper(_, compact)` | `LogoProps.wrapper(_, isExpanded)` | Second parameter renamed | +| `MobileLogoProps.compact` | `MobileLogoProps.isExpanded` | MobileLogo prop renamed | +| `BurgerMenuProps.renderFooter({ isCompact })` | `renderFooter({ isExpanded })` | MobileHeader burger menu | + +### Context Changes + +The `AsideHeaderContext` has been updated: + +```typescript +// Before (v4.x) +interface AsideHeaderContextType { + compact: boolean; + onChangeCompact?: (compact: boolean) => void; + // ... +} + +// After (v5.0) +interface AsideHeaderContextType { + pinned: boolean; // Note: inverted semantics! + onChangePinned?: (pinned: boolean) => void; + // ... +} +``` + +### Migration Examples + +**AsideHeader component:** + +```tsx +// Before (v4.x) + + +// After (v5.0) + +``` + +**FooterItem component:** + +```tsx +// Before (v4.x) + + +// After (v5.0) + +``` + +**renderFooter callback:** + +```tsx +// Before (v4.x) +renderFooter={({ compact }) => ( + +)} + +// After (v5.0) +renderFooter={({ isExpanded }) => ( + +)} +``` + +**Logo wrapper:** + +```tsx +// Before (v4.x) +logo={{ + wrapper: (node, compact) => {node} +}} + +// After (v5.0) +logo={{ + wrapper: (node, isExpanded) => {node} +}} +``` + +**itemWrapper callback:** + +```tsx +// Before (v4.x) +itemWrapper={(params, makeItem, { compact }) => makeItem(params)} + +// After (v5.0) +itemWrapper={(params, makeItem, { pinned }) => makeItem(params)} +``` diff --git a/src/components/AsideHeader/AsideHeader.module.scss b/src/components/AsideHeader/AsideHeader.module.scss index 4f9f19cc..628791e8 100644 --- a/src/components/AsideHeader/AsideHeader.module.scss +++ b/src/components/AsideHeader/AsideHeader.module.scss @@ -104,7 +104,7 @@ $block: '.#{variables.$ns}aside-header'; } } - &_compact &__aside { + &_collapsed &__aside { background-color: var( --gn-aside-header-collapsed-background-color, var(--gn-aside-header-background-color, var(--_--background-color)) @@ -198,13 +198,13 @@ $block: '.#{variables.$ns}aside-header'; } } - &_compact &__header { + &_collapsed &__header { &::before { display: block; } } - &_compact &__header_with-decoration { + &_collapsed &__header_with-decoration { #{$class}__header-divider { display: block; } @@ -293,7 +293,7 @@ $block: '.#{variables.$ns}aside-header'; &__pin-button { margin-left: auto; - &_compact { + &_collapsed { margin-right: auto; } } diff --git a/src/components/AsideHeader/AsideHeader.tsx b/src/components/AsideHeader/AsideHeader.tsx index a9c01526..220be93f 100644 --- a/src/components/AsideHeader/AsideHeader.tsx +++ b/src/components/AsideHeader/AsideHeader.tsx @@ -5,11 +5,11 @@ import {PageLayoutAside} from './components/PageLayout/PageLayoutAside'; import {AsideHeaderProps} from './types'; export const AsideHeader = React.forwardRef( - ({compact, className, topAlert, ...props}, ref) => { + ({pinned, className, topAlert, ...props}, ref) => { return ( diff --git a/src/components/AsideHeader/AsideHeaderContext.ts b/src/components/AsideHeader/AsideHeaderContext.ts index 8339027c..b211b8fb 100644 --- a/src/components/AsideHeader/AsideHeaderContext.ts +++ b/src/components/AsideHeader/AsideHeaderContext.ts @@ -39,19 +39,20 @@ export const useAsideHeaderInnerContext = (): AsideHeaderInnerContextType => { }; export interface AsideHeaderContextType { - compact: boolean; + /** Navigation visual state. When `true`, the navigation is expanded (pinned open). When `false`, it is collapsed. */ + pinned: boolean; size: number; isExpanded: boolean; - onChangeCompact?: (compact: boolean) => void; + onChangePinned?: (pinned: boolean) => void; onExpand?: () => void; onFold?: () => void; } const AsideHeaderContext = React.createContext({ - compact: false, + pinned: true, size: 0, isExpanded: false, - onChangeCompact: () => {}, + onChangePinned: () => {}, onExpand: () => {}, onFold: () => {}, }); diff --git a/src/components/AsideHeader/README-ru.md b/src/components/AsideHeader/README-ru.md index ce412f70..859d76f5 100644 --- a/src/components/AsideHeader/README-ru.md +++ b/src/components/AsideHeader/README-ru.md @@ -22,7 +22,7 @@ import {AsideHeader} from '@gravity-ui/navigation'; ### Состояние Компонент имеет два состояния: свернутое и развернутое. -Управлять состоянием можно через свойства `compact` и `onChangeCompact`, а видимостью кнопки — через `hideCollapseButton`. +Управлять состоянием можно через свойства `pinned` и `onChangePinned`, а видимостью кнопки — через `hideCollapseButton`. ### Оформление верхнего блока @@ -162,34 +162,34 @@ export const Aside: FC = () => { ## Свойства -| Имя | Описание | Тип | Значение по умолчанию | -| :------------------------ | :--------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------: | -| className | HTML-атрибут `class` для логотипа. | `string` | | -| collapseButtonWrapper | Обертка для `CollapseButton`, позволяющая кастомизировать вид дефолтной кнопки. | `(defaultButton: React.ReactNode, data: {compact: boolean; onChangeCompact?: (compact: boolean) => void}) => React.ReactNode` | | -| collapseTitle | Заголовок `CollapseButton` для сворачивания элемента навигации. | `string` | `"Свернуть"` `"Collapse"` | -| compact | Визуальное состояние элемента навигации. | `boolean` | `false` | -| customBackground | Фон `AsideHeader`. | `React.ReactNode` | | -| customBackgroundClassName | Переопределяет стили контейнера фона по умолчанию. | `string` | | -| expandTitle | Заголовок `CollapseButton` для разворачивания элемента навигации. | `string` | `"Развернуть"` `"Expand"` | -| headerDecoration | Цвет фона верхнего блока с элементами логотипа и подзаголовка. | `boolean` | `false` | -| hideCollapseButton | Скрывает `CollapseButton`. Для установки дефолтного состояния элемента навигации используйте свойство `compact`. | `boolean` | `false` | -| logo | Контейнер логотипа, включающий иконку с заголовком и обрабатывающий клики. | [`Logo`](./../Logo/Readme.md#logo) | | -| menuItems | Элементы в среднем блоке навигации. | `Array` | `[]` | -| menuMoreTitle | Дополнительный заголовок для `menuItems`, если элементы не помещаются. | `string` | `"Ещё"` `"More"` | -| multipleTooltip | Отображает несколько тултипов при наведении на элементы меню (`menuItems`) в свернутом состоянии. | `boolean` | `false` | -| onChangeCompact | Обратный вызов, срабатывающий при изменении визуального состояния элемента навигации. | `(compact: boolean) => void;` | | -| onClosePanel | Обратный вызов, срабатывающий при закрытии панели. Панели можно добавлять через свойство `PanelItems`. | `() => void;` | | -| onMenuItemsChanged | Обратный вызов, срабатывающий при изменении списка `menuItems` в `AllPagesPanel`. | `(items: Array) => void` | | -| onMenuMoreClick | Обратный вызов, срабатывающий при нажатии кнопки **More** («Еще»), если часть элементов скрыта. | `() => void;` | | -| onAllPagesClick | Обратный вызов, срабатывающий при нажатии кнопки **All pages** («Все станицы»). | `() => void;` | | -| openModalSubscriber | Функция для уведомления `AsideHeader` об изменении состояния видимости модальных окон. | `( (open: boolean) => void) => void` | | -| panelItems | Элементы компонента `Drawer`. Используется для отображения дополнительной информации поверх основного контента. | [`Array`](./../Drawer/README.md#draweritem-props) | `[]` | -| renderContent | Функция рендеринга основного контента справа от `AsideHeader`. | `(data: {size: number}) => React.ReactNode` | | -| renderFooter | Функция рендеринга нижнего блока навигации. | `(data: {size: number}) => React.ReactNode` | | -| ref | Ссылка на якорь целевого всплывающего окна. | `React.ForwardedRef` | | -| subheaderItems | Элементы, расположенные под логотипом в верхнем блоке навигации. | ` Array` | `[]` | -| topAlert | Контейнер над элементом навигации на основе компонента `Alert` из фреймворка UIKit. | `TopAlert` | | -| qa | Значение, которое будет передано в атрибут `data-qa` контейнера `AsideHeader`. | `string` | | +| Имя | Описание | Тип | Значение по умолчанию | +| :------------------------ | :-------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------: | :-----------------------: | +| className | HTML-атрибут `class` для логотипа. | `string` | | +| collapseButtonWrapper | Обертка для `CollapseButton`, позволяющая кастомизировать вид дефолтной кнопки. | `(defaultButton: React.ReactNode, data: {pinned: boolean; onChangePinned?: (pinned: boolean) => void}) => React.ReactNode` | | +| collapseTitle | Заголовок `CollapseButton` для сворачивания элемента навигации. | `string` | `"Свернуть"` `"Collapse"` | +| pinned | Визуальное состояние навигации. При `true` — развёрнуто (закреплено). | `boolean` | `false` | +| customBackground | Фон `AsideHeader`. | `React.ReactNode` | | +| customBackgroundClassName | Переопределяет стили контейнера фона по умолчанию. | `string` | | +| expandTitle | Заголовок `CollapseButton` для разворачивания элемента навигации. | `string` | `"Развернуть"` `"Expand"` | +| headerDecoration | Цвет фона верхнего блока с элементами логотипа и подзаголовка. | `boolean` | `false` | +| hideCollapseButton | Скрывает `CollapseButton`. Для установки дефолтного состояния элемента навигации используйте свойство `pinned`. | `boolean` | `false` | +| logo | Контейнер логотипа, включающий иконку с заголовком и обрабатывающий клики. | [`Logo`](./../Logo/Readme.md#logo) | | +| menuItems | Элементы в среднем блоке навигации. | `Array` | `[]` | +| menuMoreTitle | Дополнительный заголовок для `menuItems`, если элементы не помещаются. | `string` | `"Ещё"` `"More"` | +| multipleTooltip | Отображает несколько тултипов при наведении на элементы меню (`menuItems`) в свернутом состоянии. | `boolean` | `false` | +| onChangePinned | Обратный вызов, срабатывающий при изменении визуального состояния элемента навигации. | `(pinned: boolean) => void;` | | +| onClosePanel | Обратный вызов, срабатывающий при закрытии панели. Панели можно добавлять через свойство `PanelItems`. | `() => void;` | | +| onMenuItemsChanged | Обратный вызов, срабатывающий при изменении списка `menuItems` в `AllPagesPanel`. | `(items: Array) => void` | | +| onMenuMoreClick | Обратный вызов, срабатывающий при нажатии кнопки **More** («Еще»), если часть элементов скрыта. | `() => void;` | | +| onAllPagesClick | Обратный вызов, срабатывающий при нажатии кнопки **All pages** («Все станицы»). | `() => void;` | | +| openModalSubscriber | Функция для уведомления `AsideHeader` об изменении состояния видимости модальных окон. | `( (open: boolean) => void) => void` | | +| panelItems | Элементы компонента `Drawer`. Используется для отображения дополнительной информации поверх основного контента. | [`Array`](./../Drawer/README.md#draweritem-props) | `[]` | +| renderContent | Функция рендеринга основного контента справа от `AsideHeader`. | `(data: {size: number}) => React.ReactNode` | | +| renderFooter | Функция рендеринга нижнего блока навигации. | `(data: {size: number}) => React.ReactNode` | | +| ref | Ссылка на якорь целевого всплывающего окна. | `React.ForwardedRef` | | +| subheaderItems | Элементы, расположенные под логотипом в верхнем блоке навигации. | ` Array` | `[]` | +| topAlert | Контейнер над элементом навигации на основе компонента `Alert` из фреймворка UIKit. | `TopAlert` | | +| qa | Значение, которое будет передано в атрибут `data-qa` контейнера `AsideHeader`. | `string` | | ### `AsideHeaderItem` @@ -213,7 +213,7 @@ export const Aside: FC = () => { | qa | Значение, которое будет передано в атрибут `data-qa`. | `string` | | | enableTooltip | Отображать ли подсказку. | `boolean` | `true` | | bringForward | Отображать ли иконку поверх модальных окон. | `boolean` | | -| compact | Флаг, отвечающий за отображение элемента меню в компактном формате. | `boolean` | | +| pinned | При `true` — элемент отображается в развёрнутом (закреплённом) виде. | `boolean` | | | ~~popupVisible~~ | ⚠️ **Устарело**: Используйте `itemWrapper` для создания всплывающих окон. Флаг, отвечающий за отображение всплывающего окна. | `boolean` | `false` | | ~~popupRef~~ | ⚠️ **Устарело**: Используйте `itemWrapper` для создания всплывающих окон. Ссылка на якорный элемент для всплывающего окна. | `React.RefObject` | | | ~~popupPlacement~~ | ⚠️ **Устарело**: Используйте `itemWrapper` для создания всплывающих окон. Расположение всплывающего окна относительно компонента привязки. | [`PopupProps['placement']`](https://github.com/gravity-ui/uikit/blob/7748aaeec8dc7414487f7c06c899f16b275b25ef/src/components/Popup/Popup.tsx#L69) | | diff --git a/src/components/AsideHeader/README.md b/src/components/AsideHeader/README.md index 36f7e768..5f9ecc11 100644 --- a/src/components/AsideHeader/README.md +++ b/src/components/AsideHeader/README.md @@ -21,8 +21,8 @@ import {AsideHeader} from '@gravity-ui/navigation'; ### State -The component has two possible states: collapsed, expanded. -Уou can manage between states using `compact`, `onChangeCompact` props and also hide button with `hideCollapseButton`. +The component has two possible states: collapsed (unpinned), expanded (pinned). +You can manage between states using `pinned`, `onChangePinned` props and also hide button with `hideCollapseButton`. ### Top decoration @@ -163,34 +163,34 @@ export const Aside: FC = () => { ## Properties -| Name | Description | Type | Default | -| :------------------------ | :----------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------: | -| className | HTML `class` attribute of the Logo | `string` | | -| collapseButtonWrapper | Wrapper for `CollapseButton` allowing customization of the default button appearance | `(defaultButton: React.ReactNode, data: {compact: boolean; onChangeCompact?: (compact: boolean) => void}) => React.ReactNode` | | -| collapseTitle | `CollapseButton` title for collapsing navigation | `string` | `"Свернуть"` `"Collapse"` | -| compact | Navigation visual state | `boolean` | `false` | -| customBackground | `AsideHeader` background | `React.ReactNode` | | -| customBackgroundClassName | Override default background container's styles | `string` | | -| expandTitle | `CollapseButton` title for expanding navigation | `string` | `"Развернуть"` `"Expand"` | -| headerDecoration | Color background of the top section with logo and subheader items | `boolean` | `false` | -| hideCollapseButton | Hiding `CollapseButton`. Use `compact` prop for setting default navigation state | `boolean` | `false` | -| logo | Logo container includes icon, title, handling clicks | [`Logo`](https://github.com/gravity-ui/navigation/blob/main/src/components/Logo/Readme.md#logo) | | -| menuItems | Items in the navigation middle section | `Array` | `[]` | -| menuMoreTitle | Additional element title of menuItems if elements don't fit | `string` | `"Ещё"` `"More"` | -| multipleTooltip | Show the multiple tooltip by hovering elements of menuItems in collapsed state | `boolean` | `false` | -| onChangeCompact | Callback will be called when changing navigation visual state | `(compact: boolean) => void;` | | -| onClosePanel | Callback will be called when closing panel. You can add panels via `PanelItems` prop | `() => void;` | | -| onMenuItemsChanged | Callback will be called when updating list of the menuItems in `AllPagesPanel` | `(items: Array) => void` | | -| onMenuMoreClick | Callback will be called when some items don't fit and "more" button is clicked | `() => void;` | | -| onAllPagesClick | Callback will be called when "All pages" button is clicked | `() => void;` | | -| openModalSubscriber | Function notifies `AsideHeader` about Modals visibility changes | `( (open: boolean) => void) => void` | | -| panelItems | Items for `Drawer` component. Used for show additional information over main content | [`Array`](https://github.com/gravity-ui/navigation/tree/main/src/components/Drawer#draweritem-props) | `[]` | -| renderContent | Function rendering the main content at the right of the `AsideHeader` | `(data: {size: number}) => React.ReactNode` | | -| renderFooter | Function rendering the navigation bottom section | `(data: {size: number}) => React.ReactNode` | | -| ref | `ref` to target popup anchor | `React.ForwardedRef` | | -| subheaderItems | Items in the navigation top section under Logo | `Array` | `[]` | -| topAlert | The container above the navigation based on the uikit `Alert` component | `TopAlert` | | -| qa | The value to be passed to `data-qa` attribute of the `AsideHeader` container | `string` | | +| Name | Description | Type | Default | +| :------------------------ | :----------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------: | :-----------------------: | +| className | HTML `class` attribute of the Logo | `string` | | +| collapseButtonWrapper | Wrapper for `CollapseButton` allowing customization of the default button appearance | `(defaultButton: React.ReactNode, data: {pinned: boolean; onChangePinned?: (pinned: boolean) => void}) => React.ReactNode` | | +| collapseTitle | `CollapseButton` title for collapsing navigation | `string` | `"Свернуть"` `"Collapse"` | +| pinned | Navigation visual state. When `true`, navigation is expanded (pinned open). | `boolean` | `true` | +| customBackground | `AsideHeader` background | `React.ReactNode` | | +| customBackgroundClassName | Override default background container's styles | `string` | | +| expandTitle | `CollapseButton` title for expanding navigation | `string` | `"Развернуть"` `"Expand"` | +| headerDecoration | Color background of the top section with logo and subheader items | `boolean` | `false` | +| hideCollapseButton | Hiding `CollapseButton`. Use `pinned` prop for setting default navigation state | `boolean` | `false` | +| logo | Logo container includes icon, title, handling clicks | [`Logo`](https://github.com/gravity-ui/navigation/blob/main/src/components/Logo/Readme.md#logo) | | +| menuItems | Items in the navigation middle section | `Array` | `[]` | +| menuMoreTitle | Additional element title of menuItems if elements don't fit | `string` | `"Ещё"` `"More"` | +| multipleTooltip | Show the multiple tooltip by hovering elements of menuItems in collapsed state | `boolean` | `false` | +| onChangePinned | Callback will be called when changing navigation visual state | `(pinned: boolean) => void;` | | +| onClosePanel | Callback will be called when closing panel. You can add panels via `PanelItems` prop | `() => void;` | | +| onMenuItemsChanged | Callback will be called when updating list of the menuItems in `AllPagesPanel` | `(items: Array) => void` | | +| onMenuMoreClick | Callback will be called when some items don't fit and "more" button is clicked | `() => void;` | | +| onAllPagesClick | Callback will be called when "All pages" button is clicked | `() => void;` | | +| openModalSubscriber | Function notifies `AsideHeader` about Modals visibility changes | `( (open: boolean) => void) => void` | | +| panelItems | Items for `Drawer` component. Used for show additional information over main content | [`Array`](https://github.com/gravity-ui/navigation/tree/main/src/components/Drawer#draweritem-props) | `[]` | +| renderContent | Function rendering the main content at the right of the `AsideHeader` | `(data: {size: number}) => React.ReactNode` | | +| renderFooter | Function rendering the navigation bottom section | `(data: {size: number}) => React.ReactNode` | | +| ref | `ref` to target popup anchor | `React.ForwardedRef` | | +| subheaderItems | Items in the navigation top section under Logo | `Array` | `[]` | +| topAlert | The container above the navigation based on the uikit `Alert` component | `TopAlert` | | +| qa | The value to be passed to `data-qa` attribute of the `AsideHeader` container | `string` | | ### `AsideHeaderItem` @@ -214,7 +214,7 @@ export const Aside: FC = () => { | qa | The value to be passed to `data-qa` attribute | `string` | | | enableTooltip | Whether to display a tooltip. | `boolean` | `true` | | bringForward | Whether to display the icon on top of modal windows. | `boolean` | | -| compact | The flag responsible for displaying the menu item in a compact form. | `boolean` | | +| pinned | When `true`, forces the item to display in expanded (pinned) form. | `boolean` | | | ~~popupVisible~~ | ⚠️ **Deprecated**: Use `itemWrapper` for popup functionality. The flag responsible for displaying the pop-up window. | `boolean` | `false` | | ~~popupRef~~ | ⚠️ **Deprecated**: Use `itemWrapper` for popup functionality. Reference to anchor element for popup. | `React.RefObject` | | | ~~popupPlacement~~ | ⚠️ **Deprecated**: Use `itemWrapper` for popup functionality. The location of the pop-up window relative to the anchor component. | [`PopupProps['placement']`](https://github.com/gravity-ui/uikit/blob/7748aaeec8dc7414487f7c06c899f16b275b25ef/src/components/Popup/Popup.tsx#L69) | | diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-chromium-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-chromium-linux.png index fe853ae5..dc6a263c 100644 Binary files a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-chromium-linux.png and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-chromium-linux.png differ diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-webkit-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-webkit-linux.png index 16a36be6..03572e59 100644 Binary files a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-webkit-linux.png and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-dark-webkit-linux.png differ diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-chromium-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-chromium-linux.png index 4750e32e..375d8802 100644 Binary files a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-chromium-linux.png and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-chromium-linux.png differ diff --git a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-webkit-linux.png b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-webkit-linux.png index 4b6da573..40d3a0af 100644 Binary files a/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-webkit-linux.png and b/src/components/AsideHeader/__snapshots__/AsideHeader.visual.test.tsx-snapshots/AsideHeader-render-story-Fallback-light-webkit-linux.png differ diff --git a/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx b/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx index 76ed96c4..9ebbfbe1 100644 --- a/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx +++ b/src/components/AsideHeader/__stories__/AsideHeader.stories.tsx @@ -54,7 +54,7 @@ export const Showcase = ShowcaseTemplate.bind({}); const CompactTemplate: StoryFn = (args) => ; export const Compact = CompactTemplate.bind({}); Compact.args = { - initialCompact: true, + initialPinned: false, hideCollapseButton: true, }; @@ -62,7 +62,7 @@ const MultipleTooltipTemplate: StoryFn = (args) => ( @@ -109,10 +109,10 @@ CustomBackground.args = { }; const AdvancedUsageTemplate: StoryFn = (args) => { - const [compact, setCompact] = React.useState(args.initialCompact); + const [pinned, setPinned] = React.useState(args.initialPinned); return ( - + = (args) => ( @@ -204,10 +204,10 @@ const FallbackTemplate: StoryFn = ({ headerDecoration, subheaderItemsCount, }) => { - const [compact, setCompact] = React.useState(false); + const [pinned, setPinned] = React.useState(true); return ( - + = ({
- +
@@ -228,10 +228,10 @@ Fallback.args = fallbackArgs; /** @type {StoryFn} */ export function LineClamp() { - const [compact, setCompact] = React.useState(false); + const [pinned, setPinned] = React.useState(true); return ( - + { - const [compact, setCompact] = React.useState(args.initialCompact); + const [pinned, setPinned] = React.useState(args.initialPinned); return ( - + ( + collapseButtonWrapper={(defaultButton, {isExpanded}) => ( {defaultButton}
{ } - {compact ? null : {'Gravity UI'}} + {isExpanded ? {'Gravity UI'} : null}
@@ -281,14 +281,14 @@ const CollapseButtonWrapperTemplate: StoryFn = (args) => { export const CollapseButtonWrapper = CollapseButtonWrapperTemplate.bind({}); CollapseButtonWrapper.args = { - initialCompact: false, + initialPinned: true, }; const ManyItemsTemplate: StoryFn = (args) => { - const [compact, setCompact] = React.useState(args.initialCompact); + const [pinned, setPinned] = React.useState(args.initialPinned); return ( - + {
- +
Scroll demonstration with many navigation items @@ -316,7 +316,7 @@ const ManyItemsTemplate: StoryFn = (args) => { export const ManyItems = ManyItemsTemplate.bind({}); ManyItems.args = { - initialCompact: false, + initialPinned: true, }; ManyItems.parameters = { docs: { @@ -329,12 +329,12 @@ ManyItems.parameters = { }; const GroupedMenuCollapsibleTemplate: StoryFn = (args) => { - const [compact, setCompact] = React.useState(false); + const [pinned, setPinned] = React.useState(true); const [menuItems, setMenuItems] = React.useState(menuItemsWithGroups); const [currentMenuGroups, setCurrentMenuGroups] = React.useState(menuGroupsWithIcons); return ( - + { export const GroupedMenuCollapsible = GroupedMenuCollapsibleTemplate.bind({}); GroupedMenuCollapsible.args = { multipleTooltip: false, - initialCompact: false, + initialPinned: true, }; const CustomThemesWithNewColorsTemplate: StoryFn = (args) => { diff --git a/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx b/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx index ef89d298..ec745de5 100644 --- a/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx +++ b/src/components/AsideHeader/__stories__/AsideHeaderShowcase.tsx @@ -37,7 +37,7 @@ enum Panel { export interface AsideHeaderShowcaseProps { multipleTooltip?: boolean; - initialCompact?: boolean; + initialPinned?: boolean; topAlert?: TopAlertProps; customBackground?: React.ReactNode; customBackgroundClassName?: string; @@ -49,7 +49,7 @@ export interface AsideHeaderShowcaseProps { export const AsideHeaderShowcase: React.FC> = ({ multipleTooltip = false, - initialCompact = false, + initialPinned = true, topAlert, customBackground, customBackgroundClassName, @@ -63,7 +63,7 @@ export const AsideHeaderShowcase: React.FC(); - const [compact, setCompact] = React.useState(initialCompact); + const [pinned, setPinned] = React.useState(initialPinned); const [addonHeaderDecoration, setHeaderDecoration] = React.useState( BOOLEAN_OPTIONS.Yes, ); @@ -154,15 +154,15 @@ export const AsideHeaderShowcase: React.FC ( + renderFooter={({isExpanded, asideRef}) => ( )} @@ -292,8 +292,8 @@ export const AsideHeaderShowcase: React.FC setVisiblePanel(undefined)} - onChangeCompact={(v) => { - setCompact(v); + onChangePinned={(v) => { + setPinned(v); }} onMenuMoreClick={() => console.log('onMenuMoreClick')} onAllPagesClick={() => console.log('onAllPagesClick')} diff --git a/src/components/AsideHeader/__stories__/getAsideHeaderWrapper.tsx b/src/components/AsideHeader/__stories__/getAsideHeaderWrapper.tsx index 4ee682f8..f118dc86 100644 --- a/src/components/AsideHeader/__stories__/getAsideHeaderWrapper.tsx +++ b/src/components/AsideHeader/__stories__/getAsideHeaderWrapper.tsx @@ -6,13 +6,13 @@ import {AsideHeaderProps} from '../types'; import logoIcon from '../../../../.storybook/assets/logo.svg'; const AsideHeaderWrapper = ({Story, ...props}: AsideHeaderProps & {Story: FC}) => { - const [compact, setCompact] = React.useState(props.compact); + const [pinned, setPinned] = React.useState(props.pinned); return ( } /> ); @@ -26,7 +26,7 @@ export function getAsideHeaderWrapper( text: 'My Service', 'aria-label': 'My Service', }, - compact: true, + pinned: false, }, ) { return function withAsideHeaderWrapper(Story: FC) { diff --git a/src/components/AsideHeader/__stories__/moc.tsx b/src/components/AsideHeader/__stories__/moc.tsx index e2d783e4..f45d22ab 100644 --- a/src/components/AsideHeader/__stories__/moc.tsx +++ b/src/components/AsideHeader/__stories__/moc.tsx @@ -14,7 +14,7 @@ function renderTag(tag: string) { export const EMPTY_CONTEXT_VALUE: AsideHeaderContextType = { size: ASIDE_HEADER_EXPANDED_WIDTH, - compact: true, + pinned: false, isExpanded: false, }; @@ -73,8 +73,8 @@ export const menuItemsShowcase: AsideHeaderProps['menuItems'] = [ onItemClick({id, title, current}) { alert(JSON.stringify({id, title, current})); }, - itemWrapper(params, makeItem, {collapsed, compact}) { - return !collapsed && !compact ? ( + itemWrapper(params, makeItem, {collapsed, pinned}) { + return !collapsed && pinned ? (
{makeItem(params)}
@@ -283,8 +283,8 @@ export const menuItemsWithGroups: AsideHeaderProps['menuItems'] = [ onItemClick({id, title, current}) { alert(JSON.stringify({id, title, current})); }, - itemWrapper(params, makeItem, {collapsed, compact}) { - return !collapsed && !compact ? ( + itemWrapper(params, makeItem, {collapsed, pinned}) { + return !collapsed && pinned ? (
{makeItem(params)}
diff --git a/src/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.tsx b/src/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.tsx index 1e63a257..5d1ca78b 100644 --- a/src/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.tsx +++ b/src/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.tsx @@ -231,7 +231,7 @@ export const AllPagesPanel: React.FC = (props) => { = ({children}) => { href: '#', }} menuItems={menuItems} - compact={compact} - onChangeCompact={setCompact} + pinned={pinned} + onChangePinned={setPinned} renderContent={() => children} // All pages defaultMenuItems={defaultMenuItems} diff --git a/src/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss b/src/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss index 2236f8b8..d6fa4d44 100644 --- a/src/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss +++ b/src/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss @@ -3,7 +3,7 @@ $block: '.#{variables.$ns}collapse-button'; #{$block} { - &_compact { + &_collapsed { #{$block}__icon { transform: rotate(180deg); } diff --git a/src/components/AsideHeader/components/CollapseButton/CollapseButton.tsx b/src/components/AsideHeader/components/CollapseButton/CollapseButton.tsx index 8fc82bce..1e2c5419 100644 --- a/src/components/AsideHeader/components/CollapseButton/CollapseButton.tsx +++ b/src/components/AsideHeader/components/CollapseButton/CollapseButton.tsx @@ -16,24 +16,24 @@ interface CollapseButtonProps { } export const CollapseButton = ({className}: CollapseButtonProps) => { - const {compact, onChangeCompact} = useAsideHeaderContext(); + const {pinned, onChangePinned} = useAsideHeaderContext(); const {expandTitle, collapseTitle, collapseButtonWrapper} = useAsideHeaderInnerContext(); const onCollapseButtonClick = useCallback(() => { - const newCompact = !compact; + const newPinned = !pinned; - onChangeCompact?.(newCompact); - }, [compact, onChangeCompact]); + onChangePinned?.(newPinned); + }, [pinned, onChangePinned]); - const buttonTitle = compact - ? expandTitle || i18n('button_expand') - : collapseTitle || i18n('button_collapse'); + const buttonTitle = pinned + ? collapseTitle || i18n('button_collapse') + : expandTitle || i18n('button_expand'); const defaultButton = (
{type === 'menu' && multipleTooltip && ( = ({ onMoreClick, onToggleGroupCollapsed, multipleTooltip = false, - compact, + isExpanded, compositeId, className, menuItemClassName, @@ -421,7 +425,7 @@ export const CompositeBar: FC = ({ compositeId={compositeId} menuItemClassName={menuItemClassName} type="menu" - compact={compact} + isExpanded={isExpanded} items={visibleItems} onItemClick={onItemClick} onMoreClick={onMoreClick} @@ -437,7 +441,7 @@ export const CompositeBar: FC = ({ void; onMouseLeave?: () => void; @@ -74,7 +75,7 @@ export const Item: React.FC = (props) => { title, href, qa, - compact, + isExpanded = true, editMode = false, onToggleVisibility, hidden, @@ -119,7 +120,7 @@ export const Item: React.FC = (props) => { } const makeIconNode = (iconEl: React.ReactNode): React.ReactNode => { - return compact ?
{iconEl}
: iconEl; + return isExpanded ? iconEl :
{iconEl}
; }; const makeNode = ({icon: iconEl, title: titleEl}: MakeItemParams) => { @@ -129,7 +130,7 @@ export const Item: React.FC = (props) => { = (props) => {
@@ -198,7 +199,7 @@ export const Item: React.FC = (props) => { let highlightedNode = null; let node; - const opts = {compact: Boolean(compact), collapsed: false, item: props, ref}; + const opts = {pinned: Boolean(isExpanded), collapsed: false, item: props, ref}; if (typeof itemWrapper === 'function') { node = itemWrapper(params, makeNode, opts) as React.ReactElement; diff --git a/src/components/AsideHeader/components/FirstPanel.tsx b/src/components/AsideHeader/components/FirstPanel.tsx index ef6fcc0d..eec10735 100644 --- a/src/components/AsideHeader/components/FirstPanel.tsx +++ b/src/components/AsideHeader/components/FirstPanel.tsx @@ -31,7 +31,7 @@ export const FirstPanel = React.forwardRef((_props, ref) => { onMenuMoreClick, renderFooter, onToggleGroupCollapsed, - compact, + pinned, customBackground, customBackgroundClassName, className, @@ -51,7 +51,7 @@ export const FirstPanel = React.forwardRef((_props, ref) => { setRef(ref, asideRef.current); }, [ref]); - const isExpandedByHover = compact && isExpanded; + const isExpandedByHover = !pinned && isExpanded; return ( @@ -82,7 +82,7 @@ export const FirstPanel = React.forwardRef((_props, ref) => { compositeId={MENU_ITEMS_COMPOSITE_ID} className={b('menu-items')} menuItemClassName={b('menu-item')} - compact={!isExpanded} + isExpanded={isExpanded} type="menu" items={flatListItems} onItemClick={onItemClick} @@ -97,7 +97,7 @@ export const FirstPanel = React.forwardRef((_props, ref) => {
{renderFooter?.({ size, - compact: Boolean(!isExpanded), + isExpanded, asideRef, })}
diff --git a/src/components/AsideHeader/components/FooterItem/FooterItem.tsx b/src/components/AsideHeader/components/FooterItem/FooterItem.tsx index d3dd7523..30a4e0e8 100644 --- a/src/components/AsideHeader/components/FooterItem/FooterItem.tsx +++ b/src/components/AsideHeader/components/FooterItem/FooterItem.tsx @@ -17,7 +17,7 @@ export function FooterItem(props: FooterItemProps) { ); } diff --git a/src/components/AsideHeader/components/FooterItem/__stories__/FooterItem.stories.tsx b/src/components/AsideHeader/components/FooterItem/__stories__/FooterItem.stories.tsx index 2e0f8159..848de42c 100644 --- a/src/components/AsideHeader/components/FooterItem/__stories__/FooterItem.stories.tsx +++ b/src/components/AsideHeader/components/FooterItem/__stories__/FooterItem.stories.tsx @@ -16,14 +16,14 @@ export default { decorators: [ (DecoratedStory, context) => { const { - args: {compact}, + args: {isExpanded}, } = context; - const width = compact ? ASIDE_HEADER_COMPACT_WIDTH : ASIDE_HEADER_EXPANDED_WIDTH; + const width = isExpanded ? ASIDE_HEADER_EXPANDED_WIDTH : ASIDE_HEADER_COMPACT_WIDTH; return (
@@ -37,7 +37,7 @@ const Template: StoryFn = (args) => ; export const Default = Template.bind({}); Default.args = { - compact: false, + isExpanded: true, id: 'settings', title: 'Settings', icon: Gear, diff --git a/src/components/AsideHeader/components/Header.tsx b/src/components/AsideHeader/components/Header.tsx index 8e593127..ec03a99b 100644 --- a/src/components/AsideHeader/components/Header.tsx +++ b/src/components/AsideHeader/components/Header.tsx @@ -28,8 +28,6 @@ export const Header = () => { hideCollapseButton, } = useAsideHeaderInnerContext(); - const compact = !isExpanded; - const items = useGroupedMenuItems(subheaderItems || DEFAULT_SUBHEADER_ITEMS); const onLogoClick = useCallback( @@ -47,20 +45,22 @@ export const Header = () => { )} - {!hideCollapseButton && } + {!hideCollapseButton && ( + + )}
diff --git a/src/components/AsideHeader/components/PageLayout/AsideFallback.tsx b/src/components/AsideHeader/components/PageLayout/AsideFallback.tsx index 6a2da7b3..9b39fa84 100644 --- a/src/components/AsideHeader/components/PageLayout/AsideFallback.tsx +++ b/src/components/AsideHeader/components/PageLayout/AsideFallback.tsx @@ -14,9 +14,9 @@ interface Props extends QAProps { } export const AsideFallback: React.FC = ({headerDecoration, subheaderItemsCount = 0, qa}) => { - const {compact} = useAsideHeaderContext(); + const {pinned} = useAsideHeaderContext(); - const widthVar = compact ? '--gn-aside-header-min-width' : '--gn-aside-header-size'; + const widthVar = pinned ? '--gn-aside-header-size' : '--gn-aside-header-min-width'; const subheaderHeight = (1 + subheaderItemsCount) * ITEM_HEIGHT; @@ -25,7 +25,7 @@ export const AsideFallback: React.FC = ({headerDecoration, subheaderItems
- {compact && headerDecoration ? ( + {!pinned && headerDecoration ? ( { - onChangeCompact?: (compact: boolean) => void; + onChangePinned?: (pinned: boolean) => void; } -const Layout = ({compact, className, children, topAlert, onChangeCompact}: PageLayoutProps) => { - const {isExpanded, onExpand, onFold} = useIsExpanded(compact); +const Layout = ({pinned, className, children, topAlert, onChangePinned}: PageLayoutProps) => { + const {isExpanded, onExpand, onFold} = useIsExpanded(pinned); const size = isExpanded ? ASIDE_HEADER_EXPANDED_WIDTH : ASIDE_HEADER_COMPACT_WIDTH; const asideHeaderContextValue = useMemo( () => ({ size, - compact, + pinned, isExpanded, - onChangeCompact, + onChangePinned, onExpand, onFold, }), - [size, compact, isExpanded, onChangeCompact, onExpand, onFold], + [size, pinned, isExpanded, onChangePinned, onExpand, onFold], ); const estimatedTopAlertHeight = calcEstimatedTopAlertHeight(topAlert); @@ -75,7 +75,7 @@ const Layout = ({compact, className, children, topAlert, onChangeCompact}: PageL return (
{ - const {size, compact, isExpanded} = useAsideHeaderContext(); - const isExpandedByHover = compact && isExpanded; + const {size, pinned, isExpanded} = useAsideHeaderContext(); + const isExpandedByHover = !pinned && isExpanded; return ( ; +type Props = Omit; export const PageLayoutAside = React.forwardRef((props, ref) => { - const {size, compact, isExpanded, onExpand, onFold} = useAsideHeaderContext(); + const {size, pinned, isExpanded, onExpand, onFold} = useAsideHeaderContext(); const asideHeaderInnerContextValue = useAsideHeaderInnerContextValue({ size, - compact, + pinned, isExpanded, onExpand, onFold, diff --git a/src/components/AsideHeader/hooks/useIsExpanded.ts b/src/components/AsideHeader/hooks/useIsExpanded.ts index cc5ffaae..592361e1 100644 --- a/src/components/AsideHeader/hooks/useIsExpanded.ts +++ b/src/components/AsideHeader/hooks/useIsExpanded.ts @@ -10,19 +10,19 @@ interface UseIsExpandedResult { onFold: () => void; } -export const useIsExpanded = (externalCompact: boolean): UseIsExpandedResult => { - const [isExpanded, setIsExpanded] = useState(!externalCompact); +export const useIsExpanded = (externalPinned: boolean): UseIsExpandedResult => { + const [isExpanded, setIsExpanded] = useState(externalPinned); const [isMouseInside, setIsMouseInside] = useState(false); useEffect(() => { - if (externalCompact && isExpanded) { + if (!externalPinned && isExpanded) { return; } - setIsExpanded(!externalCompact); - // We need to run this effect only when externalCompact changes + setIsExpanded(externalPinned); + // We need to run this effect only when externalPinned changes // eslint-disable-next-line react-hooks/exhaustive-deps - }, [externalCompact]); + }, [externalPinned]); const delayedShouldExpand = useDelayedToggle(isMouseInside, { enableDelay: ASIDE_HEADER_EXPAND_DELAY, @@ -31,7 +31,7 @@ export const useIsExpanded = (externalCompact: boolean): UseIsExpandedResult => // Update isExpanded based on hover useEffect(() => { - if (externalCompact) { + if (!externalPinned) { setIsExpanded(delayedShouldExpand); } // We need to run this effect only when delayedShouldExpand changes diff --git a/src/components/AsideHeader/types.tsx b/src/components/AsideHeader/types.tsx index 1485a4e0..d3a13e8e 100644 --- a/src/components/AsideHeader/types.tsx +++ b/src/components/AsideHeader/types.tsx @@ -15,7 +15,8 @@ export interface PanelItemProps { } export interface LayoutProps { - compact: boolean; + /** Navigation visual state. When `true`, the navigation is expanded (pinned open). When `false`, it is collapsed. */ + pinned: boolean; className?: string; topAlert?: TopAlertProps; } @@ -42,19 +43,19 @@ interface AsideHeaderGeneralProps extends QAProps { renderContent?: RenderContentType; renderFooter?: (data: { size: number; - compact: boolean; + isExpanded: boolean; asideRef: React.RefObject; }) => React.ReactNode; collapseButtonWrapper?: ( defaultButton: React.ReactNode, data: { - compact: boolean; - onChangeCompact?: (compact: boolean) => void; + isExpanded: boolean; + onChangePinned?: (pinned: boolean) => void; }, ) => React.ReactNode; editMenuProps?: EditMenuProps; onClosePanel?: () => void; - onChangeCompact?: (compact: boolean) => void; + onChangePinned?: (pinned: boolean) => void; onMenuMoreClick?: () => void; onAllPagesClick?: () => void; openModalSubscriber?: (subscriber: OpenModalSubscriber) => void; @@ -93,7 +94,8 @@ export interface AsideHeaderItem extends MenuItem { event: React.MouseEvent, ) => void; bringForward?: boolean; - compact?: boolean; + /** When `true`, forces the item to display in expanded form. */ + isExpanded?: boolean; /** * @deprecated Use itemWrapper instead for popup functionality diff --git a/src/components/AsideHeader/useAsideHeaderInnerContextValue.tsx b/src/components/AsideHeader/useAsideHeaderInnerContextValue.tsx index a610f38c..c890c809 100644 --- a/src/components/AsideHeader/useAsideHeaderInnerContextValue.tsx +++ b/src/components/AsideHeader/useAsideHeaderInnerContextValue.tsx @@ -11,7 +11,7 @@ const EMPTY_MENU_ITEMS: AsideHeaderItem[] = []; export const useAsideHeaderInnerContextValue = ( props: AsideHeaderProps & { size: number; - compact: boolean; + pinned: boolean; isExpanded: boolean; onExpand?: () => void; onFold?: () => void; diff --git a/src/components/Logo/Logo.module.scss b/src/components/Logo/Logo.module.scss index f05d2dee..d9adb00c 100644 --- a/src/components/Logo/Logo.module.scss +++ b/src/components/Logo/Logo.module.scss @@ -36,7 +36,7 @@ $block: '.#{variables.$ns}logo'; &__logo { margin: 0 var(--g-spacing-4) 0 var(--g-spacing-2); - &_compact { + &_collapsed { opacity: 0; } diff --git a/src/components/Logo/Logo.tsx b/src/components/Logo/Logo.tsx index 13dfc884..59bdd0ed 100644 --- a/src/components/Logo/Logo.tsx +++ b/src/components/Logo/Logo.tsx @@ -21,7 +21,7 @@ const logoTransitionClasses = { }; export const Logo: React.FC< - LogoProps & {compact?: boolean; buttonClassName?: string; iconPlaceClassName?: string} + LogoProps & {isExpanded?: boolean; buttonClassName?: string; iconPlaceClassName?: string} > = ({ text, icon, @@ -34,7 +34,7 @@ export const Logo: React.FC< target = '_self', wrapper, onClick, - compact, + isExpanded = true, className, buttonClassName, 'aria-label': ariaLabel, @@ -60,7 +60,7 @@ export const Logo: React.FC< logo = text(); } else { logo = ( -
+
{text}
); @@ -82,7 +82,7 @@ export const Logo: React.FC< {buttonIcon} @@ -93,7 +93,7 @@ export const Logo: React.FC< return (
- {hasWrapper ? wrapper(button, Boolean(compact)) : button} + {hasWrapper ? wrapper(button, Boolean(isExpanded)) : button}
); }; diff --git a/src/components/Logo/Readme.md b/src/components/Logo/Readme.md index 897c6e68..ae221442 100644 --- a/src/components/Logo/Readme.md +++ b/src/components/Logo/Readme.md @@ -2,21 +2,21 @@ Logo icon is wrapped in UIKit Button, text is wrapped in HTML tag `a` or `div`, when passing `hasWrapper` prop. -| Name | Description | Type | Default | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------: | :-------: | -| aria-label | HTML `aria-label` attribute passed to tag `a` | `string` | | -| aria-labelledby | HTML `aria-labelledby` attribute passed to tag `a` | `string` | | -| buttonClassName | HTML `class` for UIKit Button | `string` | | -| buttonWrapperClassName | HTML `class` attribute for UIKit Button wrapper | `string` | | -| compact | Logo view state: `true` shows icon, `false` — icon and text | `boolean` | | -| className | HTML `class` attribute | `string` | | -| href | HTML `href` attribute for UIKit Button in the compact state and HTML tag `a` for the collapsed state without defining `hasWrapper` prop | `string` | | -| icon | | [IconProps['data']](https://github.com/gravity-ui/uikit/blob/610e49b6d4b9d1b4eae46841a9c1ab87ccc591fb/src/components/Icon/Icon.tsx#L26) | | -| iconClassName | HTML `class` attribute of the icon container | `string` | | -| iconSize | `width` and `height` attribute | `number` | `24` | -| iconSrc | HTML `src` attribute of the tag `img` | `string` | | -| onClick | Callback function called when the user clicks the Logo | `(event: React.MouseEvent) => void` | | -| target | HTML `target` attribute of the tag `a` | `HTMLAttributeAnchorTarget` | `"_self"` | -| text | Text displays only when `compact` prop is `false` | `() => React.ReactNode` or `string` | | -| textSize | Text font size | `number` | `15` | -| wrapper | Wrapper function. Wrapping icon and text in two separated containers | `(node: React.ReactNode, compact: boolean) => React.ReactNode` | | +| Name | Description | Type | Default | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------: | :-------: | +| aria-label | HTML `aria-label` attribute passed to tag `a` | `string` | | +| aria-labelledby | HTML `aria-labelledby` attribute passed to tag `a` | `string` | | +| buttonClassName | HTML `class` for UIKit Button | `string` | | +| buttonWrapperClassName | HTML `class` attribute for UIKit Button wrapper | `string` | | +| pinned | Logo view state: `true` (pinned) shows icon and text, `false` — icon only | `boolean` | | +| className | HTML `class` attribute | `string` | | +| href | HTML `href` attribute for UIKit Button in the collapsed state and HTML tag `a` for the expanded state without defining `hasWrapper` prop | `string` | | +| icon | | [IconProps['data']](https://github.com/gravity-ui/uikit/blob/610e49b6d4b9d1b4eae46841a9c1ab87ccc591fb/src/components/Icon/Icon.tsx#L26) | | +| iconClassName | HTML `class` attribute of the icon container | `string` | | +| iconSize | `width` and `height` attribute | `number` | `24` | +| iconSrc | HTML `src` attribute of the tag `img` | `string` | | +| onClick | Callback function called when the user clicks the Logo | `(event: React.MouseEvent) => void` | | +| target | HTML `target` attribute of the tag `a` | `HTMLAttributeAnchorTarget` | `"_self"` | +| text | Text displays only when `pinned` prop is `true` | `() => React.ReactNode` or `string` | | +| textSize | Text font size | `number` | `15` | +| wrapper | Wrapper function. Wrapping icon and text in two separated containers | `(node: React.ReactNode, pinned: boolean) => React.ReactNode` | | diff --git a/src/components/MobileHeader/MobileHeader.tsx b/src/components/MobileHeader/MobileHeader.tsx index 49449598..5708bf31 100644 --- a/src/components/MobileHeader/MobileHeader.tsx +++ b/src/components/MobileHeader/MobileHeader.tsx @@ -35,7 +35,7 @@ const b = createBlock('mobile-header', styles); type PanelName = string | null; interface BurgerMenuProps extends Omit { - renderFooter?: (data: {size: number; isCompact: boolean}) => React.ReactNode; + renderFooter?: (data: {size: number; isExpanded: boolean}) => React.ReactNode; } type OverlapPanelProps = Omit; @@ -82,12 +82,12 @@ export const MobileHeader = React.forwardRef( ref, ): React.ReactElement => { const targetRef = useForwardRef(ref); - const [compact] = useState(true); + const [pinned] = useState(false); const [visiblePanel, setVisiblePanel] = useState(null); const [overlapPanelVisible, setOverlapPanelVisible] = useState(false); // for expand top panel cases (i.e. switch service panel). Will be removed if not used in future design - const size = compact ? MOBILE_HEADER_COMPACT_HEIGHT : MOBILE_HEADER_EXPANDED_HEIGHT; + const size = pinned ? MOBILE_HEADER_EXPANDED_HEIGHT : MOBILE_HEADER_COMPACT_HEIGHT; const onPanelToggle = useCallback( (name: PanelName) => { @@ -184,9 +184,9 @@ export const MobileHeader = React.forwardRef( () => burgerMenu.renderFooter?.({ size, - isCompact: compact, + isExpanded: pinned, }), - [burgerMenu, size, compact], + [burgerMenu, size, pinned], ); const onLogoClick = useCallback( @@ -280,7 +280,7 @@ export const MobileHeader = React.forwardRef( const allPanelItems = [burgerPanelItem, ...panelItems]; return ( -
+
{topAlert && ( @@ -295,7 +295,7 @@ export const MobileHeader = React.forwardRef( closeTitle={burgerCloseTitle} openTitle={burgerOpenTitle} /> - +
{sideItemRenderContent?.({size})}
diff --git a/src/components/MobileLogo/MobileLogo.tsx b/src/components/MobileLogo/MobileLogo.tsx index 214ee437..caea4cbe 100644 --- a/src/components/MobileLogo/MobileLogo.tsx +++ b/src/components/MobileLogo/MobileLogo.tsx @@ -10,12 +10,12 @@ import styles from './MobileLogo.module.scss'; const b = createBlock('mobile-logo', styles); export interface MobileLogoProps extends LogoProps { - compact: boolean; + isExpanded: boolean; } export const MobileLogo: React.FC = ({ text, - compact, + isExpanded, icon, iconSrc, iconClassName, @@ -66,7 +66,7 @@ export const MobileLogo: React.FC = ({ return hasWrapper ? (
- {wrapper(logo, compact)} + {wrapper(logo, isExpanded)}
) : ( React.ReactNode, opts: { collapsed: boolean; - compact: boolean; + pinned: boolean; item: MenuItem; ref: React.RefObject; }, @@ -74,7 +74,8 @@ export interface LogoProps { textSize?: number; href?: string; target?: HTMLAttributeAnchorTarget; - wrapper?: (node: React.ReactNode, compact: boolean) => React.ReactNode; + /** Wrapper function for the logo. The `isExpanded` parameter indicates if the navigation is expanded. */ + wrapper?: (node: React.ReactNode, isExpanded: boolean) => React.ReactNode; onClick?: (event: React.MouseEvent) => void; 'aria-label'?: string; 'aria-labelledby'?: string;