From cfb272229b445dba023f61c28e42e3a7a7d68524 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Tue, 29 Sep 2026 14:53:23 +0200 Subject: [PATCH] feat(web): pick an element on the page to style it in custom styles With Custom Styles open, clicking a section or entry on the page adds a rule for it under a comment naming it (or moves the cursor into its existing rule). While the cursor is in a rule, everything it matches is outlined on the page. Autocomplete offers sections and entries by name and inserts their selector, instead of escaped UUIDs. The guide gains a Style one element section, including the :nth-of-type form. --- apps/web/locales/af-ZA.po | 9 +++ apps/web/locales/am-ET.po | 9 +++ apps/web/locales/ar-SA.po | 9 +++ apps/web/locales/az-AZ.po | 9 +++ apps/web/locales/bg-BG.po | 9 +++ apps/web/locales/bn-BD.po | 9 +++ apps/web/locales/ca-ES.po | 9 +++ apps/web/locales/cs-CZ.po | 9 +++ apps/web/locales/da-DK.po | 9 +++ apps/web/locales/de-DE.po | 9 +++ apps/web/locales/el-GR.po | 9 +++ apps/web/locales/en-GB.po | 9 +++ apps/web/locales/en-US.po | 9 +++ apps/web/locales/es-ES.po | 9 +++ apps/web/locales/fa-IR.po | 9 +++ apps/web/locales/fi-FI.po | 9 +++ apps/web/locales/fr-FR.po | 9 +++ apps/web/locales/he-IL.po | 9 +++ apps/web/locales/hi-IN.po | 9 +++ apps/web/locales/hu-HU.po | 9 +++ apps/web/locales/id-ID.po | 9 +++ apps/web/locales/it-IT.po | 9 +++ apps/web/locales/ja-JP.po | 9 +++ apps/web/locales/km-KH.po | 9 +++ apps/web/locales/kn-IN.po | 9 +++ apps/web/locales/ko-KR.po | 9 +++ apps/web/locales/lt-LT.po | 9 +++ apps/web/locales/lv-LV.po | 9 +++ apps/web/locales/ml-IN.po | 9 +++ apps/web/locales/mr-IN.po | 9 +++ apps/web/locales/ms-MY.po | 9 +++ apps/web/locales/ne-NP.po | 9 +++ apps/web/locales/nl-NL.po | 9 +++ apps/web/locales/no-NO.po | 9 +++ apps/web/locales/or-IN.po | 9 +++ apps/web/locales/pl-PL.po | 9 +++ apps/web/locales/pt-BR.po | 9 +++ apps/web/locales/pt-PT.po | 9 +++ apps/web/locales/ro-RO.po | 9 +++ apps/web/locales/ru-RU.po | 9 +++ apps/web/locales/sk-SK.po | 9 +++ apps/web/locales/sl-SI.po | 9 +++ apps/web/locales/sq-AL.po | 9 +++ apps/web/locales/sr-SP.po | 9 +++ apps/web/locales/sv-SE.po | 9 +++ apps/web/locales/ta-IN.po | 9 +++ apps/web/locales/te-IN.po | 9 +++ apps/web/locales/th-TH.po | 9 +++ apps/web/locales/tr-TR.po | 9 +++ apps/web/locales/uk-UA.po | 9 +++ apps/web/locales/uz-UZ.po | 9 +++ apps/web/locales/vi-VN.po | 9 +++ apps/web/locales/zh-CN.po | 9 +++ apps/web/locales/zh-TW.po | 9 +++ apps/web/locales/zu-ZA.po | 9 +++ .../features/resume/editor/page-overlay.tsx | 25 +++++++ apps/web/src/features/resume/editor/store.ts | 5 ++ .../stylesheet/editor-extensions.test.ts | 27 ++++++-- .../resume/stylesheet/editor-extensions.ts | 31 ++++++++- .../src/features/resume/stylesheet/editor.tsx | 46 ++++++++++++- .../resume/stylesheet/highlight.test.ts | 39 +++++++++++ .../features/resume/stylesheet/highlight.ts | 65 +++++++++++++++++++ .../features/resume/stylesheet/protocol.ts | 3 + .../src/features/resume/stylesheet/targets.ts | 52 +++++++++++++++ docs/applying-custom-styles.mdx | 29 +++++++++ 65 files changed, 810 insertions(+), 7 deletions(-) create mode 100644 apps/web/src/features/resume/stylesheet/highlight.test.ts create mode 100644 apps/web/src/features/resume/stylesheet/highlight.ts create mode 100644 apps/web/src/features/resume/stylesheet/targets.ts diff --git a/apps/web/locales/af-ZA.po b/apps/web/locales/af-ZA.po index 3cf877223..97f3eb900 100644 --- a/apps/web/locales/af-ZA.po +++ b/apps/web/locales/af-ZA.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Vee seleksie uit" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Kliënt-ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Onbenoemde pasleutel" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/am-ET.po b/apps/web/locales/am-ET.po index 0b2b41b61..b6021e283 100644 --- a/apps/web/locales/am-ET.po +++ b/apps/web/locales/am-ET.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "ምርጫን አጽዳ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "የደንበኛ መታወቂያ" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "ስም የሌለው ፓስኪ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ar-SA.po b/apps/web/locales/ar-SA.po index 6bdf277c4..d632ebe21 100644 --- a/apps/web/locales/ar-SA.po +++ b/apps/web/locales/ar-SA.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "كليرست" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "معرف العميل" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "مفتاح مرور غير مسمى" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/az-AZ.po b/apps/web/locales/az-AZ.po index b43e34b00..7c2d8410c 100644 --- a/apps/web/locales/az-AZ.po +++ b/apps/web/locales/az-AZ.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Seçimi təmizləyin" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Müştəri ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Adı olmayan keçid açarı" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/bg-BG.po b/apps/web/locales/bg-BG.po index 87f758c3c..6ce23809e 100644 --- a/apps/web/locales/bg-BG.po +++ b/apps/web/locales/bg-BG.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Изчистване на избора" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID на клиента" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Неназован ключ за достъп" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/bn-BD.po b/apps/web/locales/bn-BD.po index 05699b60e..16d160717 100644 --- a/apps/web/locales/bn-BD.po +++ b/apps/web/locales/bn-BD.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "নির্বাচন পরিষ্কার করুন" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ক্লায়েন্ট আইডি" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "অনামকৃত পাসকি" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ca-ES.po b/apps/web/locales/ca-ES.po index f68346c6f..b984b5564 100644 --- a/apps/web/locales/ca-ES.po +++ b/apps/web/locales/ca-ES.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Esborra la selecció" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID del client" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Clau d'accés sense nom" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/cs-CZ.po b/apps/web/locales/cs-CZ.po index d0fba59fb..8d27b36a4 100644 --- a/apps/web/locales/cs-CZ.po +++ b/apps/web/locales/cs-CZ.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Vymazat výběr" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID klienta" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Nejmenovaný přístupový klíč" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/da-DK.po b/apps/web/locales/da-DK.po index 81f482c01..486b79639 100644 --- a/apps/web/locales/da-DK.po +++ b/apps/web/locales/da-DK.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Ryd valg" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Klient-ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Unavngivet passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/de-DE.po b/apps/web/locales/de-DE.po index 34ab389f8..bca684b35 100644 --- a/apps/web/locales/de-DE.po +++ b/apps/web/locales/de-DE.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Auswahl löschen" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Client-ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Unbenannter Passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/el-GR.po b/apps/web/locales/el-GR.po index 9bc7f78ba..042fb1911 100644 --- a/apps/web/locales/el-GR.po +++ b/apps/web/locales/el-GR.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Εκκαθάριση επιλογής" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Αναγνωριστικό πελάτη" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Ανώνυμο κλειδί πρόσβασης" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/en-GB.po b/apps/web/locales/en-GB.po index d220accf7..f5682f2aa 100644 --- a/apps/web/locales/en-GB.po +++ b/apps/web/locales/en-GB.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Clear selection" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Client ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Unnamed passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/en-US.po b/apps/web/locales/en-US.po index 45799c3ca..184c91924 100644 --- a/apps/web/locales/en-US.po +++ b/apps/web/locales/en-US.po @@ -1780,6 +1780,10 @@ msgstr "Clear section" msgid "Clear selection" msgstr "Clear selection" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "Click anything on the page to style it. The rule you're in is outlined on the page." + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Client ID" @@ -3701,6 +3705,10 @@ msgstr "Hard for software to read" msgid "Have a resume already? <0>Import it" msgstr "Have a resume already? <0>Import it" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "Header" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8386,6 +8394,7 @@ msgid "Unnamed passkey" msgstr "Unnamed passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "Untitled" diff --git a/apps/web/locales/es-ES.po b/apps/web/locales/es-ES.po index ae06d4414..1a4e95c6d 100644 --- a/apps/web/locales/es-ES.po +++ b/apps/web/locales/es-ES.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Selección clara" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID de cliente" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Clave de acceso sin nombre" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/fa-IR.po b/apps/web/locales/fa-IR.po index 625b3dbf9..c8ac8cdcb 100644 --- a/apps/web/locales/fa-IR.po +++ b/apps/web/locales/fa-IR.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "انتخاب را پاک کنید" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "شناسه مشتری" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "کلید عبور نام‌گذاری‌نشده" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/fi-FI.po b/apps/web/locales/fi-FI.po index 46c3d8602..1c04b02a7 100644 --- a/apps/web/locales/fi-FI.po +++ b/apps/web/locales/fi-FI.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Tyhjennä valinta" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Asiakastunnus" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Nimetön kulkuavain" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/fr-FR.po b/apps/web/locales/fr-FR.po index af0809234..1d9f1fd87 100644 --- a/apps/web/locales/fr-FR.po +++ b/apps/web/locales/fr-FR.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Sélection claire" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID client" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Clé d'accès sans nom" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/he-IL.po b/apps/web/locales/he-IL.po index bdb720339..c3e51ab96 100644 --- a/apps/web/locales/he-IL.po +++ b/apps/web/locales/he-IL.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "נקה את הבחירה" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "מזהה לקוח" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "מפתח גישה ללא שם" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/hi-IN.po b/apps/web/locales/hi-IN.po index d0deee61d..46d69e198 100644 --- a/apps/web/locales/hi-IN.po +++ b/apps/web/locales/hi-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "चयन साफ़ करें" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ग्राहक आईडी" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "अनाम पासकी" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/hu-HU.po b/apps/web/locales/hu-HU.po index 6df38411e..4851160c2 100644 --- a/apps/web/locales/hu-HU.po +++ b/apps/web/locales/hu-HU.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Kijelölés törlése" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Ügyfél-azonosító" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Névtelen passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/id-ID.po b/apps/web/locales/id-ID.po index 836522f44..29170583d 100644 --- a/apps/web/locales/id-ID.po +++ b/apps/web/locales/id-ID.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Hapus pilihan" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID Klien" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Kunci sandi yang tidak disebutkan namanya" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/it-IT.po b/apps/web/locales/it-IT.po index c9c4e6660..749b6c8cd 100644 --- a/apps/web/locales/it-IT.po +++ b/apps/web/locales/it-IT.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Cancella selezione" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID client" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Chiave d'accesso senza nome" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ja-JP.po b/apps/web/locales/ja-JP.po index d7194440b..b3c91331b 100644 --- a/apps/web/locales/ja-JP.po +++ b/apps/web/locales/ja-JP.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "選択をクリア" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "クライアント ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "名前なしのパスキー" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/km-KH.po b/apps/web/locales/km-KH.po index 5576e92f6..005e4304c 100644 --- a/apps/web/locales/km-KH.po +++ b/apps/web/locales/km-KH.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "សម្អាតការជ្រើសរើស" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "លេខសម្គាល់អតិថិជន" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Passkey គ្មានឈ្មោះ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/kn-IN.po b/apps/web/locales/kn-IN.po index 8b1788941..c62c07433 100644 --- a/apps/web/locales/kn-IN.po +++ b/apps/web/locales/kn-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "ಆಯ್ಕೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ಗ್ರಾಹಕ ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "ಹೆಸರಿಡದ ಪಾಸ್‌ಕೀ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ko-KR.po b/apps/web/locales/ko-KR.po index 2b95b2098..539079fb1 100644 --- a/apps/web/locales/ko-KR.po +++ b/apps/web/locales/ko-KR.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "선택 해제" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "클라이언트 ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "이름 없는 패스키" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/lt-LT.po b/apps/web/locales/lt-LT.po index 38d188ffb..8707952b5 100644 --- a/apps/web/locales/lt-LT.po +++ b/apps/web/locales/lt-LT.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Išvalyti pasirinkimą" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Kliento ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Neįvardytas passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/lv-LV.po b/apps/web/locales/lv-LV.po index 1b692b1a9..e67667420 100644 --- a/apps/web/locales/lv-LV.po +++ b/apps/web/locales/lv-LV.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Notīrīt atlasi" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Klienta ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Nenosaukta piekļuves atslēga" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ml-IN.po b/apps/web/locales/ml-IN.po index 0648a1526..37135d4de 100644 --- a/apps/web/locales/ml-IN.po +++ b/apps/web/locales/ml-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "തിരഞ്ഞെടുപ്പ് മായ്ക്കുക" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ക്ലയൻ്റ് ഐഡി" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "പേരില്ലാത്ത പാസ്‌കീ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/mr-IN.po b/apps/web/locales/mr-IN.po index 83b00f1d7..186e2d18f 100644 --- a/apps/web/locales/mr-IN.po +++ b/apps/web/locales/mr-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "निवड साफ करा" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "क्लायंट आयडी" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "अनामिक पासकी" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ms-MY.po b/apps/web/locales/ms-MY.po index f7a10eb64..f9d4b0631 100644 --- a/apps/web/locales/ms-MY.po +++ b/apps/web/locales/ms-MY.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Kosongkan pilihan" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID Pelanggan" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Kunci laluan tanpa nama" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ne-NP.po b/apps/web/locales/ne-NP.po index 615579af3..6401a6306 100644 --- a/apps/web/locales/ne-NP.po +++ b/apps/web/locales/ne-NP.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "चयन खाली गर्नुहोस्" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ग्राहक आईडी" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "अनाम पासकी" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/nl-NL.po b/apps/web/locales/nl-NL.po index c6d05e1b4..c9e577803 100644 --- a/apps/web/locales/nl-NL.po +++ b/apps/web/locales/nl-NL.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Selectie wissen" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Client-ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Naamloze passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/no-NO.po b/apps/web/locales/no-NO.po index 416ea11d2..34daa5e16 100644 --- a/apps/web/locales/no-NO.po +++ b/apps/web/locales/no-NO.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Fjern valg" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Klient-ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Navnløs passnøkkel" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/or-IN.po b/apps/web/locales/or-IN.po index 7203a2c00..0856f2cc8 100644 --- a/apps/web/locales/or-IN.po +++ b/apps/web/locales/or-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "ଚୟନ ଖାଲି କରନ୍ତୁ" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "କ୍ଲାଏଣ୍ଟ ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "ନାମହୀନ ପାସକି" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/pl-PL.po b/apps/web/locales/pl-PL.po index 6963c23ba..eb820a22e 100644 --- a/apps/web/locales/pl-PL.po +++ b/apps/web/locales/pl-PL.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Wyczyść wybór" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Identyfikator klienta" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Nienazwany klucz dostępu" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/pt-BR.po b/apps/web/locales/pt-BR.po index 02d0215ba..0c2ca4d65 100644 --- a/apps/web/locales/pt-BR.po +++ b/apps/web/locales/pt-BR.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Limpar seleção" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID do cliente" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Chave de acesso sem nome" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/pt-PT.po b/apps/web/locales/pt-PT.po index 2714c7e5f..550bedf79 100644 --- a/apps/web/locales/pt-PT.po +++ b/apps/web/locales/pt-PT.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Limpar seleção" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID do cliente" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Chave de acesso sem nome" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ro-RO.po b/apps/web/locales/ro-RO.po index f4fe4d2fe..f9da210d1 100644 --- a/apps/web/locales/ro-RO.po +++ b/apps/web/locales/ro-RO.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Ștergeți selecția" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID client" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Cheie de acces fără nume" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ru-RU.po b/apps/web/locales/ru-RU.po index 2a358d332..0bd8570c0 100644 --- a/apps/web/locales/ru-RU.po +++ b/apps/web/locales/ru-RU.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Четкий выбор" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Идентификатор клиента" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Безымянный ключ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/sk-SK.po b/apps/web/locales/sk-SK.po index 4e742f113..ef05f9a30 100644 --- a/apps/web/locales/sk-SK.po +++ b/apps/web/locales/sk-SK.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Vymazať výber" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID klienta" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Nepomenovaný prístupový kľúč" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/sl-SI.po b/apps/web/locales/sl-SI.po index 6f99d809d..172d662ae 100644 --- a/apps/web/locales/sl-SI.po +++ b/apps/web/locales/sl-SI.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Počisti izbor" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID stranke" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Neimenovani ključ passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/sq-AL.po b/apps/web/locales/sq-AL.po index 2c9901d1d..5da34fe4c 100644 --- a/apps/web/locales/sq-AL.po +++ b/apps/web/locales/sq-AL.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Fshij përzgjedhjen" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID-ja e klientit" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Çelës kalimi i paemëruar" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/sr-SP.po b/apps/web/locales/sr-SP.po index 845e3fb29..9526be269 100644 --- a/apps/web/locales/sr-SP.po +++ b/apps/web/locales/sr-SP.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Обриши избор" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ИД клијента" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Неименовани кључ за приступ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/sv-SE.po b/apps/web/locales/sv-SE.po index 24ff39038..60166a9cc 100644 --- a/apps/web/locales/sv-SE.po +++ b/apps/web/locales/sv-SE.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Rensa valet" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Klient-ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Namnlös passkey" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/ta-IN.po b/apps/web/locales/ta-IN.po index d92cf8e5f..ec6d01630 100644 --- a/apps/web/locales/ta-IN.po +++ b/apps/web/locales/ta-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "தெளிவான தேர்வு" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "வாடிக்கையாளர் ஐடி" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "பெயரிடப்படாத பாஸ் கீ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/te-IN.po b/apps/web/locales/te-IN.po index bbfa8e5e7..b214697b9 100644 --- a/apps/web/locales/te-IN.po +++ b/apps/web/locales/te-IN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "స్పష్టమైన ఎంపిక" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "క్లయింట్ ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "పేరులేని పాస్‌కీ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/th-TH.po b/apps/web/locales/th-TH.po index 9f9d5f829..a741b84a7 100644 --- a/apps/web/locales/th-TH.po +++ b/apps/web/locales/th-TH.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "การเลือกที่ชัดเจน" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "รหัสลูกค้า" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "พาสคีย์ที่ไม่ระบุชื่อ" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/tr-TR.po b/apps/web/locales/tr-TR.po index 3c3383cea..a7935600f 100644 --- a/apps/web/locales/tr-TR.po +++ b/apps/web/locales/tr-TR.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Seçimi temizle" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Müşteri Kimliği" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "İsimsiz geçiş anahtarı" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/uk-UA.po b/apps/web/locales/uk-UA.po index b1e73fde1..250240ce0 100644 --- a/apps/web/locales/uk-UA.po +++ b/apps/web/locales/uk-UA.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Очистити вибір" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID клієнта" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Безіменний ключ доступу" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/uz-UZ.po b/apps/web/locales/uz-UZ.po index 45654cff9..d932b445d 100644 --- a/apps/web/locales/uz-UZ.po +++ b/apps/web/locales/uz-UZ.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Tanlovni tozalash" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "Mijoz identifikatori" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Nomsiz kirish kaliti" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/vi-VN.po b/apps/web/locales/vi-VN.po index 492a829b2..80439fee0 100644 --- a/apps/web/locales/vi-VN.po +++ b/apps/web/locales/vi-VN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "Xóa lựa chọn" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "ID khách hàng" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "Khóa truy cập không có tên" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/zh-CN.po b/apps/web/locales/zh-CN.po index 7e5bd69aa..ebb9afc41 100644 --- a/apps/web/locales/zh-CN.po +++ b/apps/web/locales/zh-CN.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "清除选择" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "客户端 ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "未命名通行密钥" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/zh-TW.po b/apps/web/locales/zh-TW.po index 3199dd28c..c48dbae7d 100644 --- a/apps/web/locales/zh-TW.po +++ b/apps/web/locales/zh-TW.po @@ -1785,6 +1785,10 @@ msgstr "" msgid "Clear selection" msgstr "清除選擇" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "用戶端 ID" @@ -3706,6 +3710,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8391,6 +8399,7 @@ msgid "Unnamed passkey" msgstr "未命名通行金鑰" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/locales/zu-ZA.po b/apps/web/locales/zu-ZA.po index ce13f63ee..a48f256ab 100644 --- a/apps/web/locales/zu-ZA.po +++ b/apps/web/locales/zu-ZA.po @@ -1780,6 +1780,10 @@ msgstr "" msgid "Clear selection" msgstr "" +#: src/features/resume/stylesheet/editor.tsx +msgid "Click anything on the page to style it. The rule you're in is outlined on the page." +msgstr "" + #: src/features/auth/pages/consent.tsx msgid "Client ID" msgstr "" @@ -3701,6 +3705,10 @@ msgstr "" msgid "Have a resume already? <0>Import it" msgstr "" +#: src/features/resume/stylesheet/targets.ts +msgid "Header" +msgstr "" + #: src/routes/builder/$resumeId/-sidebar/right/sections/typography.tsx msgctxt "Headings or Titles (H1, H2, H3, H4, H5, H6)" msgid "Heading" @@ -8386,6 +8394,7 @@ msgid "Unnamed passkey" msgstr "" #: src/features/resume/editor/write/entry-card.tsx +#: src/features/resume/stylesheet/targets.ts msgid "Untitled" msgstr "" diff --git a/apps/web/src/features/resume/editor/page-overlay.tsx b/apps/web/src/features/resume/editor/page-overlay.tsx index b6347cf3b..d4b334a61 100644 --- a/apps/web/src/features/resume/editor/page-overlay.tsx +++ b/apps/web/src/features/resume/editor/page-overlay.tsx @@ -31,6 +31,7 @@ const readSelection = (element: HTMLElement): EditorSelection | null => { */ export function PageOverlay({ pageIndex, pageMap, onSelect }: PageOverlayProps) { const selection = useEditorStore((state) => state.selection); + const styleHighlight = useEditorStore((state) => state.styleHighlight); const page = pageMap?.pages[pageIndex]; if (!pageMap || !page || page.width <= 0 || page.height <= 0) return null; @@ -40,6 +41,17 @@ export function PageOverlay({ pageIndex, pageMap, onSelect }: PageOverlayProps) const sectionsWithItems = new Set(nodes.flatMap((node) => (node.kind === "item" ? [node.sectionId] : []))); const blocks = nodes.filter((node) => node.kind !== "section" || !sectionsWithItems.has(node.sectionId)); + // Custom Styles: each node the rule under the cursor matches, outlined as the closest block the page map knows + // (a field inside an entry lights up its entry). + const highlighted = new Set( + styleHighlight.flatMap((key) => { + const owner = nodes + .filter((node) => key === node.key || key.startsWith(`${node.key}/`)) + .sort((left, right) => right.key.length - left.key.length)[0]; + return owner ? [owner] : []; + }), + ); + const handleClick = (event: MouseEvent) => { const target = (event.target as HTMLElement).closest("[data-kind]"); const next = target ? readSelection(target) : null; @@ -77,6 +89,19 @@ export function PageOverlay({ pageIndex, pageMap, onSelect }: PageOverlayProps) ); })} + {[...highlighted].map((node) => ( +
+ ))}
); } diff --git a/apps/web/src/features/resume/editor/store.ts b/apps/web/src/features/resume/editor/store.ts index 089be0011..c94205e05 100644 --- a/apps/web/src/features/resume/editor/store.ts +++ b/apps/web/src/features/resume/editor/store.ts @@ -70,6 +70,8 @@ type EditorStore = { basicsOpen: boolean; /** Design: a template shown on the page while its thumbnail is hovered or focused, not yet applied. */ previewTemplate: Template | null; + /** Custom Styles: the page nodes matched by the rule the cursor is in, outlined on the page. */ + styleHighlight: readonly string[]; /** * The render on screen: physical pages, the page map and the PDF (which Check's parser view reads). `version` * counts renders, so Fit can wait for one. @@ -112,6 +114,7 @@ type EditorStore = { setFocusEntry: (entryId: string | null) => void; setBasicsOpen: (open: boolean) => void; setPreviewTemplate: (template: Template | null) => void; + setStyleHighlight: (keys: readonly string[]) => void; setRendered: (render: { pageCount: number; pageMap: PageMap | undefined; file: Blob }) => void; setMobileView: (view: MobileView) => void; setCheckTab: (tab: CheckTab) => void; @@ -157,6 +160,7 @@ const initialState = { focusEntryId: null, basicsOpen: true, previewTemplate: null, + styleHighlight: [], rendered: { pageCount: 0, pageMap: undefined, file: undefined, version: 0 }, mobileView: null, checkTab: "issues", @@ -198,6 +202,7 @@ export const useEditorStore = create()((set) => ({ setFocusEntry: (focusEntryId) => set({ focusEntryId }), setBasicsOpen: (basicsOpen) => set({ basicsOpen }), setPreviewTemplate: (previewTemplate) => set({ previewTemplate }), + setStyleHighlight: (styleHighlight) => set({ styleHighlight }), setRendered: (render) => set((state) => ({ rendered: { ...render, version: state.rendered.version + 1 } })), setMobileView: (mobileView) => set({ mobileView }), setCheckTab: (checkTab) => set({ checkTab }), diff --git a/apps/web/src/features/resume/stylesheet/editor-extensions.test.ts b/apps/web/src/features/resume/stylesheet/editor-extensions.test.ts index 60db1008b..977db0a38 100644 --- a/apps/web/src/features/resume/stylesheet/editor-extensions.test.ts +++ b/apps/web/src/features/resume/stylesheet/editor-extensions.test.ts @@ -12,6 +12,7 @@ import { copySourceToClipboard, createSemanticCssEditorExtensions, getSemanticCssHoverDocumentation, + revealStyleRule, } from "./editor-extensions"; const semanticTree: SemanticNode = { @@ -136,12 +137,10 @@ describe("Semantic CSS editor extensions", () => { const labels = completionLabels("", 0, unsafeMetadata); + // IDs that need escaping aren't offered as `#…` at all: entries are offered by name instead. + expect(labels.filter((label) => label.startsWith("#1") || label.startsWith("#\\"))).toEqual([]); expect(labels).toEqual( - expect.arrayContaining([ - "#\\31 23\\ current\\#item", - '[name="company\\"lead\\a "]', - 'template-part[name="timeline\\"marker\\a "]', - ]), + expect.arrayContaining(['[name="company\\"lead\\a "]', 'template-part[name="timeline\\"marker\\a "]']), ); expect(labels).not.toContain("#123 current#item"); expect(labels).not.toContain('[name="company"lead\n"]'); @@ -238,4 +237,22 @@ describe("Semantic CSS editor extensions", () => { expect(view.dom.querySelector("[name=search]")).not.toBeNull(); expect(view.dom.querySelector("[name=replace]")).not.toBeNull(); }); + + it("adds a rule for a picked element once, then moves the cursor into it", () => { + const view = new EditorView({ doc: "header { color: red; }" }); + views.push(view); + const target = { selector: 'section[id="experience"] item[id="a"]', label: "Experience › Lead */ dev" }; + + revealStyleRule(view, target); + expect(view.state.doc.toString()).toBe( + 'header { color: red; }\n\n/* Experience › Lead *\\/ dev */\nsection[id="experience"] item[id="a"] {\n\t\n}\n', + ); + const inside = view.state.selection.main.head; + expect(view.state.doc.sliceString(inside - 1, inside + 2)).toBe("\t\n}"); + + view.dispatch({ selection: { anchor: 0 } }); + revealStyleRule(view, target); + expect(view.state.doc.toString().match(/item\[id="a"\]/g)).toHaveLength(1); + expect(view.state.selection.main.head).toBe(inside); + }); }); diff --git a/apps/web/src/features/resume/stylesheet/editor-extensions.ts b/apps/web/src/features/resume/stylesheet/editor-extensions.ts index acd671be4..7604fb120 100644 --- a/apps/web/src/features/resume/stylesheet/editor-extensions.ts +++ b/apps/web/src/features/resume/stylesheet/editor-extensions.ts @@ -42,7 +42,8 @@ function selectorLabels(metadata: SemanticCssEditorMetadata): string[] { ...new Set([ ...SEMANTIC_NODE_KINDS, "*", - ...nodes.flatMap((node) => (node.id ? [`#${escapeCssIdentifier(node.id)}`] : [])), + // Readable IDs only (section types): entries' UUIDs escape to `#\30 19b…`; they're offered by name instead. + ...nodes.flatMap((node) => (node.id && escapeCssIdentifier(node.id) === node.id ? [`#${node.id}`] : [])), ...attributes.map((attribute) => `[${escapeCssIdentifier(attribute)}]`), ...nodes.flatMap((node) => Object.entries(node.attributes).map( @@ -171,6 +172,9 @@ function completionSource(metadata: SemanticCssEditorMetadata): CompletionSource label, type: label.startsWith("@") ? "keyword" : label.startsWith("#") || label.includes("[") ? "text" : "property", })); + if (completionKind(source, context.pos) === "selector") + for (const target of metadata.targets ?? []) + options.push({ label: target.label, apply: target.selector, detail: target.selector, type: "class", boost: 1 }); return { from: word?.from ?? context.pos, options, validFor: /[-_@#a-zA-Z0-9]*/ }; }; } @@ -298,6 +302,31 @@ export function createSemanticCssEditorExtensions(input: { ]; } +/** + * Something picked on the page: move the cursor into its rule, adding one (under a comment naming it) when the + * stylesheet has none yet, and focus the editor. + */ +export function revealStyleRule(view: EditorViewType, target: { selector: string; label: string }): void { + const text = view.state.doc.toString(); + const existing = text.indexOf(`${target.selector} {`); + if (existing >= 0) { + const open = text.indexOf("{", existing) + 1; + const indent = text.slice(open).match(/^\n\t*/)?.[0].length ?? 0; + view.dispatch({ selection: { anchor: open + indent }, scrollIntoView: true }); + } else { + const gap = text.trim().length === 0 ? "" : text.endsWith("\n\n") ? "" : text.endsWith("\n") ? "\n" : "\n\n"; + const block = `${gap}/* ${target.label.replaceAll("*/", "*\\/")} */\n${target.selector} {\n\t\n}\n`; + const start = text.trim().length === 0 ? 0 : text.length; + view.dispatch({ + changes: { from: start, to: text.length, insert: block }, + // Inside the empty rule, after its tab. + selection: { anchor: start + block.length - "\n}\n".length }, + scrollIntoView: true, + }); + } + view.focus(); +} + export async function copySourceToClipboard(source: string): Promise { await navigator.clipboard.writeText(source); } diff --git a/apps/web/src/features/resume/stylesheet/editor.tsx b/apps/web/src/features/resume/stylesheet/editor.tsx index 917dbac97..4f4a709d9 100644 --- a/apps/web/src/features/resume/stylesheet/editor.tsx +++ b/apps/web/src/features/resume/stylesheet/editor.tsx @@ -34,10 +34,17 @@ import { ColorPicker } from "@/components/input/color-picker"; import { useIsResumeLocked, useResumeData, useResumeStore, useUpdateResumeData } from "@/features/resume/builder/draft"; import { useTheme } from "@/features/theme/provider"; import { useClosingValue } from "@/hooks/use-closing-value"; +import { useEditorStore } from "../editor/store"; import { serializeStylesheetColor, toStylesheetPickerColor } from "./color-format"; -import { compositionAwareDocumentListener, createSemanticCssEditorExtensions } from "./editor-extensions"; +import { + compositionAwareDocumentListener, + createSemanticCssEditorExtensions, + revealStyleRule, +} from "./editor-extensions"; import { formatEditorDocument } from "./formatter"; +import { matchedNodeKeys } from "./highlight"; import { LegacyStylesheetBanner } from "./legacy-banner"; +import { listStyleTargets, styleTargetFor } from "./targets"; import { StylesheetToolbar } from "./toolbar"; import { createCompileWorkerClient } from "./worker-client"; @@ -108,6 +115,8 @@ export type StylesheetCodeEditorProps = { label?: string; onChange(value: string): void; onFocusChange?(focused: boolean): void; + /** Where the cursor is while the editor has focus; null once it loses focus. */ + onCursorChange?(offset: number | null): void; onReady?(view: EditorView | null): void; onUndo(): void; onRedo(): void; @@ -122,6 +131,7 @@ export function StylesheetCodeEditor({ label = "Semantic CSS stylesheet", onChange, onFocusChange, + onCursorChange, onReady, onUndo, onRedo, @@ -132,6 +142,7 @@ export function StylesheetCodeEditor({ const initialPropsRef = useRef({ value, colorTokens, metadata, theme, readOnly, label }); const onChangeRef = useRef(onChange); const onFocusChangeRef = useRef(onFocusChange); + const onCursorChangeRef = useRef(onCursorChange); const onReadyRef = useRef(onReady); const onUndoRef = useRef(onUndo); const onRedoRef = useRef(onRedo); @@ -150,6 +161,7 @@ export function StylesheetCodeEditor({ onChangeRef.current = onChange; onFocusChangeRef.current = onFocusChange; + onCursorChangeRef.current = onCursorChange; onReadyRef.current = onReady; onUndoRef.current = onUndo; onRedoRef.current = onRedo; @@ -216,6 +228,8 @@ export function StylesheetCodeEditor({ (update) => update.transactions.some((transaction) => transaction.annotation(externalReplacement)), ), EditorView.updateListener.of((update) => { + if (update.selectionSet || update.docChanged || update.focusChanged) + onCursorChangeRef.current?.(update.view.hasFocus ? update.state.selection.main.head : null); if ( update.transactions.some( (transaction) => transaction.docChanged && !transaction.annotation(colorPickerEdit), @@ -386,6 +400,7 @@ const createEditorMetadata = (data: ResumeData): SemanticCssEditorMetadata => { return { semanticTree, templateParts: getTemplateSemanticManifest(data.metadata.template).parts.map(({ name }) => name), + targets: listStyleTargets(data, semanticTree), }; }; @@ -423,6 +438,27 @@ function StylesheetEditorShell({ readOnly = false }: StylesheetEditorShellProps) const metadata = useMemo(() => (data ? createEditorMetadata(data) : emptyMetadata), [data]); const disabled = readOnly || isLocked; + // Picking something on the page (Design) aims the stylesheet at it: its rule, added if there isn't one. + useEffect(() => { + if (disabled || !data) return; + return useEditorStore.subscribe((state, previous) => { + const view = editorViewRef.current; + if (!view || !state.selection || state.selection === previous.selection) return; + revealStyleRule(view, styleTargetFor(data, state.selection)); + }); + }, [data, disabled]); + + // The rule under the cursor is outlined on the page, and nothing is once the editor loses focus or closes. + useEffect(() => () => useEditorStore.getState().setStyleHighlight([]), []); + const highlightRuleAt = (offset: number | null) => { + const view = editorViewRef.current; + const keys = + offset === null || !view ? [] : matchedNodeKeys(view.state.doc.toString(), offset, metadata.semanticTree); + const { styleHighlight, setStyleHighlight } = useEditorStore.getState(); + if (keys.length !== styleHighlight.length || keys.some((key, index) => key !== styleHighlight[index])) + setStyleHighlight(keys); + }; + useEffect(() => { if (!compiler || !data) return; let cancelled = false; @@ -490,6 +526,7 @@ function StylesheetEditorShell({ readOnly = false }: StylesheetEditorShellProps) readOnly={disabled} label={t`Semantic CSS stylesheet`} onChange={setSourceText} + onCursorChange={highlightRuleAt} onReady={(view) => { editorViewRef.current = view; }} @@ -516,6 +553,13 @@ function StylesheetEditorShell({ readOnly = false }: StylesheetEditorShellProps) onFocusToggle={toggleFocus} /> +

+

+