diff --git a/.DS_Store b/.DS_Store index a45888c..e1ab1bb 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.air.toml b/.air.toml deleted file mode 100644 index 476bb29..0000000 --- a/.air.toml +++ /dev/null @@ -1,37 +0,0 @@ -root = "." -tmp_dir = "tmp" - -[build] - bin = "./tmp/main" - cmd = "templ generate && go build -o ./tmp/main ." - delay = 1000 - exclude_dir = ["assets", "tmp", "vendor"] - exclude_file = [] - exclude_regex = [".*_templ.go"] - exclude_unchanged = false - follow_symlink = false - full_bin = "" - include_dir = [] - include_ext = ["go", "tpl", "tmpl", "templ", "html"] - kill_delay = "0s" - log = "build-errors.log" - send_interrupt = false - stop_on_error = true - -[color] - app = "" - build = "yellow" - main = "magenta" - runner = "green" - watcher = "cyan" - -[log] - time = false - -[misc] - clean_on_exit = false - -[proxy] - enabled = true - proxy_port = 8383 - app_port = 8282 diff --git a/.gitignore b/.gitignore index 6f72f89..3345ea0 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ go.work.sum # env file .env + +# frontend +ts/node_modules diff --git a/Dockerfile b/Dockerfile index 24802c9..6359441 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,12 +4,12 @@ WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . /app -RUN CGO_ENABLED=0 GOOS=linux go build -o /entrypoint +RUN CGO_ENABLED=0 GOOS=linux go build -o ./entrypoint # Deploy. FROM gcr.io/distroless/static-debian11 AS release-stage WORKDIR / -COPY --from=build-stage /entrypoint /entrypoint +COPY --from=build-stage /app/entrypoint /entrypoint COPY --from=build-stage /app/assets /assets EXPOSE 8080 USER nonroot:nonroot diff --git a/Makefile b/Makefile index 2bae59e..57ccc24 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,17 @@ -generate: - templ generate --watch +# run templ generation in watch mode to detect all .templ files and +# re-create _templ.txt files on change, then send reload event to browser. +# Default url: http://localhost:7331 +live/templ: + templ generate --notify-proxy --proxybind="localhost" --proxyport="8080" -server: - air +# run air to detect any go file changes to re-build and re-run the server. +live/server: + templ generate --watch --proxy="http://localhost:8080" --cmd="go run ." + +# run esbuild to generate the index.js bundle in watch mode. +live/rollup: + npm --prefix ts run build:watch + +# start all 5 watch processes in parallel. +live: + make -j5 live/rollup live/server diff --git a/assets/css/styles.css b/assets/css/styles.css new file mode 100644 index 0000000..213dfd4 --- /dev/null +++ b/assets/css/styles.css @@ -0,0 +1,65 @@ +@layer base { + :root { + --navbar-height: 6rem; + --content-height: calc(100vh - var(--navbar-height)); + } + + main { + margin-top: var(--navbar-height); + height: 100%; + padding-bottom: 6rem; + overflow-x: hidden; + } + + .navbar-drawer { + height: var(--content-height); + } + + [x-cloak] { + display: none !important; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateY(20px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.animate-fade-in { + opacity: 0; + animation: fadeIn 1s ease-in forwards; +} + +.animate-slide-in { + opacity: 0; + animation: slideIn 1s ease-out forwards; +} + +.delay-300 { + animation-delay: 300ms; +} + +.delay-600 { + animation-delay: 600ms; +} + +.delay-900 { + animation-delay: 900ms; +} diff --git a/assets/images/portfolio-photo.webp b/assets/images/portfolio-photo.webp new file mode 100644 index 0000000..b5d0747 Binary files /dev/null and b/assets/images/portfolio-photo.webp differ diff --git a/assets/images/profile.webp b/assets/images/profile.webp new file mode 100644 index 0000000..d79a95f Binary files /dev/null and b/assets/images/profile.webp differ diff --git a/assets/js/dateUtils.js b/assets/js/dateUtils.js deleted file mode 100644 index 64eedbb..0000000 --- a/assets/js/dateUtils.js +++ /dev/null @@ -1,40 +0,0 @@ -function calculateDuration(startDate, endDate) { - const start = new Date(startDate); - const end = endDate ? new Date(endDate) : new Date(); - - const years = end.getFullYear() - start.getFullYear(); - const months = end.getMonth() - start.getMonth(); - - let totalMonths = years * 12 + months; - if (end.getDate() < start.getDate()) { - totalMonths--; - } - - const finalYears = Math.floor(totalMonths / 12); - const finalMonths = totalMonths % 12; - - let duration = ""; - if (finalYears > 0) { - duration += `${finalYears} year${finalYears > 1 ? "s" : ""}`; - } - if (finalMonths > 0) { - if (duration) duration += " "; - duration += `${finalMonths} month${finalMonths > 1 ? "s" : ""}`; - } - return duration; -} - -function formatDateRange(startDate, endDate) { - const start = new Date(startDate); - const end = endDate ? new Date(endDate) : new Date(); - - const formatDate = (date) => { - return date.toLocaleDateString("en-US", { - month: "short", - year: "numeric", - }); - }; - - const duration = calculateDuration(startDate, endDate); - return `${formatDate(start)} - ${endDate ? formatDate(end) : "Present"} ยท ${duration}`; -} diff --git a/assets/js/experiences.js b/assets/js/experiences.js new file mode 100644 index 0000000..a872619 --- /dev/null +++ b/assets/js/experiences.js @@ -0,0 +1,2 @@ +!function(){"use strict";const{animate:i,inView:t}=Motion;t("section div",(t=>(i(t,{opacity:1},{duration:.7}),()=>i(t,{opacity:0},{duration:.7}))),{some:.7,initial:!1})}(); +//# sourceMappingURL=experiences.js.map diff --git a/assets/js/experiences.js.map b/assets/js/experiences.js.map new file mode 100644 index 0000000..77ecc47 --- /dev/null +++ b/assets/js/experiences.js.map @@ -0,0 +1 @@ +{"version":3,"file":"experiences.js","sources":["../../ts/src/experiences.ts"],"sourcesContent":["const { animate, inView } = Motion;\n\ninView(\n \"section div\",\n (element) => {\n animate(\n element,\n { opacity: 1 },\n {\n duration: 0.7,\n },\n );\n return () => animate(element, { opacity: 0 }, { duration: 0.7 });\n },\n { some: 0.7, initial: false },\n);\n"],"names":["animate","inView","Motion","element","opacity","duration","some","initial"],"mappings":"yBAAA,MAAMA,QAAEA,EAAOC,OAAEA,GAAWC,OAE5BD,EACE,eACCE,IACCH,EACEG,EACA,CAAEC,QAAS,GACX,CACEC,SAAU,KAGP,IAAML,EAAQG,EAAS,CAAEC,QAAS,GAAK,CAAEC,SAAU,OAE5D,CAAEC,KAAM,GAAKC,SAAS"} \ No newline at end of file diff --git a/assets/js/landing-page-animations.js b/assets/js/landing-page-animations.js deleted file mode 100644 index 23c9bb1..0000000 --- a/assets/js/landing-page-animations.js +++ /dev/null @@ -1,23 +0,0 @@ -const { animate, scroll } = Motion; - -const yearsExperience = document.getElementById("years-experience"); -const programmingLangues = document.getElementById("programming-languages"); - -const startDate = new Date("2019-01-01"); -years = Math.floor((new Date() - startDate) / 1000 / 60 / 60 / 24 / 365); - -animate(0, years, { - duration: 2, - ease: "circOut", - onUpdate: (latest) => { - yearsExperience.innerHTML = Math.round(latest); - }, -}); - -animate(0, 4, { - duration: 2, - ease: "circOut", - onUpdate: (latest) => { - programmingLangues.innerHTML = Math.round(latest); - }, -}); diff --git a/assets/js/landing.js b/assets/js/landing.js new file mode 100644 index 0000000..f2c6ccc --- /dev/null +++ b/assets/js/landing.js @@ -0,0 +1,2 @@ +!function(){"use strict";const{animate:e,stagger:n}=Motion,t=document.getElementById("years-experience");if(!t)throw new Error("years-experience Element not found");const o=document.getElementById("programming-languages");if(!o)throw new Error("languages Element not found");e(0,6,{duration:1.5,ease:"circOut",onUpdate:e=>{const n=Math.floor(e);t.innerHTML=String(n)}}),e(0,4,{duration:1.5,ease:"circOut",onUpdate:e=>{const n=Math.floor(e);o.innerHTML=String(n)}}),e("#years-experience",{count:5},{duration:1.5,delay:n(.1)}),e("#languages",{count:5},{duration:1.5,delay:n(.1)})}(); +//# sourceMappingURL=landing.js.map diff --git a/assets/js/landing.js.map b/assets/js/landing.js.map new file mode 100644 index 0000000..3c702e7 --- /dev/null +++ b/assets/js/landing.js.map @@ -0,0 +1 @@ +{"version":3,"file":"landing.js","sources":["../../ts/src/landing.ts"],"sourcesContent":["const { animate, stagger } = Motion;\n\nconst experienceCountSelector = \"#years-experience\";\nconst languagesCountSelector = \"#languages\";\n\nconst yrsExpCount = document.getElementById(\"years-experience\");\nif (!yrsExpCount) {\n throw new Error(\"years-experience Element not found\");\n}\n\nconst langCount = document.getElementById(\"programming-languages\");\nif (!langCount) {\n throw new Error(\"languages Element not found\");\n}\n\nanimate(0, 6, {\n duration: 1.5,\n ease: \"circOut\",\n onUpdate: (latest) => {\n const yrs = Math.floor(latest);\n yrsExpCount.innerHTML = String(yrs);\n },\n});\n\nanimate(0, 4, {\n duration: 1.5,\n ease: \"circOut\",\n onUpdate: (latest) => {\n const languages = Math.floor(latest);\n langCount.innerHTML = String(languages);\n },\n});\n\nanimate(\n experienceCountSelector,\n { count: 5 },\n { duration: 1.5, delay: stagger(0.1) },\n);\nanimate(\n languagesCountSelector,\n { count: 5 },\n { duration: 1.5, delay: stagger(0.1) },\n);\n"],"names":["animate","stagger","Motion","yrsExpCount","document","getElementById","Error","langCount","duration","ease","onUpdate","latest","yrs","Math","floor","innerHTML","String","languages","count","delay"],"mappings":"yBAAA,MAAMA,QAAEA,EAAOC,QAAEA,GAAYC,OAKvBC,EAAcC,SAASC,eAAe,oBAC5C,IAAKF,EACH,MAAM,IAAIG,MAAM,sCAGlB,MAAMC,EAAYH,SAASC,eAAe,yBAC1C,IAAKE,EACH,MAAM,IAAID,MAAM,+BAGlBN,EAAQ,EAAG,EAAG,CACZQ,SAAU,IACVC,KAAM,UACNC,SAAWC,IACT,MAAMC,EAAMC,KAAKC,MAAMH,GACvBR,EAAYY,UAAYC,OAAOJ,EAAI,IAIvCZ,EAAQ,EAAG,EAAG,CACZQ,SAAU,IACVC,KAAM,UACNC,SAAWC,IACT,MAAMM,EAAYJ,KAAKC,MAAMH,GAC7BJ,EAAUQ,UAAYC,OAAOC,EAAU,IAI3CjB,EA/BgC,oBAiC9B,CAAEkB,MAAO,GACT,CAAEV,SAAU,IAAKW,MAAOlB,EAAQ,MAElCD,EAnC+B,aAqC7B,CAAEkB,MAAO,GACT,CAAEV,SAAU,IAAKW,MAAOlB,EAAQ"} \ No newline at end of file diff --git a/assets/js/navigation.js b/assets/js/navigation.js new file mode 100644 index 0000000..32cbb0e --- /dev/null +++ b/assets/js/navigation.js @@ -0,0 +1,2 @@ +!function(){"use strict";const{animate:e,stagger:i}=Motion,t="#mobile-nav>li";document.addEventListener("alpine:init",(()=>{Alpine.data("navbar",(()=>({isOpen:!1,open(){this.isOpen=!0,e(t,{opacity:[0,1],x:[-50,0]},{delay:i(.1)})},toggle(){this.isOpen?this.close():this.open()},close(){setTimeout((()=>{this.isOpen=!1}),300),e(t,{opacity:[1,0],x:[0,50]},{delay:i(.1)})}})))}))}(); +//# sourceMappingURL=navigation.js.map diff --git a/assets/js/navigation.js.map b/assets/js/navigation.js.map new file mode 100644 index 0000000..de8cd6d --- /dev/null +++ b/assets/js/navigation.js.map @@ -0,0 +1 @@ +{"version":3,"file":"navigation.js","sources":["../../ts/src/navigation.ts"],"sourcesContent":["const { animate, stagger } = Motion;\n\nconst navItemSelector = \"#mobile-nav>li\";\n\ndocument.addEventListener(\"alpine:init\", () => {\n Alpine.data(\"navbar\", () => {\n return {\n isOpen: false,\n open() {\n this.isOpen = true;\n animate(\n navItemSelector,\n { opacity: [0, 1], x: [-50, 0] },\n { delay: stagger(0.1) },\n );\n },\n toggle() {\n this.isOpen ? this.close() : this.open();\n },\n close() {\n setTimeout(() => {\n this.isOpen = false;\n }, 300);\n animate(\n navItemSelector,\n { opacity: [1, 0], x: [0, 50] },\n { delay: stagger(0.1) },\n );\n },\n };\n });\n});\n"],"names":["animate","stagger","Motion","navItemSelector","document","addEventListener","Alpine","data","isOpen","open","this","opacity","x","delay","toggle","close","setTimeout"],"mappings":"yBAAA,MAAMA,QAAEA,EAAOC,QAAEA,GAAYC,OAEvBC,EAAkB,iBAExBC,SAASC,iBAAiB,eAAe,KACvCC,OAAOC,KAAK,UAAU,KACb,CACLC,QAAQ,EACR,IAAAC,GACEC,KAAKF,QAAS,EACdR,EACEG,EACA,CAAEQ,QAAS,CAAC,EAAG,GAAIC,EAAG,EAAC,GAAK,IAC5B,CAAEC,MAAOZ,EAAQ,KAEpB,EACD,MAAAa,GACEJ,KAAKF,OAASE,KAAKK,QAAUL,KAAKD,MACnC,EACD,KAAAM,GACEC,YAAW,KACTN,KAAKF,QAAS,CAAK,GAClB,KACHR,EACEG,EACA,CAAEQ,QAAS,CAAC,EAAG,GAAIC,EAAG,CAAC,EAAG,KAC1B,CAAEC,MAAOZ,EAAQ,KAEpB,KAEH"} \ No newline at end of file diff --git a/assets/json/projects.json b/assets/json/projects.json index 03571f8..69db76e 100644 --- a/assets/json/projects.json +++ b/assets/json/projects.json @@ -5,7 +5,7 @@ "end": null, "stack": ["Go", "Wails", "React", "SQLite3", "TailwindCSS"], "description": "Invoie Management System that helps mechanics create invoices, manage customers, finances and more.", - "thumbnail": "/static/images/invoice-manager-thumbnail.png", + "thumbnail": "/assets/images/invoice-manager-thumbnail.png", "github_link": "", "status": "In Progress" }, diff --git a/components/about_page.templ b/components/about_page.templ index 8e6dabf..c53ede8 100644 --- a/components/about_page.templ +++ b/components/about_page.templ @@ -2,11 +2,201 @@ package components templ AboutPage() { @rootLayout() { -
-
-

