Merge branch 'master' of https://github.com/poyrazavsever/poyraz-portfolio-new
This commit is contained in:
@@ -63,8 +63,12 @@ export function HomeHero({ news }: HomeHeroProps) {
|
|||||||
<span className="font-secondary text-red-600">Avsever</span>
|
<span className="font-secondary text-red-600">Avsever</span>
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
<Typography variant="small" className="text-muted-foreground">
|
<Typography variant="small" className="text-xs leading-relaxed text-muted-foreground sm:text-sm">
|
||||||
{t("role")}
|
{t.rich("role", {
|
||||||
|
strong: (chunks) => (
|
||||||
|
<strong className="font-semibold text-foreground">{chunks}</strong>
|
||||||
|
),
|
||||||
|
})}
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
} from "poyraz-ui/atoms";
|
} from "poyraz-ui/atoms";
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "poyraz-ui/molecules";
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "poyraz-ui/molecules";
|
||||||
import {
|
import {
|
||||||
|
getResumeHref,
|
||||||
LINK_DIRECTORY,
|
LINK_DIRECTORY,
|
||||||
LINK_DIRECTORY_CATEGORIES,
|
LINK_DIRECTORY_CATEGORIES,
|
||||||
SOCIAL_LINKS,
|
SOCIAL_LINKS,
|
||||||
@@ -158,7 +159,7 @@ export function LinksContent() {
|
|||||||
|
|
||||||
<div className="grid gap-2 sm:grid-cols-2">
|
<div className="grid gap-2 sm:grid-cols-2">
|
||||||
{TOP_ICON_LINKS.map((item) => {
|
{TOP_ICON_LINKS.map((item) => {
|
||||||
const href = item.id === "cv" ? `/resume-${locale}.pdf` : item.href;
|
const href = item.id === "cv" ? getResumeHref(locale) : item.href;
|
||||||
return (
|
return (
|
||||||
<a
|
<a
|
||||||
key={item.id}
|
key={item.id}
|
||||||
@@ -228,7 +229,7 @@ export function LinksContent() {
|
|||||||
|
|
||||||
<div className="grid gap-2">
|
<div className="grid gap-2">
|
||||||
{filteredItems.map((item) => {
|
{filteredItems.map((item) => {
|
||||||
const href = item.id === "cv" ? `/resume-${locale}.pdf` : item.href;
|
const href = item.id === "cv" ? getResumeHref(locale) : item.href;
|
||||||
const isStaticOrExternal = item.external || item.id === "rss" || item.id === "cv" || href.endsWith(".xml") || href.endsWith(".pdf");
|
const isStaticOrExternal = item.external || item.id === "rss" || item.id === "cv" || href.endsWith(".xml") || href.endsWith(".pdf");
|
||||||
const CardContent = (
|
const CardContent = (
|
||||||
<Card className="rounded-2xl border-border p-3 transition-all hover:-translate-y-0.5 hover:border-red-600/40">
|
<Card className="rounded-2xl border-border p-3 transition-all hover:-translate-y-0.5 hover:border-red-600/40">
|
||||||
|
|||||||
@@ -12,25 +12,22 @@ type ReferenceCardsProps = {
|
|||||||
|
|
||||||
export function ReferenceCards({ className, cardClassName, lineClamp }: ReferenceCardsProps) {
|
export function ReferenceCards({ className, cardClassName, lineClamp }: ReferenceCardsProps) {
|
||||||
const locale = useLocale();
|
const locale = useLocale();
|
||||||
|
const hoverClassName =
|
||||||
|
"transition-colors duration-200 group-hover:border-red-600/40 group-hover:bg-muted/30 group-hover:shadow-sm";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={className}>
|
<div className={className}>
|
||||||
{REFERENCES.map((item) => {
|
{REFERENCES.map((item) => {
|
||||||
const quoteText = getLocalizedValue(item.quote, locale);
|
const quoteText = getLocalizedValue(item.quote, locale);
|
||||||
const quoteContent = lineClamp ? (
|
|
||||||
<span className="line-clamp-3">{quoteText}</span>
|
|
||||||
) : (
|
|
||||||
quoteText
|
|
||||||
);
|
|
||||||
|
|
||||||
const card = (
|
const card = (
|
||||||
<TestimonialCard
|
<TestimonialCard
|
||||||
quote={quoteContent as any}
|
quote={quoteText}
|
||||||
author={item.author}
|
author={item.author}
|
||||||
role={getLocalizedValue(item.role, locale)}
|
role={getLocalizedValue(item.role, locale)}
|
||||||
avatar={item.avatar}
|
avatar={item.avatar}
|
||||||
rating={item.rating}
|
rating={item.rating}
|
||||||
className={`flex flex-col rounded-sm ${cardClassName || "w-70 shrink-0"}`}
|
className={`flex flex-col rounded-sm ${lineClamp ? "[&_p]:line-clamp-3" : ""} ${hoverClassName} ${cardClassName || "w-70 shrink-0"}`}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -47,7 +44,7 @@ export function ReferenceCards({ className, cardClassName, lineClamp }: Referenc
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
aria-label={`${item.author} bağlantısı`}
|
aria-label={`${item.author} bağlantısı`}
|
||||||
className="block h-full transition-transform hover:scale-[1.02]"
|
className="group block h-full"
|
||||||
>
|
>
|
||||||
{card}
|
{card}
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export function ReferencesDetailContent() {
|
|||||||
const t = useTranslations("About");
|
const t = useTranslations("About");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="flex h-full flex-col gap-4 overflow-y-auto">
|
<section className="flex flex-col gap-4 overflow-x-hidden">
|
||||||
<Link
|
<Link
|
||||||
href="/about"
|
href="/about"
|
||||||
className="inline-flex w-fit items-center rounded-sm border border-border px-3 py-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground"
|
className="inline-flex w-fit items-center rounded-sm border border-border px-3 py-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground"
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import {
|
|||||||
SheetTrigger,
|
SheetTrigger,
|
||||||
} from "poyraz-ui/molecules";
|
} from "poyraz-ui/molecules";
|
||||||
import { useKeyboardShortcutLabel } from "@/lib/use-keyboard-shortcut-label";
|
import { useKeyboardShortcutLabel } from "@/lib/use-keyboard-shortcut-label";
|
||||||
import { NAV_LINKS, SOCIAL_LINKS, TOP_ICON_LINKS } from "@/lib/links";
|
import { getResumeHref, NAV_LINKS, SOCIAL_LINKS, TOP_ICON_LINKS } from "@/lib/links";
|
||||||
|
|
||||||
const SearchCommand = dynamic(
|
const SearchCommand = dynamic(
|
||||||
() => import("@/components/search-command").then((mod) => mod.SearchCommand),
|
() => import("@/components/search-command").then((mod) => mod.SearchCommand),
|
||||||
@@ -58,7 +58,7 @@ export function SiteNavbar() {
|
|||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
<div className="flex items-center justify-end gap-2 border-b border-border pb-3">
|
<div className="flex items-center justify-end gap-2 border-b border-border pb-3">
|
||||||
{TOP_ICON_LINKS.map((item) => {
|
{TOP_ICON_LINKS.map((item) => {
|
||||||
const href = item.id === "cv" ? `/resume-${locale}.pdf` : item.href;
|
const href = item.id === "cv" ? getResumeHref(locale) : item.href;
|
||||||
return (
|
return (
|
||||||
<a
|
<a
|
||||||
key={item.id}
|
key={item.id}
|
||||||
|
|||||||
@@ -101,6 +101,10 @@ export const TOP_ICON_LINKS = [
|
|||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
|
export function getResumeHref(locale: string) {
|
||||||
|
return `/${locale === "en" ? "en" : "tr"}/resume.pdf`;
|
||||||
|
}
|
||||||
|
|
||||||
export type LinkDirectoryCategory = "navigation" | "social" | "resources";
|
export type LinkDirectoryCategory = "navigation" | "social" | "resources";
|
||||||
|
|
||||||
export type LinkDirectoryItem = {
|
export type LinkDirectoryItem = {
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@
|
|||||||
"resume": "Resume"
|
"resume": "Resume"
|
||||||
},
|
},
|
||||||
"Home": {
|
"Home": {
|
||||||
"role": "A young mind curious about technology. Following developments in software development, AI, and the tech world.",
|
"role": "I build <strong>full-stack products</strong>, shape experiences with <strong>AI systems</strong>, and explain <strong>technology-design-software</strong> through practical content.",
|
||||||
"sections": {
|
"sections": {
|
||||||
"recentPosts": "Recent Posts",
|
"recentPosts": "Recent Posts",
|
||||||
"references": "References",
|
"references": "References",
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@
|
|||||||
"resume": "Özgeçmiş"
|
"resume": "Özgeçmiş"
|
||||||
},
|
},
|
||||||
"Home": {
|
"Home": {
|
||||||
"role": "Teknolojiyi merak eden bir genç. Yazılım geliştirme, yapay zeka ve teknoloji dünyasındaki gelişmeleri takip ediyor.",
|
"role": "<strong>Full-stack ürünler</strong> geliştiriyor, <strong>yapay zeka sistemleriyle</strong> deneyimler kuruyor ve <strong>teknoloji-tasarım-yazılımı</strong> uygulanabilir içeriklerle anlatıyorum.",
|
||||||
"sections": {
|
"sections": {
|
||||||
"recentPosts": "Son Yazılar",
|
"recentPosts": "Son Yazılar",
|
||||||
"references": "Referanslar",
|
"references": "Referanslar",
|
||||||
|
|||||||
+2
-2
@@ -4,6 +4,6 @@ import {routing} from "./i18n/routing";
|
|||||||
export default createMiddleware(routing);
|
export default createMiddleware(routing);
|
||||||
|
|
||||||
export const config = {
|
export const config = {
|
||||||
// Match only internationalized pathnames
|
// Match pages, but skip API/internal/static files like `/tr/resume.pdf`.
|
||||||
matcher: ["/", "/(tr|en)/:path*", "/((?!_next|_vercel|.*\\..*).*)"]
|
matcher: ["/((?!api|trpc|_next|_vercel|.*\\..*).*)"],
|
||||||
};
|
};
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user