feat: implement free-form resume page formats, resolves #2991

This commit is contained in:
Amruth Pillai
2026-05-08 11:28:18 +02:00
parent 9cbb30d3ba
commit 2cd774dab7
94 changed files with 860 additions and 443 deletions
+4 -2
View File
@@ -46,6 +46,8 @@ temp
.codex
.claude
.cursor
docs/superpowers
# Data
apps/web/data
# Local Storage Data
/data
/apps/web/data
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Het jy jou wagwoord vergeet?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formaat"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Frans"
@@ -3497,4 +3501,3 @@ msgstr "Zoem uit"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zoeloe"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "የይለፍ ቃልዎን ረስተዋል?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ቅርጸት"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "ነፃ"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ፈረንሳይኛ"
@@ -3497,4 +3501,3 @@ msgstr "አጉር"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ዙሉ"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "أنسيت كلمة مرورك؟"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "الصيغة"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "مجاني"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "الفرنسية"
@@ -3497,4 +3501,3 @@ msgstr "تصغير"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "الزولو"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Parolunuzu unutmusunuz?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Pulsuz"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Fransız"
@@ -3497,4 +3501,3 @@ msgstr "Uzaqlaşdır"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Забравихте паролата си?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Формат"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Безплатно"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Френски"
@@ -3497,4 +3501,3 @@ msgstr "Намаляване"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Зулуски"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "আপনি কি পাসওয়ার্ড ভুলে গিয়েছেন?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "রূপ"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "বিনামূল্যে"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ফরাসি"
@@ -3497,4 +3501,3 @@ msgstr "জুম আউট"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "জুলু"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Has oblidat la contrasenya?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratuït"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francès"
@@ -3497,4 +3501,3 @@ msgstr "Allunya"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulú"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Zapomněli jste heslo?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formát"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Zdarma"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francouzština"
@@ -3497,4 +3501,3 @@ msgstr "Oddálit"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Har du glemt din adgangskode?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Fransk"
@@ -3497,4 +3501,3 @@ msgstr "Zoom ud"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Passwort vergessen?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Seitenformat"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Kostenlos"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Französisch"
@@ -3497,4 +3501,3 @@ msgstr "Herauszoomen"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Ξεχάσατε τον κωδικό πρόσβασής σας;"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Μορφή"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Δωρεάν"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Γαλλικά"
@@ -3497,4 +3501,3 @@ msgstr "Σμίκρυνση"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Ζουλού"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Forgot your password?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Free"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "French"
@@ -3497,4 +3501,3 @@ msgstr "Zoom out"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -1384,7 +1384,7 @@ msgid "Forgot your password?"
msgstr "Forgot your password?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
@@ -1392,6 +1392,10 @@ msgstr "Format"
msgid "Free"
msgstr "Free"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr "Free-form"
#: src/libs/locale.ts
msgid "French"
msgstr "French"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formato"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francés"
@@ -3497,4 +3501,3 @@ msgstr "Alejar"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulú"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "گذرواژهٔ خود را فراموش کرده‌اید؟"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "فرمت"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "رایگان"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "فرانسوی"
@@ -3497,4 +3501,3 @@ msgstr "کوچک‌نمایی"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "زولو"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Unohditko salasanasi?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Muoto"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Ilmainen"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ranska"
@@ -3497,4 +3501,3 @@ msgstr "Loitonna"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Vous avez oublié votre mot de passe ?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratuit"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Français"
@@ -3497,4 +3501,3 @@ msgstr "Zoom arrière"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zoulou"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "שכחת את הסיסמה שלך?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "תבנית"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "חינמי"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "צרפתית"
@@ -3497,4 +3501,3 @@ msgstr "התרחקות"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "זולו"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "पासवर्ड भूल गए हैं?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "फॉर्मेट"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "मुफ़्त"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "फ़्रेंच"
@@ -3497,4 +3501,3 @@ msgstr "ज़ूम आउट"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ज़ुलु"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Elfelejtette a jelszavát?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formátum"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Ingyenes"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "francia"
@@ -3497,4 +3501,3 @@ msgstr "Kicsinyítés"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Lupa kata sandi Anda?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Prancis"
@@ -3497,4 +3501,3 @@ msgstr "Perkecil"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Hai dimenticato la password?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formato"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratuito"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francese"
@@ -3497,4 +3501,3 @@ msgstr "Rimpicciolisci"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "パスワードをお忘れですか?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "フォーマット"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "無料"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "フランス語"
@@ -3497,4 +3501,3 @@ msgstr "ズームアウト"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ズールー語"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "ភ្លេច​ពាក្យសម្ងាត់​របស់​អ្នក​ឬ?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ទ្រង់ទ្រាយ"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "ឥត​គិតថ្លៃ"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "French"
@@ -3497,4 +3501,3 @@ msgstr "បង្រួម"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರುವಿರಾ?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ಸ್ವರೂಪ"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "ಉಚಿತ"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ಫ್ರೆಂಚ್"
@@ -3497,4 +3501,3 @@ msgstr "ಗಾತ್ರ ಕುಗ್ಗಿಸಿ"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ಜೂಲೂ"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "비밀번호를 잊으셨나요?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "용지 형식"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "무료"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "프랑스어"
@@ -3497,4 +3501,3 @@ msgstr "축소"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "줄루어"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Pamiršote slaptažodį?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formatas"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Nemokama"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Prancūzų"
@@ -3497,4 +3501,3 @@ msgstr "Tolinti"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulų"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Aizmirsāt paroli?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formāts"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Bezmaksas"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Franču"
@@ -3497,4 +3501,3 @@ msgstr "Tālināt"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "നിങ്ങളുടെ പാസ്‌വേഡ് മറന്നോ?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ഫോർമാറ്റ്"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "സൗജന്യം"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ഫ്രഞ്ച്"
@@ -3497,4 +3501,3 @@ msgstr "സൂം ഔട്ട് ചെയ്യുക"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "സൂളു"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "तुमचे पासवर्ड विसरलात का?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "स्वरूप"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "मोफत"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "फ्रेंच"
@@ -3497,4 +3501,3 @@ msgstr "बाहेर झूम करा"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "झुलू"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Lupa kata laluan anda?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Percuma"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Perancis"
@@ -3497,4 +3501,3 @@ msgstr "Zum keluar"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "पासवर्ड बिर्सनुभयो?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ढाँचा"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "निःशुल्क"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "फ्रेन्च"
@@ -3497,4 +3501,3 @@ msgstr "जूम आउट"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "जुलु"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Bent u uw wachtwoord vergeten?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formaat"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Frans"
@@ -3497,4 +3501,3 @@ msgstr "Uitzoomen"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Glemt passordet ditt?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Fransk"
@@ -3497,4 +3501,3 @@ msgstr "Zoom ut"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "ପାସୱାର୍ଡ ଭୁଲିଗଲେ କି?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ରୂପରେଖା (Format)"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "ନିଶୁଳ୍କ"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ଫ୍ରେଞ୍ଚ୍"
@@ -3497,4 +3501,3 @@ msgstr "ଜୁମ୍ ଆଉଟ୍ କରନ୍ତୁ"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ଜୁଲୁ"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Nie pamiętasz hasła?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Darmowe"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francuski"
@@ -3497,4 +3501,3 @@ msgstr "Pomniejsz"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Esqueceu a sua senha?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formatar"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratuito"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francês"
@@ -3497,4 +3501,3 @@ msgstr "Diminuir zoom"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Esqueceu a sua senha?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formato"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Grátis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francês"
@@ -3497,4 +3501,3 @@ msgstr "Afastar"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "V-ați uitat parola?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratuit"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Franceză"
@@ -3497,4 +3501,3 @@ msgstr "Micșorează"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Забыли ваш пароль?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Формат"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Бесплатно"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Французский"
@@ -3497,4 +3501,3 @@ msgstr "Уменьшить"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Зулу"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Zabudol si heslo?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formát"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Zadarmo"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francúzština"
@@ -3497,4 +3501,3 @@ msgstr "Oddialiť"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Ste pozabili svoje geslo?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Brezplačno"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Francoščina"
@@ -3497,4 +3501,3 @@ msgstr "Oddalji"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zuluščina"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Keni harruar fjalëkalimin?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Formati"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Falas"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Frëngjisht"
@@ -3497,4 +3501,3 @@ msgstr "Zvogëlo"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Заборавили сте лозинку?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Формат"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Бесплатно"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Француски"
@@ -3497,4 +3501,3 @@ msgstr "Умањи"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Зулу"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Glömt ditt lösenord?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Gratis"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Franska"
@@ -3497,4 +3501,3 @@ msgstr "Zooma ut"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "உங்கள் கடவுச்சொல்லை மறந்துவிட்டீர்களா?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "வடிவம்"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "இலவசம்"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ஃபிரென்ச்"
@@ -3497,4 +3501,3 @@ msgstr "சிறிதாக்கு"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ஜூலு"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "మీ పాస్‌వర్డ్ మర్చిపోయారా?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "ఫార్మాట్"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "ఉచితం"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ఫ్రెంచ్"
@@ -3497,4 +3501,3 @@ msgstr "జూమ్ అవుట్ చేయండి"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "జులు"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "ลืมรหัสผ่านของคุณใช่หรือไม่?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "รูปแบบ"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "ฟรี"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "ฝรั่งเศส"
@@ -3497,4 +3501,3 @@ msgstr "ซูมออก"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "ซูลู"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Şifrenizi mi unuttunuz?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Ücretsiz"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Fransızca"
@@ -3497,4 +3501,3 @@ msgstr "Uzaklaştır"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Забули свій пароль?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Формат"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Безкоштовно"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Французька"
@@ -3497,4 +3501,3 @@ msgstr "Зменшити"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Зулу"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Parolingizni unutdingizmi?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Format"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Bepul"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Fransuz tili"
@@ -3497,4 +3501,3 @@ msgstr "Kichraytirish"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "Bạn quên mật khẩu?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "Định dạng"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "Miễn phí"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "Tiếng Pháp"
@@ -3497,4 +3501,3 @@ msgstr "Thu nhỏ"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "Zulu"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "你忘记密码了吗?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "格式"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "免费"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "法语"
@@ -3497,4 +3501,3 @@ msgstr "缩小"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "祖鲁语"
+6 -3
View File
@@ -1389,14 +1389,18 @@ msgid "Forgot your password?"
msgstr "忘記密碼?"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr "格式"
msgstr ""
#: src/routes/_home/-sections/features.tsx
msgid "Free"
msgstr "免費"
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr "法文"
@@ -3497,4 +3501,3 @@ msgstr "縮小"
#: src/libs/locale.ts
msgid "Zulu"
msgstr "祖魯語"
+5 -1
View File
@@ -1384,7 +1384,7 @@ msgid "Forgot your password?"
msgstr ""
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgctxt "Page Format (A4, Letter)"
msgctxt "Page Format (A4, Letter, Free-form)"
msgid "Format"
msgstr ""
@@ -1392,6 +1392,10 @@ msgstr ""
msgid "Free"
msgstr ""
#: src/routes/builder/$resumeId/-sidebar/right/sections/page.tsx
msgid "Free-form"
msgstr ""
#: src/libs/locale.ts
msgid "French"
msgstr ""
+1 -1
View File
@@ -99,7 +99,7 @@
"@types/pg": "^8.20.0",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"@vitejs/plugin-react": "^6.0.1",
"babel-plugin-macros": "^3.1.0",
"nitro": "3.0.260429-beta",
@@ -161,8 +161,8 @@ export function ResumePreviewClient({
{(document) => (
<div
className={cn(
"flex items-center justify-start gap-(--resume-preview-page-gap)",
pageLayout === "horizontal" ? "flex-row" : "flex-col",
"flex justify-start gap-(--resume-preview-page-gap)",
pageLayout === "horizontal" ? "flex-row items-start" : "flex-col items-center",
)}
>
{Array.from({ length: visiblePdf.numPages }, (_, index) => {
@@ -94,7 +94,7 @@ function PageSectionForm() {
hasError={field.state.meta.isTouched && field.state.meta.errors.length > 0}
>
<FormLabel>
<Trans context="Page Format (A4, Letter)">Format</Trans>
<Trans context="Page Format (A4, Letter, Free-form)">Format</Trans>
</FormLabel>
<FormControl
render={
@@ -102,6 +102,7 @@ function PageSectionForm() {
options={[
{ value: "a4", label: t`A4` },
{ value: "letter", label: t`Letter` },
{ value: "free-form", label: t`Free-form` },
]}
value={field.state.value}
onValueChange={(value) => {
+1 -1
View File
@@ -44,7 +44,7 @@
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1",
"@types/node": "^25.6.1",
"@types/node": "^25.6.2",
"@vitest/coverage-v8": "^4.1.5",
"jsdom": "^29.1.1",
"knip": "^6.12.1",
+1 -1
View File
@@ -30,7 +30,7 @@
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+6 -6
View File
@@ -18,10 +18,10 @@
"test:agent": "vitest run --reporter=agent --reporter=json --outputFile.json=reports/vitest-results.json --passWithNoTests"
},
"dependencies": {
"@ai-sdk/anthropic": "^3.0.75",
"@ai-sdk/google": "^3.0.68",
"@ai-sdk/openai": "^3.0.62",
"@ai-sdk/openai-compatible": "^2.0.46",
"@ai-sdk/anthropic": "^3.0.76",
"@ai-sdk/google": "^3.0.70",
"@ai-sdk/openai": "^3.0.63",
"@ai-sdk/openai-compatible": "^2.0.47",
"@aws-sdk/client-s3": "^3.1045.0",
"@orpc/client": "^1.14.2",
"@orpc/experimental-ratelimit": "^1.14.2",
@@ -33,7 +33,7 @@
"@reactive-resume/schema": "workspace:*",
"@reactive-resume/utils": "workspace:*",
"@tanstack/react-start": "^1.167.65",
"ai": "^6.0.175",
"ai": "^6.0.176",
"bcrypt": "^6.0.0",
"better-auth": "1.6.9",
"drizzle-orm": "1.0.0-beta.22",
@@ -49,7 +49,7 @@
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@types/bcrypt": "^6.0.0",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+1 -1
View File
@@ -37,7 +37,7 @@
"@reactive-resume/config": "workspace:*",
"@types/bcrypt": "^6.0.0",
"@types/react": "^19.2.14",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+1 -1
View File
@@ -31,7 +31,7 @@
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@types/pg": "^8.20.0",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"drizzle-kit": "1.0.0-beta.22",
"typescript": "^6.0.3"
}
+1 -1
View File
@@ -26,7 +26,7 @@
"@reactive-resume/config": "workspace:*",
"@types/nodemailer": "^8.0.0",
"@types/react": "^19.2.14",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+2 -2
View File
@@ -19,8 +19,8 @@
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@types/node": "^25.6.1",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@types/node": "^25.6.2",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+1 -1
View File
@@ -16,7 +16,7 @@
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+1 -1
View File
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+1 -1
View File
@@ -30,7 +30,7 @@
"@react-pdf/types": "^2.11.1",
"@reactive-resume/config": "workspace:*",
"@types/react": "^19.2.14",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
@@ -15,7 +15,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -51,12 +51,13 @@ export const AzurillPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles, featureStyles } = useAzurillTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const sidebarSections = filterSections(page.sidebar, data);
const mainSections = filterSections(page.main, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} featureStyles={featureStyles} colors={colors} features={azurillFeatures}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -54,13 +54,14 @@ export const BronzorPage = ({ page, pageIndex }: TemplatePageProps) => {
const { styles, colors } = useBronzorTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const sidebarSections = filterSections(page.sidebar, data);
const mainSections = filterSections(page.main, data);
const sections = getBronzorSections({ mainSections, sidebarSections, fullWidth: page.fullWidth });
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -40,13 +40,14 @@ export const ChikoritaPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useChikoritaTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const hasPicture = hasTemplatePicture(picture);
const showHeader = pageIndex === 0;
const sidebarSections = filterSections(page.sidebar, data);
const mainSections = filterSections(page.main, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
<View
style={composeStyles(styles.mainColumn, {
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -48,6 +48,7 @@ export const DitgarPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useDitgarTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const showSidebar = !page.fullWidth || showHeader;
const sidebarSections = filterSections(page.sidebar, data);
@@ -56,7 +57,7 @@ export const DitgarPage = ({ page, pageIndex }: TemplatePageProps) => {
const regularMainSections = showHeader ? mainSections.slice(1) : mainSections;
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors} features={ditgarFeatures}>
{showSidebar && (
<View
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -45,13 +45,14 @@ export const DittoPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useDittoTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const hasPicture = hasTemplatePicture(picture);
const showHeader = pageIndex === 0;
const sidebarSections = filterSections(page.sidebar, data);
const mainSections = filterSections(page.main, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -43,6 +43,7 @@ export const GengarPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useGengarTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const showSidebar = !page.fullWidth || showHeader;
const sidebarSections = filterSections(page.sidebar, data);
@@ -51,7 +52,7 @@ export const GengarPage = ({ page, pageIndex }: TemplatePageProps) => {
const regularMainSections = showHeader ? mainSections.slice(1) : mainSections;
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showSidebar && (
<View
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -47,13 +47,14 @@ export const GlaliePage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useGlalieTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const showSidebar = !page.fullWidth || showHeader;
const mainSections = filterSections(page.main, data);
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors} features={glalieFeatures}>
{showSidebar && <View style={styles.sidebarBackground} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -39,12 +39,13 @@ export const KakunaPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useKakunaTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const mainSections = filterSections(page.main, data);
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -38,12 +38,13 @@ export const LaprasPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useLaprasTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const mainSections = filterSections(page.main, data);
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -43,12 +43,13 @@ export const LeafishPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useLeafishTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const mainSections = filterSections(page.main, data).filter((section) => section !== "summary");
const sidebarSections = filterSections(page.sidebar, data).filter((section) => section !== "summary");
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -43,12 +43,13 @@ export const MeowthPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useMeowthTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const mainSections = filterSections(page.main, data);
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors} features={meowthFeatures}>
{showHeader && <Header styles={styles} />}
+3 -2
View File
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -38,12 +38,13 @@ export const OnyxPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useOnyxTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const mainSections = filterSections(page.main, data);
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -47,6 +47,7 @@ export const PikachuPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = usePikachuTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const showSidebar = !page.fullWidth;
const hasPicture = hasTemplatePicture(picture);
@@ -54,7 +55,7 @@ export const PikachuPage = ({ page, pageIndex }: TemplatePageProps) => {
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors} features={pikachuFeatures}>
<View style={styles.layout}>
{showSidebar && (
@@ -9,7 +9,7 @@ import { useRender } from "../../context";
import { TemplateProvider } from "../shared/context";
import { filterSections } from "../shared/filtering";
import { getTemplateMetrics } from "../shared/metrics";
import { getTemplatePageSize } from "../shared/page-size";
import { getTemplatePageMinHeightStyle, getTemplatePageSize } from "../shared/page-size";
import { hasTemplatePicture } from "../shared/picture";
import { Heading, Icon, Link, Text } from "../shared/primitives";
import { Section } from "../shared/sections";
@@ -40,12 +40,13 @@ export const RhyhornPage = ({ page, pageIndex }: TemplatePageProps) => {
const { colors, styles } = useRhyhornTemplate();
const metrics = getTemplateMetrics(metadata.page);
const pageSize = getTemplatePageSize(metadata.page.format);
const pageMinHeightStyle = getTemplatePageMinHeightStyle(metadata.page.format);
const showHeader = pageIndex === 0;
const mainSections = filterSections(page.main, data);
const sidebarSections = filterSections(page.sidebar, data);
return (
<Page size={pageSize} style={styles.page}>
<Page size={pageSize} style={composeStyles(styles.page, pageMinHeightStyle)}>
<TemplateProvider styles={styles} colors={colors}>
{showHeader && <Header styles={styles} />}
+18 -2
View File
@@ -1,4 +1,20 @@
import type { Style } from "@react-pdf/types";
import type { ResumeData } from "@reactive-resume/schema/resume/data";
export const getTemplatePageSize = (format: ResumeData["metadata"]["page"]["format"]) =>
format === "letter" ? "LETTER" : "A4";
const A4_PAGE_SIZE = {
width: 595.28,
height: 841.89,
} as const;
export const getTemplatePageSize = (format: ResumeData["metadata"]["page"]["format"]) => {
if (format === "free-form") return { width: A4_PAGE_SIZE.width };
if (format === "letter") return "LETTER";
return "A4";
};
export const getTemplatePageMinHeightStyle = (format: ResumeData["metadata"]["page"]["format"]): Style | undefined => {
if (format !== "free-form") return undefined;
return { minHeight: A4_PAGE_SIZE.height };
};
+1 -1
View File
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+2 -2
View File
@@ -1689,8 +1689,8 @@
"format": {
"default": "a4",
"type": "string",
"enum": ["a4", "letter"],
"description": "The format of the page. Can be 'a4' or 'letter'."
"enum": ["a4", "letter", "free-form"],
"description": "The format of the page. Can be 'a4', 'letter', or 'free-form'."
},
"locale": {
"default": "en-US",
+8
View File
@@ -7,6 +7,10 @@ export const pageDimensionsAsPixels = {
width: 816,
height: 1056,
},
"free-form": {
width: 794,
height: 1123,
},
} as const;
export const pageDimensionsAsMillimeters = {
@@ -18,4 +22,8 @@ export const pageDimensionsAsMillimeters = {
width: "216mm",
height: "279mm",
},
"free-form": {
width: "210mm",
height: "297mm",
},
} as const;
+4 -1
View File
@@ -449,7 +449,10 @@ export const pageSchema = z.object({
gapY: z.number().min(0).describe("The vertical gap between the sections of the page, defined in points (pt)."),
marginX: z.number().min(0).describe("The horizontal margin of the page, defined in points (pt)."),
marginY: z.number().min(0).describe("The vertical margin of the page, defined in points (pt)."),
format: z.enum(["a4", "letter"]).describe("The format of the page. Can be 'a4' or 'letter'.").catch("a4"),
format: z
.enum(["a4", "letter", "free-form"])
.describe("The format of the page. Can be 'a4', 'letter', or 'free-form'.")
.catch("a4"),
locale: z
.string()
.describe("The locale of the page. Used for displaying pre-translated section headings, if not overridden.")
+1 -1
View File
@@ -12,7 +12,7 @@
"@reactive-resume/config": "workspace:*",
"@reactive-resume/env": "workspace:*",
"@types/pg": "^8.20.0",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"drizzle-orm": "1.0.0-beta.22",
"pg": "^8.20.0",
"tsx": "^4.21.0"
+1 -1
View File
@@ -38,7 +38,7 @@
"@tailwindcss/typography": "^0.5.19",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"tailwindcss": "^4.2.4",
"typescript": "^6.0.3"
}
+1 -1
View File
@@ -83,7 +83,7 @@ function DialogFooter({
<div
data-slot="dialog-footer"
className={cn(
"sticky bottom-0 z-1 -mx-4 in-[form]:-mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
className,
)}
{...props}
+2 -2
View File
@@ -43,8 +43,8 @@
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@types/node": "^25.6.1",
"@typescript/native-preview": "7.0.0-dev.20260507.1",
"@types/node": "^25.6.2",
"@typescript/native-preview": "7.0.0-dev.20260508.1",
"typescript": "^6.0.3"
}
}
+11 -3
View File
@@ -50,9 +50,17 @@ interface PageSize {
const DEFAULT_PAGE_SIZE: PageSize = { width: 210, height: 297 };
const PAGE_SIZES: Record<string, PageSize> = {
const PAGE_SIZES = {
a4: DEFAULT_PAGE_SIZE,
letter: { width: 215.9, height: 279.4 },
} satisfies Record<string, PageSize>;
type DocxPageFormat = keyof typeof PAGE_SIZES;
const resolveDocxPageFormat = (format: ResumeData["metadata"]["page"]["format"]): DocxPageFormat => {
if (format === "letter") return "letter";
return "a4";
};
// --- Invisible border preset for table cells ---
@@ -344,7 +352,7 @@ function buildTwoColumnTable(
* - Header with name, headline, and contact info (centered, full-width)
* - Two-column table layout (main + sidebar) matching `metadata.layout`
* - Typography (font family, size, line height) from `metadata.typography`
* - Page margins and format (A4/Letter) from `metadata.page`
* - Page margins and fixed DOCX page format from `metadata.page`; free-form exports as A4
* - Primary, text, and background colors from `metadata.design.colors`
*/
export function buildDocument(data: ResumeData): Document {
@@ -357,7 +365,7 @@ export function buildDocument(data: ResumeData): Document {
const lineSpacing = Math.round(data.metadata.typography.body.lineHeight * 240);
const { page } = data.metadata;
const pageSize = PAGE_SIZES[page.format] ?? DEFAULT_PAGE_SIZE;
const pageSize = PAGE_SIZES[resolveDocxPageFormat(page.format)];
// Margins and gaps are defined in points (pt), not mm
const marginXTwips = ptToTwips(page.marginX);
const marginYTwips = ptToTwips(page.marginY);
+416 -218
View File
File diff suppressed because it is too large Load Diff