Compare commits

...
18 Commits
21 changed files with 301 additions and 25 deletions

No files matched your search

+9 -1
View File
@@ -1,4 +1,5 @@
from app.models.experience_task import ExperienceTask
from app.models.experience_link import ExperienceLink
from sqlalchemy import (
Column,
@@ -17,7 +18,8 @@ class Experience(Base):
id = Column(
Integer,
primary_key=True,
index=True
index=True,
nullable=False
)
company = Column(
@@ -45,3 +47,9 @@ class Experience(Base):
back_populates="experience",
cascade="all, delete-orphan"
)
links = relationship(
"ExperienceLink",
back_populates="experience",
cascade="all, delete-orphan"
)
@@ -0,0 +1,50 @@
from sqlalchemy import (
Column,
Integer,
String,
ForeignKey
)
from sqlalchemy.orm import relationship
from app.database import Base
class ExperienceLink(Base):
__tablename__ = "experience_links"
id = Column(
Integer,
primary_key=True,
index=True,
nullable=False
)
label = Column(
String(255),
nullable=True
)
link = Column(
String(255),
nullable=True
)
icon_path = Column(
String(255),
nullable=True
)
experience_id = Column(
Integer,
ForeignKey(
"experiences.id",
ondelete="CASCADE"
),
nullable=False
)
experience = relationship(
"Experience",
back_populates="links"
)
+3 -2
View File
@@ -16,12 +16,13 @@ class ExperienceTask(Base):
id = Column(
Integer,
primary_key=True,
index=True
index=True,
nullable=False
)
description = Column(
String(255),
nullable=False
nullable=True
)
experience_id = Column(
+8 -2
View File
@@ -15,7 +15,12 @@ from app.models.project_skill import project_skills
class Project(Base):
__tablename__ = "projects"
id = Column(Integer, primary_key=True, index=True)
id = Column(
Integer,
primary_key=True,
index=True,
nullable=False
)
title = Column(
String(255),
@@ -24,7 +29,8 @@ class Project(Base):
nb_image = Column(
Integer,
default=1
default=1,
nullable=True
)
short_description = Column(
+4 -2
View File
@@ -10,13 +10,15 @@ project_skills = Table(
"project_id",
Integer,
ForeignKey("projects.id", ondelete="CASCADE"),
primary_key=True
primary_key=True,
nullable=False
),
Column(
"skill_id",
Integer,
ForeignKey("skills.id", ondelete="CASCADE"),
primary_key=True
primary_key=True,
nullable=False
)
)
+6 -1
View File
@@ -8,7 +8,12 @@ from app.models.project_skill import project_skills
class Skill(Base):
__tablename__ = "skills"
id = Column(Integer, primary_key=True, index=True)
id = Column(
Integer,
primary_key=True,
index=True,
nullable=False
)
name = Column(
String(255),
+10
View File
@@ -7,6 +7,15 @@ class ExperienceTaskResponse(BaseModel):
class Config:
from_attributes = True
class ExperienceLinkResponse(BaseModel):
id: int
label: str
link: str
icon_path: str
class Config:
from_attributes = True
class ExperienceResponse(BaseModel):
id: int
company: str
@@ -14,6 +23,7 @@ class ExperienceResponse(BaseModel):
duration: str
role: str
tasks: list[ExperienceTaskResponse]
links: list[ExperienceLinkResponse]
class Config:
from_attributes = True
@@ -0,0 +1,10 @@
<svg
xmlns="http://www.w3.org/2000/svg"
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#1f1f1f">
<path
d="M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/>
</svg>

After

Width:  |  Height:  |  Size: 306 B

@@ -0,0 +1,10 @@
<svg
xmlns="http://www.w3.org/2000/svg"
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#1f1f1f">
<path
d="M640-480v-80h80v80h-80Zm0 80h-80v-80h80v80Zm0 80v-80h80v80h-80ZM447-640l-80-80H160v480h400v-80h80v80h160v-400H640v80h-80v-80H447ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h240l80 80h320q33 0 56.5 23.5T880-640v400q0 33-23.5 56.5T800-160H160Zm0-80v-480 480Z"/>
</svg>

After

Width:  |  Height:  |  Size: 416 B

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="1024"
height="1024"
viewBox="0 0 1024 1024"
fill="#000000"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="SVGRepo_iconCarrier"
transform="matrix(1.6708812,0,0,1.6708812,-400.36796,-343.24327)">
<path
d="m 827.3,461.5 c -1.6,-1.3 -16.1,-12.2 -46.7,-12.2 -8.1,0 -16.2,0.6 -24.2,2.1 -5.9,-40.7 -39.5,-60.5 -41,-61.4 l -8.2,-4.8 -5.4,7.8 c -6.8,10.5 -11.7,22 -14.6,34.2 -5.5,23.2 -2.2,45 9.6,63.6 -14.2,7.9 -37.1,9.9 -41.7,10 H 277 c -9.9,0 -17.9,8 -17.9,17.9 -0.4,33.1 5.2,66 16.5,97.1 13,34.2 32.4,59.3 57.6,74.7 28.2,17.3 74.1,27.2 126.2,27.2 23.5,0.1 47,-2.1 70.1,-6.4 32.1,-5.9 63,-17.1 91.4,-33.2 23.4,-13.6 44.5,-30.8 62.4,-51.1 29.9,-33.9 47.8,-71.7 61.1,-105.2 h 5.3 c 32.8,0 53,-13.1 64.1,-24.1 7.4,-7 13.2,-15.5 16.9,-25 l 2.3,-6.9 z M 312,489.9 h 50.7 c 2.4,0 4.4,-2 4.4,-4.4 v -45.1 c 0,-2.4 -2,-4.4 -4.4,-4.5 H 312 c -2.4,0 -4.4,2 -4.4,4.4 v 45.2 c 0,2.5 2,4.4 4.4,4.4 m 69.9,0 h 50.7 c 2.4,0 4.4,-2 4.4,-4.4 v -45.1 c 0,-2.4 -2,-4.4 -4.4,-4.5 h -50.7 c -2.5,0 -4.5,2 -4.5,4.5 v 45.1 c 0,2.5 2,4.4 4.5,4.4 m 70.8,0.1 h 50.7 c 2.4,0 4.4,-2 4.4,-4.4 v -45.1 c 0,-2.4 -2,-4.4 -4.4,-4.5 h -50.7 c -2.4,0 -4.4,2 -4.4,4.4 v 45.2 c 0,2.4 2,4.3 4.4,4.4 m 70.1,0 h 50.7 c 2.4,0 4.4,-2 4.5,-4.4 v -45.1 c 0,-2.5 -2,-4.5 -4.5,-4.5 h -50.7 c -2.4,0 -4.4,2 -4.4,4.4 v 45.2 c 0,2.4 1.9,4.4 4.4,4.4 m -141,-65 h 50.7 c 2.4,0 4.4,-2 4.4,-4.5 v -45.1 c 0,-2.4 -2,-4.4 -4.4,-4.4 h -50.7 c -2.5,0 -4.4,2 -4.5,4.4 v 45.1 c 0.1,2.5 2.1,4.5 4.5,4.5 m 70.9,0 h 50.7 c 2.4,0 4.4,-2 4.4,-4.5 v -45.1 c 0,-2.4 -2,-4.4 -4.4,-4.4 h -50.7 c -2.4,0 -4.4,2 -4.4,4.4 v 45.1 c 0,2.5 2,4.5 4.4,4.5 m 70.1,0 h 50.7 c 2.5,0 4.4,-2 4.5,-4.5 v -45.1 c 0,-2.5 -2,-4.4 -4.5,-4.4 h -50.7 c -2.4,0 -4.4,2 -4.4,4.4 v 45.1 c 0,2.5 1.9,4.5 4.4,4.5 m 0,-64.9 h 50.7 c 2.5,0 4.5,-2 4.5,-4.5 v -45.2 c 0,-2.4 -2,-4.4 -4.5,-4.4 h -50.7 c -2.4,0 -4.4,2 -4.4,4.4 v 45.2 c 0,2.5 1.9,4.5 4.4,4.5 M 593.4,490 h 50.7 c 2.4,0 4.4,-2 4.4,-4.4 v -45.1 c 0,-2.5 -2,-4.4 -4.4,-4.5 h -50.7 c -2.4,0 -4.4,2 -4.4,4.4 v 45.2 c 0,2.4 2,4.4 4.4,4.4"
style="display:inline;fill:#0091e2"
id="path1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg
xmlns="http://www.w3.org/2000/svg"
width="128px" height="133px"
viewBox="0 0 128 128"
version="1.1">
<g id="surface1">
<path
style="stroke:none;fill-rule:nonzero;fill:rgb(94.117647%,32.54902%,25.098039%);fill-opacity:1;"
d="M 26.027344 0.136719 C 25.824219 0.214844 20.085938 3.484375 13.28125 7.394531 C 5.035156 12.136719 0.800781 14.632812 0.574219 14.867188 C 0.394531 15.070312 0.191406 15.421875 0.128906 15.644531 C -0.0429688 16.21875 -0.0546875 100.347656 0.117188 100.953125 C 0.179688 101.1875 0.382812 101.53125 0.566406 101.722656 C 1.011719 102.191406 50.238281 130.496094 50.835938 130.632812 C 51.113281 130.699219 51.425781 130.6875 51.734375 130.601562 C 52.40625 130.433594 101.503906 102.191406 101.941406 101.730469 C 102.121094 101.53125 102.324219 101.1875 102.390625 100.953125 C 102.476562 100.675781 102.507812 96.277344 102.507812 87.015625 L 102.507812 73.480469 L 114.476562 66.605469 C 125.761719 60.117188 126.453125 59.710938 126.742188 59.265625 L 127.039062 58.785156 L 127.039062 44.207031 C 127.039062 28.335938 127.070312 29.230469 126.441406 28.65625 C 126.273438 28.507812 120.523438 25.152344 113.652344 21.195312 L 101.171875 14.015625 L 99.785156 14.015625 L 87.574219 21.027344 C 80.851562 24.894531 75.136719 28.199219 74.859375 28.378906 C 74.582031 28.5625 74.25 28.902344 74.113281 29.148438 L 73.867188 29.574219 L 73.8125 43.308594 L 73.761719 57.046875 L 63.679688 62.855469 C 58.132812 66.042969 53.515625 68.683594 53.417969 68.707031 C 53.238281 68.757812 53.226562 67.449219 53.226562 42.203125 L 53.226562 15.632812 L 52.960938 15.175781 C 52.628906 14.621094 54.121094 15.507812 39.136719 6.894531 C 26.570312 -0.332031 26.871094 -0.179688 26.027344 0.136719 Z M 37.578125 10.65625 C 42.835938 13.671875 47.136719 16.167969 47.136719 16.199219 C 47.136719 16.230469 42.527344 18.894531 36.894531 22.132812 L 26.644531 28.015625 L 16.414062 22.132812 C 10.792969 18.894531 6.1875 16.230469 6.1875 16.199219 C 6.1875 16.167969 10.785156 13.503906 16.40625 10.273438 L 26.613281 4.402344 L 27.316406 4.785156 C 27.710938 5 32.332031 7.640625 37.578125 10.65625 Z M 110.730469 24.191406 C 116.265625 27.378906 120.84375 30.011719 120.886719 30.054688 C 121.003906 30.160156 100.703125 41.828125 100.425781 41.816406 C 100.148438 41.808594 80.097656 30.246094 80.105469 30.105469 C 80.117188 29.945312 100.289062 18.339844 100.492188 18.371094 C 100.585938 18.394531 105.195312 21.015625 110.730469 24.191406 Z M 14.828125 25.875 L 24.585938 31.492188 L 24.640625 59.304688 L 24.691406 87.121094 L 24.929688 87.496094 C 25.054688 87.695312 25.289062 87.964844 25.460938 88.089844 C 25.621094 88.207031 31.050781 91.300781 37.523438 94.953125 L 49.28125 101.59375 L 49.28125 113.359375 C 49.28125 119.816406 49.238281 125.113281 49.183594 125.113281 C 49.140625 125.113281 38.976562 119.296875 26.601562 112.175781 L 4.105469 99.238281 L 4.074219 59.464844 L 4.054688 19.703125 L 4.554688 19.980469 C 4.84375 20.132812 9.460938 22.785156 14.828125 25.875 Z M 49.28125 45.453125 L 49.28125 71.082031 L 48.886719 71.339844 C 48.351562 71.679688 28.8125 82.910156 28.746094 82.910156 C 28.714844 82.910156 28.691406 71.339844 28.691406 57.195312 L 28.703125 31.492188 L 38.910156 25.621094 C 44.523438 22.390625 49.152344 19.769531 49.207031 19.789062 C 49.246094 19.8125 49.28125 31.363281 49.28125 45.453125 Z M 88.222656 39.558594 L 98.453125 45.441406 L 98.453125 57.101562 C 98.453125 68.164062 98.441406 68.757812 98.273438 68.695312 C 98.164062 68.652344 93.535156 66 87.980469 62.800781 L 77.867188 56.992188 L 77.867188 45.335938 C 77.867188 38.917969 77.898438 33.675781 77.929688 33.675781 C 77.972656 33.675781 82.601562 36.320312 88.222656 39.558594 Z M 123.09375 45.261719 C 123.09375 51.644531 123.050781 56.910156 123.007812 56.960938 C 122.933594 57.078125 102.699219 68.738281 102.570312 68.738281 C 102.539062 68.738281 102.507812 63.496094 102.507812 57.078125 L 102.507812 45.421875 L 112.714844 39.546875 C 118.335938 36.320312 122.964844 33.675781 123.007812 33.675781 C 123.0625 33.675781 123.09375 38.886719 123.09375 45.261719 Z M 86.230469 66.46875 C 94.835938 71.421875 96.320312 72.308594 96.171875 72.425781 C 96.074219 72.488281 92.8125 74.363281 88.929688 76.582031 C 85.046875 78.796875 74.988281 84.53125 66.570312 89.328125 L 51.273438 98.054688 L 50.785156 97.789062 C 47.863281 96.191406 30.910156 86.546875 30.910156 86.472656 C 30.902344 86.3125 75.765625 60.53125 75.945312 60.597656 C 76.03125 60.628906 80.660156 63.269531 86.230469 66.46875 Z M 98.433594 87.558594 L 98.398438 99.238281 L 75.914062 112.175781 C 63.542969 119.296875 53.375 125.113281 53.324219 125.113281 C 53.269531 125.113281 53.226562 120.359375 53.226562 113.359375 L 53.226562 101.59375 L 75.765625 88.742188 C 88.148438 81.675781 98.324219 75.890625 98.378906 75.878906 C 98.421875 75.878906 98.441406 81.132812 98.433594 87.558594 Z M 98.433594 87.558594 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -0,0 +1,32 @@
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 128 128">
<radialGradient
id="linux-original-a"
cx="-992.915"
cy="-952.952"
r="43.267"
gradientTransform="matrix(.7 0 0 .35 782.303 444.575)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-opacity=".502"/>
<stop
offset="1"
stop-opacity="0"/>
</radialGradient>
<path
fill="url(#linux-original-a)"
d="M117.641 111.137c0 8.362-13.557 15.14-30.28 15.14-16.722 0-30.279-6.778-30.279-15.14s13.556-15.14 30.278-15.14c16.723.001 30.281 6.779 30.281 15.14z"/>
<radialGradient
id="linux-original-b"
cx="-770.661"
cy="-951.636"
r="43.267"
gradientTransform="matrix(.719 0 0 .35 595.327 443.952)"
gradientUnits="userSpaceOnUse">
<stop
offset="0" stop-opacity=".502"/><stop offset="1" stop-opacity="0"/></radialGradient><path fill="url(#linux-original-b)" d="M72.546 110.974c0 8.362-13.921 15.14-31.094 15.14s-31.093-6.778-31.093-15.14c0-8.361 13.921-15.14 31.093-15.14 17.173 0 31.094 6.779 31.094 15.14z"/><path d="M108.095 81.343c-1.534 6.324-9.322 19.527-13.459 25.338-4.138 5.835-3.626 11.089-11.275 9.043-7.625-2.045-9.763-1.673-17.644-1.208-7.833.464-6.137-.233-11.042 1.976-4.882 2.208-21.27-26.78-22.595-32.173-1.301-5.393-1.93-4.743 1.464-10.577 3.395-5.834 3.883-11.6 8.368-18.667 4.487-7.09 9.671-10.693 9.299-16.109-1.464-20.108-2.626-30.15 6.301-34.8 8.507-4.417 15.621-1.79 18.434-.279 1.208.651 3.673 1.906 5.509 4.115 1.836 2.162 3.487 5.44 4.417 9.577 1.906 8.299-.791 5.556 1.371 15.064 2.139 9.484 6.485 14.133 11.787 21.642 5.299 7.508 10.832 19.898 9.065 27.058z"/><path fill="#666" d="M57.644 32.088c1.394-.558 1.16-.632 2.089-2.655.744-1.557 1.398-2.227 1.375-4.598 0-2.325-.722-3.115-1.814-4.626-1.045-1.441-2.719-1.511-3.765-1.325-.604.093-1.395.86-1.93 2-.348.767-.628 1.744-.651 2.766-.07 2.743.163 3.79.791 5.649.743 2.185 2.556 3.325 3.905 2.789z"/><path fill="#6D6D6D" d="M57.644 32.08c1.385-.554 1.15-.631 2.074-2.641.739-1.547 1.392-2.215 1.379-4.573.009-2.309-.698-3.133-1.771-4.585-1.065-1.403-2.705-1.456-3.743-1.276-.619.091-1.406.829-1.95 1.927a6.637 6.637 0 00-.673 2.755c-.068 2.724.176 3.775.794 5.624.732 2.173 2.55 3.3 3.89 2.769z"/><path fill="#757575" d="M57.644 32.071c1.376-.551 1.141-.629 2.059-2.626.735-1.537 1.387-2.202 1.384-4.547.017-2.294-.676-3.15-1.731-4.544-1.082-1.364-2.688-1.401-3.719-1.227-.633.089-1.417.798-1.969 1.854-.401.725-.675 1.713-.698 2.745-.067 2.706.191 3.761.798 5.598.721 2.16 2.545 3.275 3.876 2.747z"/><path fill="#7C7C7C" d="M57.644 32.063c1.367-.547 1.132-.628 2.044-2.611.729-1.528 1.381-2.191 1.389-4.522.026-2.278-.653-3.167-1.69-4.503-1.099-1.325-2.673-1.345-3.695-1.178-.648.088-1.429.769-1.989 1.783-.427.703-.697 1.697-.72 2.733-.066 2.687.205 3.747.802 5.573.707 2.147 2.537 3.248 3.859 2.725z"/><path fill="#848484" d="M57.644 32.054c1.359-.544 1.123-.627 2.028-2.598.726-1.518 1.378-2.179 1.395-4.497.034-2.263-.629-3.185-1.649-4.462-1.117-1.287-2.658-1.29-3.672-1.129-.662.086-1.44.737-2.01 1.709-.453.683-.721 1.682-.744 2.723-.064 2.668.22 3.732.808 5.548.694 2.137 2.531 3.227 3.844 2.706z"/><path fill="#8C8C8C" d="M57.644 32.046c1.35-.54 1.113-.626 2.013-2.583.721-1.507 1.373-2.167 1.4-4.472.043-2.248-.608-3.202-1.609-4.422-1.134-1.248-2.643-1.235-3.649-1.08-.676.085-1.45.707-2.029 1.637-.479.662-.744 1.667-.766 2.712-.063 2.65.233 3.718.81 5.522.683 2.125 2.526 3.203 3.83 2.686z"/><path fill="#939393" d="M57.644 32.037c1.34-.536 1.104-.624 1.998-2.569.715-1.497 1.367-2.154 1.405-4.446.052-2.232-.584-3.22-1.567-4.381-1.152-1.209-2.625-1.18-3.625-1.032-.691.084-1.462.676-2.049 1.565-.505.641-.768 1.651-.791 2.702-.06 2.631.249 3.704.815 5.497.67 2.112 2.517 3.178 3.814 2.664z"/><path fill="#9B9B9B" d="M57.644 32.028c1.333-.533 1.095-.624 1.983-2.554.71-1.488 1.361-2.143 1.41-4.421.061-2.217-.562-3.237-1.528-4.339-1.168-1.171-2.609-1.125-3.602-.983-.705.082-1.473.646-2.069 1.492-.531.619-.79 1.636-.813 2.691-.06 2.613.261 3.689.818 5.472.66 2.099 2.514 3.153 3.801 2.642z"/><path fill="#A3A3A3" d="M57.644 32.02c1.323-.529 1.086-.622 1.968-2.54.706-1.478 1.356-2.13 1.415-4.396.069-2.202-.54-3.254-1.487-4.299-1.187-1.132-2.594-1.07-3.579-.934-.719.081-1.484.615-2.088 1.42-.557.598-.814 1.621-.836 2.681-.059 2.593.275 3.674.822 5.446.649 2.087 2.507 3.129 3.785 2.622z"/><path fill="#aaa" d="M57.644 32.011c1.314-.525 1.077-.62 1.953-2.526.7-1.467 1.351-2.119 1.419-4.37.078-2.187-.516-3.272-1.445-4.258-1.205-1.094-2.58-1.015-3.556-.885-.733.079-1.496.584-2.109 1.347-.583.578-.837 1.606-.859 2.669-.057 2.576.289 3.661.826 5.422.638 2.075 2.5 3.105 3.771 2.601z"/><path fill="#B2B2B2" d="M57.644 32.002c1.305-.522 1.067-.62 1.937-2.512.696-1.457 1.346-2.106 1.425-4.345.086-2.171-.493-3.29-1.404-4.217-1.223-1.055-2.563-.959-3.532-.836-.749.077-1.507.554-2.128 1.275-.61.556-.861 1.591-.883 2.659-.055 2.556.304 3.646.831 5.396.624 2.064 2.493 3.081 3.754 2.58z"/><path fill="#BABABA" d="M57.644 31.994c1.296-.518 1.058-.618 1.922-2.497.692-1.448 1.341-2.095 1.43-4.32.096-2.156-.47-3.307-1.363-4.176-1.239-1.016-2.547-.903-3.508-.787-.763.075-1.518.522-2.148 1.202-.637.535-.885 1.576-.906 2.648-.054 2.538.317 3.632.834 5.371.611 2.051 2.486 3.055 3.739 2.559z"/><path fill="#C1C1C1" d="M57.644 31.985c1.288-.515 1.049-.616 1.907-2.483.686-1.437 1.336-2.082 1.435-4.294.104-2.141-.448-3.324-1.322-4.135-1.257-.978-2.533-.849-3.486-.738-.776.074-1.529.492-2.168 1.13-.662.513-.907 1.56-.929 2.636-.052 2.519.333 3.618.839 5.346.599 2.039 2.481 3.031 3.724 2.538z"/><path fill="#C9C9C9" d="M57.644 31.976c1.278-.511 1.04-.615 1.892-2.468.681-1.427 1.33-2.071 1.439-4.269.114-2.125-.424-3.342-1.281-4.094-1.274-.939-2.516-.794-3.462-.69-.79.072-1.54.462-2.188 1.058-.688.492-.931 1.544-.953 2.626-.05 2.5.346 3.6Line truncated

After

Width:  |  Height:  |  Size: 190 KiB

@@ -0,0 +1,17 @@
<svg
fill="#000000"
viewBox="0 0 32 32"
xmlns="http://www.w3.org/2000/svg">
<g id="SVGRepo_iconCarrier">
<path
d="M6.573 2.432c-1.453 0.74-1.453 0.854-0.094 2.375 7.536 8.391 9.339 10.375 9.474 10.375 0.188 0.021 10.63-11.391 10.745-11.734 0.047-0.094-0.276-0.417-0.693-0.714-0.552-0.417-1.151-0.578-2.281-0.625-2.12-0.135-2.859 0.323-5.49 3.276-1.198 1.333-2.214 2.443-2.214 2.443-0.021 0-1.010-1.083-2.188-2.396s-2.536-2.63-2.995-2.885c-1.063-0.599-3.229-0.646-4.271-0.115z"/>
<path
fill="#E57000"
d="M1.729 5.823c-1.13 0.438-1.729 0.854-1.729 1.172 0 0.161 1.776 2.24 3.922 4.615 2.167 2.375 3.917 4.359 3.917 4.401 0 0.047-1.776 2.031-3.922 4.406-2.167 2.396-3.896 4.495-3.87 4.677 0.115 0.625 2.005 1.411 3.385 1.411 2.24-0.026 2.745-0.417 7.474-5.604 2.375-2.604 4.307-4.818 4.307-4.891 0-0.089-1.911-2.255-4.26-4.839-3.068-3.344-4.568-4.844-5.281-5.167-1.083-0.531-2.833-0.62-3.943-0.182z"/>
<path
fill="#E57000"
d="M26.354 5.984c-0.672 0.344-2.354 2.005-5.26 5.188-2.349 2.583-4.266 4.75-4.266 4.839 0 0.094 1.938 2.286 4.313 4.891 4.724 5.188 5.234 5.578 7.469 5.604 1.385 0 3.276-0.786 3.391-1.411 0.021-0.208-1.708-2.281-3.875-4.656-2.141-2.37-3.917-4.38-3.917-4.427 0-0.042 1.776-2.052 3.917-4.427 2.167-2.37 3.896-4.448 3.875-4.63-0.115-0.599-1.823-1.292-3.297-1.385-1.063-0.047-1.615 0.047-2.349 0.417z"/>
<path
d="M10.604 22.63c-2.859 3.161-5.208 5.833-5.255 5.948-0.047 0.094 0.276 0.417 0.693 0.714 0.552 0.417 1.151 0.578 2.281 0.625 2.099 0.135 2.88-0.349 5.531-3.344 1.156-1.292 2.146-2.375 2.167-2.375 0.026 0 1.016 1.083 2.193 2.396 2.698 3 3.411 3.438 5.51 3.323 1.13-0.047 1.729-0.208 2.281-0.625 0.417-0.297 0.74-0.62 0.693-0.714-0.115-0.344-10.563-11.76-10.745-11.734-0.094 0-2.49 2.604-5.349 5.786z"/>
</g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+9 -5
View File
@@ -3,15 +3,19 @@ import { Routes, Route } from 'react-router-dom';
import HomePage from './pages/Home/HomePage.jsx';
import ProjectsPage from './pages/Projects/ProjectsPage.jsx';
import ProjectDetailsPage from "./pages/ProjectDetails/ProjectDetailsPage.jsx";
import Footer from "./components/Footer/Footer.jsx";
function App() {
return (
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/projects" element={<ProjectsPage />} />
<Route path="/projectDetails/:id" element={<ProjectDetailsPage />} />
</Routes>
<>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/projects" element={<ProjectsPage />} />
<Route path="/projectDetails/:id" element={<ProjectDetailsPage />} />
</Routes>
<Footer/>
</>
)
}
@@ -4,7 +4,6 @@ import Home from './components/Home/Home.jsx';
import Experiences from './components/Experiences/Experiences.jsx';
import Projects from '../../components/Projects/Projects.jsx';
import Skills from './components/Skills/Skills.jsx';
import Footer from '../../components/Footer/Footer.jsx';
function HomePage() {
const location = useLocation();
@@ -27,7 +26,6 @@ function HomePage() {
<Experiences/>
<Projects/>
<Skills/>
<Footer/>
</div>
);
}
@@ -24,7 +24,16 @@
.experience-card-left {
width: 25%;
display: flex;
justify-content: end;
}
.experience-card-left-container{
text-align: end;
display: flex;
flex-direction: column;
align-items: end;
width: fit-content;
}
.experience-card-right {
@@ -52,6 +61,57 @@
white-space: nowrap;
}
.experience-links {
list-style: none;
margin-top: 16px;
padding: 16px 0 0 0;
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 12px;
width: 100%;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.experience-links li {
list-style: none;
}
.experience-links li a {
display: inline-flex;
align-items: center;
cursor: pointer;
gap: 8px;
background-color: #161616;
border: 1px solid #2e2e2e;
color: #a1a1aa;
padding: 5px 10px;
border-radius: 6px;
text-decoration: none;
font-size: 0.85rem;
font-weight: 400;
transition: all 0.2s ease;
}
.experience-links li a:hover {
border-color: #444;
color: #ffffff;
background-color: #222222;
}
.icon-mask {
width: 16px;
height: 16px;
background-color: var(--important-color);
-webkit-mask-image: var(--icon-url);
mask-image: var(--icon-url);
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-position: center;
mask-position: center;
}
.experience-tasks {
list-style: none;
padding: 0;
@@ -1,18 +1,37 @@
import './SingleExperience.css';
import ReactMarkdown from "react-markdown";
function SingleExperience({ experience }) {
return (
<div className="experience-card">
<div className="experience-card-left">
<h3 className="experience-company">{experience.company}</h3>
<p className="experience-location">{experience.location}</p>
<p className="experience-duration">{experience.duration}</p>
<div className="experience-card-left-container">
<h3 className="experience-company">{experience.company}</h3>
<p className="experience-location">{experience.location}</p>
<p className="experience-duration">{experience.duration}</p>
{experience.links && experience.links.length > 0 && (
<ul className="experience-links">
{experience.links.map((link) => (
<li>
<a href={link.link} target="_blank" rel="noopener noreferrer">
<span
className="icon-mask"
style={{ '--icon-url': `url(/images/icons/${link.icon_path})` }}
/>
<span>{link.label}</span>
</a>
</li>
))}
</ul>
)}
</div>
</div>
<div className="experience-card-right">
<h3 className="experience-role">{experience.role}</h3>
<ul className="experience-tasks">
{experience.tasks.map((task) => (
<li>{task.description}</li>
<li><ReactMarkdown>{task.description}</ReactMarkdown></li>
))}
</ul>
</div>
@@ -1,7 +1,6 @@
import { useParams } from "react-router-dom";
import React, { useEffect, useState } from "react";
import ProjectDetails from "./components/ProjectDetails/ProjectDetails.jsx";
import Footer from "../../components/Footer/Footer.jsx";
function ProjectDetailsPage() {
const { id } = useParams();
@@ -33,7 +32,6 @@ function ProjectDetailsPage() {
return (
<div>
<ProjectDetails project={project}/>
<Footer/>
</div>
);
}
@@ -15,7 +15,7 @@
overflow: hidden;
height: 280px;
background-image: url("/apps/frontend/public/images/projectDetailsHeadband.png");
background-image: url("/images/projectDetailsHeadband.png");
background-size: cover;
&::after {
@@ -75,9 +75,24 @@ function ProjectDetails({project}) {
<ReactMarkdown
remarkPlugins={[remarkGfm]}
components={{
h2({node, ...props}) {
h2({ node, ...props }) {
const id = String(props.children).toLowerCase().replace(/\s+/g, "-");
return <h2 id={id} {...props} />;
},
blockquote({ node, ...props }) {
return (
<blockquote
style={{
margin: '16px 0',
padding: '12px 16px',
backgroundColor: '#161616',
borderLeft: '3px solid #e05a36',
borderRadius: '0 6px 6px 0',
fontSize: '0.85rem',
}}
{...props}
/>
);
}
}}
>
@@ -1,11 +1,9 @@
import Projects from "../../components/Projects/Projects.jsx";
import Footer from "../../components/Footer/Footer.jsx";
function ProjectsPage() {
return (
<div>
<Projects/>
<Footer/>
</div>
);
}