About Me

-

I am a software engineer with a passion for web development. I have experience with a variety of technologies including React, Node.js, and MongoDB. I am always looking to learn new things and improve my skills.

-
+
+
+ +
+
+ Mohammad Hariri +
+ Available for Work +
+
+
+

Your Name

+

Full Stack Developer & Problem Solver

+
+

+ Passionate about crafting elegant solutions to complex problems. With expertise in modern web technologies, + I bring ideas to life through clean code and intuitive user experiences. +

+
+ +
+

My Journey

+
+
+
+
+
+
+

Where I Started

+

+ My journey in software development began with a curiosity about how things work. + From building simple websites to developing complex applications, every step has been a learning experience. +

+
+
+
+
+
+
+
+

Where I Am

+

+ Currently, I specialize in full-stack development, focusing on creating scalable and maintainable applications. + I'm passionate about using technology to solve real-world problems. +

+
+
+
+
+
+
+
+

Where I'm Going

+

+ My goal is to continue growing as a developer while contributing to meaningful projects that make a difference. + I'm always excited to learn new technologies and tackle new challenges. +

+
+
+
+
+ +
+

Technical Expertise

+
+
+

Frontend Development

+
    +
  • + + + + React & Next.js +
  • +
  • + + + + TypeScript +
  • +
  • + + + + Tailwind CSS +
  • +
