From a1aff3e7d36b7e76cc2099d821d4dad744d9ec1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kry=C5=A1p=C3=ADn?= Date: Tue, 3 Dec 2024 18:35:59 +0100 Subject: [PATCH 1/6] Feat(web): Introduce UNSTABLE Header component #DS-1523 --- .../scss/components/UNSTABLE_Header/README.md | 121 ++++++++++++++++++ .../UNSTABLE_Header/_UNSTABLE_Header.scss | 21 +++ .../UNSTABLE_Header/_UNSTABLE_HeaderLogo.scss | 8 ++ .../components/UNSTABLE_Header/_theme.scss | 7 + .../components/UNSTABLE_Header/index.html | 70 ++++++++++ .../components/UNSTABLE_Header/index.scss | 2 + packages/web/src/scss/components/index.scss | 1 + .../unstable-header-chromium-linux.png | Bin 0 -> 23098 bytes 8 files changed, 230 insertions(+) create mode 100644 packages/web/src/scss/components/UNSTABLE_Header/README.md create mode 100644 packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_Header.scss create mode 100644 packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_HeaderLogo.scss create mode 100644 packages/web/src/scss/components/UNSTABLE_Header/_theme.scss create mode 100644 packages/web/src/scss/components/UNSTABLE_Header/index.html create mode 100644 packages/web/src/scss/components/UNSTABLE_Header/index.scss create mode 100644 tests/e2e/demo-components-compare.spec.ts-snapshots/unstable-header-chromium-linux.png diff --git a/packages/web/src/scss/components/UNSTABLE_Header/README.md b/packages/web/src/scss/components/UNSTABLE_Header/README.md new file mode 100644 index 0000000000..5cf26c735a --- /dev/null +++ b/packages/web/src/scss/components/UNSTABLE_Header/README.md @@ -0,0 +1,121 @@ +# UNSTABLE Header + +⚠️ This component is UNSTABLE. It may significantly change at any point in the future. +Please use it with caution. + +The `UNSTABLE_Header` component is planned to replace the `Header` component in the future. + +The `UNSTABLE_Header` is a composition of several subcomponents: + +- [UNSTABLE_Header](#unstable-header) +- [UNSTABLE_HeaderLogo](#unstable-headerlogo) + +## UNSTABLE Header + +The `UNSTABLE_Header` component is a main wrapper which provides mainly the visual for the Header. + +```html +
+ +
+``` + +It also sets CSS variable for the Header height which can be used by nested components. + +## UNSTABLE HeaderLogo + +The `UNSTABLE_HeaderLogo` component is a container for the logo. + +```html + +``` + +It inherits the `UNSTABLE_Header` height and sets the logo wrapper height to the same value. + +You can use the `ProductLogo` component inside the `UNSTABLE_HeaderLogo` component. + +```html + +``` + +## Component Composition + +Use [`Container`][web-container] and [`Flex`][web-flex] components to create a layout for the Header content. + +```html +
+
+
+ + + +
+
+
+``` + +This way you can easily modify the layout of the Header content. + +For example you can make the content centered by setting the `Flex` alignment classes to center. + +```html +
+ +
+``` + +Or you can modify the gaps between the content by setting the `Flex` `spacing` property. + +```html +
+
+
+ + + +
+
+
+``` + +If you need the whole Header fluid you can do it by adding the `Container--fluid` class to the `Container`. + +```html +
+
+ +
+
+``` + +[web-container]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web/src/scss/components/Container/README.md +[web-flex]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web/src/scss/components/Flex/README.md diff --git a/packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_Header.scss b/packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_Header.scss new file mode 100644 index 0000000000..b447e8bb54 --- /dev/null +++ b/packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_Header.scss @@ -0,0 +1,21 @@ +// 1. In order to have the border be outside of the height of the header, we need to use `content-box` +// for the box-sizing. The box-sizing is inherited by the children, so we need to reset it to `border-box`. + +@use '@tokens' as tokens; +@use 'theme'; + +.UNSTABLE_Header { + --#{tokens.$css-variable-prefix}header-height: #{theme.$height}; + --#{tokens.$css-variable-prefix}navigation-height: var(--#{tokens.$css-variable-prefix}header-height); + + flex: none; + box-sizing: content-box; // 1. + height: var(--#{tokens.$css-variable-prefix}header-height); + border-bottom: theme.$border-width theme.$border-style theme.$border-color; + background-color: theme.$background-color; +} + +// stylelint-disable-next-line selector-max-universal -- 1. +.UNSTABLE_Header > * { + box-sizing: border-box; +} diff --git a/packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_HeaderLogo.scss b/packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_HeaderLogo.scss new file mode 100644 index 0000000000..0ed1da8214 --- /dev/null +++ b/packages/web/src/scss/components/UNSTABLE_Header/_UNSTABLE_HeaderLogo.scss @@ -0,0 +1,8 @@ +@use '@tokens' as tokens; +@use 'theme'; + +.UNSTABLE_HeaderLogo { + display: flex; + align-items: center; + height: var(--#{tokens.$css-variable-prefix}header-height); +} diff --git a/packages/web/src/scss/components/UNSTABLE_Header/_theme.scss b/packages/web/src/scss/components/UNSTABLE_Header/_theme.scss new file mode 100644 index 0000000000..236aa4d9d7 --- /dev/null +++ b/packages/web/src/scss/components/UNSTABLE_Header/_theme.scss @@ -0,0 +1,7 @@ +@use '@tokens' as tokens; + +$height: 72px; +$border-width: tokens.$border-width-100; +$border-style: solid; +$border-color: tokens.$border-basic; +$background-color: tokens.$component-header-background; diff --git a/packages/web/src/scss/components/UNSTABLE_Header/index.html b/packages/web/src/scss/components/UNSTABLE_Header/index.html new file mode 100644 index 0000000000..146f587c58 --- /dev/null +++ b/packages/web/src/scss/components/UNSTABLE_Header/index.html @@ -0,0 +1,70 @@ +{{#> web/layout/default title="Header" parentPageName="Components" isUnstable=true }} + +
+ +
+

Minimal Header

+
+ + +
+ +
+ +
+

Full Header

+
+ + +
+ +
+ +
+

Fluid Header

+
+ + +
+ +{{/web/layout/default }} diff --git a/packages/web/src/scss/components/UNSTABLE_Header/index.scss b/packages/web/src/scss/components/UNSTABLE_Header/index.scss new file mode 100644 index 0000000000..2e24c37726 --- /dev/null +++ b/packages/web/src/scss/components/UNSTABLE_Header/index.scss @@ -0,0 +1,2 @@ +@forward 'UNSTABLE_Header'; +@forward 'UNSTABLE_HeaderLogo'; diff --git a/packages/web/src/scss/components/index.scss b/packages/web/src/scss/components/index.scss index 13a2888365..912debd65c 100644 --- a/packages/web/src/scss/components/index.scss +++ b/packages/web/src/scss/components/index.scss @@ -33,6 +33,7 @@ @forward 'UNSTABLE_ActionLayout'; @forward 'UNSTABLE_Avatar'; @forward 'UNSTABLE_EmptyState'; +@forward 'UNSTABLE_Header'; @forward 'UNSTABLE_Section'; @forward 'UNSTABLE_Slider'; @forward 'UNSTABLE_Toggle'; diff --git a/tests/e2e/demo-components-compare.spec.ts-snapshots/unstable-header-chromium-linux.png b/tests/e2e/demo-components-compare.spec.ts-snapshots/unstable-header-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..13d2d3f1716457d9fd40f76fa67d1c8d9c2c2307 GIT binary patch literal 23098 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 literal 0 HcmV?d00001 From c63f3427bef332279bf137fdf009634cffba40cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kry=C5=A1p=C3=ADn?= Date: Tue, 3 Dec 2024 19:11:10 +0100 Subject: [PATCH 2/6] Feat(web): Introduce Navigation and NavigationLink components #DS-1551 #DS-1530 --- .../src/scss/components/Navigation/README.md | 89 ++++++++++++++++++ .../components/Navigation/_Navigation.scss | 23 +++++ .../Navigation/_NavigationLink.scss | 56 +++++++++++ .../scss/components/Navigation/_theme.scss | 24 +++++ .../src/scss/components/Navigation/index.html | 84 +++++++++++++++++ .../src/scss/components/Navigation/index.scss | 2 + .../scss/components/UNSTABLE_Header/README.md | 57 +++++++++++ .../components/UNSTABLE_Header/index.html | 59 ++++++++++++ packages/web/src/scss/components/index.scss | 1 + .../navigation-chromium-linux.png | Bin 0 -> 21923 bytes .../unstable-header-chromium-linux.png | Bin 23098 -> 38709 bytes .../web-chromium-linux.png | Bin 89578 -> 94380 bytes 12 files changed, 395 insertions(+) create mode 100644 packages/web/src/scss/components/Navigation/README.md create mode 100644 packages/web/src/scss/components/Navigation/_Navigation.scss create mode 100644 packages/web/src/scss/components/Navigation/_NavigationLink.scss create mode 100644 packages/web/src/scss/components/Navigation/_theme.scss create mode 100644 packages/web/src/scss/components/Navigation/index.html create mode 100644 packages/web/src/scss/components/Navigation/index.scss create mode 100644 tests/e2e/demo-components-compare.spec.ts-snapshots/navigation-chromium-linux.png diff --git a/packages/web/src/scss/components/Navigation/README.md b/packages/web/src/scss/components/Navigation/README.md new file mode 100644 index 0000000000..b754c9d60f --- /dev/null +++ b/packages/web/src/scss/components/Navigation/README.md @@ -0,0 +1,89 @@ +# Navigation + +The `Navigation` component is a container for the navigation links of the application. + +It consists of these parts: + +- [Navigation](#navigation) +- [NavigationLink](#navigationlink) + +## Navigation + +The `Navigation` is a `nav` wrapper for lists of links or other navigation components. + +```html + +``` + +It centers its children vertically and if the children are not NavigationLink components, +it will insert a gap between them. + +ℹ️ If you plan to provide a list of links, wrap them in a `ul` and `li` elements. If not, you can use the +`nav` element directly. + +ℹ️ Don't forget to add the `aria-label` attribute to the `Navigation` component for correct accessible state. + +## NavigationLink + +The `NavigationLink` is component that is styled to be used as a navigation link. + +```html +Link +``` + +It can obtain `selected` or `disabled` states by adding the respective classes. + +```html +Selected Link +Disabled Link +``` + +ℹ️ Don't forget to add the `aria-current="page"` attribute for correct accessible state if selected. + +ℹ️ Please note that in the `disabled` state the `NavigationLink` should not be an `a` tag. + +If the `NavigationLink` is inside a [`UNSTABLE_Header`][web-unstable-header] component, it will +inherit the height of the `Header`. + +### Full Example + +With NavigationLink components: + +```html + +``` + +With Buttons: + +```html + +``` + +[web-unstable-header]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web/src/scss/components/UNSTABLE_Header/README.md diff --git a/packages/web/src/scss/components/Navigation/_Navigation.scss b/packages/web/src/scss/components/Navigation/_Navigation.scss new file mode 100644 index 0000000000..ae96ceab3f --- /dev/null +++ b/packages/web/src/scss/components/Navigation/_Navigation.scss @@ -0,0 +1,23 @@ +@use '@tokens' as tokens; +@use '../../tools/reset'; +@use 'theme'; + +.Navigation, +.Navigation > ul, +.Navigation > ul > li { + display: flex; +} + +.Navigation:has(.NavigationLink) { + height: var(--#{tokens.$css-variable-prefix}navigation-height, theme.$height); +} + +.Navigation:not(:has(.NavigationLink)), +.Navigation:not(:has(.NavigationLink)) > ul { + gap: theme.$spacing; + align-items: center; +} + +.Navigation > ul { + @include reset.list(); +} diff --git a/packages/web/src/scss/components/Navigation/_NavigationLink.scss b/packages/web/src/scss/components/Navigation/_NavigationLink.scss new file mode 100644 index 0000000000..f0675e030c --- /dev/null +++ b/packages/web/src/scss/components/Navigation/_NavigationLink.scss @@ -0,0 +1,56 @@ +// 1. We need to set the top border too, otherwise the content won't be aligned properly. + +@use '@tokens' as tokens; +@use '../../tools/typography'; +@use 'theme'; + +.NavigationLink { + @include typography.generate(theme.$link-typography); + + display: flex; + align-items: center; + justify-content: center; + padding-inline: theme.$link-spacing; + color: theme.$link-color-state-default; + border-top: theme.$link-border-bottom-width theme.$link-border-bottom-style transparent; // 1. + border-bottom: theme.$link-border-bottom-width theme.$link-border-bottom-style + theme.$link-border-bottom-color-state-default; + background-color: theme.$link-background-color-state-default; + + @media (hover: hover) { + &:hover { + text-decoration: none; + color: theme.$link-color-state-hover; + border-bottom-color: theme.$link-border-bottom-color-state-hover; + background-color: theme.$link-background-color-state-hover; + } + } + + &:active { + text-decoration: none; + color: theme.$link-color-state-active; + border-bottom-color: theme.$link-border-bottom-color-state-active; + background-color: theme.$link-background-color-state-active; + } +} + +.NavigationLink--selected { + color: theme.$link-color-state-selected; + border-bottom-color: theme.$link-border-bottom-color-selected-state-default; + background-color: theme.$link-background-color-state-selected; + + @media (hover: hover) { + &:hover { + border-bottom-color: theme.$link-border-bottom-color-selected-state-hover; + } + } + + &:active { + border-bottom-color: theme.$link-border-bottom-color-selected-state-active; + } +} + +.NavigationLink--disabled { + color: theme.$link-color-state-disabled; + pointer-events: none; +} diff --git a/packages/web/src/scss/components/Navigation/_theme.scss b/packages/web/src/scss/components/Navigation/_theme.scss new file mode 100644 index 0000000000..0e087b203b --- /dev/null +++ b/packages/web/src/scss/components/Navigation/_theme.scss @@ -0,0 +1,24 @@ +@use '@tokens' as tokens; + +$spacing: tokens.$space-700; +$height: 50px; + +$link-typography: tokens.$body-small-semibold; +$link-spacing: tokens.$space-600; +$link-color-state-default: tokens.$component-header-item-state-default; +$link-color-state-hover: tokens.$component-header-item-state-hover; +$link-color-state-active: tokens.$component-header-item-state-active; +$link-color-state-selected: tokens.$component-header-item-state-selected; +$link-color-state-disabled: tokens.$disabled-content; +$link-border-bottom-width: tokens.$border-width-200; +$link-border-bottom-style: solid; +$link-border-bottom-color-state-default: transparent; +$link-border-bottom-color-state-hover: tokens.$component-header-stripe-state-unselected; +$link-border-bottom-color-state-active: tokens.$component-header-stripe-state-unselected; +$link-border-bottom-color-selected-state-default: tokens.$component-header-stripe-state-selected; +$link-border-bottom-color-selected-state-hover: tokens.$component-header-stripe-state-selected; +$link-border-bottom-color-selected-state-active: tokens.$component-header-stripe-state-selected; +$link-background-color-state-default: tokens.$component-header-item-background-state-default; +$link-background-color-state-hover: tokens.$component-header-item-background-state-hover; +$link-background-color-state-active: tokens.$component-header-item-background-state-active; +$link-background-color-state-selected: tokens.$component-header-item-background-state-selected; diff --git a/packages/web/src/scss/components/Navigation/index.html b/packages/web/src/scss/components/Navigation/index.html new file mode 100644 index 0000000000..33fde3ec61 --- /dev/null +++ b/packages/web/src/scss/components/Navigation/index.html @@ -0,0 +1,84 @@ +{{#> web/layout/default title="Navigation" parentPageName="Components" }} + +
+ +
+ +

Navigation

+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +

NavigationLink

+ +
+ + + +
+ +
+ +
+ +
+ +
+ +

Navigation with Buttons

+ +
+ + + +
+ +
+ +
+ +{{/web/layout/default }} diff --git a/packages/web/src/scss/components/Navigation/index.scss b/packages/web/src/scss/components/Navigation/index.scss new file mode 100644 index 0000000000..b7fc4e9b32 --- /dev/null +++ b/packages/web/src/scss/components/Navigation/index.scss @@ -0,0 +1,2 @@ +@forward 'Navigation'; +@forward 'NavigationLink'; diff --git a/packages/web/src/scss/components/UNSTABLE_Header/README.md b/packages/web/src/scss/components/UNSTABLE_Header/README.md index 5cf26c735a..b564098e0e 100644 --- a/packages/web/src/scss/components/UNSTABLE_Header/README.md +++ b/packages/web/src/scss/components/UNSTABLE_Header/README.md @@ -117,5 +117,62 @@ If you need the whole Header fluid you can do it by adding the `Container--fluid ``` +## With Navigation + +You can use the [`Navigation`][web-navigation] component inside the `UNSTABLE_Header` component. + +The `NavigationLink` components will inherit the `UNSTABLE_Header` height and set the navigation +link height to the same value. + +Use the composition mentioned above to create the layout you need. + +```html +
+
+
+ + + + + +
+
+
+``` + [web-container]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web/src/scss/components/Container/README.md [web-flex]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web/src/scss/components/Flex/README.md +[web-navigation]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web/src/scss/components/Navigation/README.md diff --git a/packages/web/src/scss/components/UNSTABLE_Header/index.html b/packages/web/src/scss/components/UNSTABLE_Header/index.html index 146f587c58..bcb5e25e78 100644 --- a/packages/web/src/scss/components/UNSTABLE_Header/index.html +++ b/packages/web/src/scss/components/UNSTABLE_Header/index.html @@ -67,4 +67,63 @@

Fluid Header

+
+ +
+

With Navigation

+
+ +
+ +
+
+
+ + + + + + +
+
+
+ +
+
+ {{/web/layout/default }} diff --git a/packages/web/src/scss/components/index.scss b/packages/web/src/scss/components/index.scss index 912debd65c..a12da9416a 100644 --- a/packages/web/src/scss/components/index.scss +++ b/packages/web/src/scss/components/index.scss @@ -16,6 +16,7 @@ @forward 'Header'; @forward 'Item'; @forward 'Modal'; +@forward 'Navigation'; @forward 'Pagination'; @forward 'PartnerLogo'; @forward 'Pill'; diff --git a/tests/e2e/demo-components-compare.spec.ts-snapshots/navigation-chromium-linux.png b/tests/e2e/demo-components-compare.spec.ts-snapshots/navigation-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0d0423d35b7143a65f592b21380f1fe0d89750 GIT binary patch literal 21923 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
  • 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 z +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 delta 6893 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 G2~7a~p=Cw@ delta 38032 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

    P-`29!l-#d} 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 From ffa53749ef67859688c37aeb7b3549bd0d860a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8Curda?= Date: Mon, 2 Dec 2024 11:27:20 +0100 Subject: [PATCH 3/6] Feat(web-react): Introduce UNSTABLE_Header #DS-1524 --- packages/web-react/scripts/entryPoints.js | 2 + .../src/components/UNSTABLE_Header/README.md | 178 ++++++++++++++++++ .../UNSTABLE_Header/UNSTABLE_Header.tsx | 22 +++ .../UNSTABLE_Header/UNSTABLE_HeaderLogo.tsx | 43 +++++ .../__tests__/UNSTABLE_Header.test.tsx | 23 +++ .../__tests__/UNSTABLE_HeaderLogo.test.tsx | 27 +++ .../useUnstableHeaderStyleProps.test.ts | 12 ++ .../UNSTABLE_Header/demo/HeaderDefault.tsx | 22 +++ .../UNSTABLE_Header/demo/HeaderFluid.tsx | 23 +++ .../UNSTABLE_Header/demo/HeaderMinimal.tsx | 20 ++ .../demo/HeaderWithNavigation.tsx | 56 ++++++ .../components/UNSTABLE_Header/demo/index.tsx | 32 ++++ .../src/components/UNSTABLE_Header/index.html | 1 + .../src/components/UNSTABLE_Header/index.ts | 5 + .../stories/UNSTABLE_Header.stories.tsx | 32 ++++ .../stories/UNSTABLE_HeaderLogo.stories.tsx | 27 +++ .../useUnstableHeaderStyleProps.ts | 23 +++ packages/web-react/src/types/index.ts | 1 + .../web-react/src/types/unstableHeader.ts | 24 +++ 19 files changed, 573 insertions(+) create mode 100644 packages/web-react/src/components/UNSTABLE_Header/README.md create mode 100644 packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_Header.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_HeaderLogo.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_Header.test.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_HeaderLogo.test.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/__tests__/useUnstableHeaderStyleProps.test.ts create mode 100644 packages/web-react/src/components/UNSTABLE_Header/demo/HeaderDefault.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/demo/HeaderFluid.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/demo/HeaderMinimal.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/demo/index.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/index.html create mode 100644 packages/web-react/src/components/UNSTABLE_Header/index.ts create mode 100644 packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_Header.stories.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_HeaderLogo.stories.tsx create mode 100644 packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts create mode 100644 packages/web-react/src/types/unstableHeader.ts diff --git a/packages/web-react/scripts/entryPoints.js b/packages/web-react/scripts/entryPoints.js index 266716c8d5..23580ca9e8 100644 --- a/packages/web-react/scripts/entryPoints.js +++ b/packages/web-react/scripts/entryPoints.js @@ -33,6 +33,7 @@ const entryPoints = [ { dirs: ['components', 'Item'] }, { dirs: ['components', 'Link'] }, { dirs: ['components', 'Modal'] }, + { dirs: ['components', 'Navigation'] }, { dirs: ['components', 'NoSsr'] }, { dirs: ['components', 'Pagination'] }, { dirs: ['components', 'PartnerLogo'] }, @@ -54,6 +55,7 @@ const entryPoints = [ { dirs: ['components', 'UNSTABLE_ActionLayout'] }, { dirs: ['components', 'UNSTABLE_Avatar'] }, { dirs: ['components', 'UNSTABLE_EmptyState'] }, + { dirs: ['components', 'UNSTABLE_Header'] }, { dirs: ['components', 'UNSTABLE_Slider'] }, { dirs: ['components', 'UNSTABLE_Toggle'] }, { dirs: ['components', 'UNSTABLE_Truncate'] }, diff --git a/packages/web-react/src/components/UNSTABLE_Header/README.md b/packages/web-react/src/components/UNSTABLE_Header/README.md new file mode 100644 index 0000000000..2a37500ab9 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/README.md @@ -0,0 +1,178 @@ +# UNSTABLE Header + +> ⚠️ This component is UNSTABLE. It may significantly change at any point in the future. +> Please use it with caution. + +The `UNSTABLE_Header` component is planned to replace the `Header` component in the future. + +The `UNSTABLE_Header` is a composition of several subcomponents: + +- [UNSTABLE_Header](#unstable-header) +- [UNSTABLE_HeaderLogo](#unstable-headerlogo) + +## UNSTABLE Header + +The `UNSTABLE_Header` component is a main wrapper which provides mainly the visual for the Header. + +```jsx +import { UNSTABLE_Header } from '@lmc-eu/spirit-web-react'; + +{/* Content go here */}; +``` + +It also sets CSS variable for the Header height which can be used in other nested components. + +### API + +| Name | Type | Default | Required | Description | +| ---------- | ----------------------- | ------- | -------- | ------------------------------ | +| `children` | `string` \| `ReactNode` | `null` | ✓ | Content of the UNSTABLE_Header | + +The components accept [additional attributes][readme-additional-attributes]. +If you need more control over the styling of a component, you can use [style props][readme-style-props] +and [escape hatches][readme-escape-hatches]. + +## UNSTABLE HeaderLogo + +The `UNSTABLE_HeaderLogo` component is a container for the logo. + +Without any modifier, Header is ready to contain necessary blocks in a classic +left-to-right layout (in LTR documents). + +```jsx +import { UNSTABLE_HeaderLogo } from '@lmc-eu/spirit-web-react'; + +{/* Content go here */}; +``` + +It inherits the `UNSTABLE_Header` height and sets the logo wrapper height to the same value. + +You can use the `ProductLogo` component inside the `UNSTABLE_HeaderLogo` component. + +```jsx + + {/* Logo go here */} + +``` + +### API + +| Name | Type | Default | Required | Description | +| ------------- | ----------------------- | ------- | -------- | ---------------------------------- | +| `children` | `string` \| `ReactNode` | `null` | ✓ | Content of the UNSTABLE_HeaderLogo | +| `elementType` | `ElementType` | `a` | ✕ | Type of element used as | + +## Component Composition + +Use [`Container`][web-react-container] and [`Flex`][web-react-flex] components to create a layout for the Header content. + +```jsx + + + + + {/* Logo go here */} + + {/* Navigation go here */} + {/* Other Navigation go here */} + + + +``` + +This way you can modify the layout of the Header content easily and modify it how you need. + +For example you can make the content centered by setting the `Flex` alignment properties to center. + +```jsx + + + + {/* Content go here */} + + + +``` + +Or you can make modify gaps between the content by setting the `Flex` spacing property. + +```jsx + + + + + {/* Logo go here */} + + {/* Navigation go here */} + {/* Other Navigation go here */} + + + +``` + +If you need the whole Header fluid you can do it by adding the `isFluid` prop to the `Container`. + +```jsx + + + + + {/* Content go here */} + + + + +``` + +## With Navigation + +You can use the [`Navigation`][web-react-navigation] component inside the `UNSTABLE_Header` component. + +The `NavigationLink` components will inherit the `UNSTABLE_Header` height and set the navigation +link height to the same value. + +Use the composition mentioned above to create the layout you need. + +```jsx + + + + + {/* Logo go here */} + + + + Link + + + + Selected + + + + + Disabled + + + + + + + Sign up + + + + Post a job + + + + + +``` + +[readme-additional-attributes]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/README.md#additional-attributes +[readme-escape-hatches]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/README.md#escape-hatches +[readme-style-props]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/README.md#style-props +[web-react-container]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/src/components/Container/README.md +[web-react-flex]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/src/components/Flex/README.md +[web-react-navigation]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/src/components/Navigation/README.md diff --git a/packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_Header.tsx b/packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_Header.tsx new file mode 100644 index 0000000000..7bed7ff010 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_Header.tsx @@ -0,0 +1,22 @@ +'use client'; + +import classNames from 'classnames'; +import React from 'react'; +import { useStyleProps } from '../../hooks'; +import { SpiritHeaderProps } from '../../types'; +import { useUnstableHeaderStyleProps } from './useUnstableHeaderStyleProps'; + +const UNSTABLE_Header = (props: SpiritHeaderProps): JSX.Element => { + const { children, ...restProps } = props; + + const { classProps, props: modifiedProps } = useUnstableHeaderStyleProps(restProps); + const { styleProps, props: otherProps } = useStyleProps(modifiedProps); + + return ( +

    + {children} +
    + ); +}; + +export default UNSTABLE_Header; diff --git a/packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_HeaderLogo.tsx b/packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_HeaderLogo.tsx new file mode 100644 index 0000000000..f8436ad692 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/UNSTABLE_HeaderLogo.tsx @@ -0,0 +1,43 @@ +'use client'; + +import classNames from 'classnames'; +import React, { ElementType, forwardRef } from 'react'; +import { useStyleProps } from '../../hooks'; +import { PolymorphicRef, SpiritHeaderLogoProps } from '../../types'; +import { useUnstableHeaderStyleProps } from './useUnstableHeaderStyleProps'; + +const defaultProps: Partial = { + elementType: 'a', +}; + +/* We need an exception for components exported with forwardRef */ +/* eslint no-underscore-dangle: ['error', { allow: ['_HeaderLogo'] }] */ +const _HeaderLogo = ( + props: SpiritHeaderLogoProps, + ref: PolymorphicRef, +): JSX.Element => { + const propsWithDefaults = { ...defaultProps, ...props }; + const { + elementType: ElementTag = defaultProps.elementType as ElementType, + children, + ...restProps + } = propsWithDefaults; + const { classProps, props: modifiedProps } = useUnstableHeaderStyleProps(restProps); + const { styleProps, props: otherProps } = useStyleProps(modifiedProps); + + return ( + + {children} + + ); +}; + +const UNSTABLE_HeaderLogo = forwardRef>(_HeaderLogo); + +export default UNSTABLE_HeaderLogo; diff --git a/packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_Header.test.tsx b/packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_Header.test.tsx new file mode 100644 index 0000000000..29194763ce --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_Header.test.tsx @@ -0,0 +1,23 @@ +import '@testing-library/jest-dom'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { classNamePrefixProviderTest } from '../../../../tests/providerTests/classNamePrefixProviderTest'; +import { restPropsTest } from '../../../../tests/providerTests/restPropsTest'; +import { stylePropsTest } from '../../../../tests/providerTests/stylePropsTest'; +import UNSTABLE_Header from '../UNSTABLE_Header'; + +describe('UNSTABLE_Header', () => { + classNamePrefixProviderTest(UNSTABLE_Header, 'UNSTABLE_Header'); + + stylePropsTest(UNSTABLE_Header); + + restPropsTest(UNSTABLE_Header, 'header'); + + it('should have default classname', () => { + render(Content); + + const header = screen.getByRole('banner'); + + expect(header).toHaveClass('UNSTABLE_Header'); + }); +}); diff --git a/packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_HeaderLogo.test.tsx b/packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_HeaderLogo.test.tsx new file mode 100644 index 0000000000..a50db40d4c --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/__tests__/UNSTABLE_HeaderLogo.test.tsx @@ -0,0 +1,27 @@ +import '@testing-library/jest-dom'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { classNamePrefixProviderTest } from '../../../../tests/providerTests/classNamePrefixProviderTest'; +import { restPropsTest } from '../../../../tests/providerTests/restPropsTest'; +import { stylePropsTest } from '../../../../tests/providerTests/stylePropsTest'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +describe('UNSTABLE_HeaderLogo', () => { + classNamePrefixProviderTest(UNSTABLE_HeaderLogo, 'UNSTABLE_HeaderLogo'); + + stylePropsTest(UNSTABLE_HeaderLogo); + + restPropsTest(UNSTABLE_HeaderLogo, 'a'); + + it('should have default classname', () => { + render(Content); + + expect(screen.getByRole('link')).toHaveClass('UNSTABLE_HeaderLogo'); + }); + + it('should render children', () => { + render(Content); + + expect(screen.getByText('Content')).toBeInTheDocument(); + }); +}); diff --git a/packages/web-react/src/components/UNSTABLE_Header/__tests__/useUnstableHeaderStyleProps.test.ts b/packages/web-react/src/components/UNSTABLE_Header/__tests__/useUnstableHeaderStyleProps.test.ts new file mode 100644 index 0000000000..37c8baceca --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/__tests__/useUnstableHeaderStyleProps.test.ts @@ -0,0 +1,12 @@ +import { renderHook } from '@testing-library/react'; +import { useUnstableHeaderStyleProps } from '../useUnstableHeaderStyleProps'; + +describe('useUnstableHeaderStyleProps', () => { + it('should return defaults', () => { + const props = {}; + const { result } = renderHook(() => useUnstableHeaderStyleProps(props)); + + expect(result.current.classProps.root).toBe('UNSTABLE_Header'); + expect(result.current.classProps.logo).toBe('UNSTABLE_HeaderLogo'); + }); +}); diff --git a/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderDefault.tsx b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderDefault.tsx new file mode 100644 index 0000000000..ffb0f82722 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderDefault.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { Container } from '../../Container'; +import { Flex } from '../../Flex'; +import { ProductLogo } from '../../ProductLogo'; +import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; +import UNSTABLE_Header from '../UNSTABLE_Header'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +const HeaderDefault = () => { + return ( + + + + + {defaultSvgLogo} + + + + + ); +}; +export default HeaderDefault; diff --git a/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderFluid.tsx b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderFluid.tsx new file mode 100644 index 0000000000..ef88dc485b --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderFluid.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Container } from '../../Container'; +import { Flex } from '../../Flex'; +import { ProductLogo } from '../../ProductLogo'; +import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; +import UNSTABLE_Header from '../UNSTABLE_Header'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +const HeaderFluid = () => { + return ( + + + + + {defaultSvgLogo} + + + + + ); +}; + +export default HeaderFluid; diff --git a/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderMinimal.tsx b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderMinimal.tsx new file mode 100644 index 0000000000..ae670e0fb9 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderMinimal.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Flex } from '../../Flex'; +import { ProductLogo } from '../../ProductLogo'; +import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; +import UNSTABLE_Header from '../UNSTABLE_Header'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +const HeaderMinimal = () => { + return ( + + + + {defaultSvgLogo} + + + + ); +}; + +export default HeaderMinimal; diff --git a/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx new file mode 100644 index 0000000000..b5eaa85e97 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { Button } from '../../Button'; +import { ButtonLink } from '../../ButtonLink'; +import { Container } from '../../Container'; +import { Flex } from '../../Flex'; +import { Icon } from '../../Icon'; +import { Navigation, NavigationItem, NavigationLink } from '../../Navigation'; +import { ProductLogo } from '../../ProductLogo'; +import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; +import UNSTABLE_Header from '../UNSTABLE_Header'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +const HeaderDefault = () => { + return ( + + + + + {defaultSvgLogo} + + + + Link + + + + Selected + + + + + Disabled + + + + + + + + + + Sign up + + + + Post a job + + + + + + ); +}; +export default HeaderDefault; diff --git a/packages/web-react/src/components/UNSTABLE_Header/demo/index.tsx b/packages/web-react/src/components/UNSTABLE_Header/demo/index.tsx new file mode 100644 index 0000000000..2eff55e20a --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/demo/index.tsx @@ -0,0 +1,32 @@ +// Because there is no `dist` directory during the CI run +/* eslint-disable import/no-extraneous-dependencies, import/extensions, import/no-unresolved */ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment, import/extensions, import/no-unresolved +// @ts-ignore: No declaration file -- @see https://jira.almacareer.tech/browse/DS-561 +import icons from '@lmc-eu/spirit-icons/icons'; +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import DocsSection from '../../../../docs/DocsSections'; +import { IconsProvider } from '../../../context'; +import HeaderDefault from './HeaderDefault'; +import HeaderFluid from './HeaderFluid'; +import HeaderMinimal from './HeaderMinimal'; +import HeaderWithNavigation from './HeaderWithNavigation'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + + + + + + + + + + + + , +); diff --git a/packages/web-react/src/components/UNSTABLE_Header/index.html b/packages/web-react/src/components/UNSTABLE_Header/index.html new file mode 100644 index 0000000000..39c220fe8c --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/index.html @@ -0,0 +1 @@ +{{> web-react/demo title="Header" parentPageName="Components" isUnstable=true }} diff --git a/packages/web-react/src/components/UNSTABLE_Header/index.ts b/packages/web-react/src/components/UNSTABLE_Header/index.ts new file mode 100644 index 0000000000..21190c8b5b --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/index.ts @@ -0,0 +1,5 @@ +'use client'; + +export { default as UNSTABLE_Header } from './UNSTABLE_Header'; +export { default as UNSTABLE_HeaderLogo } from './UNSTABLE_HeaderLogo'; +export * as useUnstableHeaderStyleProps from './useUnstableHeaderStyleProps'; diff --git a/packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_Header.stories.tsx b/packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_Header.stories.tsx new file mode 100644 index 0000000000..a5179ac903 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_Header.stories.tsx @@ -0,0 +1,32 @@ +import { Markdown } from '@storybook/blocks'; +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import { ProductLogo } from '../../ProductLogo'; +import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; +import ReadMe from '../README.md'; +import UNSTABLE_Header from '../UNSTABLE_Header'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +const meta: Meta = { + title: 'Experimental/UNSTABLE_Header', + component: UNSTABLE_Header, + parameters: { + docs: { + page: () => {ReadMe}, + }, + }, + args: { + children: ( + + {defaultSvgLogo} + + ), + }, +}; + +export default meta; +type Story = StoryObj; + +export const Playground: Story = { + name: 'UNSTABLE_Header', +}; diff --git a/packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_HeaderLogo.stories.tsx b/packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_HeaderLogo.stories.tsx new file mode 100644 index 0000000000..4f7cfa5ef7 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/stories/UNSTABLE_HeaderLogo.stories.tsx @@ -0,0 +1,27 @@ +import { Markdown } from '@storybook/blocks'; +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import { ProductLogo } from '../../ProductLogo'; +import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; +import ReadMe from '../README.md'; +import UNSTABLE_HeaderLogo from '../UNSTABLE_HeaderLogo'; + +const meta: Meta = { + title: 'Experimental/UNSTABLE_Header', + component: UNSTABLE_HeaderLogo, + parameters: { + docs: { + page: () => {ReadMe}, + }, + }, + args: { + children: {defaultSvgLogo}, + }, +}; + +export default meta; +type Story = StoryObj; + +export const HeaderLogoPlayground: Story = { + name: 'UNSTABLE_HeaderLogo', +}; diff --git a/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts b/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts new file mode 100644 index 0000000000..247d7b4608 --- /dev/null +++ b/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts @@ -0,0 +1,23 @@ +import { useClassNamePrefix } from '../../hooks'; +import { SpiritHeaderProps } from './UNSTABLE_Header'; + +export interface HeaderStyles { + classProps: { + root: string; + logo: string; + }; + props: T; +} + +export const useUnstableHeaderStyleProps = (props: SpiritHeaderProps): HeaderStyles => { + const headerClass = useClassNamePrefix('UNSTABLE_Header'); + const headerLogoClass = useClassNamePrefix('UNSTABLE_HeaderLogo'); + + return { + classProps: { + root: headerClass, + logo: headerLogoClass, + }, + props, + }; +}; diff --git a/packages/web-react/src/types/index.ts b/packages/web-react/src/types/index.ts index 2b2d412fb3..dbcac2de97 100644 --- a/packages/web-react/src/types/index.ts +++ b/packages/web-react/src/types/index.ts @@ -39,4 +39,5 @@ export * from './textFieldBase'; export * from './toast'; export * from './toggle'; export * from './tooltip'; +export * from './unstableHeader'; export * from './visuallyHidden'; diff --git a/packages/web-react/src/types/unstableHeader.ts b/packages/web-react/src/types/unstableHeader.ts new file mode 100644 index 0000000000..bf3186a998 --- /dev/null +++ b/packages/web-react/src/types/unstableHeader.ts @@ -0,0 +1,24 @@ +import { ChildrenProps, SpiritPolymorphicElementPropsWithRef, StyleProps, TransferProps } from './shared'; +import { LinkTarget } from './link'; +import { ElementType } from 'react'; + +export interface HeaderLogoBaseProps extends ChildrenProps, StyleProps, TransferProps { + /** Header's href attribute */ + href?: string; + /** Header's target attribute */ + target?: LinkTarget; +} + +export type HeaderLogoProps = { + /** + * The HTML element or React element used to render the button, e.g. 'div', 'a', or `RouterLink`. + * + * @default 'a' + */ + elementType?: E; +} & HeaderLogoBaseProps; + +export interface SpiritHeaderProps extends StyleProps, ChildrenProps {} + +export type SpiritHeaderLogoProps = HeaderLogoProps & + SpiritPolymorphicElementPropsWithRef>; From 121d2818a787aab7e6110ef74cd0d8f4b24935bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C4=8Curda?= Date: Mon, 2 Dec 2024 14:21:32 +0100 Subject: [PATCH 4/6] Feat(web-react): Introduce Navigation #DS-1524 --- .../src/components/Navigation/Navigation.tsx | 22 +++ .../components/Navigation/NavigationItem.tsx | 19 +++ .../components/Navigation/NavigationLink.tsx | 43 ++++++ .../src/components/Navigation/README.md | 134 ++++++++++++++++++ .../Navigation/__tests__/Navigation.test.tsx | 35 +++++ .../__tests__/NavigationItem.test.tsx | 24 ++++ .../__tests__/NavigationLink.test.tsx | 49 +++++++ .../__tests__/useNavigationLinkProps.test.ts | 97 +++++++++++++ .../useNavigationLinkStyleProps.test.ts | 26 ++++ .../__tests__/useNavigationStyleProps.test.ts | 10 ++ .../Navigation/demo/NavigationButtons.tsx | 20 +++ .../Navigation/demo/NavigationDefault.tsx | 12 ++ .../Navigation/demo/NavigationLink.tsx | 25 ++++ .../src/components/Navigation/demo/index.tsx | 20 +++ .../src/components/Navigation/index.html | 1 + .../src/components/Navigation/index.ts | 8 ++ .../Navigation/stories/Navigation.stories.tsx | 43 ++++++ .../stories/NavigationItem.stories.tsx | 31 ++++ .../stories/NavigationLink.stories.tsx | 41 ++++++ .../Navigation/useNavigationLinkProps.ts | 21 +++ .../Navigation/useNavigationLinkStyleProps.ts | 31 ++++ .../Navigation/useNavigationStyleProps.ts | 13 ++ .../src/components/UNSTABLE_Header/README.md | 9 +- .../useUnstableHeaderStyleProps.ts | 2 +- packages/web-react/src/components/index.ts | 2 + packages/web-react/src/types/index.ts | 1 + packages/web-react/src/types/navigation.ts | 42 ++++++ .../web-react/src/types/unstableHeader.ts | 4 +- .../web-react-chromium-linux.png | Bin 96526 -> 100619 bytes 29 files changed, 776 insertions(+), 9 deletions(-) create mode 100644 packages/web-react/src/components/Navigation/Navigation.tsx create mode 100644 packages/web-react/src/components/Navigation/NavigationItem.tsx create mode 100644 packages/web-react/src/components/Navigation/NavigationLink.tsx create mode 100644 packages/web-react/src/components/Navigation/README.md create mode 100644 packages/web-react/src/components/Navigation/__tests__/Navigation.test.tsx create mode 100644 packages/web-react/src/components/Navigation/__tests__/NavigationItem.test.tsx create mode 100644 packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx create mode 100644 packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts create mode 100644 packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts create mode 100644 packages/web-react/src/components/Navigation/__tests__/useNavigationStyleProps.test.ts create mode 100644 packages/web-react/src/components/Navigation/demo/NavigationButtons.tsx create mode 100644 packages/web-react/src/components/Navigation/demo/NavigationDefault.tsx create mode 100644 packages/web-react/src/components/Navigation/demo/NavigationLink.tsx create mode 100644 packages/web-react/src/components/Navigation/demo/index.tsx create mode 100644 packages/web-react/src/components/Navigation/index.html create mode 100644 packages/web-react/src/components/Navigation/index.ts create mode 100644 packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx create mode 100644 packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx create mode 100644 packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx create mode 100644 packages/web-react/src/components/Navigation/useNavigationLinkProps.ts create mode 100644 packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts create mode 100644 packages/web-react/src/components/Navigation/useNavigationStyleProps.ts create mode 100644 packages/web-react/src/types/navigation.ts diff --git a/packages/web-react/src/components/Navigation/Navigation.tsx b/packages/web-react/src/components/Navigation/Navigation.tsx new file mode 100644 index 0000000000..b27049daec --- /dev/null +++ b/packages/web-react/src/components/Navigation/Navigation.tsx @@ -0,0 +1,22 @@ +'use client'; + +import classNames from 'classnames'; +import React from 'react'; +import { useStyleProps } from '../../hooks'; +import { SpiritNavigationProps } from '../../types'; +import { useNavigationStyleProps } from './useNavigationStyleProps'; + +const Navigation = (props: SpiritNavigationProps): JSX.Element => { + const { children, ...restProps } = props; + + const { classProps } = useNavigationStyleProps(); + const { styleProps, props: otherProps } = useStyleProps(restProps); + + return ( + + ); +}; + +export default Navigation; diff --git a/packages/web-react/src/components/Navigation/NavigationItem.tsx b/packages/web-react/src/components/Navigation/NavigationItem.tsx new file mode 100644 index 0000000000..bb32fff3ca --- /dev/null +++ b/packages/web-react/src/components/Navigation/NavigationItem.tsx @@ -0,0 +1,19 @@ +'use client'; + +import React from 'react'; +import { useStyleProps } from '../../hooks'; +import { SpiritNavigationItemProps } from '../../types'; + +const NavigationItem = (props: SpiritNavigationItemProps): JSX.Element => { + const { children, ...restProps } = props; + + const { styleProps, props: otherProps } = useStyleProps(restProps); + + return ( +
  • + {children} +
  • + ); +}; + +export default NavigationItem; diff --git a/packages/web-react/src/components/Navigation/NavigationLink.tsx b/packages/web-react/src/components/Navigation/NavigationLink.tsx new file mode 100644 index 0000000000..c47c532ac5 --- /dev/null +++ b/packages/web-react/src/components/Navigation/NavigationLink.tsx @@ -0,0 +1,43 @@ +'use client'; + +import classNames from 'classnames'; +import React, { ElementType, forwardRef } from 'react'; +import { useStyleProps } from '../../hooks'; +import { PolymorphicRef, SpiritNavigationLinkProps } from '../../types'; +import { useNavigationLinkProps } from './useNavigationLinkProps'; +import { useNavigationLinkStyleProps } from './useNavigationLinkStyleProps'; + +const defaultProps: Partial = { + elementType: 'a', +}; + +/* We need an exception for components exported with forwardRef */ +/* eslint no-underscore-dangle: ['error', { allow: ['_NavigationLink'] }] */ +const _NavigationLink = ( + props: SpiritNavigationLinkProps, + ref: PolymorphicRef, +): JSX.Element => { + const propsWithDefaults = { ...defaultProps, ...props }; + const { elementType = defaultProps.elementType as ElementType, children, ...restProps } = propsWithDefaults; + const ElementTag = propsWithDefaults.isDisabled ? 'span' : elementType; + + const { navigationLinkProps } = useNavigationLinkProps(propsWithDefaults); + const { classProps, props: modifiedProps } = useNavigationLinkStyleProps(restProps); + const { styleProps, props: otherProps } = useStyleProps(modifiedProps); + + return ( + + {children} + + ); +}; + +const NavigationLink = forwardRef>(_NavigationLink); + +export default NavigationLink; diff --git a/packages/web-react/src/components/Navigation/README.md b/packages/web-react/src/components/Navigation/README.md new file mode 100644 index 0000000000..4dd8ce4653 --- /dev/null +++ b/packages/web-react/src/components/Navigation/README.md @@ -0,0 +1,134 @@ +# Navigation + +The `Navigation` component is a container for the navigation links of the application. + +It consists of a these parts: + +- [Navigation](#navigation) +- [NavigationItem](#navigation-item) +- [NavigationLink](#navigation-link) + +## Navigation + +The `Navigation` is a `nav` wrapper for navigation items. + +```jsx +import { Navigation } from '@lmc-eu/spirit-web-react'; + +{/* Navigation items go here */}; +``` + +It centres its children vertically, and if the children do not include `NavigationLink` components, +it will apply a gap between them. + +ℹ️ Don't forget to add the `aria-label` attribute to the `Navigation` component for correct accessible state. + +### API + +| Name | Type | Default | Required | Description | +| ---------- | --------------------------------------------------------------------------------------- | ------- | -------- | ------------------------- | +| `children` | `ReactElement` \| `ReactElement` \| Array of these types | `null` | ✓ | Content of the Navigation | + +The components accept [additional attributes][readme-additional-attributes]. +If you need more control over the styling of a component, you can use [style props][readme-style-props] +and [escape hatches][readme-escape-hatches]. + +## Navigation Item + +The `NavigationItem` is a container for navigation links. + +```jsx +import { NavigationItem } from '@lmc-eu/spirit-web-react'; + +{/* Navigation links go here */}; +``` + +### API + +| Name | Type | Default | Required | Description | +| ---------- | ----------------------- | ------- | -------- | ----------------------------- | +| `children` | `string` \| `ReactNode` | `null` | ✓ | Content of the NavigationItem | + +The components accept [additional attributes][readme-additional-attributes]. +If you need more control over the styling of a component, you can use [style props][readme-style-props] +and [escape hatches][readme-escape-hatches]. + +## Navigation Link + +The `NavigationLink` is component that is styled to be used as a navigation link. + +```jsx +import { NavigationLink } from '@lmc-eu/spirit-web-react'; + +Link; +``` + +It can obtain `isSelected` or `isDisabled` states by adding the respective props. + +```jsx +Selected Link +Disabled Link +``` + +ℹ️ Don't forget to add the `aria-current="page"` attribute for correct accessible state if selected. + +ℹ️ Please note that in the `isDisabled` state the `NavigationLink` will be an `span` tag. + +If the `NavigationLink` is inside a [`UNSTABLE_Header`][web-react-unstable-header] component, it will +inherit the height of the `Header`. + +### API + +| Name | Type | Default | Required | Description | +| ------------- | --------------------------------- | ------- | -------- | ----------------------------- | +| `children` | `string` \| `ReactNode` | `null` | ✓ | Content of the NavigationLink | +| `elementType` | `ElementType` | `a` | ✕ | Type of element used as | +| `href` | `string` | - | ✕ | URL of the link | +| `isDisabled` | `boolean` | `false` | ✕ | Whether the link is disabled | +| `isSelected` | `boolean` | `false` | ✕ | Whether the link is selected | +| `ref` | `ForwardedRef` | — | ✕ | Anchor element reference | +| `target` | `string` | `null` | ✕ | Link target | + +The components accept [additional attributes][readme-additional-attributes]. +If you need more control over the styling of a component, you can use [style props][readme-style-props] +and [escape hatches][readme-escape-hatches]. + +### Full Example + +With NavigationLink components: + +```jsx + + + + Selected Link + + + + + Disabled Link + + + + Link + + +``` + +With Buttons: + +```jsx + + + Button + + + Button + + +``` + +[readme-additional-attributes]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/README.md#additional-attributes +[readme-escape-hatches]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/README.md#escape-hatches +[readme-style-props]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/README.md#style-props +[web-react-unstable-header]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/src/components/UNSTABLE_Header/README.md diff --git a/packages/web-react/src/components/Navigation/__tests__/Navigation.test.tsx b/packages/web-react/src/components/Navigation/__tests__/Navigation.test.tsx new file mode 100644 index 0000000000..621ac52c91 --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/Navigation.test.tsx @@ -0,0 +1,35 @@ +import '@testing-library/jest-dom'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { classNamePrefixProviderTest } from '../../../../tests/providerTests/classNamePrefixProviderTest'; +import { restPropsTest } from '../../../../tests/providerTests/restPropsTest'; +import { stylePropsTest } from '../../../../tests/providerTests/stylePropsTest'; +import Navigation from '../Navigation'; + +describe('Navigation', () => { + classNamePrefixProviderTest(Navigation, 'Navigation'); + + stylePropsTest(Navigation); + + restPropsTest(Navigation, 'nav'); + + beforeEach(() => { + render( + +
  • Content
  • +
    , + ); + }); + + it('should have default classname', () => { + expect(screen.getByRole('navigation')).toHaveClass('Navigation'); + }); + + it('should render list and children', () => { + expect(screen.getByRole('list')).toBeInTheDocument(); + }); + + it('should render children', () => { + expect(screen.getByText('Content')).toBeInTheDocument(); + }); +}); diff --git a/packages/web-react/src/components/Navigation/__tests__/NavigationItem.test.tsx b/packages/web-react/src/components/Navigation/__tests__/NavigationItem.test.tsx new file mode 100644 index 0000000000..2037bdb321 --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/NavigationItem.test.tsx @@ -0,0 +1,24 @@ +import '@testing-library/jest-dom'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { restPropsTest } from '../../../../tests/providerTests/restPropsTest'; +import { stylePropsTest } from '../../../../tests/providerTests/stylePropsTest'; +import NavigationItem from '../NavigationItem'; + +describe('NavigationItem', () => { + stylePropsTest(NavigationItem); + + restPropsTest(NavigationItem, 'li'); + + it('should have correct role', () => { + render(Content); + + expect(screen.getByRole('listitem')).toBeInTheDocument(); + }); + + it('should render children', () => { + render(Content); + + expect(screen.getByRole('listitem')).toHaveTextContent('Content'); + }); +}); diff --git a/packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx b/packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx new file mode 100644 index 0000000000..6e9a2d5b1f --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx @@ -0,0 +1,49 @@ +import '@testing-library/jest-dom'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { classNamePrefixProviderTest } from '../../../../tests/providerTests/classNamePrefixProviderTest'; +import { restPropsTest } from '../../../../tests/providerTests/restPropsTest'; +import { stylePropsTest } from '../../../../tests/providerTests/stylePropsTest'; +import NavigationLink from '../NavigationLink'; + +describe('NavigationLink', () => { + classNamePrefixProviderTest(NavigationLink, 'NavigationLink'); + + stylePropsTest(NavigationLink); + + restPropsTest(NavigationLink, 'a'); + + it('should have default classname', () => { + render(Content); + + expect(screen.getByRole('link')).toHaveClass('NavigationLink'); + }); + + it('should have selected classname', () => { + render( + + Content + , + ); + + expect(screen.getByRole('link')).toHaveClass('NavigationLink NavigationLink--selected'); + }); + + it('should have disabled classname and correct elementType', () => { + render( + + Content + , + ); + + expect(screen.getByText('Content')).toHaveClass('NavigationLink NavigationLink--disabled'); + expect(screen.getByText('Content')).toContainHTML('span'); + expect(screen.queryByRole('link')).not.toBeInTheDocument(); + }); + + it('should render children', () => { + render(Content); + + expect(screen.getByText('Content')).toBeInTheDocument(); + }); +}); diff --git a/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts b/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts new file mode 100644 index 0000000000..2a56d6456c --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts @@ -0,0 +1,97 @@ +import { renderHook } from '@testing-library/react'; +import { SpiritNavigationLinkProps } from '../../../types'; +import { useNavigationLinkProps } from '../useNavigationLinkProps'; + +describe('useNavigationLinkProps', () => { + it('should return defaults props', () => { + const props: SpiritNavigationLinkProps = { + href: '/', + target: '_blank', + isSelected: false, + isDisabled: false, + }; + const { result } = renderHook(() => useNavigationLinkProps(props)); + + expect(result.current).toStrictEqual({ + navigationLinkProps: { + href: '/', + rel: undefined, + target: '_blank', + }, + }); + }); + + it('should return defaults if element is different from anchor', () => { + const props: SpiritNavigationLinkProps<'span'> = { + elementType: 'span', + href: '/', + target: '_blank', + isSelected: false, + isDisabled: false, + }; + const { result } = renderHook(() => useNavigationLinkProps(props as SpiritNavigationLinkProps)); + + expect(result.current).toStrictEqual({ + navigationLinkProps: { + href: undefined, + rel: undefined, + target: undefined, + }, + }); + }); + + it('should return for isDisabled', () => { + const props: SpiritNavigationLinkProps = { + href: '/', + target: '_blank', + isSelected: false, + isDisabled: true, + }; + const { result } = renderHook(() => useNavigationLinkProps(props)); + + expect(result.current).toStrictEqual({ + navigationLinkProps: { + href: undefined, + rel: undefined, + target: undefined, + }, + }); + }); + + it('should return for isSelected', () => { + const props: SpiritNavigationLinkProps = { + href: '/', + target: '_blank', + isSelected: true, + isDisabled: false, + }; + const { result } = renderHook(() => useNavigationLinkProps(props)); + + expect(result.current).toStrictEqual({ + navigationLinkProps: { + href: '/', + rel: undefined, + target: '_blank', + }, + }); + }); + + it('should return for elementType', () => { + const props: SpiritNavigationLinkProps<'div'> = { + elementType: 'div', + href: '/', + target: '_blank', + isSelected: false, + isDisabled: false, + }; + const { result } = renderHook(() => useNavigationLinkProps(props as SpiritNavigationLinkProps)); + + expect(result.current).toStrictEqual({ + navigationLinkProps: { + href: undefined, + rel: undefined, + target: undefined, + }, + }); + }); +}); diff --git a/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts b/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts new file mode 100644 index 0000000000..d7681c4400 --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts @@ -0,0 +1,26 @@ +import { renderHook } from '@testing-library/react'; +import { SpiritNavigationLinkProps } from '../../../types'; +import { useNavigationLinkStyleProps } from '../useNavigationLinkStyleProps'; + +describe('useNavigationLinkStyleProps', () => { + it('should return defaults', () => { + const props = {}; + const { result } = renderHook(() => useNavigationLinkStyleProps(props)); + + expect(result.current.classProps).toBe('NavigationLink'); + }); + + it('should return disabled class', () => { + const props: SpiritNavigationLinkProps = { isDisabled: true }; + const { result } = renderHook(() => useNavigationLinkStyleProps(props)); + + expect(result.current.classProps).toBe('NavigationLink NavigationLink--disabled'); + }); + + it('should return selected class', () => { + const props = { isSelected: true }; + const { result } = renderHook(() => useNavigationLinkStyleProps(props)); + + expect(result.current.classProps).toBe('NavigationLink NavigationLink--selected'); + }); +}); diff --git a/packages/web-react/src/components/Navigation/__tests__/useNavigationStyleProps.test.ts b/packages/web-react/src/components/Navigation/__tests__/useNavigationStyleProps.test.ts new file mode 100644 index 0000000000..a1efc2675e --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/useNavigationStyleProps.test.ts @@ -0,0 +1,10 @@ +import { renderHook } from '@testing-library/react'; +import { useNavigationStyleProps } from '../useNavigationStyleProps'; + +describe('useNavigationStyleProps', () => { + it('should return defaults', () => { + const { result } = renderHook(() => useNavigationStyleProps()); + + expect(result.current.classProps).toBe('Navigation'); + }); +}); diff --git a/packages/web-react/src/components/Navigation/demo/NavigationButtons.tsx b/packages/web-react/src/components/Navigation/demo/NavigationButtons.tsx new file mode 100644 index 0000000000..cb0cb2f749 --- /dev/null +++ b/packages/web-react/src/components/Navigation/demo/NavigationButtons.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { ButtonLink } from '../../ButtonLink'; +import Navigation from '../Navigation'; +import NavigationItem from '../NavigationItem'; + +const NavigationDefault = () => { + return ( + + + Button + + + + Button + + + + ); +}; +export default NavigationDefault; diff --git a/packages/web-react/src/components/Navigation/demo/NavigationDefault.tsx b/packages/web-react/src/components/Navigation/demo/NavigationDefault.tsx new file mode 100644 index 0000000000..9792166066 --- /dev/null +++ b/packages/web-react/src/components/Navigation/demo/NavigationDefault.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Navigation from '../Navigation'; +import NavigationItem from '../NavigationItem'; + +const NavigationDefault = () => { + return ( + + Item + + ); +}; +export default NavigationDefault; diff --git a/packages/web-react/src/components/Navigation/demo/NavigationLink.tsx b/packages/web-react/src/components/Navigation/demo/NavigationLink.tsx new file mode 100644 index 0000000000..7ecc70c589 --- /dev/null +++ b/packages/web-react/src/components/Navigation/demo/NavigationLink.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import Navigation from '../Navigation'; +import NavigationItem from '../NavigationItem'; +import NavigationLink from '../NavigationLink'; + +const NavigationDefault = () => { + return ( + + + Link + + + + Selected + + + + + Disabled + + + + ); +}; +export default NavigationDefault; diff --git a/packages/web-react/src/components/Navigation/demo/index.tsx b/packages/web-react/src/components/Navigation/demo/index.tsx new file mode 100644 index 0000000000..01462fe662 --- /dev/null +++ b/packages/web-react/src/components/Navigation/demo/index.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import DocsSection from '../../../../docs/DocsSections'; +import NavigationButtons from './NavigationButtons'; +import NavigationDefault from './NavigationDefault'; +import NavigationLink from './NavigationLink'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + + + + + + + , +); diff --git a/packages/web-react/src/components/Navigation/index.html b/packages/web-react/src/components/Navigation/index.html new file mode 100644 index 0000000000..59b5d4e1c8 --- /dev/null +++ b/packages/web-react/src/components/Navigation/index.html @@ -0,0 +1 @@ +{{> web-react/demo title="Navigation" parentPageName="Components" }} diff --git a/packages/web-react/src/components/Navigation/index.ts b/packages/web-react/src/components/Navigation/index.ts new file mode 100644 index 0000000000..8cf2651bce --- /dev/null +++ b/packages/web-react/src/components/Navigation/index.ts @@ -0,0 +1,8 @@ +'use client'; + +export { default as Navigation } from './Navigation'; +export { default as NavigationItem } from './NavigationItem'; +export { default as NavigationLink } from './NavigationLink'; +export * from './useNavigationStyleProps'; +export * from './useNavigationLinkProps'; +export * from './useNavigationLinkStyleProps'; diff --git a/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx b/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx new file mode 100644 index 0000000000..123f16c34a --- /dev/null +++ b/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx @@ -0,0 +1,43 @@ +import { Markdown } from '@storybook/blocks'; +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import Navigation from '../Navigation'; +import NavigationItem from '../NavigationItem'; +import NavigationLink from '../NavigationLink'; +import ReadMe from '../README.md'; + +const meta: Meta = { + title: 'Components/Navigation', + component: Navigation, + parameters: { + docs: { + page: () => {ReadMe}, + }, + }, + argTypes: { + children: { + control: 'object', + }, + }, + args: { + children: ( + <> + + + Home + + + + Not Home + + + ), + }, +}; + +export default meta; +type Story = StoryObj; + +export const Playground: Story = { + name: 'Navigation', +}; diff --git a/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx b/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx new file mode 100644 index 0000000000..60ec676e0a --- /dev/null +++ b/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx @@ -0,0 +1,31 @@ +import { Markdown } from '@storybook/blocks'; +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import NavigationItem from '../NavigationItem'; +import NavigationLink from '../NavigationLink'; +import ReadMe from '../README.md'; + +const meta: Meta = { + title: 'Components/Navigation', + component: NavigationItem, + parameters: { + docs: { + page: () => {ReadMe}, + }, + }, + args: { + children: Link, + }, +}; + +export default meta; +type Story = StoryObj; + +export const NavigationItemPlayground: Story = { + name: 'NavigationItem', + render: (args) => ( +
      + +
    + ), +}; diff --git a/packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx b/packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx new file mode 100644 index 0000000000..5c531ee0da --- /dev/null +++ b/packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx @@ -0,0 +1,41 @@ +import { Markdown } from '@storybook/blocks'; +import type { Meta, StoryObj } from '@storybook/react'; +import React from 'react'; +import NavigationLink from '../NavigationLink'; +import ReadMe from '../README.md'; + +const meta: Meta = { + title: 'Components/Navigation', + component: NavigationLink, + parameters: { + docs: { + page: () => {ReadMe}, + }, + }, + argTypes: { + isDisabled: { + control: 'boolean', + table: { + defaultValue: { summary: 'false' }, + }, + }, + isSelected: { + control: 'boolean', + table: { + defaultValue: { summary: 'false' }, + }, + }, + }, + args: { + children: 'Link', + isDisabled: false, + isSelected: false, + }, +}; + +export default meta; +type Story = StoryObj; + +export const NavigationLinkPlayground: Story = { + name: 'NavigationLink', +}; diff --git a/packages/web-react/src/components/Navigation/useNavigationLinkProps.ts b/packages/web-react/src/components/Navigation/useNavigationLinkProps.ts new file mode 100644 index 0000000000..30a8ea89dd --- /dev/null +++ b/packages/web-react/src/components/Navigation/useNavigationLinkProps.ts @@ -0,0 +1,21 @@ +import { SpiritNavigationLinkProps } from '../../types'; + +export type UseNavigationLinkProps = Partial; + +export type UseNavigationLinkReturn = { + navigationLinkProps: UseNavigationLinkProps; +}; + +export const useNavigationLinkProps = (props: UseNavigationLinkProps): UseNavigationLinkReturn => { + const { elementType = 'a', isDisabled, href, target, rel } = props; + + const navigationLinkProps: Partial = { + href: elementType === 'a' && !isDisabled ? href : undefined, + target: elementType === 'a' && !isDisabled ? target : undefined, + rel: elementType === 'a' ? rel : undefined, + }; + + return { + navigationLinkProps, + }; +}; diff --git a/packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts b/packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts new file mode 100644 index 0000000000..bdd2cca267 --- /dev/null +++ b/packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts @@ -0,0 +1,31 @@ +import classNames from 'classnames'; +import { ElementType } from 'react'; +import { useClassNamePrefix } from '../../hooks'; +import { LinkProps, SpiritNavigationLinkProps } from '../../types'; + +export interface NavigationLinkStyles { + /** className props */ + classProps: string | null; + /** props to be passed to the input element */ + props: Partial>; +} + +export function useNavigationLinkStyleProps( + props: SpiritNavigationLinkProps, +): NavigationLinkStyles { + const { isDisabled, isSelected, ...restProps } = props; + + const navigationLinkClass = useClassNamePrefix('NavigationLink'); + const navigationLinkDisabledClass = `${navigationLinkClass}--disabled`; + const navigationLinkSelectedClass = `${navigationLinkClass}--selected`; + + const className = classNames(navigationLinkClass, { + [navigationLinkDisabledClass]: isDisabled, + [navigationLinkSelectedClass]: isSelected, + }); + + return { + classProps: className, + props: restProps, + }; +} diff --git a/packages/web-react/src/components/Navigation/useNavigationStyleProps.ts b/packages/web-react/src/components/Navigation/useNavigationStyleProps.ts new file mode 100644 index 0000000000..608f5492f7 --- /dev/null +++ b/packages/web-react/src/components/Navigation/useNavigationStyleProps.ts @@ -0,0 +1,13 @@ +import { useClassNamePrefix } from '../../hooks'; + +export interface NavigationStyles { + classProps: string; +} + +export const useNavigationStyleProps = () => { + const navigationClass = useClassNamePrefix('Navigation'); + + return { + classProps: navigationClass, + }; +}; diff --git a/packages/web-react/src/components/UNSTABLE_Header/README.md b/packages/web-react/src/components/UNSTABLE_Header/README.md index 2a37500ab9..b4dc55c6e4 100644 --- a/packages/web-react/src/components/UNSTABLE_Header/README.md +++ b/packages/web-react/src/components/UNSTABLE_Header/README.md @@ -20,7 +20,7 @@ import { UNSTABLE_Header } from '@lmc-eu/spirit-web-react'; {/* Content go here */}; ``` -It also sets CSS variable for the Header height which can be used in other nested components. +It also sets CSS variable for the Header height which can be used by nested components. ### API @@ -36,9 +36,6 @@ and [escape hatches][readme-escape-hatches]. The `UNSTABLE_HeaderLogo` component is a container for the logo. -Without any modifier, Header is ready to contain necessary blocks in a classic -left-to-right layout (in LTR documents). - ```jsx import { UNSTABLE_HeaderLogo } from '@lmc-eu/spirit-web-react'; @@ -80,7 +77,7 @@ Use [`Container`][web-react-container] and [`Flex`][web-react-flex] components t ``` -This way you can modify the layout of the Header content easily and modify it how you need. +This way you can easily modify the layout of the Header content. For example you can make the content centered by setting the `Flex` alignment properties to center. @@ -94,7 +91,7 @@ For example you can make the content centered by setting the `Flex` alignment pr ``` -Or you can make modify gaps between the content by setting the `Flex` spacing property. +Or you can modify the gaps between the content by setting the `Flex` `spacing` property. ```jsx diff --git a/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts b/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts index 247d7b4608..ec38f218e7 100644 --- a/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts +++ b/packages/web-react/src/components/UNSTABLE_Header/useUnstableHeaderStyleProps.ts @@ -1,5 +1,5 @@ import { useClassNamePrefix } from '../../hooks'; -import { SpiritHeaderProps } from './UNSTABLE_Header'; +import { SpiritHeaderProps } from '../../types'; export interface HeaderStyles { classProps: { diff --git a/packages/web-react/src/components/index.ts b/packages/web-react/src/components/index.ts index c9d80396ac..95189c68a4 100644 --- a/packages/web-react/src/components/index.ts +++ b/packages/web-react/src/components/index.ts @@ -23,6 +23,7 @@ export * from './Icon'; export * from './Item'; export * from './Link'; export * from './Modal'; +export * from './Navigation'; export * from './NoSsr'; export * from './Pagination'; export * from './PartnerLogo'; @@ -43,6 +44,7 @@ export * from './Toast'; export * from './Tooltip'; export * from './UNSTABLE_ActionLayout'; export * from './UNSTABLE_Avatar'; +export * from './UNSTABLE_Header'; export * from './UNSTABLE_EmptyState'; export * from './UNSTABLE_Slider'; export * from './UNSTABLE_Toggle'; diff --git a/packages/web-react/src/types/index.ts b/packages/web-react/src/types/index.ts index dbcac2de97..31a206da2e 100644 --- a/packages/web-react/src/types/index.ts +++ b/packages/web-react/src/types/index.ts @@ -21,6 +21,7 @@ export * from './item'; export * from './label'; export * from './link'; export * from './modal'; +export * from './navigation'; export * from './pagination'; export * from './pill'; export * from './radio'; diff --git a/packages/web-react/src/types/navigation.ts b/packages/web-react/src/types/navigation.ts new file mode 100644 index 0000000000..2c3f9c490e --- /dev/null +++ b/packages/web-react/src/types/navigation.ts @@ -0,0 +1,42 @@ +import { ElementType, ReactElement } from 'react'; +import { NavigationItem } from '../components'; +import { LinkTarget } from './link'; +import { + AriaLabelingProps, + ChildrenProps, + SpiritPolymorphicElementPropsWithRef, + StyleProps, + TransferProps, +} from './shared'; + +export interface NavigationLinkBaseProps extends ChildrenProps, StyleProps, AriaLabelingProps, TransferProps { + /** NavigationLink's href attribute */ + href?: string; + /** Whether is the NavigationLink disabled */ + isDisabled?: boolean; + /** Whether is the NavigationLink selected */ + isSelected?: boolean; + /** NavigationLink's target attribute */ + target?: LinkTarget; +} + +export type NavigationLinkProps = { + /** + * The HTML element or React element used to render the button, e.g. 'div', 'a', or `RouterLink`. + * + * @default 'a' + */ + elementType?: E; +} & NavigationLinkBaseProps; + +export interface SpiritNavigationItemProps extends ChildrenProps, StyleProps {} + +export type SpiritNavigationLinkProps = NavigationLinkProps & + SpiritPolymorphicElementPropsWithRef>; + +export interface SpiritNavigationProps extends StyleProps, AriaLabelingProps { + children: + | ReactElement + | ReactElement + | Array | ReactElement>; +} diff --git a/packages/web-react/src/types/unstableHeader.ts b/packages/web-react/src/types/unstableHeader.ts index bf3186a998..f970e0592f 100644 --- a/packages/web-react/src/types/unstableHeader.ts +++ b/packages/web-react/src/types/unstableHeader.ts @@ -1,6 +1,6 @@ -import { ChildrenProps, SpiritPolymorphicElementPropsWithRef, StyleProps, TransferProps } from './shared'; -import { LinkTarget } from './link'; import { ElementType } from 'react'; +import { LinkTarget } from './link'; +import { ChildrenProps, SpiritPolymorphicElementPropsWithRef, StyleProps, TransferProps } from './shared'; export interface HeaderLogoBaseProps extends ChildrenProps, StyleProps, TransferProps { /** Header's href attribute */ diff --git a/tests/e2e/demo-homepages.spec.ts-snapshots/web-react-chromium-linux.png b/tests/e2e/demo-homepages.spec.ts-snapshots/web-react-chromium-linux.png index ba01f4b6b54ce5954fef82ca9a3a56fb3785ee57..8ca7ae2480b7c4aa19e245aabd56be9cb4c42d9f 100644 GIT binary patch delta 47129 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 H{jYxmJQDP5 delta 42808 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 From cb78200d28c6d4e22193ba028e1de6feaf604583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kry=C5=A1p=C3=ADn?= Date: Tue, 17 Dec 2024 16:16:29 +0100 Subject: [PATCH 5/6] Fix(web): Rename `NavigationLink` component to `NavigationAction` --- .../src/scss/components/Navigation/README.md | 36 +++++++++--------- .../components/Navigation/_Navigation.scss | 6 +-- ...gationLink.scss => _NavigationAction.scss} | 6 +-- .../src/scss/components/Navigation/index.html | 8 ++-- .../src/scss/components/Navigation/index.scss | 2 +- .../scss/components/UNSTABLE_Header/README.md | 9 ++--- .../components/UNSTABLE_Header/index.html | 6 +-- .../navigation-chromium-linux.png | Bin 21923 -> 22289 bytes 8 files changed, 36 insertions(+), 37 deletions(-) rename packages/web/src/scss/components/Navigation/{_NavigationLink.scss => _NavigationAction.scss} (95%) diff --git a/packages/web/src/scss/components/Navigation/README.md b/packages/web/src/scss/components/Navigation/README.md index b754c9d60f..2b40fcbc58 100644 --- a/packages/web/src/scss/components/Navigation/README.md +++ b/packages/web/src/scss/components/Navigation/README.md @@ -1,71 +1,71 @@ # Navigation -The `Navigation` component is a container for the navigation links of the application. +The `Navigation` component is a container for the navigation actions of the application. It consists of these parts: - [Navigation](#navigation) -- [NavigationLink](#navigationlink) + - [NavigationAction](#navigation-action) ## Navigation -The `Navigation` is a `nav` wrapper for lists of links or other navigation components. +The `Navigation` is a `nav` wrapper for lists of actions or other navigation components. ```html ``` -It centers its children vertically and if the children are not NavigationLink components, +It centers its children vertically and if the children are not NavigationAction components, it will insert a gap between them. -ℹ️ If you plan to provide a list of links, wrap them in a `ul` and `li` elements. If not, you can use the +ℹ️ If you plan to provide a list of actions, wrap them in a `ul` and `li` elements. If not, you can use the `nav` element directly. -ℹ️ Don't forget to add the `aria-label` attribute to the `Navigation` component for correct accessible state. +ℹ️ Don't forget to add the `aria-label` attribute to the `Navigation` component for correct accessible title. -## NavigationLink +## Navigation Action -The `NavigationLink` is component that is styled to be used as a navigation link. +The `NavigationAction` is component that is styled to be used as a navigation action. ```html -Link +Link ``` It can obtain `selected` or `disabled` states by adding the respective classes. ```html -Selected Link -Disabled Link +Selected Link +Disabled Link ``` ℹ️ Don't forget to add the `aria-current="page"` attribute for correct accessible state if selected. -ℹ️ Please note that in the `disabled` state the `NavigationLink` should not be an `a` tag. +ℹ️ Please note that in the `disabled` state the `NavigationAction` should not be an `a` tag. -If the `NavigationLink` is inside a [`UNSTABLE_Header`][web-unstable-header] component, it will +If the `NavigationAction` is inside a [`UNSTABLE_Header`][web-unstable-header] component, it will inherit the height of the `Header`. ### Full Example -With NavigationLink components: +With NavigationAction components: ```html diff --git a/packages/web/src/scss/components/Navigation/_Navigation.scss b/packages/web/src/scss/components/Navigation/_Navigation.scss index ae96ceab3f..9844a6b284 100644 --- a/packages/web/src/scss/components/Navigation/_Navigation.scss +++ b/packages/web/src/scss/components/Navigation/_Navigation.scss @@ -8,12 +8,12 @@ display: flex; } -.Navigation:has(.NavigationLink) { +.Navigation:has(.NavigationAction) { height: var(--#{tokens.$css-variable-prefix}navigation-height, theme.$height); } -.Navigation:not(:has(.NavigationLink)), -.Navigation:not(:has(.NavigationLink)) > ul { +.Navigation:not(:has(.NavigationAction)), +.Navigation:not(:has(.NavigationAction)) > ul { gap: theme.$spacing; align-items: center; } diff --git a/packages/web/src/scss/components/Navigation/_NavigationLink.scss b/packages/web/src/scss/components/Navigation/_NavigationAction.scss similarity index 95% rename from packages/web/src/scss/components/Navigation/_NavigationLink.scss rename to packages/web/src/scss/components/Navigation/_NavigationAction.scss index f0675e030c..af756d719c 100644 --- a/packages/web/src/scss/components/Navigation/_NavigationLink.scss +++ b/packages/web/src/scss/components/Navigation/_NavigationAction.scss @@ -4,7 +4,7 @@ @use '../../tools/typography'; @use 'theme'; -.NavigationLink { +.NavigationAction { @include typography.generate(theme.$link-typography); display: flex; @@ -34,7 +34,7 @@ } } -.NavigationLink--selected { +.NavigationAction--selected { color: theme.$link-color-state-selected; border-bottom-color: theme.$link-border-bottom-color-selected-state-default; background-color: theme.$link-background-color-state-selected; @@ -50,7 +50,7 @@ } } -.NavigationLink--disabled { +.NavigationAction--disabled { color: theme.$link-color-state-disabled; pointer-events: none; } diff --git a/packages/web/src/scss/components/Navigation/index.html b/packages/web/src/scss/components/Navigation/index.html index 33fde3ec61..6851e89807 100644 --- a/packages/web/src/scss/components/Navigation/index.html +++ b/packages/web/src/scss/components/Navigation/index.html @@ -28,20 +28,20 @@

    Navigation

    -

    NavigationLink

    +

    NavigationAction

    diff --git a/packages/web/src/scss/components/Navigation/index.scss b/packages/web/src/scss/components/Navigation/index.scss index b7fc4e9b32..7802f42579 100644 --- a/packages/web/src/scss/components/Navigation/index.scss +++ b/packages/web/src/scss/components/Navigation/index.scss @@ -1,2 +1,2 @@ @forward 'Navigation'; -@forward 'NavigationLink'; +@forward 'NavigationAction'; diff --git a/packages/web/src/scss/components/UNSTABLE_Header/README.md b/packages/web/src/scss/components/UNSTABLE_Header/README.md index b564098e0e..d7ab35709c 100644 --- a/packages/web/src/scss/components/UNSTABLE_Header/README.md +++ b/packages/web/src/scss/components/UNSTABLE_Header/README.md @@ -121,8 +121,7 @@ If you need the whole Header fluid you can do it by adding the `Container--fluid You can use the [`Navigation`][web-navigation] component inside the `UNSTABLE_Header` component. -The `NavigationLink` components will inherit the `UNSTABLE_Header` height and set the navigation -link height to the same value. +The `UNSTABLE_Header` sets the height of the `Navigation` component to the same value as the `UNSTABLE_Header`. Use the composition mentioned above to create the layout you need. @@ -140,13 +139,13 @@ Use the composition mentioned above to create the layout you need. diff --git a/packages/web/src/scss/components/UNSTABLE_Header/index.html b/packages/web/src/scss/components/UNSTABLE_Header/index.html index bcb5e25e78..59b81dc283 100644 --- a/packages/web/src/scss/components/UNSTABLE_Header/index.html +++ b/packages/web/src/scss/components/UNSTABLE_Header/index.html @@ -90,13 +90,13 @@

    With Navigation

    diff --git a/tests/e2e/demo-components-compare.spec.ts-snapshots/navigation-chromium-linux.png b/tests/e2e/demo-components-compare.spec.ts-snapshots/navigation-chromium-linux.png index 5d0d0423d35b7143a65f592b21380f1fe0d89750..1463e925581cd111a8dde36a7e2c5dfe7c981a55 100644 GIT binary patch literal 22289 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 literal 21923 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
  • zK4lLyEb;cip%}Zlb8x2I!C~T}rR%8ISZkf0v)XINbLZbV^3;E)rdwLQ?v?H)KQfEH zw>tQRdT(r1XK+XMU@n{6-K5>%%1vWtk1RO;`4$%?IXPUu<><2u+k-AD;q=zh$agG|^HY=~A8T%Q@wgS(@|KxvP=5tocAH$qm4V(ftr&x54Uh9efXC?nrk$OXl zJtk)32XZYu-JNAD9bKD4l4>xAx@0AcH`5x``lbz=L*sTz7v^pA1-IJ`7iriWL{$Me ztFford*8JV= Date: Tue, 17 Dec 2024 16:16:39 +0100 Subject: [PATCH 6/6] Fix(web-react): Rename `NavigationLink` component to `NavigationAction` --- ...avigationLink.tsx => NavigationAction.tsx} | 24 ++++---- .../src/components/Navigation/README.md | 60 +++++++++---------- ...ink.test.tsx => NavigationAction.test.tsx} | 28 ++++----- ...st.ts => useNavigationActionProps.test.ts} | 36 +++++------ .../useNavigationActionStyleProps.test.ts | 26 ++++++++ .../useNavigationLinkStyleProps.test.ts | 26 -------- ...avigationLink.tsx => NavigationAction.tsx} | 12 ++-- .../src/components/Navigation/demo/index.tsx | 6 +- .../src/components/Navigation/index.ts | 6 +- .../Navigation/stories/Navigation.stories.tsx | 8 +-- ...ories.tsx => NavigationAction.stories.tsx} | 12 ++-- .../stories/NavigationItem.stories.tsx | 4 +- .../Navigation/useNavigationActionProps.ts | 21 +++++++ .../useNavigationActionStyleProps.ts | 31 ++++++++++ .../Navigation/useNavigationLinkProps.ts | 21 ------- .../Navigation/useNavigationLinkStyleProps.ts | 31 ---------- .../src/components/UNSTABLE_Header/README.md | 14 ++--- .../demo/HeaderWithNavigation.tsx | 12 ++-- packages/web-react/src/types/navigation.ts | 18 +++--- 19 files changed, 198 insertions(+), 198 deletions(-) rename packages/web-react/src/components/Navigation/{NavigationLink.tsx => NavigationAction.tsx} (53%) rename packages/web-react/src/components/Navigation/__tests__/{NavigationLink.test.tsx => NavigationAction.test.tsx} (53%) rename packages/web-react/src/components/Navigation/__tests__/{useNavigationLinkProps.test.ts => useNavigationActionProps.test.ts} (60%) create mode 100644 packages/web-react/src/components/Navigation/__tests__/useNavigationActionStyleProps.test.ts delete mode 100644 packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts rename packages/web-react/src/components/Navigation/demo/{NavigationLink.tsx => NavigationAction.tsx} (61%) rename packages/web-react/src/components/Navigation/stories/{NavigationLink.stories.tsx => NavigationAction.stories.tsx} (71%) create mode 100644 packages/web-react/src/components/Navigation/useNavigationActionProps.ts create mode 100644 packages/web-react/src/components/Navigation/useNavigationActionStyleProps.ts delete mode 100644 packages/web-react/src/components/Navigation/useNavigationLinkProps.ts delete mode 100644 packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts diff --git a/packages/web-react/src/components/Navigation/NavigationLink.tsx b/packages/web-react/src/components/Navigation/NavigationAction.tsx similarity index 53% rename from packages/web-react/src/components/Navigation/NavigationLink.tsx rename to packages/web-react/src/components/Navigation/NavigationAction.tsx index c47c532ac5..2e7e5d67a6 100644 --- a/packages/web-react/src/components/Navigation/NavigationLink.tsx +++ b/packages/web-react/src/components/Navigation/NavigationAction.tsx @@ -3,33 +3,33 @@ import classNames from 'classnames'; import React, { ElementType, forwardRef } from 'react'; import { useStyleProps } from '../../hooks'; -import { PolymorphicRef, SpiritNavigationLinkProps } from '../../types'; -import { useNavigationLinkProps } from './useNavigationLinkProps'; -import { useNavigationLinkStyleProps } from './useNavigationLinkStyleProps'; +import { PolymorphicRef, SpiritNavigationActionProps } from '../../types'; +import { useNavigationActionProps } from './useNavigationActionProps'; +import { useNavigationActionStyleProps } from './useNavigationActionStyleProps'; -const defaultProps: Partial = { +const defaultProps: Partial = { elementType: 'a', }; /* We need an exception for components exported with forwardRef */ -/* eslint no-underscore-dangle: ['error', { allow: ['_NavigationLink'] }] */ -const _NavigationLink = ( - props: SpiritNavigationLinkProps, +/* eslint no-underscore-dangle: ['error', { allow: ['_NavigationAction'] }] */ +const _NavigationAction = ( + props: SpiritNavigationActionProps, ref: PolymorphicRef, ): JSX.Element => { const propsWithDefaults = { ...defaultProps, ...props }; const { elementType = defaultProps.elementType as ElementType, children, ...restProps } = propsWithDefaults; const ElementTag = propsWithDefaults.isDisabled ? 'span' : elementType; - const { navigationLinkProps } = useNavigationLinkProps(propsWithDefaults); - const { classProps, props: modifiedProps } = useNavigationLinkStyleProps(restProps); + const { navigationActionProps } = useNavigationActionProps(propsWithDefaults); + const { classProps, props: modifiedProps } = useNavigationActionStyleProps(restProps); const { styleProps, props: otherProps } = useStyleProps(modifiedProps); return ( @@ -38,6 +38,6 @@ const _NavigationLink = ( ); }; -const NavigationLink = forwardRef>(_NavigationLink); +const NavigationAction = forwardRef>(_NavigationAction); -export default NavigationLink; +export default NavigationAction; diff --git a/packages/web-react/src/components/Navigation/README.md b/packages/web-react/src/components/Navigation/README.md index 4dd8ce4653..f9fcdcee67 100644 --- a/packages/web-react/src/components/Navigation/README.md +++ b/packages/web-react/src/components/Navigation/README.md @@ -1,12 +1,12 @@ # Navigation -The `Navigation` component is a container for the navigation links of the application. +The `Navigation` component is a container for the navigation actions of the application. It consists of a these parts: - [Navigation](#navigation) -- [NavigationItem](#navigation-item) -- [NavigationLink](#navigation-link) + - [NavigationItem](#navigation-item) + - [NavigationAction](#navigation-action) ## Navigation @@ -18,10 +18,10 @@ import { Navigation } from '@lmc-eu/spirit-web-react'; {/* Navigation items go here */}; ``` -It centres its children vertically, and if the children do not include `NavigationLink` components, +It centres its children vertically, and if the children do not include `NavigationAction` components, it will apply a gap between them. -ℹ️ Don't forget to add the `aria-label` attribute to the `Navigation` component for correct accessible state. +ℹ️ Don't forget to add the `aria-label` attribute to the `Navigation` component for correct accessible title. ### API @@ -35,12 +35,12 @@ and [escape hatches][readme-escape-hatches]. ## Navigation Item -The `NavigationItem` is a container for navigation links. +The `NavigationItem` is a container for navigation actions. ```jsx import { NavigationItem } from '@lmc-eu/spirit-web-react'; -{/* Navigation links go here */}; +{/* Navigation actions go here */}; ``` ### API @@ -53,41 +53,41 @@ The components accept [additional attributes][readme-additional-attributes]. If you need more control over the styling of a component, you can use [style props][readme-style-props] and [escape hatches][readme-escape-hatches]. -## Navigation Link +## Navigation Action -The `NavigationLink` is component that is styled to be used as a navigation link. +The `NavigationAction` is component that is styled to be used as a navigation action. ```jsx -import { NavigationLink } from '@lmc-eu/spirit-web-react'; +import { NavigationAction } from '@lmc-eu/spirit-web-react'; -Link; +Link; ``` It can obtain `isSelected` or `isDisabled` states by adding the respective props. ```jsx -Selected Link -Disabled Link +Selected Link +Disabled Link ``` ℹ️ Don't forget to add the `aria-current="page"` attribute for correct accessible state if selected. -ℹ️ Please note that in the `isDisabled` state the `NavigationLink` will be an `span` tag. +ℹ️ Please note that in the `isDisabled` state the `NavigationAction` will be a `span` tag. -If the `NavigationLink` is inside a [`UNSTABLE_Header`][web-react-unstable-header] component, it will +If the `NavigationAction` is inside a [`UNSTABLE_Header`][web-react-unstable-header] component, it will inherit the height of the `Header`. ### API -| Name | Type | Default | Required | Description | -| ------------- | --------------------------------- | ------- | -------- | ----------------------------- | -| `children` | `string` \| `ReactNode` | `null` | ✓ | Content of the NavigationLink | -| `elementType` | `ElementType` | `a` | ✕ | Type of element used as | -| `href` | `string` | - | ✕ | URL of the link | -| `isDisabled` | `boolean` | `false` | ✕ | Whether the link is disabled | -| `isSelected` | `boolean` | `false` | ✕ | Whether the link is selected | -| `ref` | `ForwardedRef` | — | ✕ | Anchor element reference | -| `target` | `string` | `null` | ✕ | Link target | +| Name | Type | Default | Required | Description | +| ------------- | --------------------------------- | ------- | -------- | ------------------------------- | +| `children` | `string` \| `ReactNode` | `null` | ✓ | Content of the NavigationAction | +| `elementType` | `ElementType` | `a` | ✕ | Type of element used as | +| `href` | `string` | - | ✕ | URL of the link | +| `isDisabled` | `boolean` | `false` | ✕ | Whether the action is disabled | +| `isSelected` | `boolean` | `false` | ✕ | Whether the action is selected | +| `ref` | `ForwardedRef` | — | ✕ | Anchor element reference | +| `target` | `string` | `null` | ✕ | Link target | The components accept [additional attributes][readme-additional-attributes]. If you need more control over the styling of a component, you can use [style props][readme-style-props] @@ -95,22 +95,22 @@ and [escape hatches][readme-escape-hatches]. ### Full Example -With NavigationLink components: +With NavigationAction components: ```jsx - + Selected Link - + - + Disabled Link - + - Link + Link ``` diff --git a/packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx b/packages/web-react/src/components/Navigation/__tests__/NavigationAction.test.tsx similarity index 53% rename from packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx rename to packages/web-react/src/components/Navigation/__tests__/NavigationAction.test.tsx index 6e9a2d5b1f..7053c2ca49 100644 --- a/packages/web-react/src/components/Navigation/__tests__/NavigationLink.test.tsx +++ b/packages/web-react/src/components/Navigation/__tests__/NavigationAction.test.tsx @@ -4,45 +4,45 @@ import React from 'react'; import { classNamePrefixProviderTest } from '../../../../tests/providerTests/classNamePrefixProviderTest'; import { restPropsTest } from '../../../../tests/providerTests/restPropsTest'; import { stylePropsTest } from '../../../../tests/providerTests/stylePropsTest'; -import NavigationLink from '../NavigationLink'; +import NavigationAction from '../NavigationAction'; -describe('NavigationLink', () => { - classNamePrefixProviderTest(NavigationLink, 'NavigationLink'); +describe('NavigationAction', () => { + classNamePrefixProviderTest(NavigationAction, 'NavigationAction'); - stylePropsTest(NavigationLink); + stylePropsTest(NavigationAction); - restPropsTest(NavigationLink, 'a'); + restPropsTest(NavigationAction, 'a'); it('should have default classname', () => { - render(Content); + render(Content); - expect(screen.getByRole('link')).toHaveClass('NavigationLink'); + expect(screen.getByRole('link')).toHaveClass('NavigationAction'); }); it('should have selected classname', () => { render( - + Content - , + , ); - expect(screen.getByRole('link')).toHaveClass('NavigationLink NavigationLink--selected'); + expect(screen.getByRole('link')).toHaveClass('NavigationAction NavigationAction--selected'); }); it('should have disabled classname and correct elementType', () => { render( - + Content - , + , ); - expect(screen.getByText('Content')).toHaveClass('NavigationLink NavigationLink--disabled'); + expect(screen.getByText('Content')).toHaveClass('NavigationAction NavigationAction--disabled'); expect(screen.getByText('Content')).toContainHTML('span'); expect(screen.queryByRole('link')).not.toBeInTheDocument(); }); it('should render children', () => { - render(Content); + render(Content); expect(screen.getByText('Content')).toBeInTheDocument(); }); diff --git a/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts b/packages/web-react/src/components/Navigation/__tests__/useNavigationActionProps.test.ts similarity index 60% rename from packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts rename to packages/web-react/src/components/Navigation/__tests__/useNavigationActionProps.test.ts index 2a56d6456c..9f91588f8d 100644 --- a/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkProps.test.ts +++ b/packages/web-react/src/components/Navigation/__tests__/useNavigationActionProps.test.ts @@ -1,19 +1,19 @@ import { renderHook } from '@testing-library/react'; -import { SpiritNavigationLinkProps } from '../../../types'; -import { useNavigationLinkProps } from '../useNavigationLinkProps'; +import { SpiritNavigationActionProps } from '../../../types'; +import { useNavigationActionProps } from '../useNavigationActionProps'; -describe('useNavigationLinkProps', () => { +describe('useNavigationActionProps', () => { it('should return defaults props', () => { - const props: SpiritNavigationLinkProps = { + const props: SpiritNavigationActionProps = { href: '/', target: '_blank', isSelected: false, isDisabled: false, }; - const { result } = renderHook(() => useNavigationLinkProps(props)); + const { result } = renderHook(() => useNavigationActionProps(props)); expect(result.current).toStrictEqual({ - navigationLinkProps: { + navigationActionProps: { href: '/', rel: undefined, target: '_blank', @@ -22,17 +22,17 @@ describe('useNavigationLinkProps', () => { }); it('should return defaults if element is different from anchor', () => { - const props: SpiritNavigationLinkProps<'span'> = { + const props: SpiritNavigationActionProps<'span'> = { elementType: 'span', href: '/', target: '_blank', isSelected: false, isDisabled: false, }; - const { result } = renderHook(() => useNavigationLinkProps(props as SpiritNavigationLinkProps)); + const { result } = renderHook(() => useNavigationActionProps(props as SpiritNavigationActionProps)); expect(result.current).toStrictEqual({ - navigationLinkProps: { + navigationActionProps: { href: undefined, rel: undefined, target: undefined, @@ -41,16 +41,16 @@ describe('useNavigationLinkProps', () => { }); it('should return for isDisabled', () => { - const props: SpiritNavigationLinkProps = { + const props: SpiritNavigationActionProps = { href: '/', target: '_blank', isSelected: false, isDisabled: true, }; - const { result } = renderHook(() => useNavigationLinkProps(props)); + const { result } = renderHook(() => useNavigationActionProps(props)); expect(result.current).toStrictEqual({ - navigationLinkProps: { + navigationActionProps: { href: undefined, rel: undefined, target: undefined, @@ -59,16 +59,16 @@ describe('useNavigationLinkProps', () => { }); it('should return for isSelected', () => { - const props: SpiritNavigationLinkProps = { + const props: SpiritNavigationActionProps = { href: '/', target: '_blank', isSelected: true, isDisabled: false, }; - const { result } = renderHook(() => useNavigationLinkProps(props)); + const { result } = renderHook(() => useNavigationActionProps(props)); expect(result.current).toStrictEqual({ - navigationLinkProps: { + navigationActionProps: { href: '/', rel: undefined, target: '_blank', @@ -77,17 +77,17 @@ describe('useNavigationLinkProps', () => { }); it('should return for elementType', () => { - const props: SpiritNavigationLinkProps<'div'> = { + const props: SpiritNavigationActionProps<'div'> = { elementType: 'div', href: '/', target: '_blank', isSelected: false, isDisabled: false, }; - const { result } = renderHook(() => useNavigationLinkProps(props as SpiritNavigationLinkProps)); + const { result } = renderHook(() => useNavigationActionProps(props as SpiritNavigationActionProps)); expect(result.current).toStrictEqual({ - navigationLinkProps: { + navigationActionProps: { href: undefined, rel: undefined, target: undefined, diff --git a/packages/web-react/src/components/Navigation/__tests__/useNavigationActionStyleProps.test.ts b/packages/web-react/src/components/Navigation/__tests__/useNavigationActionStyleProps.test.ts new file mode 100644 index 0000000000..b9bc991931 --- /dev/null +++ b/packages/web-react/src/components/Navigation/__tests__/useNavigationActionStyleProps.test.ts @@ -0,0 +1,26 @@ +import { renderHook } from '@testing-library/react'; +import { SpiritNavigationActionProps } from '../../../types'; +import { useNavigationActionStyleProps } from '../useNavigationActionStyleProps'; + +describe('useNavigationActionStyleProps', () => { + it('should return defaults', () => { + const props = {}; + const { result } = renderHook(() => useNavigationActionStyleProps(props)); + + expect(result.current.classProps).toBe('NavigationAction'); + }); + + it('should return disabled class', () => { + const props: SpiritNavigationActionProps = { isDisabled: true }; + const { result } = renderHook(() => useNavigationActionStyleProps(props)); + + expect(result.current.classProps).toBe('NavigationAction NavigationAction--disabled'); + }); + + it('should return selected class', () => { + const props = { isSelected: true }; + const { result } = renderHook(() => useNavigationActionStyleProps(props)); + + expect(result.current.classProps).toBe('NavigationAction NavigationAction--selected'); + }); +}); diff --git a/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts b/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts deleted file mode 100644 index d7681c4400..0000000000 --- a/packages/web-react/src/components/Navigation/__tests__/useNavigationLinkStyleProps.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { renderHook } from '@testing-library/react'; -import { SpiritNavigationLinkProps } from '../../../types'; -import { useNavigationLinkStyleProps } from '../useNavigationLinkStyleProps'; - -describe('useNavigationLinkStyleProps', () => { - it('should return defaults', () => { - const props = {}; - const { result } = renderHook(() => useNavigationLinkStyleProps(props)); - - expect(result.current.classProps).toBe('NavigationLink'); - }); - - it('should return disabled class', () => { - const props: SpiritNavigationLinkProps = { isDisabled: true }; - const { result } = renderHook(() => useNavigationLinkStyleProps(props)); - - expect(result.current.classProps).toBe('NavigationLink NavigationLink--disabled'); - }); - - it('should return selected class', () => { - const props = { isSelected: true }; - const { result } = renderHook(() => useNavigationLinkStyleProps(props)); - - expect(result.current.classProps).toBe('NavigationLink NavigationLink--selected'); - }); -}); diff --git a/packages/web-react/src/components/Navigation/demo/NavigationLink.tsx b/packages/web-react/src/components/Navigation/demo/NavigationAction.tsx similarity index 61% rename from packages/web-react/src/components/Navigation/demo/NavigationLink.tsx rename to packages/web-react/src/components/Navigation/demo/NavigationAction.tsx index 7ecc70c589..3fac3e1a8e 100644 --- a/packages/web-react/src/components/Navigation/demo/NavigationLink.tsx +++ b/packages/web-react/src/components/Navigation/demo/NavigationAction.tsx @@ -1,23 +1,23 @@ import React from 'react'; import Navigation from '../Navigation'; +import NavigationAction from '../NavigationAction'; import NavigationItem from '../NavigationItem'; -import NavigationLink from '../NavigationLink'; const NavigationDefault = () => { return ( - Link + Link - + Selected - + - + Disabled - + ); diff --git a/packages/web-react/src/components/Navigation/demo/index.tsx b/packages/web-react/src/components/Navigation/demo/index.tsx index 01462fe662..8cb45a6003 100644 --- a/packages/web-react/src/components/Navigation/demo/index.tsx +++ b/packages/web-react/src/components/Navigation/demo/index.tsx @@ -1,17 +1,17 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import DocsSection from '../../../../docs/DocsSections'; +import NavigationAction from './NavigationAction'; import NavigationButtons from './NavigationButtons'; import NavigationDefault from './NavigationDefault'; -import NavigationLink from './NavigationLink'; ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - + + diff --git a/packages/web-react/src/components/Navigation/index.ts b/packages/web-react/src/components/Navigation/index.ts index 8cf2651bce..fe3a713e3b 100644 --- a/packages/web-react/src/components/Navigation/index.ts +++ b/packages/web-react/src/components/Navigation/index.ts @@ -1,8 +1,8 @@ 'use client'; export { default as Navigation } from './Navigation'; +export { default as NavigationAction } from './NavigationAction'; export { default as NavigationItem } from './NavigationItem'; -export { default as NavigationLink } from './NavigationLink'; export * from './useNavigationStyleProps'; -export * from './useNavigationLinkProps'; -export * from './useNavigationLinkStyleProps'; +export * from './useNavigationActionProps'; +export * from './useNavigationActionStyleProps'; diff --git a/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx b/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx index 123f16c34a..ae62db980f 100644 --- a/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx +++ b/packages/web-react/src/components/Navigation/stories/Navigation.stories.tsx @@ -2,8 +2,8 @@ import { Markdown } from '@storybook/blocks'; import type { Meta, StoryObj } from '@storybook/react'; import React from 'react'; import Navigation from '../Navigation'; +import NavigationAction from '../NavigationAction'; import NavigationItem from '../NavigationItem'; -import NavigationLink from '../NavigationLink'; import ReadMe from '../README.md'; const meta: Meta = { @@ -23,12 +23,12 @@ const meta: Meta = { children: ( <> - + Home - + - Not Home + Not Home ), diff --git a/packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx b/packages/web-react/src/components/Navigation/stories/NavigationAction.stories.tsx similarity index 71% rename from packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx rename to packages/web-react/src/components/Navigation/stories/NavigationAction.stories.tsx index 5c531ee0da..dbe179fe25 100644 --- a/packages/web-react/src/components/Navigation/stories/NavigationLink.stories.tsx +++ b/packages/web-react/src/components/Navigation/stories/NavigationAction.stories.tsx @@ -1,12 +1,12 @@ import { Markdown } from '@storybook/blocks'; import type { Meta, StoryObj } from '@storybook/react'; import React from 'react'; -import NavigationLink from '../NavigationLink'; +import NavigationAction from '../NavigationAction'; import ReadMe from '../README.md'; -const meta: Meta = { +const meta: Meta = { title: 'Components/Navigation', - component: NavigationLink, + component: NavigationAction, parameters: { docs: { page: () => {ReadMe}, @@ -34,8 +34,8 @@ const meta: Meta = { }; export default meta; -type Story = StoryObj; +type Story = StoryObj; -export const NavigationLinkPlayground: Story = { - name: 'NavigationLink', +export const NavigationActionPlayground: Story = { + name: 'NavigationAction', }; diff --git a/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx b/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx index 60ec676e0a..3513b0dd2a 100644 --- a/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx +++ b/packages/web-react/src/components/Navigation/stories/NavigationItem.stories.tsx @@ -1,8 +1,8 @@ import { Markdown } from '@storybook/blocks'; import type { Meta, StoryObj } from '@storybook/react'; import React from 'react'; +import NavigationAction from '../NavigationAction'; import NavigationItem from '../NavigationItem'; -import NavigationLink from '../NavigationLink'; import ReadMe from '../README.md'; const meta: Meta = { @@ -14,7 +14,7 @@ const meta: Meta = { }, }, args: { - children: Link, + children: Link, }, }; diff --git a/packages/web-react/src/components/Navigation/useNavigationActionProps.ts b/packages/web-react/src/components/Navigation/useNavigationActionProps.ts new file mode 100644 index 0000000000..24b5986b7f --- /dev/null +++ b/packages/web-react/src/components/Navigation/useNavigationActionProps.ts @@ -0,0 +1,21 @@ +import { SpiritNavigationActionProps } from '../../types'; + +export type UseNavigationActionProps = Partial; + +export type UseNavigationActionReturn = { + navigationActionProps: UseNavigationActionProps; +}; + +export const useNavigationActionProps = (props: UseNavigationActionProps): UseNavigationActionReturn => { + const { elementType = 'a', isDisabled, href, target, rel } = props; + + const navigationActionProps: Partial = { + href: elementType === 'a' && !isDisabled ? href : undefined, + target: elementType === 'a' && !isDisabled ? target : undefined, + rel: elementType === 'a' ? rel : undefined, + }; + + return { + navigationActionProps, + }; +}; diff --git a/packages/web-react/src/components/Navigation/useNavigationActionStyleProps.ts b/packages/web-react/src/components/Navigation/useNavigationActionStyleProps.ts new file mode 100644 index 0000000000..46b4bf0518 --- /dev/null +++ b/packages/web-react/src/components/Navigation/useNavigationActionStyleProps.ts @@ -0,0 +1,31 @@ +import classNames from 'classnames'; +import { ElementType } from 'react'; +import { useClassNamePrefix } from '../../hooks'; +import { LinkProps, SpiritNavigationActionProps } from '../../types'; + +export interface NavigationActionStyles { + /** className props */ + classProps: string | null; + /** props to be passed to the input element */ + props: Partial>; +} + +export function useNavigationActionStyleProps( + props: SpiritNavigationActionProps, +): NavigationActionStyles { + const { isDisabled, isSelected, ...restProps } = props; + + const navigationActionClass = useClassNamePrefix('NavigationAction'); + const navigationActionDisabledClass = `${navigationActionClass}--disabled`; + const navigationActionSelectedClass = `${navigationActionClass}--selected`; + + const className = classNames(navigationActionClass, { + [navigationActionDisabledClass]: isDisabled, + [navigationActionSelectedClass]: isSelected, + }); + + return { + classProps: className, + props: restProps, + }; +} diff --git a/packages/web-react/src/components/Navigation/useNavigationLinkProps.ts b/packages/web-react/src/components/Navigation/useNavigationLinkProps.ts deleted file mode 100644 index 30a8ea89dd..0000000000 --- a/packages/web-react/src/components/Navigation/useNavigationLinkProps.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SpiritNavigationLinkProps } from '../../types'; - -export type UseNavigationLinkProps = Partial; - -export type UseNavigationLinkReturn = { - navigationLinkProps: UseNavigationLinkProps; -}; - -export const useNavigationLinkProps = (props: UseNavigationLinkProps): UseNavigationLinkReturn => { - const { elementType = 'a', isDisabled, href, target, rel } = props; - - const navigationLinkProps: Partial = { - href: elementType === 'a' && !isDisabled ? href : undefined, - target: elementType === 'a' && !isDisabled ? target : undefined, - rel: elementType === 'a' ? rel : undefined, - }; - - return { - navigationLinkProps, - }; -}; diff --git a/packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts b/packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts deleted file mode 100644 index bdd2cca267..0000000000 --- a/packages/web-react/src/components/Navigation/useNavigationLinkStyleProps.ts +++ /dev/null @@ -1,31 +0,0 @@ -import classNames from 'classnames'; -import { ElementType } from 'react'; -import { useClassNamePrefix } from '../../hooks'; -import { LinkProps, SpiritNavigationLinkProps } from '../../types'; - -export interface NavigationLinkStyles { - /** className props */ - classProps: string | null; - /** props to be passed to the input element */ - props: Partial>; -} - -export function useNavigationLinkStyleProps( - props: SpiritNavigationLinkProps, -): NavigationLinkStyles { - const { isDisabled, isSelected, ...restProps } = props; - - const navigationLinkClass = useClassNamePrefix('NavigationLink'); - const navigationLinkDisabledClass = `${navigationLinkClass}--disabled`; - const navigationLinkSelectedClass = `${navigationLinkClass}--selected`; - - const className = classNames(navigationLinkClass, { - [navigationLinkDisabledClass]: isDisabled, - [navigationLinkSelectedClass]: isSelected, - }); - - return { - classProps: className, - props: restProps, - }; -} diff --git a/packages/web-react/src/components/UNSTABLE_Header/README.md b/packages/web-react/src/components/UNSTABLE_Header/README.md index b4dc55c6e4..655f8da6c8 100644 --- a/packages/web-react/src/components/UNSTABLE_Header/README.md +++ b/packages/web-react/src/components/UNSTABLE_Header/README.md @@ -125,8 +125,8 @@ If you need the whole Header fluid you can do it by adding the `isFluid` prop to You can use the [`Navigation`][web-react-navigation] component inside the `UNSTABLE_Header` component. -The `NavigationLink` components will inherit the `UNSTABLE_Header` height and set the navigation -link height to the same value. +The `NavigationAction` components will inherit the `UNSTABLE_Header` height and set the navigation +action height to the same value. Use the composition mentioned above to create the layout you need. @@ -139,17 +139,17 @@ Use the composition mentioned above to create the layout you need. - Link + Link - + Selected - + - + Disabled - + diff --git a/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx index b5eaa85e97..9a7bd946d5 100644 --- a/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx +++ b/packages/web-react/src/components/UNSTABLE_Header/demo/HeaderWithNavigation.tsx @@ -4,7 +4,7 @@ import { ButtonLink } from '../../ButtonLink'; import { Container } from '../../Container'; import { Flex } from '../../Flex'; import { Icon } from '../../Icon'; -import { Navigation, NavigationItem, NavigationLink } from '../../Navigation'; +import { Navigation, NavigationAction, NavigationItem } from '../../Navigation'; import { ProductLogo } from '../../ProductLogo'; import { defaultSvgLogo } from '../../ProductLogo/demo/ProductLogoDefault'; import UNSTABLE_Header from '../UNSTABLE_Header'; @@ -20,17 +20,17 @@ const HeaderDefault = () => { - Link + Link - + Selected - + - + Disabled - + diff --git a/packages/web-react/src/types/navigation.ts b/packages/web-react/src/types/navigation.ts index 2c3f9c490e..8ddf9de085 100644 --- a/packages/web-react/src/types/navigation.ts +++ b/packages/web-react/src/types/navigation.ts @@ -9,30 +9,30 @@ import { TransferProps, } from './shared'; -export interface NavigationLinkBaseProps extends ChildrenProps, StyleProps, AriaLabelingProps, TransferProps { - /** NavigationLink's href attribute */ +export interface NavigationActionBaseProps extends ChildrenProps, StyleProps, AriaLabelingProps, TransferProps { + /** NavigationAction's href attribute */ href?: string; - /** Whether is the NavigationLink disabled */ + /** Whether is the NavigationAction disabled */ isDisabled?: boolean; - /** Whether is the NavigationLink selected */ + /** Whether is the NavigationAction selected */ isSelected?: boolean; - /** NavigationLink's target attribute */ + /** NavigationAction's target attribute */ target?: LinkTarget; } -export type NavigationLinkProps = { +export type NavigationActionProps = { /** * The HTML element or React element used to render the button, e.g. 'div', 'a', or `RouterLink`. * * @default 'a' */ elementType?: E; -} & NavigationLinkBaseProps; +} & NavigationActionBaseProps; export interface SpiritNavigationItemProps extends ChildrenProps, StyleProps {} -export type SpiritNavigationLinkProps = NavigationLinkProps & - SpiritPolymorphicElementPropsWithRef>; +export type SpiritNavigationActionProps = NavigationActionProps & + SpiritPolymorphicElementPropsWithRef>; export interface SpiritNavigationProps extends StyleProps, AriaLabelingProps { children: