From 3f55c24e368ab2be009a245e5b9b01c518cff883 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Sun, 25 Jan 2026 22:18:20 +0500 Subject: [PATCH] Improved the Right to Left Direction implementation for relevant languages. (#2583) * Added support for right to left direction of bullet points in the page render and text editor * Added right to left direction support by adding a toggle button in the layout and enhancing the css element of the page render to support it without affecting the default left to right direction * Moved the Right to Life Direction Toggle feature to be integrated with the Languages section using locale * change all occurrances of pl, pr, ml, mr, left, right to start/end equivalents --------- Co-authored-by: Amruth Pillai --- .gitignore | 6 +- locales/af-ZA.po | Bin 95300 -> 73840 bytes locales/am-ET.po | 2 +- locales/ar-SA.po | 2 +- locales/az-AZ.po | 2 +- locales/bg-BG.po | 2 +- locales/bn-BD.po | 2 +- locales/ca-ES.po | 2 +- locales/cs-CZ.po | 2 +- locales/da-DK.po | 2 +- locales/de-DE.po | 2 +- locales/el-GR.po | 2 +- locales/es-ES.po | 2 +- locales/fa-IR.po | 2 +- locales/fi-FI.po | 2 +- locales/fr-FR.po | 2 +- locales/he-IL.po | 2 +- locales/hi-IN.po | 2 +- locales/hu-HU.po | 2 +- locales/id-ID.po | 2 +- locales/it-IT.po | 2 +- locales/ja-JP.po | 2 +- locales/km-KH.po | 2 +- locales/kn-IN.po | 2 +- locales/ko-KR.po | 2 +- locales/lt-LT.po | 2 +- locales/lv-LV.po | 2 +- locales/ml-IN.po | 2 +- locales/mr-IN.po | 2 +- locales/ms-MY.po | 2 +- locales/ne-NP.po | 2 +- locales/nl-NL.po | 2 +- locales/no-NO.po | 2 +- locales/or-IN.po | 2 +- locales/pl-PL.po | 2 +- locales/pt-BR.po | 2 +- locales/pt-PT.po | 2 +- locales/ro-RO.po | 2 +- locales/ru-RU.po | 2 +- locales/sk-SK.po | 2 +- locales/sq-AL.po | 2 +- locales/sr-SP.po | 2 +- locales/sv-SE.po | 2 +- locales/ta-IN.po | 2 +- locales/te-IN.po | 2 +- locales/th-TH.po | 2 +- locales/tr-TR.po | 2 +- locales/uk-UA.po | 2 +- locales/uz-UZ.po | 2 +- locales/vi-VN.po | 2 +- locales/zh-CN.po | 2 +- locales/zh-TW.po | 2 +- locales/zu-ZA.po | 2 +- src/components/animation/spotlight.tsx | 16 +-- src/components/input/chip-input.tsx | 4 +- src/components/input/rich-input.module.css | 59 +++++++++- src/components/input/rich-input.tsx | 2 +- src/components/input/url-input.tsx | 2 +- .../layout/breakpoint-indicator.tsx | 4 +- src/components/resume/preview.module.css | 50 +++++++++ src/components/resume/preview.tsx | 6 +- src/components/resume/templates/azurill.tsx | 102 ++++++++++-------- src/components/resume/templates/bronzor.tsx | 8 +- src/components/resume/templates/chikorita.tsx | 11 +- src/components/resume/templates/ditgar.tsx | 25 ++++- src/components/resume/templates/ditto.tsx | 9 +- src/components/resume/templates/gengar.tsx | 9 +- src/components/resume/templates/glalie.tsx | 9 +- src/components/resume/templates/kakuna.tsx | 8 +- src/components/resume/templates/lapras.tsx | 6 +- src/components/resume/templates/leafish.tsx | 5 +- src/components/resume/templates/onyx.tsx | 8 +- src/components/resume/templates/pikachu.tsx | 60 ++++++----- src/components/resume/templates/rhyhorn.tsx | 10 +- src/components/ui/alert.tsx | 4 +- src/components/ui/avatar.tsx | 2 +- src/components/ui/badge.tsx | 2 +- src/components/ui/button-group.tsx | 2 +- src/components/ui/combobox.tsx | 2 +- src/components/ui/command.tsx | 2 +- src/components/ui/context-menu.tsx | 18 ++-- src/components/ui/dropdown-menu.tsx | 14 +-- src/components/ui/hover-card.tsx | 2 +- src/components/ui/input-group.tsx | 6 +- src/components/ui/multiple-combobox.tsx | 2 +- src/components/ui/popover.tsx | 2 +- src/components/ui/resizable.tsx | 2 +- src/components/ui/sheet.tsx | 4 +- src/components/ui/sidebar.tsx | 20 ++-- src/components/ui/switch.tsx | 6 +- src/components/ui/tabs.tsx | 2 +- src/components/ui/tooltip.tsx | 2 +- src/dialogs/auth/enable-two-factor.tsx | 4 +- src/dialogs/resume/index.tsx | 4 +- src/dialogs/resume/sections/interest.tsx | 2 +- src/dialogs/resume/sections/profile.tsx | 2 +- src/dialogs/resume/sections/skill.tsx | 2 +- src/routes/$username/$slug.tsx | 2 +- src/routes/_home/-sections/donate.tsx | 8 +- src/routes/_home/-sections/faq.tsx | 6 +- src/routes/_home/-sections/footer.tsx | 2 +- src/routes/_home/-sections/hero.tsx | 2 +- src/routes/_home/-sections/prefooter.tsx | 4 +- .../_home/-sections/product-hunt-banner.tsx | 2 +- src/routes/_home/-sections/statistics.tsx | 4 +- src/routes/_home/-sections/templates.tsx | 2 +- src/routes/_home/-sections/testimonials.tsx | 4 +- src/routes/_home/route.tsx | 2 +- .../builder/$resumeId/-components/edge.tsx | 2 +- .../builder/$resumeId/-components/header.tsx | 12 +-- .../builder/$resumeId/-sidebar/left/index.tsx | 2 +- .../-sidebar/left/sections/custom-fields.tsx | 6 +- .../-sidebar/left/shared/section-base.tsx | 2 +- .../-sidebar/left/shared/section-item.tsx | 2 +- .../$resumeId/-sidebar/right/index.tsx | 2 +- .../-sidebar/right/sections/layout/index.tsx | 6 +- .../-sidebar/right/sections/layout/pages.tsx | 2 +- .../-sidebar/right/shared/section-base.tsx | 2 +- src/routes/dashboard/-components/header.tsx | 2 +- src/routes/dashboard/-components/sidebar.tsx | 4 +- src/routes/dashboard/resumes/index.tsx | 4 +- src/routes/dashboard/route.tsx | 2 +- .../authentication/-components/passkeys.tsx | 2 +- src/styles/globals.css | 21 ++++ src/utils/locale.ts | 8 ++ 125 files changed, 484 insertions(+), 264 deletions(-) diff --git a/.gitignore b/.gitignore index 9d2c982e4..7ffd1aa19 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,8 @@ node_modules !.env.example public/sw.js scripts/**/*.json -public/workbox-*.js \ No newline at end of file +public/workbox-*.js + +# Compiled translation files +/locales/*.js +!/locales/*.po \ No newline at end of file diff --git a/locales/af-ZA.po b/locales/af-ZA.po index 649af400ab40cb36e019671f0e012b4f36b3a8fa..030b7a5de153ea872cd44cceacd801ba443e79c4 100644 GIT binary patch delta 9711 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 U9(v|(BgF+d;-DsG?GtPHe}OnbX#fBK literal 95300 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
{chips.map((chip, idx) => (
- + {chip} diff --git a/src/components/input/rich-input.module.css b/src/components/input/rich-input.module.css index f3139e3f3..9d8e1ad9a 100644 --- a/src/components/input/rich-input.module.css +++ b/src/components/input/rich-input.module.css @@ -1,6 +1,8 @@ .tiptap_content { --list-margin: 0.25rem; --table-border-color: var(--page-text-color); + word-wrap: break-word; + overflow-wrap: break-word; :where(p) { margin-top: 0.5rem; @@ -30,14 +32,15 @@ } :where(li) { + margin-inline-start: 1rem; margin-top: var(--list-margin); margin-bottom: var(--list-margin); - margin-left: 1rem; list-style-position: outside; } :where(li ul li, li ol li) { - margin: var(--list-margin) 1rem; + margin-block: var(--list-margin); + margin-inline: 1rem; } :where(mark) { @@ -62,6 +65,56 @@ border-right: 1px solid var(--table-border-color); border-bottom: 1px solid var(--table-border-color); } + + /* RTL Support: Apply RTL direction when text is right-aligned */ + p[style*="text-align: right"], + h1[style*="text-align: right"], + h2[style*="text-align: right"], + h3[style*="text-align: right"], + h4[style*="text-align: right"], + h5[style*="text-align: right"], + h6[style*="text-align: right"], + li[style*="text-align: right"], + ul[style*="text-align: right"], + ol[style*="text-align: right"] { + direction: rtl; + word-wrap: break-word; + overflow-wrap: break-word; + white-space: normal; + } + + /* LTR Support: Apply LTR direction when text is left-aligned */ + p[style*="text-align: left"], + h1[style*="text-align: left"], + h2[style*="text-align: left"], + h3[style*="text-align: left"], + h4[style*="text-align: left"], + h5[style*="text-align: left"], + h6[style*="text-align: left"], + li[style*="text-align: left"], + ul[style*="text-align: left"], + ol[style*="text-align: left"] { + direction: ltr; + word-wrap: break-word; + overflow-wrap: break-word; + white-space: normal; + } + + /* When list items are RTL, make bullets/numbers appear on the right */ + li[style*="text-align: right"] { + text-align: right; + } + + /* Parent list inherits direction from its items */ + ul:has(li[style*="text-align: right"]), + ol:has(li[style*="text-align: right"]) { + direction: rtl; + } + + ul:has(li[style*="text-align: left"]), + ol:has(li[style*="text-align: left"]) { + direction: ltr; + } } .editor_content { @@ -70,6 +123,8 @@ font-weight: var(--page-body-font-weight); line-height: var(--page-body-line-height); color: var(--page-text-color); + word-wrap: break-word; + overflow-wrap: break-word; [class*="dark"] & { --table-border-color: var(--color-foreground); diff --git a/src/components/input/rich-input.tsx b/src/components/input/rich-input.tsx index c2044b146..599f4aed0 100644 --- a/src/components/input/rich-input.tsx +++ b/src/components/input/rich-input.tsx @@ -88,7 +88,7 @@ const extensions = [ class: "rounded-md px-0.5 py-px", }, }), - TextAlign.configure({ types: ["heading", "paragraph"] }), + TextAlign.configure({ types: ["heading", "paragraph", "listItem"] }), TableKit.configure(), ]; diff --git a/src/components/input/url-input.tsx b/src/components/input/url-input.tsx index 56ec4c1b3..12021b67d 100644 --- a/src/components/input/url-input.tsx +++ b/src/components/input/url-input.tsx @@ -54,7 +54,7 @@ export function URLInput({ value, onChange, ...props }: Props) { diff --git a/src/components/layout/breakpoint-indicator.tsx b/src/components/layout/breakpoint-indicator.tsx index d431ace47..ea68c6a99 100644 --- a/src/components/layout/breakpoint-indicator.tsx +++ b/src/components/layout/breakpoint-indicator.tsx @@ -11,8 +11,8 @@ export function BreakpointIndicator({ position = "bottom-right" }: BreakpointInd const isBottom = position.includes("bottom"); const top = isTop ? "top-0" : "bottom-0"; - const right = isRight ? "right-0" : "left-0"; - const left = isLeft ? "left-0" : "right-0"; + const right = isRight ? "end-0" : "start-0"; + const left = isLeft ? "start-0" : "end-0"; const bottom = isBottom ? "bottom-0" : "top-0"; return ( diff --git a/src/components/resume/preview.module.css b/src/components/resume/preview.module.css index 0cc57cb42..8d5be4977 100644 --- a/src/components/resume/preview.module.css +++ b/src/components/resume/preview.module.css @@ -66,4 +66,54 @@ small { font-size: calc(var(--page-body-font-size) * 0.9pt); } + + /* RTL Support: Apply RTL direction when text is right-aligned */ + p[style*="text-align: right"], + h1[style*="text-align: right"], + h2[style*="text-align: right"], + h3[style*="text-align: right"], + h4[style*="text-align: right"], + h5[style*="text-align: right"], + h6[style*="text-align: right"], + li[style*="text-align: right"], + ul[style*="text-align: right"], + ol[style*="text-align: right"] { + direction: rtl; + word-wrap: break-word; + overflow-wrap: break-word; + white-space: normal; + } + + /* LTR Support: Apply LTR direction when text is left-aligned */ + p[style*="text-align: left"], + h1[style*="text-align: left"], + h2[style*="text-align: left"], + h3[style*="text-align: left"], + h4[style*="text-align: left"], + h5[style*="text-align: left"], + h6[style*="text-align: left"], + li[style*="text-align: left"], + ul[style*="text-align: left"], + ol[style*="text-align: left"] { + direction: ltr; + word-wrap: break-word; + overflow-wrap: break-word; + white-space: normal; + } + + /* When list items are RTL, make bullets/numbers appear on the right */ + li[style*="text-align: right"] { + text-align: right; + } + + /* Parent list inherits direction from its items */ + ul:has(li[style*="text-align: right"]), + ol:has(li[style*="text-align: right"]) { + direction: rtl; + } + + ul:has(li[style*="text-align: left"]), + ol:has(li[style*="text-align: left"]) { + direction: ltr; + } } diff --git a/src/components/resume/preview.tsx b/src/components/resume/preview.tsx index 6a59632b4..ad6bf72f9 100644 --- a/src/components/resume/preview.tsx +++ b/src/components/resume/preview.tsx @@ -147,7 +147,7 @@ function PageContainer({ pageIndex, pageLayout, pageClassName, showPageNumbers = return (
{showPageNumbers && totalNumberOfPages > 1 && ( -
+
Page {pageNumber} of {totalNumberOfPages} @@ -161,7 +161,7 @@ function PageContainer({ pageIndex, pageLayout, pageClassName, showPageNumbers =
{pageHeight > maxPageHeight && ( -
+
Learn more about how to fit content on a page - + diff --git a/src/components/resume/templates/azurill.tsx b/src/components/resume/templates/azurill.tsx index a74c5d3a0..534146b0e 100644 --- a/src/components/resume/templates/azurill.tsx +++ b/src/components/resume/templates/azurill.tsx @@ -1,4 +1,5 @@ import { EnvelopeIcon, GlobeIcon, MapPinIcon, PhoneIcon } from "@phosphor-icons/react"; +import { isRTL } from "@/utils/locale"; import { cn } from "@/utils/style"; import { getSectionComponent } from "../shared/get-section-component"; import { PageIcon } from "../shared/page-icon"; @@ -7,61 +8,68 @@ import { PagePicture } from "../shared/page-picture"; import { useResumeStore } from "../store/resume"; import type { TemplateProps } from "./types"; -const sectionClassName = cn( - // Heading Decoration in Sidebar Layout - "group-data-[layout=sidebar]:[&>h6]:px-4", - "group-data-[layout=sidebar]:[&>h6]:relative", - "group-data-[layout=sidebar]:[&>h6]:inline-flex", - "group-data-[layout=sidebar]:[&>h6]:items-center", - "group-data-[layout=sidebar]:[&>h6]:before:content-['']", - "group-data-[layout=sidebar]:[&>h6]:before:absolute", - "group-data-[layout=sidebar]:[&>h6]:before:left-0", - "group-data-[layout=sidebar]:[&>h6]:before:rounded-full", - "group-data-[layout=sidebar]:[&>h6]:before:size-2", - "group-data-[layout=sidebar]:[&>h6]:before:border", - "group-data-[layout=sidebar]:[&>h6]:before:border-(--page-primary-color)", - "group-data-[layout=sidebar]:[&>h6]:after:content-['']", - "group-data-[layout=sidebar]:[&>h6]:after:absolute", - "group-data-[layout=sidebar]:[&>h6]:after:right-0", - "group-data-[layout=sidebar]:[&>h6]:after:rounded-full", - "group-data-[layout=sidebar]:[&>h6]:after:size-2", - "group-data-[layout=sidebar]:[&>h6]:after:border", - "group-data-[layout=sidebar]:[&>h6]:after:border-(--page-primary-color)", - - // Section in Sidebar Layout - "group-data-[layout=sidebar]:[&_.section-item-header>div]:flex-col", - "group-data-[layout=sidebar]:[&_.section-item-header>div]:items-start", - - // Section in Main Layout - "group-data-[layout=main]:[&>.section-content]:relative", - "group-data-[layout=main]:[&>.section-content]:ml-4", - "group-data-[layout=main]:[&>.section-content]:pl-4", - "group-data-[layout=main]:[&>.section-content]:border-l", - "group-data-[layout=main]:[&>.section-content]:border-(--page-primary-color)", - - // Timeline Marker in Main Layout - "group-data-[layout=main]:[&>.section-content]:after:content-['']", - "group-data-[layout=main]:[&>.section-content]:after:absolute", - "group-data-[layout=main]:[&>.section-content]:after:top-5", - "group-data-[layout=main]:[&>.section-content]:after:left-0", - "group-data-[layout=main]:[&>.section-content]:after:size-2.5", - "group-data-[layout=main]:[&>.section-content]:after:translate-x-[-50%]", - "group-data-[layout=main]:[&>.section-content]:after:translate-y-[-50%]", - "group-data-[layout=main]:[&>.section-content]:after:rounded-full", - "group-data-[layout=main]:[&>.section-content]:after:border", - "group-data-[layout=main]:[&>.section-content]:after:border-(--page-primary-color)", - "group-data-[layout=main]:[&>.section-content]:after:bg-(--page-background-color)", -); - /** * Template: Azurill */ export function AzurillTemplate({ pageIndex, pageLayout }: TemplateProps) { const isFirstPage = pageIndex === 0; const { main, sidebar, fullWidth } = pageLayout; + const locale = useResumeStore((state) => state.resume.data.metadata.page.locale); + const rtlDirection = isRTL(locale); + + const sectionClassName = cn( + // Heading Decoration in Sidebar Layout + "group-data-[layout=sidebar]:[&>h6]:px-4", + "group-data-[layout=sidebar]:[&>h6]:relative", + "group-data-[layout=sidebar]:[&>h6]:inline-flex", + "group-data-[layout=sidebar]:[&>h6]:items-center", + "group-data-[layout=sidebar]:[&>h6]:before:content-['']", + "group-data-[layout=sidebar]:[&>h6]:before:absolute", + "group-data-[layout=sidebar]:[&>h6]:before:start-0", + "group-data-[layout=sidebar]:[&>h6]:before:rounded-full", + "group-data-[layout=sidebar]:[&>h6]:before:size-2", + "group-data-[layout=sidebar]:[&>h6]:before:border", + "group-data-[layout=sidebar]:[&>h6]:before:border-(--page-primary-color)", + "group-data-[layout=sidebar]:[&>h6]:after:content-['']", + "group-data-[layout=sidebar]:[&>h6]:after:absolute", + "group-data-[layout=sidebar]:[&>h6]:after:end-0", + "group-data-[layout=sidebar]:[&>h6]:after:rounded-full", + "group-data-[layout=sidebar]:[&>h6]:after:size-2", + "group-data-[layout=sidebar]:[&>h6]:after:border", + "group-data-[layout=sidebar]:[&>h6]:after:border-(--page-primary-color)", + + // Section in Sidebar Layout + "group-data-[layout=sidebar]:[&_.section-item-header>div]:flex-col", + "group-data-[layout=sidebar]:[&_.section-item-header>div]:items-start", + + // Section in Main Layout + "group-data-[layout=main]:[&>.section-content]:relative", + "group-data-[layout=main]:[&>.section-content]:ms-4", + "group-data-[layout=main]:[&>.section-content]:ps-4", + "group-data-[layout=main]:[&>.section-content]:border-s", + "group-data-[layout=main]:[&>.section-content]:border-(--page-primary-color)", + + // Timeline Marker in Main Layout + "group-data-[layout=main]:[&>.section-content]:after:content-['']", + "group-data-[layout=main]:[&>.section-content]:after:absolute", + "group-data-[layout=main]:[&>.section-content]:after:top-5", + "group-data-[layout=main]:[&>.section-content]:after:start-0", + "group-data-[layout=main]:[&>.section-content]:after:size-2.5", + rtlDirection + ? "group-data-[layout=main]:[&>.section-content]:after:[transform:translate(50%,-50%)]" + : "group-data-[layout=main]:[&>.section-content]:after:translate-x-[-50%]", + "group-data-[layout=main]:[&>.section-content]:after:translate-y-[-50%]", + "group-data-[layout=main]:[&>.section-content]:after:rounded-full", + "group-data-[layout=main]:[&>.section-content]:after:border", + "group-data-[layout=main]:[&>.section-content]:after:border-(--page-primary-color)", + "group-data-[layout=main]:[&>.section-content]:after:bg-(--page-background-color)", + ); return ( -
+
{isFirstPage &&
}
diff --git a/src/components/resume/templates/bronzor.tsx b/src/components/resume/templates/bronzor.tsx index 96dea74a1..535f2f455 100644 --- a/src/components/resume/templates/bronzor.tsx +++ b/src/components/resume/templates/bronzor.tsx @@ -1,4 +1,5 @@ import { EnvelopeIcon, GlobeIcon, MapPinIcon, PhoneIcon } from "@phosphor-icons/react"; +import { isRTL } from "@/utils/locale"; import { cn } from "@/utils/style"; import { getSectionComponent } from "../shared/get-section-component"; import { PageIcon } from "../shared/page-icon"; @@ -21,9 +22,14 @@ const sectionClassName = cn( export function BronzorTemplate({ pageIndex, pageLayout }: TemplateProps) { const isFirstPage = pageIndex === 0; const { main, sidebar, fullWidth } = pageLayout; + const locale = useResumeStore((state) => state.resume.data.metadata.page.locale); + const rtlDirection = isRTL(locale); return ( -
+
{isFirstPage &&
}
diff --git a/src/components/resume/templates/chikorita.tsx b/src/components/resume/templates/chikorita.tsx index d061f28e3..5e738beac 100644 --- a/src/components/resume/templates/chikorita.tsx +++ b/src/components/resume/templates/chikorita.tsx @@ -1,4 +1,5 @@ import { EnvelopeIcon, GlobeIcon, MapPinIcon, PhoneIcon } from "@phosphor-icons/react"; +import { isRTL } from "@/utils/locale"; import { cn } from "@/utils/style"; import { getSectionComponent } from "../shared/get-section-component"; import { PageIcon } from "../shared/page-icon"; @@ -33,12 +34,16 @@ const sectionClassName = cn( export function ChikoritaTemplate({ pageIndex, pageLayout }: TemplateProps) { const isFirstPage = pageIndex === 0; const { main, sidebar, fullWidth } = pageLayout; + const locale = useResumeStore((state) => state.resume.data.metadata.page.locale); + const rtlDirection = isRTL(locale); return ( -
+
{/* Sidebar Background */} {!fullWidth && ( -
+
)} {isFirstPage &&
} @@ -75,7 +80,7 @@ function Header() { return (
-
+
diff --git a/src/components/resume/templates/ditgar.tsx b/src/components/resume/templates/ditgar.tsx index 1f1df7c46..f66413699 100644 --- a/src/components/resume/templates/ditgar.tsx +++ b/src/components/resume/templates/ditgar.tsx @@ -1,3 +1,4 @@ +import { isRTL } from "@/utils/locale"; import { cn } from "@/utils/style"; import { getSectionComponent } from "../shared/get-section-component"; import { PageIcon } from "../shared/page-icon"; @@ -15,10 +16,10 @@ const sectionClassName = cn( "group-data-[layout=sidebar]:[&_.section-item-header>div]:items-start", // Decoration Line in Section Item Header - "group-data-[layout=main]:[&_.section-item-header]:pl-2", + "group-data-[layout=main]:[&_.section-item-header]:ps-2", "group-data-[layout=main]:[&_.section-item-header]:py-0.5", - "group-data-[layout=main]:[&_.section-item-header]:-ml-2.5", - "group-data-[layout=main]:[&_.section-item-header]:border-l-2", + "group-data-[layout=main]:[&_.section-item-header]:-ms-2.5", + "group-data-[layout=main]:[&_.section-item-header]:border-s-2", "group-data-[layout=main]:[&_.section-item-header]:border-(--page-primary-color)", ); @@ -28,18 +29,32 @@ const sectionClassName = cn( export function DitgarTemplate({ pageIndex, pageLayout }: TemplateProps) { const isFirstPage = pageIndex === 0; const { main, sidebar, fullWidth } = pageLayout; + const locale = useResumeStore((state) => state.resume.data.metadata.page.locale); + const rtlDirection = isRTL(locale); const SummaryComponent = getSectionComponent("summary", { sectionClassName: cn(sectionClassName, "px-(--page-margin-x) pt-(--page-margin-y)"), }); return ( -
+
{/* Sidebar Background */} {(!fullWidth || isFirstPage) && ( -
+
)} +
+ {isFirstPage &&
} +
+
{(!fullWidth || isFirstPage) && (