+
+
+

Backend Development

+
    +
  • + + + + Go & Fiber +
  • +
  • + + + + Node.js +
  • +
  • + + + + PostgreSQL +
  • +
+
+
+

Tools & Practices

+
    +
  • + + + + Git & GitHub +
  • +
  • + + + + Docker +
  • +
  • + + + + CI/CD +
  • +
+
+
+
+ +
+

Beyond the Code

+
+
+

When I'm Not Coding

+

+ Outside of development, I enjoy [Your Hobbies/Interests]. I believe in maintaining a healthy work-life balance + and finding inspiration in various aspects of life. +

+
+
+

Let's Connect

+
+

+ I'm always interested in hearing about new projects and opportunities. + Feel free to reach out if you'd like to collaborate or just chat about technology. +

+ +
+
+
+
+
} } diff --git a/components/about_page_templ.go b/components/about_page_templ.go index 0224b73..9a263af 100644 --- a/components/about_page_templ.go +++ b/components/about_page_templ.go @@ -41,7 +41,7 @@ func AboutPage() templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

About Me

I am a software engineer with a passion for web development. I have experience with a variety of technologies including React, Node.js, and MongoDB. I am always looking to learn new things and improve my skills.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
\"Mohammad
Available for Work

Your Name

Full Stack Developer & Problem Solver

