diff --git a/.changeset/lucky-weeks-allow.md b/.changeset/lucky-weeks-allow.md new file mode 100644 index 0000000000..2b170e4ba5 --- /dev/null +++ b/.changeset/lucky-weeks-allow.md @@ -0,0 +1,5 @@ +--- +'@alfalab/core-components-tab-bar-island': minor +--- + +- Добавлен эффект прозрачности diff --git a/packages/tab-bar-island/src/components/entry-content/index.module.css b/packages/tab-bar-island/src/components/entry-content/index.module.css index a686ecd0d8..7c771c4dae 100644 --- a/packages/tab-bar-island/src/components/entry-content/index.module.css +++ b/packages/tab-bar-island/src/components/entry-content/index.module.css @@ -8,7 +8,7 @@ .label { @mixin action_secondary_small; - + position: relative; margin: 0 var(--gap-10) var(--gap-6); white-space: nowrap; overflow: hidden; diff --git a/packages/tab-bar-island/src/components/tab-list/index.module.css b/packages/tab-bar-island/src/components/tab-list/index.module.css index f5e9569722..d6d2c0cda2 100644 --- a/packages/tab-bar-island/src/components/tab-list/index.module.css +++ b/packages/tab-bar-island/src/components/tab-list/index.module.css @@ -7,12 +7,6 @@ position: relative; } -.underlay { - border-radius: var(--tab-bar-island-border-radius); - background: var(--tab-bar-island-background); - box-shadow: var(--tab-bar-island-box-shadow); -} - .wrapper { display: flex; max-width: 100%; @@ -54,7 +48,7 @@ left: 0; height: 100%; width: 100%; - background: var(--color-light-neutral-translucent-200); + background: var(--tab-bar-island-tab-tracker-background-color); will-change: width, height, border-radius; } diff --git a/packages/tab-bar-island/src/components/tab-list/index.tsx b/packages/tab-bar-island/src/components/tab-list/index.tsx index 4850d440a4..ff11e1c7d6 100644 --- a/packages/tab-bar-island/src/components/tab-list/index.tsx +++ b/packages/tab-bar-island/src/components/tab-list/index.tsx @@ -1,5 +1,6 @@ import React, { type FC, useMemo, useState } from 'react'; +import { Underlay } from '@alfalab/core-components-tab-bar-island/components/underlay'; import { usePillAnimation } from '@alfalab/core-components-tab-bar-island/hooks/use-pill-animation'; import { type TabBarIslandTabListProps } from '@alfalab/core-components-tab-bar-island/types'; @@ -40,7 +41,7 @@ export const TabBarIslandTabList: FC = ({ return (
-
+
( - +
+ + +
); diff --git a/packages/tab-bar-island/src/components/underlay/index.module.css b/packages/tab-bar-island/src/components/underlay/index.module.css new file mode 100644 index 0000000000..6fc6fe0d3f --- /dev/null +++ b/packages/tab-bar-island/src/components/underlay/index.module.css @@ -0,0 +1,71 @@ +@import '@alfalab/core-components-tab-bar-island/src/vars.css'; + +.component { + background: var(--tab-bar-island-background); + border-radius: var(--tab-bar-island-border-radius); + box-shadow: var(--tab-bar-island-box-shadow); + backdrop-filter: var(--tab-bar-island-backdrop-filter); + + &:before { + top: 0; + } + + &:after { + bottom: 0; + } + + &:before, + &:after { + content: ''; + display: block; + position: absolute; + height: var(--tab-bar-island-border-width); + right: calc(var(--tab-bar-island-border-radius) - var(--tab-bar-island-border-width)); + left: calc(var(--tab-bar-island-border-radius) - var(--tab-bar-island-border-width)); + background: linear-gradient( + 95deg, + var(--tab-bar-island-border-color-from), + var(--tab-bar-island-border-color-to) + ); + } +} + +.border { + width: calc(var(--tab-bar-island-border-radius) - var(--tab-bar-island-border-width)); + overflow: hidden; + + &, + &:before { + position: absolute; + top: 0; + bottom: 0; + } + + &:before { + content: ''; + display: block; + width: calc(var(--tab-bar-island-border-radius) - var(--tab-bar-island-border-width)); + } + + &[data-position='start'] { + left: 0; + + &:before { + left: 0; + border: var(--tab-bar-island-border-width) solid var(--tab-bar-island-border-color-from); + border-top-left-radius: var(--tab-bar-island-border-radius); + border-bottom-left-radius: var(--tab-bar-island-border-radius); + } + } + + &[data-position='end'] { + right: 0; + + &:before { + right: 0; + border: var(--tab-bar-island-border-width) solid var(--tab-bar-island-border-color-to); + border-top-right-radius: var(--tab-bar-island-border-radius); + border-bottom-right-radius: var(--tab-bar-island-border-radius); + } + } +} diff --git a/packages/tab-bar-island/src/components/underlay/index.tsx b/packages/tab-bar-island/src/components/underlay/index.tsx new file mode 100644 index 0000000000..a474e07de5 --- /dev/null +++ b/packages/tab-bar-island/src/components/underlay/index.tsx @@ -0,0 +1,15 @@ +import React, { forwardRef } from 'react'; +import cn from 'classnames'; + +import styles from './index.module.css'; + +export interface UnderlayProps { + className?: string; +} + +export const Underlay = forwardRef(({ className }, ref) => ( +
+
+
+
+)); diff --git a/packages/tab-bar-island/src/docs/description.mdx b/packages/tab-bar-island/src/docs/description.mdx index 12fcfad45f..7fff1cfd14 100644 --- a/packages/tab-bar-island/src/docs/description.mdx +++ b/packages/tab-bar-island/src/docs/description.mdx @@ -1,9 +1,9 @@ ## Icon -```jsx live mobileOnly mobileHeight={100} +```jsx live render(() => { return ( -
+
, label: 'Деньги' }, @@ -21,7 +21,7 @@ render(() => { ## Image -```jsx live mobileOnly mobileHeight={100} +```jsx live const IconComponent = ({ style, children, ...restProps }) => (
{children} @@ -30,7 +30,7 @@ const IconComponent = ({ style, children, ...restProps }) => ( render(() => { return ( -
+
, label: 'Деньги' }, @@ -66,7 +66,7 @@ render(() => { ## Full Image -```jsx live mobileOnly mobileHeight={100} +```jsx live const IconComponent = ({ style, children, ...restProps }) => (
{children} @@ -75,7 +75,7 @@ const IconComponent = ({ style, children, ...restProps }) => ( render(() => { return ( -
+
, label: 'Деньги' }, diff --git a/packages/tab-bar-island/src/vars.css b/packages/tab-bar-island/src/vars.css index 0f959bad2f..18d0750aa8 100644 --- a/packages/tab-bar-island/src/vars.css +++ b/packages/tab-bar-island/src/vars.css @@ -6,8 +6,13 @@ --tab-bar-island-tab-default-size: 92px; --tab-bar-island-tab-max-size: 120px; --tab-bar-island-border-radius: 40px; - --tab-bar-island-background: var(--color-light-modal-bg-primary); + --tab-bar-island-background: rgba(255, 255, 255, 0.56); --tab-bar-island-box-shadow: 0 0 16px 0 rgba(0, 0, 0, 0.14); --tab-bar-island-tab-color: var(--color-light-text-secondary); --tab-bar-island-tab-active-color: var(--color-light-accent-secondary); + --tab-bar-island-tab-tracker-background-color: var(--color-light-neutral-translucent-200); + --tab-bar-island-backdrop-filter: blur(5px); + --tab-bar-island-border-width: 1px; + --tab-bar-island-border-color-from: transparent; + --tab-bar-island-border-color-to: var(--color-light-neutral-translucent-700-inverted); }