Skip to content

Commit

Permalink
Merge branch 'rebrand' into 462/update-governance-modals
Browse files Browse the repository at this point in the history
  • Loading branch information
Anboias committed Dec 4, 2024
2 parents 6831f67 + 887c6bf commit e71d0f5
Show file tree
Hide file tree
Showing 32 changed files with 703 additions and 266 deletions.
31 changes: 23 additions & 8 deletions cypress/e2e/footer.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,35 @@ import { HOME_PAGE } from '../support/common';
it('renders footer and error reporting', () => {
cy.visit(HOME_PAGE).dataCy('error-reporting').should('exist');

// Disallow error reporting
cy.dataCy('error-reporting').find('input').click();
cy.findByText('Done').click();
// Enable error report and analytics
cy.dataCy('error-reporting')
.findByRole('button', { name: /accept all/i })
.click();
cy.dataCy('error-reporting')
.should('not.exist')
.should(() => {
expect(localStorage.getItem('reportErrors')).to.equal('false');
.then(() => {
expect(localStorage.getItem('allow-error-reporting')).to.equal('true');
expect(localStorage.getItem('allow-analytics')).to.equal('true');
});

// On subsequent page visit there is no notice
cy.reload().should(() => {
expect(localStorage.getItem('reportErrors')).to.equal('false');
// On subsequent page visit the error reporting notice should not be shown
cy.reload().then(() => {
expect(cy.dataCy('error-reporting').should('not.exist'));
});

// Open the privacy settings modal from the footer and disable error reporting and analytics
cy.findByRole('button', { name: /error reporting/i }).click();
cy.findByRole('button', { name: /manage settings/i }).click();
cy.findByRole('checkbox', { name: /allow error reporting/i }).click();
cy.findByRole('checkbox', { name: /allow analytics cookies/i }).click();
cy.findByRole('button', { name: /save settings/i }).click();
cy.dataCy('error-reporting')
.should('not.exist')
.then(() => {
expect(localStorage.getItem('allow-error-reporting')).to.equal('false');
expect(localStorage.getItem('allow-analytics')).to.equal('false');
});

// Footer links should open the pages they link to in a new tab
cy.findByText('Github').should('have.attr', 'target', '_blank');
});
6 changes: 4 additions & 2 deletions cypress/support/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ export const abbrStr = (str: string) => {
export const EPOCH_LENGTH = 7 * 60 * 60 * 24; // in seconds

export const closeErrorReportingNotice = () => {
cy.dataCy('error-reporting').findByText('Done').click();
cy.findByText('Done').should('not.exist');
cy.dataCy('error-reporting')
.findByRole('button', { name: /accept all/i })
.click();
cy.dataCy('error-reporting').should('not.exist');
};

export const HOME_PAGE = 'http://localhost:3000/#/';
5 changes: 0 additions & 5 deletions public/api-icon.svg

This file was deleted.

5 changes: 5 additions & 0 deletions src/components/button/button.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
@import './variants/secondary-neutral.module.scss';
@import './variants/tertiary-color.module.scss';
@import './variants/link-blue.module.scss';
@import './variants/link-gray.module.scss';
@import './variants/menu-link-secondary.module.scss';
@import './variants/text-blue.module.scss';

Expand Down Expand Up @@ -43,6 +44,10 @@
@include link-blue;
}

&.link-gray {
@include link-gray;
}

&.menu-link-secondary {
@include menu-link-secondary;
}
Expand Down
3 changes: 2 additions & 1 deletion src/components/button/button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ export interface Props extends BreakpointsProps {
| 'text'
| 'text-blue'
| 'menu-link-secondary'
| 'link-blue';
| 'link-blue'
| 'link-gray';
size?: Size;
disabled?: boolean;
destructive?: boolean;
Expand Down
36 changes: 36 additions & 0 deletions src/components/button/variants/link-gray.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
@import '../../../styles/fonts.module.scss';

@mixin link-gray {
color: $color-gray-700;
height: 20px;
border: none;

&.xs {
@include font-overline-2;
}

&.sm {
@include font-link-3;
}

&.md {
@include font-link-2;
}

&.lg {
height: 24px;
@include font-link-1;
}

&:hover {
color: $color-green-800;
}

&:active {
color: $color-green-700;
}

&:disabled {
color: $color-gray-400;
}
}
123 changes: 123 additions & 0 deletions src/components/checkbox/checkbox.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
@import '../../styles/variables.module.scss';
@import '../../styles/fonts.module.scss';

.checkbox {
display: flex;
align-items: flex-start;
gap: 8px;

&,
* {
cursor: pointer;
transition: all 0.1s;
}

.checkmark {
display: flex;
align-items: center;
justify-content: center;
min-height: 16px;
min-width: 16px;
height: 16px;
width: 16px;
background-color: $color-gray-50;
border: 1px solid $color-dark-blue-50;
border-radius: 2px;
margin-top: 2px;

svg {
margin: auto;
width: 12px;
height: 12px;
color: $color-gray-50;
}
}

.checkboxTextBlock {
display: flex;
flex-direction: column;
@include font-body-12;

label {
color: $color-dark-blue-800;
}

.description {
color: $color-gray-500;
}
}

&[aria-checked='true'] {
.checkmark {
background-color: $color-dark-blue-400;
border-color: $color-gray-50;
}
}

&:hover:not([aria-disabled='true']) {
.checkmark {
background-color: $color-base-light;
border-color: $color-dark-blue-400;

svg {
color: $color-dark-blue-400;
}
}

.checkboxTextBlock {
label {
color: $color-gray-900;
}

.description {
color: $color-gray-600;
}
}
}

&[aria-disabled='true'] {
pointer-events: none;

.checkmark {
background-color: transparent;
border-color: $color-gray-200;

svg {
color: $color-gray-200;
}
}

.checkboxTextBlock {
label {
color: $color-gray-400;
}

.description {
color: $color-gray-200;
}
}
}
}

@media (min-width: $sm) {
.checkbox {
gap: 12px;

.checkmark {
min-height: 20px;
min-width: 20px;
height: 20px;
width: 20px;
margin-top: 2px;

svg {
width: 16px;
height: 16px;
}
}

.checkboxTextBlock {
@include font-body-9;
}
}
}
44 changes: 44 additions & 0 deletions src/components/checkbox/checkbox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { KeyboardEvent, ReactNode } from 'react';
import { CheckIcon } from '../icons';
import styles from './checkbox.module.scss';

interface Props {
label?: string;
checked: boolean;
children?: ReactNode;
disabled?: boolean;
onChange: (checked: boolean) => void;
}

const CheckBox = ({ label, checked, children, disabled, onChange }: Props) => {
const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
onChange(!checked);
}
};

return (
<div
id={label}
className={styles.checkbox}
tabIndex={0}
role="checkbox"
aria-checked={checked}
aria-disabled={disabled}
onClick={() => {
onChange(!checked);
}}
onKeyDown={handleKeyDown}
>
<span className={styles.checkmark}>{checked && <CheckIcon />}</span>

<div className={styles.checkboxTextBlock}>
<label htmlFor={label}>{label}</label>
{children && <div className={styles.description}>{children}</div>}
</div>
</div>
);
};

export default CheckBox;
2 changes: 2 additions & 0 deletions src/components/checkbox/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { default } from './checkbox';
export * from './checkbox';
31 changes: 18 additions & 13 deletions src/components/external-link/external-link.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
import { ReactNode, useEffect } from 'react';
import { ComponentPropsWithoutRef, useEffect } from 'react';

interface Props {
className?: string;
interface Props extends Omit<ComponentPropsWithoutRef<'a'>, 'target' | 'rel'> {
href: string;
children: ReactNode;
}

const ExternalLink = (props: Props) => {
const { className, children } = props;
const { children, href: incomingHref, ...rest } = props;

let href = props.href.trim();
const urlRegex = /^https?:\/\//i; // Starts with https:// or http:// (case insensitive)
if (!urlRegex.test(href)) {
href = 'about:blank';
}
const href = cleanHref(incomingHref);

useEffect(() => {
if (process.env.NODE_ENV === 'development' && href === 'about:blank') {
// eslint-disable-next-line no-console
console.warn(`An invalid URL has been provided: "${props.href}". Only https:// or http:// URLs are allowed.`);
console.warn(`An invalid URL has been provided: "${incomingHref}". Only https:// or http:// URLs are allowed.`);
}
}, [href, props.href]);
}, [href, incomingHref]);

return (
<a href={href} className={className} target="_blank" rel="noopener noreferrer">
<a target="_blank" rel="noopener noreferrer" href={href} {...rest}>
{children}
</a>
);
};

const cleanHref = (href: string) => {
const urlRegex = /^https?:\/\//i; // Starts with https:// or http:// (case insensitive)
const trimmedHref = href.trim();

if (!urlRegex.test(trimmedHref)) {
return 'about:blank';
}

return trimmedHref;
};

export default ExternalLink;
10 changes: 3 additions & 7 deletions src/components/icons/check-circle-fill.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { ComponentProps } from 'react';

interface Props extends ComponentProps<'svg'> {
theme?: 'dark' | 'light';
}

export const CheckCircleFillIcon = ({ theme = 'light', ...props }: Props) => {
export const CheckCircleFillIcon = ({ ...props }: ComponentProps<'svg'>) => {
return (
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none" {...props}>
<mask id="path-1-inside-1_10049_29682" fill="white">
Expand All @@ -18,11 +14,11 @@ export const CheckCircleFillIcon = ({ theme = 'light', ...props }: Props) => {
fillRule="evenodd"
clipRule="evenodd"
d="M9.00033 17.3327C13.6027 17.3327 17.3337 13.6017 17.3337 8.99935C17.3337 4.39698 13.6027 0.666016 9.00033 0.666016C4.39795 0.666016 0.666992 4.39698 0.666992 8.99935C0.666992 13.6017 4.39795 17.3327 9.00033 17.3327ZM13.8415 6.82514C14.2077 6.45903 14.2077 5.86544 13.8415 5.49932C13.4754 5.1332 12.8818 5.1332 12.5157 5.49932L7.50675 10.5083L5.91303 8.91457C5.54692 8.54845 4.95333 8.54845 4.58721 8.91457C4.22109 9.28068 4.22109 9.87427 4.58721 10.2404L6.84384 12.497C7.20995 12.8631 7.80355 12.8631 8.16966 12.497L13.8415 6.82514Z"
fill={theme === 'light' ? '#4049A8' : '#FAFAFA'}
fill="currentColor"
/>
<path
d="M13.8415 6.82514L13.2523 6.23589L13.8415 6.82514ZM7.50675 10.5083L6.91749 11.0975L7.50675 11.6868L8.09601 11.0975L7.50675 10.5083ZM5.91303 8.91457L6.50229 8.32531L6.50229 8.32531L5.91303 8.91457ZM4.58721 8.91457L3.99795 8.32531L3.99795 8.32531L4.58721 8.91457ZM4.58721 10.2404L3.99795 10.8296L4.58721 10.2404ZM6.84384 12.497L7.43309 11.9078L6.84384 12.497ZM8.16966 12.497L8.75892 13.0863L8.16966 12.497ZM16.5003 8.99935C16.5003 13.1415 13.1425 16.4993 9.00033 16.4993V18.166C14.0629 18.166 18.167 14.062 18.167 8.99935H16.5003ZM9.00033 1.49935C13.1425 1.49935 16.5003 4.85721 16.5003 8.99935H18.167C18.167 3.93674 14.0629 -0.167318 9.00033 -0.167318V1.49935ZM1.50033 8.99935C1.50033 4.85721 4.85819 1.49935 9.00033 1.49935V-0.167318C3.93772 -0.167318 -0.166341 3.93674 -0.166341 8.99935H1.50033ZM9.00033 16.4993C4.85819 16.4993 1.50033 13.1415 1.50033 8.99935H-0.166341C-0.166341 14.062 3.93772 18.166 9.00033 18.166V16.4993ZM13.2523 6.08857C13.293 6.12925 13.293 6.19521 13.2523 6.23589L14.4308 7.4144C15.1223 6.72285 15.1223 5.60162 14.4308 4.91006L13.2523 6.08857ZM13.105 6.08857C13.1456 6.04789 13.2116 6.04789 13.2523 6.08857L14.4308 4.91006C13.7392 4.21851 12.618 4.21851 11.9265 4.91006L13.105 6.08857ZM8.09601 11.0975L13.105 6.08857L11.9265 4.91006L6.91749 9.91903L8.09601 11.0975ZM5.32378 9.50382L6.91749 11.0975L8.09601 9.91903L6.50229 8.32531L5.32378 9.50382ZM5.17646 9.50382C5.21714 9.46314 5.2831 9.46314 5.32378 9.50382L6.50229 8.32531C5.81074 7.63376 4.68951 7.63376 3.99795 8.32531L5.17646 9.50382ZM5.17647 9.65114C5.13579 9.61046 5.13579 9.5445 5.17647 9.50382L3.99795 8.32531C3.3064 9.01686 3.3064 10.1381 3.99795 10.8296L5.17647 9.65114ZM7.43309 11.9078L5.17647 9.65114L3.99795 10.8296L6.25458 13.0863L7.43309 11.9078ZM7.58041 11.9078C7.53973 11.9484 7.47377 11.9484 7.43309 11.9078L6.25458 13.0863C6.94614 13.7778 8.06737 13.7778 8.75892 13.0863L7.58041 11.9078ZM13.2523 6.23589L7.58041 11.9078L8.75892 13.0863L14.4308 7.4144L13.2523 6.23589Z"
fill={theme === 'light' ? '#4049A8' : '#FAFAFA'}
fill="currentColor"
mask="url(#path-1-inside-1_10049_29682)"
/>
</svg>
Expand Down
15 changes: 15 additions & 0 deletions src/components/icons/check.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ComponentProps } from 'react';

export const CheckIcon = (props: ComponentProps<'svg'>) => {
return (
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
d="M13 4.25L6.125 11.125L3 8"
stroke="currentColor"
strokeWidth="1.25"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
};
Loading

0 comments on commit e71d0f5

Please sign in to comment.