Passionate about crafting elegant solutions to complex problems. With expertise in modern web technologies, I bring ideas to life through clean code and intuitive user experiences.

My Journey

Where I Started

My journey in software development began with a curiosity about how things work. From building simple websites to developing complex applications, every step has been a learning experience.

Where I Am

Currently, I specialize in full-stack development, focusing on creating scalable and maintainable applications. I'm passionate about using technology to solve real-world problems.

Where I'm Going

My goal is to continue growing as a developer while contributing to meaningful projects that make a difference. I'm always excited to learn new technologies and tackle new challenges.

Technical Expertise

Frontend Development

  • React & Next.js
  • TypeScript
  • Tailwind CSS

Backend Development

  • Go & Fiber
  • Node.js
  • PostgreSQL

Tools & Practices

  • Git & GitHub
  • Docker
  • CI/CD

Beyond the Code

When I'm Not Coding

Outside of development, I enjoy [Your Hobbies/Interests]. I believe in maintaining a healthy work-life balance and finding inspiration in various aspects of life.

Let's Connect

I'm always interested in hearing about new projects and opportunities. Feel free to reach out if you'd like to collaborate or just chat about technology.

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/components/about_page_templ.txt b/components/about_page_templ.txt new file mode 100644 index 0000000..4ae9d4c --- /dev/null +++ b/components/about_page_templ.txt @@ -0,0 +1 @@ +
\"Mohammad
Available for Work

