Upgrade Angular and soften light theme
All checks were successful
Deploy dzanan.net / deploy (push) Successful in 48s
All checks were successful
Deploy dzanan.net / deploy (push) Successful in 48s
This commit is contained in:
@@ -33,6 +33,14 @@
|
|||||||
"outputMode": "server",
|
"outputMode": "server",
|
||||||
"ssr": {
|
"ssr": {
|
||||||
"entry": "src/server.ts"
|
"entry": "src/server.ts"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"allowedHosts": [
|
||||||
|
"dzanan.net",
|
||||||
|
"www.dzanan.net",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
|
|||||||
4357
package-lock.json
generated
4357
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
24
package.json
24
package.json
@@ -21,15 +21,15 @@
|
|||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/cdk": "^20.2.14",
|
"@angular/cdk": "^21.2.11",
|
||||||
"@angular/common": "^21.0.0",
|
"@angular/common": "^21.2.13",
|
||||||
"@angular/compiler": "^21.0.0",
|
"@angular/compiler": "^21.2.13",
|
||||||
"@angular/core": "^21.0.0",
|
"@angular/core": "^21.2.13",
|
||||||
"@angular/forms": "^21.0.0",
|
"@angular/forms": "^21.2.13",
|
||||||
"@angular/platform-browser": "^21.0.0",
|
"@angular/platform-browser": "^21.2.13",
|
||||||
"@angular/platform-server": "^21.0.0",
|
"@angular/platform-server": "^21.2.13",
|
||||||
"@angular/router": "^21.0.0",
|
"@angular/router": "^21.2.13",
|
||||||
"@angular/ssr": "^21.0.0",
|
"@angular/ssr": "^21.2.11",
|
||||||
"@tailwindcss/postcss": "^4.1.17",
|
"@tailwindcss/postcss": "^4.1.17",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
@@ -38,9 +38,9 @@
|
|||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular/build": "^21.0.0",
|
"@angular/build": "^21.2.11",
|
||||||
"@angular/cli": "^21.0.0",
|
"@angular/cli": "^21.2.11",
|
||||||
"@angular/compiler-cli": "^21.0.0",
|
"@angular/compiler-cli": "^21.2.13",
|
||||||
"@types/express": "^5.0.1",
|
"@types/express": "^5.0.1",
|
||||||
"@types/jasmine": "~5.1.0",
|
"@types/jasmine": "~5.1.0",
|
||||||
"@types/node": "^20.17.19",
|
"@types/node": "^20.17.19",
|
||||||
|
|||||||
7
src/app/app.routes.spec.ts
Normal file
7
src/app/app.routes.spec.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { routes } from './app.routes';
|
||||||
|
|
||||||
|
describe('app routes', () => {
|
||||||
|
it('keeps the public pages registered', () => {
|
||||||
|
expect(routes.map(route => route.path)).toEqual(['', 'cv', 'portfolio']);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -11,10 +11,10 @@ import { ThemeToggleComponent } from '../../shared/ui/theme-toggle/theme-toggle.
|
|||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
template: `
|
template: `
|
||||||
<div
|
<div
|
||||||
class="min-h-screen bg-zinc-50 text-zinc-900 font-saira transition-colors duration-300 dark:bg-slate-950 dark:text-zinc-100"
|
class="min-h-screen bg-[#f4f7f5] text-zinc-800 font-saira transition-colors duration-300 dark:bg-slate-950 dark:text-zinc-100"
|
||||||
>
|
>
|
||||||
<header
|
<header
|
||||||
class="sticky top-0 z-30 border-b border-zinc-200/80 bg-white/70 backdrop-blur transition-colors duration-300 dark:border-slate-900/60 dark:bg-slate-950/70"
|
class="sticky top-0 z-30 border-b border-zinc-200/70 bg-[#f8faf7]/85 backdrop-blur transition-colors duration-300 dark:border-slate-900/60 dark:bg-slate-950/70"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="mx-auto flex max-w-6xl items-center justify-between px-4 py-4 md:px-8"
|
class="mx-auto flex max-w-6xl items-center justify-between px-4 py-4 md:px-8"
|
||||||
@@ -43,7 +43,7 @@ import { ThemeToggleComponent } from '../../shared/ui/theme-toggle/theme-toggle.
|
|||||||
<a
|
<a
|
||||||
[routerLink]="section.path || []"
|
[routerLink]="section.path || []"
|
||||||
[fragment]="section.fragment"
|
[fragment]="section.fragment"
|
||||||
class="rounded-full px-3 py-2 text-sm font-medium text-zinc-600 transition hover:bg-zinc-100 hover:text-zinc-900 dark:text-zinc-200 dark:hover:bg-slate-900 dark:hover:text-white"
|
class="rounded-full px-3 py-2 text-sm font-medium text-zinc-600 transition hover:bg-emerald-50/80 hover:text-zinc-900 dark:text-zinc-200 dark:hover:bg-slate-900 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
{{ section.label }}
|
{{ section.label }}
|
||||||
</a>
|
</a>
|
||||||
@@ -71,10 +71,10 @@ import { ThemeToggleComponent } from '../../shared/ui/theme-toggle/theme-toggle.
|
|||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="absolute inset-x-0 top-0 h-96 bg-[radial-gradient(circle_at_50%_20%,rgba(16,185,129,0.15),transparent_40%)] dark:bg-[radial-gradient(circle_at_50%_20%,rgba(16,185,129,0.2),transparent_40%)]"
|
class="absolute inset-x-0 top-0 h-96 bg-[radial-gradient(circle_at_50%_20%,rgba(16,185,129,0.1),transparent_42%)] dark:bg-[radial-gradient(circle_at_50%_20%,rgba(16,185,129,0.2),transparent_40%)]"
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
class="absolute inset-y-0 right-0 w-1/2 bg-[radial-gradient(circle_at_80%_50%,rgba(59,130,246,0.1),transparent_35%)] dark:bg-[radial-gradient(circle_at_80%_50%,rgba(59,130,246,0.12),transparent_35%)]"
|
class="absolute inset-y-0 right-0 w-1/2 bg-[radial-gradient(circle_at_80%_50%,rgba(14,165,233,0.07),transparent_38%)] dark:bg-[radial-gradient(circle_at_80%_50%,rgba(59,130,246,0.12),transparent_35%)]"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
@@ -82,7 +82,7 @@ import { ThemeToggleComponent } from '../../shared/ui/theme-toggle/theme-toggle.
|
|||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
<footer
|
<footer
|
||||||
class="border-t border-zinc-200/80 bg-white/80 transition-colors duration-300 dark:border-slate-900/60 dark:bg-slate-950/80"
|
class="border-t border-zinc-200/70 bg-[#f8faf7]/85 transition-colors duration-300 dark:border-slate-900/60 dark:bg-slate-950/80"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-4 px-4 py-6 text-sm text-zinc-500 dark:text-zinc-400 md:px-8"
|
class="mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-4 px-4 py-6 text-sm text-zinc-500 dark:text-zinc-400 md:px-8"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
>
|
>
|
||||||
<div class="grid gap-6 lg:grid-cols-3">
|
<div class="grid gap-6 lg:grid-cols-3">
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
Architecture
|
Architecture
|
||||||
@@ -27,7 +27,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">Front end</p>
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">Front end</p>
|
||||||
<p class="mt-2 text-sm text-zinc-600 dark:text-zinc-300">
|
<p class="mt-2 text-sm text-zinc-600 dark:text-zinc-300">
|
||||||
@@ -36,7 +36,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
Delivery
|
Delivery
|
||||||
@@ -47,7 +47,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
Backend Integration
|
Backend Integration
|
||||||
@@ -57,7 +57,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
API Contracts
|
API Contracts
|
||||||
@@ -67,7 +67,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
Client Handling
|
Client Handling
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</div>
|
</div>
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
Working principles
|
Working principles
|
||||||
@@ -41,7 +41,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">Ways I help</p>
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">Ways I help</p>
|
||||||
<ul class="mt-2 space-y-2 text-sm text-zinc-600 dark:text-zinc-300">
|
<ul class="mt-2 space-y-2 text-sm text-zinc-600 dark:text-zinc-300">
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
>
|
>
|
||||||
<div class="grid gap-6 lg:grid-cols-3">
|
<div class="grid gap-6 lg:grid-cols-3">
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
Experience focus
|
Experience focus
|
||||||
@@ -29,35 +29,35 @@ import { SectionComponent } from '../../shared/ui/section/section.component';
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">Skills & tools</p>
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">Skills & tools</p>
|
||||||
<div class="mt-3 flex flex-wrap gap-2 text-xs">
|
<div class="mt-3 flex flex-wrap gap-2 text-xs">
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
Angular
|
Angular
|
||||||
</span>
|
</span>
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
TypeScript
|
TypeScript
|
||||||
</span>
|
</span>
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
Node.js
|
Node.js
|
||||||
</span>
|
</span>
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
Tailwind
|
Tailwind
|
||||||
</span>
|
</span>
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
Design systems
|
Design systems
|
||||||
</span>
|
</span>
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
Testing
|
Testing
|
||||||
</span>
|
</span>
|
||||||
<span class="rounded-full bg-zinc-100 px-3 py-1 text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200">
|
<span class="rounded-full bg-emerald-50/80 px-3 py-1 text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0">
|
||||||
CI/CD
|
CI/CD
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="rounded-xl border border-zinc-200 bg-white/60 p-4 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-4 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
<p class="text-sm font-semibold text-emerald-600 dark:text-emerald-300">
|
||||||
How I structure work
|
How I structure work
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ type TimelineEntry = {
|
|||||||
lead="Here’s a timeline of my professional growth and key milestones, highlighting significant roles and contributions."
|
lead="Here’s a timeline of my professional growth and key milestones, highlighting significant roles and contributions."
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="overflow-hidden rounded-3xl border border-zinc-200 bg-white/60 shadow-xl shadow-emerald-500/5 backdrop-blur-sm transition-colors duration-300 dark:border-slate-800/60 dark:bg-slate-950/40 dark:shadow-emerald-900/20"
|
class="overflow-hidden rounded-3xl border border-zinc-200/70 bg-[#fbfcfa]/80 shadow-xl shadow-emerald-900/5 backdrop-blur-sm transition-colors duration-300 dark:border-slate-800/60 dark:bg-slate-950/40 dark:shadow-emerald-900/20"
|
||||||
>
|
>
|
||||||
<div class="relative px-4 py-16 md:px-12">
|
<div class="relative px-4 py-16 md:px-12">
|
||||||
<!-- Central Line -->
|
<!-- Central Line -->
|
||||||
@@ -47,7 +47,7 @@ type TimelineEntry = {
|
|||||||
<span class="mb-2 inline-block text-xs font-bold uppercase tracking-widest text-emerald-600/90 dark:text-emerald-500/80">
|
<span class="mb-2 inline-block text-xs font-bold uppercase tracking-widest text-emerald-600/90 dark:text-emerald-500/80">
|
||||||
{{ entry.step }} • {{ entry.phase }}
|
{{ entry.step }} • {{ entry.phase }}
|
||||||
</span>
|
</span>
|
||||||
<h3 class="mb-2 text-xl font-semibold text-zinc-900 transition-colors group-hover:text-emerald-600 dark:text-slate-100 dark:group-hover:text-emerald-400">
|
<h3 class="mb-2 text-xl font-semibold text-zinc-800 transition-colors group-hover:text-emerald-600 dark:text-slate-100 dark:group-hover:text-emerald-400">
|
||||||
{{ entry.title }}
|
{{ entry.title }}
|
||||||
</h3>
|
</h3>
|
||||||
<p class="text-base text-zinc-600 leading-relaxed dark:text-slate-400">
|
<p class="text-base text-zinc-600 leading-relaxed dark:text-slate-400">
|
||||||
@@ -66,7 +66,7 @@ type TimelineEntry = {
|
|||||||
></span>
|
></span>
|
||||||
}
|
}
|
||||||
<div
|
<div
|
||||||
class="relative h-3 w-3 rounded-full bg-emerald-500 ring-4 ring-white shadow-[0_0_12px_rgba(16,185,129,0.6)] transition-all duration-300 group-hover:scale-125 dark:ring-slate-950"
|
class="relative h-3 w-3 rounded-full bg-emerald-500 ring-4 ring-[#f4f7f5] shadow-[0_0_12px_rgba(16,185,129,0.45)] transition-all duration-300 group-hover:scale-125 dark:ring-slate-950"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,7 +78,7 @@ type TimelineEntry = {
|
|||||||
<span class="mb-2 inline-block text-xs font-bold uppercase tracking-widest text-emerald-600/90 dark:text-emerald-500/80">
|
<span class="mb-2 inline-block text-xs font-bold uppercase tracking-widest text-emerald-600/90 dark:text-emerald-500/80">
|
||||||
{{ entry.step }} • {{ entry.phase }}
|
{{ entry.step }} • {{ entry.phase }}
|
||||||
</span>
|
</span>
|
||||||
<h3 class="mb-2 text-xl font-semibold text-zinc-900 transition-colors group-hover:text-emerald-600 dark:text-slate-100 dark:group-hover:text-emerald-400">
|
<h3 class="mb-2 text-xl font-semibold text-zinc-800 transition-colors group-hover:text-emerald-600 dark:text-slate-100 dark:group-hover:text-emerald-400">
|
||||||
{{ entry.title }}
|
{{ entry.title }}
|
||||||
</h3>
|
</h3>
|
||||||
<p class="text-base text-zinc-600 leading-relaxed dark:text-slate-400">
|
<p class="text-base text-zinc-600 leading-relaxed dark:text-slate-400">
|
||||||
@@ -92,7 +92,7 @@ type TimelineEntry = {
|
|||||||
<span class="mb-2 inline-block text-xs font-bold uppercase tracking-widest text-emerald-600/90 dark:text-emerald-500/80">
|
<span class="mb-2 inline-block text-xs font-bold uppercase tracking-widest text-emerald-600/90 dark:text-emerald-500/80">
|
||||||
{{ entry.step }} • {{ entry.phase }}
|
{{ entry.step }} • {{ entry.phase }}
|
||||||
</span>
|
</span>
|
||||||
<h3 class="mb-2 text-xl font-semibold text-zinc-900 transition-colors group-hover:text-emerald-600 dark:text-slate-100 dark:group-hover:text-emerald-400">
|
<h3 class="mb-2 text-xl font-semibold text-zinc-800 transition-colors group-hover:text-emerald-600 dark:text-slate-100 dark:group-hover:text-emerald-400">
|
||||||
{{ entry.title }}
|
{{ entry.title }}
|
||||||
</h3>
|
</h3>
|
||||||
<p class="text-base text-zinc-600 leading-relaxed dark:text-slate-400">
|
<p class="text-base text-zinc-600 leading-relaxed dark:text-slate-400">
|
||||||
|
|||||||
@@ -24,21 +24,21 @@ type PortfolioItem = {
|
|||||||
<div class="grid gap-6 md:grid-cols-2">
|
<div class="grid gap-6 md:grid-cols-2">
|
||||||
@for (item of items; track item.title) {
|
@for (item of items; track item.title) {
|
||||||
<article
|
<article
|
||||||
class="flex h-full flex-col gap-3 rounded-xl border border-zinc-200 bg-white/60 p-5 dark:border-slate-800/60 dark:bg-slate-900/40"
|
class="flex h-full flex-col gap-3 rounded-xl border border-zinc-200/70 bg-[#fbfcfa]/80 p-5 shadow-sm shadow-zinc-200/40 dark:border-slate-800/60 dark:bg-slate-900/40 dark:shadow-none"
|
||||||
>
|
>
|
||||||
<div class="flex items-center justify-between text-sm text-zinc-500 dark:text-zinc-400">
|
<div class="flex items-center justify-between text-sm text-zinc-500 dark:text-zinc-400">
|
||||||
<span>{{ item.period }}</span>
|
<span>{{ item.period }}</span>
|
||||||
<div class="flex flex-wrap gap-1">
|
<div class="flex flex-wrap gap-1">
|
||||||
@for (tag of item.tags; track tag) {
|
@for (tag of item.tags; track tag) {
|
||||||
<span
|
<span
|
||||||
class="rounded-full bg-zinc-100 px-2 py-1 text-[11px] text-zinc-700 dark:bg-slate-800/80 dark:text-zinc-200"
|
class="rounded-full bg-emerald-50/80 px-2 py-1 text-[11px] text-zinc-700 ring-1 ring-emerald-100/70 dark:bg-slate-800/80 dark:text-zinc-200 dark:ring-0"
|
||||||
>
|
>
|
||||||
{{ tag }}
|
{{ tag }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h3 class="text-lg font-semibold text-zinc-900 dark:text-zinc-50">
|
<h3 class="text-lg font-semibold text-zinc-800 dark:text-zinc-50">
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
</h3>
|
</h3>
|
||||||
<p class="text-sm text-zinc-600 dark:text-zinc-300">
|
<p class="text-sm text-zinc-600 dark:text-zinc-300">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { CommonModule } from '@angular/common';
|
|||||||
template: `
|
template: `
|
||||||
<section
|
<section
|
||||||
[id]="id"
|
[id]="id"
|
||||||
class="scroll-mt-24 border-b border-zinc-200 last:border-b-0 dark:border-zinc-800/30"
|
class="scroll-mt-24 border-b border-zinc-200/70 last:border-b-0 dark:border-zinc-800/30"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="mx-auto flex max-w-5xl flex-col gap-6 px-4 py-16 md:px-8 md:py-24"
|
class="mx-auto flex max-w-5xl flex-col gap-6 px-4 py-16 md:px-8 md:py-24"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ import { ThemeService, Theme } from '../../../core/services/theme.service';
|
|||||||
imports: [CommonModule],
|
imports: [CommonModule],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
template: `
|
template: `
|
||||||
<div class="relative flex items-center rounded-full border border-zinc-200 bg-white/50 p-1 backdrop-blur dark:border-slate-800 dark:bg-slate-950/50">
|
<div class="relative flex items-center rounded-full border border-zinc-200/70 bg-[#f8faf7]/70 p-1 backdrop-blur dark:border-slate-800 dark:bg-slate-950/50">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative flex h-7 w-7 items-center justify-center rounded-full text-zinc-500 transition hover:text-zinc-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500 focus-visible:ring-offset-2 dark:text-slate-400 dark:hover:text-slate-100"
|
class="relative flex h-7 w-7 items-center justify-center rounded-full text-zinc-500 transition hover:text-zinc-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500 focus-visible:ring-offset-2 dark:text-slate-400 dark:hover:text-slate-100"
|
||||||
[class.bg-white]="themeService.theme() === 'light'"
|
[class.bg-zinc-50]="themeService.theme() === 'light'"
|
||||||
[class.text-emerald-600]="themeService.theme() === 'light'"
|
[class.text-emerald-600]="themeService.theme() === 'light'"
|
||||||
[class.shadow-sm]="themeService.theme() === 'light'"
|
[class.shadow-sm]="themeService.theme() === 'light'"
|
||||||
[class.dark:bg-slate-800]="themeService.theme() === 'light'"
|
[class.dark:bg-slate-800]="themeService.theme() === 'light'"
|
||||||
@@ -28,7 +28,7 @@ import { ThemeService, Theme } from '../../../core/services/theme.service';
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative flex h-7 w-7 items-center justify-center rounded-full text-zinc-500 transition hover:text-zinc-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500 focus-visible:ring-offset-2 dark:text-slate-400 dark:hover:text-slate-100"
|
class="relative flex h-7 w-7 items-center justify-center rounded-full text-zinc-500 transition hover:text-zinc-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500 focus-visible:ring-offset-2 dark:text-slate-400 dark:hover:text-slate-100"
|
||||||
[class.bg-white]="themeService.theme() === 'system'"
|
[class.bg-zinc-50]="themeService.theme() === 'system'"
|
||||||
[class.text-emerald-600]="themeService.theme() === 'system'"
|
[class.text-emerald-600]="themeService.theme() === 'system'"
|
||||||
[class.shadow-sm]="themeService.theme() === 'system'"
|
[class.shadow-sm]="themeService.theme() === 'system'"
|
||||||
[class.dark:bg-slate-800]="themeService.theme() === 'system'"
|
[class.dark:bg-slate-800]="themeService.theme() === 'system'"
|
||||||
@@ -44,7 +44,7 @@ import { ThemeService, Theme } from '../../../core/services/theme.service';
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative flex h-7 w-7 items-center justify-center rounded-full text-zinc-500 transition hover:text-zinc-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500 focus-visible:ring-offset-2 dark:text-slate-400 dark:hover:text-slate-100"
|
class="relative flex h-7 w-7 items-center justify-center rounded-full text-zinc-500 transition hover:text-zinc-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500 focus-visible:ring-offset-2 dark:text-slate-400 dark:hover:text-slate-100"
|
||||||
[class.bg-white]="themeService.theme() === 'dark'"
|
[class.bg-zinc-50]="themeService.theme() === 'dark'"
|
||||||
[class.text-emerald-600]="themeService.theme() === 'dark'"
|
[class.text-emerald-600]="themeService.theme() === 'dark'"
|
||||||
[class.shadow-sm]="themeService.theme() === 'dark'"
|
[class.shadow-sm]="themeService.theme() === 'dark'"
|
||||||
[class.dark:bg-slate-800]="themeService.theme() === 'dark'"
|
[class.dark:bg-slate-800]="themeService.theme() === 'dark'"
|
||||||
|
|||||||
Reference in New Issue
Block a user