From 837e0e904c40f7b87561c34ca3f49edd5d8d1c52 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Thu, 28 Sep 2023 18:03:43 +0200 Subject: feat(components): replace icons with a generic Icon component Sizes are also predefined and can be set using the `size` prop, so the consumers should no longer adjust the size in CSS. --- .../svg-paths/icons-paths/arrow-icon-paths.tsx | 51 ++++++++++++++ .../icons-paths/career-icon-paths.module.scss | 43 ++++++++++++ .../svg-paths/icons-paths/career-icon-paths.tsx | 57 +++++++++++++++ .../svg-paths/icons-paths/cc-by-sa-icon-paths.tsx | 20 ++++++ .../icons/svg-paths/icons-paths/cog-icon-paths.tsx | 14 ++++ .../icons-paths/computer-icon-paths.module.scss | 37 ++++++++++ .../svg-paths/icons-paths/computer-icon-paths.tsx | 65 +++++++++++++++++ .../icons-paths/cross-icon-paths.module.scss | 5 ++ .../svg-paths/icons-paths/cross-icon-paths.tsx | 21 ++++++ .../icons-paths/envelop-icon-paths.module.scss | 22 ++++++ .../svg-paths/icons-paths/envelop-icon-paths.tsx | 53 ++++++++++++++ .../svg-paths/icons-paths/feed-icon-paths.tsx | 59 ++++++++++++++++ .../icons-paths/home-icon-paths.module.scss | 25 +++++++ .../svg-paths/icons-paths/home-icon-paths.tsx | 41 +++++++++++ .../images/icons/svg-paths/icons-paths/index.ts | 13 ++++ .../magnifying-glass-icon-paths.module.scss | 20 ++++++ .../icons-paths/magnifying-glass-icon-paths.tsx | 29 ++++++++ .../svg-paths/icons-paths/moon-icon-paths.tsx | 11 +++ .../icons-paths/posts-stack-icon-paths.module.scss | 21 ++++++ .../icons-paths/posts-stack-icon-paths.tsx | 49 +++++++++++++ .../icons/svg-paths/icons-paths/sun-icon-paths.tsx | 11 +++ .../atoms/images/icons/svg-paths/index.ts | 1 + .../atoms/images/icons/svg-paths/svg-paths.tsx | 82 ++++++++++++++++++++++ 23 files changed, 750 insertions(+) create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/arrow-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/cc-by-sa-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/cog-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/feed-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/index.ts create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/moon-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.module.scss create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/icons-paths/sun-icon-paths.tsx create mode 100644 src/components/atoms/images/icons/svg-paths/index.ts create mode 100644 src/components/atoms/images/icons/svg-paths/svg-paths.tsx (limited to 'src/components/atoms/images/icons/svg-paths') diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/arrow-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/arrow-icon-paths.tsx new file mode 100644 index 0000000..ee29d5d --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/arrow-icon-paths.tsx @@ -0,0 +1,51 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; + +export type ArrowOrientation = 'top' | 'right' | 'bottom' | 'left'; + +const getArrowBarPathFrom = (orientation: ArrowOrientation) => { + switch (orientation) { + case 'bottom': + return 'm 55.749998,2e-6 v 61.764896 h -11.5 V 2e-6 Z'; + case 'left': + return 'M 99.999996,44.25 H 38.2351 v 11.5 h 61.764896 z'; + case 'right': + return 'm 0,44.25 h 61.764896 v 11.5 H 0 Z'; + case 'top': + default: + return 'M 55.749998,99.999998 V 38.235102 h -11.5 v 61.764896 z'; + } +}; + +const getArrowHeadPathFrom = (orientation: ArrowOrientation) => { + switch (orientation) { + case 'bottom': + return 'm 69.999998,61.764898 -20,38.2351 -20,-38.2351 z'; + case 'left': + return 'M 38.2351,30 0,50 38.2351,70 Z'; + case 'right': + return 'm 61.764896,30 38.2351,20 -38.2351,20 z'; + case 'top': + default: + return 'm 69.999998,38.235102 -20,-38.2351 -20,38.2351 z'; + } +}; + +export type ArrowProps = { + /** + * The arrow orientation. + */ + orientation: ArrowOrientation; +}; + +/** + * ArrowIconPaths + * + * Render the svg paths to make an arrow icon. + */ +export const ArrowIconPaths: FC = ({ orientation }) => ( + <> + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.module.scss new file mode 100644 index 0000000..f93e73a --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.module.scss @@ -0,0 +1,43 @@ +.bottom, +.diploma, +.lines, +.top { + stroke-width: 4; +} + +.bottom, +.diploma, +.handle, +.lock, +.seal, +.top { + stroke: var(--color-primary-darker); +} + +.bottom { + fill: var(--color-primary); +} + +.diploma, +.lock { + fill: var(--color-bg); +} + +.handle, +.seal, +.top { + fill: var(--color-primary-lighter); +} + +.handle, +.lock { + stroke-width: 3; +} + +.lines { + fill: var(--color-fg); +} + +.seal { + stroke-width: 2; +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.tsx new file mode 100644 index 0000000..8fbaa12 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/career-icon-paths.tsx @@ -0,0 +1,57 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './career-icon-paths.module.scss'; + +/** + * CareerIconPaths + * + * Render the svg paths to make a career icon. + */ +export const CareerIconPaths: FC = () => ( + <> + + + + + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/cc-by-sa-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/cc-by-sa-icon-paths.tsx new file mode 100644 index 0000000..5961d92 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/cc-by-sa-icon-paths.tsx @@ -0,0 +1,20 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; + +/** + * CCBySAIconPaths + * + * Render the svg paths to make a CC-BY-SA icon. + */ +export const CCBySAIconPaths: FC = () => ( + <> + + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/cog-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/cog-icon-paths.tsx new file mode 100644 index 0000000..1ff9e3c --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/cog-icon-paths.tsx @@ -0,0 +1,14 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; + +/** + * CogIconPaths component + * + * Render the svg paths to make a cog icon. + */ +export const CogIconPaths: FC = () => ( + <> + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.module.scss new file mode 100644 index 0000000..479b8b7 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.module.scss @@ -0,0 +1,37 @@ +.cursor, +.lines, +.root, +.separator, +.text { + fill: var(--color-fg); +} + +.contour, +.stand, +.screen { + stroke: var(--color-primary-dark); +} + +.contour, +.screen { + stroke-width: 3; +} + +.contour, +.stand { + fill: var(--color-primary-lighter); +} + +.screen { + fill: var(--color-bg); +} + +.stand { + &--top { + stroke-width: 3; + } + + &--bottom { + stroke-width: 2; + } +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.tsx new file mode 100644 index 0000000..f581332 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/computer-icon-paths.tsx @@ -0,0 +1,65 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './computer-icon-paths.module.scss'; + +/** + * ComputerIconPaths + * + * Render the svg paths to make a computer icon. + */ +export const ComputerIconPaths: FC = () => ( + <> + + + + + + + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.module.scss new file mode 100644 index 0000000..b30fea9 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.module.scss @@ -0,0 +1,5 @@ +.lines { + fill: var(--color-primary-lighter); + stroke: var(--color-primary-darker); + stroke-width: 3; +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.tsx new file mode 100644 index 0000000..12740af --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/cross-icon-paths.tsx @@ -0,0 +1,21 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './cross-icon-paths.module.scss'; + +/** + * CrossIconPaths + * + * Render the svg paths to make a cross icon. + */ +export const CrossIconPaths: FC = () => ( + <> + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.module.scss new file mode 100644 index 0000000..0819bba --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.module.scss @@ -0,0 +1,22 @@ +.bg, +.envelop, +.paper { + stroke: var(--color-primary-darker); + stroke-width: 4; +} + +.bg { + fill: var(--color-shadow-dark); +} + +.envelop { + fill: var(--color-primary-lighter); +} + +.lines { + fill: var(--color-fg); +} + +.paper { + fill: var(--color-bg); +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.tsx new file mode 100644 index 0000000..9e23991 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/envelop-icon-paths.tsx @@ -0,0 +1,53 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './envelop-icon-paths.module.scss'; + +/** + * EnvelopIconPaths + * + * Render the svg paths to make an envelop icon. + */ +export const EnvelopIconPaths: FC = () => ( + <> + + + + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/feed-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/feed-icon-paths.tsx new file mode 100644 index 0000000..922bf8a --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/feed-icon-paths.tsx @@ -0,0 +1,59 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; + +/** + * FeedIconPaths + * + * Render the svg paths to make a feed icon. + */ +export const FeedIconPaths: FC = () => ( + <> + + + + + + + + + + + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.module.scss new file mode 100644 index 0000000..a8d775c --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.module.scss @@ -0,0 +1,25 @@ +.chimney, +.door, +.indoor, +.roof, +.wall { + stroke: var(--color-primary-darker); +} + +.door, +.roof { + fill: var(--color-primary-lighter); +} + +.indoor { + fill: var(--color-shadow-dark); +} + +.chimney, +.wall { + fill: var(--color-bg); +} + +.lines { + fill: var(--color-primary-darker); +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.tsx new file mode 100644 index 0000000..d472445 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/home-icon-paths.tsx @@ -0,0 +1,41 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './home-icon-paths.module.scss'; + +/** + * HomeIconPaths + * + * Render the svg paths to make a home icon. + */ +export const HomeIconPaths: FC = () => ( + <> + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/index.ts b/src/components/atoms/images/icons/svg-paths/icons-paths/index.ts new file mode 100644 index 0000000..43927ae --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/index.ts @@ -0,0 +1,13 @@ +export * from './arrow-icon-paths'; +export * from './career-icon-paths'; +export * from './cc-by-sa-icon-paths'; +export * from './cog-icon-paths'; +export * from './computer-icon-paths'; +export * from './cross-icon-paths'; +export * from './envelop-icon-paths'; +export * from './feed-icon-paths'; +export * from './home-icon-paths'; +export * from './magnifying-glass-icon-paths'; +export * from './moon-icon-paths'; +export * from './posts-stack-icon-paths'; +export * from './sun-icon-paths'; diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.module.scss new file mode 100644 index 0000000..4b7db05 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.module.scss @@ -0,0 +1,20 @@ +.big-handle, +.upright { + fill: var(--color-primary-lighter); + stroke: var(--color-primary-darker); + stroke-width: 3; +} + +.glass, +.small-handle { + stroke: var(--color-primary-darker); + stroke-width: 2; +} + +.glass { + fill: var(--color-bg-opacity); +} + +.small-handle { + fill: var(--color-primary); +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.tsx new file mode 100644 index 0000000..b800305 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/magnifying-glass-icon-paths.tsx @@ -0,0 +1,29 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './magnifying-glass-icon-paths.module.scss'; + +/** + * MagnifyingGlassIconPaths + * + * Render the svg paths to make a magnifying glass icon. + */ +export const MagnifyingGlassIconPaths: FC = () => ( + <> + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/moon-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/moon-icon-paths.tsx new file mode 100644 index 0000000..35025ef --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/moon-icon-paths.tsx @@ -0,0 +1,11 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; + +/** + * MoonIconPaths + * + * Render the svg paths to make a moon icon. + */ +export const MoonIconPaths: FC = () => ( + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.module.scss b/src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.module.scss new file mode 100644 index 0000000..f368493 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.module.scss @@ -0,0 +1,21 @@ +.bg, +.lines { + stroke-width: 4; +} + +.bg, +.picture { + stroke: var(--color-primary-darker); +} + +.bg { + fill: var(--color-bg); +} + +.lines { + fill: var(--color-fg); +} + +.picture { + fill: var(--color-primary-lighter); +} diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.tsx new file mode 100644 index 0000000..daf14d4 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/posts-stack-icon-paths.tsx @@ -0,0 +1,49 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; +import styles from './posts-stack-icon-paths.module.scss'; + +/** + * PostsStackIconPaths + * + * Render the svg paths to make a posts stack icon. + */ +export const PostsStackIconPaths: FC = () => ( + <> + + + + + + + + + + + + + +); diff --git a/src/components/atoms/images/icons/svg-paths/icons-paths/sun-icon-paths.tsx b/src/components/atoms/images/icons/svg-paths/icons-paths/sun-icon-paths.tsx new file mode 100644 index 0000000..0cdffb3 --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/icons-paths/sun-icon-paths.tsx @@ -0,0 +1,11 @@ +/* eslint-disable react/jsx-no-literals */ +import type { FC } from 'react'; + +/** + * SunIconPaths + * + * Render the svg paths to make a sun icon. + */ +export const SunIconPaths: FC = () => ( + +); diff --git a/src/components/atoms/images/icons/svg-paths/index.ts b/src/components/atoms/images/icons/svg-paths/index.ts new file mode 100644 index 0000000..01623ef --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/index.ts @@ -0,0 +1 @@ +export * from './svg-paths'; diff --git a/src/components/atoms/images/icons/svg-paths/svg-paths.tsx b/src/components/atoms/images/icons/svg-paths/svg-paths.tsx new file mode 100644 index 0000000..0f5be6e --- /dev/null +++ b/src/components/atoms/images/icons/svg-paths/svg-paths.tsx @@ -0,0 +1,82 @@ +import type { FC } from 'react'; +import { + ArrowIconPaths, + type ArrowOrientation, + CCBySAIconPaths, + CareerIconPaths, + CogIconPaths, + ComputerIconPaths, + EnvelopIconPaths, + FeedIconPaths, + HomeIconPaths, + MagnifyingGlassIconPaths, + MoonIconPaths, + PostsStackIconPaths, + SunIconPaths, + CrossIconPaths, +} from './icons-paths'; + +export type SVGIconOrientation = ArrowOrientation; + +export type SVGIconShape = + | 'arrow' + | 'career' + | 'cc-by-sa' + | 'cog' + | 'computer' + | 'cross' + | 'envelop' + | 'feed' + | 'home' + | 'magnifying-glass' + | 'moon' + | 'posts-stack' + | 'sun'; + +export type SVGPathsProps = { + /** + * The icon orientation. Only used with arrow icon. + * + * @default 'right' + */ + orientation?: SVGIconOrientation; + /** + * The icon shape. + */ + shape: SVGIconShape; +}; + +export const SVGPaths: FC = ({ + orientation = 'right', + shape, +}) => { + switch (shape) { + case 'arrow': + return ; + case 'career': + return ; + case 'cc-by-sa': + return ; + case 'cog': + return ; + case 'computer': + return ; + case 'cross': + return ; + case 'envelop': + return ; + case 'feed': + return ; + case 'home': + return ; + case 'magnifying-glass': + return ; + case 'moon': + return ; + case 'posts-stack': + return ; + case 'sun': + default: + return ; + } +}; -- cgit v1.2.3