From f486cf12e83619f4e727325a1dcc2357bab98ed4 Mon Sep 17 00:00:00 2001 From: TJ Egan Date: Mon, 19 Oct 2020 16:23:12 -0700 Subject: [PATCH] feat(breadcrumb): add overflow menu support --- .../components/breadcrumb/_breadcrumb.scss | 67 +++++++++++++++++++ .../components/Breadcrumb/Breadcrumb-story.js | 24 +++++++ .../components/Breadcrumb/BreadcrumbItem.js | 15 +++++ 3 files changed, 106 insertions(+) diff --git a/packages/components/src/components/breadcrumb/_breadcrumb.scss b/packages/components/src/components/breadcrumb/_breadcrumb.scss index 72b14994981e..bc5ae0627a9d 100644 --- a/packages/components/src/components/breadcrumb/_breadcrumb.scss +++ b/packages/components/src/components/breadcrumb/_breadcrumb.scss @@ -37,6 +37,10 @@ .#{$prefix}--breadcrumb-item .#{$prefix}--link:visited { color: $link-01; + + &:hover { + color: $hover-primary-text; + } } .#{$prefix}--breadcrumb-item::after { @@ -70,6 +74,69 @@ } } + // Overflow Menu overrides + .#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu { + position: relative; + width: rem(20px); + height: rem(20px); + + &:focus { + outline: 1px solid $focus; + } + + &:hover { + background: transparent; + } + + // Used to mimic link underline + &::after { + position: absolute; + top: calc(100% - 3px); + width: 1rem; + height: 1px; + background: $hover-primary-text; + opacity: 0; + transition: opacity $duration--fast-01 motion(standard, productive); + content: ''; + } + } + + .#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu:hover::after { + opacity: 1; + } + + .#{$prefix}--breadcrumb-item + .#{$prefix}--overflow-menu.#{$prefix}--overflow-menu--open { + background: transparent; + box-shadow: none; + } + + .#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu__icon { + position: relative; + margin-top: rem(8px); + transform: rotate(90deg); + fill: $link-01; + } + + .#{$prefix}--breadcrumb-item + .#{$prefix}--overflow-menu:hover + .#{$prefix}--overflow-menu__icon { + fill: $hover-primary-text; + } + + $caret-size: rem(6.875px); + .#{$prefix}--breadcrumb-menu-options.#{$prefix}--overflow-menu-options::after { + top: calc(#{$caret-size * (-1)}); + left: rem(13px); + width: 0; + height: 0; + margin: 0 auto; + background: transparent; + border-right: $caret-size solid transparent; + border-bottom: $caret-size solid $field-01; + border-left: $caret-size solid transparent; + } + // Skeleton State .#{$prefix}--breadcrumb.#{$prefix}--skeleton .#{$prefix}--link { @include skeleton; diff --git a/packages/react/src/components/Breadcrumb/Breadcrumb-story.js b/packages/react/src/components/Breadcrumb/Breadcrumb-story.js index aeed0e3066b1..070251466d1f 100644 --- a/packages/react/src/components/Breadcrumb/Breadcrumb-story.js +++ b/packages/react/src/components/Breadcrumb/Breadcrumb-story.js @@ -11,6 +11,8 @@ import React from 'react'; import { action } from '@storybook/addon-actions'; import { withKnobs, boolean } from '@storybook/addon-knobs'; import { Breadcrumb, BreadcrumbItem, BreadcrumbSkeleton } from '../Breadcrumb'; +import OverflowMenu from '../OverflowMenu'; +import OverflowMenuItem from '../OverflowMenuItem'; import mdx from './Breadcrumb.mdx'; export default { @@ -38,6 +40,28 @@ export const breadcrumb = () => ( ); +export const breadcrumbWithOverflowMenu = () => ( + + + Breadcrumb 1 + + Breadcrumb 2 + + + + + + + + + + Breadcrumb 3 + +); + export const skeleton = () => ; const props = () => ({ diff --git a/packages/react/src/components/Breadcrumb/BreadcrumbItem.js b/packages/react/src/components/Breadcrumb/BreadcrumbItem.js index 3c01f1a22813..fb67034e847f 100644 --- a/packages/react/src/components/Breadcrumb/BreadcrumbItem.js +++ b/packages/react/src/components/Breadcrumb/BreadcrumbItem.js @@ -30,6 +30,21 @@ const BreadcrumbItem = ({ [customClassName]: !!customClassName, }); + if ( + children.type && + children.type.displayName !== undefined && + children.type.displayName === 'OverflowMenu' + ) { + return ( +
  • + {React.cloneElement(children, { + menuOptionsClass: `${prefix}--breadcrumb-menu-options`, + menuOffset: { top: 10, left: 60 }, + })} +
  • + ); + } + if (typeof children === 'string' && href) { return (