diff --git a/src/renderer/Generics/redesign/ProgressBar/progressBar.css.ts b/src/renderer/Generics/redesign/ProgressBar/progressBar.css.ts
index 43d3d33dc..ad40e88e5 100644
--- a/src/renderer/Generics/redesign/ProgressBar/progressBar.css.ts
+++ b/src/renderer/Generics/redesign/ProgressBar/progressBar.css.ts
@@ -29,6 +29,8 @@ export const captionText = style({
color: vars.color.font50,
});
+export const cardDownloadingProgressContainer = style({});
+
export const downloadingProgressContainer = style({
borderColor: vars.color.border,
borderWidth: 1,
diff --git a/src/renderer/Generics/redesign/RadioButtonBackground.tsx b/src/renderer/Generics/redesign/RadioButtonBackground.tsx
deleted file mode 100644
index 0a8789b69..000000000
--- a/src/renderer/Generics/redesign/RadioButtonBackground.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-export interface RadioButtonBackgroundProps {
- /**
- * Is this dark mode?
- */
- darkMode?: boolean;
- /**
- * Is there a children component?
- */
- children?: JSX.Element;
- /**
- * Optional click handler
- */
- onClick?: () => void;
-}
-
-/**
- * Primary UI component for user interaction
- */
-export const RadioButtonBackground = ({
- darkMode,
- children,
- onClick,
-}: RadioButtonBackgroundProps) => {
- const darkStyle = darkMode ? 'darkMode' : '';
- return (
- // eslint-disable-next-line jsx-a11y/label-has-associated-control
-
- );
-};
diff --git a/src/renderer/Generics/redesign/Select/Select.tsx b/src/renderer/Generics/redesign/Select/Select.tsx
index eea046bec..6c78b2547 100644
--- a/src/renderer/Generics/redesign/Select/Select.tsx
+++ b/src/renderer/Generics/redesign/Select/Select.tsx
@@ -2,7 +2,7 @@
// React select docs at:
// https://react-select.com/components#Option
import ReactSelect, { ActionMeta, SingleValue } from 'react-select';
-import { ReactComponent as PopupIcon } from '../../../assets/images/icons/Popup.svg';
+import { Icon } from '../Icon/Icon';
import { vars } from '../theme.css';
const options = [
@@ -39,7 +39,7 @@ const Select = ({ onChange }: SelectProps) => {
components={{
IndicatorsContainer: () => (
),
}}
diff --git a/src/renderer/Generics/redesign/SelectCard/SelectCard.tsx b/src/renderer/Generics/redesign/SelectCard/SelectCard.tsx
index b637788a1..cae5177d1 100644
--- a/src/renderer/Generics/redesign/SelectCard/SelectCard.tsx
+++ b/src/renderer/Generics/redesign/SelectCard/SelectCard.tsx
@@ -1,9 +1,11 @@
/* eslint-disable jsx-a11y/click-events-have-key-events */
+import { useState } from 'react';
import { NodeIconId } from 'renderer/assets/images/nodeIcons';
import { NodeIcon } from '../NodeIcon/NodeIcon';
-import Tag from '../Tag/Tag';
+import { Label } from '../Label/Label';
import {
container,
+ activeContainer,
descriptionStyle,
selectedContainer,
tagStyle,
@@ -21,7 +23,7 @@ export interface SelectCardProps {
*/
info?: string;
/**
- * Which icon? // TODO: Change this to drop down eventually
+ * Which icon?
*/
iconId: NodeIconId;
/**
@@ -47,35 +49,45 @@ const SelectCard = ({
info,
iconId,
minority = false,
- isSelected,
+ isSelected = false,
}: SelectCardProps) => {
+ const [selected, setSelected] = useState(isSelected);
+
+ const onClickAction = () => {
+ setSelected(true);
+ if (onClick) {
+ onClick();
+ }
+ };
+
const containerStyles = [container];
- if (isSelected) {
+ if (selected) {
containerStyles.push(selectedContainer);
}
return (
{
- if (onClick) {
- onClick();
- }
+ className={activeContainer}
+ onClick={onClickAction}
+ onBlur={() => {
+ setSelected(false);
}}
- onKeyDown={onClick}
+ onKeyDown={onClickAction}
role="button"
tabIndex={0}
>
-
-
- {/* TODO: Fix height to 60px */}
-
{title}
-
{info}
-
- {minority && (
-
-
{' '}
+
+
+
+ {/* TODO: Fix height to 60px */}
+
{title}
+
{info}
- )}
+ {minority && (
+
+ {' '}
+
+ )}
+
);
};
diff --git a/src/renderer/Generics/redesign/SelectCard/selectCard.css.ts b/src/renderer/Generics/redesign/SelectCard/selectCard.css.ts
index 34c8c14e9..6944724df 100644
--- a/src/renderer/Generics/redesign/SelectCard/selectCard.css.ts
+++ b/src/renderer/Generics/redesign/SelectCard/selectCard.css.ts
@@ -1,9 +1,12 @@
import { style } from '@vanilla-extract/css';
-import { vars } from '../theme.css';
+import { vars, common } from '../theme.css';
+
+export const activeContainer = style({});
export const container = style({
margin: 5,
cursor: 'pointer',
+ userSelect: 'none',
minWidth: 200,
display: 'flex',
flexDirection: 'row',
@@ -11,15 +14,29 @@ export const container = style({
padding: '10px 12px',
gap: '12px',
borderRadius: '5px',
- boxShadow: vars.components.selectCardBoxShadow,
+ position: 'relative',
background: vars.color.background96,
':hover': { background: vars.color.background92 },
});
export const selectedContainer = style({
- border: '2px solid #7a64ee',
- background: vars.components.selectCardBackground,
- ':hover': { background: vars.components.selectCardBackground },
+ selectors: {
+ [`${activeContainer} &`]: {
+ borderWidth: '5px',
+ background: vars.components.selectCardBackground,
+ boxShadow: vars.components.selectCardBoxShadow,
+ },
+ [`${activeContainer} &:before`]: {
+ content: '',
+ position: 'absolute',
+ width: '-webkit-fill-available',
+ left: '0',
+ top: '0',
+ height: '-webkit-fill-available',
+ border: `2px solid ${common.color.purple600}`,
+ borderRadius: '5px',
+ },
+ },
});
export const textContainer = style({
diff --git a/src/renderer/Generics/redesign/SidebarLinkItem.tsx b/src/renderer/Generics/redesign/SidebarLinkItem.tsx
deleted file mode 100644
index 796cba921..000000000
--- a/src/renderer/Generics/redesign/SidebarLinkItem.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Bubble } from './Bubble';
-import { Icon } from './Icon';
-
-export interface SidebarLinkItemProps {
- /**
- * Button contents
- */
- label: string;
- /**
- * Button contents
- */
- count?: number;
- /**
- * Which icon? // TODO: Change this to drop down eventually
- */
- iconId?: 'bell' | 'add' | 'preferences';
- /**
- * Is this dark mode?
- */
- darkMode?: boolean;
- /**
- * Optional click handler
- */
- // onClick?: () => void;
-}
-
-/**
- * Primary UI component for user interaction
- */
-export const SidebarLinkItem = ({
- darkMode,
- label,
- count,
- iconId = 'bell',
-}: SidebarLinkItemProps) => {
- const darkStyle = darkMode ? 'darkMode' : '';
- return (
-
-
-
{label}
- {count && (
-
-
-
- )}
-
- );
-};
diff --git a/src/renderer/Generics/redesign/SidebarLinkItem/SidebarLinkItem.tsx b/src/renderer/Generics/redesign/SidebarLinkItem/SidebarLinkItem.tsx
new file mode 100644
index 000000000..8fa6a77e8
--- /dev/null
+++ b/src/renderer/Generics/redesign/SidebarLinkItem/SidebarLinkItem.tsx
@@ -0,0 +1,64 @@
+import { useState } from 'react';
+import { IconId } from 'renderer/assets/images/icons';
+import { Bubble } from '../Bubble/Bubble';
+import { Icon } from '../Icon/Icon';
+import { container, selectedContainer, labelText } from './sidebarLinkItem.css';
+
+export interface SidebarLinkItemProps {
+ /**
+ * Button contents
+ */
+ label: string;
+ /**
+ * Button contents
+ */
+ count?: number;
+ /**
+ * Which icon?
+ */
+ iconId?: IconId;
+ /**
+ * Optional click handler
+ */
+ onClick?: () => void;
+}
+
+/**
+ * Primary UI component for user interaction
+ */
+export const SidebarLinkItem = ({
+ onClick,
+ label,
+ count,
+ iconId = 'bell',
+}: SidebarLinkItemProps) => {
+ const [selected, setSelected] = useState(false);
+
+ const onClickAction = () => {
+ setSelected(true);
+ if (onClick) {
+ onClick();
+ }
+ };
+
+ const containerStyles = [container];
+ if (selected) {
+ containerStyles.push(selectedContainer);
+ }
+ return (
+
{
+ setSelected(false);
+ }}
+ onKeyDown={onClickAction}
+ role="button"
+ tabIndex={0}
+ >
+
+
{label}
+ {count &&
}
+
+ );
+};
diff --git a/src/renderer/Generics/redesign/SidebarLinkItem/sidebarLinkItem.css.ts b/src/renderer/Generics/redesign/SidebarLinkItem/sidebarLinkItem.css.ts
new file mode 100644
index 000000000..4d6b0fb74
--- /dev/null
+++ b/src/renderer/Generics/redesign/SidebarLinkItem/sidebarLinkItem.css.ts
@@ -0,0 +1,28 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../theme.css';
+
+export const activeContainer = style({});
+
+export const container = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: '8px',
+ padding: '6px 10px',
+ height: '18px',
+ borderRadius: '5px',
+ cursor: 'pointer',
+ userSelect: 'none',
+});
+
+export const selectedContainer = style({
+ background: vars.color.background96,
+});
+
+export const labelText = style({
+ flex: '1',
+ fontWeight: '500',
+ fontSize: '13px',
+ lineHeight: '16px',
+ color: vars.color.font70,
+});
diff --git a/src/renderer/Generics/redesign/SidebarNodeItem.tsx b/src/renderer/Generics/redesign/SidebarNodeItem.tsx
deleted file mode 100644
index 0eb3a3d3f..000000000
--- a/src/renderer/Generics/redesign/SidebarNodeItem.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { NodeIconId } from 'renderer/assets/images/nodeIcons';
-import { NodeIcon } from './NodeIcon';
-
-export interface SidebarNodeItemProps {
- /**
- * Node title
- */
- title: string;
- /**
- * Node info
- */
- info?: string;
- /**
- * Which icon? // TODO: Change this to drop down eventually
- */
- iconId: NodeIconId;
- /**
- * Is this dark mode?
- */
- darkMode?: boolean;
- /**
- * What's the status?
- */
- status?: 'healthy' | 'warning' | 'error' | 'sync';
- /**
- * Optional click handler
- */
- // onClick?: () => void;
-}
-
-/**
- * Primary UI component for user interaction
- */
-export const SidebarNodeItem = ({
- // onClick,
- darkMode,
- title,
- info,
- iconId,
- status,
-}: SidebarNodeItemProps) => {
- const darkStyle = darkMode ? 'darkMode' : '';
- return (
-
- );
-};
diff --git a/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx b/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx
new file mode 100644
index 000000000..1d1e90534
--- /dev/null
+++ b/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx
@@ -0,0 +1,80 @@
+import { useState } from 'react';
+import { NodeIconId } from 'renderer/assets/images/nodeIcons';
+import { NodeIcon } from '../NodeIcon/NodeIcon';
+import {
+ container,
+ selectedContainer,
+ iconContainer,
+ textContainer,
+ titleStyle,
+ infoStyle,
+} from './sideBarNodeItem.css';
+
+export interface SidebarNodeItemProps {
+ /**
+ * Node title
+ */
+ title: string;
+ /**
+ * Node info
+ */
+ info?: string;
+ /**
+ * Which icon?
+ */
+ iconId: NodeIconId;
+ /**
+ * What's the status?
+ */
+ status?: 'healthy' | 'warning' | 'error' | 'sync' | 'stopped';
+ /**
+ * Optional click handler
+ */
+ onClick?: () => void;
+}
+
+/**
+ * Primary UI component for user interaction
+ */
+export const SidebarNodeItem = ({
+ onClick,
+ title,
+ info,
+ iconId,
+ status,
+}: SidebarNodeItemProps) => {
+ const [selected, setSelected] = useState(false);
+
+ const onClickAction = () => {
+ setSelected(true);
+ if (onClick) {
+ onClick();
+ }
+ };
+
+ const containerStyles = [container];
+ if (selected) {
+ containerStyles.push(selectedContainer);
+ }
+
+ return (
+
{
+ setSelected(false);
+ }}
+ onKeyDown={onClickAction}
+ role="button"
+ tabIndex={0}
+ >
+
+
+
+
+
+ );
+};
diff --git a/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts b/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts
new file mode 100644
index 000000000..93d5e2bcc
--- /dev/null
+++ b/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts
@@ -0,0 +1,59 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../theme.css';
+
+export const container = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ padding: '8px 10px',
+ gap: '12px',
+ width: 'auto',
+ cursor: 'pointer',
+ userSelect: 'none',
+});
+
+export const selectedContainer = style({
+ background: vars.color.background96,
+ borderRadius: '4px',
+});
+
+export const iconContainer = style({
+ flex: 'none',
+ order: '0',
+ flexGrow: '0',
+});
+
+export const textContainer = style({
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'flex-start',
+ padding: '0px',
+ gap: '2px',
+ width: '172px',
+ height: '32px',
+ flex: 'none',
+ order: '1',
+ flexGrow: '1',
+});
+
+export const titleStyle = style({
+ order: '0',
+ flex: 'none',
+ alignSelf: 'stretch',
+ flexGrow: '0',
+ fontWeight: '500',
+ fontSize: '13px',
+ lineHeight: '16px',
+ color: vars.color.font70,
+});
+
+export const infoStyle = style({
+ order: 1,
+ flex: 'none',
+ alignSelf: 'stretch',
+ flexGrow: 0,
+ fontWeight: '400',
+ fontSize: '11px',
+ lineHeight: '14px',
+ color: vars.color.font50,
+});
diff --git a/src/renderer/Generics/redesign/SidebarTitleItem/SidebarTitleItem.tsx b/src/renderer/Generics/redesign/SidebarTitleItem/SidebarTitleItem.tsx
new file mode 100644
index 000000000..8d296ea67
--- /dev/null
+++ b/src/renderer/Generics/redesign/SidebarTitleItem/SidebarTitleItem.tsx
@@ -0,0 +1,15 @@
+import { container } from './sidebarTitleItem.css';
+
+export interface SidebarTitleItemProps {
+ /**
+ * Sidebar title content
+ */
+ title: string;
+}
+
+/**
+ * Primary UI component for user interaction
+ */
+export const SidebarTitleItem = ({ title }: SidebarTitleItemProps) => {
+ return
{title}
;
+};
diff --git a/src/renderer/Generics/redesign/SidebarTitleItem/sidebarTitleItem.css.ts b/src/renderer/Generics/redesign/SidebarTitleItem/sidebarTitleItem.css.ts
new file mode 100644
index 000000000..ed35af9d4
--- /dev/null
+++ b/src/renderer/Generics/redesign/SidebarTitleItem/sidebarTitleItem.css.ts
@@ -0,0 +1,16 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../theme.css';
+
+export const activeContainer = style({});
+
+export const container = style({
+ display: 'flex',
+ flexDirection: 'row',
+ fontStyle: 'normal',
+ fontWeight: '590',
+ fontSize: '11px',
+ lineHeight: '14px',
+ padding: '8px 10px',
+ width: '100%',
+ color: vars.color.font40,
+});
diff --git a/src/renderer/Generics/redesign/Splash/Splash.tsx b/src/renderer/Generics/redesign/Splash/Splash.tsx
index 2e45d6ec6..74f8cd759 100644
--- a/src/renderer/Generics/redesign/Splash/Splash.tsx
+++ b/src/renderer/Generics/redesign/Splash/Splash.tsx
@@ -1,5 +1,11 @@
-import { container, titleFont, descriptionFont, iconClass } from './splash.css';
-import icon from '../../../../../assets/icon.png';
+import {
+ container,
+ contentContainer,
+ titleFont,
+ descriptionFont,
+ iconClass,
+} from './splash.css';
+import icon from '../../../assets/images/logo/mono.svg';
import Button from '../Button/Button';
export interface SplashProps {
@@ -10,14 +16,16 @@ export interface SplashProps {
const Splash = ({ title, description }: SplashProps) => {
return (
-
-
{title}
-
{description}
-
console.log('Get started')}
- />
+
+
+
{title}
+
{description}
+
console.log('Get started')}
+ />
+
);
};
diff --git a/src/renderer/Generics/redesign/Splash/splash.css.ts b/src/renderer/Generics/redesign/Splash/splash.css.ts
index e7261a09e..11e786039 100644
--- a/src/renderer/Generics/redesign/Splash/splash.css.ts
+++ b/src/renderer/Generics/redesign/Splash/splash.css.ts
@@ -1,11 +1,26 @@
import { style } from '@vanilla-extract/css';
import { vars } from '../theme.css';
+import welcome from '../../../assets/images/artwork/welcome.png';
export const container = style({
+ backgroundImage: `url(${welcome})`,
+ backgroundPosition: 'bottom',
+ backgroundRepeat: 'no-repeat',
+ backgroundSize: '1281px 169px',
+ width: '100%',
+ height: '100%',
+});
+
+export const contentContainer = style({
+ alignItems: 'center',
display: 'flex',
flexDirection: 'column',
- alignItems: 'center',
gap: 24,
+ position: 'absolute',
+ width: 420,
+ height: 378,
+ left: 'calc(50% - 420px/2)',
+ top: 'calc(50% - 378px/2 - 16px)',
});
export const titleFont = style({
diff --git a/src/renderer/Generics/redesign/Tag/tag.css.ts b/src/renderer/Generics/redesign/Tag/tag.css.ts
index 6386fdcd2..994371394 100644
--- a/src/renderer/Generics/redesign/Tag/tag.css.ts
+++ b/src/renderer/Generics/redesign/Tag/tag.css.ts
@@ -7,9 +7,9 @@ export const container = style({
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
- padding: '4px 10px',
+ padding: '3px 6px',
gap: '4px',
- borderRadius: '14px',
+ borderRadius: '5px',
fontSize: '11px',
lineHeight: '14px',
flex: 'none',
@@ -21,7 +21,13 @@ export const container = style({
background: vars.components.tagPinkBackground,
color: vars.components.tagPinkFontColor,
},
- [`&.pink2`]: { background: '#fee3f9', color: '#ec429f' },
- [`&.green`]: { background: '#dffbe8', color: '#3ebb64' },
+ [`&.pink2`]: {
+ background: vars.components.tagPink2Background,
+ color: vars.components.tagPink2FontColor,
+ },
+ [`&.green`]: {
+ background: vars.components.tagGreenBackground,
+ color: vars.components.tagGreenFontColor,
+ },
},
});
diff --git a/src/renderer/Generics/redesign/Toggle.tsx b/src/renderer/Generics/redesign/Toggle/Toggle.tsx
similarity index 72%
rename from src/renderer/Generics/redesign/Toggle.tsx
rename to src/renderer/Generics/redesign/Toggle/Toggle.tsx
index 4d0ea5188..e77f4c338 100644
--- a/src/renderer/Generics/redesign/Toggle.tsx
+++ b/src/renderer/Generics/redesign/Toggle/Toggle.tsx
@@ -1,4 +1,5 @@
import { useState } from 'react';
+import { container } from './toggle.css';
export interface ToggleProps {
/**
@@ -9,10 +10,6 @@ export interface ToggleProps {
* Is it checked?
*/
checked?: boolean;
- /**
- * Is this dark mode?
- */
- darkMode?: boolean;
/**
* Optional change handler
*/
@@ -22,18 +19,12 @@ export interface ToggleProps {
/**
* Primary UI component for user interaction
*/
-export const Toggle = ({
- checked,
- disabled,
- darkMode,
- onChange,
-}: ToggleProps) => {
+export const Toggle = ({ checked, disabled, onChange }: ToggleProps) => {
const [isChecked, setChecked] = useState(checked);
- const darkStyle = darkMode ? 'darkMode' : '';
return (
")';
+
+// required to export even if not using in a component
+export const container = style({
+ height: '16px',
+ width: '30px',
+ backgroundRepeat: 'no-repeat',
+ backgroundImage: url,
+ backgroundPosition: '0',
+ transition: 'background-position 0.15s ease-in-out',
+ backgroundColor: vars.components.toggleBackground,
+ borderRadius: '9999px',
+ appearance: 'none',
+ ':checked': {
+ backgroundColor: vars.components.toggleCheckedBackground,
+ backgroundPosition: '100%',
+ },
+ ':disabled': {
+ pointerEvents: 'none',
+ filter: 'none',
+ opacity: '0.5',
+ },
+});
diff --git a/src/renderer/Generics/redesign/UpdateCallout/UpdateCallout.tsx b/src/renderer/Generics/redesign/UpdateCallout/UpdateCallout.tsx
new file mode 100644
index 000000000..cb0353030
--- /dev/null
+++ b/src/renderer/Generics/redesign/UpdateCallout/UpdateCallout.tsx
@@ -0,0 +1,40 @@
+import {
+ container,
+ title,
+ description,
+ link,
+ buttonContainer,
+} from './updateCallout.css';
+
+import Button from '../Button/Button';
+import ExternalLink from '../Link/ExternalLink';
+
+export interface UpdateCalloutProps {
+ onClick: () => void;
+}
+
+export const UpdateCallout = ({ onClick }: UpdateCalloutProps) => {
+ return (
+
+
Update your client
+
+ Nimbus v22.8.1 has been downloaded and is ready to install.
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/renderer/Generics/redesign/UpdateCallout/updateCallout.css.ts b/src/renderer/Generics/redesign/UpdateCallout/updateCallout.css.ts
new file mode 100644
index 000000000..8058ac964
--- /dev/null
+++ b/src/renderer/Generics/redesign/UpdateCallout/updateCallout.css.ts
@@ -0,0 +1,50 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../theme.css';
+
+// required to export even if not using in a component
+export const container = style({
+ boxSizing: 'border-box',
+ borderRadius: 5,
+ width: 292,
+ height: 160,
+ padding: 16,
+ position: 'relative',
+ overflow: 'hidden',
+ border: vars.components.updateCalloutBorder,
+ boxShadow: vars.components.updateCalloutBoxShadow,
+ zIndex: 1,
+ backgroundColor: vars.components.updateCalloutBackground,
+});
+
+export const title = style({
+ fontStyle: 'normal',
+ fontWeight: 590,
+ fontSize: 13,
+ lineHeight: '16px',
+ letterSpacing: '-0.12px',
+ color: vars.color.font,
+ marginBottom: 8,
+});
+
+export const description = style({
+ fontStyle: 'normal',
+ fontWeight: 400,
+ fontSize: 13,
+ lineHeight: '18px',
+ letterSpacing: '-0.08px',
+ color: vars.color.font70,
+ marginBottom: 8,
+});
+
+export const link = style({
+ marginBottom: 8,
+});
+
+export const buttonContainer = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'center',
+ padding: 0,
+ gap: 8,
+ marginTop: 13,
+});
diff --git a/src/renderer/Generics/redesign/VerticalLine/VerticalLine.tsx b/src/renderer/Generics/redesign/VerticalLine/VerticalLine.tsx
new file mode 100644
index 000000000..3b2f84012
--- /dev/null
+++ b/src/renderer/Generics/redesign/VerticalLine/VerticalLine.tsx
@@ -0,0 +1,10 @@
+import { container } from './verticalLine.css';
+
+export interface VerticalLineProps {
+ type?: 'content';
+}
+
+const VerticalLine = ({ type }: VerticalLineProps) => {
+ return
;
+};
+export default VerticalLine;
diff --git a/src/renderer/Generics/redesign/VerticalLine/verticalLine.css.ts b/src/renderer/Generics/redesign/VerticalLine/verticalLine.css.ts
new file mode 100644
index 000000000..ddaf071da
--- /dev/null
+++ b/src/renderer/Generics/redesign/VerticalLine/verticalLine.css.ts
@@ -0,0 +1,13 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../theme.css';
+
+export const container = style({
+ height: '100%',
+ width: 1,
+ background: vars.color.font10,
+ selectors: {
+ [`&.content`]: {
+ margin: '34px 0px',
+ },
+ },
+});
diff --git a/src/renderer/Generics/redesign/WalletPrompt/WalletPrompt.tsx b/src/renderer/Generics/redesign/WalletPrompt/WalletPrompt.tsx
new file mode 100644
index 000000000..df01d63b6
--- /dev/null
+++ b/src/renderer/Generics/redesign/WalletPrompt/WalletPrompt.tsx
@@ -0,0 +1,35 @@
+import {
+ container,
+ title,
+ description,
+ buttonContainer,
+} from './walletPrompt.css';
+
+import Button from '../Button/Button';
+
+export interface WalletPromptProps {
+ onDismissClick: () => void;
+ onSetupClick: () => void;
+}
+
+export const WalletPrompt = ({
+ onDismissClick,
+ onSetupClick,
+}: WalletPromptProps) => {
+ return (
+
+
+ Point your browser wallet to your local Ethereum node
+
+
+ Now that your node is fully synced you can use it to lorem ipsum dolor
+ sit amet, consectetur adipiscing elit. Nunc eget mi vitae augue iaculis
+ tempor eget vitae.
+
+
+
+
+
+
+ );
+};
diff --git a/src/renderer/Generics/redesign/WalletPrompt/walletPrompt.css.ts b/src/renderer/Generics/redesign/WalletPrompt/walletPrompt.css.ts
new file mode 100644
index 000000000..79505c31e
--- /dev/null
+++ b/src/renderer/Generics/redesign/WalletPrompt/walletPrompt.css.ts
@@ -0,0 +1,57 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../theme.css';
+import wallet from '../../../assets/images/artwork/wallet.png';
+
+// required to export even if not using in a component
+export const container = style({
+ boxSizing: 'border-box',
+ backgroundImage: `url(${wallet})`,
+ backgroundColor: vars.components.walletPromptBackground,
+ backgroundSize: '214px 154px',
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: 'right',
+ borderRadius: 10,
+ height: 154,
+ padding: 30,
+ position: 'relative',
+ overflow: 'hidden',
+ marginBottom: 34,
+});
+
+export const title = style({
+ fontStyle: 'normal',
+ fontWeight: 590,
+ fontSize: 15,
+ lineHeight: '20px',
+ letterSpacing: '-0.24px',
+ color: vars.color.font,
+});
+
+export const description = style({
+ width: 509,
+ fontStyle: 'normal',
+ fontWeight: 400,
+ fontSize: 13,
+ lineHeight: '18px',
+ letterSpacing: '-0.08px',
+ color: vars.color.font70,
+});
+
+export const buttonContainer = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'center',
+ padding: 0,
+ gap: 8,
+ marginTop: 13,
+});
+
+export const backgroundIcon = style({
+ position: 'absolute',
+ width: 213.95,
+ height: 213.95,
+ left: 549,
+ top: -31.97,
+ opacity: 0.12,
+ color: vars.color.font50,
+});
diff --git a/src/renderer/Generics/redesign/consts.ts b/src/renderer/Generics/redesign/consts.ts
new file mode 100644
index 000000000..d713f24b7
--- /dev/null
+++ b/src/renderer/Generics/redesign/consts.ts
@@ -0,0 +1,27 @@
+export interface ClientStatusProps {
+ synchronized: boolean;
+ lowPeerCount: boolean;
+ updateAvailable: boolean;
+ blocksBehind: boolean;
+ noConnection: boolean;
+ stopped: boolean;
+ error: boolean;
+}
+
+export interface SyncStatusProps {
+ INITIALIZING: string;
+ CATCHING_UP: string;
+ SYNCHRONIZED: string;
+ LOW_PEER_COUNT: string;
+ NO_NETWORK: string;
+ STOPPED: string;
+}
+
+export const SYNC_STATUS = Object.freeze({
+ INITIALIZING: 'initializing',
+ CATCHING_UP: 'catchingUp',
+ SYNCHRONIZED: 'synchronized',
+ LOW_PEER_COUNT: 'lowPeerCount',
+ NO_NETWORK: 'noNetwork',
+ STOPPED: 'stopped',
+});
diff --git a/src/renderer/Generics/redesign/globalStyle.css.ts b/src/renderer/Generics/redesign/globalStyle.css.ts
index 2a02c9e0f..9e95c1e95 100644
--- a/src/renderer/Generics/redesign/globalStyle.css.ts
+++ b/src/renderer/Generics/redesign/globalStyle.css.ts
@@ -2,14 +2,16 @@ import { globalStyle } from '@vanilla-extract/css';
import { vars } from './theme.css';
globalStyle('#onBoarding', {
- fontFamily: 'Inter',
+ fontFamily:
+ '-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Ubuntu',
fontSize: 13,
background: vars.color.background,
color: vars.color.font,
});
globalStyle('.redesignComponent', {
- fontFamily: 'Inter',
+ fontFamily:
+ '-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Ubuntu',
fontSize: 13,
background: vars.color.background,
color: vars.color.font,
diff --git a/src/renderer/Generics/redesign/theme.css.ts b/src/renderer/Generics/redesign/theme.css.ts
index 31afb96c3..e51b4228e 100644
--- a/src/renderer/Generics/redesign/theme.css.ts
+++ b/src/renderer/Generics/redesign/theme.css.ts
@@ -2,77 +2,273 @@ import { createTheme } from '@vanilla-extract/css';
export const common = {
color: {
- white: '#FFFFFF',
- white4: 'rgba(255, 255, 255, 0.04)',
- white25: 'rgba(255, 255, 255, 0.25)',
+ white100: '#FFFFFF',
+ white90: 'rgba(255, 255, 255, 0.90)',
+ white85: 'rgba(255, 255, 255, 0.85)',
white70: 'rgba(255, 255, 255, 0.70)',
- black4: 'rgba(0, 0, 2, 0.04)',
- black25: 'rgba(0, 0, 2, 0.25)',
+ white50: 'rgba(255, 255, 255, 0.50)',
+ white40: 'rgba(255, 255, 255, 0.40)',
+ white25: 'rgba(255, 255, 255, 0.25)',
+ white15: 'rgba(255, 255, 255, 0.15)',
+ white10: 'rgba(255, 255, 255, 0.10)',
+ white8: 'rgba(255, 255, 255, 0.08)',
+ white4: 'rgba(255, 255, 255, 0.04)',
+ white0: 'rgba(255, 255, 255, 0)',
+ black100: '#000002',
+ black90: 'rgba(0, 0, 2, 0.90)',
black85: 'rgba(0, 0, 2, 0.85)',
- primary700: '#5A37D7',
+ black70: 'rgba(0, 0, 2, 0.70)',
+ black50: 'rgba(0, 0, 2, 0.50)',
+ black40: 'rgba(0, 0, 2, 0.40)',
+ black25: 'rgba(0, 0, 2, 0.25)',
+ black15: 'rgba(0, 0, 2, 0.15)',
+ black10: 'rgba(0, 0, 2, 0.10)',
+ black8: 'rgba(0, 0, 2, 0.08)',
+ black4: 'rgba(0, 0, 2, 0.04)',
+ black0: 'rgba(0, 0, 2, 0)',
+ purple50: '#F1F3FF',
+ purple100: '#E9E9FF',
+ purple200: '#DAD6FF',
+ purple300: '#C0B6FF',
+ purple400: '#A18CFF',
+ purple500: '#8267EF',
+ purple600: '#753BF4',
+ purple700: '#652AE0',
+ purple800: '#5523BD',
+ purple900: '#342673',
+ green50: '#E8FCEE',
+ green100: '#DCFAE5',
+ green200: '#C2F4D3',
+ green300: '#95EAB2',
+ green400: '#63D889',
+ green500: '#45C16A',
+ green600: '#37A055',
+ green700: '#2C7E45',
+ green800: '#26653A',
+ green900: '#203C29',
+ orange50: '#FCF3EE',
+ orange100: '#FDECDB',
+ orange200: '#FDD8B0',
+ orange300: '#FCBA79',
+ orange400: '#FB9241',
+ orange500: '#F97320',
+ orange600: '#E95818',
+ orange700: '#C14116',
+ orange800: '#9A3518',
+ orange900: '#5C2D1F',
+ red50: '#FEF2F2',
+ red100: '#FEE2E2',
+ red200: '#FECACA',
+ red300: '#F6A8A5',
+ red400: '#F47671',
+ red500: '#EB534C',
+ red600: '#D83025',
+ red700: '#B4261B',
+ red800: '#95231A',
+ red900: '#5C231E',
+ blue50: '#EFF6FF',
+ blue100: '#E0EDFF',
+ blue200: '#C8DDFE',
+ blue300: '#9DC2FE',
+ blue400: '#6DA3F9',
+ blue500: '#4C80F6',
+ blue600: '#3A5FE9',
+ blue700: '#324AD5',
+ blue800: '#2E3CAC',
+ blue900: '#2E356B',
+ yellow50: '#FDFAD8',
+ yellow100: '#FEF8BE',
+ yellow200: '#FFF18B',
+ yellow300: '#FDE148',
+ yellow400: '#FBCD19',
+ yellow500: '#EBB510',
+ yellow600: '#CC8C0D',
+ yellow700: '#A06205',
+ yellow800: '#7B4709',
+ yellow900: '#5D330E',
+ pink50: '#FDF2F8',
+ pink100: '#FCE7F3',
+ pink200: '#FBCFE8',
+ pink300: '#F9A8D4',
+ pink400: '#F472B6',
+ pink500: '#EE459A',
+ pink600: '#DC2577',
+ pink700: '#BE175D',
+ pink800: '#97114B',
+ pink900: '#571933',
+ osMac: '#1C1C1E',
+ ethereum: '#6DA3F9',
+ ethereumValidating: '#998FF1',
+ arbitrum: '#28a0f0',
+ starknet: '#373795',
+ zkSync: '#8C8DFC',
+ livepeer: '#28cd88',
+ radicle: '#B17CD9',
+ nimbus: '#F96767',
+ besu: '#29A2A1',
+ lodestar: '#29A2A1',
+ nethermind: '#FF9800',
+ teku: '#2C56DE',
+ lighthouse: '#D21ED2',
+ prysm: '#67B2B8',
+ erigon: '#AE793C',
+ geth: '#18BC9C',
+ green: 'rgba(62, 187, 100, 1)',
+ yellow: 'rgba(251, 146, 65, 1)',
+ red: 'rgba(235, 83, 76, 1)',
},
};
export const [lightTheme, vars] = createTheme({
color: {
- font: 'rgba(0, 0, 2, 0.85)',
- font10: 'rgba(0, 0, 2, 0.10)',
- font25: 'rgba(0, 0, 2, 0.25)',
- font50: 'rgba(0, 0, 2, 0.50)',
- font70: 'rgba(0, 0, 2, 0.70)',
+ font: common.color.black85,
+ font10: common.color.black10,
+ font25: common.color.black25,
+ font40: common.color.black40,
+ font50: common.color.black50,
+ font70: common.color.black70,
fontDisabled: common.color.black25,
- background: common.color.white,
- background96: 'rgba(0, 0, 2, 0.04)',
- background92: 'rgba(0, 0, 2, 0.08)',
- backgroundActiveGradient:
- 'linear-gradient(0deg, rgba(0, 0, 2, 0.04), rgba(0, 0, 2, 0.04)), #FFFFFF',
+ background: common.color.white100,
+ background96: common.color.black4,
+ background92: common.color.black8,
+ backgroundHoverGradient: `linear-gradient(0deg, ${common.color.black4}, ${common.color.black4}), #FFFFFF`,
+ backgroundActiveGradient: `linear-gradient(0deg, ${common.color.black4}, ${common.color.black4}), #FFFFFF`,
backgroundDisabled: common.color.black4,
- border: 'rgba(0, 0, 2, 0.10)',
- border15: 'rgba(0, 0, 2, 0.15)',
- primary: '#7351EB',
- primaryHover: '#482EB6',
- green: 'rgba(62, 187, 100, 1)',
- yellow: 'rgba(251, 146, 65, 1)',
- red: 'rgba(235, 83, 76, 1)',
+ border: common.color.black10,
+ border15: common.color.black15,
+ primary: common.color.purple600,
+ primaryHover: common.color.purple600,
+ primaryActive: common.color.purple700,
},
components: {
- buttonBoxShadow: '0px 1px 2px rgba(0, 0, 0, 0.08)',
+ buttonBoxShadow: `0px 1px 2px ${common.color.black8}`,
selectCardBackground: 'rgba(115, 81, 235, 0.08)',
- selectCardBoxShadow: 'inset 0px 0px 0px 4px rgba(255, 255, 255, 0.08)',
- secondaryButtonBackground: common.color.white,
- tagPinkBackground: 'rgba(255, 204, 250, 1)',
- tagPinkFontColor: common.color.black85,
+ selectCardBoxShadow: `inset 0px 0px 0px 4px ${common.color.white8}`,
+ toggleBackground: 'rgba(0 0 2 / 0.15)',
+ toggleCheckedBackground: common.color.purple600,
+ versionBorder: `1px solid ${common.color.black10}`,
+ metricTypeIcon: 'rgba(0, 0, 2, 0.5)',
+ secondaryButtonBackground: common.color.white100,
+ bannerBackground: common.color.white25,
+ bannerBoxShadow: `0px 1px 1px ${common.color.black10}, inset 0px 1px 0px ${common.color.white25}`,
+ sidebarBorder: `1px solid ${common.color.black10}`,
+ sidebarBackground: 'rgba(232, 233, 233, 0.84)',
+ clientCardBackground: common.color.white100,
+ clientCardTopBackground: common.color.black4,
+ clientCardTopBackgroundHover: common.color.black10,
+ clientCardBorder: `1px solid ${common.color.black8}`,
+ clientCardBoxShadow: `0px 2px 4px ${common.color.black4}`,
+ labelGreenBackground: common.color.green50,
+ labelRedBackground: common.color.red50,
+ labelGrayBackground: common.color.black4,
+ labelPinkBackground: common.color.pink50,
+ labelPurpleBackground: common.color.purple50,
+ labelOrangeBackground: common.color.orange50,
+ labelPink2Background: common.color.pink200,
+ labelGreenFontColor: common.color.green600,
+ labelRedFontColor: common.color.red500,
+ labelGrayFontColor: common.color.black50,
+ labelPinkFontColor: common.color.pink500,
+ labelPurpleFontColor: common.color.purple500,
+ labelOrangeFontColor: common.color.orange500,
+ labelPink2FontColor: common.color.black85,
+ tagPinkBackground: common.color.pink200,
+ tagPink2Background: common.color.pink100,
+ tagGreenBackground: common.color.green100,
+ tagPinkFontColor: common.color.black70,
+ tagPink2FontColor: common.color.pink500,
+ tagGreenFontColor: common.color.green600,
+ messageInfoBackground: common.color.blue50,
+ messageWarningBackground: common.color.orange50,
+ messageErrorBackground: common.color.red50,
+ messageSuccessBackground: common.color.green50,
+ messageInfoIcon: common.color.blue400,
+ messageWarningIcon: common.color.orange400,
+ messageErrorIcon: common.color.red400,
+ messageSuccessIcon: common.color.green400,
+ nodeIconStopped: common.color.black40,
+ walletPromptBackground: common.color.purple50,
+ headerButtonHover: common.color.black4,
+ headerButtonActive: common.color.black8,
+ updateCalloutBackground: common.color.white100,
+ updateCalloutBorder: `1px solid ${common.color.black4}`,
+ updateCalloutBoxShadow: '0px 8px 16px rgba(0, 0, 0, 0.14)',
},
});
export const darkTheme = createTheme(vars, {
color: {
- font: 'rgba(255, 255, 255, 0.85)',
- font10: 'rgba(255, 255, 255, 0.10)',
- font25: 'rgba(255, 255, 255, 0.25)',
- font50: 'rgba(255, 255, 255, 0.50)',
- font70: 'rgba(255, 255, 255, 0.70)',
+ font: common.color.white85,
+ font10: common.color.white10,
+ font25: common.color.white25,
+ font40: common.color.white40,
+ font50: common.color.white50,
+ font70: common.color.white70,
fontDisabled: common.color.white25,
background: 'rgba(28, 28, 30, 1)',
background96: common.color.white4,
- background92: 'rgba(255, 255, 255, 0.08)',
- backgroundActiveGradient:
- 'linear-gradient(0deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.04)), #000000',
+ background92: common.color.white8,
+ backgroundHoverGradient: common.color.white8,
+ backgroundActiveGradient: common.color.white4,
backgroundDisabled: common.color.white4,
- border: 'rgba(255, 255, 255, 0.1)',
- border15: 'rgba(255, 255, 255, 0.15)',
- primary: '#8267EF',
- primaryHover: '#998FF1',
- green: 'rgba(62, 187, 100, 1)',
- yellow: 'rgba(251, 146, 65, 1)',
- red: 'rgba(235, 83, 76, 1)',
+ border: common.color.white10,
+ border15: common.color.white15,
+ primary: common.color.purple600,
+ primaryHover: common.color.purple500,
+ primaryActive: common.color.purple500,
},
components: {
buttonBoxShadow: '0px 1px 2px rgba(0, 0, 0, 0.24)',
selectCardBackground: 'rgba(130, 103, 239, 0.08)',
selectCardBoxShadow: 'none',
+ toggleBackground: 'rgba(255 255 255 / 0.15)',
+ toggleCheckedBackground: common.color.purple500,
+ versionBorder: `1px solid ${common.color.white10}`,
+ metricTypeIcon: common.color.white50,
secondaryButtonBackground: common.color.white4,
+ bannerBackground: common.color.white4,
+ bannerBoxShadow: `0px 1px 1px ${common.color.black15}, inset 0px 1px 0px ${common.color.white8}`,
+ sidebarBorder: `1px solid ${common.color.black90}`,
+ sidebarBackground: 'rgba(38, 38, 39, 0.8)',
+ clientCardBackground: common.color.white4,
+ clientCardTopBackground: common.color.black15,
+ clientCardTopBackgroundHover: common.color.black8,
+ clientCardBorder: `1px solid ${common.color.white8}`,
+ clientCardBoxShadow: `0px 2px 4px ${common.color.black10}`,
+ labelGreenBackground: 'rgba(97, 218, 136, 0.25)',
+ labelRedBackground: 'rgba(235, 83, 76, 0.25)',
+ labelGrayBackground: common.color.white8,
+ labelPinkBackground: 'rgba(251, 116, 195, 0.25)',
+ labelPurpleBackground: 'rgba(153, 143, 241, 0.25)',
+ labelOrangeBackground: 'rgba(251, 146, 65, 0.25)',
+ labelPink2Background: 'rgba(251, 116, 195, 0.25)',
+ labelGreenFontColor: common.color.green400,
+ labelRedFontColor: common.color.red400,
+ labelGrayFontColor: common.color.white40,
+ labelPinkFontColor: common.color.pink400,
+ labelPurpleFontColor: common.color.purple400,
+ labelOrangeFontColor: common.color.orange400,
+ labelPink2FontColor: common.color.white70,
tagPinkBackground: 'rgba(251, 116, 195, 0.25)',
+ tagPink2Background: 'rgba(254, 227, 249, 1)',
+ tagGreenBackground: 'rgba(220, 250, 229, 1)',
tagPinkFontColor: common.color.white70,
+ tagPink2FontColor: 'rgba(236, 66, 159, 1)',
+ tagGreenFontColor: 'rgba(55, 160, 85, 1)',
+ messageInfoBackground: common.color.blue900,
+ messageWarningBackground: common.color.orange900,
+ messageErrorBackground: common.color.red900,
+ messageSuccessBackground: common.color.green900,
+ messageInfoIcon: common.color.blue600,
+ messageWarningIcon: common.color.orange600,
+ messageErrorIcon: common.color.red600,
+ messageSuccessIcon: common.color.green600,
+ nodeIconStopped: common.color.white40,
+ walletPromptBackground: common.color.purple900,
+ headerButtonHover: common.color.white4,
+ headerButtonActive: common.color.white8,
+ updateCalloutBackground: common.color.osMac,
+ updateCalloutBorder: `1px solid ${common.color.white10}`,
+ updateCalloutBoxShadow: `0px 8px 16px rgba(0, 0, 0, 0.28)`,
},
});
diff --git a/src/renderer/Generics/redesign/utils.ts b/src/renderer/Generics/redesign/utils.ts
new file mode 100644
index 000000000..11446813c
--- /dev/null
+++ b/src/renderer/Generics/redesign/utils.ts
@@ -0,0 +1,27 @@
+import { ClientStatusProps, SYNC_STATUS } from './consts';
+
+export const getSyncStatus = (status: ClientStatusProps) => {
+ let syncStatus = null;
+ switch (true) {
+ // map this in an object?
+ // find worst cases first
+ case status.stopped:
+ syncStatus = SYNC_STATUS.STOPPED;
+ break;
+ case status.noConnection:
+ syncStatus = SYNC_STATUS.NO_NETWORK;
+ break;
+ case status.blocksBehind:
+ syncStatus = SYNC_STATUS.CATCHING_UP;
+ break;
+ case status.lowPeerCount:
+ syncStatus = SYNC_STATUS.LOW_PEER_COUNT;
+ break;
+ case status.synchronized:
+ syncStatus = SYNC_STATUS.SYNCHRONIZED;
+ break;
+ default:
+ break;
+ }
+ return syncStatus;
+};
diff --git a/src/renderer/Presentational/ContentMultipleClients/ContentMultipleClients.tsx b/src/renderer/Presentational/ContentMultipleClients/ContentMultipleClients.tsx
new file mode 100644
index 000000000..e8656b5b5
--- /dev/null
+++ b/src/renderer/Presentational/ContentMultipleClients/ContentMultipleClients.tsx
@@ -0,0 +1,206 @@
+import { useState, useCallback } from 'react';
+import { ClientCard } from '../../Generics/redesign/ClientCard/ClientCard';
+import { WalletPrompt } from '../../Generics/redesign/WalletPrompt/WalletPrompt';
+import { HorizontalLine } from '../../Generics/redesign/HorizontalLine/HorizontalLine';
+import { HeaderMetrics } from '../../Generics/redesign/HeaderMetrics/HeaderMetrics';
+import { Header } from '../../Generics/redesign/Header/Header';
+import LabelValues from '../../Generics/redesign/LabelValues/LabelValues';
+import {
+ container,
+ sectionTitle,
+ sectionDescription,
+ clientCardsContainer,
+ resourcesContainer,
+} from './contentMultipleClients.css';
+
+// TODO: process retrieved client data into this format?
+const clients = [
+ {
+ name: 'nimbus',
+ version: 'v10',
+ type: 'single',
+ nodeType: 'consensus',
+ status: {
+ synchronized: true,
+ lowPeerCount: false,
+ updateAvailable: false,
+ blocksBehind: false,
+ noConnection: false,
+ stopped: false,
+ error: false,
+ },
+ stats: {
+ peers: 20,
+ slot: '4,456,158',
+ cpuLoad: 20,
+ diskUsage: 600, // in MB?
+ },
+ },
+ {
+ name: 'erigon',
+ version: 'v10',
+ type: 'single',
+ nodeType: 'execution',
+ status: {
+ synchronized: true,
+ lowPeerCount: false,
+ updateAvailable: true,
+ blocksBehind: false,
+ noConnection: false,
+ stopped: false,
+ error: false,
+ },
+ stats: {
+ peers: 16,
+ block: '15791798',
+ cpuLoad: 82,
+ diskUsage: 5000,
+ },
+ },
+];
+
+const ContentMultipleClients = () => {
+ // TODO: Come up with a better name for this component..
+ /* TODO: maybe a "provider" wrapper/manager to fetch data and handle states */
+
+ const initialWalletDismissedState =
+ localStorage.getItem('walletDismissed') === 'true';
+ const [walletDismissed, setWalletDismissed] = useState(
+ initialWalletDismissedState
+ );
+
+ const onDismissClick = useCallback(() => {
+ setWalletDismissed(true);
+ localStorage.setItem('walletDismissed', 'true');
+ }, []);
+
+ const onSetupClick = useCallback(() => {
+ // TODO: open wallet screen
+ onDismissClick();
+ }, []);
+
+ const clClient = clients.find((client) => client.nodeType === 'consensus');
+ const elClient = clients.find((client) => client.nodeType === 'execution');
+
+ // TODO: refactor this out so that it can be shared with multiple and single
+ const getNodeOverview = () => {
+ // useEffect, used only in Header and Metrics
+ let nodeOverview = {};
+
+ if (clClient && elClient) {
+ // Ethereum Altruistic Node
+ nodeOverview = {
+ name: 'ethereum',
+ title: 'Ethereum node',
+ info: 'Non-Validating Node — Ethereum mainnet',
+ type: 'altruistic',
+ status: {
+ synchronized:
+ clClient.status.synchronized || elClient.status.synchronized,
+ lowPeerCount:
+ clClient.status.lowPeerCount || elClient.status.lowPeerCount,
+ updateAvailable:
+ clClient.status.updateAvailable || elClient.status.updateAvailable,
+ blocksBehind:
+ clClient.status.blocksBehind || elClient.status.blocksBehind,
+ noConnection:
+ clClient.status.noConnection || elClient.status.noConnection,
+ stopped: clClient.status.stopped || elClient.status.stopped, // both should be stopped
+ error: clClient.status.error || elClient.status.error,
+ },
+ stats: {
+ block: clClient?.stats.slot,
+ cpuLoad:
+ (clClient?.stats.cpuLoad || 0) + (elClient?.stats.cpuLoad || 0),
+ diskUsage:
+ (clClient?.stats.diskUsage || 0) + (elClient?.stats.diskUsage || 0),
+ },
+ };
+ return nodeOverview;
+ }
+ // non-Ethereum node conditions added here
+ return clients[0];
+ };
+
+ const getResourceData = () => {
+ const resourceData = {
+ title: 'More resources',
+ items: [],
+ };
+ const resourceJson = require('./resources.json');
+ const clientNames = clients.map((client) => {
+ return client.name;
+ });
+ // Look through json and find exact client resource data
+ clientNames.forEach((value, index, array) => {
+ const clientSearch = (clientString: string) =>
+ resourceJson.find((clientObject) => clientObject.key === clientString);
+ const found = clientSearch(value);
+ if (found) {
+ resourceData.items.push(found);
+ }
+ });
+ if (clClient || elClient) {
+ // Altruistic node, so add Ethereum information at end
+ resourceData.items.push(resourceJson[0]);
+ }
+ return resourceData;
+ };
+
+ const nodeOverview = getNodeOverview();
+ const resourceData = getResourceData();
+
+ return (
+
+
+
+
+
+ {clClient.status.synchronized &&
+ elClient.status.synchronized &&
+ !walletDismissed && (
+ // TODO: Prompt handler for wallet & node status messages
+
+ )}
+
Ethereum Clients
+
+ {clients.map((client) => {
+ return ;
+ })}
+
+
+
About
+
+
+ An Ethereum node holds a copy of the Ethereum blockchain and verifies
+ the validity of every block, keeps it up-to-date with new blocks and
+ helps others to download and update their own copies of the chain.
+
+
+ In the case of Ethereum a node consists of two parts: the execution
+ client and the consensus client. These two clients work together to
+ verify Ethereum's state. The execution client listens to new
+ transactions broadcasted in the network, executes them in EVM, and
+ holds the latest state and database of all current Ethereum data. The
+ consensus client runs the Proof-of-Stake consensus algorithm, which
+ enables the network to achieve agreement based on validated data from
+ the execution client.
+
+
+ A non-validating node does not get financial rewards but there are
+ many benefits of running a node for any Ethereum user to consider,
+ including privacy, security, reduced reliance on third-party servers,
+ censorship resistance and improved health and decentralization of the
+ network.
+
+
+
+
+
+
+ );
+};
+export default ContentMultipleClients;
diff --git a/src/renderer/Presentational/ContentMultipleClients/contentMultipleClients.css.ts b/src/renderer/Presentational/ContentMultipleClients/contentMultipleClients.css.ts
new file mode 100644
index 000000000..713f14dbe
--- /dev/null
+++ b/src/renderer/Presentational/ContentMultipleClients/contentMultipleClients.css.ts
@@ -0,0 +1,40 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../../Generics/redesign/theme.css';
+
+export const container = style({
+ margin: '64px 40px',
+ boxSizing: 'border-box',
+});
+
+export const sectionTitle = style({
+ fontWeight: 590,
+ fontSize: '20px',
+ lineHeight: '100%',
+ letterSpacing: '-0.4px',
+ marginBottom: 20,
+});
+
+export const sectionDescription = style({
+ fontStyle: 'normal',
+ fontWeight: 400,
+ fontSize: 13,
+ lineHeight: '18px',
+ letterSpacing: '-0.08px',
+ color: vars.color.font50,
+});
+
+export const clientCardsContainer = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ padding: 0,
+ gap: 24,
+});
+
+export const resourcesContainer = style({
+ marginTop: 32,
+});
+
+export const horizontalLine = style({
+ padding: '0 20px',
+});
diff --git a/src/renderer/Presentational/ContentMultipleClients/resources.json b/src/renderer/Presentational/ContentMultipleClients/resources.json
new file mode 100644
index 000000000..a6ebf3f3c
--- /dev/null
+++ b/src/renderer/Presentational/ContentMultipleClients/resources.json
@@ -0,0 +1,73 @@
+[
+ {
+ "key": "ethereum",
+ "sectionTitle": "Ethereum Node",
+ "items": [
+ {
+ "label": "Run your own node",
+ "value": "ethereum.org",
+ "link": "https://ethereum.org"
+ },
+ {
+ "label": "Learn about client diversity",
+ "value": "ethereum.org",
+ "link": "https://ethereum.org"
+ }
+ ]
+ },
+ {
+ "key": "nethermind",
+ "sectionTitle": "Nethermind",
+ "items": [
+ {
+ "label": "Twitter",
+ "value": "nethermind",
+ "link": "https://ethereum.org"
+ },
+ { "label": "Discord", "value": "Join", "link": "https://ethereum.org" },
+ {
+ "label": "Website",
+ "value": "nethermind",
+ "link": "https://ethereum.org"
+ }
+ ]
+ },
+ {
+ "key": "nimbus",
+ "sectionTitle": "Nimbus",
+ "items": [
+ {
+ "label": "Twitter",
+ "value": "ethnimbus",
+ "link": "https://ethereum.org"
+ },
+ { "label": "Discord", "value": "Join", "link": "https://ethereum.org" },
+ {
+ "label": "Website",
+ "value": "nimbus.team",
+ "link": "https://ethereum.org"
+ }
+ ]
+ },
+ {
+ "key": "besu",
+ "sectionTitle": "Besu",
+ "items": [
+ {
+ "label": "Twitter",
+ "value": "@HyperledgerBesu",
+ "link": "https://ethereum.org"
+ },
+ {
+ "label": "Discord",
+ "value": "Join",
+ "link": "https://ethereum.org"
+ },
+ {
+ "label": "Website",
+ "value": "hyperledger.org",
+ "link": "https://ethereum.org"
+ }
+ ]
+ }
+]
diff --git a/src/renderer/Presentational/ContentSingleClient/ContentSingleClient.tsx b/src/renderer/Presentational/ContentSingleClient/ContentSingleClient.tsx
new file mode 100644
index 000000000..0fe3d1741
--- /dev/null
+++ b/src/renderer/Presentational/ContentSingleClient/ContentSingleClient.tsx
@@ -0,0 +1,69 @@
+import { useState, useCallback } from 'react';
+import { ClientCard } from '../../Generics/redesign/ClientCard/ClientCard';
+import { WalletPrompt } from '../../Generics/redesign/WalletPrompt/WalletPrompt';
+import { HorizontalLine } from '../../Generics/redesign/HorizontalLine/HorizontalLine';
+import { HeaderMetrics } from '../../Generics/redesign/HeaderMetrics/HeaderMetrics';
+import { Header } from '../../Generics/redesign/Header/Header';
+import LabelValues from '../../Generics/redesign/LabelValues/LabelValues';
+import {
+ container,
+ sectionTitle,
+ sectionDescription,
+ clientCardsContainer,
+ resourcesContainer,
+} from './contentSingleClient.css';
+
+// TODO: process retrieved client data into this format?
+const client = {
+ name: 'nimbus',
+ version: 'v10',
+ type: 'client',
+ nodeType: 'consensus',
+ status: {
+ synchronized: false,
+ lowPeerCount: false,
+ updateAvailable: false,
+ blocksBehind: false,
+ noConnection: false,
+ stopped: false,
+ error: false,
+ },
+ stats: {
+ peers: 15,
+ slot: '4,456,158',
+ cpuLoad: 20,
+ diskUsage: 600, // in MB?
+ },
+};
+
+const ContentSingleClient = () => {
+ /* TODO: maybe a "provider" wrapper/manager to fetch data and handle states */
+
+ // TODO: refactor this out so that it can be shared with multiple, single, and validator?
+ const getNodeOverview = () => {
+ // useEffect, used only in Header and Metrics
+
+ const clientTypeLabel =
+ client.nodeType === 'consensus' ? 'Consensus Client' : 'Execution Client';
+
+ return {
+ ...client,
+ info: `${clientTypeLabel} -- Ethereum mainnet`, // should be more flexible for other networks
+ status: 'healthy', // change this to enum to compare weights?
+ };
+ };
+
+ const nodeOverview = getNodeOverview();
+
+ // TODO: retrieve initial data for all pages
+
+ return (
+
+
+
+
+
+
+ );
+};
+export default ContentSingleClient;
diff --git a/src/renderer/Presentational/ContentSingleClient/contentSingleClient.css.ts b/src/renderer/Presentational/ContentSingleClient/contentSingleClient.css.ts
new file mode 100644
index 000000000..713f14dbe
--- /dev/null
+++ b/src/renderer/Presentational/ContentSingleClient/contentSingleClient.css.ts
@@ -0,0 +1,40 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../../Generics/redesign/theme.css';
+
+export const container = style({
+ margin: '64px 40px',
+ boxSizing: 'border-box',
+});
+
+export const sectionTitle = style({
+ fontWeight: 590,
+ fontSize: '20px',
+ lineHeight: '100%',
+ letterSpacing: '-0.4px',
+ marginBottom: 20,
+});
+
+export const sectionDescription = style({
+ fontStyle: 'normal',
+ fontWeight: 400,
+ fontSize: 13,
+ lineHeight: '18px',
+ letterSpacing: '-0.08px',
+ color: vars.color.font50,
+});
+
+export const clientCardsContainer = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ padding: 0,
+ gap: 24,
+});
+
+export const resourcesContainer = style({
+ marginTop: 32,
+});
+
+export const horizontalLine = style({
+ padding: '0 20px',
+});
diff --git a/src/renderer/Presentational/ContentSingleClient/resources.json b/src/renderer/Presentational/ContentSingleClient/resources.json
new file mode 100644
index 000000000..a6ebf3f3c
--- /dev/null
+++ b/src/renderer/Presentational/ContentSingleClient/resources.json
@@ -0,0 +1,73 @@
+[
+ {
+ "key": "ethereum",
+ "sectionTitle": "Ethereum Node",
+ "items": [
+ {
+ "label": "Run your own node",
+ "value": "ethereum.org",
+ "link": "https://ethereum.org"
+ },
+ {
+ "label": "Learn about client diversity",
+ "value": "ethereum.org",
+ "link": "https://ethereum.org"
+ }
+ ]
+ },
+ {
+ "key": "nethermind",
+ "sectionTitle": "Nethermind",
+ "items": [
+ {
+ "label": "Twitter",
+ "value": "nethermind",
+ "link": "https://ethereum.org"
+ },
+ { "label": "Discord", "value": "Join", "link": "https://ethereum.org" },
+ {
+ "label": "Website",
+ "value": "nethermind",
+ "link": "https://ethereum.org"
+ }
+ ]
+ },
+ {
+ "key": "nimbus",
+ "sectionTitle": "Nimbus",
+ "items": [
+ {
+ "label": "Twitter",
+ "value": "ethnimbus",
+ "link": "https://ethereum.org"
+ },
+ { "label": "Discord", "value": "Join", "link": "https://ethereum.org" },
+ {
+ "label": "Website",
+ "value": "nimbus.team",
+ "link": "https://ethereum.org"
+ }
+ ]
+ },
+ {
+ "key": "besu",
+ "sectionTitle": "Besu",
+ "items": [
+ {
+ "label": "Twitter",
+ "value": "@HyperledgerBesu",
+ "link": "https://ethereum.org"
+ },
+ {
+ "label": "Discord",
+ "value": "Join",
+ "link": "https://ethereum.org"
+ },
+ {
+ "label": "Website",
+ "value": "hyperledger.org",
+ "link": "https://ethereum.org"
+ }
+ ]
+ }
+]
diff --git a/src/renderer/Presentational/Sidebar/Sidebar.tsx b/src/renderer/Presentational/Sidebar/Sidebar.tsx
new file mode 100644
index 000000000..2157cdf2c
--- /dev/null
+++ b/src/renderer/Presentational/Sidebar/Sidebar.tsx
@@ -0,0 +1,106 @@
+import { Banner } from '../../Generics/redesign/Banner/Banner';
+import { SidebarNodeItem } from '../../Generics/redesign/SidebarNodeItem/SidebarNodeItem';
+import { SidebarLinkItem } from '../../Generics/redesign/SidebarLinkItem/SidebarLinkItem';
+import { SidebarTitleItem } from '../../Generics/redesign/SidebarTitleItem/SidebarTitleItem';
+import {
+ container,
+ networkBanner,
+ nodeList,
+ itemList,
+ titleItem,
+} from './sidebar.css';
+
+export interface SidebarProps {
+ /**
+ * Offline mode?
+ */
+ offline: boolean;
+}
+
+const nodeListData = [
+ {
+ iconId: 'ethereum',
+ title: 'Ethereum',
+ info: 'Mainnet',
+ status: 'healthy',
+ },
+ {
+ iconId: 'zkSync',
+ title: 'zkSync',
+ info: 'Rinkeby',
+ status: 'sync',
+ },
+ {
+ iconId: 'arbitrum',
+ title: 'Arbitrum Nitro',
+ info: 'Testnet',
+ status: 'healthy',
+ },
+ {
+ iconId: 'starknet',
+ title: 'Starknet',
+ info: 'Testnet',
+ status: 'error',
+ },
+ {
+ iconId: 'livepeer',
+ title: 'Livepeer Orchestrator',
+ info: 'Testnet',
+ status: 'warning',
+ },
+];
+
+const itemListData = [
+ {
+ iconId: 'health',
+ label: 'System Monitor',
+ },
+ {
+ iconId: 'add',
+ label: 'Add Node',
+ },
+ {
+ iconId: 'preferences',
+ label: 'Preferences',
+ },
+];
+
+const Sidebar = ({ offline }: SidebarProps) => {
+ return (
+
+ {offline && (
+
+
+
+ )}
+
+
+
+
+ {nodeListData.map((item) => {
+ return (
+
+ );
+ })}
+
+
+ {itemListData.map((item) => {
+ return (
+
+ );
+ })}
+
+
+ );
+};
+export default Sidebar;
diff --git a/src/renderer/Presentational/Sidebar/sidebar.css.ts b/src/renderer/Presentational/Sidebar/sidebar.css.ts
new file mode 100644
index 000000000..58487d609
--- /dev/null
+++ b/src/renderer/Presentational/Sidebar/sidebar.css.ts
@@ -0,0 +1,45 @@
+import { style } from '@vanilla-extract/css';
+import { vars } from '../../Generics/redesign/theme.css';
+
+export const container = style({
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'flex-start',
+ boxSizing: 'border-box',
+ padding: '0px 16px 16px 16px',
+ isolation: 'isolate',
+ width: '268px',
+ height: '100%',
+ borderRight: vars.components.sidebarBorder,
+ backgroundColor: vars.components.sidebarBackground,
+ // backdropFilter: 'blur(40px)',
+});
+
+export const networkBanner = style({
+ padding: '8px 0px',
+});
+
+export const titleItem = style({
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'center',
+ flex: 'none',
+ order: '0',
+ alignSelf: 'stretch',
+ flexGrow: '0',
+});
+
+export const nodeList = style({
+ overflowY: 'scroll',
+ order: '2',
+ alignSelf: 'stretch',
+ flexGrow: '1',
+});
+
+export const itemList = style({
+ paddingTop: '16px',
+ flex: 'none',
+ order: '3',
+ alignSelf: 'stretch',
+ flexGrow: '0',
+});
diff --git a/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-01.png b/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-01.png
new file mode 100644
index 000000000..8d1870bb4
Binary files /dev/null and b/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-01.png differ
diff --git a/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-02.png b/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-02.png
new file mode 100644
index 000000000..dd2ba8e8a
Binary files /dev/null and b/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-02.png differ
diff --git a/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-03.png b/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-03.png
new file mode 100644
index 000000000..a7284620e
Binary files /dev/null and b/src/renderer/assets/images/artwork/NN-Onboarding-Artwork-03.png differ
diff --git a/src/renderer/assets/images/artwork/wallet.png b/src/renderer/assets/images/artwork/wallet.png
new file mode 100644
index 000000000..6bf304481
Binary files /dev/null and b/src/renderer/assets/images/artwork/wallet.png differ
diff --git a/src/renderer/assets/images/artwork/welcome.png b/src/renderer/assets/images/artwork/welcome.png
new file mode 100644
index 000000000..f55008ff7
Binary files /dev/null and b/src/renderer/assets/images/artwork/welcome.png differ
diff --git a/src/renderer/assets/images/icons/CPU.svg b/src/renderer/assets/images/icons/CPU.svg
new file mode 100644
index 000000000..5b462fa9e
--- /dev/null
+++ b/src/renderer/assets/images/icons/CPU.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/assets/images/icons/Disks.svg b/src/renderer/assets/images/icons/Disks.svg
new file mode 100644
index 000000000..f8bb1fa7b
--- /dev/null
+++ b/src/renderer/assets/images/icons/Disks.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/renderer/assets/images/icons/Lightning.svg b/src/renderer/assets/images/icons/Lightning.svg
new file mode 100644
index 000000000..7f28b2e63
--- /dev/null
+++ b/src/renderer/assets/images/icons/Lightning.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/renderer/assets/images/icons/Peers.svg b/src/renderer/assets/images/icons/Peers.svg
new file mode 100644
index 000000000..7516708e4
--- /dev/null
+++ b/src/renderer/assets/images/icons/Peers.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/assets/images/icons/Shape1.svg b/src/renderer/assets/images/icons/Shape1.svg
new file mode 100644
index 000000000..9590f44c0
--- /dev/null
+++ b/src/renderer/assets/images/icons/Shape1.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/renderer/assets/images/icons/Shape2.svg b/src/renderer/assets/images/icons/Shape2.svg
new file mode 100644
index 000000000..34e6b3840
--- /dev/null
+++ b/src/renderer/assets/images/icons/Shape2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/renderer/assets/images/icons/Shape3.svg b/src/renderer/assets/images/icons/Shape3.svg
new file mode 100644
index 000000000..cda4c2af6
--- /dev/null
+++ b/src/renderer/assets/images/icons/Shape3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/renderer/assets/images/icons/Shape4.svg b/src/renderer/assets/images/icons/Shape4.svg
new file mode 100644
index 000000000..3aa1fe2c2
--- /dev/null
+++ b/src/renderer/assets/images/icons/Shape4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/renderer/assets/images/icons/Slots.svg b/src/renderer/assets/images/icons/Slots.svg
new file mode 100644
index 000000000..8176e7510
--- /dev/null
+++ b/src/renderer/assets/images/icons/Slots.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/renderer/assets/images/icons/Stop.svg b/src/renderer/assets/images/icons/Stop.svg
index 37aa73bfa..91a4e9e38 100644
--- a/src/renderer/assets/images/icons/Stop.svg
+++ b/src/renderer/assets/images/icons/Stop.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/src/renderer/assets/images/icons/Sync.svg b/src/renderer/assets/images/icons/Sync.svg
index 279c548aa..ec9f71409 100644
--- a/src/renderer/assets/images/icons/Sync.svg
+++ b/src/renderer/assets/images/icons/Sync.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/src/renderer/assets/images/icons/Syncing.svg b/src/renderer/assets/images/icons/Syncing.svg
new file mode 100644
index 000000000..173a6e8c6
--- /dev/null
+++ b/src/renderer/assets/images/icons/Syncing.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/renderer/assets/images/icons/index.tsx b/src/renderer/assets/images/icons/index.tsx
index 7e172a767..b89fa2b16 100644
--- a/src/renderer/assets/images/icons/index.tsx
+++ b/src/renderer/assets/images/icons/index.tsx
@@ -1,27 +1,201 @@
-const settings = require('./Settings.svg');
-const play = require('./Play.svg');
-const bell = require('./Bell.svg');
-const add = require('./Add.svg');
-const preferences = require('./Preferences.svg');
-const popup = require('./Popup.svg');
+import { ReactComponent as Add } from './Add.svg';
+import { ReactComponent as Bell } from './Bell.svg';
+import { ReactComponent as Binoculars } from './Binoculars.svg';
+import { ReactComponent as Block } from './Block.svg';
+import { ReactComponent as Blocks } from './Blocks.svg';
+import { ReactComponent as BoltStrike } from './Bolt-strike.svg';
+import { ReactComponent as Bolt } from './Bolt.svg';
+import { ReactComponent as Calendar } from './Calendar.svg';
+import { ReactComponent as CheckBadgeFilled1 } from './Check-badge-filled-1.svg';
+import { ReactComponent as CheckBadgeFilled } from './Check-badge-filled.svg';
+import { ReactComponent as CheckCircleFilled } from './Check-circle-filled.svg';
+import { ReactComponent as CheckCircle } from './Check-circle.svg';
+import { ReactComponent as CheckDouble } from './Check-double.svg';
+import { ReactComponent as Check } from './Check.svg';
+import { ReactComponent as CloseCircleFilled } from './Close-circle-filled.svg';
+import { ReactComponent as CloseCircle } from './Close-circle.svg';
+import { ReactComponent as Close } from './Close.svg';
+import { ReactComponent as Copy } from './Copy.svg';
+import { ReactComponent as Cpu } from './CPU.svg';
+import { ReactComponent as Disk } from './Disk.svg';
+import { ReactComponent as Disks } from './Disks.svg';
+import { ReactComponent as DownLarge } from './Down-large.svg';
+import { ReactComponent as Down } from './Down.svg';
+import { ReactComponent as Download1 } from './Download-1.svg';
+import { ReactComponent as Download } from './Download.svg';
+import { ReactComponent as External } from './External.svg';
+import { ReactComponent as FilterLargeFilled } from './Filter-large-filled.svg';
+import { ReactComponent as FilterLarge } from './Filter-large.svg';
+import { ReactComponent as Filter } from './Filter.svg';
+import { ReactComponent as Health } from './Health.svg';
+import { ReactComponent as InfoCircleFilled } from './Info-circle-filled.svg';
+import { ReactComponent as InfoCircle } from './Info-circle.svg';
+import { ReactComponent as LeftLarge } from './Left-large.svg';
+import { ReactComponent as Left } from './Left.svg';
+import { ReactComponent as Lightning } from './Lightning.svg';
+import { ReactComponent as Logs } from './Logs.svg';
+import { ReactComponent as Mail } from './Mail.svg';
+import { ReactComponent as DarkMode } from './Nicenode-darkmode.svg';
+import { ReactComponent as LightMode } from './Nicenode-lightmode.svg';
+import { ReactComponent as Nodes } from './Nodes.svg';
+import { ReactComponent as Peers } from './Peers.svg';
+import { ReactComponent as Play } from './Play.svg';
+import { ReactComponent as Popup } from './Popup.svg';
+import { ReactComponent as Preferences } from './Preferences.svg';
+import { ReactComponent as RightLarge } from './Right-large.svg';
+import { ReactComponent as Right } from './Right.svg';
+import { ReactComponent as ScrollFill } from './Scroll-fill.svg';
+import { ReactComponent as Scroll } from './Scroll.svg';
+import { ReactComponent as Search } from './Search.svg';
+import { ReactComponent as Settings } from './Settings.svg';
+import { ReactComponent as Shape1 } from './Shape1.svg';
+import { ReactComponent as Shape2 } from './Shape2.svg';
+import { ReactComponent as Shape3 } from './Shape3.svg';
+import { ReactComponent as Shape4 } from './Shape4.svg';
+import { ReactComponent as Slots } from './Slots.svg';
+import { ReactComponent as Speedometer } from './Speedometer.svg';
+import { ReactComponent as SpinnerEndless } from './Spinner-endless.svg';
+import { ReactComponent as Stop } from './Stop.svg';
+import { ReactComponent as SyncSmall } from './Sync-small.svg';
+import { ReactComponent as Sync } from './Sync.svg';
+import { ReactComponent as Syncing } from './Syncing.svg';
+import { ReactComponent as UpLarge } from './Up-large.svg';
+import { ReactComponent as Up } from './Up.svg';
+import { ReactComponent as WarningCircleFilled } from './Warning-circle-filled.svg';
export interface Icons {
- settings?: string;
- play?: string;
- bell?: string;
- add?: string;
- preferences?: string;
- popup?: string;
+ add?: React.ReactNode;
+ bell?: React.ReactNode;
+ binoculars?: React.ReactNode;
+ block?: React.ReactNode;
+ blocks?: React.ReactNode;
+ boltstrike?: React.ReactNode;
+ bolt?: React.ReactNode;
+ calendar?: React.ReactNode;
+ checkbadgefilled1?: React.ReactNode;
+ checkbadgefilled?: React.ReactNode;
+ checkcirclefilled?: React.ReactNode;
+ checkcircle?: React.ReactNode;
+ checkdouble?: React.ReactNode;
+ check?: React.ReactNode;
+ closecirclefilled?: React.ReactNode;
+ closecircle?: React.ReactNode;
+ close?: React.ReactNode;
+ copy?: React.ReactNode;
+ cpu?: React.ReactNode;
+ disk?: React.ReactNode;
+ disks?: React.ReactNode;
+ downlarge?: React.ReactNode;
+ down?: React.ReactNode;
+ download1?: React.ReactNode;
+ download?: React.ReactNode;
+ external?: React.ReactNode;
+ filterlargefilled?: React.ReactNode;
+ filterlarge?: React.ReactNode;
+ filter?: React.ReactNode;
+ health?: React.ReactNode;
+ infocirclefilled?: React.ReactNode;
+ infocircle?: React.ReactNode;
+ leftlarge?: React.ReactNode;
+ left?: React.ReactNode;
+ lightning?: React.ReactNode;
+ logs?: React.ReactNode;
+ mail?: React.ReactNode;
+ darkmode?: React.ReactNode;
+ lightmode?: React.ReactNode;
+ nodes?: React.ReactNode;
+ peers?: React.ReactNode;
+ play?: React.ReactNode;
+ popup?: React.ReactNode;
+ preferences?: React.ReactNode;
+ rightlarge?: React.ReactNode;
+ right?: React.ReactNode;
+ scrollfill?: React.ReactNode;
+ scroll?: React.ReactNode;
+ search?: React.ReactNode;
+ settings?: React.ReactNode;
+ shape1?: React.ReactNode;
+ shape2?: React.ReactNode;
+ shape3?: React.ReactNode;
+ shape4?: React.ReactNode;
+ slots?: React.ReactNode;
+ speedometer?: React.ReactNode;
+ spinnerendless?: React.ReactNode;
+ stop?: React.ReactNode;
+ syncsmall?: React.ReactNode;
+ sync?: React.ReactNode;
+ syncing?: React.ReactNode;
+ uplarge?: React.ReactNode;
+ up?: React.ReactNode;
+ warningcirclefilled?: React.ReactNode;
}
// Define all icons here
export const ICONS: Icons = {
- settings,
- play,
- bell,
- add,
- preferences,
- popup,
+ add: ,
+ bell: ,
+ binoculars: ,
+ block: ,
+ blocks: ,
+ boltstrike: ,
+ bolt: ,
+ calendar: ,
+ checkbadgefilled1: ,
+ checkbadgefilled: ,
+ checkcirclefilled: ,
+ checkcircle: ,
+ checkdouble: ,
+ check: ,
+ closecirclefilled: ,
+ closecircle: ,
+ close: ,
+ copy: ,
+ cpu: ,
+ disk: ,
+ disks: ,
+ downlarge: ,
+ down: ,
+ download1: ,
+ download: ,
+ external: ,
+ filterlargefilled: ,
+ filterlarge: ,
+ filter: ,
+ health: ,
+ infocirclefilled: ,
+ infocircle: ,
+ leftlarge: ,
+ left: ,
+ logs: ,
+ lightning: ,
+ mail: ,
+ darkmode: ,
+ lightmode: ,
+ nodes: ,
+ peers: ,
+ play: ,
+ popup: ,
+ preferences: ,
+ rightlarge: ,
+ right: ,
+ scrollfill: ,
+ scroll: ,
+ search: ,
+ settings: ,
+ shape1: ,
+ shape2: ,
+ shape3: ,
+ shape4: ,
+ slots: ,
+ speedometer: ,
+ spinnerendless: ,
+ stop: ,
+ syncsmall: ,
+ sync: ,
+ syncing: ,
+ uplarge: ,
+ up: ,
+ warningcirclefilled: ,
};
export type IconId = keyof Icons;
diff --git a/src/renderer/assets/images/logo/color.svg b/src/renderer/assets/images/logo/color.svg
new file mode 100644
index 000000000..c8df9d20f
--- /dev/null
+++ b/src/renderer/assets/images/logo/color.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/assets/images/logo/mono-inverse.svg b/src/renderer/assets/images/logo/mono-inverse.svg
new file mode 100644
index 000000000..4801db54c
--- /dev/null
+++ b/src/renderer/assets/images/logo/mono-inverse.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/assets/images/logo/mono.svg b/src/renderer/assets/images/logo/mono.svg
new file mode 100644
index 000000000..e3d5dec16
--- /dev/null
+++ b/src/renderer/assets/images/logo/mono.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/assets/images/nodeBackgrounds/Besu.png b/src/renderer/assets/images/nodeBackgrounds/Besu.png
new file mode 100644
index 000000000..efd6b17fe
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Besu.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Erigon.png b/src/renderer/assets/images/nodeBackgrounds/Erigon.png
new file mode 100644
index 000000000..d48892372
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Erigon.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Geth.png b/src/renderer/assets/images/nodeBackgrounds/Geth.png
new file mode 100644
index 000000000..23b7c74af
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Geth.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Lighthouse.png b/src/renderer/assets/images/nodeBackgrounds/Lighthouse.png
new file mode 100644
index 000000000..656858e52
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Lighthouse.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Lodestar.png b/src/renderer/assets/images/nodeBackgrounds/Lodestar.png
new file mode 100644
index 000000000..79f4d1d9c
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Lodestar.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Nethermind.png b/src/renderer/assets/images/nodeBackgrounds/Nethermind.png
new file mode 100644
index 000000000..9891144b0
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Nethermind.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Nimbus.png b/src/renderer/assets/images/nodeBackgrounds/Nimbus.png
new file mode 100644
index 000000000..6180869ed
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Nimbus.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Prysm.png b/src/renderer/assets/images/nodeBackgrounds/Prysm.png
new file mode 100644
index 000000000..9e7464d49
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Prysm.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/Teku.png b/src/renderer/assets/images/nodeBackgrounds/Teku.png
new file mode 100644
index 000000000..af52e4f67
Binary files /dev/null and b/src/renderer/assets/images/nodeBackgrounds/Teku.png differ
diff --git a/src/renderer/assets/images/nodeBackgrounds/index.tsx b/src/renderer/assets/images/nodeBackgrounds/index.tsx
new file mode 100644
index 000000000..bd52c604d
--- /dev/null
+++ b/src/renderer/assets/images/nodeBackgrounds/index.tsx
@@ -0,0 +1,39 @@
+// Execution
+const geth = require('./Geth.png');
+const erigon = require('./Erigon.png');
+const besu = require('./Besu.png');
+const nethermind = require('./Nethermind.png');
+
+// Consensus
+const prysm = require('./Prysm.png');
+const lighthouse = require('./Lighthouse.png');
+const teku = require('./Teku.png');
+const lodestar = require('./Lodestar.png');
+const nimbus = require('./Nimbus.png');
+
+export interface NodeBackgrounds {
+ geth?: string;
+ erigon?: string;
+ besu?: string;
+ nethermind?: string;
+ prysm?: string;
+ lighthouse?: string;
+ teku?: string;
+ lodestar?: string;
+ nimbus?: string;
+}
+
+// Define all icons here
+export const NODE_BACKGROUNDS: NodeBackgrounds = {
+ geth,
+ erigon,
+ besu,
+ nethermind,
+ prysm,
+ lighthouse,
+ teku,
+ lodestar,
+ nimbus,
+};
+
+export type NodeBackgroundId = keyof NodeBackgrounds;
diff --git a/src/renderer/assets/images/nodeIcons/Logo-Nimbus.png b/src/renderer/assets/images/nodeIcons/Logo-Nimbus.png
index 8156a1bb3..15ad68e17 100644
Binary files a/src/renderer/assets/images/nodeIcons/Logo-Nimbus.png and b/src/renderer/assets/images/nodeIcons/Logo-Nimbus.png differ
diff --git a/src/renderer/assets/images/nodeIcons/index.tsx b/src/renderer/assets/images/nodeIcons/index.tsx
index 05e56eb1f..ea39b2473 100644
--- a/src/renderer/assets/images/nodeIcons/index.tsx
+++ b/src/renderer/assets/images/nodeIcons/index.tsx
@@ -1,3 +1,5 @@
+import { common } from '../../../Generics/redesign/theme.css';
+
const ethereum = require('./Logo-Ethereum.png');
// Execution
@@ -16,18 +18,12 @@ const nimbus = require('./Logo-Nimbus.png');
// L2
const arbitrum = require('./Logo-Arbitrum.png');
const starknet = require('./Logo-Starknet.png');
-const zkSync = require('./Logo-Starknet.png');
+const zkSync = require('./Logo-zkSync.png');
// Other networks
const radicle = require('./Logo-Radicle.png');
const livepeer = require('./Logo-Livepeer.png');
-// Status
-const healthy = require('./healthy.svg');
-const warning = require('./warning.svg');
-const error = require('./error.svg');
-const sync = require('./sync.svg');
-
export interface NodeIcons {
geth?: string;
erigon?: string;
@@ -46,13 +42,6 @@ export interface NodeIcons {
livepeer?: string;
}
-export interface NodeStatus {
- healthy?: string;
- warning?: string;
- error?: string;
- sync?: string;
-}
-
// Define all icons here
export const NODE_ICONS: NodeIcons = {
geth,
@@ -72,15 +61,8 @@ export const NODE_ICONS: NodeIcons = {
livepeer,
};
-// Replace soon with CSS
-export const NODE_STATUS: NodeStatus = {
- healthy,
- warning,
- error,
- sync,
-};
-
const white = '#FFFFFF';
+
export const NODE_COLORS: NodeIcons = {
geth: white,
erigon: white,
@@ -91,12 +73,12 @@ export const NODE_COLORS: NodeIcons = {
teku: white,
lodestar: white,
nimbus: white,
- ethereum: '#6DA3F9',
- arbitrum: '#28A0F0',
- starknet: '#373795',
- zkSync: '#8C8DFC',
- radicle: '#B17CD9',
- livepeer: '#28CD88',
+ ethereum: common.color.ethereum,
+ arbitrum: common.color.arbitrum,
+ starknet: common.color.starknet,
+ zkSync: common.color.zkSync,
+ radicle: common.color.radicle,
+ livepeer: common.color.livepeer,
};
export type NodeIconId = keyof NodeIcons;
diff --git a/src/renderer/assets/sass/core/_reset.scss b/src/renderer/assets/reset.scss
similarity index 100%
rename from src/renderer/assets/sass/core/_reset.scss
rename to src/renderer/assets/reset.scss
diff --git a/src/renderer/assets/sass/abstracts/_variables.scss b/src/renderer/assets/sass/abstracts/_variables.scss
deleted file mode 100644
index e69de29bb..000000000
diff --git a/src/renderer/assets/sass/app.scss b/src/renderer/assets/sass/app.scss
deleted file mode 100644
index 588014cef..000000000
--- a/src/renderer/assets/sass/app.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-// Abstract files
-@import 'abstracts/_variables';
-
-// Core files
-@import 'core/_reset';
-@import 'core/_typography';
-
-// Components
-@import 'components/_bubble';
-@import 'components/_toggle';
-@import 'components/_nodeIcon';
-@import 'components/_sidebarNodeItem';
-@import 'components/_sidebarLinkItem';
-
-// // Layout
-// @import "layout/all";
-
-// // Sections
-// @import "sections/all";
-
-// // Pages
-// @import "pages/all";
diff --git a/src/renderer/assets/sass/components/_bubble.scss b/src/renderer/assets/sass/components/_bubble.scss
deleted file mode 100644
index 51a5e1422..000000000
--- a/src/renderer/assets/sass/components/_bubble.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-.storybook-bubble {
- flex:none;
- display: flex;
- flex-direction: row;
- align-items: flex-start;
- padding: 2px 6px;
- gap: 10px;
-
- font-family: 'Inter';
- font-weight: 700;
- font-size: 11px;
- line-height: 14px;
- text-align: center;
- color: #FFFFFF;
- max-width: fit-content;
-
- background: #EB493D;
- border-radius: 9px;
-}
diff --git a/src/renderer/assets/sass/components/_nodeIcon.scss b/src/renderer/assets/sass/components/_nodeIcon.scss
deleted file mode 100644
index bfc1b412c..000000000
--- a/src/renderer/assets/sass/components/_nodeIcon.scss
+++ /dev/null
@@ -1,168 +0,0 @@
-@keyframes rotation {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(359deg);
- }
-}
-
-.storybook-node-icon {
- position: relative;
- display: flex; /* establish flex container */
- flex-direction: column; /* make main axis vertical */
- justify-content: center; /* center items vertically, in this case */
- align-items: center; /* center items horizontally, in this case */
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
-}
-
-.storybook-node-icon {
- &.status {
- &.small {
- -webkit-mask-image: radial-gradient(
- circle 8px at calc(100% - 4px) calc(100% - 28px),
- transparent 6px,
- #000 0
- );
- }
-
- &.medium {
- -webkit-mask-image: radial-gradient(
- circle 10px at calc(100% - 5px) calc(100% - 35px),
- transparent 7px,
- #000 0
- );
- }
-
- &.large {
- -webkit-mask-image: radial-gradient(
- circle 26px at calc(100% - 7px) calc(100% - 49px),
- transparent 10px,
- #000 0
- );
- }
- }
-}
-
-.storybook-node {
- position: relative;
-
- &.small {
- width: 32px;
- height: 32px;
-
- .storybook-node-icon {
- border: 1px solid rgba(0, 0, 2, 0.04);
- width: 32px;
- height: 32px;
- background-size: 32px;
- border-radius: 12px;
- }
-
- .storybook-node-image {
- width: 32px;
- height: 32px;
- background-size: 32px;
- background-position: center center;
- }
- }
-
- &.medium {
- width: 40px;
- height: 40px;
-
- .storybook-node-icon {
- border: 1px solid rgba(0, 0, 2, 0.04);
- width: 40px;
- height: 40px;
- background-size: 40px;
- border-radius: 14px;
- }
-
- .storybook-node-image {
- width: 40px;
- height: 40px;
- background-size: 40px;
- background-position: center center;
- }
- }
-
- &.large {
- width: 56px;
- height: 56px;
-
- .storybook-node-icon {
- border: 1px solid rgba(0, 0, 2, 0.1);
- width: 56px;
- height: 56px;
- background-size: 56px;
- border-radius: 18px;
- }
-
- .storybook-node-image {
- width: 54px;
- height: 54px;
- background-size: 54px;
- background-position: center center;
- }
- }
-}
-
-.storybook-node-status {
- box-sizing: border-box;
- position: absolute;
- right: 0;
- top: 0;
-
- &.darkMode {
- &.sync {
- background-color: rgba(255, 255, 255, 1);
- }
- }
-
- &.sync {
- animation: rotation 2s infinite linear;
- right: -1px;
- -webkit-mask-size: cover;
- mask-size: cover;
- background-color: rgba(0, 0, 2, 0.95);
- }
-
- &.small {
- width: 8px;
- height: 8px;
- background-size: 8px;
-
- &.sync {
- width: 10px;
- height: 8px;
- background-size: 10px 8px;
- }
- }
-
- &.medium {
- width: 10px;
- height: 10px;
- background-size: 10px;
-
- &.sync {
- width: 12px;
- height: 10px;
- background-size: 12px 10px;
- }
- }
-
- &.large {
- width: 14px;
- height: 14px;
- background-size: 14px;
-
- &.sync {
- width: 16px;
- height: 13px;
- background-size: 16px 13px;
- }
- }
-}
diff --git a/src/renderer/assets/sass/components/_sidebarLinkItem.scss b/src/renderer/assets/sass/components/_sidebarLinkItem.scss
deleted file mode 100644
index 5b80b95eb..000000000
--- a/src/renderer/assets/sass/components/_sidebarLinkItem.scss
+++ /dev/null
@@ -1,57 +0,0 @@
-.storybook-sidebar-link-item {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 8px;
-
- width: 236px;
- height: 30px;
-
- border-radius: 5px;
-}
-
-.storybook-sidebar-link-item:hover {
- background: rgba(0, 0, 2, 0.04);
-}
-
-.storybook-sidebar-link-item:active {
- background: rgba(0, 0, 2, 0.08);
-}
-
-.storybook-sidebar-link-item.darkMode:hover {
- background: rgba(255, 255, 255, 0.04);
-}
-
-.storybook-sidebar-link-item.darkMode:active {
- background: #8F61EA;
-}
-
-.storybook-sidebar-link-item .storybook-button-icon {
- margin-left: 9px;
- background: rgba(0, 0, 2, 0.7);
-}
-
-.storybook-sidebar-link-item.darkMode .storybook-button-icon {
- background: rgba(255, 255, 255, 0.9);
-}
-
-// TODO: adjust the padding of text in this component
-.storybook-sidebar-link-item-label {
- flex:1;
- font-family: 'Inter';
- font-style: normal;
- font-weight: 500;
- font-size: 13px;
- line-height: 16px;
- color: rgba(0, 0, 2, 0.7);
-}
-
-.storybook-sidebar-link-item.darkMode .storybook-sidebar-link-item-label {
- color: rgba(255, 255, 255, 0.9);
-}
-
-.storybook-sidebar-link-item-bubble {
- padding-right: 10px;
-}
-
-
diff --git a/src/renderer/assets/sass/components/_sidebarNodeItem.scss b/src/renderer/assets/sass/components/_sidebarNodeItem.scss
deleted file mode 100644
index 5dd16bcf3..000000000
--- a/src/renderer/assets/sass/components/_sidebarNodeItem.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-.storybook-sidebar-node-item {
- display: flex;
- flex-direction: row;
- align-items: flex-start;
- padding: 8px 10px;
- gap: 12px;
- width: 236px;
-
- & > * {
- &:first-child {
- flex: none;
- order: 0;
- flex-grow: 0;
- }
- font-family: 'Inter';
- font-style: normal;
- }
-
- &.darkMode:active {
- background: rgba(255, 255, 255, 0.04);
- border-radius: 4px;
- }
-
- &:active {
- background: rgba(0, 0, 2, 0.04);
- border-radius: 4px;
- }
-}
-
-.storybook-sidebar-node-item-container {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- padding: 0px;
- gap: 2px;
-
- width: 172px;
- height: 32px;
-
- flex: none;
- order: 1;
- flex-grow: 1;
-}
-
-.storybook-sidebar-node-item-title {
- order: 0;
- flex: none;
- align-self: stretch;
- flex-grow: 0;
- font-weight: 500;
- font-size: 13px;
- line-height: 16px;
- color: rgba(0, 0, 2, 0.7);
-}
-
-.darkMode .storybook-sidebar-node-item-title {
- color: rgba(255, 255, 255, 0.85);
-}
-
-.storybook-sidebar-node-item-info {
- order: 1;
- flex: none;
- align-self: stretch;
- flex-grow: 0;
- font-weight: 400;
- font-size: 11px;
- line-height: 14px;
- color: rgba(0, 0, 2, 0.5);
-
-}
-
-.darkMode .storybook-sidebar-node-item-info {
- color: rgba(255, 255, 255, 0.5);
-}
diff --git a/src/renderer/assets/sass/components/_toggle.scss b/src/renderer/assets/sass/components/_toggle.scss
deleted file mode 100644
index cff134da9..000000000
--- a/src/renderer/assets/sass/components/_toggle.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-.storybook-toggle-input {
- --opacity: 0.15;
- height: 16px;
- width: 30px;
-
- background-repeat: no-repeat;
- background-image: url("data:image/svg+xml, ");
- background-position: 0;
- transition: background-position 0.15s ease-in-out;
-
- background-color: rgba(0 0 2 / var(--opacity));
-
- border-radius: 9999px;
- appearance: none;
-
- &.darkMode {
- background-color: rgba(255 255 255 / var(--opacity));
- }
-
- &:checked {
- background-color: #7d56d7;
- border-color: #7d56d7;
- background-position: 100%;
-
- &.darkMode {
- background-color: #8267ef;
- }
- }
-}
-
-.storybook-toggle-input:disabled {
- pointer-events: none;
- filter: none;
- opacity: 0.5;
-}
diff --git a/src/renderer/assets/sass/core/_typography.scss b/src/renderer/assets/sass/core/_typography.scss
deleted file mode 100644
index f4db5e44f..000000000
--- a/src/renderer/assets/sass/core/_typography.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-@font-face {
- font-family: 'Inter';
- src: local('Inter'), url(../fonts/Inter.ttf) format('truetype');
- /* other formats include: 'woff2', 'truetype, 'opentype',
- 'embedded-opentype', and 'svg' */
-}
diff --git a/src/stories/Generic/Banner.stories.tsx b/src/stories/Generic/Banner.stories.tsx
new file mode 100644
index 000000000..c1c8788ff
--- /dev/null
+++ b/src/stories/Generic/Banner.stories.tsx
@@ -0,0 +1,15 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { Banner } from '../../renderer/Generics/redesign/Banner/Banner';
+
+export default {
+ title: 'Generic/Banner',
+ component: Banner,
+ argTypes: {
+ backgroundColor: { control: 'color' },
+ },
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => ;
+
+export const Primary = Template.bind({});
diff --git a/src/stories/Generic/Bubble.stories.tsx b/src/stories/Generic/Bubble.stories.tsx
index 0dbfad5ca..4e772c990 100644
--- a/src/stories/Generic/Bubble.stories.tsx
+++ b/src/stories/Generic/Bubble.stories.tsx
@@ -1,6 +1,6 @@
import { ComponentStory, ComponentMeta } from '@storybook/react';
-import { Bubble } from '../../renderer/Generics/redesign/Bubble';
+import { Bubble } from '../../renderer/Generics/redesign/Bubble/Bubble';
export default {
title: 'Generic/Bubble',
diff --git a/src/stories/Generic/Button.stories.tsx b/src/stories/Generic/Button.stories.tsx
index 778b45657..160c2ab97 100644
--- a/src/stories/Generic/Button.stories.tsx
+++ b/src/stories/Generic/Button.stories.tsx
@@ -1,8 +1,6 @@
import { ComponentStory, ComponentMeta } from '@storybook/react';
import Button from '../../renderer/Generics/redesign/Button/Button';
-import { ReactComponent as SettingsIcon } from '../../renderer/assets/images/icons/Settings.svg';
-// import SettingsIcon from '../../renderer/assets/images/icons/Settings.svg';
export default {
title: 'Generic/Button',
@@ -25,7 +23,7 @@ PrimarySmallIcon.args = {
primary: true,
label: 'Button',
size: 'small',
- icon:
+ iconId: 'settings',
};
export const SecondarySmall = Template.bind({});
@@ -51,5 +49,6 @@ export const SecondaryMediumIcon = Template.bind({});
SecondaryMediumIcon.args = {
size: 'medium',
label: 'Settings',
- icon:
+ iconId: 'settings',
+ variant: 'icon-right',
};
diff --git a/src/stories/Generic/Header.stories.tsx b/src/stories/Generic/Header.stories.tsx
new file mode 100644
index 000000000..0bd5ffce7
--- /dev/null
+++ b/src/stories/Generic/Header.stories.tsx
@@ -0,0 +1,36 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { Header } from '../../renderer/Generics/redesign/Header/Header';
+
+export default {
+ title: 'Generic/Header',
+ component: Header,
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => ;
+
+export const Primary = Template.bind({});
+
+Primary.args = {
+ //TODO: fix this so we only pass in params?
+ nodeOverview: {
+ name: 'ethereum',
+ title: 'Ethereum node',
+ info: 'Non-Validating Node — Ethereum mainnet',
+ type: 'altruistic',
+ status: {
+ synchronized: true,
+ lowPeerCount: true,
+ updateAvailable: true,
+ blocksBehind: false,
+ noConnection: false,
+ stopped: false,
+ error: false,
+ },
+ stats: {
+ block: '32,000,200',
+ cpuLoad: 90,
+ diskUsage: 10000,
+ },
+ },
+};
diff --git a/src/stories/Generic/HeaderButton.stories.tsx b/src/stories/Generic/HeaderButton.stories.tsx
new file mode 100644
index 000000000..c25d0b468
--- /dev/null
+++ b/src/stories/Generic/HeaderButton.stories.tsx
@@ -0,0 +1,36 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { HeaderButton } from '../../renderer/Generics/redesign/HeaderButton/HeaderButton';
+
+export default {
+ title: 'Generic/HeaderButton',
+ component: HeaderButton,
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Close = Template.bind({});
+Close.args = {
+ type: 'close',
+ onClick: () => {
+ console.log('close!');
+ },
+};
+
+export const Left = Template.bind({});
+Left.args = {
+ type: 'left',
+ onClick: () => {
+ console.log('left!');
+ },
+};
+
+export const Filter = Template.bind({});
+Filter.args = {
+ type: 'filter',
+ onClick: () => {
+ console.log('filter!');
+ },
+};
diff --git a/src/stories/Generic/HeaderMetrics.stories.tsx b/src/stories/Generic/HeaderMetrics.stories.tsx
new file mode 100644
index 000000000..c30e818a1
--- /dev/null
+++ b/src/stories/Generic/HeaderMetrics.stories.tsx
@@ -0,0 +1,37 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { HeaderMetrics } from '../../renderer/Generics/redesign/HeaderMetrics/HeaderMetrics';
+
+export default {
+ title: 'Generic/HeaderMetrics',
+ component: HeaderMetrics,
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Primary = Template.bind({});
+
+Primary.args = {
+ nodeOverview: {
+ name: 'ethereum',
+ title: 'Ethereum node',
+ info: 'Non-Validating Node — Ethereum mainnet',
+ type: 'altruistic',
+ status: {
+ synchronized: true,
+ lowPeerCount: true,
+ updateAvailable: true,
+ blocksBehind: false,
+ noConnection: false,
+ stopped: false,
+ error: false,
+ },
+ stats: {
+ block: '32,000,200',
+ cpuLoad: 90,
+ diskUsage: 10000,
+ },
+ },
+};
diff --git a/src/stories/Generic/Label.stories.tsx b/src/stories/Generic/Label.stories.tsx
new file mode 100644
index 000000000..dda3eb566
--- /dev/null
+++ b/src/stories/Generic/Label.stories.tsx
@@ -0,0 +1,19 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { Label } from '../../renderer/Generics/redesign/Label/Label';
+
+export default {
+ title: 'Generic/Label',
+ component: Label,
+ argTypes: {
+ backgroundColor: { control: 'color' },
+ },
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => ;
+
+export const Primary = Template.bind({});
+Primary.args = {
+ label: 'Minority Client',
+ type: 'pink',
+};
diff --git a/src/stories/Generic/LineKeyValues.stories.tsx b/src/stories/Generic/LineKeyValues.stories.tsx
index 7f4ba8320..54bed4516 100644
--- a/src/stories/Generic/LineKeyValues.stories.tsx
+++ b/src/stories/Generic/LineKeyValues.stories.tsx
@@ -5,37 +5,92 @@ import LabelValues from '../../renderer/Generics/redesign/LabelValues/LabelValue
export default {
title: 'Generic/LabelValues',
component: LabelValues,
- argTypes: {
- },
+ argTypes: {},
} as ComponentMeta;
-const Template: ComponentStory = (args) => ;
+const Template: ComponentStory = (args) => (
+
+);
+
+export const About = Template.bind({});
+About.args = {
+ title: 'More resources',
+ items: [
+ {
+ sectionTitle: 'Nimbus',
+ items: [
+ { label: 'Twitter', value: 'ethnimbus', link: 'https://ethereum.org' },
+ { label: 'Discord', value: 'Join', link: 'https://ethereum.org' },
+ {
+ label: 'Website',
+ value: 'nimbus.team',
+ link: 'https://ethereum.org',
+ },
+ ],
+ },
+ {
+ sectionTitle: 'Besu',
+ items: [
+ {
+ label: 'Twitter',
+ value: '@HyperledgerBesu',
+ link: 'https://ethereum.org',
+ },
+ {
+ label: 'Discord',
+ value: 'Join',
+ link: 'https://ethereum.org',
+ },
+ {
+ label: 'Website',
+ value: 'hyperledger.org',
+ link: 'https://ethereum.org',
+ },
+ ],
+ },
+ {
+ sectionTitle: 'Ethereum Node',
+ items: [
+ {
+ label: 'Run your own node',
+ value: 'ethereum.org',
+ link: 'https://ethereum.org',
+ },
+ {
+ label: 'Learn about client diversity',
+ value: 'ethereum.org',
+ link: 'https://ethereum.org',
+ },
+ ],
+ },
+ ],
+};
export const Primary = Template.bind({});
Primary.args = {
title: 'Node requirements',
items: [
{
- sectionTitle: "cpu",
+ sectionTitle: 'cpu',
items: [
- {label: 'Cores', value: '2'},
- {label: 'Min. clock speed', value: '2.2Ghz'}
- ]
+ { label: 'Cores', value: '2' },
+ { label: 'Min. clock speed', value: '2.2Ghz' },
+ ],
},
{
- sectionTitle: "storage",
+ sectionTitle: 'storage',
items: [
- {label: 'Type', value: 'SSD'},
- {label: 'IOPS', value: '1000IOPS'},
- {label: 'Capacity', value: '2TB'}
- ]
+ { label: 'Type', value: 'SSD' },
+ { label: 'IOPS', value: '1000IOPS' },
+ { label: 'Capacity', value: '2TB' },
+ ],
},
{
- sectionTitle: "memory",
+ sectionTitle: 'memory',
items: [
- {label: 'Total', value: '8GB'},
- {label: 'Free', value: '4GB'}
- ]
- }
- ]
+ { label: 'Total', value: '8GB' },
+ { label: 'Free', value: '4GB' },
+ ],
+ },
+ ],
};
diff --git a/src/stories/Generic/Message.stories.tsx b/src/stories/Generic/Message.stories.tsx
new file mode 100644
index 000000000..b16c590b3
--- /dev/null
+++ b/src/stories/Generic/Message.stories.tsx
@@ -0,0 +1,23 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { Message } from '../../renderer/Generics/redesign/Message/Message';
+
+export default {
+ title: 'Generic/Message',
+ component: Message,
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Info = Template.bind({});
+Info.args = {
+ type: 'info',
+ title: 'Initial sync process started',
+ description:
+ 'When adding a node it first needs to catch up on the history of the network. This process downloads all the necessary data and might take a couple of days. After synchronization is complete your node will be online and part of the network.',
+ // onClick: () => {
+ // console.log('cancel');
+ // },
+};
diff --git a/src/stories/Generic/MetricTypes.stories.tsx b/src/stories/Generic/MetricTypes.stories.tsx
new file mode 100644
index 000000000..c9ebc0d3c
--- /dev/null
+++ b/src/stories/Generic/MetricTypes.stories.tsx
@@ -0,0 +1,28 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+import { SYNC_STATUS } from '../../renderer/Generics/redesign/consts';
+
+import { MetricTypes } from '../../renderer/Generics/redesign/MetricTypes/MetricTypes';
+
+export default {
+ title: 'Generic/MetricTypes',
+ component: MetricTypes,
+ argTypes: {
+ backgroundColor: { control: 'color' },
+ },
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Status = Template.bind({});
+Status.args = {
+ statsValue: SYNC_STATUS.SYNCHRONIZED,
+ statsType: 'status',
+};
+
+export const Stats = Template.bind({});
+Stats.args = {
+ statsValue: 100,
+ statsType: 'diskUsage',
+};
diff --git a/src/stories/Generic/ProgressBar.stories.tsx b/src/stories/Generic/ProgressBar.stories.tsx
index fc99aab4a..d409bcd7a 100644
--- a/src/stories/Generic/ProgressBar.stories.tsx
+++ b/src/stories/Generic/ProgressBar.stories.tsx
@@ -8,32 +8,43 @@ export default {
component: ProgressBar,
argTypes: {
progress: { control: 'number' },
- color: { control: 'color' }
+ color: { control: 'color' },
},
} as ComponentMeta;
-const Template: ComponentStory = (args) => ;
+const Template: ComponentStory = (args) => (
+
+);
export const Primary = Template.bind({});
Primary.args = {
- title: "A task is taking place...",
- caption: "Parent component controls the progress :)",
- progress: 23
+ title: 'A task is taking place...',
+ caption: 'Parent component controls the progress :)',
+ progress: 23,
};
-const TimedTemplate: ComponentStory = (args) => ;
+export const Card = Template.bind({});
+Card.args = {
+ card: true,
+ color: 'green',
+ progress: 23,
+ caption: 'Initial sync in progress. Around 2 days remaining...',
+};
+
+const TimedTemplate: ComponentStory = (args) => (
+
+);
export const TimedWithNoExtraProps = TimedTemplate.bind({});
TimedWithNoExtraProps.args = {
- title: "A one minute progress bar",
- totalTimeSeconds: 60
+ title: 'A one minute progress bar',
+ totalTimeSeconds: 60,
};
export const Timed = TimedTemplate.bind({});
Timed.args = {
- title: "A one minute progress bar",
- caption: "Sometimes we can only estimate only long something might take and we don't know intermediate progress.",
- totalTimeSeconds: 60
+ title: 'A one minute progress bar',
+ caption:
+ "Sometimes we can only estimate only long something might take and we don't know intermediate progress.",
+ totalTimeSeconds: 60,
};
-
-
diff --git a/src/stories/Generic/SidebarLinkItem.stories.tsx b/src/stories/Generic/SidebarLinkItem.stories.tsx
index 3eba13ae6..9e26dd4f1 100644
--- a/src/stories/Generic/SidebarLinkItem.stories.tsx
+++ b/src/stories/Generic/SidebarLinkItem.stories.tsx
@@ -1,6 +1,6 @@
import { ComponentStory, ComponentMeta } from '@storybook/react';
-import { SidebarLinkItem } from '../../renderer/Generics/redesign/SidebarLinkItem';
+import { SidebarLinkItem } from '../../renderer/Generics/redesign/SidebarLinkItem/SidebarLinkItem';
export default {
title: 'Generic/SidebarLinkItem',
diff --git a/src/stories/Generic/SidebarNodeItem.stories.tsx b/src/stories/Generic/SidebarNodeItem.stories.tsx
index e5ed37054..bfeefda25 100644
--- a/src/stories/Generic/SidebarNodeItem.stories.tsx
+++ b/src/stories/Generic/SidebarNodeItem.stories.tsx
@@ -1,6 +1,6 @@
import { ComponentStory, ComponentMeta } from '@storybook/react';
-import { SidebarNodeItem } from '../../renderer/Generics/redesign/SidebarNodeItem';
+import { SidebarNodeItem } from '../../renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem';
export default {
title: 'Generic/SidebarNodeItem',
diff --git a/src/stories/Generic/Stepper.stories.tsx b/src/stories/Generic/Stepper.stories.tsx
index de4e78195..c864d9bcd 100644
--- a/src/stories/Generic/Stepper.stories.tsx
+++ b/src/stories/Generic/Stepper.stories.tsx
@@ -1,19 +1,20 @@
import { ComponentStory, ComponentMeta } from '@storybook/react';
import Stepper from '../../renderer/Generics/redesign/Stepper/Stepper';
-import {Bubble} from '../../renderer/Generics/redesign/Bubble'
+import { Bubble } from '../../renderer/Generics/redesign/Bubble/Bubble';
export default {
title: 'Generic/Stepper',
component: Stepper,
- argTypes: {
- },
+ argTypes: {},
} as ComponentMeta;
-const Template: ComponentStory = (args) => ;
+const Template: ComponentStory = (args) => (
+
+);
export const Primary = Template.bind({});
Primary.args = {
onChange: (change) => window.alert(change),
- children:
-}
+ children: ,
+};
diff --git a/src/stories/Generic/Toggle.stories.tsx b/src/stories/Generic/Toggle.stories.tsx
index 645b4a3bf..d4a6f66f9 100644
--- a/src/stories/Generic/Toggle.stories.tsx
+++ b/src/stories/Generic/Toggle.stories.tsx
@@ -1,6 +1,6 @@
import { ComponentStory, ComponentMeta } from '@storybook/react';
-import { Toggle } from '../../renderer/Generics/redesign/Toggle';
+import { Toggle } from '../../renderer/Generics/redesign/Toggle/Toggle';
export default {
title: 'Generic/Toggle',
diff --git a/src/stories/Generic/UpdateCallout.stories.tsx b/src/stories/Generic/UpdateCallout.stories.tsx
new file mode 100644
index 000000000..38d604d9e
--- /dev/null
+++ b/src/stories/Generic/UpdateCallout.stories.tsx
@@ -0,0 +1,14 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import { UpdateCallout } from '../../renderer/Generics/redesign/UpdateCallout/UpdateCallout';
+
+export default {
+ title: 'Generic/UpdateCallout',
+ component: UpdateCallout,
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Single = Template.bind({});
diff --git a/src/stories/Presentational/ContentMultipleClients.stories.tsx b/src/stories/Presentational/ContentMultipleClients.stories.tsx
new file mode 100644
index 000000000..aa3ecd8cf
--- /dev/null
+++ b/src/stories/Presentational/ContentMultipleClients.stories.tsx
@@ -0,0 +1,16 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import ContentMultipleClients from '../../renderer/Presentational/ContentMultipleClients/ContentMultipleClients';
+
+export default {
+ title: 'Presentational/ContentMultipleClients',
+ component: ContentMultipleClients,
+ argTypes: {},
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Primary = Template.bind({});
+Primary.args = {};
diff --git a/src/stories/Presentational/ContentSingleClient.stories.tsx b/src/stories/Presentational/ContentSingleClient.stories.tsx
new file mode 100644
index 000000000..60470a9fc
--- /dev/null
+++ b/src/stories/Presentational/ContentSingleClient.stories.tsx
@@ -0,0 +1,16 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import ContentSingleClient from '../../renderer/Presentational/ContentSingleClient/ContentSingleClient';
+
+export default {
+ title: 'Presentational/ContentSingleClient',
+ component: ContentSingleClient,
+ argTypes: {},
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Primary = Template.bind({});
+Primary.args = {};
diff --git a/src/stories/Presentational/Sidebar.stories.tsx b/src/stories/Presentational/Sidebar.stories.tsx
new file mode 100644
index 000000000..921044b17
--- /dev/null
+++ b/src/stories/Presentational/Sidebar.stories.tsx
@@ -0,0 +1,16 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+
+import Sidebar from '../../renderer/Presentational/Sidebar/Sidebar';
+
+export default {
+ title: 'Presentational/Sidebar',
+ component: Sidebar,
+ argTypes: {},
+} as ComponentMeta;
+
+const Template: ComponentStory = (args) => (
+
+);
+
+export const Primary = Template.bind({});
+Primary.args = {};