Your Name

Full Stack Developer & Problem Solver

Passionate about crafting elegant solutions to complex problems. With expertise in modern web technologies, I bring ideas to life through clean code and intuitive user experiences.

My Journey

Where I Started

My journey in software development began with a curiosity about how things work. From building simple websites to developing complex applications, every step has been a learning experience.

Where I Am

Currently, I specialize in full-stack development, focusing on creating scalable and maintainable applications. I'm passionate about using technology to solve real-world problems.

Where I'm Going

My goal is to continue growing as a developer while contributing to meaningful projects that make a difference. I'm always excited to learn new technologies and tackle new challenges.

Technical Expertise

Frontend Development

  • React & Next.js
  • TypeScript
  • Tailwind CSS

Backend Development

  • Go & Fiber
  • Node.js
  • PostgreSQL

Tools & Practices

  • Git & GitHub
  • Docker
  • CI/CD

Beyond the Code

When I'm Not Coding

Outside of development, I enjoy [Your Hobbies/Interests]. I believe in maintaining a healthy work-life balance and finding inspiration in various aspects of life.

Let's Connect

I'm always interested in hearing about new projects and opportunities. Feel free to reach out if you'd like to collaborate or just chat about technology.

\ No newline at end of file diff --git a/components/contact_page_templ.txt b/components/contact_page_templ.txt new file mode 100644 index 0000000..028256b --- /dev/null +++ b/components/contact_page_templ.txt @@ -0,0 +1 @@ +

