diff options
Diffstat (limited to 'src/components/atoms')
| -rw-r--r-- | src/components/atoms/links/link.module.scss | 87 | ||||
| -rw-r--r-- | src/components/atoms/links/link.stories.tsx | 20 | ||||
| -rw-r--r-- | src/components/atoms/links/link.tsx | 18 | 
3 files changed, 117 insertions, 8 deletions
| diff --git a/src/components/atoms/links/link.module.scss b/src/components/atoms/links/link.module.scss index d23667a..1b89727 100644 --- a/src/components/atoms/links/link.module.scss +++ b/src/components/atoms/links/link.module.scss @@ -5,23 +5,64 @@    &[hreflang] {      &::after {        display: inline-block; +        /* Prettier is removing spacing between content parts. */ +        /* prettier-ignore */        content: "\0000a0[" attr(hreflang) "]";        font-size: var(--font-size-sm);      }    } +  &--download { +    &::after { +      display: inline-block; + +      /* Prettier is removing spacing between content parts. */ + +      /* prettier-ignore */ +      content: "\0000a0" url( +fun.encode-svg( +        '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>' +)); +    } + +    &:focus:not(:active)::after { +      /* Prettier is removing spacing between content parts. */ + +      /* prettier-ignore */ +      content: "\0000a0" url( +fun.encode-svg( +        '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_white}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>' +)); +    } + +    &[hreflang] { +      &::after { +        /* Prettier is removing spacing between content parts. */ + +        /* prettier-ignore */ +        content: "\0000a0[" attr(hreflang) "]\0000a0" url( +fun.encode-svg( +          '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>' +)); +      } +    } +  } +    &--external {      &::after {        display: inline-block; +        /* Prettier is removing spacing between content parts. */ +        /* prettier-ignore */        content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));      }      &:focus:not(:active)::after {        /* Prettier is removing spacing between content parts. */ +        /* prettier-ignore */        content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));      } @@ -29,18 +70,56 @@      &[hreflang] {        &::after {          /* Prettier is removing spacing between content parts. */ +          /* prettier-ignore */ -        content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg( +        content: "\0000a0[" attr(hreflang) "]\0000a0" url( +fun.encode-svg(              '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>' -          )); +));        }        &:focus:not(:active)::after {          /* Prettier is removing spacing between content parts. */ +          /* prettier-ignore */ -        content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg( +        content: "\0000a0[" attr(hreflang) "]\0000a0" url( +fun.encode-svg(              '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>' -          )); +)); +      } +    } +  } + +  &--external#{&}--download { +    &::after { +      /* Prettier is removing spacing between content parts. */ + +      /* prettier-ignore */ +      content: "\0000a0" url( +fun.encode-svg( +          '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>' +)) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>')); +    } + +    &[hreflang] { +      &::after { +        /* Prettier is removing spacing between content parts. */ + +        /* prettier-ignore */ +        content: "\0000a0[" attr(hreflang) "]\0000a0" url( +fun.encode-svg( +          '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>' +)) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>')); +      } + +      &:focus:not(:active)::after { +        /* Prettier is removing spacing between content parts. */ + +        /* prettier-ignore */ +        content: "\0000a0[" attr(hreflang) "]\0000a0" url( +fun.encode-svg( +          '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>' +)) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));        }      }    } diff --git a/src/components/atoms/links/link.stories.tsx b/src/components/atoms/links/link.stories.tsx index c3b3465..420eafe 100644 --- a/src/components/atoms/links/link.stories.tsx +++ b/src/components/atoms/links/link.stories.tsx @@ -31,14 +31,29 @@ export default {          required: false,        },      }, -    external: { +    download: {        control: {          type: 'boolean',        }, +      description: 'Determine if the link purpose is to download a file.',        table: {          category: 'Options', +        defaultValue: { summary: false }, +      }, +      type: { +        name: 'boolean', +        required: false, +      }, +    }, +    external: { +      control: { +        type: 'boolean',        },        description: 'Determine if the link is external of the current website.', +      table: { +        category: 'Options', +        defaultValue: { summary: false }, +      },        type: {          name: 'boolean',          required: false, @@ -79,6 +94,7 @@ export const Default = Template.bind({});  Default.args = {    children: 'A link',    href: '#', +  download: false,    external: false,  }; @@ -89,6 +105,7 @@ export const External = Template.bind({});  External.args = {    children: 'A link',    href: '#', +  download: false,    external: true,  }; @@ -99,6 +116,7 @@ export const ExternalWithLang = Template.bind({});  ExternalWithLang.args = {    children: 'A link',    href: '#', +  download: false,    external: true,    lang: 'en',  }; diff --git a/src/components/atoms/links/link.tsx b/src/components/atoms/links/link.tsx index 674c07b..c8ba273 100644 --- a/src/components/atoms/links/link.tsx +++ b/src/components/atoms/links/link.tsx @@ -12,6 +12,10 @@ export type LinkProps = {     */    className?: string;    /** +   * True if it is a download link. Default: false. +   */ +  download?: boolean; +  /**     * True if it is an external link. Default: false.     */    external?: boolean; @@ -33,21 +37,29 @@ export type LinkProps = {  const Link: FC<LinkProps> = ({    children,    className = '', +  download = false, +  external = false,    href,    lang, -  external = false,  }) => { +  const downloadClass = download ? styles['link--download'] : ''; +    return external ? (      <a        href={href}        hrefLang={lang} -      className={`${styles.link} ${styles['link--external']} ${className}`} +      className={`${styles.link} ${styles['link--external']} ${downloadClass} ${className}`}      >        {children}      </a>    ) : (      <NextLink href={href}> -      <a className={`${styles.link} ${className}`}>{children}</a> +      <a +        hrefLang={lang} +        className={`${styles.link} ${downloadClass} ${className}`} +      > +        {children} +      </a>      </NextLink>    );  }; | 
