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. --- src/assets/images/cc-by-sa.svg | 56 +++--- src/assets/images/icon-arrow-right.svg | 33 ++-- src/assets/images/icon-feed.svg | 92 ++++++++-- src/components/atoms/icons/arrow.module.scss | 16 -- src/components/atoms/icons/arrow.stories.tsx | 61 ------- src/components/atoms/icons/arrow.test.tsx | 10 - src/components/atoms/icons/arrow.tsx | 103 ----------- src/components/atoms/icons/career.module.scss | 53 ------ src/components/atoms/icons/career.stories.tsx | 47 ----- src/components/atoms/icons/career.test.tsx | 10 - src/components/atoms/icons/career.tsx | 65 ------- src/components/atoms/icons/cc-by-sa.module.scss | 7 - src/components/atoms/icons/cc-by-sa.stories.tsx | 34 ---- src/components/atoms/icons/cc-by-sa.test.tsx | 10 - src/components/atoms/icons/cc-by-sa.tsx | 39 ---- src/components/atoms/icons/close.module.scss | 12 -- src/components/atoms/icons/close.stories.tsx | 47 ----- src/components/atoms/icons/close.test.tsx | 10 - src/components/atoms/icons/close.tsx | 29 --- src/components/atoms/icons/cog.module.scss | 8 - src/components/atoms/icons/cog.stories.tsx | 47 ----- src/components/atoms/icons/cog.test.tsx | 10 - src/components/atoms/icons/cog.tsx | 23 --- .../atoms/icons/computer-screen.module.scss | 39 ---- .../atoms/icons/computer-screen.stories.tsx | 47 ----- .../atoms/icons/computer-screen.test.tsx | 10 - src/components/atoms/icons/computer-screen.tsx | 76 -------- src/components/atoms/icons/envelop.module.scss | 28 --- src/components/atoms/icons/envelop.stories.tsx | 47 ----- src/components/atoms/icons/envelop.test.tsx | 10 - src/components/atoms/icons/envelop.tsx | 61 ------- src/components/atoms/icons/feed.module.scss | 6 - src/components/atoms/icons/feed.stories.tsx | 47 ----- src/components/atoms/icons/feed.test.tsx | 10 - src/components/atoms/icons/feed.tsx | 68 ------- src/components/atoms/icons/hamburger.module.scss | 42 ----- src/components/atoms/icons/hamburger.stories.tsx | 47 ----- src/components/atoms/icons/hamburger.test.tsx | 10 - src/components/atoms/icons/hamburger.tsx | 29 --- src/components/atoms/icons/home.module.scss | 41 ----- src/components/atoms/icons/home.stories.tsx | 47 ----- src/components/atoms/icons/home.test.tsx | 10 - src/components/atoms/icons/home.tsx | 49 ----- src/components/atoms/icons/index.ts | 15 -- .../atoms/icons/magnifying-glass.module.scss | 29 --- .../atoms/icons/magnifying-glass.stories.tsx | 47 ----- .../atoms/icons/magnifying-glass.test.tsx | 10 - src/components/atoms/icons/magnifying-glass.tsx | 40 ---- src/components/atoms/icons/moon.module.scss | 8 - src/components/atoms/icons/moon.stories.tsx | 60 ------ src/components/atoms/icons/moon.test.tsx | 10 - src/components/atoms/icons/moon.tsx | 23 --- src/components/atoms/icons/plus-minus.module.scss | 39 ---- src/components/atoms/icons/plus-minus.stories.tsx | 49 ----- src/components/atoms/icons/plus-minus.test.tsx | 10 - src/components/atoms/icons/plus-minus.tsx | 29 --- src/components/atoms/icons/posts-stack.module.scss | 22 --- src/components/atoms/icons/posts-stack.stories.tsx | 47 ----- src/components/atoms/icons/posts-stack.test.tsx | 10 - src/components/atoms/icons/posts-stack.tsx | 72 -------- src/components/atoms/icons/sun.module.scss | 8 - src/components/atoms/icons/sun.stories.tsx | 60 ------ src/components/atoms/icons/sun.test.tsx | 10 - src/components/atoms/icons/sun.tsx | 28 --- .../hamburger-icon/hamburger-icon.module.scss | 45 +++++ .../images/icons/hamburger-icon/hamburger-icon.tsx | 25 +++ .../atoms/images/icons/hamburger-icon/index.ts | 1 + src/components/atoms/images/icons/icon.module.scss | 53 ++++++ src/components/atoms/images/icons/icon.stories.tsx | 201 +++++++++++++++++++++ src/components/atoms/images/icons/icon.test.tsx | 182 +++++++++++++++++++ src/components/atoms/images/icons/icon.tsx | 126 +++++++++++++ src/components/atoms/images/icons/index.ts | 1 + .../atoms/images/icons/plus-minus-icon/index.ts | 1 + .../plus-minus-icon/plus-minus-icon.module.scss | 38 ++++ .../icons/plus-minus-icon/plus-minus-icon.tsx | 30 +++ .../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 +++++++++ src/components/atoms/images/index.ts | 1 + src/components/atoms/index.ts | 1 - src/components/atoms/layout/copyright.module.scss | 2 - src/components/atoms/layout/copyright.stories.tsx | 6 +- src/components/atoms/layout/copyright.test.tsx | 15 +- src/components/atoms/links/nav-link.module.scss | 1 - .../molecules/buttons/back-to-top.module.scss | 6 +- src/components/molecules/buttons/back-to-top.tsx | 6 +- .../molecules/buttons/heading-button.tsx | 4 +- .../flipping-label/flipping-label.module.scss | 2 - .../flipping-label/flipping-label.stories.tsx | 17 +- .../forms/flipping-label/flipping-label.tsx | 6 +- src/components/molecules/nav/nav-list.stories.tsx | 11 +- src/components/molecules/nav/nav-list.test.tsx | 11 +- .../prism-theme-toggle/prism-theme-toggle.tsx | 23 ++- .../organisms/forms/search-form/search-form.tsx | 28 +-- .../organisms/forms/theme-toggle/theme-toggle.tsx | 23 ++- .../organisms/layout/summary.module.scss | 5 +- src/components/organisms/layout/summary.tsx | 8 +- .../organisms/modals/settings-modal.module.scss | 2 - src/components/organisms/modals/settings-modal.tsx | 14 +- src/components/organisms/toolbar/main-nav.tsx | 9 +- src/components/organisms/toolbar/search.tsx | 10 +- src/components/organisms/toolbar/settings.tsx | 6 +- src/components/templates/layout/layout.tsx | 29 ++- src/i18n/en.json | 8 +- src/i18n/fr.json | 8 +- src/pages/index.tsx | 8 +- src/styles/abstracts/_variables.scss | 37 ++++ src/styles/base/_icons.scss | 10 + src/styles/globals.scss | 1 + src/styles/pages/home.module.scss | 2 - 130 files changed, 1766 insertions(+), 2179 deletions(-) delete mode 100644 src/components/atoms/icons/arrow.module.scss delete mode 100644 src/components/atoms/icons/arrow.stories.tsx delete mode 100644 src/components/atoms/icons/arrow.test.tsx delete mode 100644 src/components/atoms/icons/arrow.tsx delete mode 100644 src/components/atoms/icons/career.module.scss delete mode 100644 src/components/atoms/icons/career.stories.tsx delete mode 100644 src/components/atoms/icons/career.test.tsx delete mode 100644 src/components/atoms/icons/career.tsx delete mode 100644 src/components/atoms/icons/cc-by-sa.module.scss delete mode 100644 src/components/atoms/icons/cc-by-sa.stories.tsx delete mode 100644 src/components/atoms/icons/cc-by-sa.test.tsx delete mode 100644 src/components/atoms/icons/cc-by-sa.tsx delete mode 100644 src/components/atoms/icons/close.module.scss delete mode 100644 src/components/atoms/icons/close.stories.tsx delete mode 100644 src/components/atoms/icons/close.test.tsx delete mode 100644 src/components/atoms/icons/close.tsx delete mode 100644 src/components/atoms/icons/cog.module.scss delete mode 100644 src/components/atoms/icons/cog.stories.tsx delete mode 100644 src/components/atoms/icons/cog.test.tsx delete mode 100644 src/components/atoms/icons/cog.tsx delete mode 100644 src/components/atoms/icons/computer-screen.module.scss delete mode 100644 src/components/atoms/icons/computer-screen.stories.tsx delete mode 100644 src/components/atoms/icons/computer-screen.test.tsx delete mode 100644 src/components/atoms/icons/computer-screen.tsx delete mode 100644 src/components/atoms/icons/envelop.module.scss delete mode 100644 src/components/atoms/icons/envelop.stories.tsx delete mode 100644 src/components/atoms/icons/envelop.test.tsx delete mode 100644 src/components/atoms/icons/envelop.tsx delete mode 100644 src/components/atoms/icons/feed.module.scss delete mode 100644 src/components/atoms/icons/feed.stories.tsx delete mode 100644 src/components/atoms/icons/feed.test.tsx delete mode 100644 src/components/atoms/icons/feed.tsx delete mode 100644 src/components/atoms/icons/hamburger.module.scss delete mode 100644 src/components/atoms/icons/hamburger.stories.tsx delete mode 100644 src/components/atoms/icons/hamburger.test.tsx delete mode 100644 src/components/atoms/icons/hamburger.tsx delete mode 100644 src/components/atoms/icons/home.module.scss delete mode 100644 src/components/atoms/icons/home.stories.tsx delete mode 100644 src/components/atoms/icons/home.test.tsx delete mode 100644 src/components/atoms/icons/home.tsx delete mode 100644 src/components/atoms/icons/index.ts delete mode 100644 src/components/atoms/icons/magnifying-glass.module.scss delete mode 100644 src/components/atoms/icons/magnifying-glass.stories.tsx delete mode 100644 src/components/atoms/icons/magnifying-glass.test.tsx delete mode 100644 src/components/atoms/icons/magnifying-glass.tsx delete mode 100644 src/components/atoms/icons/moon.module.scss delete mode 100644 src/components/atoms/icons/moon.stories.tsx delete mode 100644 src/components/atoms/icons/moon.test.tsx delete mode 100644 src/components/atoms/icons/moon.tsx delete mode 100644 src/components/atoms/icons/plus-minus.module.scss delete mode 100644 src/components/atoms/icons/plus-minus.stories.tsx delete mode 100644 src/components/atoms/icons/plus-minus.test.tsx delete mode 100644 src/components/atoms/icons/plus-minus.tsx delete mode 100644 src/components/atoms/icons/posts-stack.module.scss delete mode 100644 src/components/atoms/icons/posts-stack.stories.tsx delete mode 100644 src/components/atoms/icons/posts-stack.test.tsx delete mode 100644 src/components/atoms/icons/posts-stack.tsx delete mode 100644 src/components/atoms/icons/sun.module.scss delete mode 100644 src/components/atoms/icons/sun.stories.tsx delete mode 100644 src/components/atoms/icons/sun.test.tsx delete mode 100644 src/components/atoms/icons/sun.tsx create mode 100644 src/components/atoms/images/icons/hamburger-icon/hamburger-icon.module.scss create mode 100644 src/components/atoms/images/icons/hamburger-icon/hamburger-icon.tsx create mode 100644 src/components/atoms/images/icons/hamburger-icon/index.ts create mode 100644 src/components/atoms/images/icons/icon.module.scss create mode 100644 src/components/atoms/images/icons/icon.stories.tsx create mode 100644 src/components/atoms/images/icons/icon.test.tsx create mode 100644 src/components/atoms/images/icons/icon.tsx create mode 100644 src/components/atoms/images/icons/index.ts create mode 100644 src/components/atoms/images/icons/plus-minus-icon/index.ts create mode 100644 src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.module.scss create mode 100644 src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.tsx 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 create mode 100644 src/styles/base/_icons.scss (limited to 'src') diff --git a/src/assets/images/cc-by-sa.svg b/src/assets/images/cc-by-sa.svg index b1fc892..949002c 100644 --- a/src/assets/images/cc-by-sa.svg +++ b/src/assets/images/cc-by-sa.svg @@ -1,11 +1,11 @@ + units="px" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> @@ -53,27 +55,35 @@ + d="m 82.802205,12.372338 c 0,-1.418881 0.700478,-2.129264 2.102849,-2.129264 1.402371,0 2.102377,0.70944 2.102377,2.129264 0,1.401427 -0.700949,2.102377 -2.102377,2.102377 -1.401427,0 -2.102849,-0.70095 -2.102849,-2.102377 z" + id="path839" + style="stroke-width:0.471702" /> + d="m 88.975373,16.253505 v 6.172224 H 87.25083 v 7.331198 h -4.690608 v -7.330726 h -1.724544 v -6.172696 c 0,-0.269814 0.09434,-0.49859 0.28255,-0.687271 0.189153,-0.188209 0.4184,-0.283021 0.68727,-0.283021 h 6.200055 c 0.251418,0 0.47642,0.09434 0.673591,0.283021 0.1967,0.188681 0.296229,0.417929 0.296229,0.687271 z" + id="path837" + style="stroke-width:0.471702" /> + d="m 84.878809,4.905526 c -4.169377,0 -7.708404,1.455113 -10.619751,4.366932 C 71.294409,12.291353 69.811052,15.867416 69.811052,20 c 0,4.133056 1.483357,7.681348 4.448006,10.646469 3.000499,2.965121 6.539997,4.448005 10.619751,4.448005 4.150508,0 7.752951,-1.50092 10.807695,-4.502361 C 98.562001,27.771333 100,24.241076 100,20 100,15.777321 98.534676,12.201729 95.606348,9.272458 92.695001,6.361111 89.118469,4.905526 84.878809,4.905526 Z m 0.05343,2.722423 c 3.414181,0 6.325372,1.203902 8.732941,3.61147 2.407097,2.408512 3.611471,5.327554 3.611471,8.75966 0,3.486352 -1.185846,6.370694 -3.558036,8.652789 -2.497664,2.462758 -5.427365,3.692545 -8.787296,3.692545 -3.378332,0 -6.289056,-1.221465 -8.732946,-3.665827 -2.443418,-2.442475 -3.664905,-5.335182 -3.664905,-8.677665 0,-3.324086 1.230261,-6.24452 3.692547,-8.76058 2.372191,-2.407569 5.274118,-3.612392 8.706224,-3.612392 z" + style="stroke-width:0.471702" /> + d="m 43.395931,17.695499 c 0.287267,-1.85096 1.032557,-3.283992 2.236813,-4.299095 1.203784,-1.015104 2.667946,-1.522656 4.393433,-1.522656 2.371248,0 4.259,0.764158 5.660428,2.290587 1.401428,1.527372 2.102377,3.486352 2.102377,5.875996 0,2.318417 -0.727837,4.245321 -2.182566,5.781183 -1.456617,1.535863 -3.342483,2.304738 -5.661372,2.304738 -1.70709,0 -3.180687,-0.511797 -4.42032,-1.536335 -1.240106,-1.024537 -1.985395,-2.479739 -2.237284,-4.366548 h 3.801449 c 0.08962,1.833035 1.19482,2.749553 3.315593,2.749553 1.059444,0 1.913697,-0.458495 2.560401,-1.374541 0.647647,-0.916046 0.971235,-2.138698 0.971235,-3.665598 0,-1.599543 -0.296701,-2.816535 -0.889159,-3.652391 -0.593402,-0.835385 -1.44624,-1.253313 -2.561344,-1.253313 -2.013225,0 -3.144839,0.889158 -3.396255,2.667948 h 1.105197 l -2.991534,2.992008 -2.992008,-2.992008 z" + id="path837-7" + style="stroke-width:0.471702" /> + d="m 49.97328,4.905526 c -4.150978,0 -7.690953,1.464827 -10.619748,4.39457 -2.964649,3.018895 -4.448007,6.586166 -4.448007,10.700825 0,4.133528 1.483358,7.680899 4.448007,10.645548 3.000498,2.965121 6.539997,4.448005 10.619748,4.448005 4.167962,0 7.771348,-1.491677 10.807696,-4.474722 C 63.656473,27.762651 65.094472,24.223623 65.094472,20 c 0,-4.222679 -1.465325,-7.789478 -4.393653,-10.700825 C 57.771076,6.369904 54.195488,4.905526 49.97328,4.905526 Z m 0.05344,2.722423 c 3.431634,0 6.342825,1.212201 8.732941,3.639109 2.407097,2.371719 3.611471,5.283383 3.611471,8.732942 0,3.468427 -1.185846,6.352769 -3.558037,8.65279 -2.497663,2.461814 -5.427364,3.692544 -8.787295,3.692544 -3.37833,0 -6.289054,-1.221465 -8.732944,-3.665827 C 38.849433,26.253542 37.627946,23.360879 37.627946,20 c 0,-3.323614 1.230261,-6.234806 3.692547,-8.732942 2.372191,-2.425965 5.274118,-3.639109 8.706222,-3.639109 z" + style="stroke-width:0.471702" /> + d="m 15.067296,4.905527 c -4.186958,0 -7.7182442,1.465367 -10.5933571,4.393783 C 3.0186925,10.755028 1.9089114,12.403834 1.1452027,14.245887 0.38149397,16.087941 0,18.005571 0,20.000462 c 0,2.012815 0.37755761,3.926511 1.132304,5.741678 0.7547477,1.815163 1.8552632,3.445936 3.3020181,4.892218 1.4467549,1.446282 3.0823798,2.551679 4.9060381,3.314917 1.8241278,0.764653 3.7334388,1.145198 5.7278558,1.145198 1.994419,0 3.926643,-0.385427 5.795113,-1.158099 1.869418,-0.772672 3.540664,-1.88823 5.013832,-3.343474 1.418928,-1.383545 2.493084,-2.978691 3.220944,-4.784424 0.726912,-1.805262 1.090845,-3.741421 1.090845,-5.808014 0,-2.048665 -0.369235,-3.984805 -1.105586,-5.808934 -0.736822,-1.823656 -1.814917,-3.446104 -3.23384,-4.8655 C 22.884786,6.379214 19.289631,4.905527 15.067296,4.905527 Z m 0.05436,2.722507 c 3.414285,0 6.334316,1.213182 8.761767,3.63922 1.167029,1.168914 2.056377,2.498676 2.666307,3.990245 0.610873,1.491566 0.916715,3.072594 0.916715,4.743882 0,3.469008 -1.176637,6.352963 -3.530503,8.653059 -1.22269,1.185892 -2.591561,2.092759 -4.110018,2.722505 -1.520343,0.62927 -3.087225,0.942508 -4.704268,0.942508 -1.635442,0 -3.199353,-0.309776 -4.690448,-0.929612 C 8.9386948,30.769062 7.6010602,29.87146 6.4151652,28.694053 5.2287976,27.517123 4.317072,26.178564 3.6788394,24.677093 3.0401347,23.177504 2.7215865,21.618901 2.7215865,20.001381 c 0,-1.635439 0.3185482,-3.203736 0.9572529,-4.704263 C 4.3166012,13.796585 5.2287976,12.444829 6.4151652,11.240537 8.7695027,8.832893 11.671519,7.628034 15.121655,7.628034 Z" + style="stroke-width:0.471702" /> + d="m 23.639141,17.494232 -1.99489,1.051457 C 21.428674,18.097086 21.1631,17.78198 20.848937,17.602256 c -0.315106,-0.179251 -0.616534,-0.269351 -0.902866,-0.269351 -1.347696,0 -2.022249,0.889187 -2.022249,2.6685 0,0.808526 0.171228,1.454777 0.512282,1.940173 0.341051,0.485396 0.843904,0.728332 1.509967,0.728332 0.879753,0 1.50006,-0.431622 1.859035,-1.293922 l 1.886866,0.943438 c -0.412749,0.737289 -0.97032,1.316559 -1.67035,1.738746 -0.700968,0.422655 -1.464678,0.633515 -2.291129,0.633515 -1.366087,0 -2.457168,-0.412753 -3.274184,-1.240143 -0.818899,-0.826446 -1.227403,-1.976494 -1.227403,-3.449667 0,-1.437791 0.417466,-2.578401 1.253823,-3.423248 0.834936,-0.844371 1.890639,-1.26703 3.166632,-1.26703 1.868941,-9.43e-4 3.199655,0.726917 3.98978,2.182633 z" + id="path846" + style="stroke-width:0.471702" /> + d="m 14.932663,17.494232 -2.022248,1.051457 c -0.216046,-0.448603 -0.480679,-0.763709 -0.794841,-0.943433 -0.314637,-0.179251 -0.606629,-0.269351 -0.87645,-0.269351 -1.3472231,0 -2.0217777,0.889187 -2.0217777,2.6685 0,0.808526 0.1707629,1.454777 0.5118107,1.940173 0.341524,0.485396 0.844845,0.728332 1.509967,0.728332 0.880695,0 1.50053,-0.431622 1.860449,-1.293922 l 1.85951,0.943438 c -0.395301,0.737289 -0.943435,1.316559 -1.644407,1.738746 -0.700026,0.422655 -1.47317,0.633515 -2.318015,0.633515 -1.3476953,0 -2.4354738,-0.412753 -3.2619218,-1.240143 -0.8264474,-0.826446 -1.2396714,-1.976494 -1.2396714,-3.449667 0,-1.437791 0.4179415,-2.578401 1.2533513,-3.423248 0.8354103,-0.844371 1.8911135,-1.26703 3.1675779,-1.26703 1.869414,-9.43e-4 3.207674,0.726917 4.016666,2.182633 z" + id="path844" + style="stroke-width:0.471702" /> diff --git a/src/assets/images/icon-arrow-right.svg b/src/assets/images/icon-arrow-right.svg index 5ddb0b4..268203f 100644 --- a/src/assets/images/icon-arrow-right.svg +++ b/src/assets/images/icon-arrow-right.svg @@ -1,12 +1,12 @@ + fit-margin-bottom="0" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> + id="rect1" + style="stroke-width:1.02839" + d="m 0,44.25 h 61.764896 v 11.5 H 0 Z" /> diff --git a/src/assets/images/icon-feed.svg b/src/assets/images/icon-feed.svg index fcdac1f..6bf17fb 100644 --- a/src/assets/images/icon-feed.svg +++ b/src/assets/images/icon-feed.svg @@ -1,18 +1,76 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/atoms/icons/arrow.module.scss b/src/components/atoms/icons/arrow.module.scss deleted file mode 100644 index 6ee3364..0000000 --- a/src/components/atoms/icons/arrow.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - fill: var(--color-primary); - transition: all 0.25s ease-in-out 0s; - - &--left, - &--right { - width: var(--icon-size, #{fun.convert-px(30)}); - } - - &--bottom, - &--top { - height: var(--icon-size, #{fun.convert-px(30)}); - } -} diff --git a/src/components/atoms/icons/arrow.stories.tsx b/src/components/atoms/icons/arrow.stories.tsx deleted file mode 100644 index a49be55..0000000 --- a/src/components/atoms/icons/arrow.stories.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Arrow as ArrowIcon } from './arrow'; - -/** - * Arrow icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: ArrowIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - direction: { - control: { - type: 'select', - }, - description: 'An arrow icon.', - options: ['bottom', 'left', 'right', 'top'], - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Arrow - */ -export const Arrow = Template.bind({}); -Arrow.args = { - direction: 'right', -}; diff --git a/src/components/atoms/icons/arrow.test.tsx b/src/components/atoms/icons/arrow.test.tsx deleted file mode 100644 index 3fedf9b..0000000 --- a/src/components/atoms/icons/arrow.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Arrow } from './arrow'; - -describe('Arrow', () => { - it('renders an arrow icon oriented to the right', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/arrow.tsx b/src/components/atoms/icons/arrow.tsx deleted file mode 100644 index 2ef0185..0000000 --- a/src/components/atoms/icons/arrow.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './arrow.module.scss'; - -export type ArrowDirection = 'top' | 'right' | 'bottom' | 'left'; - -export type ArrowProps = SVGAttributes & { - /** - * The arrow direction. Default: right. - */ - direction: ArrowDirection; -}; - -/** - * Arrow component - * - * Render a svg arrow icon. - */ -export const Arrow: FC = ({ - className = '', - direction, - ...props -}) => { - const directionClass = styles[`icon--${direction}`]; - const classes = `${styles.icon} ${directionClass} ${className}`; - - if (direction === 'top') { - return ( - - - - - ); - } - - if (direction === 'bottom') { - return ( - - - - - ); - } - - if (direction === 'left') { - return ( - - - - - ); - } - - return ( - - - - - ); -}; diff --git a/src/components/atoms/icons/career.module.scss b/src/components/atoms/icons/career.module.scss deleted file mode 100644 index 0731526..0000000 --- a/src/components/atoms/icons/career.module.scss +++ /dev/null @@ -1,53 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.lock { - fill: var(--color-bg); - stroke: var(--color-primary-darker); - stroke-width: 3; -} - -.lines { - fill: var(--color-fg); - stroke-width: 4; -} - -.seal-top { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 2; -} - -.seal-bottom { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 2; -} - -.diploma { - fill: var(--color-bg); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.top { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.handle { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 3; -} - -.bottom { - fill: var(--color-primary); - stroke: var(--color-primary-darker); - stroke-width: 4; -} diff --git a/src/components/atoms/icons/career.stories.tsx b/src/components/atoms/icons/career.stories.tsx deleted file mode 100644 index 5c3ae12..0000000 --- a/src/components/atoms/icons/career.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Career as CareerIcon } from './career'; - -/** - * Career icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: CareerIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Career - */ -export const Career = Template.bind({}); diff --git a/src/components/atoms/icons/career.test.tsx b/src/components/atoms/icons/career.test.tsx deleted file mode 100644 index 27754a8..0000000 --- a/src/components/atoms/icons/career.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Career } from './career'; - -describe('Career', () => { - it('renders a Career icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/career.tsx b/src/components/atoms/icons/career.tsx deleted file mode 100644 index 6456d40..0000000 --- a/src/components/atoms/icons/career.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './career.module.scss'; - -export type CareerProps = SVGAttributes; - -/** - * Career Component - * - * Render a career svg icon. - */ -export const Career: FC = ({ className = '', ...props }) => { - return ( - - - - - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/cc-by-sa.module.scss b/src/components/atoms/icons/cc-by-sa.module.scss deleted file mode 100644 index 14935b6..0000000 --- a/src/components/atoms/icons/cc-by-sa.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(60)}); - fill: var(--color-fg); -} diff --git a/src/components/atoms/icons/cc-by-sa.stories.tsx b/src/components/atoms/icons/cc-by-sa.stories.tsx deleted file mode 100644 index 2a29ee3..0000000 --- a/src/components/atoms/icons/cc-by-sa.stories.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { CCBySA as CCBySAIcon } from './cc-by-sa'; - -/** - * CC BY SA icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: CCBySAIcon, - argTypes: { - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - CC BY SA - */ -export const CCBySA = Template.bind({}); diff --git a/src/components/atoms/icons/cc-by-sa.test.tsx b/src/components/atoms/icons/cc-by-sa.test.tsx deleted file mode 100644 index 7e81835..0000000 --- a/src/components/atoms/icons/cc-by-sa.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../tests/utils'; -import { CCBySA } from './cc-by-sa'; - -describe('CCBySA', () => { - it('renders a CC BY SA icon', () => { - render(); - expect(screen.getByTitle('CC BY SA')).toBeInTheDocument(); - }); -}); diff --git a/src/components/atoms/icons/cc-by-sa.tsx b/src/components/atoms/icons/cc-by-sa.tsx deleted file mode 100644 index ba6d278..0000000 --- a/src/components/atoms/icons/cc-by-sa.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import { useIntl } from 'react-intl'; -import styles from './cc-by-sa.module.scss'; - -export type CCBySAProps = SVGAttributes; - -/** - * CCBySA component - * - * Render a CC BY SA svg icon. - */ -export const CCBySA: FC = ({ className = '', ...props }) => { - const intl = useIntl(); - - return ( - - - {intl.formatMessage({ - defaultMessage: 'CC BY SA', - description: 'CCBySA: icon title', - id: 'cl7YNU', - })} - - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/close.module.scss b/src/components/atoms/icons/close.module.scss deleted file mode 100644 index a90391a..0000000 --- a/src/components/atoms/icons/close.module.scss +++ /dev/null @@ -1,12 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.line { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 3; -} diff --git a/src/components/atoms/icons/close.stories.tsx b/src/components/atoms/icons/close.stories.tsx deleted file mode 100644 index d075141..0000000 --- a/src/components/atoms/icons/close.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Close as CloseIcon } from './close'; - -/** - * Close icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: CloseIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Close - */ -export const Close = Template.bind({}); diff --git a/src/components/atoms/icons/close.test.tsx b/src/components/atoms/icons/close.test.tsx deleted file mode 100644 index b2f325c..0000000 --- a/src/components/atoms/icons/close.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Close } from './close'; - -describe('Close', () => { - it('renders a Close icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/close.tsx b/src/components/atoms/icons/close.tsx deleted file mode 100644 index 5db8620..0000000 --- a/src/components/atoms/icons/close.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './close.module.scss'; - -export type CloseProps = SVGAttributes; - -/** - * Close component - * - * Render a close svg icon. - */ -export const Close: FC = ({ className = '', ...props }) => { - return ( - - - - - ); -}; diff --git a/src/components/atoms/icons/cog.module.scss b/src/components/atoms/icons/cog.module.scss deleted file mode 100644 index feda6ce..0000000 --- a/src/components/atoms/icons/cog.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - width: var(--icon-size, #{fun.convert-px(40)}); - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; -} diff --git a/src/components/atoms/icons/cog.stories.tsx b/src/components/atoms/icons/cog.stories.tsx deleted file mode 100644 index 1b6d440..0000000 --- a/src/components/atoms/icons/cog.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Cog as CogIcon } from './cog'; - -/** - * Cogs icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: CogIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Cogs - */ -export const Cog = Template.bind({}); diff --git a/src/components/atoms/icons/cog.test.tsx b/src/components/atoms/icons/cog.test.tsx deleted file mode 100644 index f4ea71b..0000000 --- a/src/components/atoms/icons/cog.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Cog } from './cog'; - -describe('Cog', () => { - it('renders a Cog icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/cog.tsx b/src/components/atoms/icons/cog.tsx deleted file mode 100644 index 6e44708..0000000 --- a/src/components/atoms/icons/cog.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './cog.module.scss'; - -export type CogProps = SVGAttributes; - -/** - * Cog component - * - * Render a cog svg icon. - */ -export const Cog: FC = ({ className = '', ...props }) => { - return ( - - - - - ); -}; diff --git a/src/components/atoms/icons/computer-screen.module.scss b/src/components/atoms/icons/computer-screen.module.scss deleted file mode 100644 index fcc4002..0000000 --- a/src/components/atoms/icons/computer-screen.module.scss +++ /dev/null @@ -1,39 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.root, -.separator, -.cursor, -.line, -.text { - fill: var(--color-fg); -} - -.stand { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-dark); - - &--top { - stroke-width: 3; - } - - &--bottom { - stroke-width: 2; - } -} - -.screen { - fill: var(--color-bg); - stroke: var(--color-primary-dark); - stroke-width: 3; -} - -.contour { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-dark); - stroke-width: 3; -} diff --git a/src/components/atoms/icons/computer-screen.stories.tsx b/src/components/atoms/icons/computer-screen.stories.tsx deleted file mode 100644 index d4b257b..0000000 --- a/src/components/atoms/icons/computer-screen.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { ComputerScreen as ComputerScreenIcon } from './computer-screen'; - -/** - * Computer Screen icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: ComputerScreenIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Computer Screen - */ -export const ComputerScreen = Template.bind({}); diff --git a/src/components/atoms/icons/computer-screen.test.tsx b/src/components/atoms/icons/computer-screen.test.tsx deleted file mode 100644 index 5a61c9b..0000000 --- a/src/components/atoms/icons/computer-screen.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { ComputerScreen } from './computer-screen'; - -describe('ComputerScreen', () => { - it('renders a computer screen icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/computer-screen.tsx b/src/components/atoms/icons/computer-screen.tsx deleted file mode 100644 index 32f41a0..0000000 --- a/src/components/atoms/icons/computer-screen.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './computer-screen.module.scss'; - -export type ComputerScreenProps = SVGAttributes; - -/** - * ComputerScreen component - * - * Render a computer screen svg icon. - */ -export const ComputerScreen: FC = ({ - className = '', - ...props -}) => { - return ( - - - - - - - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/envelop.module.scss b/src/components/atoms/icons/envelop.module.scss deleted file mode 100644 index 584fe97..0000000 --- a/src/components/atoms/icons/envelop.module.scss +++ /dev/null @@ -1,28 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.envelop { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.lines { - fill: var(--color-fg); -} - -.background { - fill: var(--color-shadow-dark); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.paper { - fill: var(--color-bg); - stroke: var(--color-primary-darker); - stroke-width: 4; -} diff --git a/src/components/atoms/icons/envelop.stories.tsx b/src/components/atoms/icons/envelop.stories.tsx deleted file mode 100644 index 666cd86..0000000 --- a/src/components/atoms/icons/envelop.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Envelop as EnvelopIcon } from './envelop'; - -/** - * Envelop icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: EnvelopIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Envelop - */ -export const Envelop = Template.bind({}); diff --git a/src/components/atoms/icons/envelop.test.tsx b/src/components/atoms/icons/envelop.test.tsx deleted file mode 100644 index 82ed575..0000000 --- a/src/components/atoms/icons/envelop.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Envelop } from './envelop'; - -describe('Envelop', () => { - it('renders an envelop icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/envelop.tsx b/src/components/atoms/icons/envelop.tsx deleted file mode 100644 index 968c51f..0000000 --- a/src/components/atoms/icons/envelop.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './envelop.module.scss'; - -export type EnvelopProps = SVGAttributes; - -/** - * Envelop Component - * - * Render an envelop svg icon. - */ -export const Envelop: FC = ({ className = '', ...props }) => { - return ( - - - - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/feed.module.scss b/src/components/atoms/icons/feed.module.scss deleted file mode 100644 index bf15c23..0000000 --- a/src/components/atoms/icons/feed.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} diff --git a/src/components/atoms/icons/feed.stories.tsx b/src/components/atoms/icons/feed.stories.tsx deleted file mode 100644 index 1a297e9..0000000 --- a/src/components/atoms/icons/feed.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Feed as FeedIcon } from './feed'; - -/** - * Feed icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: FeedIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Feed - */ -export const Feed = Template.bind({}); diff --git a/src/components/atoms/icons/feed.test.tsx b/src/components/atoms/icons/feed.test.tsx deleted file mode 100644 index 5a91483..0000000 --- a/src/components/atoms/icons/feed.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Feed } from './feed'; - -describe('Feed', () => { - it('renders a feed icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/feed.tsx b/src/components/atoms/icons/feed.tsx deleted file mode 100644 index 40b3156..0000000 --- a/src/components/atoms/icons/feed.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './feed.module.scss'; - -export type FeedProps = SVGAttributes; - -/** - * Feed Component - * - * Render a feed svg icon. - */ -export const Feed: FC = ({ className = '', ...props }) => { - return ( - - - - - - - - - - - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/hamburger.module.scss b/src/components/atoms/icons/hamburger.module.scss deleted file mode 100644 index c92b3ab..0000000 --- a/src/components/atoms/icons/hamburger.module.scss +++ /dev/null @@ -1,42 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.wrapper { - display: flex; - align-items: center; - width: var(--icon-size, #{fun.convert-px(50)}); - height: var(--icon-size, #{fun.convert-px(50)}); - position: relative; -} - -.icon { - &, - &::before, - &::after { - display: block; - height: fun.convert-px(7); - width: 100%; - position: absolute; - background: var(--color-primary-lighter); - background-image: linear-gradient( - to right, - var(--color-primary-light) 0%, - var(--color-primary-lighter) 100% - ); - border: fun.convert-px(1) solid var(--color-primary-darker); - border-radius: fun.convert-px(3); - transition: all 0.25s ease-in-out 0s, transform 0.4s ease-in 0s; - } - - &::before, - &::after { - content: ""; - } - - &::before { - top: fun.convert-px(-15); - } - - &::after { - bottom: fun.convert-px(-15); - } -} diff --git a/src/components/atoms/icons/hamburger.stories.tsx b/src/components/atoms/icons/hamburger.stories.tsx deleted file mode 100644 index b2416c6..0000000 --- a/src/components/atoms/icons/hamburger.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Hamburger as HamburgerIcon } from './hamburger'; - -/** - * Hamburger icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: HamburgerIcon, - argTypes: { - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames to the icon wrapper.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - iconClassName: { - control: { - type: 'text', - }, - description: 'Set additional classnames to the icon.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Hamburger - */ -export const Hamburger = Template.bind({}); diff --git a/src/components/atoms/icons/hamburger.test.tsx b/src/components/atoms/icons/hamburger.test.tsx deleted file mode 100644 index d7a17b6..0000000 --- a/src/components/atoms/icons/hamburger.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Hamburger } from './hamburger'; - -describe('Hamburger', () => { - it('renders a Hamburger icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/hamburger.tsx b/src/components/atoms/icons/hamburger.tsx deleted file mode 100644 index cc4e7b9..0000000 --- a/src/components/atoms/icons/hamburger.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC } from 'react'; -import styles from './hamburger.module.scss'; - -export type HamburgerProps = { - /** - * Set additional classnames to the icon wrapper. - */ - className?: string; - /** - * Set additional classnames to the icon. - */ - iconClassName?: string; -}; - -/** - * Hamburger component - * - * Render a Hamburger icon. - */ -export const Hamburger: FC = ({ - className = '', - iconClassName = '', -}) => { - return ( - - - - ); -}; diff --git a/src/components/atoms/icons/home.module.scss b/src/components/atoms/icons/home.module.scss deleted file mode 100644 index 8ed05a0..0000000 --- a/src/components/atoms/icons/home.module.scss +++ /dev/null @@ -1,41 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.wall { - fill: var(--color-bg); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.indoor { - fill: var(--color-shadow-dark); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.door { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.roof { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.chimney { - fill: var(--color-bg); - stroke: var(--color-primary-darker); - stroke-width: 4; -} - -.lines { - fill: var(--color-primary-darker); - stroke-width: 4; -} diff --git a/src/components/atoms/icons/home.stories.tsx b/src/components/atoms/icons/home.stories.tsx deleted file mode 100644 index 7492af7..0000000 --- a/src/components/atoms/icons/home.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Home as HomeIcon } from './home'; - -/** - * Home icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: HomeIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Home - */ -export const Home = Template.bind({}); diff --git a/src/components/atoms/icons/home.test.tsx b/src/components/atoms/icons/home.test.tsx deleted file mode 100644 index e7d03d9..0000000 --- a/src/components/atoms/icons/home.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Home } from './home'; - -describe('Home', () => { - it('renders a home icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/home.tsx b/src/components/atoms/icons/home.tsx deleted file mode 100644 index 0081f37..0000000 --- a/src/components/atoms/icons/home.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './home.module.scss'; - -export type HomeProps = SVGAttributes; - -/** - * Home component. - * - * Render a home svg icon. - */ -export const Home: FC = ({ className = '', ...props }) => { - return ( - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/index.ts b/src/components/atoms/icons/index.ts deleted file mode 100644 index 1b413ba..0000000 --- a/src/components/atoms/icons/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './arrow'; -export * from './career'; -export * from './cc-by-sa'; -export * from './close'; -export * from './cog'; -export * from './computer-screen'; -export * from './envelop'; -export * from './feed'; -export * from './hamburger'; -export * from './home'; -export * from './magnifying-glass'; -export * from './moon'; -export * from './plus-minus'; -export * from './posts-stack'; -export * from './sun'; diff --git a/src/components/atoms/icons/magnifying-glass.module.scss b/src/components/atoms/icons/magnifying-glass.module.scss deleted file mode 100644 index 33a82d6..0000000 --- a/src/components/atoms/icons/magnifying-glass.module.scss +++ /dev/null @@ -1,29 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.big-handle { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 3; -} - -.glass { - fill: var(--color-bg-opacity); - stroke: var(--color-primary-darker); - stroke-width: 2; -} - -.upright { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 3; -} - -.small-handle { - fill: var(--color-primary); - stroke: var(--color-primary-darker); - stroke-width: 2; -} diff --git a/src/components/atoms/icons/magnifying-glass.stories.tsx b/src/components/atoms/icons/magnifying-glass.stories.tsx deleted file mode 100644 index 7dec505..0000000 --- a/src/components/atoms/icons/magnifying-glass.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { MagnifyingGlass as MagnifyingGlassIcon } from './magnifying-glass'; - -/** - * Magnifying Glass icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: MagnifyingGlassIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Magnifying Glass - */ -export const MagnifyingGlass = Template.bind({}); diff --git a/src/components/atoms/icons/magnifying-glass.test.tsx b/src/components/atoms/icons/magnifying-glass.test.tsx deleted file mode 100644 index 5cff75b..0000000 --- a/src/components/atoms/icons/magnifying-glass.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { MagnifyingGlass } from './magnifying-glass'; - -describe('MagnifyingGlass', () => { - it('renders a magnifying glass icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/magnifying-glass.tsx b/src/components/atoms/icons/magnifying-glass.tsx deleted file mode 100644 index 619adef..0000000 --- a/src/components/atoms/icons/magnifying-glass.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './magnifying-glass.module.scss'; - -export type MagnifyingGlassProps = SVGAttributes; - -/** - * MagnifyingGlass component - * - * Render a magnifying glass svg icon. - */ -export const MagnifyingGlass: FC = ({ - className = '', - ...props -}) => { - return ( - - - - - - - ); -}; diff --git a/src/components/atoms/icons/moon.module.scss b/src/components/atoms/icons/moon.module.scss deleted file mode 100644 index f2564a9..0000000 --- a/src/components/atoms/icons/moon.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; - width: var(--icon-size, #{fun.convert-px(25)}); -} diff --git a/src/components/atoms/icons/moon.stories.tsx b/src/components/atoms/icons/moon.stories.tsx deleted file mode 100644 index a8faf03..0000000 --- a/src/components/atoms/icons/moon.stories.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Moon as MoonIcon } from './moon'; - -/** - * Moon icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: MoonIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - title: { - control: { - type: 'text', - }, - description: 'The SVG title.', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Moon - */ -export const Moon = Template.bind({}); diff --git a/src/components/atoms/icons/moon.test.tsx b/src/components/atoms/icons/moon.test.tsx deleted file mode 100644 index b164ecd..0000000 --- a/src/components/atoms/icons/moon.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Moon } from './moon'; - -describe('Moon', () => { - it('renders a moon icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/moon.tsx b/src/components/atoms/icons/moon.tsx deleted file mode 100644 index 2139ce1..0000000 --- a/src/components/atoms/icons/moon.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './moon.module.scss'; - -export type MoonProps = SVGAttributes & { - /** - * The SVG title. - */ - title?: string; -}; - -export const Moon: FC = ({ className = '', title, ...props }) => { - return ( - - {title ? {title} : null} - - - ); -}; diff --git a/src/components/atoms/icons/plus-minus.module.scss b/src/components/atoms/icons/plus-minus.module.scss deleted file mode 100644 index b46b5ba..0000000 --- a/src/components/atoms/icons/plus-minus.module.scss +++ /dev/null @@ -1,39 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: flex; - place-content: center; - place-items: center; - width: var(--icon-size, #{fun.convert-px(30)}); - height: var(--icon-size, #{fun.convert-px(30)}); - position: relative; - background: var(--color-bg); - border: fun.convert-px(1) solid var(--color-primary); - border-radius: fun.convert-px(3); - color: var(--color-primary); - - &::before, - &::after { - content: ""; - position: absolute; - background: var(--color-primary); - transition: transform 0.4s ease-out 0s; - } - - &::after { - height: fun.convert-px(3); - width: 60%; - } - - &::before { - height: 60%; - width: fun.convert-px(3); - transform: scaleY(1); - } - - &--minus { - &::before { - transform: scaleY(0); - } - } -} diff --git a/src/components/atoms/icons/plus-minus.stories.tsx b/src/components/atoms/icons/plus-minus.stories.tsx deleted file mode 100644 index c556076..0000000 --- a/src/components/atoms/icons/plus-minus.stories.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { PlusMinus as PlusMinusIcon } from './plus-minus'; - -/** - * Plus/Minus icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: PlusMinusIcon, - argTypes: { - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - state: { - control: { - type: 'radio', - }, - description: 'Which state should be displayed.', - options: ['plus', 'minus'], - type: { - name: 'enum', - required: true, - value: ['plus', 'minus'], - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Plus/Minus - */ -export const PlusMinus = Template.bind({}); -PlusMinus.args = { - state: 'plus', -}; diff --git a/src/components/atoms/icons/plus-minus.test.tsx b/src/components/atoms/icons/plus-minus.test.tsx deleted file mode 100644 index 6307401..0000000 --- a/src/components/atoms/icons/plus-minus.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { PlusMinus } from './plus-minus'; - -describe('PlusMinus', () => { - it('renders a plus/minus icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/plus-minus.tsx b/src/components/atoms/icons/plus-minus.tsx deleted file mode 100644 index e2eb55e..0000000 --- a/src/components/atoms/icons/plus-minus.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC } from 'react'; -import styles from './plus-minus.module.scss'; - -export type PlusMinusProps = { - /** - * Set additional classnames to the icon. - */ - className?: string; - /** - * Which state should be displayed. - */ - state: 'plus' | 'minus'; -}; - -/** - * PlusMinus component - * - * Render a plus or a minus icon. - */ -export const PlusMinus: FC = ({ className = '', state }) => { - const stateClass = `icon--${state}`; - - return ( -
- ); -}; diff --git a/src/components/atoms/icons/posts-stack.module.scss b/src/components/atoms/icons/posts-stack.module.scss deleted file mode 100644 index aa1f4f0..0000000 --- a/src/components/atoms/icons/posts-stack.module.scss +++ /dev/null @@ -1,22 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.icon { - display: block; - width: var(--icon-size, #{fun.convert-px(40)}); -} - -.lines { - fill: var(--color-fg); - stroke-width: 4; -} - -.picture { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); -} - -.background { - fill: var(--color-bg); - stroke: var(--color-primary-darker); - stroke-width: 4; -} diff --git a/src/components/atoms/icons/posts-stack.stories.tsx b/src/components/atoms/icons/posts-stack.stories.tsx deleted file mode 100644 index 7daeecf..0000000 --- a/src/components/atoms/icons/posts-stack.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { PostsStack as PostsStackIcon } from './posts-stack'; - -/** - * Posts Stack icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: PostsStackIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Posts Stack - */ -export const PostsStack = Template.bind({}); diff --git a/src/components/atoms/icons/posts-stack.test.tsx b/src/components/atoms/icons/posts-stack.test.tsx deleted file mode 100644 index 068fbea..0000000 --- a/src/components/atoms/icons/posts-stack.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { PostsStack } from './posts-stack'; - -describe('PostsStack', () => { - it('renders a posts stack icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/posts-stack.tsx b/src/components/atoms/icons/posts-stack.tsx deleted file mode 100644 index c783892..0000000 --- a/src/components/atoms/icons/posts-stack.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './posts-stack.module.scss'; - -export type PostsStackProps = SVGAttributes; - -/** - * Posts stack component. - * - * Render a posts stack svg icon. - */ -export const PostsStack: FC = ({ - className = '', - ...props -}) => { - return ( - - - - - - - - - - - - - - - ); -}; diff --git a/src/components/atoms/icons/sun.module.scss b/src/components/atoms/icons/sun.module.scss deleted file mode 100644 index 8d9683f..0000000 --- a/src/components/atoms/icons/sun.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use "../../../styles/abstracts/functions" as fun; - -.sun { - fill: var(--color-primary-lighter); - stroke: var(--color-primary-darker); - stroke-width: 4; - width: var(--icon-size, #{fun.convert-px(25)}); -} diff --git a/src/components/atoms/icons/sun.stories.tsx b/src/components/atoms/icons/sun.stories.tsx deleted file mode 100644 index a332bcd..0000000 --- a/src/components/atoms/icons/sun.stories.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Sun as SunIcon } from './sun'; - -/** - * Sun icon - Storybook Meta - */ -export default { - title: 'Atoms/Illustrations/Icons', - component: SunIcon, - argTypes: { - 'aria-hidden': { - control: { - type: null, - }, - description: 'Should the svg be hidden from assistive technologies?', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - className: { - control: { - type: 'text', - }, - description: 'Set additional classnames.', - table: { - category: 'Styles', - }, - type: { - name: 'string', - required: false, - }, - }, - title: { - control: { - type: 'text', - }, - description: 'The SVG title.', - table: { - category: 'Accessibility', - }, - type: { - name: 'string', - required: false, - }, - }, - }, -} as ComponentMeta; - -const Template: ComponentStory = (args) => ( - -); - -/** - * Icons Stories - Sun - */ -export const Sun = Template.bind({}); diff --git a/src/components/atoms/icons/sun.test.tsx b/src/components/atoms/icons/sun.test.tsx deleted file mode 100644 index 2aa916b..0000000 --- a/src/components/atoms/icons/sun.test.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, expect, it } from '@jest/globals'; -import { render } from '../../../../tests/utils'; -import { Sun } from './sun'; - -describe('Sun', () => { - it('renders a sun icon', () => { - const { container } = render(); - expect(container).toBeDefined(); - }); -}); diff --git a/src/components/atoms/icons/sun.tsx b/src/components/atoms/icons/sun.tsx deleted file mode 100644 index 69a3044..0000000 --- a/src/components/atoms/icons/sun.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { FC, SVGAttributes } from 'react'; -import styles from './sun.module.scss'; - -export type SunProps = SVGAttributes & { - /** - * The SVG title. - */ - title?: string; -}; - -/** - * Sun component. - * - * Render a svg sun icon. - */ -export const Sun: FC = ({ className = '', title, ...props }) => { - return ( - - {title !== 'undefined' && {title}} - - - ); -}; diff --git a/src/components/atoms/images/icons/hamburger-icon/hamburger-icon.module.scss b/src/components/atoms/images/icons/hamburger-icon/hamburger-icon.module.scss new file mode 100644 index 0000000..8b8ad7e --- /dev/null +++ b/src/components/atoms/images/icons/hamburger-icon/hamburger-icon.module.scss @@ -0,0 +1,45 @@ +@use "../../../../../styles/abstracts/functions" as fun; + +.wrapper { + display: flex; + align-items: center; + aspect-ratio: 1/1; + position: relative; +} + +.icon { + width: 100%; + + &, + &::before, + &::after { + display: block; + height: 20%; + background: var(--color-primary-lighter); + background-image: linear-gradient( + to right, + var(--color-primary-light) 0%, + var(--color-primary-lighter) 100% + ); + border: fun.convert-px(1) solid var(--color-primary-darker); + border-radius: fun.convert-px(4); + transition: + all 0.25s ease-in-out 0s, + transform 0.4s ease-in 0s; + } + + &::before, + &::after { + content: ""; + position: absolute; + inset-inline: 0; + } + + &::before { + top: 3%; + } + + &::after { + bottom: 3%; + } +} diff --git a/src/components/atoms/images/icons/hamburger-icon/hamburger-icon.tsx b/src/components/atoms/images/icons/hamburger-icon/hamburger-icon.tsx new file mode 100644 index 0000000..edd25ba --- /dev/null +++ b/src/components/atoms/images/icons/hamburger-icon/hamburger-icon.tsx @@ -0,0 +1,25 @@ +import type { FC, HTMLAttributes } from 'react'; +import styles from './hamburger-icon.module.scss'; + +export type HamburgerIconProps = Omit< + HTMLAttributes, + 'children' +>; + +/** + * HamburgerIcon component + * + * Render a Hamburger icon. + */ +export const HamburgerIcon: FC = ({ + className = '', + ...props +}) => { + const wrapperClass = `${styles.wrapper} ${className}`; + + return ( + + + + ); +}; diff --git a/src/components/atoms/images/icons/hamburger-icon/index.ts b/src/components/atoms/images/icons/hamburger-icon/index.ts new file mode 100644 index 0000000..a601d0c --- /dev/null +++ b/src/components/atoms/images/icons/hamburger-icon/index.ts @@ -0,0 +1 @@ +export * from './hamburger-icon'; diff --git a/src/components/atoms/images/icons/icon.module.scss b/src/components/atoms/images/icons/icon.module.scss new file mode 100644 index 0000000..72eb611 --- /dev/null +++ b/src/components/atoms/images/icons/icon.module.scss @@ -0,0 +1,53 @@ +@use "../../../../styles/abstracts/functions" as fun; + +.icon { + width: var(--icon-size); + transition: all 0.25s ease-in-out 0s; + + &--arrow { + fill: var(--color-primary); + } + + &--cc-by-sa { + width: calc(var(--icon-size) * 2); + fill: var(--color-fg); + } + + &--cog, + &--home, + &--moon, + &--sun { + stroke-width: 4; + } + + &--cog, + &--moon, + &--sun { + fill: var(--color-primary-lighter); + stroke: var(--color-primary-darker); + } + + &--stroke { + stroke: var(--color-primary); + } + + &--xs { + --icon-size: var(--icon-size-xs); + } + + &--sm { + --icon-size: var(--icon-size-sm); + } + + &--md { + --icon-size: var(--icon-size-md); + } + + &--lg { + --icon-size: var(--icon-size-lg); + } + + &--xl { + --icon-size: var(--icon-size-xl); + } +} diff --git a/src/components/atoms/images/icons/icon.stories.tsx b/src/components/atoms/images/icons/icon.stories.tsx new file mode 100644 index 0000000..fa8d2b5 --- /dev/null +++ b/src/components/atoms/images/icons/icon.stories.tsx @@ -0,0 +1,201 @@ +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { Icon, type IconProps, type IconShape } from './icon'; + +/** + * Home icon - Storybook Meta + */ +export default { + title: 'Atoms/Images/Icons', + component: Icon, + argTypes: { + shape: { + control: { + type: 'select', + }, + options: [ + 'arrow', + 'career', + 'cc-by-sa', + 'cog', + 'computer', + 'cross', + 'envelop', + 'feed', + 'hamburger', + 'home', + 'magnifying-glass', + 'minus', + 'moon', + 'posts-stack', + 'plus', + 'sun', + ], + description: 'Define the icon shape.', + type: { + name: 'string', + required: false, + }, + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = ({ + shape, + ...args +}: IconProps) => ; + +/** + * Icon Stories - ArrowRight + */ +export const ArrowRight = Template.bind({}); +ArrowRight.args = { + orientation: 'right', + shape: 'arrow', +}; + +/** + * Icon Stories - ArrowLeft + */ +export const ArrowLeft = Template.bind({}); +ArrowLeft.args = { + orientation: 'left', + shape: 'arrow', +}; + +/** + * Icon Stories - ArrowBottom + */ +export const ArrowBottom = Template.bind({}); +ArrowBottom.args = { + orientation: 'bottom', + shape: 'arrow', +}; + +/** + * Icon Stories - ArrowTop + */ +export const ArrowTop = Template.bind({}); +ArrowTop.args = { + orientation: 'top', + shape: 'arrow', +}; + +/** + * Icon Stories - Career + */ +export const Career = Template.bind({}); +Career.args = { + shape: 'career', +}; + +/** + * Icon Stories - CCBySA + */ +export const CCBySA = Template.bind({}); +CCBySA.args = { + shape: 'cc-by-sa', +}; + +/** + * Icon Stories - Cog + */ +export const Cog = Template.bind({}); +Cog.args = { + shape: 'cog', +}; + +/** + * Icon Stories - Computer + */ +export const Computer = Template.bind({}); +Computer.args = { + shape: 'computer', +}; + +/** + * Icon Stories - Cross + */ +export const Cross = Template.bind({}); +Cross.args = { + shape: 'cross', +}; + +/** + * Icon Stories - Envelop + */ +export const Envelop = Template.bind({}); +Envelop.args = { + shape: 'envelop', +}; + +/** + * Icon Stories - Feed + */ +export const Feed = Template.bind({}); +Feed.args = { + shape: 'feed', +}; + +/** + * Icon Stories - Hamburger + */ +export const Hamburger = Template.bind({}); +Hamburger.args = { + shape: 'hamburger', +}; + +/** + * Icon Stories - Home + */ +export const Home = Template.bind({}); +Home.args = { + shape: 'home', +}; + +/** + * Icon Stories - MagnifyingGlass + */ +export const MagnifyingGlass = Template.bind({}); +MagnifyingGlass.args = { + shape: 'magnifying-glass', +}; + +/** + * Icon Stories - Minus + */ +export const Minus = Template.bind({}); +Minus.args = { + shape: 'minus', +}; + +/** + * Icon Stories - Moon + */ +export const Moon = Template.bind({}); +Moon.args = { + shape: 'moon', +}; + +/** + * Icon Stories - Plus + */ +export const Plus = Template.bind({}); +Plus.args = { + shape: 'plus', +}; + +/** + * Icon Stories - PostsStack + */ +export const PostsStack = Template.bind({}); +PostsStack.args = { + shape: 'posts-stack', +}; + +/** + * Icon Stories - Sun + */ +export const Sun = Template.bind({}); +Sun.args = { + shape: 'sun', +}; diff --git a/src/components/atoms/images/icons/icon.test.tsx b/src/components/atoms/images/icons/icon.test.tsx new file mode 100644 index 0000000..d80edd7 --- /dev/null +++ b/src/components/atoms/images/icons/icon.test.tsx @@ -0,0 +1,182 @@ +/* eslint-disable max-statements */ +import { describe, expect, it } from '@jest/globals'; +import { render, screen as rtlScreen } from '@testing-library/react'; +import { Icon } from './icon'; + +/* eslint-disable jsx-a11y/prefer-tag-over-role -- Valid on SVG */ +describe('Icon', () => { + it('can render an icon with a heading', () => { + const heading = 'architecto'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('can render an icon with a description', () => { + const description = 'fuga voluptates eligendi'; + + render(); + + expect(rtlScreen.getByRole('img')).toHaveTextContent(description); + }); + + it('render an icon with bottom arrow shape', () => { + const heading = 'quae'; + + render( + + ); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with left arrow shape', () => { + const heading = 'nemo'; + + render( + + ); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with right arrow shape', () => { + const heading = 'odit'; + + render( + + ); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with top arrow shape', () => { + const heading = 'ut'; + + render( + + ); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with career shape', () => { + const heading = 'autem'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with cc-by-sa shape', () => { + const heading = 'blanditiis'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with cog shape', () => { + const heading = 'consequatur'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with computer shape', () => { + const heading = 'amet'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with cross shape', () => { + const heading = 'molestias'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with envelop shape', () => { + const heading = 'laudantium'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + it('render an icon with feed shape', () => { + const heading = 'beatae'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with home shape', () => { + const heading = 'aut'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with magnifying glass shape', () => { + const heading = 'rerum'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with moon shape', () => { + const heading = 'saepe'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with posts stack shape', () => { + const heading = 'sunt'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with sun shape', () => { + const heading = 'aut'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with hamburger shape', () => { + const heading = 'sed'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with minus shape', () => { + const heading = 'sunt'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); + + it('render an icon with plus shape', () => { + const heading = 'maxime'; + + render(); + + expect(rtlScreen.getByRole('img', { name: heading })).toBeInTheDocument(); + }); +}); diff --git a/src/components/atoms/images/icons/icon.tsx b/src/components/atoms/images/icons/icon.tsx new file mode 100644 index 0000000..23170d9 --- /dev/null +++ b/src/components/atoms/images/icons/icon.tsx @@ -0,0 +1,126 @@ +import type { SVGAttributes } from 'react'; +import { HamburgerIcon, type HamburgerIconProps } from './hamburger-icon'; +import styles from './icon.module.scss'; +import { + PlusMinusIcon, + type PlusMinusIconProps, + type PlusMinusIconShape, +} from './plus-minus-icon'; +import { type SVGIconShape, SVGPaths, type SVGPathsProps } from './svg-paths'; + +export type IconShape = SVGIconShape | PlusMinusIconShape | 'hamburger'; + +export type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; + +type SVGIconProps = Omit< + SVGAttributes, + 'children' | 'viewBox' | 'xmlns' +> & { + /** + * Describe the icon. + */ + description?: string; + /** + * Define an accessible title for the icon. + */ + heading?: string; +}; + +type IconBaseProps = T extends 'hamburger' + ? HamburgerIconProps + : T extends 'minus' | 'plus' + ? PlusMinusIconProps + : SVGIconProps; + +type AdditionalProps = Pick< + SVGPathsProps, + 'orientation' +> & { + /** + * The icon shape. + */ + shape: T; + /** + * The icon size. + * + * @default 'md' + */ + size?: IconSize; +}; + +export type IconProps = IconBaseProps & + Pick & + AdditionalProps; + +type BuildClassNameConfig = Pick< + IconProps, + 'className' +> & + Pick, 'shape' | 'size'>; + +const buildClassName = ({ + className, + shape, + size, +}: BuildClassNameConfig) => { + const classNames = ['icon', `icon--${shape}`, `icon--${size}`].map( + (key) => styles[key] + ); + + if (className) classNames.push(className); + + return classNames.join(' '); +}; + +type ExtractedProps = 'className' | 'orientation' | 'shape' | 'size'; + +export const Icon = ({ + className = '', + orientation, + shape, + size = 'md', + ...props +}: IconProps) => { + const iconClass = buildClassName({ className, shape, size }); + + if (shape === 'hamburger') + return ( + , ExtractedProps>)} + className={iconClass} + /> + ); + + if (shape === 'minus' || shape === 'plus') + return ( + , ExtractedProps>)} + className={iconClass} + shape={shape} + /> + ); + + const viewBox = shape === 'cc-by-sa' ? '0 0 100 40' : '0 0 100 100'; + + // Without casting Typescript complains because of props generic type + const { heading, description, ...remainingProps } = props as Omit< + IconProps, + ExtractedProps + >; + + return ( + + {heading ? {heading} : null} + {description ? {description} : null} + + + ); +}; diff --git a/src/components/atoms/images/icons/index.ts b/src/components/atoms/images/icons/index.ts new file mode 100644 index 0000000..af77d84 --- /dev/null +++ b/src/components/atoms/images/icons/index.ts @@ -0,0 +1 @@ +export * from './icon'; diff --git a/src/components/atoms/images/icons/plus-minus-icon/index.ts b/src/components/atoms/images/icons/plus-minus-icon/index.ts new file mode 100644 index 0000000..acca727 --- /dev/null +++ b/src/components/atoms/images/icons/plus-minus-icon/index.ts @@ -0,0 +1 @@ +export * from './plus-minus-icon'; diff --git a/src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.module.scss b/src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.module.scss new file mode 100644 index 0000000..07550c9 --- /dev/null +++ b/src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.module.scss @@ -0,0 +1,38 @@ +@use "../../../../../styles/abstracts/functions" as fun; + +.icon { + display: flex; + place-content: center; + place-items: center; + aspect-ratio: 1/1; + position: relative; + background: var(--color-bg); + border: fun.convert-px(1) solid var(--color-primary); + border-radius: fun.convert-px(3); + color: var(--color-primary); + + &::before, + &::after { + content: ""; + position: absolute; + background: var(--color-primary); + transition: transform 0.4s ease-out 0s; + } + + &::after { + height: fun.convert-px(3); + width: 60%; + } + + &::before { + height: 55%; + width: fun.convert-px(3); + transform: scaleY(1); + } + + &--minus { + &::before { + transform: scaleY(0); + } + } +} diff --git a/src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.tsx b/src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.tsx new file mode 100644 index 0000000..ed6bcf2 --- /dev/null +++ b/src/components/atoms/images/icons/plus-minus-icon/plus-minus-icon.tsx @@ -0,0 +1,30 @@ +import type { FC, HTMLAttributes } from 'react'; +import styles from './plus-minus-icon.module.scss'; + +export type PlusMinusIconShape = 'minus' | 'plus'; + +export type PlusMinusIconProps = Omit< + HTMLAttributes, + 'children' +> & { + /** + * Which shape should be displayed. + */ + shape: PlusMinusIconShape; +}; + +/** + * PlusMinusIcon component + * + * Render a plus or a minus icon. + */ +export const PlusMinusIcon: FC = ({ + className = '', + shape, + ...props +}) => { + const shapeClass = styles[`icon--${shape}`]; + const iconClass = `${styles.icon} ${shapeClass} ${className}`; + + return
; +}; 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 ; + } +}; diff --git a/src/components/atoms/images/index.ts b/src/components/atoms/images/index.ts index cb6151d..197d909 100644 --- a/src/components/atoms/images/index.ts +++ b/src/components/atoms/images/index.ts @@ -1 +1,2 @@ +export * from './icons'; export * from './logo'; diff --git a/src/components/atoms/index.ts b/src/components/atoms/index.ts index e0041cc..abcc198 100644 --- a/src/components/atoms/index.ts +++ b/src/components/atoms/index.ts @@ -1,7 +1,6 @@ export * from './buttons'; export * from './forms'; export * from './heading'; -export * from './icons'; export * from './images'; export * from './layout'; export * from './links'; diff --git a/src/components/atoms/layout/copyright.module.scss b/src/components/atoms/layout/copyright.module.scss index 5d5435c..ffde516 100644 --- a/src/components/atoms/layout/copyright.module.scss +++ b/src/components/atoms/layout/copyright.module.scss @@ -2,8 +2,6 @@ @use "../../../styles/abstracts/mixins" as mix; .wrapper { - --icon-size: #{fun.convert-px(70)}; - display: flex; flex-flow: row wrap; align-items: center; diff --git a/src/components/atoms/layout/copyright.stories.tsx b/src/components/atoms/layout/copyright.stories.tsx index fa79d32..a21fdfb 100644 --- a/src/components/atoms/layout/copyright.stories.tsx +++ b/src/components/atoms/layout/copyright.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { CCBySA } from '../icons'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { Icon } from '../images'; import { Copyright as CopyrightComponent } from './copyright'; /** @@ -53,6 +53,6 @@ Copyright.args = { start: '2012', end: '2022', }, - icon: , + icon: , owner: 'Your name', }; diff --git a/src/components/atoms/layout/copyright.test.tsx b/src/components/atoms/layout/copyright.test.tsx index 1e2230c..3aa04d0 100644 --- a/src/components/atoms/layout/copyright.test.tsx +++ b/src/components/atoms/layout/copyright.test.tsx @@ -1,33 +1,34 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../tests/utils'; -import { CCBySA } from '../icons'; +import { render, screen as rtlScreen } from '../../../../tests/utils'; +import { Icon } from '../images'; import { Copyright } from './copyright'; const dates = { start: '2012', end: '2022', }; -const icon = ; +const iconHeading = 'CC BY SA'; +const icon = ; const owner = 'Your name'; describe('Copyright', () => { it('renders the copyright owner', () => { render(); - expect(screen.getByText(owner)).toBeInTheDocument(); + expect(rtlScreen.getByText(owner)).toBeInTheDocument(); }); it('renders the copyright start date', () => { render(); - expect(screen.getByText(dates.start)).toBeInTheDocument(); + expect(rtlScreen.getByText(dates.start)).toBeInTheDocument(); }); it('renders the copyright end date', () => { render(); - expect(screen.getByText(dates.end)).toBeInTheDocument(); + expect(rtlScreen.getByText(dates.end)).toBeInTheDocument(); }); it('renders the copyright icon', () => { render(); - expect(screen.getByTitle('CC BY SA')).toBeInTheDocument(); + expect(rtlScreen.getByTitle(iconHeading)).toBeInTheDocument(); }); }); diff --git a/src/components/atoms/links/nav-link.module.scss b/src/components/atoms/links/nav-link.module.scss index acabcab..e72885a 100644 --- a/src/components/atoms/links/nav-link.module.scss +++ b/src/components/atoms/links/nav-link.module.scss @@ -6,7 +6,6 @@ --draw-border-thickness: #{fun.convert-px(4)}; --draw-border-color1: var(--color-primary-light); --draw-border-color2: var(--color-primary-lighter); - --icon-size: #{fun.convert-px(30)}; display: inline-flex; flex-flow: column nowrap; diff --git a/src/components/molecules/buttons/back-to-top.module.scss b/src/components/molecules/buttons/back-to-top.module.scss index 7eae03b..ba746df 100644 --- a/src/components/molecules/buttons/back-to-top.module.scss +++ b/src/components/molecules/buttons/back-to-top.module.scss @@ -6,13 +6,9 @@ height: clamp(#{fun.convert-px(48)}, 8vw, #{fun.convert-px(55)}); padding: 0; - svg { - width: 100%; - } - :global { .arrow-head { - transform: translateY(30%) scale(1.2); + transform: translateX(-9%) translateY(30%) scale(1.2); transition: all 0.45s ease-in-out 0s; } diff --git a/src/components/molecules/buttons/back-to-top.tsx b/src/components/molecules/buttons/back-to-top.tsx index 6ca6f10..f2e2073 100644 --- a/src/components/molecules/buttons/back-to-top.tsx +++ b/src/components/molecules/buttons/back-to-top.tsx @@ -1,6 +1,6 @@ import type { FC, HTMLAttributes } from 'react'; import { useIntl } from 'react-intl'; -import { Arrow, ButtonLink } from '../../atoms'; +import { ButtonLink, Icon } from '../../atoms'; import styles from './back-to-top.module.scss'; export type BackToTopProps = HTMLAttributes & { @@ -38,8 +38,8 @@ export const BackToTop: FC = ({ shape="square" to={anchor} > - {/* eslint-disable-next-line react/jsx-no-literals -- Direction allowed */} - + {/* eslint-disable-next-line react/jsx-no-literals -- Config allowed */} +
); diff --git a/src/components/molecules/buttons/heading-button.tsx b/src/components/molecules/buttons/heading-button.tsx index 97e2c84..3c3eef5 100644 --- a/src/components/molecules/buttons/heading-button.tsx +++ b/src/components/molecules/buttons/heading-button.tsx @@ -1,6 +1,6 @@ import { useCallback, type FC, type SetStateAction } from 'react'; import { useIntl } from 'react-intl'; -import { Heading, type HeadingProps, PlusMinus } from '../../atoms'; +import { Heading, type HeadingProps, Icon } from '../../atoms'; import styles from './heading-button.module.scss'; export type HeadingButtonProps = Pick & { @@ -61,7 +61,7 @@ export const HeadingButton: FC = ({ {titlePrefix} {title} - + ); }; diff --git a/src/components/molecules/forms/flipping-label/flipping-label.module.scss b/src/components/molecules/forms/flipping-label/flipping-label.module.scss index 88ef3ec..4e7947f 100644 --- a/src/components/molecules/forms/flipping-label/flipping-label.module.scss +++ b/src/components/molecules/forms/flipping-label/flipping-label.module.scss @@ -28,8 +28,6 @@ } .wrapper { - --icon-size: 60%; - display: flex; place-content: center; place-items: center; diff --git a/src/components/molecules/forms/flipping-label/flipping-label.stories.tsx b/src/components/molecules/forms/flipping-label/flipping-label.stories.tsx index 3ad3529..bf5724e 100644 --- a/src/components/molecules/forms/flipping-label/flipping-label.stories.tsx +++ b/src/components/molecules/forms/flipping-label/flipping-label.stories.tsx @@ -1,6 +1,6 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { useState } from 'react'; -import { MagnifyingGlass } from '../../../atoms'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { useCallback, useState } from 'react'; +import { Icon } from '../../../atoms'; import { FlippingLabel } from './flipping-label'; export default { @@ -75,22 +75,23 @@ const Template: ComponentStory = ({ ...args }) => { const [active, setActive] = useState(isActive); + const updateState = useCallback(() => setActive((prev) => !prev), []); return ( -
setActive(!active)}> - -
+ ); }; export const Active = Template.bind({}); Active.args = { - children: , + children: , isActive: true, }; export const Inactive = Template.bind({}); Inactive.args = { - children: , + children: , isActive: false, }; diff --git a/src/components/molecules/forms/flipping-label/flipping-label.tsx b/src/components/molecules/forms/flipping-label/flipping-label.tsx index 3e23915..e9d6a10 100644 --- a/src/components/molecules/forms/flipping-label/flipping-label.tsx +++ b/src/components/molecules/forms/flipping-label/flipping-label.tsx @@ -1,5 +1,5 @@ -import { FC } from 'react'; -import { Close, Label, type LabelProps } from '../../../atoms'; +import type { FC } from 'react'; +import { Icon, Label, type LabelProps } from '../../../atoms'; import styles from './flipping-label.module.scss'; export type FlippingLabelProps = Pick< @@ -29,7 +29,7 @@ export const FlippingLabel: FC = ({ {children} - + diff --git a/src/components/molecules/nav/nav-list.stories.tsx b/src/components/molecules/nav/nav-list.stories.tsx index 110a6ca..baaa8df 100644 --- a/src/components/molecules/nav/nav-list.stories.tsx +++ b/src/components/molecules/nav/nav-list.stories.tsx @@ -1,5 +1,5 @@ import type { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Envelop, Home } from '../../atoms'; +import { Icon } from '../../atoms'; import { NavList, type NavItem } from './nav-list'; /** @@ -78,8 +78,13 @@ const Template: ComponentStory = (args) => ( ); const MainNavItems: NavItem[] = [ - { id: 'homeLink', href: '/', label: 'Home', logo: }, - { id: 'contactLink', href: '/contact', label: 'Contact', logo: }, + { id: 'homeLink', href: '/', label: 'Home', logo: }, + { + id: 'contactLink', + href: '/contact', + label: 'Contact', + logo: , + }, ]; const FooterNavItems: NavItem[] = [ diff --git a/src/components/molecules/nav/nav-list.test.tsx b/src/components/molecules/nav/nav-list.test.tsx index 58437cb..8524e22 100644 --- a/src/components/molecules/nav/nav-list.test.tsx +++ b/src/components/molecules/nav/nav-list.test.tsx @@ -1,11 +1,16 @@ import { describe, expect, it } from '@jest/globals'; import { render, screen as rtlScreen } from '../../../../tests/utils'; -import { Envelop, Home } from '../../atoms'; +import { Icon } from '../../atoms'; import { NavList, type NavItem } from './nav-list'; const navItems: NavItem[] = [ - { id: 'homeLink', href: '/', label: 'Home', logo: }, - { id: 'contactLink', href: '/contact', label: 'Contact', logo: }, + { id: 'homeLink', href: '/', label: 'Home', logo: }, + { + id: 'contactLink', + href: '/contact', + label: 'Contact', + logo: , + }, ]; describe('Nav', () => { diff --git a/src/components/organisms/forms/prism-theme-toggle/prism-theme-toggle.tsx b/src/components/organisms/forms/prism-theme-toggle/prism-theme-toggle.tsx index 0e1649b..2b0a179 100644 --- a/src/components/organisms/forms/prism-theme-toggle/prism-theme-toggle.tsx +++ b/src/components/organisms/forms/prism-theme-toggle/prism-theme-toggle.tsx @@ -1,8 +1,12 @@ -import { ChangeEvent, FC } from 'react'; +import { useCallback, type ChangeEvent, type FC } from 'react'; import { useIntl } from 'react-intl'; import { type PrismTheme, usePrismTheme } from '../../../../utils/providers'; -import { Legend, Moon, Sun } from '../../../atoms'; -import { Switch, SwitchOption, SwitchProps } from '../../../molecules'; +import { Icon, Legend } from '../../../atoms'; +import { + Switch, + type SwitchOption, + type SwitchProps, +} from '../../../molecules'; export type PrismThemeToggleProps = Omit< SwitchProps, @@ -28,9 +32,12 @@ export const PrismThemeToggle: FC = (props) => { return prismTheme === 'dark'; }; - const updateTheme = (e: ChangeEvent) => { - setTheme(e.target.value === 'light' ? 'light' : 'dark'); - }; + const updateTheme = useCallback( + (e: ChangeEvent) => { + setTheme(e.target.value === 'light' ? 'light' : 'dark'); + }, + [setTheme] + ); const themeLabel = intl.formatMessage({ defaultMessage: 'Code blocks:', @@ -54,7 +61,7 @@ export const PrismThemeToggle: FC = (props) => { label: ( <> {lightThemeLabel} - + ), value: 'light', @@ -64,7 +71,7 @@ export const PrismThemeToggle: FC = (props) => { label: ( <> {darkThemeLabel} - + ), value: 'dark', diff --git a/src/components/organisms/forms/search-form/search-form.tsx b/src/components/organisms/forms/search-form/search-form.tsx index 826e6c8..1dcbb8c 100644 --- a/src/components/organisms/forms/search-form/search-form.tsx +++ b/src/components/organisms/forms/search-form/search-form.tsx @@ -1,14 +1,15 @@ import { useRouter } from 'next/router'; import { - ChangeEvent, - FormEvent, + type ChangeEvent, + type FormEvent, forwardRef, - ForwardRefRenderFunction, + type ForwardRefRenderFunction, useId, useState, + useCallback, } from 'react'; import { useIntl } from 'react-intl'; -import { Button, Form, Input, Label, MagnifyingGlass } from '../../../atoms'; +import { Button, Form, Icon, Input, Label } from '../../../atoms'; import { LabelledField } from '../../../molecules'; import styles from './search-form.module.scss'; @@ -44,15 +45,18 @@ const SearchFormWithRef: ForwardRefRenderFunction< const router = useRouter(); const [value, setValue] = useState(''); - const submitHandler = (e: FormEvent) => { - e.preventDefault(); - router.push({ pathname: searchPage, query: { s: value } }); - setValue(''); - }; + const submitHandler = useCallback( + (e: FormEvent) => { + e.preventDefault(); + router.push({ pathname: searchPage, query: { s: value } }); + setValue(''); + }, + [router, searchPage, value] + ); - const updateForm = (e: ChangeEvent) => { + const updateForm = useCallback((e: ChangeEvent) => { setValue(e.target.value); - }; + }, []); const id = useId(); @@ -84,7 +88,7 @@ const SearchFormWithRef: ForwardRefRenderFunction< shape="initial" type="submit" > - + ); diff --git a/src/components/organisms/forms/theme-toggle/theme-toggle.tsx b/src/components/organisms/forms/theme-toggle/theme-toggle.tsx index da303d3..6026e1c 100644 --- a/src/components/organisms/forms/theme-toggle/theme-toggle.tsx +++ b/src/components/organisms/forms/theme-toggle/theme-toggle.tsx @@ -1,8 +1,12 @@ import { useTheme } from 'next-themes'; -import { ChangeEvent, FC } from 'react'; +import { useCallback, type ChangeEvent, type FC } from 'react'; import { useIntl } from 'react-intl'; -import { Legend, Moon, Sun } from '../../../atoms'; -import { Switch, SwitchOption, SwitchProps } from '../../../molecules'; +import { Icon, Legend } from '../../../atoms'; +import { + Switch, + type SwitchOption, + type SwitchProps, +} from '../../../molecules'; export type ThemeToggleProps = Omit< SwitchProps, @@ -19,9 +23,12 @@ export const ThemeToggle: FC = (props) => { const { resolvedTheme, setTheme } = useTheme(); const isDarkTheme = resolvedTheme === 'dark'; - const updateTheme = (e: ChangeEvent) => { - setTheme(e.target.value === 'light' ? 'light' : 'dark'); - }; + const updateTheme = useCallback( + (e: ChangeEvent) => { + setTheme(e.target.value === 'light' ? 'light' : 'dark'); + }, + [setTheme] + ); const themeLabel = intl.formatMessage({ defaultMessage: 'Theme:', @@ -45,7 +52,7 @@ export const ThemeToggle: FC = (props) => { label: ( <> {lightThemeLabel} - + ), value: 'light', @@ -55,7 +62,7 @@ export const ThemeToggle: FC = (props) => { label: ( <> {darkThemeLabel} - + ), value: 'dark', diff --git a/src/components/organisms/layout/summary.module.scss b/src/components/organisms/layout/summary.module.scss index 9530312..5052f73 100644 --- a/src/components/organisms/layout/summary.module.scss +++ b/src/components/organisms/layout/summary.module.scss @@ -13,7 +13,8 @@ padding: var(--spacing-sm) var(--spacing-sm) var(--spacing-md); border: fun.convert-px(1) solid var(--color-primary-dark); border-radius: fun.convert-px(3); - box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) 0 + box-shadow: + fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) 0 var(--color-shadow), fun.convert-px(3) fun.convert-px(3) fun.convert-px(3) fun.convert-px(-1) var(--color-shadow-light), @@ -29,8 +30,6 @@ &:hover { .icon { - --icon-size: #{fun.convert-px(35)}; - :global { animation: pulse 1.5s ease-in-out 0.2s infinite; } diff --git a/src/components/organisms/layout/summary.tsx b/src/components/organisms/layout/summary.tsx index e7a5d48..99f6c85 100644 --- a/src/components/organisms/layout/summary.tsx +++ b/src/components/organisms/layout/summary.tsx @@ -3,10 +3,10 @@ import { useIntl } from 'react-intl'; import type { Article, Meta as MetaType } from '../../../types'; import { useReadingTime } from '../../../utils/hooks'; import { - Arrow, ButtonLink, Heading, type HeadingLevel, + Icon, Link, } from '../../atoms'; import { @@ -123,11 +123,13 @@ export const Summary: FC = ({ <> {readMore} - diff --git a/src/components/organisms/modals/settings-modal.module.scss b/src/components/organisms/modals/settings-modal.module.scss index 95626ab..6576cf5 100644 --- a/src/components/organisms/modals/settings-modal.module.scss +++ b/src/components/organisms/modals/settings-modal.module.scss @@ -30,7 +30,5 @@ } .icon { - --icon-size: #{fun.convert-px(30)}; - margin-right: var(--spacing-2xs); } diff --git a/src/components/organisms/modals/settings-modal.tsx b/src/components/organisms/modals/settings-modal.tsx index bb3d886..5a53bbd 100644 --- a/src/components/organisms/modals/settings-modal.tsx +++ b/src/components/organisms/modals/settings-modal.tsx @@ -1,6 +1,6 @@ -import { FC } from 'react'; +import { useCallback, type FC, type FormEvent } from 'react'; import { useIntl } from 'react-intl'; -import { Cog, Form, Heading, Modal, type ModalProps } from '../../atoms'; +import { Form, Heading, Icon, Modal, type ModalProps } from '../../atoms'; import { AckeeToggle, type AckeeToggleProps, @@ -8,7 +8,7 @@ import { type MotionToggleProps, PrismThemeToggle, ThemeToggle, -} from '../../organisms'; +} from '../forms'; import styles from './settings-modal.module.scss'; export type SettingsModalProps = Pick & { @@ -44,12 +44,16 @@ export const SettingsModal: FC = ({ description: 'SettingsModal: an accessible form name', }); + const submitHandler = useCallback((e: FormEvent) => { + e.preventDefault(); + }, []); + return ( - + {title} } @@ -57,7 +61,7 @@ export const SettingsModal: FC = ({
null} + onSubmit={submitHandler} > diff --git a/src/components/organisms/toolbar/main-nav.tsx b/src/components/organisms/toolbar/main-nav.tsx index 6933c44..7f03577 100644 --- a/src/components/organisms/toolbar/main-nav.tsx +++ b/src/components/organisms/toolbar/main-nav.tsx @@ -1,11 +1,6 @@ import { forwardRef, type ForwardRefRenderFunction } from 'react'; import { useIntl } from 'react-intl'; -import { - BooleanField, - type BooleanFieldProps, - Hamburger, - Label, -} from '../../atoms'; +import { BooleanField, type BooleanFieldProps, Icon, Label } from '../../atoms'; import { NavList, type NavListProps, type NavItem } from '../../molecules'; import mainNavStyles from './main-nav.module.scss'; import sharedStyles from './toolbar-items.module.scss'; @@ -62,7 +57,7 @@ const MainNavWithRef: ForwardRefRenderFunction = ( className={`${sharedStyles.label} ${mainNavStyles.label}`} htmlFor="main-nav-button" > - + = ( htmlFor="search-button" isActive={isActive} > - + - + = ({ description: 'Layout: noscript message', id: '7jVUT6', }); + const copyrightTitle = intl.formatMessage({ + defaultMessage: 'CC BY SA', + description: 'Layout: copyright title', + id: 'yB1SPF', + }); const copyrightData = { dates: { @@ -89,7 +84,7 @@ export const Layout: FC = ({ end: copyright.end, }, owner: name, - icon: , + icon: , }; const homeLabel = intl.formatMessage({ @@ -123,31 +118,31 @@ export const Layout: FC = ({ id: 'home', label: homeLabel, href: '/', - logo: , + logo: , }, { id: 'blog', label: blogLabel, href: ROUTES.BLOG, - logo: , + logo: , }, { id: 'projects', label: projectsLabel, href: ROUTES.PROJECTS, - logo: , + logo: , }, { id: 'cv', label: cvLabel, href: ROUTES.CV, - logo: , + logo: , }, { id: 'contact', label: contactLabel, href: ROUTES.CONTACT, - logo: , + logo: , }, ]; diff --git a/src/i18n/en.json b/src/i18n/en.json index fd46201..d8a982d 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -411,10 +411,6 @@ "defaultMessage": "Sidebar", "description": "PageLayout: accessible name for the sidebar" }, - "cl7YNU": { - "defaultMessage": "CC BY SA", - "description": "CCBySA: icon title" - }, "dDK5oc": { "defaultMessage": "{website} picture", "description": "Branding: photo alternative text" @@ -627,6 +623,10 @@ "defaultMessage": "Sending mail...", "description": "ContactForm: spinner message on submit" }, + "yB1SPF": { + "defaultMessage": "CC BY SA", + "description": "Layout: copyright title" + }, "yE/Jdz": { "defaultMessage": "You are here:", "description": "Pagination: current page indication" diff --git a/src/i18n/fr.json b/src/i18n/fr.json index f951413..d64c930 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -411,10 +411,6 @@ "defaultMessage": "Barre latérale", "description": "PageLayout: accessible name for the sidebar" }, - "cl7YNU": { - "defaultMessage": "CC BY SA", - "description": "CCBySA: icon title" - }, "dDK5oc": { "defaultMessage": "Photo d’{website}", "description": "Branding: photo alternative text" @@ -627,6 +623,10 @@ "defaultMessage": "Mail en cours d’envoi…", "description": "ContactForm: spinner message on submit" }, + "yB1SPF": { + "defaultMessage": "CC BY SA", + "description": "Layout: copyright title" + }, "yE/Jdz": { "defaultMessage": "Vous êtes ici :", "description": "Pagination: current page indication" diff --git a/src/pages/index.tsx b/src/pages/index.tsx index d99462f..662ae81 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -4,7 +4,6 @@ import Head from 'next/head'; import Script from 'next/script'; import type { FC, HTMLAttributes } from 'react'; import { useIntl } from 'react-intl'; -import FeedIcon from '../assets/images/icon-feed.svg'; import { ButtonLink, CardsList, @@ -12,8 +11,8 @@ import { Column, Columns, type ColumnsProps, - Envelop, getLayout, + Icon, List, type ListItem, ResponsiveImage, @@ -236,13 +235,12 @@ const ShaarliLink: FC = () => { */ const MoreLinks: FC = () => { const intl = useIntl(); - const feedIconClass = `${styles.icon} ${styles['icon--feed']}`; const links: ListItem[] = [ { id: 'contact-me', value: ( - + {intl.formatMessage({ defaultMessage: 'Contact me', description: 'HomePage: contact button text', @@ -255,7 +253,7 @@ const MoreLinks: FC = () => { id: 'rss-feed', value: ( - + {intl.formatMessage({ defaultMessage: 'Subscribe', description: 'HomePage: RSS feed subscription text', diff --git a/src/styles/abstracts/_variables.scss b/src/styles/abstracts/_variables.scss index d56ba18..49e8e26 100644 --- a/src/styles/abstracts/_variables.scss +++ b/src/styles/abstracts/_variables.scss @@ -120,6 +120,43 @@ $font-sizes: (); @return map.get($font-sizes, $key); } +//============================================================================ +// Icons +//============================================================================ + +$icon_ratio: get-ratio("perfect-fourth"); +$icon-size_base: fun.convert-px(32); + +$icon-size_levels: "xs", "sm", "md", "lg", "xl"; + +// We start with xs icon, so it needs to be less than the base. +$icon-size_current: math.div($icon-size_base, $icon_ratio * 2); + +/// Icons map ('sm', 'md', 'lg'...) +/// @prop {String} keys - Size as key is mapped to a given icon +/// @prop {Map} value - Value is actual icon +$icon-sizes: (); + +/// We fill our icon-sizes map. +@each $level in $icon-size_levels { + $icon-size_current: $icon-size_current * $icon_ratio; + $icon-sizes: map.merge( + $icon-sizes, + ( + $level: $icon-size_current, + ) + ); +} + +// We cannot declare this function with others functions due to module loop. + +/// Get icon-size. +/// @param {String} $name - Icon size ('sm', 'md', 'lg'...). +/// @return {Integer} The icon value. +@function icon-size($key) { + @return map.get($icon-sizes, $key); +} + //============================================================================ // Spacings //============================================================================ diff --git a/src/styles/base/_icons.scss b/src/styles/base/_icons.scss new file mode 100644 index 0000000..16fdd4a --- /dev/null +++ b/src/styles/base/_icons.scss @@ -0,0 +1,10 @@ +@use "sass:math"; +@use "../abstracts/variables" as var; + +:root { + --icon-size-xs: #{var.icon-size("xs")}; + --icon-size-sm: #{var.icon-size("sm")}; + --icon-size-md: #{var.icon-size("md")}; + --icon-size-lg: #{var.icon-size("lg")}; + --icon-size-xl: #{var.icon-size("xl")}; +} diff --git a/src/styles/globals.scss b/src/styles/globals.scss index 8ece909..8cf7296 100644 --- a/src/styles/globals.scss +++ b/src/styles/globals.scss @@ -17,6 +17,7 @@ @use "base/colors"; @use "base/fonts"; @use "base/helpers"; +@use "base/icons"; @use "base/spacings"; @use "base/typography"; diff --git a/src/styles/pages/home.module.scss b/src/styles/pages/home.module.scss index 59c8c6f..a926ec3 100644 --- a/src/styles/pages/home.module.scss +++ b/src/styles/pages/home.module.scss @@ -26,8 +26,6 @@ } .icon { - --icon-size: #{fun.convert-px(20)}; - margin-right: var(--spacing-2xs); &--feed { -- cgit v1.2.3