Get in Touch

Have a question or want to work together? Let's connect!

\ No newline at end of file diff --git a/components/experience_card.templ b/components/experience_card.templ deleted file mode 100644 index 0869e97..0000000 --- a/components/experience_card.templ +++ /dev/null @@ -1,46 +0,0 @@ -package components - -import "github.com/moh682/portfolio/domain" -import "slices" -import "strings" - -templ experienceCard(exp domain.Experience) { -
-
- -
-

{ exp.Job.Title }

-
- { exp.Company.Name } -

{ exp.Duration() }

-

{ exp.GetStartDate() } - { exp.GetEndDate() }

- { exp.Company.City } -
-
- for _, stack := range slices.Concat(exp.Job.FrontendStack, exp.Job.BackendStack, exp.Job.InfrastructureStack) { - @techStack(stack) - } -
-
- -
- -
-
-

About { exp.Company.Name }

- for _, description := range strings.Split(exp.Company.Description, "\n") { -

- { description } -

- } -
-
-

Role & Responsibilities

-
- { exp.Job.Description } -
-
-
-
-
-} diff --git a/components/experience_card_templ.go b/components/experience_card_templ.go deleted file mode 100644 index c60a033..0000000 --- a/components/experience_card_templ.go +++ /dev/null @@ -1,199 +0,0 @@ -// Code generated by templ - DO NOT EDIT. - -// templ: version: v0.3.833 -package components - -//lint:file-ignore SA4006 This context is only used if a nested component is present. - -import "github.com/a-h/templ" -import templruntime "github.com/a-h/templ/runtime" - -import "github.com/moh682/portfolio/domain" -import "slices" -import "strings" - -func experienceCard(exp domain.Experience) templ.Component { - return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { - return templ_7745c5c3_CtxErr - } - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var1 := templ.GetChildren(ctx) - if templ_7745c5c3_Var1 == nil { - templ_7745c5c3_Var1 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var2 string - templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Job.Title) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 12, Col: 65} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var4 string - templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Company.Name) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 14, Col: 113} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var5 string - templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Duration()) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 15, Col: 48} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var6 string - templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(exp.GetStartDate()) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 16, Col: 59} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, " - ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var7 string - templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(exp.GetEndDate()) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 16, Col: 82} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var9 string - templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Company.City) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 17, Col: 100} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - for _, stack := range slices.Concat(exp.Job.FrontendStack, exp.Job.BackendStack, exp.Job.InfrastructureStack) { - templ_7745c5c3_Err = techStack(stack).Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "

About ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var10 string - templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Company.Name) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 30, Col: 61} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - for _, description := range strings.Split(exp.Company.Description, "\n") { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var11 string - templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(description) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 33, Col: 20} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "

Role & Responsibilities

") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Job.Description) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experience_card.templ`, Line: 40, Col: 27} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return nil - }) -} - -var _ = templruntime.GeneratedTemplate diff --git a/components/experiences_page.templ b/components/experiences_page.templ index 861a0c2..446be5b 100644 --- a/components/experiences_page.templ +++ b/components/experiences_page.templ @@ -2,59 +2,61 @@ package components import "github.com/moh682/portfolio/domain" -import "fmt" + +import "slices" +import "strings" + +templ experienceCard(exp domain.Experience) { +
+ +
+

{ exp.Job.Title }

+
+ { exp.Company.Name } +

{ exp.Duration() }

+

{ exp.GetStartDate() } - { exp.GetEndDate() }

