From 273f92a3c3e12aff0a27228d59eb49fe7ce8a58d Mon Sep 17 00:00:00 2001 From: Amirhossein Khalili Date: Tue, 8 Sep 2026 19:21:52 +0330 Subject: [PATCH] style: polish Persian RTL layout and typography --- public/fonts/Peyda-License.txt | 18 ++++ public/fonts/PeydaWeb-Black.woff2 | Bin 0 -> 27272 bytes src/components/EducationSection.module.css | 24 +++-- src/components/ExperienceSection.module.css | 10 +- src/components/HeroSection.module.css | 101 +++++++++++++++++- .../IsometricFooter.module.css | 11 +- src/components/MilestonesSection.module.css | 1 + src/components/ProjectsSection.module.css | 10 ++ src/components/RiverJourney.module.css | 29 +++-- src/components/ScenicHeroJourney.module.css | 5 + src/components/SiteLoader.module.css | 6 +- src/components/SkillsSection.module.css | 4 + src/styles/globals.css | 45 +++++++- 13 files changed, 237 insertions(+), 27 deletions(-) create mode 100644 public/fonts/Peyda-License.txt create mode 100644 public/fonts/PeydaWeb-Black.woff2 diff --git a/public/fonts/Peyda-License.txt b/public/fonts/Peyda-License.txt new file mode 100644 index 0000000..02ea380 --- /dev/null +++ b/public/fonts/Peyda-License.txt @@ -0,0 +1,18 @@ +Peyda fonts are considered a proprietary software. +To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com + +This set of fonts are used in this project under the license: (.....) + +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +In case you use this set of fonts in a software product, write the license code in the specified place and place this file next to the fonts. + +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +فونت های پیدا يک نرم افزار مالکيتی محسوب می شود جهت آگاهی از قوانين استفاده از اين فونت‌ها لطفاً به وبسايت +www.fontiran.com +مراجعه نماييد +اين مجموعه فونت تحت اجازه نامه +(.....) +در اين پروژه استفاده می شود + +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +در صورت استفاده از این مجموعه فونت در یک محصول نرم افزاری‌ یا وب‌سایت کد ۶ رقمی لایسنس خود را در محل مشخص شده (.....) درج کنید و این فایل را در کنار فونت ها قرار دهید. diff --git a/public/fonts/PeydaWeb-Black.woff2 b/public/fonts/PeydaWeb-Black.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6e5555837c29b717c6c5c5dc452371d217b84a14 GIT binary patch literal 27272 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 literal 0 HcmV?d00001 diff --git a/src/components/EducationSection.module.css b/src/components/EducationSection.module.css index 2fda710..8f72e72 100644 --- a/src/components/EducationSection.module.css +++ b/src/components/EducationSection.module.css @@ -45,6 +45,10 @@ transition: transform var(--motion-duration-default) var(--motion-ease-out); } +:global(html[dir='rtl']) .crestImage { + object-position: right top; +} + .institution { font-size: var(--font-size-body-small); line-height: var(--line-height-body-small); @@ -69,6 +73,7 @@ display: flex; flex-direction: column; justify-content: center; + text-align: start; } .degreeTitle { @@ -80,7 +85,8 @@ } .description { - max-width: 72ch; + width: 100%; + max-width: none; font-size: var(--font-size-body-default); line-height: var(--line-height-body-default); color: var(--text-secondary); @@ -90,7 +96,7 @@ background-color: var(--bg-raised); } -@media (max-width: 760px) { +@media (max-width: 900px) { .educationSection { padding-top: var(--space-8); } @@ -104,16 +110,14 @@ .crestCol, .crestContainer { - width: 11.25rem; - height: 8.25rem; + width: 100%; + height: auto; } -} -@media (max-width: 480px) { - .crestCol, - .crestContainer { - width: 9rem; - height: 6.75rem; + .crestImage { + width: 100%; + height: auto; + object-position: center; } } diff --git a/src/components/ExperienceSection.module.css b/src/components/ExperienceSection.module.css index 8fa3e15..e283feb 100644 --- a/src/components/ExperienceSection.module.css +++ b/src/components/ExperienceSection.module.css @@ -89,11 +89,17 @@ .itemContent { display: flex; flex-grow: 1; - padding-left: 1.25rem; + padding-inline-start: 1.25rem; padding-bottom: 2.25rem; gap: 2.25rem; } +.identityCol, +.detailsCol, +.roleTitles { + text-align: start; +} + @media (prefers-reduced-motion: reduce) { .nodeCurrent::after { animation: none; @@ -260,7 +266,7 @@ } .itemContent { - padding-left: var(--space-3); + padding-inline-start: var(--space-3); } .metaRow { diff --git a/src/components/HeroSection.module.css b/src/components/HeroSection.module.css index 915b91e..437ac1c 100644 --- a/src/components/HeroSection.module.css +++ b/src/components/HeroSection.module.css @@ -19,7 +19,8 @@ z-index: 10; display: flex; align-items: center; - justify-content: flex-start; + justify-content: space-between; + direction: ltr; padding: clamp(1.125rem, 2.5vw, 2rem) var(--layout-page-gutter) 0; } @@ -59,6 +60,95 @@ transition: transform var(--motion-duration-default) var(--motion-ease-out); } +.languageButton { + width: var(--size-icon-button); + min-width: 0; + padding: 0; +} + +.languageMenuWrapper { + position: relative; + direction: ltr; +} + +.languageMenu { + position: absolute; + top: calc(100% + 0.625rem); + right: 0; + display: flex; + width: 10.5rem; + flex-direction: column; + gap: 0.25rem; + padding: 0.375rem; + border: 1px solid var(--border-default); + border-radius: var(--radius-md); + background: color-mix(in srgb, var(--bg-raised) 96%, transparent); + box-shadow: 0 0.75rem 2rem var(--shadow-color); + opacity: 0; + visibility: hidden; + pointer-events: none; + transform: translateY(-0.375rem) scale(0.98); + transform-origin: top right; + transition: + opacity var(--motion-duration-fast) ease, + transform var(--motion-duration-fast) var(--motion-ease-out), + visibility 0s linear var(--motion-duration-fast); + backdrop-filter: blur(14px); +} + +.languageMenu[data-open='true'] { + opacity: 1; + visibility: visible; + pointer-events: auto; + transform: translateY(0) scale(1); + transition-delay: 0s; +} + +.languageOption { + display: flex; + min-height: 2.75rem; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + padding: 0.625rem 0.75rem; + border-radius: var(--radius-sm); + color: var(--text-primary); + font-family: 'IRANYekanXVF', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none; + transition: background-color var(--motion-duration-fast) ease; +} + +.languageOption[aria-current='page'] { + background: var(--bg-subtle); + color: var(--action-link); +} + +.languageOptionLabel { + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.languageFlag { + display: block; + width: 1.25rem; + height: 1.25rem; + flex: 0 0 auto; +} + +:global(html[dir='rtl']) .languageMenu { + direction: rtl; + text-align: right; +} + +:global(html[dir='rtl']) .languageOption, +:global(html[dir='rtl']) .languageOptionLabel { + direction: rtl; + text-align: right; +} + .themeIcon { fill: currentColor; } @@ -138,6 +228,10 @@ white-space: nowrap; } +:global(html[dir='rtl']) .heroName { + white-space: normal; +} + /* ── Subtitle ───────────────────────────────────────────────── */ .heroSubtitle { margin-bottom: clamp(1.25rem, 2.8vw, 2.25rem); @@ -378,6 +472,7 @@ gap: 0.5rem; } + .heroButtonPrimary { grid-column: 1 / -1; } @@ -395,6 +490,10 @@ HOVER STATES ================================================================ */ @media (hover: hover) and (pointer: fine) { + .languageOption:hover { + background: var(--bg-subtle); + } + .iconButton:hover { color: var(--color-blue-500); border-color: var(--accent-default); diff --git a/src/components/IsometricFooter/IsometricFooter.module.css b/src/components/IsometricFooter/IsometricFooter.module.css index bf28185..d2cb8db 100644 --- a/src/components/IsometricFooter/IsometricFooter.module.css +++ b/src/components/IsometricFooter/IsometricFooter.module.css @@ -39,6 +39,11 @@ animation: footerFadeIn 0.7s ease-out forwards; } +:global(html[lang='fa']) .headerTitle { + font-family: 'Peyda', 'IRANYekanXVF', sans-serif; + font-weight: 900; +} + .headerSubtitle { font-size: clamp(0.85rem, 2.5vw, 1.05rem); color: var(--text-secondary); @@ -91,6 +96,8 @@ } .emailText { + direction: ltr; + unicode-bidi: isolate; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -245,7 +252,7 @@ display: flex; flex-direction: column; min-width: 0; - text-align: left; + text-align: start; } .contactCardName { @@ -258,6 +265,8 @@ } .contactCardLabel { + direction: ltr; + unicode-bidi: isolate; font-size: 0.88rem; font-weight: 600; color: var(--text-primary); diff --git a/src/components/MilestonesSection.module.css b/src/components/MilestonesSection.module.css index 69246d1..4227abf 100644 --- a/src/components/MilestonesSection.module.css +++ b/src/components/MilestonesSection.module.css @@ -46,6 +46,7 @@ display: flex; flex-direction: column; position: relative; + text-align: start; } .titleRow { diff --git a/src/components/ProjectsSection.module.css b/src/components/ProjectsSection.module.css index 61b9200..80e9843 100644 --- a/src/components/ProjectsSection.module.css +++ b/src/components/ProjectsSection.module.css @@ -149,6 +149,7 @@ flex: 1; flex-direction: column; padding: 1.125rem 1rem; + text-align: start; } .cardTitleRow { @@ -292,6 +293,11 @@ will-change: transform; } +:global(html[dir='rtl']) .scrollbarThumb { + right: 0; + left: auto; +} + .scrollbarDragging .scrollbarThumb { cursor: grabbing; } @@ -526,6 +532,10 @@ transform: translateX(3px); } + :global(html[dir='rtl']) .caseStudyLink:hover svg { + transform: translateX(-3px); + } + .navButtonPrevious:hover:not(:disabled) svg { transform: translateX(-2px); } diff --git a/src/components/RiverJourney.module.css b/src/components/RiverJourney.module.css index ffd477e..8501f90 100644 --- a/src/components/RiverJourney.module.css +++ b/src/components/RiverJourney.module.css @@ -21,13 +21,14 @@ .introBlock { position: absolute; top: 7rem; - left: var(--layout-page-gutter); + inset-inline-start: var(--layout-page-gutter); z-index: 3; width: min(24.375rem, calc(100% - (2 * var(--layout-page-gutter)))); padding: var(--space-4); border-radius: var(--radius-md); background: var(--overlay-contact); backdrop-filter: blur(8px); + text-align: start; } .eyebrow { @@ -58,6 +59,10 @@ transform-origin: left center; } +:global(html[dir='rtl']) .underlineBar { + transform-origin: right center; +} + .introBlock[data-visible='true'] .underlineBar { animation: aboutUnderlineIn 500ms var(--motion-ease-out) 120ms both; } @@ -83,13 +88,13 @@ .stepsList { position: absolute; top: 5.5rem; - right: var(--layout-page-gutter); + inset-inline-end: var(--layout-page-gutter); z-index: 3; display: flex; flex-direction: column; width: min(33rem, 46vw); gap: var(--space-3); - padding-left: 3.5rem; + padding-inline-start: 3.5rem; list-style: none; } @@ -98,7 +103,7 @@ position: absolute; top: 1.25rem; bottom: 1.25rem; - left: 1.25rem; + inset-inline-start: 1.25rem; width: 2px; border-radius: var(--radius-pill); background: var(--border-strong); @@ -117,12 +122,13 @@ box-shadow: 0 0.5rem 1.5rem var(--shadow-color); backdrop-filter: blur(8px); transition: border-color var(--motion-duration-fast) ease; + text-align: start; } .stepIcon { position: absolute; top: 1rem; - left: -3.5rem; + inset-inline-start: -3.5rem; z-index: 1; display: inline-flex; align-items: center; @@ -164,6 +170,7 @@ } .stepContent { + width: 100%; min-width: 0; } @@ -188,7 +195,7 @@ .stepsList { top: 4.5rem; - right: 2rem; + inset-inline-end: 2rem; width: min(28rem, 45vw); } } @@ -208,7 +215,7 @@ .introBlock { position: relative; top: auto; - left: auto; + inset-inline-start: auto; width: 100%; padding: var(--space-4); border: 1px solid var(--border-default); @@ -230,13 +237,13 @@ .stepsList { position: relative; top: auto; - right: auto; + inset-inline-end: auto; display: flex; flex-direction: column; width: 100%; gap: var(--space-3); margin-top: 13.75rem; - padding-left: 3.25rem; + padding-inline-start: 3.25rem; } .stepsList::before { @@ -244,7 +251,7 @@ position: absolute; top: 1.25rem; bottom: 1.25rem; - left: 1.125rem; + inset-inline-start: 1.125rem; width: 2px; background: var(--border-strong); } @@ -260,7 +267,7 @@ .stepIcon { top: 0.75rem; - left: -3.25rem; + inset-inline-start: -3.25rem; } } diff --git a/src/components/ScenicHeroJourney.module.css b/src/components/ScenicHeroJourney.module.css index c6a4b3a..3bec7f8 100644 --- a/src/components/ScenicHeroJourney.module.css +++ b/src/components/ScenicHeroJourney.module.css @@ -100,6 +100,11 @@ animation: landscapeFloatLeft 8s var(--motion-ease-in-out) infinite alternate; } +:global(html[dir='rtl']) .heroBackdrop { + transform: scaleX(-1); + transform-origin: center; +} + .backdropRight { top: clamp(80px, 9vw, 110px); right: clamp(-240px, calc(22% - 29vw), -40px); diff --git a/src/components/SiteLoader.module.css b/src/components/SiteLoader.module.css index 4b7b167..b3b7c8d 100644 --- a/src/components/SiteLoader.module.css +++ b/src/components/SiteLoader.module.css @@ -169,11 +169,15 @@ transition: transform 180ms var(--motion-ease-out); } +:global(html[dir='rtl']) .progressFill { + transform-origin: right center; +} + .progressValue { color: var(--text-secondary); font-size: 0.8125rem; font-variant-numeric: tabular-nums; - text-align: right; + text-align: end; } @keyframes riverArrive { diff --git a/src/components/SkillsSection.module.css b/src/components/SkillsSection.module.css index dc25f24..619048e 100644 --- a/src/components/SkillsSection.module.css +++ b/src/components/SkillsSection.module.css @@ -70,6 +70,10 @@ transform-origin: left center; } +:global(html[dir='rtl']) .segmentFilled { + transform-origin: right center; +} + .mainCard[data-visible='true'] .segmentFilled { animation: meterSegmentIn 400ms var(--motion-ease-out) both; } diff --git a/src/styles/globals.css b/src/styles/globals.css index 4fe72b7..ce2e05f 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -25,6 +25,14 @@ html[data-theme="dark"] { color-scheme: dark; } +@font-face { + font-family: 'Peyda'; + src: url('/fonts/PeydaWeb-Black.woff2') format('woff2'); + font-style: normal; + font-weight: 900; + font-display: swap; +} + html[data-site-loading='true'] { overflow: hidden; } @@ -42,6 +50,16 @@ body { transition: background-color 0.25s ease, color 0.25s ease; } +html[dir='rtl'] body { + text-align: right; +} + +.ltr-token { + direction: ltr; + unicode-bidi: isolate; + font-family: 'IRANYekanXVF', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; +} + /* Master 1440px Fixed Canvas */ .desktop-canvas { width: 100%; @@ -126,6 +144,20 @@ body { transform-origin: left center; } +html[dir='rtl'] .section-header { + align-items: flex-start; + text-align: right; +} + +html[dir='rtl'] .section-eyebrow, +html[dir='rtl'] .section-title { + letter-spacing: 0; +} + +html[dir='rtl'] .section-underline { + transform-origin: right center; +} + /* One-time viewport reveals. Content remains visible when JavaScript is unavailable. */ html[data-motion-ready='true'] [data-reveal] { opacity: 0; @@ -170,12 +202,22 @@ html[data-motion-ready='true'] [data-visible='true'] .section-underline { } } -/* Pacifico Display Font Class */ +/* Keep the original Latin display face and use Peyda for Persian text. */ .font-display { font-family: 'Pacifico', cursive; font-weight: 400; } +html[lang='fa'] .font-display { + font-family: 'Peyda', 'IRANYekanXVF', sans-serif; + font-weight: 900; +} + +html[lang='fa'] .section-title { + font-family: 'Peyda', 'IRANYekanXVF', sans-serif; + font-weight: 900; +} + /* Pill Button */ .pill-btn { display: inline-flex; @@ -188,6 +230,7 @@ html[data-motion-ready='true'] [data-visible='true'] .section-underline { font-size: var(--font-size-button); line-height: var(--line-height-button); font-weight: 600; + font-family: 'IRANYekanXVF', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; cursor: pointer; text-decoration: none; transition: