fix(client): profile consistency (#56720)

Co-authored-by: ahmad abdolsaheb <ahmad.abdolsaheb@gmail.com>
This commit is contained in:
Sem Bauke
2024-12-06 20:52:35 +01:00
committed by GitHub
parent 33f7b85f4e
commit 879c45d008
13 changed files with 1005 additions and 950 deletions
@@ -346,6 +346,7 @@
"donated": "Donated to the community",
"projects": "Projects",
"stats": "Stats",
"activity": "Activity",
"timeline": "Timeline",
"none-completed": "No challenges have been completed yet.",
"get-started": "Get started here.",
@@ -21,95 +21,145 @@ exports[`<Profile/> renders correctly 1`] = `
class=" min-h-[1px] px-[15px] w-full md:w-2/3 md:ml-[16.6%] "
>
<div
class="avatar-camper"
class="h-[90px]"
/>
<section
class="card card-header"
>
<div
class="avatar-container default-border"
class="avatar-camper"
>
<span
class="sr-only"
<div
class="avatar-container default-border"
>
buttons.profile
</span>
<svg
aria-hidden="true"
class="avatar"
height="500px"
version="1.1"
viewBox="0 0 500 500"
width="500px"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>
icons.avatar
</title>
<desc>
icons.avatar-2
</desc>
<g
fill="none"
fill-rule="evenodd"
<span
class="sr-only"
>
buttons.profile
</span>
<svg
aria-hidden="true"
class="avatar"
height="500px"
version="1.1"
viewBox="0 0 500 500"
width="500px"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>
icons.avatar
</title>
<desc>
icons.avatar-2
</desc>
<g
id="g"
fill="none"
fill-rule="evenodd"
>
<rect
fill="#D0D0D5"
height="500"
width="500"
/>
<path
d="m251.34 49c23.859 58.47 34.222 90.121 31.088 94.954-4.701 7.2493-15.381 32.924 0 50.968s77.487 6.439 92.029 23.897c14.542 17.458 12.196 68.184 14.542 135.56-22.154 0.54208-68.154 1.0837-138 1.6248l0.062-56h-0.124l0.062 56c-69.846-0.54109-115.85-1.0827-138-1.6248 2.3463-67.372 0-118.1 14.542-135.56 14.542-17.458 76.649-5.852 92.029-23.897s4.701-43.719 0-50.968c-3.134-4.8329 7.2285-36.484 31.088-94.954l0.13247 120h0.415z"
fill="#242440"
/>
<path
d="m250.13 185c47.577 0 66.872-66.034 66.872-90.434 0-42.286-29.773-76.566-66.5-76.566s-66.5 34.28-66.5 76.566c0 24.7 18.552 90.434 66.128 90.434z"
fill="#242440"
id="c"
stroke="#D0D0D5"
stroke-width="17"
/>
<path
d="m77.011 459c-19.341-119.95-29.011-183.79-29.011-191.53 0-11.605 6.2167-16.473 17.298-16.473h370.4c11.082 0 17.298 4.8681 17.298 16.473 0 7.7366-9.6704 71.579-29.011 191.53z"
fill="#5F5F8C"
stroke="#D0D0D5"
stroke-width="16"
/>
<rect
fill="#5F5F8C"
height="23"
stroke="#D0D0D5"
stroke-width="6"
width="339"
x="81"
y="459"
/>
<g
fill-rule="nonzero"
transform="translate(162 283)"
id="g"
>
<ellipse
cx="88.5"
cy="79"
fill="#0A0A23"
rx="88.5"
ry="79"
<rect
fill="#D0D0D5"
height="500"
width="500"
/>
<path
d="m251.34 49c23.859 58.47 34.222 90.121 31.088 94.954-4.701 7.2493-15.381 32.924 0 50.968s77.487 6.439 92.029 23.897c14.542 17.458 12.196 68.184 14.542 135.56-22.154 0.54208-68.154 1.0837-138 1.6248l0.062-56h-0.124l0.062 56c-69.846-0.54109-115.85-1.0827-138-1.6248 2.3463-67.372 0-118.1 14.542-135.56 14.542-17.458 76.649-5.852 92.029-23.897s4.701-43.719 0-50.968c-3.134-4.8329 7.2285-36.484 31.088-94.954l0.13247 120h0.415z"
fill="#242440"
/>
<path
d="m250.13 185c47.577 0 66.872-66.034 66.872-90.434 0-42.286-29.773-76.566-66.5-76.566s-66.5 34.28-66.5 76.566c0 24.7 18.552 90.434 66.128 90.434z"
fill="#242440"
id="c"
stroke="#D0D0D5"
stroke-width="17"
/>
<path
d="m77.011 459c-19.341-119.95-29.011-183.79-29.011-191.53 0-11.605 6.2167-16.473 17.298-16.473h370.4c11.082 0 17.298 4.8681 17.298 16.473 0 7.7366-9.6704 71.579-29.011 191.53z"
fill="#5F5F8C"
stroke="#D0D0D5"
stroke-width="16"
/>
<rect
fill="#5F5F8C"
height="23"
stroke="#D0D0D5"
stroke-width="6"
width="339"
x="81"
y="459"
/>
<g
transform="translate(20 40)"
fill-rule="nonzero"
transform="translate(162 283)"
>
<ellipse
cx="88.5"
cy="79"
fill="#0A0A23"
rx="88.5"
ry="79"
/>
<g
id="Group"
transform="translate(42.462 4)"
transform="translate(20 40)"
>
<g
id="Group"
transform="translate(42.462 4)"
>
<g
fill="#fff"
id="e"
>
<path
d="m38.312 39.042c-3.9186-0.91476 12.174-18.263-16.43-39.034 0 0 3.7555 10.879-15.169 35.157-18.933 24.27 8.418 38.725 8.418 38.725s-12.834-6.24 2.0846-28.459c2.6734-4.0329 6.1663-7.6847 10.507-15.899 0 0 3.839 4.9441 1.834 15.671-2.9996 16.208 13.005 11.569 13.256 11.794 5.5895 6.0077-4.6307 16.564-5.2513 16.894-0.62061 0.32307 29.185-16.36 8.0083-41.469-1.4521 1.325-3.3338 7.5359-7.2564 6.6212z"
id="i"
/>
</g>
<g
fill="#000"
fill-opacity="0"
stroke="#000"
stroke-opacity="0"
>
<path
d="m38.312 39.042c-3.9186-0.91476 12.174-18.263-16.43-39.034 0 0 3.7555 10.879-15.169 35.157-18.933 24.27 8.418 38.725 8.418 38.725s-12.834-6.24 2.0846-28.459c2.6734-4.0329 6.1663-7.6847 10.507-15.899 0 0 3.839 4.9441 1.834 15.671-2.9996 16.208 13.005 11.569 13.256 11.794 5.5895 6.0077-4.6307 16.564-5.2513 16.894-0.62061 0.32307 29.185-16.36 8.0083-41.469-1.4521 1.325-3.3338 7.5359-7.2564 6.6212z"
/>
</g>
</g>
<g
id="b"
transform="translate(110.13)"
>
<g
fill="#fff"
id="d"
>
<path
d="m0.96996 0.62339c-0.47786 0.41439-0.95166 1.0162-0.95166 1.6215-0.0040664 1.045 1.3846 2.4611 3.9577 4.7889 10.713 9.1022 16.104 20.251 16.068 33.692-0.040843 14.875-5.7099 26.82-16.729 36.077-2.3158 1.8305-3.2674 3.2647-3.2715 4.4935 0 0.60537 0.4697 1.2324 0.94347 1.8341 0.44519 0.4216 1.3927 0.83962 2.0748 0.83962 2.5486 0.0071777 6.1183-2.6521 10.774-7.8266 9.0712-9.8085 13.172-20.64 13.401-35.4 0.21238-14.77-5.0319-24.784-15.308-35.126-3.6963-3.6935-6.7759-5.6141-8.8834-5.6177-0.68208 0-1.3927 0.20539-2.0748 0.62339z"
id="a"
/>
</g>
<g
fill="#000"
fill-opacity="0"
stroke="#000"
stroke-opacity="0"
>
<path
d="m0.96996 0.62339c-0.47786 0.41439-0.95166 1.0162-0.95166 1.6215-0.0040664 1.045 1.3846 2.4611 3.9577 4.7889 10.713 9.1022 16.104 20.251 16.068 33.692-0.040843 14.875-5.7099 26.82-16.729 36.077-2.3158 1.8305-3.2674 3.2647-3.2715 4.4935 0 0.60537 0.4697 1.2324 0.94347 1.8341 0.44519 0.4216 1.3927 0.83962 2.0748 0.83962 2.5486 0.0071777 6.1183-2.6521 10.774-7.8266 9.0712-9.8085 13.172-20.64 13.401-35.4 0.21238-14.77-5.0319-24.784-15.308-35.126-3.6963-3.6935-6.7759-5.6141-8.8834-5.6177-0.68208 0-1.3927 0.20539-2.0748 0.62339z"
/>
</g>
</g>
<g
fill="#fff"
id="e"
id="h"
>
<path
d="m38.312 39.042c-3.9186-0.91476 12.174-18.263-16.43-39.034 0 0 3.7555 10.879-15.169 35.157-18.933 24.27 8.418 38.725 8.418 38.725s-12.834-6.24 2.0846-28.459c2.6734-4.0329 6.1663-7.6847 10.507-15.899 0 0 3.839 4.9441 1.834 15.671-2.9996 16.208 13.005 11.569 13.256 11.794 5.5895 6.0077-4.6307 16.564-5.2513 16.894-0.62061 0.32307 29.185-16.36 8.0083-41.469-1.4521 1.325-3.3338 7.5359-7.2564 6.6212z"
id="i"
d="m26.367 0.6342c0.47409 0.41439 0.9482 1.0162 0.9482 1.6215 0.004069 1.045-1.3855 2.4611-3.9603 4.7889-10.72 9.1022-16.111 20.251-16.078 33.692 0.04087 14.875 5.7136 26.82 16.74 36.077 2.3173 1.8305 3.2696 3.2647 3.2737 4.4935 0 0.60537-0.47001 1.2324-0.9441 1.8341-0.44548 0.4216-1.3896 0.83962-2.0762 0.83962-2.5503 0.0071777-6.1223-2.6521-10.782-7.8266-9.0773-9.8085-13.181-20.64-13.409-35.4-0.21252-14.77 5.0352-24.784 15.318-35.126 3.6987-3.6935 6.7844-5.6141 8.8892-5.6177 0.68253 0 1.3937 0.20539 2.0803 0.62339z"
id="f"
/>
</g>
<g
@@ -119,176 +169,132 @@ exports[`<Profile/> renders correctly 1`] = `
stroke-opacity="0"
>
<path
d="m38.312 39.042c-3.9186-0.91476 12.174-18.263-16.43-39.034 0 0 3.7555 10.879-15.169 35.157-18.933 24.27 8.418 38.725 8.418 38.725s-12.834-6.24 2.0846-28.459c2.6734-4.0329 6.1663-7.6847 10.507-15.899 0 0 3.839 4.9441 1.834 15.671-2.9996 16.208 13.005 11.569 13.256 11.794 5.5895 6.0077-4.6307 16.564-5.2513 16.894-0.62061 0.32307 29.185-16.36 8.0083-41.469-1.4521 1.325-3.3338 7.5359-7.2564 6.6212z"
d="m26.367 0.6342c0.47409 0.41439 0.9482 1.0162 0.9482 1.6215 0.004069 1.045-1.3855 2.4611-3.9603 4.7889-10.72 9.1022-16.111 20.251-16.078 33.692 0.04087 14.875 5.7136 26.82 16.74 36.077 2.3173 1.8305 3.2696 3.2647 3.2737 4.4935 0 0.60537-0.47001 1.2324-0.9441 1.8341-0.44548 0.4216-1.3896 0.83962-2.0762 0.83962-2.5503 0.0071777-6.1223-2.6521-10.782-7.8266-9.0773-9.8085-13.181-20.64-13.409-35.4-0.21252-14.77 5.0352-24.784 15.318-35.126 3.6987-3.6935 6.7844-5.6141 8.8892-5.6177 0.68253 0 1.3937 0.20539 2.0803 0.62339z"
/>
</g>
</g>
<g
id="b"
transform="translate(110.13)"
>
<g
fill="#fff"
id="d"
>
<path
d="m0.96996 0.62339c-0.47786 0.41439-0.95166 1.0162-0.95166 1.6215-0.0040664 1.045 1.3846 2.4611 3.9577 4.7889 10.713 9.1022 16.104 20.251 16.068 33.692-0.040843 14.875-5.7099 26.82-16.729 36.077-2.3158 1.8305-3.2674 3.2647-3.2715 4.4935 0 0.60537 0.4697 1.2324 0.94347 1.8341 0.44519 0.4216 1.3927 0.83962 2.0748 0.83962 2.5486 0.0071777 6.1183-2.6521 10.774-7.8266 9.0712-9.8085 13.172-20.64 13.401-35.4 0.21238-14.77-5.0319-24.784-15.308-35.126-3.6963-3.6935-6.7759-5.6141-8.8834-5.6177-0.68208 0-1.3927 0.20539-2.0748 0.62339z"
id="a"
/>
</g>
<g
fill="#000"
fill-opacity="0"
stroke="#000"
stroke-opacity="0"
>
<path
d="m0.96996 0.62339c-0.47786 0.41439-0.95166 1.0162-0.95166 1.6215-0.0040664 1.045 1.3846 2.4611 3.9577 4.7889 10.713 9.1022 16.104 20.251 16.068 33.692-0.040843 14.875-5.7099 26.82-16.729 36.077-2.3158 1.8305-3.2674 3.2647-3.2715 4.4935 0 0.60537 0.4697 1.2324 0.94347 1.8341 0.44519 0.4216 1.3927 0.83962 2.0748 0.83962 2.5486 0.0071777 6.1183-2.6521 10.774-7.8266 9.0712-9.8085 13.172-20.64 13.401-35.4 0.21238-14.77-5.0319-24.784-15.308-35.126-3.6963-3.6935-6.7759-5.6141-8.8834-5.6177-0.68208 0-1.3927 0.20539-2.0748 0.62339z"
/>
</g>
</g>
<g
fill="#fff"
id="h"
>
<path
d="m26.367 0.6342c0.47409 0.41439 0.9482 1.0162 0.9482 1.6215 0.004069 1.045-1.3855 2.4611-3.9603 4.7889-10.72 9.1022-16.111 20.251-16.078 33.692 0.04087 14.875 5.7136 26.82 16.74 36.077 2.3173 1.8305 3.2696 3.2647 3.2737 4.4935 0 0.60537-0.47001 1.2324-0.9441 1.8341-0.44548 0.4216-1.3896 0.83962-2.0762 0.83962-2.5503 0.0071777-6.1223-2.6521-10.782-7.8266-9.0773-9.8085-13.181-20.64-13.409-35.4-0.21252-14.77 5.0352-24.784 15.318-35.126 3.6987-3.6935 6.7844-5.6141 8.8892-5.6177 0.68253 0 1.3937 0.20539 2.0803 0.62339z"
id="f"
/>
</g>
<g
fill="#000"
fill-opacity="0"
stroke="#000"
stroke-opacity="0"
>
<path
d="m26.367 0.6342c0.47409 0.41439 0.9482 1.0162 0.9482 1.6215 0.004069 1.045-1.3855 2.4611-3.9603 4.7889-10.72 9.1022-16.111 20.251-16.078 33.692 0.04087 14.875 5.7136 26.82 16.74 36.077 2.3173 1.8305 3.2696 3.2647 3.2737 4.4935 0 0.60537-0.47001 1.2324-0.9441 1.8341-0.44548 0.4216-1.3896 0.83962-2.0762 0.83962-2.5503 0.0071777-6.1223-2.6521-10.782-7.8266-9.0773-9.8085-13.181-20.64-13.409-35.4-0.21252-14.77 5.0352-24.784 15.318-35.126 3.6987-3.6935 6.7844-5.6141 8.8892-5.6177 0.68253 0 1.3937 0.20539 2.0803 0.62339z"
/>
</g>
</g>
</g>
</g>
</g>
</svg>
</svg>
</div>
</div>
</div>
<div
class="profile-edit-container"
>
<h1>
@
string
</h1>
</div>
<div
class="h-[10px]"
/>
<div
class="profile-meta-container"
>
</div>
<div
class="mx-[-15px] "
>
<div
class="social-icons-row min-h-[1px] px-[15px] "
class="profile-edit-container"
>
<a
aria-label="aria.linkedin"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-linkedin fa-2x "
data-icon="linkedin"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"
fill="currentColor"
/>
</svg>
</a>
<a
aria-label="aria.github"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-github fa-2x "
data-icon="github"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 496 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
fill="currentColor"
/>
</svg>
</a>
<a
aria-label="aria.website"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-link fa-2x "
data-icon="link"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"
fill="currentColor"
/>
</svg>
</a>
<a
aria-label="aria.twitter"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-x-twitter fa-2x "
data-icon="x-twitter"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"
fill="currentColor"
/>
</svg>
</a>
<h1>
@
string
</h1>
</div>
</div>
<hr />
<div
class="h-[20px]"
/>
<div
class="profile-meta-container"
>
</div>
<div
class="mx-[-15px] "
>
<div
class="social-icons-row min-h-[1px] px-[15px] "
>
<a
aria-label="aria.linkedin"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-linkedin fa-2x "
data-icon="linkedin"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"
fill="currentColor"
/>
</svg>
</a>
<a
aria-label="aria.github"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-github fa-2x "
data-icon="github"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 496 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
fill="currentColor"
/>
</svg>
</a>
<a
aria-label="aria.website"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-link fa-2x "
data-icon="link"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"
fill="currentColor"
/>
</svg>
</a>
<a
aria-label="aria.twitter"
href="string"
rel="noopener noreferrer"
target="_blank"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-x-twitter fa-2x "
data-icon="x-twitter"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"
fill="currentColor"
/>
</svg>
</a>
</div>
</div>
</section>
</div>
</div>
</div>
@@ -7,441 +7,445 @@ exports[`should check certification page consistency 1`] = `
<div
className=" min-h-[1px] px-[15px] w-full md:w-2/3 md:ml-[16.6%] "
>
<h2>
profile.timeline
</h2>
<div
className="h-[10px]"
/>
<table
className="table-auto w-full max-w-full border-collapse text-start text-foreground-tertiary [&_th]:font-normal [&_td]:p-1 [&_th]:p-1 [&>tbody>tr:nth-of-type(odd)]:bg-background-tertiary"
<section
className="card"
>
<thead>
<tr>
<th>
profile.challenge
</th>
<th>
settings.labels.solution
</th>
<th
className="text-center"
>
profile.completed
</th>
</tr>
</thead>
<tbody>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/2022/responsive-web-design/learn-accessibility-by-building-a-quiz/step-41"
>
Step 41
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-number-guessing-game-project/build-a-number-guessing-game"
>
Build a Number Guessing Game
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-periodic-table-database-project/build-a-periodic-table-database"
>
Build a Periodic Table Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object"
>
Build an SQL Reference Object
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-nano-by-building-a-castle/build-a-castle"
>
Build a Castle
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler"
>
Build a Salon Appointment Scheduler
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop"
>
Build a Bike Rental Shop
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator"
>
Build a Kitty Ipsum Translator
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-world-cup-database-project/build-a-world-cup-database"
>
Build a World Cup Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2"
>
Build a Student Database: Part 2
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1"
>
Build a Student Database: Part 1
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-bash-scripting-by-building-five-programs/build-five-programs"
>
Build Five Programs
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database"
>
Build a Celestial Bodies Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-relational-databases-by-building-a-mario-database/build-a-mario-database"
>
Build a Mario Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-bash-by-building-a-boilerplate/build-a-boilerplate"
>
Build a Boilerplate
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
</tbody>
</table>
<nav
aria-label="aria.timeline-pagination-nav"
>
<ul
aria-hidden="true"
className="timeline-pagination_list"
<h2>
profile.timeline
</h2>
<div
className="h-[20px]"
/>
<table
className="table-auto w-full max-w-full border-collapse text-start text-foreground-tertiary [&_th]:font-normal [&_td]:p-1 [&_th]:p-1 [&>tbody>tr:nth-of-type(odd)]:bg-background-tertiary"
>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "hidden",
}
}
>
<button
aria-label="aria.first-page"
disabled={true}
onClick={[Function]}
<thead>
<tr>
<th>
profile.challenge
</th>
<th>
settings.labels.solution
</th>
<th
className="text-center"
>
profile.completed
</th>
</tr>
</thead>
<tbody>
<tr
className="timeline-row"
>
&lt;&lt;
</button>
</li>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "hidden",
}
}
>
<button
aria-label="aria.previous-page"
disabled={true}
onClick={[Function]}
<td>
<a
gatsby="true"
href="/learn/2022/responsive-web-design/learn-accessibility-by-building-a-quiz/step-41"
>
Step 41
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
&lt;
</button>
</li>
<li
className="timeline-pagination_list_item"
>
profile.page-number
</li>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "unset",
}
}
>
<button
aria-label="aria.next-page"
disabled={false}
onClick={[Function]}
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-number-guessing-game-project/build-a-number-guessing-game"
>
Build a Number Guessing Game
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
&gt;
</button>
</li>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "unset",
}
}
>
<button
aria-label="aria.last-page"
disabled={false}
onClick={[Function]}
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-periodic-table-database-project/build-a-periodic-table-database"
>
Build a Periodic Table Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
&gt;&gt;
</button>
</li>
</ul>
</nav>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object"
>
Build an SQL Reference Object
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-nano-by-building-a-castle/build-a-castle"
>
Build a Castle
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler"
>
Build a Salon Appointment Scheduler
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop"
>
Build a Bike Rental Shop
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator"
>
Build a Kitty Ipsum Translator
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-world-cup-database-project/build-a-world-cup-database"
>
Build a World Cup Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2"
>
Build a Student Database: Part 2
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1"
>
Build a Student Database: Part 1
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-bash-scripting-by-building-five-programs/build-five-programs"
>
Build Five Programs
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database"
>
Build a Celestial Bodies Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-relational-databases-by-building-a-mario-database/build-a-mario-database"
>
Build a Mario Database
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
<tr
className="timeline-row"
>
<td>
<a
gatsby="true"
href="/learn/relational-database/learn-bash-by-building-a-boilerplate/build-a-boilerplate"
>
Build a Boilerplate
</a>
</td>
<td />
<td
className="text-center"
>
<time
dateTime="2016-09-28T20:31:56.730Z"
>
Dec 29, 2022
</time>
</td>
</tr>
</tbody>
</table>
<nav
aria-label="aria.timeline-pagination-nav"
>
<ul
aria-hidden="true"
className="timeline-pagination_list"
>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "hidden",
}
}
>
<button
aria-label="aria.first-page"
disabled={true}
onClick={[Function]}
>
&lt;&lt;
</button>
</li>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "hidden",
}
}
>
<button
aria-label="aria.previous-page"
disabled={true}
onClick={[Function]}
>
&lt;
</button>
</li>
<li
className="timeline-pagination_list_item"
>
profile.page-number
</li>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "unset",
}
}
>
<button
aria-label="aria.next-page"
disabled={false}
onClick={[Function]}
>
&gt;
</button>
</li>
<li
className="timeline-pagination_list_item"
style={
{
"visibility": "unset",
}
}
>
<button
aria-label="aria.last-page"
disabled={false}
onClick={[Function]}
>
&gt;&gt;
</button>
</li>
</ul>
</nav>
</section>
</div>
</div>
`;
@@ -34,51 +34,53 @@ const Bio = ({
return (
<FullWidthRow>
<div className='avatar-camper'>
<AvatarRenderer
isDonating={isDonating}
isTopContributor={isTopContributor}
picture={picture}
<Spacer size={'xl'} />
<section className='card card-header'>
<div className='avatar-camper'>
<AvatarRenderer
isDonating={isDonating}
isTopContributor={isTopContributor}
picture={picture}
/>
</div>
<div className='profile-edit-container'>
<h1>@{username}</h1>
{isSessionUser && (
<Button
onClick={() => setIsEditing(true)}
size='small'
className='button-fit'
aria-label={t('aria.edit-my-profile')}
>
<FontAwesomeIcon icon={faPen} />
</Button>
)}
</div>
{name && <h2>{name}</h2>}
<Spacer size={'s'} />
{about && <p>{about}</p>}
<div className='profile-meta-container'>
{joinDate && (
<div>
<FontAwesomeIcon icon={faCalendar} />
<span>{parseDate(joinDate, t)}</span>
</div>
)}
{location && (
<div>
<FontAwesomeIcon icon={faLocationDot} />
<span>{t('profile.from', { location })}</span>
</div>
)}
</div>
<SocialIcons
githubProfile={githubProfile}
linkedin={linkedin}
twitter={twitter}
username={username}
website={website}
/>
</div>
<div className='profile-edit-container'>
<h1>@{username}</h1>
{isSessionUser && (
<Button
onClick={() => setIsEditing(true)}
size='small'
className='button-fit'
aria-label={t('aria.edit-my-profile')}
>
<FontAwesomeIcon icon={faPen} />
</Button>
)}
</div>
{name && <h2>{name}</h2>}
<Spacer size='xs' />
{about && <p>{about}</p>}
<div className='profile-meta-container'>
{joinDate && (
<div>
<FontAwesomeIcon icon={faCalendar} />
<span>{parseDate(joinDate, t)}</span>
</div>
)}
{location && (
<div>
<FontAwesomeIcon icon={faLocationDot} />
<span>{t('profile.from', { location })}</span>
</div>
)}
</div>
<SocialIcons
githubProfile={githubProfile}
linkedin={linkedin}
twitter={twitter}
username={username}
website={website}
/>
<hr />
</section>
</FullWidthRow>
);
};
@@ -7,6 +7,8 @@
.avatar-camper {
display: flex;
position: absolute;
top: -160px;
}
.header {
@@ -36,7 +38,6 @@
.profile-meta-container {
display: flex;
flex-direction: row;
margin-bottom: 2rem;
color: var(--quaternary-color);
}
@@ -44,13 +45,19 @@
display: flex;
justify-content: space-between;
align-items: baseline;
margin-top: 1em;
margin-top: 2em;
}
.profile-edit-container h1 {
margin: 0;
}
.profile-edit-container button {
position: absolute;
right: 18px;
top: 18px;
}
.profile-meta-container div {
margin-inline-end: 12px;
}
@@ -59,6 +66,10 @@
margin-inline-end: 4px;
}
.social-icons-row {
margin-top: 1em;
}
.social-icons-row a {
display: inline-block;
margin-inline-end: 12px;
@@ -66,36 +66,37 @@ function Camper({
</div>
{(isDonating || isTopContributor) && (
<FullWidthRow>
<h2>{t('profile.badges')}</h2>
<div className='badge-card-container'>
{isDonating && (
<div className='badge-card'>
<div className='camper-badge'>
<SupporterBadgeEmblem />
<section className='card'>
<h2>{t('profile.badges')}</h2>
<div className='badge-card-container'>
{isDonating && (
<div className='badge-card'>
<div className='camper-badge'>
<SupporterBadgeEmblem />
</div>
<div className='badge-card-description'>
<h3>{t('profile.supporter')}</h3>
<p>{t('profile.donated')}</p>
</div>
</div>
<div className='badge-card-description'>
<h3>{t('profile.supporter')}</h3>
<p>{t('profile.donated')}</p>
)}
{isTopContributor && (
<div className='badge-card'>
<div className='camper-badge'>
<TopContibutorBadgeEmblem />
</div>
<div className='badge-card-description'>
<h3>{t('profile.contributor')}</h3>
<p>
{t('profile.contributor-prolific', {
year: yearsTopContributor.join(', ')
})}
</p>
</div>
</div>
</div>
)}
{isTopContributor && (
<div className='badge-card'>
<div className='camper-badge'>
<TopContibutorBadgeEmblem />
</div>
<div className='badge-card-description'>
<h3>{t('profile.contributor')}</h3>
<p>
{t('profile.contributor-prolific', {
year: yearsTopContributor.join(', ')
})}
</p>
</div>
</div>
)}
</div>
<hr />
)}
</div>
</section>
</FullWidthRow>
)}
</>
@@ -72,45 +72,50 @@ function Certificates({
const { t } = useTranslation();
return (
<FullWidthRow className='profile-certifications'>
<h2 id='fcc-certifications'>{t('profile.fcc-certs')}</h2>
<br />
{hasModernCert && currentCerts ? (
<ul aria-labelledby='fcc-certifications'>
{currentCerts
.filter(({ show }) => show)
.map(cert => (
<CertButton key={cert.certSlug} cert={cert} username={username} />
))}
</ul>
) : (
<p className='text-center'>{t('profile.no-certs')}</p>
)}
{hasLegacyCert && (
<div>
<Spacer size='m' />
<h3 id='legacy-certifications'>
{t('settings.headings.legacy-certs')}
</h3>
<Spacer size='m' />
{legacyCerts && (
<>
<ul aria-labelledby='legacy-certifications'>
{legacyCerts
.filter(({ show }) => show)
.map(cert => (
<CertButton
key={cert.certSlug}
cert={cert}
username={username}
/>
))}
</ul>
<Spacer size='m' />
</>
)}
</div>
)}
<hr />
<section className='card'>
<h2 id='fcc-certifications'>{t('profile.fcc-certs')}</h2>
<br />
{hasModernCert && currentCerts ? (
<ul aria-labelledby='fcc-certifications'>
{currentCerts
.filter(({ show }) => show)
.map(cert => (
<CertButton
key={cert.certSlug}
cert={cert}
username={username}
/>
))}
</ul>
) : (
<p className='text-center'>{t('profile.no-certs')}</p>
)}
{hasLegacyCert && (
<div>
<Spacer size='m' />
<h3 id='legacy-certifications'>
{t('settings.headings.legacy-certs')}
</h3>
<Spacer size='m' />
{legacyCerts && (
<>
<ul aria-labelledby='legacy-certifications'>
{legacyCerts
.filter(({ show }) => show)
.map(cert => (
<CertButton
key={cert.certSlug}
cert={cert}
username={username}
/>
))}
</ul>
<Spacer size='m' />
</>
)}
</div>
)}
</section>
</FullWidthRow>
);
}
@@ -97,72 +97,74 @@ class HeatMapInner extends Component<HeatMapInnerProps, HeatMapInnerState> {
return (
<FullWidthRow>
<Spacer size='m' />
<section className='card'>
<h2>{t('profile.activity')}</h2>
<Spacer size='m' />
<CalendarHeatMap
// eslint-disable-next-line @typescript-eslint/no-explicit-any
classForValue={(value: any) => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (!value || value.count < 1) return 'color-empty';
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value.count < 4) return 'color-scale-1';
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value.count < 8) return 'color-scale-2';
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value.count >= 8) return 'color-scale-a-lot';
return 'color-empty';
}}
endDate={endOfCalendar}
startDate={startOfCalendar}
tooltipDataAttrs={(value: { count: number; date: Date }) => {
const dateFormatted: string =
value && value.date
? value.date.toLocaleDateString([localeCode, 'en-US'], {
year: 'numeric',
month: 'short',
day: 'numeric'
})
: '';
return {
'data-tip':
value && value.count > -1
? t('profile.points', {
count: value.count,
date: dateFormatted
<CalendarHeatMap
// eslint-disable-next-line @typescript-eslint/no-explicit-any
classForValue={(value: any) => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (!value || value.count < 1) return 'color-empty';
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value.count < 4) return 'color-scale-1';
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value.count < 8) return 'color-scale-2';
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value.count >= 8) return 'color-scale-a-lot';
return 'color-empty';
}}
endDate={endOfCalendar}
startDate={startOfCalendar}
tooltipDataAttrs={(value: { count: number; date: Date }) => {
const dateFormatted: string =
value && value.date
? value.date.toLocaleDateString([localeCode, 'en-US'], {
year: 'numeric',
month: 'short',
day: 'numeric'
})
: ''
};
}}
values={dataToDisplay}
/>
<ReactTooltip className='react-tooltip' effect='solid' html={true} />
<Row className='text-center'>
<button
className='heatmap-nav-btn'
disabled={!pages[this.state.pageIndex - 1]}
// eslint-disable-next-line @typescript-eslint/unbound-method
onClick={this.prevPage}
style={{
visibility: pages[this.state.pageIndex - 1] ? 'unset' : 'hidden'
: '';
return {
'data-tip':
value && value.count > -1
? t('profile.points', {
count: value.count,
date: dateFormatted
})
: ''
};
}}
>
&lt;
</button>
<span>{title}</span>
<button
className='heatmap-nav-btn'
disabled={!pages[this.state.pageIndex + 1]}
// eslint-disable-next-line @typescript-eslint/unbound-method
onClick={this.nextPage}
style={{
visibility: pages[this.state.pageIndex + 1] ? 'unset' : 'hidden'
}}
>
&gt;
</button>
</Row>
<Spacer size='m' />
<hr />
values={dataToDisplay}
/>
<ReactTooltip className='react-tooltip' effect='solid' html={true} />
<Row className='text-center'>
<button
className='heatmap-nav-btn'
disabled={!pages[this.state.pageIndex - 1]}
// eslint-disable-next-line @typescript-eslint/unbound-method
onClick={this.prevPage}
style={{
visibility: pages[this.state.pageIndex - 1] ? 'unset' : 'hidden'
}}
>
&lt;
</button>
<span>{title}</span>
<button
className='heatmap-nav-btn'
disabled={!pages[this.state.pageIndex + 1]}
// eslint-disable-next-line @typescript-eslint/unbound-method
onClick={this.nextPage}
style={{
visibility: pages[this.state.pageIndex + 1] ? 'unset' : 'hidden'
}}
>
&gt;
</button>
</Row>
<Spacer size='m' />
</section>
</FullWidthRow>
);
}
@@ -2,7 +2,6 @@
.portfolio-card {
display: flex;
flex-direction: column;
margin-top: 2rem;
width: 100%;
height: auto;
overflow: hidden;
@@ -18,39 +18,47 @@ export const PortfolioProjects = ({
}
return (
<FullWidthRow>
<h2>{t('profile.projects')}</h2>
{portfolioProjects.map(({ title, url, image, description, id }) => (
<a
href={url}
rel='nofollow noopener noreferrer'
target='_blank'
className='portfolio-card'
key={id}
>
{image && (
<img
alt=''
className='portfolio-image'
src={image}
onError={({ currentTarget }) => {
currentTarget.src =
'https://cdn.freecodecamp.org/platform/universal/fcc_meta_1920X1080-indigo.png';
}}
/>
)}
<div className='portfolio-card-description'>
<div className='portfolio-card-text'>
<h3>
{title}
<span className='sr-only'>, {t('aria.opens-new-window')}</span>
</h3>
<p>{description}</p>
</div>
</div>
</a>
))}
<Spacer size='m' />
<hr />
<section className='card'>
<h2>{t('profile.projects')}</h2>
<Spacer size='s' />
{portfolioProjects.map(
({ title, url, image, description, id }, index) => (
<React.Fragment key={id}>
<a
href={url}
rel='nofollow noopener noreferrer'
target='_blank'
className='portfolio-card'
>
{image && (
<img
alt=''
className='portfolio-image'
src={image}
onError={({ currentTarget }) => {
currentTarget.src =
'https://cdn.freecodecamp.org/platform/universal/fcc_meta_1920X1080-indigo.png';
}}
/>
)}
<div className='portfolio-card-description'>
<div className='portfolio-card-text'>
<h3>
{title}
<span className='sr-only'>
, {t('aria.opens-new-window')}
</span>
</h3>
<p>{description}</p>
</div>
</div>
</a>
{index < portfolioProjects.length - 1 && <hr />}
</React.Fragment>
)
)}
<Spacer size='m' />
</section>
</FullWidthRow>
);
};
@@ -113,29 +113,30 @@ function Stats({ points, calendar }: StatsProps): JSX.Element {
return (
<FullWidthRow>
<h2>{t('profile.stats')}</h2>
<Spacer size='xs' />
<dl className='stats'>
<div>
<dt>
<b data-testid='current-streak'>{t('profile.current-streak')}</b>
</dt>
<dd>{currentStreak || 0}</dd>
</div>
<div>
<dt>
<b>{t('profile.total-points')}</b>
</dt>
<dd>{points}</dd>
</div>
<div>
<dt>
<b data-testid='longest-streak'>{t('profile.longest-streak')}</b>
</dt>
<dd>{longestStreak || 0}</dd>
</div>
</dl>
<hr />
<section className='card'>
<h2>{t('profile.stats')}</h2>
<Spacer size='s' />
<dl className='stats'>
<div>
<dt>
<b data-testid='current-streak'>{t('profile.current-streak')}</b>
</dt>
<dd>{currentStreak || 0}</dd>
</div>
<div>
<dt>
<b>{t('profile.total-points')}</b>
</dt>
<dd>{points}</dd>
</div>
<div>
<dt>
<b data-testid='longest-streak'>{t('profile.longest-streak')}</b>
</dt>
<dd>{longestStreak || 0}</dd>
</div>
</dl>
</section>
</FullWidthRow>
);
}
@@ -176,64 +176,66 @@ function TimelineInner({
return (
<FullWidthRow>
<h2>{t('profile.timeline')}</h2>
<Spacer size='xs' />
{completedMap.length === 0 ? (
<p className='text-center'>
{t('profile.none-completed')}&nbsp;
<Link to='/learn'>{t('profile.get-started')}</Link>
</p>
) : (
<Table condensed={true} striped={true}>
<thead>
<tr>
<th>{t('profile.challenge')}</th>
<th>{t('settings.labels.solution')}</th>
<th className='text-center'>{t('profile.completed')}</th>
</tr>
</thead>
<tbody>
{sortedTimeline.slice(startIndex, endIndex).map(renderCompletion)}
</tbody>
</Table>
)}
{id && (
<Modal onClose={closeSolution} open={solutionOpen} size='large'>
<Modal.Header showCloseButton={true} closeButtonClassNames='close'>
{`${username}'s Solution to ${
idToNameMap.get(id)?.challengeTitle ?? ''
}`}
</Modal.Header>
<Modal.Body alignment='left'>
<SolutionViewer
challengeFiles={challengeData.challengeFiles}
solution={challengeData.solution ?? ''}
/>
</Modal.Body>
<Modal.Footer>
<Button onClick={closeSolution}>{t('buttons.close')}</Button>
</Modal.Footer>
</Modal>
)}
{totalPages > 1 && (
<TimelinePagination
firstPage={firstPage}
lastPage={lastPage}
nextPage={nextPage}
pageNo={pageNo}
prevPage={prevPage}
totalPages={totalPages}
<section className='card'>
<h2>{t('profile.timeline')}</h2>
<Spacer size='s' />
{completedMap.length === 0 ? (
<p className='text-center'>
{t('profile.none-completed')}&nbsp;
<Link to='/learn'>{t('profile.get-started')}</Link>
</p>
) : (
<Table condensed={true} striped={true}>
<thead>
<tr>
<th>{t('profile.challenge')}</th>
<th>{t('settings.labels.solution')}</th>
<th className='text-center'>{t('profile.completed')}</th>
</tr>
</thead>
<tbody>
{sortedTimeline.slice(startIndex, endIndex).map(renderCompletion)}
</tbody>
</Table>
)}
{id && (
<Modal onClose={closeSolution} open={solutionOpen} size='large'>
<Modal.Header showCloseButton={true} closeButtonClassNames='close'>
{`${username}'s Solution to ${
idToNameMap.get(id)?.challengeTitle ?? ''
}`}
</Modal.Header>
<Modal.Body alignment='left'>
<SolutionViewer
challengeFiles={challengeData.challengeFiles}
solution={challengeData.solution ?? ''}
/>
</Modal.Body>
<Modal.Footer>
<Button onClick={closeSolution}>{t('buttons.close')}</Button>
</Modal.Footer>
</Modal>
)}
{totalPages > 1 && (
<TimelinePagination
firstPage={firstPage}
lastPage={lastPage}
nextPage={nextPage}
pageNo={pageNo}
prevPage={prevPage}
totalPages={totalPages}
/>
)}
<ProjectPreviewModal
challengeData={challengeData}
closeText={t('buttons.close')}
previewTitle={projectTitle}
/>
)}
<ProjectPreviewModal
challengeData={challengeData}
closeText={t('buttons.close')}
previewTitle={projectTitle}
/>
<ExamResultsModal
projectTitle={projectTitle}
examResults={completedChallenge?.examResults}
/>
<ExamResultsModal
projectTitle={projectTitle}
examResults={completedChallenge?.examResults}
/>
</section>
</FullWidthRow>
);
}
+13
View File
@@ -3,3 +3,16 @@
height: fit-content;
padding: 0 !important;
}
.card {
margin: 0;
padding: 1em;
box-shadow: none;
background: var(--gray00);
border: 1px solid var(--gray15);
margin-bottom: 1em;
}
.card-header {
position: relative;
}