+ { exp.Company.City } +
+
+ for _, stack := range slices.Concat(exp.Job.FrontendStack, exp.Job.BackendStack, exp.Job.InfrastructureStack) { + @techStack(stack) + } +
+
+

About { exp.Company.Name }

+ for _, description := range strings.Split(exp.Company.Description, "\n") { +

+ { description } +

+ } +
+
+

Role & Responsibilities

+
+ { exp.Job.Description } +
+
+
+
+} templ ExperiencesPage(experiences []domain.Experience) { @rootLayout() { -
-
- -
-
- for i := range experiences { -
-
-
- } + +
+
+
+ +
+
+
+
+
-
-
-
-
-

Professional Experience

-

Building and scaling software solutions that matter

-
-
-
-
-
-
- for i, exp := range experiences { -
-
-
-
-
-
-
-
-
- @experienceCard(exp) -
- } -
-
+
+ for _, exp := range experiences { + @experienceCard(exp) + }
diff --git a/components/experiences_page_templ.go b/components/experiences_page_templ.go index b279ca9..a7026c9 100644 --- a/components/experiences_page_templ.go +++ b/components/experiences_page_templ.go @@ -10,9 +10,11 @@ import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" import "github.com/moh682/portfolio/domain" -import "fmt" -func ExperiencesPage(experiences []domain.Experience) templ.Component { +import "slices" +import "strings" + +func experienceCard(exp domain.Experience) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -33,7 +35,191 @@ func ExperiencesPage(experiences []domain.Experience) templ.Component { templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var2 string + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Job.Title) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 13, Col: 63} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Company.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 15, Col: 112} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var5 string + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Duration()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 16, Col: 47} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(exp.GetStartDate()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 17, Col: 58} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, " - ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 string + templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(exp.GetEndDate()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 17, Col: 81} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var9 string + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Company.City) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 18, Col: 99} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, stack := range slices.Concat(exp.Job.FrontendStack, exp.Job.BackendStack, exp.Job.InfrastructureStack) { + templ_7745c5c3_Err = techStack(stack).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "

About ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var10 string + templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Company.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 26, Col: 60} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, description := range strings.Split(exp.Company.Description, "\n") { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(description) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 29, Col: 19} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "

Role & Responsibilities

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(exp.Job.Description) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/experiences_page.templ`, Line: 36, Col: 26} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func ExperiencesPage(experiences []domain.Experience) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var13 := templ.GetChildren(ctx) + if templ_7745c5c3_Var13 == nil { + templ_7745c5c3_Var13 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var14 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) if !templ_7745c5c3_IsBuffer { @@ -45,190 +231,45 @@ func ExperiencesPage(experiences []domain.Experience) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - for i := range experiences { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var4 = []any{"h-12 w-1 mb-4 transition-all duration-300 cursor-pointer hover:bg-emerald-400"} - templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var4...) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "

Professional Experience

Building and scaling software solutions that matter

") + var templ_7745c5c3_Var15 = []any{"flex items-center flex-grow-0 justify-center w-10 h-10 rounded-full bg-emerald-900 border-4 border-slate-800 z-[80]"} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var15...) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - for i, exp := range experiences { - var templ_7745c5c3_Var8 = []any{"absolute w-full transition-all opacity-0 duration-700 ease-out translate-y-10"} - templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var8...) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var12 = []any{fmt.Sprintf("relative flex w-full h-full items-center justify-center translate-y-[%dpx]", i*4*32)} - templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var12...) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var14 = []any{"flex items-center flex-grow-0 justify-center w-10 h-10 rounded-full bg-emerald-900 border-4 border-slate-800 z-[80]"} - templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var14...) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, exp := range experiences { templ_7745c5c3_Err = experienceCard(exp).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } return nil }) - templ_7745c5c3_Err = rootLayout().Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + templ_7745c5c3_Err = rootLayout().Render(templ.WithChildren(ctx, templ_7745c5c3_Var14), templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/components/experiences_page_templ.txt b/components/experiences_page_templ.txt new file mode 100644 index 0000000..7d41f74 --- /dev/null +++ b/components/experiences_page_templ.txt @@ -0,0 +1,19 @@ +

+

+

+

+ - +

+
+

About +

+

+

+

Role & Responsibilities

+
+
+
+
\ No newline at end of file diff --git a/components/external_links_templ.txt b/components/external_links_templ.txt new file mode 100644 index 0000000..940b365 --- /dev/null +++ b/components/external_links_templ.txt @@ -0,0 +1,5 @@ +
\ No newline at end of file diff --git a/components/landing_page.templ b/components/landing_page.templ index 83f39f6..36cbf0d 100644 --- a/components/landing_page.templ +++ b/components/landing_page.templ @@ -2,16 +2,16 @@ package components templ LandingPage() { @rootLayout() { - -
+ +
-
-
+
+
-
-
- Software Developer +
+
+ Software Engineer

Hey there! I'm Mohammad Hariri

@@ -46,7 +46,7 @@ templ LandingPage() {
Mohammad Hariri @@ -54,7 +54,7 @@ templ LandingPage() {
-
+
0
Years Experience
diff --git a/components/landing_page_templ.go b/components/landing_page_templ.go index 0f4261b..10500af 100644 --- a/components/landing_page_templ.go +++ b/components/landing_page_templ.go @@ -41,7 +41,7 @@ func LandingPage() templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
Software Developer

Hey there! I'm Mohammad Hariri

I turn complex problems into elegant code solutions. Passionate about building robust applications that make a real difference in people's lives.

\"Mohammad
0
Years Experience
0
Programming Languages
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
Software Engineer

Hey there! I'm Mohammad Hariri

I turn complex problems into elegant code solutions. Passionate about building robust applications that make a real difference in people's lives.

\"Mohammad
0
Years Experience
0
Programming Languages
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/components/landing_page_templ.txt b/components/landing_page_templ.txt new file mode 100644 index 0000000..8bbc0d6 --- /dev/null +++ b/components/landing_page_templ.txt @@ -0,0 +1 @@ +
Software Engineer

Hey there! I'm Mohammad Hariri

I turn complex problems into elegant code solutions. Passionate about building robust applications that make a real difference in people's lives.

\"Mohammad
0
Years Experience
0
Programming Languages
\ No newline at end of file diff --git a/components/layout.templ b/components/layout.templ index a342535..8d767e8 100644 --- a/components/layout.templ +++ b/components/layout.templ @@ -1,58 +1,23 @@ package components templ rootLayout() { - + + + + + + + Mohammad's Portfolio - @navbar() -
- { children... } -
+ { children... } } diff --git a/components/layout_templ.go b/components/layout_templ.go index 0e8a9d8..4566075 100644 --- a/components/layout_templ.go +++ b/components/layout_templ.go @@ -29,7 +29,7 @@ func rootLayout() templ.Component { templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "Mohammad's Portfolio") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "Mohammad's Portfolio") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -37,15 +37,11 @@ func rootLayout() templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } templ_7745c5c3_Err = templ_7745c5c3_Var1.Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/components/layout_templ.txt b/components/layout_templ.txt new file mode 100644 index 0000000..47a138c --- /dev/null +++ b/components/layout_templ.txt @@ -0,0 +1,2 @@ +Mohammad's Portfolio + \ No newline at end of file diff --git a/components/logo.templ b/components/logo.templ index d84e20a..eac8d26 100644 --- a/components/logo.templ +++ b/components/logo.templ @@ -1,7 +1,7 @@ package components -import "fmt" - -templ Logo(size int) { - +templ Logo() { +
+ +
} diff --git a/components/logo_templ.go b/components/logo_templ.go index 92260bf..dfa01d3 100644 --- a/components/logo_templ.go +++ b/components/logo_templ.go @@ -8,9 +8,7 @@ package components import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import "fmt" - -func Logo(size int) templ.Component { +func Logo() templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -31,20 +29,7 @@ func Logo(size int) templ.Component { templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/components/logo_templ.txt b/components/logo_templ.txt new file mode 100644 index 0000000..159dd72 --- /dev/null +++ b/components/logo_templ.txt @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/components/navbar.templ b/components/navbar.templ index db8cf0b..694187b 100644 --- a/components/navbar.templ +++ b/components/navbar.templ @@ -1,28 +1,86 @@ package components templ navbar() { -