mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-01 01:04:29 +10:00
Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab811b5f10 | ||
|
|
65618a82a0 | ||
|
|
6f0c727770 | ||
|
|
ebcaa4729f | ||
|
|
f14e120b00 | ||
|
|
d9da31e7bc | ||
|
|
128916b9a0 | ||
|
|
00be67f702 |
@@ -26,5 +26,9 @@ jobs:
|
||||
const labels = getIssueLabels(context.payload.issue.body ?? "");
|
||||
|
||||
if (labels.length > 0) {
|
||||
await github.rest.issues.addLabels({ ...context.issue, labels });
|
||||
await github.rest.issues.addLabels({
|
||||
...context.repo,
|
||||
issue_number: context.issue.number,
|
||||
labels,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
# Task 1: Harden public PDF response contract
|
||||
|
||||
## Implemented
|
||||
|
||||
- Pinned successful public PDF responses to `Content-Type: application/pdf` at the HTTP boundary.
|
||||
- Kept `Cache-Control: private, no-store` hardcoded at that boundary for successful, validation-error, and service-error responses.
|
||||
- Removed the unused `cacheControl` member from `createPublicResumePdf` and all affected tests/mocks.
|
||||
- Updated the route regression to return a `text/plain` file from the service mock while asserting the HTTP response remains `application/pdf`.
|
||||
|
||||
## Verification
|
||||
|
||||
- `pnpm --filter server test -- src/http/public-resume-pdf.test.ts` — 13 files / 71 tests passed.
|
||||
- `dotenvx run -f .env.local -- pnpm exec vitest run packages/api/src/features/resume/public-pdf.test.ts` — 1 file / 7 tests passed.
|
||||
- `pnpm exec biome check apps/server/src/http/public-resume-pdf.ts apps/server/src/http/public-resume-pdf.test.ts packages/api/src/features/resume/public-pdf.ts packages/api/src/features/resume/public-pdf.test.ts` — passed.
|
||||
- `pnpm --filter server typecheck` and `pnpm --filter @reactive-resume/api typecheck` — passed.
|
||||
|
||||
## Note
|
||||
|
||||
The API package test script did not scope to the supplied test path and initially ran the package suite, which has two unrelated baseline failures: `src/features/ai/url-policy.test.ts` and `src/features/resume/export.test.ts` (missing required env). The target test was then run directly with `.env.local` and passed.
|
||||
|
||||
## Self-review
|
||||
|
||||
`git diff --check` passed. The diff is restricted to the public PDF service contract, HTTP response header, and their focused tests.
|
||||
@@ -243,9 +243,9 @@ Other ways to support:
|
||||
|
||||
<a href="https://www.star-history.com/?repos=amruthpillai%2Freactive-resume&type=date&legend=top-left">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=amruthpillai/reactive-resume&type=date&theme=dark&legend=top-left&sealed_token=BF8sVMes0z5BhdkMhtFklhxeikeGUrSyW-CcY9E_RCQI5zqUHEbMRwcB075fUewbAtlNoCnDlWhDWjrDGhTcXMojsS2I0RCqcL-Y9p3Ez3H1A2QpRMthjFilP0YOCJEE9AZqRrqzlvj1uU2y5ixarXOuUXuuSw5DkLMViSMD8Ldl0H3BEgclnjWw4fI4" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=amruthpillai/reactive-resume&type=date&legend=top-left&sealed_token=BF8sVMes0z5BhdkMhtFklhxeikeGUrSyW-CcY9E_RCQI5zqUHEbMRwcB075fUewbAtlNoCnDlWhDWjrDGhTcXMojsS2I0RCqcL-Y9p3Ez3H1A2QpRMthjFilP0YOCJEE9AZqRrqzlvj1uU2y5ixarXOuUXuuSw5DkLMViSMD8Ldl0H3BEgclnjWw4fI4" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/chart?repos=amruthpillai/reactive-resume&type=date&legend=top-left&sealed_token=BF8sVMes0z5BhdkMhtFklhxeikeGUrSyW-CcY9E_RCQI5zqUHEbMRwcB075fUewbAtlNoCnDlWhDWjrDGhTcXMojsS2I0RCqcL-Y9p3Ez3H1A2QpRMthjFilP0YOCJEE9AZqRrqzlvj1uU2y5ixarXOuUXuuSw5DkLMViSMD8Ldl0H3BEgclnjWw4fI4" />
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=amruthpillai/reactive-resume&type=date&theme=dark&legend=top-left&sealed_token=QmaOn4Ech499R6kpQe8ONn911UjGUaJfQBT0MXlQLU9hTo-Ie7lTxIILWbBvmtzDGHk7ziWKN_N5iM5mgP8widn_FGHd9-PHNokPtSji8XLgbFpqatgyqIDPnOys-IhO40W3J0HeH07FL-Q8Bq6ArRk3LDtJDwjh4m0ya-2L59ULb7BaqxkSDuCytkCr" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=amruthpillai/reactive-resume&type=date&legend=top-left&sealed_token=QmaOn4Ech499R6kpQe8ONn911UjGUaJfQBT0MXlQLU9hTo-Ie7lTxIILWbBvmtzDGHk7ziWKN_N5iM5mgP8widn_FGHd9-PHNokPtSji8XLgbFpqatgyqIDPnOys-IhO40W3J0HeH07FL-Q8Bq6ArRk3LDtJDwjh4m0ya-2L59ULb7BaqxkSDuCytkCr" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/chart?repos=amruthpillai/reactive-resume&type=date&legend=top-left&sealed_token=QmaOn4Ech499R6kpQe8ONn911UjGUaJfQBT0MXlQLU9hTo-Ie7lTxIILWbBvmtzDGHk7ziWKN_N5iM5mgP8widn_FGHd9-PHNokPtSji8XLgbFpqatgyqIDPnOys-IhO40W3J0HeH07FL-Q8Bq6ArRk3LDtJDwjh4m0ya-2L59ULb7BaqxkSDuCytkCr" />
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: af\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Afrikaans\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zoem uit"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zoeloe"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: am\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Amharic\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "አጉር"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ዙሉ"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ar\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Arabic\n"
|
||||
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "تصغير"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "الزولو"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: az\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Azerbaijani\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Uzaqlaşdır"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: bg\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Bulgarian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Намаляване"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулуски"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: bn\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Bengali\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "জুম আউট"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "জুলু"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ca\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Catalan\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Allunya"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulú"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: cs\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Czech\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Oddálit"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: da\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Danish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zoom ud"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: de\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: German\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Herauszoomen"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: el\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Greek\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Σμίκρυνση"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Ζουλού"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: en_GB\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 21:09\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: English, United Kingdom\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zoom out"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: es\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Alejar"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulú"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: fa\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Persian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "کوچکنمایی"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "زولو"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: fi\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Finnish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Loitonna"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: fr\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: French\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zoom arrière"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zoulou"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: he\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Hebrew\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "התרחקות"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "זולו"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: hi\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Hindi\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "ज़ूम आउट"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ज़ुलु"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: hu\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Hungarian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Kicsinyítés"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: id\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Indonesian\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5123,7 +5123,7 @@ msgstr "Uzbek"
|
||||
|
||||
#: src/features/resume/stylesheet/status.tsx
|
||||
msgid "Valid"
|
||||
msgstr "Valid"
|
||||
msgstr "Sah"
|
||||
|
||||
#: src/components/input/rich-input.tsx
|
||||
msgid "Valid URLs must start with http:// or https://."
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Perkecil"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: it\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Italian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Rimpicciolisci"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ja\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Japanese\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "ズームアウト"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ズールー語"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: km\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Khmer\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "បង្រួម"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: kn\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Kannada\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "ಗಾತ್ರ ಕುಗ್ಗಿಸಿ"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ಜೂಲೂ"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ko\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Korean\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "축소"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "줄루어"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: lt\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Lithuanian\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Tolinti"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulų"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: lv\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Latvian\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Tālināt"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ml\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Malayalam\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "സൂം ഔട്ട് ചെയ്യുക"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "സൂളു"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: mr\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Marathi\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "बाहेर झूम करा"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "झुलू"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ms\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Malay\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zum keluar"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ne\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Nepali\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "जूम आउट"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "जुलु"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: nl\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -179,7 +179,7 @@ msgstr "Benader uw cv's en gegevens programmatisch met behulp van de API."
|
||||
#: src/routes/dashboard/-components/sidebar.tsx
|
||||
#: src/routes/dashboard/settings/account.tsx
|
||||
msgid "Account"
|
||||
msgstr "Account"
|
||||
msgstr "Rekening"
|
||||
|
||||
#: src/routes/builder/$resumeId/-sidebar/left/index.tsx
|
||||
msgid "Account menu"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Uitzoomen"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: no\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Norwegian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zoom ut"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: or\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Odia\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "ଜୁମ୍ ଆଉଟ୍ କରନ୍ତୁ"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ଜୁଲୁ"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: pl\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Polish\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Pomniejsz"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: pt\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Portuguese, Brazilian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Diminuir zoom"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: pt\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Afastar"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ro\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Romanian\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
|
||||
@@ -5123,7 +5123,7 @@ msgstr "Uzbecă"
|
||||
|
||||
#: src/features/resume/stylesheet/status.tsx
|
||||
msgid "Valid"
|
||||
msgstr "Valid"
|
||||
msgstr "Valabil"
|
||||
|
||||
#: src/components/input/rich-input.tsx
|
||||
msgid "Valid URLs must start with http:// or https://."
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Micșorează"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ru\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Russian\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Уменьшить"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулу"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sk\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Slovak\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Oddialiť"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sl\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Slovenian\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Oddalji"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zuluščina"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sq\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:29\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Albanian\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zvogëlo"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sr\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Serbian (Cyrillic)\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Умањи"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулу"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: sv\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Zooma ut"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: ta\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Tamil\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "சிறிதாக்கு"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ஜூலு"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: te\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Telugu\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "జూమ్ అవుట్ చేయండి"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "జులు"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: th\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Thai\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "ซูมออก"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "ซูลู"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: tr\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Uzaklaştır"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: uk\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Зменшити"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Зулу"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: uz\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Uzbek\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Kichraytirish"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: vi\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Vietnamese\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "Thu nhỏ"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "Zulu"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: zh\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "缩小"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "祖鲁语"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Language: zh\n"
|
||||
"Project-Id-Version: reactive-resume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"PO-Revision-Date: 2026-08-16 14:51\n"
|
||||
"PO-Revision-Date: 2026-08-17 22:30\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Traditional\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
@@ -5445,3 +5445,4 @@ msgstr "縮小"
|
||||
#: src/libs/locale.ts
|
||||
msgid "Zulu"
|
||||
msgstr "祖魯語"
|
||||
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# dsh-plugin-reactive-resume
|
||||
|
||||
Connect [Reactive Resume](https://rxresu.me) to [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness). Read, create, and edit your resumes and job applications from a Harness session.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
dsh plugin --profile <name> add dsh-plugin-reactive-resume
|
||||
```
|
||||
|
||||
This package declares `dsh.bundle`, so the profile picks it up as a layer and mounts it automatically. Until you configure a key it mounts nothing and logs a warning, so installing it never leaves a profile unbootable.
|
||||
|
||||
## Configure
|
||||
|
||||
Mint an API key at `https://rxresu.me/dashboard/settings/api-keys` and export it as `RXRESUME_API_KEY` — the bundle patch reads that variable. To set it explicitly, or to change any other option, patch the row by id from your profile's `cordis.patch.yml`:
|
||||
|
||||
```yaml
|
||||
- id: reactive-resume
|
||||
config:
|
||||
apiKey: !!js process.env.RXRESUME_API_KEY
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
| Key | Default | Description |
|
||||
|---|---|---|
|
||||
| `apiKey` | `''` | API key from `<url>/dashboard/settings/api-keys`. Empty mounts nothing. |
|
||||
| `url` | `https://rxresu.me` | Origin of your instance. Set this if you self-host. |
|
||||
| `serverName` | `resume` | Tool namespace. Tools reach the model as `mcp__<serverName>__<rawName>`. |
|
||||
| `toolCallTimeoutMs` | `60000` | Per-tool-call timeout. |
|
||||
|
||||
Every tool Reactive Resume publishes is exposed. Narrowing that set is not currently possible from a plugin: Harness's `ctx.tools.restrict()` requires an agent-scoped context, which a plugin context is not.
|
||||
|
||||
### Self-hosted
|
||||
|
||||
```yaml
|
||||
- id: reactive-resume
|
||||
config:
|
||||
apiKey: !!js process.env.RXRESUME_API_KEY
|
||||
url: http://localhost:3000
|
||||
```
|
||||
|
||||
## What it does
|
||||
|
||||
Bridges Reactive Resume's MCP server into `ctx.tools`, and contributes a system-prompt section covering the things models get wrong about resume editing: reading before patching, RFC 6902 path construction against the published schema, UUID-keyed section entries, and locked resumes.
|
||||
|
||||
You could wire the bridge yourself with a raw `@deepseek-ai/dsh-mcp-client` row. What you cannot do that way is contribute the prompt section — that is what this package adds.
|
||||
|
||||
## Development
|
||||
|
||||
This package lives in the [Reactive Resume monorepo](https://github.com/amruthpillai/reactive-resume) at `packages/dsh-plugin`, next to `packages/mcp` — the server it bridges. `src/tool-names.test.ts` checks every tool the prompt guide names against `@reactive-resume/mcp/tool-names`, so renaming a tool breaks this package in the same pull request.
|
||||
|
||||
```bash
|
||||
pnpm --filter dsh-plugin-reactive-resume test
|
||||
pnpm --filter dsh-plugin-reactive-resume build
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
@@ -0,0 +1,17 @@
|
||||
# dsh-plugin-reactive-resume bundle patch: one insert over the profile root.
|
||||
# `dsh plugin add` joins this layer to the profile's bundle stack automatically.
|
||||
# Override any field by patching the row by id from your profile's own
|
||||
# cordis.patch.yml (the last write wins per row) — for a self-hosted instance:
|
||||
#
|
||||
# - id: reactive-resume
|
||||
# config:
|
||||
# apiKey: !!js process.env.RXRESUME_API_KEY
|
||||
# url: http://localhost:3000
|
||||
#
|
||||
# With no apiKey the row loads and mounts nothing, so installing this plugin
|
||||
# before configuring it leaves the profile bootable.
|
||||
- insert:
|
||||
- id: reactive-resume
|
||||
name: dsh-plugin-reactive-resume
|
||||
config:
|
||||
apiKey: !!js process.env.RXRESUME_API_KEY ?? ''
|
||||
@@ -0,0 +1,166 @@
|
||||
# DeepSeek Harness Plugin for Reactive Resume — Design
|
||||
|
||||
**Date:** 2026-08-16
|
||||
**Status:** Approved, ready for implementation planning
|
||||
**Package:** `dsh-plugin-reactive-resume`
|
||||
|
||||
> **Post-implementation note:** the `tools` config key and `ctx.tools.restrict()` call described below (Config, `apply()` step 2, "Tool-name generation and drift detection") were cut from v0.1.0. `docs/spikes/2026-08-16-restrict-semantics.md` found that `restrict()` cannot reach tools a plugin's own `ctx.plugin(mcpClient, …)` registers — it throws when called from an unscoped plugin context, and even from a real agent scope it refuses to touch a scope's own (as opposed to inherited) registrations. There is no arrangement reachable from this plugin's `apply(ctx, config)` where curation works, so 0.1.0 ships all tools unfiltered, per that spike's documented fallback. The rest of this document is left as originally written for history; it does not describe what shipped.
|
||||
|
||||
## Goal
|
||||
|
||||
Distribute a DeepSeek Harness plugin that connects Harness to a Reactive Resume account, so a DSH user can read, create, and edit resumes and job applications from their agent session with one config row and an API key.
|
||||
|
||||
## Context
|
||||
|
||||
### What Reactive Resume already ships
|
||||
|
||||
Reactive Resume exposes a complete remote MCP server. Nothing on the server side needs to change for this plugin to work.
|
||||
|
||||
- `packages/mcp` registers 33 tools (`list_resumes`, `read_resume`, `apply_resume_patch`, `tailor_resume_for_application`, …), 3 prompts, and 2 resources.
|
||||
- `apps/server/src/http/app.ts` mounts `/mcp` and `/mcp/*` (Streamable HTTP) plus `/.well-known/mcp/server-card.json` (SEP-1649).
|
||||
- `apps/server/src/mcp/auth.ts` accepts either an OAuth `Authorization: Bearer` token or an `x-api-key` header. The API key path needs no interactive flow.
|
||||
- The web app already ships API key management at `/dashboard/settings/api-keys`, so user provisioning is a solved problem.
|
||||
|
||||
### What DeepSeek Harness provides
|
||||
|
||||
Verified against the published packages, not only the docs.
|
||||
|
||||
- A plugin is a TypeScript module exporting `name`, optional `inject`, and `apply(ctx, config)`. Config schemas use `@deepseek-ai/schemastery`.
|
||||
- `@deepseek-ai/dsh-mcp-client` (v0.0.1-rc.1) bridges one external MCP server per plugin instance. Its `StreamableHttpConfig` is exactly:
|
||||
|
||||
```ts
|
||||
interface StreamableHttpConfig {
|
||||
transport: 'streamable-http'
|
||||
serverName: string // [A-Za-z0-9_-]{1,32}, unique across live instances
|
||||
url: string
|
||||
headers: Record<string, string>
|
||||
toolCallTimeoutMs: number
|
||||
failOnStartupError: boolean
|
||||
}
|
||||
```
|
||||
|
||||
Bridged tools become model-facing as `mcp__<serverName>__<rawName>`.
|
||||
- `ctx.tools` is a `ToolRegistry` exposing `restrict(filter: ToolRestriction): () => void`, where `ToolRestriction` is `{ allow?: readonly string[]; deny?: readonly string[] }`.
|
||||
- `ctx.systemPrompt` (from `@deepseek-ai/dsh-system-prompt`) exposes `section(section: PromptSection): () => void`, where `PromptSection` is `{ name, order, text, complete? }`. Convention: `-100` is harness identity, `0` the deployment persona, and `100–199` is tool guidance.
|
||||
- Plugins are distributed on npm and discovered through the `dsh-plugin` GitHub topic.
|
||||
|
||||
### The gap this plugin fills
|
||||
|
||||
`dsh-mcp-client` has no tool filtering and no way to contribute prompt text. A user pasting a raw MCP row into `cordis.yml` gets all 33 tool schemas in their context budget and no guidance on Reactive Resume's JSON Patch semantics. Those two things are the plugin's reason to exist.
|
||||
|
||||
## Decisions
|
||||
|
||||
| Decision | Choice | Why |
|
||||
|---|---|---|
|
||||
| Scope | Thin MCP bridge + prompt section | The tool layer already exists and is maintained in Reactive Resume. Reimplementing 33 tool contracts against oRPC would drift every release. |
|
||||
| Repo | Standalone, outside the Reactive Resume monorepo | The plugin imports nothing from Reactive Resume — it speaks HTTP. The monorepo has no npm publish pipeline: root and every package are `private: true`, there is no build output, no changesets, no `NPM_TOKEN`, and no publish workflow. Adding one to ship a dependency-free package is cost without benefit. |
|
||||
| Auth | `x-api-key` only | Two clicks in Reactive Resume settings. OAuth needs a token store and an interactive flow for no gain. |
|
||||
| Drift protection | Server-card contract test in CI | Replaces the lockstep the monorepo would have given, without the pipeline. |
|
||||
|
||||
## Architecture
|
||||
|
||||
### Package shape
|
||||
|
||||
Namespace plugin, mirroring `dsh-mcp-client`'s own export form:
|
||||
|
||||
```ts
|
||||
export const name = 'reactive-resume'
|
||||
export const inject = ['tools', 'systemPrompt']
|
||||
export const Config: z<Config>
|
||||
export async function apply(ctx: Context, config: Config): Promise<void>
|
||||
```
|
||||
|
||||
`@deepseek-ai/cordis`, `@deepseek-ai/dsh-tools`, `@deepseek-ai/dsh-system-prompt`, and `@deepseek-ai/dsh-mcp-client` are `peerDependencies` so the plugin binds to the host's versions rather than installing a second copy of the runtime.
|
||||
|
||||
### Config
|
||||
|
||||
```ts
|
||||
interface Config {
|
||||
/** API key from <url>/dashboard/settings/api-keys. */
|
||||
apiKey: string
|
||||
/** Reactive Resume instance origin. Default 'https://rxresu.me'. */
|
||||
url?: string
|
||||
/** Tool namespace: tools appear as mcp__<serverName>__<rawName>. Default 'resume'. */
|
||||
serverName?: string
|
||||
/** Which tool group to expose. Default 'all'. */
|
||||
tools?: 'resume' | 'applications' | 'all'
|
||||
/** Per-tool-call timeout. Default inherited from dsh-mcp-client. */
|
||||
toolCallTimeoutMs?: number
|
||||
}
|
||||
```
|
||||
|
||||
`url` accepts any origin so self-hosted instances work unchanged.
|
||||
|
||||
### apply()
|
||||
|
||||
Three steps, in order:
|
||||
|
||||
1. **Mount the bridge.** `ctx.plugin(mcpClient, { transport: 'streamable-http', serverName, url:`${url}/mcp`, headers: { 'x-api-key': apiKey }, toolCallTimeoutMs, failOnStartupError: true })`. `failOnStartupError: true` turns a bad API key into a loud activation failure instead of tools that silently fail at call time.
|
||||
|
||||
2. **Curate the tool surface.** When `tools !== 'all'`, call `ctx.tools.restrict({ deny: [...] })` with the namespaced names of the excluded group, computed from the generated tool-name list. See "Open risk" below.
|
||||
|
||||
3. **Contribute prompt guidance.** `ctx.systemPrompt.section({ name: 'reactive-resume', order: 150, text: PATCH_GUIDE })`.
|
||||
|
||||
All three return disposers; Cordis effect scoping unwinds them on unload, so no manual cleanup is needed beyond returning them where the API expects it.
|
||||
|
||||
### PATCH_GUIDE
|
||||
|
||||
The plugin's substance. Roughly 40 lines covering the failure modes Reactive Resume already encodes as error hints in `packages/mcp/src/tools.ts` (`errorHint`) — those hints exist precisely because models get these wrong:
|
||||
|
||||
- Call `read_resume` before `apply_resume_patch`; never patch blind.
|
||||
- `apply_resume_patch` takes RFC-6902 operations against the resume data document.
|
||||
- Fetch the `resume://_meta/schema` resource before constructing paths.
|
||||
- Section entries are arrays of objects keyed by UUID; ids are not indices.
|
||||
- A locked resume rejects writes — call `unlock_resume` first.
|
||||
- `list_resumes` is the way to recover a valid id after a 404.
|
||||
|
||||
Written as static text, not a provider function — it does not vary per assembly.
|
||||
|
||||
### Tool-name generation and drift detection
|
||||
|
||||
> **Superseded by the move into the monorepo.** The plugin now sits beside the MCP server it bridges, so `src/tool-names.test.ts` reads `@reactive-resume/mcp/tool-names` directly. A tool rename fails that test on the same pull request. The generated snapshot, the fetch script, and the scheduled network job described below no longer exist.
|
||||
|
||||
- Build step fetches `<url>/.well-known/mcp/server-card.json` and emits `src/tool-names.generated.ts` containing the raw tool names split into the `resume` and `applications` groups.
|
||||
- The generated file is committed, so `npm install` never needs network access.
|
||||
- A scheduled CI job refetches from `https://rxresu.me` and fails when the committed list no longer matches the live card. That failure is the signal to cut a new plugin release.
|
||||
|
||||
### Install UX
|
||||
|
||||
README's copy-paste block:
|
||||
|
||||
```yaml
|
||||
- insert:
|
||||
- id: reactive-resume
|
||||
name: dsh-plugin-reactive-resume
|
||||
config:
|
||||
apiKey: !!js process.env.RXRESUME_API_KEY
|
||||
```
|
||||
|
||||
## Open risk
|
||||
|
||||
`ToolRegistry.restrict`'s contract reads: *"Per-scope filter over the tools a scope INHERITS — the global layer and every ancestor layer on its chain. Restrictions intersect, and do not affect the scope's own registrations."*
|
||||
|
||||
`ctx.plugin(mcpClient, …)` mounts the bridge in a **child** scope of the plugin's context. The bridged tools are therefore registered in a descendant, not an ancestor, of the scope calling `restrict`. Whether a parent-scope restriction reaches them is unverified.
|
||||
|
||||
This must be settled by a spike before the config surface is committed, because `tools` is a public config key and removing it later is a breaking change.
|
||||
|
||||
**Fallback if `restrict` does not reach the child scope:** ship 0.1.0 without the `tools` key (equivalent to `'all'`), and solve curation in 0.2.0 — possibly by mounting the bridge at the same scope level rather than as a child. The prompt section alone justifies the release.
|
||||
|
||||
## Testing
|
||||
|
||||
- **Spike (blocking):** run a local Reactive Resume (`dotenvx run -f .env.local -- pnpm dev`, port 3000), point a scratch Harness config at `http://localhost:3000/mcp` with an `x-api-key`, and confirm (a) the Streamable HTTP bridge connects and lists 33 tools, and (b) whether `ctx.tools.restrict` from the plugin's scope hides bridged tools.
|
||||
- **Unit:** `Config` schema defaults and validation; the deny-list computation from the generated tool names; `PATCH_GUIDE` section registers at order 150 with the expected name.
|
||||
- **Contract:** server-card fetch matches `src/tool-names.generated.ts`.
|
||||
- **Manual smoke before publish:** in a real Harness session against rxresu.me — list resumes, read one, apply a patch, verify the change in the web UI.
|
||||
|
||||
## Out of scope
|
||||
|
||||
OAuth support, `ctx.commands` shortcuts, a bundled Harness skill, local resume caching, and PDF rendering inside Harness. Each is additive and none blocks a useful 0.1.0.
|
||||
|
||||
## Build order
|
||||
|
||||
0. Spike `restrict()` semantics and the Streamable HTTP bridge against localhost.
|
||||
1. Repo scaffold, `Config` schema, bridge mount, README. End-to-end working install.
|
||||
2. `PATCH_GUIDE` prompt section.
|
||||
3. Tool profiles, generated name list, drift CI.
|
||||
4. Publish 0.1.0, tag the repo with the `dsh-plugin` topic, submit to `awesome-deepseek-harness`.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,382 @@
|
||||
# Spike: does `ctx.tools.restrict()` reach a child scope's tools?
|
||||
|
||||
**Verdict up front:** `restrict reaches child-scope tools: NO`
|
||||
|
||||
The plugin's own `apply(ctx, config)` — a bare Cordis plugin context that
|
||||
never mints a `dsh-scope` scope — cannot call `ctx.tools.restrict()` at all.
|
||||
It throws. When the arrangement is fixed so `restrict()` is at least
|
||||
callable (a real agent-style scope), it still refuses to touch a tool the
|
||||
bridge registered inside that same scope's own layer. Neither path reaches
|
||||
the topology this plugin needs. The `tools` config key must not ship in
|
||||
0.1.0.
|
||||
|
||||
## Environment and bootstrapping
|
||||
|
||||
Scaffolded a throwaway workspace at `/tmp/dsh-spike` (deleted after this
|
||||
spike; nothing there is part of the plugin repo).
|
||||
|
||||
```bash
|
||||
mkdir -p /tmp/dsh-spike && cd /tmp/dsh-spike && pnpm init
|
||||
```
|
||||
|
||||
**Version resolution problem.** `pnpm add @deepseek-ai/cordis @deepseek-ai/dsh-tools @deepseek-ai/schemastery`
|
||||
with no version pins resolves `dsh-tools` to its `next` dist-tag
|
||||
(`0.1.0-rc.6`), whose peer chain requires `@deepseek-ai/dsh-agent` and
|
||||
`@deepseek-ai/dsh-session`, both of which peer-depend on
|
||||
`@deepseek-ai/dsh-type-meta` — a package that returns a plain 404 from the
|
||||
public npm registry (confirmed directly: `npm view @deepseek-ai/dsh-type-meta`
|
||||
→ `404 Not Found`). Pinning `dsh-tools` to `0.0.1-rc.1` (the version this
|
||||
plugin actually targets — confirmed via `npm view @deepseek-ai/dsh-tools
|
||||
dist-tags`, where `latest` is `0.0.1-rc.1`) does not by itself fix this: pnpm
|
||||
still auto-installs peer dependencies for the lockfile, so the same
|
||||
`dsh-type-meta` 404 recurs indirectly through `dsh-agent`'s and
|
||||
`dsh-session`'s peer graph.
|
||||
|
||||
**Fix that worked:** disable pnpm's peer auto-install and add only the
|
||||
packages `dsh-tools`'s *compiled* `lib/index.js` actually imports at
|
||||
runtime (checked directly — `import type` lines don't need the package on
|
||||
disk, real `import` lines do):
|
||||
|
||||
```
|
||||
import { Service } from "@deepseek-ai/cordis";
|
||||
import z from "@deepseek-ai/schemastery";
|
||||
import { AnonymousEntries, NamedEntries, ScopedLayers, scopeOf, scopeTarget } from "@deepseek-ai/dsh-scope";
|
||||
import { CallId, HarnessError, assertNever, deepFreeze } from "@deepseek-ai/dsh-llm";
|
||||
import { isJsonValue, snapshotJsonValue } from "@deepseek-ai/dsh-session";
|
||||
```
|
||||
|
||||
`.npmrc`:
|
||||
|
||||
```
|
||||
auto-install-peers=false
|
||||
strict-peer-dependencies=false
|
||||
```
|
||||
|
||||
Install commands, in order (each added only after the previous run's
|
||||
`ERR_MODULE_NOT_FOUND` named the next missing runtime import):
|
||||
|
||||
```bash
|
||||
pnpm add @deepseek-ai/cordis@^4.0.1-rc.1 @deepseek-ai/dsh-tools@0.0.1-rc.1 @deepseek-ai/schemastery@^3.18.1-rc.1 \
|
||||
--config.auto-install-peers=false --config.strict-peer-dependencies=false
|
||||
pnpm add @deepseek-ai/dsh-scope@0.0.1-rc.1 @deepseek-ai/dsh-llm@0.0.1-rc.1 @deepseek-ai/dsh-session@0.0.1-rc.1 \
|
||||
--config.auto-install-peers=false --config.strict-peer-dependencies=false
|
||||
pnpm add @deepseek-ai/dsh-system-prompt@0.0.1-rc.1 @deepseek-ai/dsh-invariants@0.0.1-rc.1 \
|
||||
--config.auto-install-peers=false --config.strict-peer-dependencies=false
|
||||
pnpm add @deepseek-ai/dsh-timeout@0.0.1-rc.1 \
|
||||
--config.auto-install-peers=false --config.strict-peer-dependencies=false
|
||||
```
|
||||
|
||||
`dsh-system-prompt` and `dsh-invariants` were needed for a second reason,
|
||||
not just a `dsh-tools` runtime import: `ToolRegistry.inject = ["systemPrompt"]`
|
||||
and its constructor calls `ctx.systemPrompt.tools(...)` immediately, so a
|
||||
`systemPrompt` service must be mounted on `ctx` *before* `ToolRegistry` is.
|
||||
`dsh-timeout` surfaced one level further down, as a real (non-type) import
|
||||
inside `dsh-llm`'s compiled output.
|
||||
|
||||
None of the packages actually needed at `0.0.1-rc.1` depend on
|
||||
`dsh-type-meta` — only `dsh-agent` and `dsh-session`'s *peer* list does
|
||||
(`dsh-session` doesn't import it at runtime, so it was never installed and
|
||||
never missed). Final resolved set: `cordis@4.0.1`, `dsh-tools@0.0.1-rc.1`,
|
||||
`schemastery@3.18.1`, `dsh-scope@0.0.1-rc.1`, `dsh-llm@0.0.1-rc.1`,
|
||||
`dsh-session@0.0.1-rc.1`, `dsh-system-prompt@0.0.1-rc.1`,
|
||||
`dsh-invariants@0.0.1-rc.1`, `dsh-timeout@0.0.1-rc.1`.
|
||||
|
||||
**Dead end worth recording:** before finding the npm-registry version-pin
|
||||
fix, I found a fully-resolved install of these packages already on disk at
|
||||
`~/.local/share/mise/installs/node/24.19.0/lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/*`
|
||||
(the globally-installed `dsh` CLI's own bundled `node_modules`). That
|
||||
install is `dsh-tools@0.1.0-rc.6`, not `0.0.1-rc.1` — a different minor
|
||||
line with a renamed class (`ToolRuntime`, not `ToolRegistry`) and a
|
||||
different `register`/`restrict`/`schemas` signature (`scope?: ScopeKey`
|
||||
parameter instead of implicit calling-context resolution). I did **not**
|
||||
use this install for the verdict below — it's the wrong pinned version for
|
||||
this plugin — but it's why the bootstrapping path above took several
|
||||
iterations: I initially assumed the API surface from that install, then had
|
||||
to re-derive it from the actually-pinned `0.0.1-rc.1` types.
|
||||
|
||||
## The actual `ToolDefinition` shape (0.0.1-rc.1)
|
||||
|
||||
The brief's guessed shape (`parameters`, bare `async execute() { return
|
||||
{content:[...]} }`) doesn't compile against `node_modules/@deepseek-ai/dsh-tools/lib/types/index.d.ts`.
|
||||
The real shape:
|
||||
|
||||
```ts
|
||||
export interface ToolDefinition extends ToolSchema {
|
||||
// ToolSchema = { name: string; description: string; parameters: Record<string, unknown> }
|
||||
readonly output: ToolOutputDefinition; // MANDATORY, not optional
|
||||
execute(args: unknown, exec: ToolRunContext): Promise<unknown>; // returns the canonical value, not ContentBlock[]
|
||||
finalizeContent?(...): ContentBlock[] | undefined;
|
||||
timeoutMs?: number;
|
||||
isConcurrencySafe?(args: unknown): boolean;
|
||||
presentCall?(args: unknown): ToolCallView | undefined;
|
||||
presentResult?(args: unknown, result: ToolResult): ToolResultView | undefined;
|
||||
}
|
||||
interface ToolOutputDefinition {
|
||||
readonly schema: JsonSchemaNode; // enforced JSON Schema subset
|
||||
render(args: unknown, value: JsonValue): ContentBlock[]; // projects the canonical value to model-facing content
|
||||
presentationMeta?(args: unknown, value: JsonValue): JsonValue;
|
||||
}
|
||||
```
|
||||
|
||||
`execute()` returns the tool's canonical JSON value (validated against
|
||||
`output.schema`); `output.render()` is what turns that value into
|
||||
`ContentBlock[]`. `register()` throws a `TypeError` if `output` is missing
|
||||
or `output.render` isn't a function — confirmed by reading
|
||||
`ToolRegistry.register` in the compiled `lib/index.js`.
|
||||
|
||||
`ToolRegistry` itself: `export { ToolRegistry, ToolRegistry as default }` —
|
||||
it's a Cordis `Service` subclass (`super(ctx, "tools")`), so it's mounted
|
||||
with `ctx.plugin(ToolRegistry, config)`, not `ctx.plugin(tools)` where
|
||||
`tools` is the whole module namespace (the brief's guess).
|
||||
|
||||
## The mechanism (read from the compiled source, then verified by running it)
|
||||
|
||||
`declare module '@deepseek-ai/cordis' { interface Context { tools: ToolRegistry } }`
|
||||
— `ctx.tools` is one Cordis **service singleton**, shared down the whole
|
||||
context tree exactly like every other Cordis service. There is no
|
||||
per-Cordis-child-context instance of the registry; nesting a plugin under
|
||||
`ctx.plugin(...)` does not give it a private `tools`.
|
||||
|
||||
What actually gates `register()`/`restrict()`'s visibility isn't the Cordis
|
||||
plugin-context tree at all — it's a **separate, opt-in scoping layer** from
|
||||
`@deepseek-ai/dsh-scope`:
|
||||
|
||||
- `scopeOf(ctx)` reads "the nearest scope tag inherited by a context" — and
|
||||
a context only carries a scope tag if something called
|
||||
`createScope(ctx, key)` on it (or a Cordis ancestor of it). A plain
|
||||
`ctx.plugin(child)` context is **not** scoped by that call alone.
|
||||
- `ToolRegistry.register(definition)`: `this.layers.effect(this.ctx, (layer) => layer.tools.insert(name, definition), ...)` —
|
||||
lands in whatever layer `scopeOf(this.ctx)` resolves to (the global layer
|
||||
if unscoped). No scope requirement to call it.
|
||||
- `ToolRegistry.restrict(filter)`: the **first line** is
|
||||
`const scope = scopeOf(this.ctx); if (scope === void 0) throw new Error("tools.restrict() requires a scoped context (agent.ctx): ...")`.
|
||||
It is unconditionally unusable from an unscoped context — this is not a
|
||||
silent no-op, it's a thrown error.
|
||||
- Even when `scope !== undefined`, `restrict()` computes
|
||||
`known = this.view(scope).restrictableNames` (the scope's *inherited*
|
||||
surface — global + ancestor layers) and rejects any name not in that set:
|
||||
`"a restriction filters what this scope inherits, never what it registers itself"`.
|
||||
A tool registered as a **child** of the exact scope doing the restricting
|
||||
is, by construction, in that scope's own layer, not its inherited surface
|
||||
— so it is unconditionally unreachable by that scope's own `restrict()`
|
||||
call, confirmed by the second probe below.
|
||||
|
||||
This is a stricter, more mechanical version of what the `ToolRestriction`
|
||||
docstring already said in prose (`"do not affect the scope's own
|
||||
registrations"`) — the two probes below hit it from two different angles
|
||||
and got two different thrown errors, not one graceful no-op.
|
||||
|
||||
## Probe 1 — the literal topology from the task brief
|
||||
|
||||
`ctx.plugin(mcpClient)` mounts the bridge as a Cordis **child** of the
|
||||
plugin's own `apply(ctx, config)`; the plugin then calls
|
||||
`ctx.tools.restrict(...)` from its own (parent, unscoped) `ctx`. This
|
||||
reproduces the plugin's real design as literally as a stub allows.
|
||||
|
||||
`/tmp/dsh-spike/probe.ts`:
|
||||
|
||||
```ts
|
||||
import { Context } from "@deepseek-ai/cordis";
|
||||
import SystemPrompt from "@deepseek-ai/dsh-system-prompt";
|
||||
import ToolRegistry from "@deepseek-ai/dsh-tools";
|
||||
|
||||
const root = new Context();
|
||||
|
||||
// ToolRegistry.inject = ["systemPrompt"], and its constructor calls
|
||||
// ctx.systemPrompt.tools(...) immediately, so systemPrompt must be mounted first.
|
||||
await root.plugin(SystemPrompt);
|
||||
await root.plugin(ToolRegistry);
|
||||
|
||||
/** Stands in for dsh-mcp-client: registers one tool in whatever scope loads it. */
|
||||
const stubBridge = {
|
||||
name: "stub-bridge",
|
||||
inject: ["tools"],
|
||||
apply(ctx: Context) {
|
||||
ctx.tools.register({
|
||||
name: "mcp__resume__list_applications",
|
||||
description: "stub",
|
||||
parameters: { type: "object", properties: {} },
|
||||
output: {
|
||||
schema: { type: "string" },
|
||||
render: (_args: unknown, value: unknown) => [{ type: "text", text: String(value) }],
|
||||
},
|
||||
async execute() {
|
||||
return "ok";
|
||||
},
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
// The plugin under design mounts the bridge as a child, exactly like this.
|
||||
await root.plugin(stubBridge);
|
||||
|
||||
const names = () => root.tools.schemas().map((s) => s.name);
|
||||
console.log("BEFORE", names());
|
||||
|
||||
try {
|
||||
const dispose = root.tools.restrict({ deny: ["mcp__resume__list_applications"] });
|
||||
console.log("AFTER", names());
|
||||
dispose();
|
||||
console.log("DISPOSED", names());
|
||||
} catch (err) {
|
||||
console.log("RESTRICT_THREW", (err as Error).message);
|
||||
}
|
||||
```
|
||||
|
||||
Run with `node --experimental-strip-types probe.ts`. Actual output,
|
||||
verbatim:
|
||||
|
||||
```
|
||||
BEFORE [ 'mcp__resume__list_applications' ]
|
||||
RESTRICT_THREW tools.restrict() requires a scoped context (agent.ctx): a context-global restriction would mask every agent — deny the tool for the intended agent instead
|
||||
```
|
||||
|
||||
`restrict()` never gets a chance to filter anything — it throws before
|
||||
touching the tool set, because `root` (and every context under it, absent
|
||||
an explicit `createScope()`) is unscoped.
|
||||
|
||||
## Probe 2 (Step 4) — the best-case sibling arrangement
|
||||
|
||||
Per the brief's Step 4, tried fixing the exception by giving the plugin a
|
||||
real `dsh-scope` scope (what `createScope()` provides) and calling
|
||||
`restrict()` from *inside* that scope, matching "registering the
|
||||
restriction inside the same scope the bridge loads into."
|
||||
|
||||
Where a real agent gets this: `@deepseek-ai/dsh-agent-loop@0.0.1-rc.1`
|
||||
`lib/index.js:375` —
|
||||
|
||||
```js
|
||||
this.scope = createScope(loopCtx, this);
|
||||
this.ctx = this.scope.ctx.extend({ agent: this });
|
||||
```
|
||||
|
||||
— **not** `dsh-agent`, which never calls `createScope` (its compiled
|
||||
`lib/index.js` only calls `scopeTarget`, for event routing, not for minting
|
||||
a scope). This is the exact line that builds `agent.ctx` — the thing
|
||||
`ToolRegistry`'s thrown error message names as what `restrict()` requires.
|
||||
Confirmed directly: installed both `dsh-agent@0.0.1-rc.1` and
|
||||
`dsh-agent-loop@0.0.1-rc.1` with the same
|
||||
`--config.auto-install-peers=false --config.strict-peer-dependencies=false`
|
||||
workaround used for the rest of the dependency tree (`dsh-type-meta` is only
|
||||
a *peer* dependency of `dsh-agent`, never a runtime import — same situation
|
||||
as `dsh-session`/`dsh-scope` above — so it's never actually needed on disk),
|
||||
then grepped the installed `lib/index.js` files for `createScope`.
|
||||
|
||||
`/tmp/dsh-spike/probe2.ts`:
|
||||
|
||||
```ts
|
||||
import { Context } from "@deepseek-ai/cordis";
|
||||
import { createScope } from "@deepseek-ai/dsh-scope";
|
||||
import SystemPrompt from "@deepseek-ai/dsh-system-prompt";
|
||||
import ToolRegistry from "@deepseek-ai/dsh-tools";
|
||||
|
||||
const root = new Context();
|
||||
await root.plugin(SystemPrompt);
|
||||
await root.plugin(ToolRegistry);
|
||||
|
||||
const stubBridge = {
|
||||
name: "stub-bridge",
|
||||
inject: ["tools"],
|
||||
apply(ctx: Context) {
|
||||
ctx.tools.register({
|
||||
name: "mcp__resume__list_applications",
|
||||
description: "stub",
|
||||
parameters: { type: "object", properties: {} },
|
||||
output: {
|
||||
schema: { type: "string" },
|
||||
render: (_args: unknown, value: unknown) => [{ type: "text", text: String(value) }],
|
||||
},
|
||||
async execute() {
|
||||
return "ok";
|
||||
},
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
// Mint a dsh-scope "Scope" (what dsh-agent-loop does to build agent.ctx --
|
||||
// see lib/index.js:375) and mount the bridge as a CHILD of that scope's ctx
|
||||
// -- i.e. an inherited/ancestor registration relative to the scope itself,
|
||||
// not the scope's own layer.
|
||||
const scopeKey = {};
|
||||
const scope = createScope(root, scopeKey);
|
||||
await scope.ctx.plugin(stubBridge);
|
||||
|
||||
const namesFor = (ctx: Context) => ctx.tools.schemas(scopeKey).map((s) => s.name);
|
||||
console.log("BEFORE(scoped view)", namesFor(root));
|
||||
|
||||
// Cordis requires a plugin to declare inject: ['tools'] to bare-access
|
||||
// ctx.tools; call restrict() from inside a plugin mounted on scope.ctx so
|
||||
// the "calling scope" Cordis sees is the scope itself (agent.ctx-equivalent).
|
||||
let disposeRestrict: (() => void) | undefined;
|
||||
const restrictor = {
|
||||
name: "stub-restrictor",
|
||||
inject: ["tools"],
|
||||
apply(ctx: Context) {
|
||||
try {
|
||||
disposeRestrict = ctx.tools.restrict({ deny: ["mcp__resume__list_applications"] });
|
||||
console.log("AFTER(scoped view)", namesFor(root));
|
||||
} catch (err) {
|
||||
console.log("RESTRICT_THREW", (err as Error).message);
|
||||
}
|
||||
},
|
||||
};
|
||||
await scope.ctx.plugin(restrictor);
|
||||
|
||||
if (disposeRestrict) {
|
||||
disposeRestrict();
|
||||
console.log("DISPOSED(scoped view)", namesFor(root));
|
||||
}
|
||||
```
|
||||
|
||||
Run with `node --experimental-strip-types probe2.ts`. Actual output,
|
||||
verbatim:
|
||||
|
||||
```
|
||||
BEFORE(scoped view) [ 'mcp__resume__list_applications' ]
|
||||
RESTRICT_THREW tools.restrict() names unknown inherited tool "mcp__resume__list_applications"; a restriction filters what this scope inherits, never what it registers itself. Restrictable tools: (none)
|
||||
```
|
||||
|
||||
`restrict()` is now at least *callable*, but it explicitly refuses: the
|
||||
bridge's tool lives in the same scope's own layer (it was mounted as a
|
||||
Cordis child of `scope.ctx`, which is what makes it inherit that scope
|
||||
tag), and `restrict()`'s error message says outright that it will never
|
||||
touch a scope's own registrations, only what it inherits from an ancestor.
|
||||
`Restrictable tools: (none)` — there was nothing in this arrangement for
|
||||
the scope to restrict, because nothing was registered in any ancestor of
|
||||
it.
|
||||
|
||||
I did not chase the remaining permutation (bridge registered as an
|
||||
*ancestor* scope's own layer, restrict called from a *descendant* scope of
|
||||
that ancestor) — the class-level doc comment in `dsh-tools` confirms that
|
||||
shape is the one `restrict()` is actually built for (a parent scope curbing
|
||||
what a child scope inherits from it), but it doesn't match this plugin's
|
||||
topology: the plugin's `apply(ctx, config)` runs once at harness startup,
|
||||
before any real agent scope exists, and isn't in a position to be an
|
||||
ancestor of the eventual agent's scope. Chasing it further would still not
|
||||
produce an arrangement reachable from this plugin's own `apply(ctx, config)`,
|
||||
which is the brief's actual bar for flipping the verdict to YES. Time spent
|
||||
on Step 4: about 15 minutes, well under the 30-minute cap.
|
||||
|
||||
I did not spin up a full agent loop from `dsh-agent`/`dsh-agent-loop` (the
|
||||
stub plugins above stand in for one, per the brief's instruction not to need
|
||||
a live agent) — but I did install both packages and grep their compiled
|
||||
output to confirm the `createScope()` attribution above, as noted earlier in
|
||||
this section. No residual gap remains on that point.
|
||||
|
||||
## Verdict
|
||||
|
||||
```
|
||||
restrict reaches child-scope tools: NO
|
||||
```
|
||||
|
||||
Both the literal plugin topology (unscoped `restrict()` call → throws
|
||||
immediately) and the best-case fix for that (scoped `restrict()` call →
|
||||
throws with "unknown inherited tool" because the bridge's registration is
|
||||
the scope's own, not inherited) fail to hide the child-registered tool. The
|
||||
`tools` config key is deferred out of 0.1.0, per Task 6's fallback note.
|
||||
|
||||
## Cleanup
|
||||
|
||||
```bash
|
||||
rm -rf /tmp/dsh-spike
|
||||
```
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"name": "dsh-plugin-reactive-resume",
|
||||
"version": "0.1.0",
|
||||
"description": "DeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.",
|
||||
"keywords": [
|
||||
"dsh-plugin",
|
||||
"deepseek-harness",
|
||||
"mcp",
|
||||
"reactive-resume",
|
||||
"resume"
|
||||
],
|
||||
"license": "MIT",
|
||||
"author": "Amruth Pillai",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/amruthpillai/reactive-resume.git",
|
||||
"directory": "packages/dsh-plugin"
|
||||
},
|
||||
"homepage": "https://github.com/amruthpillai/reactive-resume/tree/main/packages/dsh-plugin#readme",
|
||||
"bugs": {
|
||||
"url": "https://github.com/amruthpillai/reactive-resume/issues"
|
||||
},
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"default": "./dist/index.js"
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
"cordis.patch.yml"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^22.19.0 || >=24.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsdown",
|
||||
"typecheck": "tsgo --noEmit",
|
||||
"test": "vitest run --passWithNoTests",
|
||||
"test:coverage": "vitest run --coverage --passWithNoTests",
|
||||
"test:ci": "vitest run --coverage --reporter=default --reporter=github-actions --reporter=json --reporter=junit --outputFile.json=reports/vitest-results.json --outputFile.junit=reports/vitest-junit.xml --passWithNoTests",
|
||||
"test:agent": "vitest run --reporter=agent --reporter=json --outputFile.json=reports/vitest-results.json --passWithNoTests",
|
||||
"prepublishOnly": "pnpm build"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@deepseek-ai/cordis": "^4.0.1",
|
||||
"@deepseek-ai/dsh-mcp-client": "^0.1.0-rc.6",
|
||||
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
||||
"@deepseek-ai/schemastery": "^3.18.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@deepseek-ai/cordis": "^4.0.1",
|
||||
"@deepseek-ai/dsh-mcp-client": "^0.1.0-rc.6",
|
||||
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
||||
"@deepseek-ai/schemastery": "^3.18.1",
|
||||
"@reactive-resume/config": "workspace:*",
|
||||
"@reactive-resume/mcp": "workspace:*",
|
||||
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
||||
"tsdown": "^0.22.0",
|
||||
"typescript": "^7.0.2",
|
||||
"vitest": "^4.1.10"
|
||||
},
|
||||
"dsh": {
|
||||
"bundle": {
|
||||
"patch": "./cordis.patch.yml"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { expect, it } from "vitest";
|
||||
import { Config } from "./config";
|
||||
|
||||
it("applies defaults for every optional field", () => {
|
||||
const parsed = Config({ apiKey: "test-key" });
|
||||
|
||||
expect(parsed).toEqual({
|
||||
apiKey: "test-key",
|
||||
url: "https://rxresu.me",
|
||||
serverName: "resume",
|
||||
toolCallTimeoutMs: 60_000,
|
||||
});
|
||||
});
|
||||
|
||||
it("keeps explicit values", () => {
|
||||
const parsed = Config({
|
||||
apiKey: "test-key",
|
||||
url: "http://localhost:3000",
|
||||
serverName: "rr",
|
||||
toolCallTimeoutMs: 5_000,
|
||||
});
|
||||
|
||||
expect(parsed.url).toBe("http://localhost:3000");
|
||||
expect(parsed.serverName).toBe("rr");
|
||||
expect(parsed.toolCallTimeoutMs).toBe(5_000);
|
||||
});
|
||||
|
||||
it("defaults apiKey to empty rather than throwing, so an unconfigured row still loads", () => {
|
||||
expect(Config({}).apiKey).toBe("");
|
||||
});
|
||||
@@ -0,0 +1,34 @@
|
||||
import z from "@deepseek-ai/schemastery";
|
||||
|
||||
/** `dsh-mcp-client` reserves this shape for a server namespace. */
|
||||
const SERVER_NAME_PATTERN = /^[A-Za-z0-9_-]{1,32}$/;
|
||||
|
||||
/** Resolved plugin configuration. Every field is populated after parsing. */
|
||||
export interface Config {
|
||||
/** API key minted at `<url>/dashboard/settings/api-keys`. */
|
||||
apiKey: string;
|
||||
/** Reactive Resume origin, no trailing slash. */
|
||||
url: string;
|
||||
/** Tool namespace: tools reach the model as `mcp__<serverName>__<rawName>`. */
|
||||
serverName: string;
|
||||
/** Per-tool-call timeout in milliseconds. */
|
||||
toolCallTimeoutMs: number;
|
||||
}
|
||||
|
||||
export const Config = z.object({
|
||||
// Not `.required()`: the bundle patch mounts this plugin as soon as the
|
||||
// package is installed, so a missing key has to be an inert no-op rather
|
||||
// than a validation error that takes the whole profile down at boot.
|
||||
// `apply` warns and mounts nothing instead.
|
||||
apiKey: z.string().default("").description("API key from <url>/dashboard/settings/api-keys."),
|
||||
url: z
|
||||
.string()
|
||||
.default("https://rxresu.me")
|
||||
.description("Reactive Resume origin. Set this for a self-hosted instance."),
|
||||
serverName: z
|
||||
.string()
|
||||
.pattern(SERVER_NAME_PATTERN)
|
||||
.default("resume")
|
||||
.description("Tool namespace. Must match [A-Za-z0-9_-]{1,32} and be unique across live MCP instances."),
|
||||
toolCallTimeoutMs: z.natural().default(60_000).description("Per-tool-call timeout in milliseconds."),
|
||||
});
|
||||
@@ -0,0 +1,58 @@
|
||||
import { expect, it, vi } from "vitest";
|
||||
import { Config } from "./config";
|
||||
import { apply, inject, name } from "./index";
|
||||
|
||||
/** Minimal stand-in for the parts of the Cordis context `apply` touches. */
|
||||
function fakeContext() {
|
||||
return {
|
||||
plugin: vi.fn(async (_plugin: unknown, _config: unknown) => undefined),
|
||||
systemPrompt: { section: vi.fn(() => () => undefined) },
|
||||
logger: { warn: vi.fn() },
|
||||
};
|
||||
}
|
||||
|
||||
it("exports the cordis plugin name", () => {
|
||||
expect(name).toBe("reactive-resume");
|
||||
});
|
||||
|
||||
it("declares the services it needs", () => {
|
||||
expect(inject).toEqual(["systemPrompt"]);
|
||||
});
|
||||
|
||||
it("mounts the MCP bridge with streamable-http and the api key header", async () => {
|
||||
const ctx = fakeContext();
|
||||
|
||||
await apply(ctx as never, Config({ apiKey: "test-key" }));
|
||||
|
||||
expect(ctx.plugin).toHaveBeenCalledTimes(1);
|
||||
expect(ctx.plugin.mock.calls[0]?.[1]).toEqual({
|
||||
transport: "streamable-http",
|
||||
serverName: "resume",
|
||||
url: "https://rxresu.me/mcp",
|
||||
headers: { "x-api-key": "test-key" },
|
||||
toolCallTimeoutMs: 60_000,
|
||||
failOnStartupError: true,
|
||||
});
|
||||
});
|
||||
|
||||
it("strips a trailing slash from the configured url", async () => {
|
||||
const ctx = fakeContext();
|
||||
|
||||
await apply(ctx as never, Config({ apiKey: "test-key", url: "http://localhost:3000/" }));
|
||||
|
||||
expect(ctx.plugin.mock.calls[0]?.[1]).toMatchObject({ url: "http://localhost:3000/mcp" });
|
||||
});
|
||||
|
||||
it("rejects a serverName the bridge would refuse at config-parse time, before apply runs", () => {
|
||||
expect(() => Config({ apiKey: "test-key", serverName: "has spaces" })).toThrow(/serverName/);
|
||||
});
|
||||
|
||||
it("mounts nothing when no apiKey is configured, so an unconfigured install still boots", async () => {
|
||||
const ctx = fakeContext();
|
||||
|
||||
await apply(ctx as never, Config({}));
|
||||
|
||||
expect(ctx.plugin).not.toHaveBeenCalled();
|
||||
expect(ctx.systemPrompt.section).not.toHaveBeenCalled();
|
||||
expect(ctx.logger.warn).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
@@ -0,0 +1,66 @@
|
||||
/**
|
||||
* DeepSeek Harness plugin for Reactive Resume.
|
||||
* @module dsh-plugin-reactive-resume
|
||||
*/
|
||||
|
||||
import type { Context } from "@deepseek-ai/cordis";
|
||||
// Side-effect import: pulls in the `Context.systemPrompt` module augmentation
|
||||
// this plugin relies on below. No runtime value is used from this module.
|
||||
import type {} from "@deepseek-ai/dsh-system-prompt";
|
||||
import type { Config } from "./config";
|
||||
import * as mcpClient from "@deepseek-ai/dsh-mcp-client";
|
||||
import { buildPatchGuide } from "./prompt";
|
||||
|
||||
// Re-exports the interface AND the schema — `config.ts` exports both under the
|
||||
// name `Config`, and Cordis reads the schema export to validate config before
|
||||
// this plugin starts.
|
||||
export { Config } from "./config";
|
||||
|
||||
/** Cordis plugin name used by loader diagnostics. */
|
||||
export const name = "reactive-resume";
|
||||
|
||||
/**
|
||||
* Services required by this plugin.
|
||||
*
|
||||
* `tools` is deliberately not injected here: `ctx.tools.restrict()` requires
|
||||
* an agent-scoped context, which a plugin's own `apply(ctx, config)` never
|
||||
* is, and this plugin never calls it. `@deepseek-ai/dsh-mcp-client` declares
|
||||
* its own dependency on the tools service, so the bridge still gets what it
|
||||
* needs without this plugin waiting on it.
|
||||
*/
|
||||
export const inject = ["systemPrompt"];
|
||||
|
||||
/**
|
||||
* Connect a Reactive Resume account to the session.
|
||||
* @param ctx - plugin context carrying prompt assembly.
|
||||
* @param config - resolved plugin configuration. `Config` already rejects an
|
||||
* invalid `serverName` at parse time, before `apply` ever runs.
|
||||
*/
|
||||
export async function apply(ctx: Context, config: Config): Promise<void> {
|
||||
// The bundle patch mounts this row on install, before anyone has minted a
|
||||
// key. Mount nothing rather than failing the profile's boot: `dsh plugin
|
||||
// add` should never leave the harness unbootable.
|
||||
if (config.apiKey === "") {
|
||||
ctx.logger.warn("no apiKey configured — set one at %s/dashboard/settings/api-keys to enable the tools", config.url);
|
||||
return;
|
||||
}
|
||||
|
||||
const origin = config.url.replace(/\/+$/, "");
|
||||
|
||||
await ctx.plugin(mcpClient, {
|
||||
transport: "streamable-http",
|
||||
serverName: config.serverName,
|
||||
url: `${origin}/mcp`,
|
||||
headers: { "x-api-key": config.apiKey },
|
||||
toolCallTimeoutMs: config.toolCallTimeoutMs,
|
||||
failOnStartupError: true,
|
||||
});
|
||||
|
||||
ctx.systemPrompt.section({
|
||||
// Namespaced by `serverName` so a second instance (e.g. a self-hosted
|
||||
// account alongside the hosted one) doesn't collide on section name.
|
||||
name: `reactive-resume:${config.serverName}`,
|
||||
order: 150,
|
||||
text: buildPatchGuide(config.serverName),
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import type { PromptSection } from "@deepseek-ai/dsh-system-prompt";
|
||||
import { expect, it, vi } from "vitest";
|
||||
import { Config } from "./config";
|
||||
import { apply } from "./index";
|
||||
import { PATCH_GUIDE } from "./prompt";
|
||||
|
||||
function fakeContext() {
|
||||
return {
|
||||
plugin: vi.fn(async (_plugin: unknown, _config: unknown) => undefined),
|
||||
systemPrompt: { section: vi.fn((_section: PromptSection) => () => undefined) },
|
||||
};
|
||||
}
|
||||
|
||||
it("registers one prompt section in the tool-guidance order band", async () => {
|
||||
const ctx = fakeContext();
|
||||
|
||||
await apply(ctx as never, Config({ apiKey: "test-key" }));
|
||||
|
||||
expect(ctx.systemPrompt.section).toHaveBeenCalledTimes(1);
|
||||
const section = ctx.systemPrompt.section.mock.calls[0]?.[0] as PromptSection;
|
||||
expect(section.name).toBe("reactive-resume:resume");
|
||||
expect(section.order).toBeGreaterThanOrEqual(100);
|
||||
expect(section.order).toBeLessThanOrEqual(199);
|
||||
expect(section.text).toBe(PATCH_GUIDE);
|
||||
});
|
||||
|
||||
it("derives the section name from serverName so a second instance can coexist", async () => {
|
||||
const first = fakeContext();
|
||||
const second = fakeContext();
|
||||
|
||||
await apply(first as never, Config({ apiKey: "test-key" }));
|
||||
await apply(second as never, Config({ apiKey: "test-key", serverName: "self-hosted" }));
|
||||
|
||||
const firstSection = first.systemPrompt.section.mock.calls[0]?.[0] as PromptSection;
|
||||
const secondSection = second.systemPrompt.section.mock.calls[0]?.[0] as PromptSection;
|
||||
expect(firstSection.name).not.toBe(secondSection.name);
|
||||
});
|
||||
|
||||
it("names the tools it references with the configured namespace", async () => {
|
||||
const ctx = fakeContext();
|
||||
|
||||
await apply(ctx as never, Config({ apiKey: "test-key", serverName: "rr" }));
|
||||
|
||||
const section = ctx.systemPrompt.section.mock.calls[0]?.[0] as PromptSection;
|
||||
expect(section.text).toContain("mcp__rr__read_resume");
|
||||
expect(section.text).not.toContain("mcp__resume__read_resume");
|
||||
});
|
||||
|
||||
it("covers the documented failure modes", () => {
|
||||
for (const phrase of ["RFC 6902", "unlock_resume", "lock_resume", "list_resumes"]) {
|
||||
expect(PATCH_GUIDE).toContain(phrase);
|
||||
}
|
||||
});
|
||||
|
||||
it("does not point at the unreachable schema resource", () => {
|
||||
expect(PATCH_GUIDE).not.toContain("resume://_meta/schema");
|
||||
});
|
||||
|
||||
it("does not claim update_resume replaces resume content", () => {
|
||||
expect(PATCH_GUIDE).toContain("only changes metadata");
|
||||
});
|
||||
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Build the Reactive Resume system-prompt section for one tool namespace.
|
||||
* @param serverName - the MCP namespace bridged tools are published under.
|
||||
* @returns prompt text naming tools exactly as the model will see them.
|
||||
*/
|
||||
export function buildPatchGuide(serverName: string): string {
|
||||
const t = (raw: string) => `\`mcp__${serverName}__${raw}\``;
|
||||
|
||||
return [
|
||||
"## Reactive Resume",
|
||||
"",
|
||||
"These tools operate on the user's real, live resumes and job applications. Changes are immediate and visible in their account.",
|
||||
"",
|
||||
"### Reading before writing",
|
||||
"",
|
||||
`- Call ${t("list_resumes")} to discover resume IDs. IDs are UUIDs, never titles or slugs.`,
|
||||
`- Call ${t("read_resume")} before any edit. Never patch a resume you have not read this session.`,
|
||||
`- If a call fails with "not found", re-run ${t("list_resumes")} rather than guessing an ID.`,
|
||||
"",
|
||||
"### Editing",
|
||||
"",
|
||||
`- ${t("apply_resume_patch")} takes RFC 6902 JSON Patch operations applied to the resume data document.`,
|
||||
`- Construct paths from the resume you already read this session — do not guess. ${t("apply_resume_patch")}'s own tool description ships concrete path examples (for example \`/basics/name\`, \`/sections/experience/items/-\`, \`/sections/experience/items/0/company\`, \`/metadata/template\`); match those shapes.`,
|
||||
"- Section entries are arrays of objects, each with its own UUID `id`. Address an existing entry by locating its index from the document you just read; never treat an `id` as an index.",
|
||||
"- Prefer one patch with several operations over several single-operation patches. Operations apply in order and the whole patch fails atomically.",
|
||||
`- ${t("update_resume")} only changes metadata — name, slug, tags, and public visibility. It cannot touch resume content; use ${t("apply_resume_patch")} for that. No tool replaces an existing resume's content wholesale: ${t("import_resume")} creates a brand-new resume from a full data document, it does not overwrite one you already have.`,
|
||||
"",
|
||||
"### Locking",
|
||||
"",
|
||||
`- A locked resume rejects every write. When a call fails because the resume is locked, call ${t("unlock_resume")}, make the change, then call ${t("lock_resume")} to leave the lock as you found it.`,
|
||||
"",
|
||||
"### Scope",
|
||||
"",
|
||||
"- Never delete a resume or an application unless the user asked for that specific deletion in this conversation.",
|
||||
"- When the user describes a change in prose, restate the concrete edit you are about to make before making it.",
|
||||
].join("\n");
|
||||
}
|
||||
|
||||
/** The prompt section for the default `resume` namespace. */
|
||||
export const PATCH_GUIDE: string = buildPatchGuide("resume");
|
||||
@@ -0,0 +1,27 @@
|
||||
import { expect, it } from "vitest";
|
||||
import { MCP_TOOL_NAME } from "@reactive-resume/mcp/tool-names";
|
||||
import { buildPatchGuide } from "./prompt";
|
||||
|
||||
/** Every raw tool name the prompt guide instructs the model to call. */
|
||||
function toolsReferencedByGuide(): string[] {
|
||||
const guide = buildPatchGuide("resume");
|
||||
const matches = guide.matchAll(/mcp__resume__([a-z0-9_]+)/g);
|
||||
return [...new Set([...matches].map((match) => match[1] as string))];
|
||||
}
|
||||
|
||||
it("references at least one tool", () => {
|
||||
// Guards the regex itself: a guide rewrite that drops the namespaced form
|
||||
// would otherwise make the next test pass vacuously.
|
||||
expect(toolsReferencedByGuide().length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it("only references tools the MCP server actually publishes", () => {
|
||||
// Reads the server's own tool-name table rather than a generated snapshot of
|
||||
// a live server card, so renaming a tool in `packages/mcp` fails here on the
|
||||
// same PR instead of drifting until a scheduled network check notices.
|
||||
const published: readonly string[] = Object.values(MCP_TOOL_NAME);
|
||||
|
||||
for (const referenced of toolsReferencedByGuide()) {
|
||||
expect(published).toContain(referenced);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "@reactive-resume/config/tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"noEmit": true
|
||||
},
|
||||
// Scoped to `src` so tsdown's declaration emit does not follow
|
||||
// `vitest.config.ts` into the root `vitest.shared.ts` and drop a stray
|
||||
// `vitest.shared.d.ts` at the repository root.
|
||||
"include": ["src"]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { defineConfig } from "tsdown";
|
||||
|
||||
export default defineConfig({
|
||||
entry: ["src/index.ts"],
|
||||
outDir: "dist",
|
||||
format: ["esm"],
|
||||
dts: true,
|
||||
clean: true,
|
||||
outExtensions: () => ({ js: ".js" }),
|
||||
});
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"extends": ["//"],
|
||||
"tags": ["runtime:server", "role:adapter"]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import { fileURLToPath } from "node:url";
|
||||
// @boundaries-ignore root shared Vitest config
|
||||
import { createVitestProjectConfig } from "../../vitest.shared";
|
||||
|
||||
export default createVitestProjectConfig({
|
||||
name: "dsh-plugin-reactive-resume",
|
||||
dirname: fileURLToPath(new URL(".", import.meta.url)),
|
||||
});
|
||||
@@ -5,7 +5,8 @@
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.ts",
|
||||
"./server-card": "./src/mcp-server-card.ts"
|
||||
"./server-card": "./src/mcp-server-card.ts",
|
||||
"./tool-names": "./src/mcp-tool-names.ts"
|
||||
},
|
||||
"scripts": {
|
||||
"typecheck": "tsgo --noEmit",
|
||||
|
||||
@@ -465,6 +465,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/template-part-timeline-content": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/template-part-timeline-marker": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/template-part-timeline-marker/template-part-timeline-dot": {
|
||||
@@ -480,6 +481,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/template-part-timeline-content": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/template-part-timeline-marker": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/template-part-timeline-marker/template-part-timeline-dot": {
|
||||
@@ -513,6 +515,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -521,6 +524,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -639,6 +643,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/template-part-timeline-content": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/template-part-timeline-marker": {},
|
||||
@@ -661,6 +666,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/template-part-timeline-content": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/template-part-timeline-marker": {},
|
||||
@@ -683,6 +689,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/template-part-timeline-content": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/template-part-timeline-marker": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/template-part-timeline-marker/template-part-timeline-dot": {
|
||||
@@ -703,6 +710,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/template-part-timeline-content": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/template-part-timeline-marker": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/template-part-timeline-marker/template-part-timeline-dot": {
|
||||
@@ -718,6 +726,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved azurill
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/template-part-timeline-content": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/template-part-timeline-marker": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/template-part-timeline-marker/template-part-timeline-dot": {
|
||||
@@ -1173,6 +1182,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -1181,6 +1191,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-heading": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-heading/icon-section": {},
|
||||
@@ -1193,6 +1204,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -1201,6 +1213,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-sidebar%3Ainterests": {},
|
||||
"page-2/region-main/section-sidebar%3Ainterests/section-heading": {},
|
||||
"page-2/region-main/section-sidebar%3Ainterests/section-heading/icon-section": {},
|
||||
@@ -1283,6 +1296,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -1298,6 +1312,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -1313,6 +1328,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Apublications": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-heading": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-heading/icon-section": {},
|
||||
@@ -1325,6 +1341,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -1333,6 +1350,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved bronzor
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Avolunteer": {},
|
||||
"page-3/region-main/section-main%3Avolunteer/section-heading": {},
|
||||
"page-3/region-main/section-main%3Avolunteer/section-heading/icon-section": {},
|
||||
@@ -1799,6 +1817,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -1807,6 +1826,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -1832,6 +1852,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -1840,6 +1861,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -1958,6 +1980,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -1973,6 +1996,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -1988,6 +2012,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -2000,6 +2025,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -2008,6 +2034,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved chikori
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -2474,6 +2501,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -2482,6 +2510,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -2507,6 +2536,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -2515,6 +2545,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -2636,6 +2667,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -2651,6 +2683,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -2666,6 +2699,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -2678,6 +2712,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -2686,6 +2721,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditgar
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -3149,6 +3185,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -3157,6 +3194,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -3182,6 +3220,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -3190,6 +3229,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -3308,6 +3348,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -3323,6 +3364,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -3338,6 +3380,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -3350,6 +3393,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -3358,6 +3402,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved ditto p
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -3824,6 +3869,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -3832,6 +3878,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -3857,6 +3904,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -3865,6 +3913,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -3983,6 +4032,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -3998,6 +4048,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -4013,6 +4064,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -4025,6 +4077,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -4033,6 +4086,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved gengar
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -4498,6 +4552,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -4506,6 +4561,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -4531,6 +4587,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -4539,6 +4596,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -4658,6 +4716,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -4673,6 +4732,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -4688,6 +4748,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -4700,6 +4761,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -4708,6 +4770,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved glalie
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -5172,6 +5235,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -5180,6 +5244,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -5205,6 +5270,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -5213,6 +5279,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -5331,6 +5398,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -5346,6 +5414,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -5361,6 +5430,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -5373,6 +5443,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -5381,6 +5452,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved kakuna
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -5845,6 +5917,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -5853,6 +5926,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -5878,6 +5952,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -5886,6 +5961,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -6004,6 +6080,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -6019,6 +6096,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -6034,6 +6112,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -6046,6 +6125,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -6054,6 +6134,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved lapras
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -6517,6 +6598,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -6525,6 +6607,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -6550,6 +6633,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -6558,6 +6642,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -6676,6 +6761,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -6691,6 +6777,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -6706,6 +6793,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -6718,6 +6806,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -6726,6 +6815,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved leafish
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -7212,6 +7302,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/template-part-education-grade-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
@@ -7221,6 +7312,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/template-part-education-grade-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
@@ -7247,6 +7339,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/template-part-education-grade-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
@@ -7256,6 +7349,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/template-part-education-grade-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
@@ -7379,6 +7473,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/template-part-education-grade-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
@@ -7395,6 +7490,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/template-part-education-grade-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
@@ -7411,6 +7507,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/template-part-education-grade-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
@@ -7424,6 +7521,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/template-part-education-grade-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
@@ -7433,6 +7531,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved meowth
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/template-part-education-grade-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
@@ -7906,6 +8005,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -7914,6 +8014,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -7939,6 +8040,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -7947,6 +8049,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -8065,6 +8168,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -8080,6 +8184,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -8095,6 +8200,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -8107,6 +8213,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -8115,6 +8222,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved onyx pr
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -8576,6 +8684,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -8584,6 +8693,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -8609,6 +8719,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -8617,6 +8728,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -8735,6 +8847,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -8750,6 +8863,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -8765,6 +8879,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -8777,6 +8892,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -8785,6 +8901,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved pikachu
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -9255,6 +9372,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -9263,6 +9381,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-awards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar": {},
|
||||
"page-2/region-sidebar/section-certifications": {
|
||||
"style": {
|
||||
@@ -9288,6 +9407,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -9296,6 +9416,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-sidebar/section-certifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-sidebar/section-interests": {
|
||||
"style": {
|
||||
"backgroundColor": "rgba(0,0,0,0.04)",
|
||||
@@ -9414,6 +9535,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -9429,6 +9551,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -9444,6 +9567,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-projects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications": {},
|
||||
"page-3/region-main/section-publications/section-heading": {},
|
||||
"page-3/region-main/section-publications/section-heading/icon-section": {},
|
||||
@@ -9456,6 +9580,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -9464,6 +9589,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved rhyhorn
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-publications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-volunteer": {},
|
||||
"page-3/region-main/section-volunteer/section-heading": {},
|
||||
"page-3/region-main/section-volunteer/section-heading/icon-section": {},
|
||||
@@ -9904,6 +10030,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-date": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/field-title": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8a8bb9fbe182/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/field-description/rich-text-description": {},
|
||||
@@ -9912,6 +10039,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-awarder": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-date": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/field-title": {},
|
||||
"page-2/region-main/section-main%3Aawards/section-items/item-019bef5a-93e4-7746-ad39-8dd81379c7c9/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-heading": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-heading/icon-section": {},
|
||||
@@ -9924,6 +10052,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-date": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-issuer": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/field-title": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-91fe8a4dfea6/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/field-description/rich-text-description": {},
|
||||
@@ -9932,6 +10061,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-date": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-issuer": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/field-title": {},
|
||||
"page-2/region-main/section-sidebar%3Acertifications/section-items/item-019bef5a-93e4-7746-ad39-961afccc2508/item-header/template-part-item-header-row": {},
|
||||
"page-2/region-main/section-sidebar%3Ainterests": {},
|
||||
"page-2/region-main/section-sidebar%3Ainterests/section-heading": {},
|
||||
"page-2/region-main/section-sidebar%3Ainterests/section-heading/icon-section": {},
|
||||
@@ -10014,6 +10144,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-name": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/field-period": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-4d2603fe2801/link-website": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff": {
|
||||
"style": {
|
||||
@@ -10029,6 +10160,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-name": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/field-period": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-524195dd7eff/link-website": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73": {
|
||||
"style": {
|
||||
@@ -10044,6 +10176,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-name": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/field-period": {},
|
||||
"page-3/region-main/section-main%3Aprojects/section-items/item-019bef5a-93e4-7746-ad39-549106273c73/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Apublications": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-heading": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-heading/icon-section": {},
|
||||
@@ -10056,6 +10189,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-date": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/field-title": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9816f0081895/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/field-description/rich-text-description": {},
|
||||
@@ -10064,6 +10198,7 @@ exports[`Semantic CSS all-template presentation > snapshots the resolved scizor
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-date": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-publisher": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/field-title": {},
|
||||
"page-3/region-main/section-main%3Apublications/section-items/item-019bef5a-93e4-7746-ad39-9cf55c272c05/item-header/template-part-item-header-row": {},
|
||||
"page-3/region-main/section-main%3Avolunteer": {},
|
||||
"page-3/region-main/section-main%3Avolunteer/section-heading": {},
|
||||
"page-3/region-main/section-main%3Avolunteer/section-heading/icon-section": {},
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
import type { SemanticNode } from "@reactive-resume/resume/stylesheet/types";
|
||||
import type { ResumeData } from "@reactive-resume/schema/resume/data";
|
||||
import type { Template } from "@reactive-resume/schema/templates";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { pdf } from "@react-pdf/renderer";
|
||||
import { createElement } from "react";
|
||||
import { analyzeStylesheet, compileStylesheet } from "@reactive-resume/resume/stylesheet";
|
||||
import { defaultResumeData } from "@reactive-resume/schema/resume/default";
|
||||
import { ResumeDocument } from "../document";
|
||||
import { resolveResumeRuntime } from "./resolve";
|
||||
import { buildSemanticTree } from "./tree";
|
||||
|
||||
type HostNode = { type: string; style?: unknown; value?: string; children?: HostNode[] };
|
||||
|
||||
const LONG_TITLE = "Belajar Membuat Aplikasi Android untuk Pemula";
|
||||
const NOWRAP_STYLESHEET = `@version 1;\ntemplate-part[name="item-header-row"] { flex-wrap: nowrap; }`;
|
||||
|
||||
const mergedStyle = (node: HostNode): Record<string, unknown> =>
|
||||
Object.assign({}, ...(Array.isArray(node.style) ? node.style : node.style ? [node.style] : []));
|
||||
const nodeText = (node: HostNode): string => node.value ?? (node.children ?? []).map(nodeText).join("");
|
||||
const pathTo = (node: HostNode, predicate: (candidate: HostNode) => boolean): HostNode[] | undefined => {
|
||||
if (predicate(node)) return [node];
|
||||
for (const child of node.children ?? []) {
|
||||
const path = pathTo(child, predicate);
|
||||
if (path) return [node, ...path];
|
||||
}
|
||||
};
|
||||
const flatten = (node: SemanticNode): SemanticNode[] => [node, ...node.children.flatMap(flatten)];
|
||||
|
||||
const buildFixture = (): ResumeData => {
|
||||
const data = structuredClone(defaultResumeData);
|
||||
data.picture.hidden = true;
|
||||
data.sections.certifications.items = [
|
||||
{
|
||||
id: "certification/1",
|
||||
hidden: false,
|
||||
title: LONG_TITLE,
|
||||
issuer: "Dicoding",
|
||||
date: "05 Sep 2023",
|
||||
website: { url: "", label: "", inlineLink: false },
|
||||
description: "",
|
||||
},
|
||||
];
|
||||
data.sections.experience.items = [
|
||||
{
|
||||
id: "experience/1",
|
||||
hidden: false,
|
||||
company: "Braincore",
|
||||
position: "Business Process Automation Engineer",
|
||||
location: "Jakarta, Indonesia",
|
||||
period: "Jan 2024 - Mar 2025",
|
||||
website: { url: "", label: "", inlineLink: false },
|
||||
description: "",
|
||||
roles: [],
|
||||
},
|
||||
];
|
||||
const page = data.metadata.layout.pages[0];
|
||||
if (!page) throw new Error("Missing authored page");
|
||||
page.main = ["certifications", "experience"];
|
||||
page.sidebar = [];
|
||||
|
||||
return data;
|
||||
};
|
||||
|
||||
const renderTitleRowStyles = async (template: Template, stylesheet?: string) => {
|
||||
const data = buildFixture();
|
||||
const semanticRuntime = stylesheet
|
||||
? resolveResumeRuntime({ data, template, mode: "semantic", source: { languageVersion: 1, text: stylesheet } })
|
||||
: undefined;
|
||||
const element = createElement(ResumeDocument, { data, template, semanticRuntime }) as unknown as Parameters<
|
||||
typeof pdf
|
||||
>[0];
|
||||
const instance = pdf(element);
|
||||
await expect.poll(() => instance.container.document).not.toBeNull();
|
||||
const document = instance.container.document as unknown as HostNode;
|
||||
const path = pathTo(document, (node) => nodeText(node).trim() === LONG_TITLE);
|
||||
if (!path) throw new Error("Missing certification title in the rendered document");
|
||||
const row = path.at(-2);
|
||||
const title = path.at(-1);
|
||||
if (!row || !title) throw new Error("Missing the row wrapping the certification title");
|
||||
|
||||
return { row: mergedStyle(row), title: mergedStyle(title) };
|
||||
};
|
||||
|
||||
describe("item-header-row template part", () => {
|
||||
it("wraps the certification title and date, leaving the issuer outside", () => {
|
||||
const data = buildFixture();
|
||||
const page = data.metadata.layout.pages[0];
|
||||
if (!page) throw new Error("Missing authored page");
|
||||
const tree = buildSemanticTree({ data, template: "onyx", page, pageNumber: 1, showHeader: true });
|
||||
const itemHeader = flatten(tree).find((node) => node.kind === "item-header");
|
||||
if (!itemHeader) throw new Error("Missing item header");
|
||||
|
||||
expect(itemHeader.children.map((child) => [child.kind, child.attributes.name])).toEqual([
|
||||
["template-part", "item-header-row"],
|
||||
["field", "issuer"],
|
||||
]);
|
||||
const [row] = itemHeader.children;
|
||||
expect(row?.children.map((child) => child.attributes.name)).toEqual(["title", "date"]);
|
||||
});
|
||||
|
||||
it("is not routed into the stacked experience header", () => {
|
||||
const data = buildFixture();
|
||||
const page = data.metadata.layout.pages[0];
|
||||
if (!page) throw new Error("Missing authored page");
|
||||
const tree = buildSemanticTree({ data, template: "onyx", page, pageNumber: 1, showHeader: true });
|
||||
const experience = flatten(tree).find((node) => node.kind === "section" && node.attributes.type === "experience");
|
||||
if (!experience) throw new Error("Missing experience section");
|
||||
|
||||
expect(flatten(experience).filter((node) => node.attributes.name === "item-header-row")).toEqual([]);
|
||||
});
|
||||
|
||||
// The row ships with `flex-wrap: wrap`, which drops a long title's date onto its own line. This
|
||||
// is the whole point of exposing the part, so assert the override reaches the rendered row.
|
||||
it.each(["onyx", "ditgar", "meowth"] as const)("lets %s stylesheets turn off the row wrap", async (template) => {
|
||||
expect((await renderTitleRowStyles(template)).row).toMatchObject({ flexWrap: "wrap" });
|
||||
expect((await renderTitleRowStyles(template, NOWRAP_STYLESHEET)).row).toMatchObject({ flexWrap: "nowrap" });
|
||||
});
|
||||
|
||||
// React PDF reuses the line layout a Text was first measured with, so a title Yoga shrinks after
|
||||
// that measurement draws its glyphs over the date. Under `nowrap` the title takes a zero flex
|
||||
// basis instead, which makes its first measurement its final width.
|
||||
it("gives the title a zero flex basis only when the row stops wrapping", async () => {
|
||||
expect((await renderTitleRowStyles("onyx")).title).not.toMatchObject({ flexBasis: 0 });
|
||||
expect((await renderTitleRowStyles("onyx", NOWRAP_STYLESHEET)).title).toMatchObject({
|
||||
flexBasis: 0,
|
||||
flexGrow: 1,
|
||||
});
|
||||
});
|
||||
|
||||
it("reports no diagnostics for the selector", () => {
|
||||
const data = buildFixture();
|
||||
const page = data.metadata.layout.pages[0];
|
||||
if (!page) throw new Error("Missing authored page");
|
||||
const tree = buildSemanticTree({ data, template: "onyx", page, pageNumber: 1, showHeader: true });
|
||||
const compiled = compileStylesheet({ languageVersion: 1, text: NOWRAP_STYLESHEET });
|
||||
if (!compiled.program) throw new Error("Stylesheet failed to compile");
|
||||
|
||||
expect(compiled.diagnostics).toEqual([]);
|
||||
expect(analyzeStylesheet(compiled.program, tree)).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,39 @@
|
||||
import type { TemplateSemanticPrimitivePart } from "./template-manifest";
|
||||
|
||||
/**
|
||||
* Sections whose item header is a single title/date row rendered by the shared split-row layout.
|
||||
*
|
||||
* Experience, education and volunteer are deliberately excluded: they render two stacked rows, and
|
||||
* on templates with the `inlineItemHeader` feature their header is owned by the
|
||||
* `inline-item-header-*` parts instead, which would compete for the same fields.
|
||||
*/
|
||||
const ITEM_HEADER_ROW_SECTION_TYPES = ["awards", "certifications", "projects", "publications"] as const;
|
||||
|
||||
/**
|
||||
* Exposes the split row inside a section item header so a stylesheet can address it.
|
||||
*
|
||||
* The row carries `flex-wrap: wrap`, so a long title pushes the trailing date onto its own line.
|
||||
* Without this part the row is anonymous — `item-header` selects the box around it, not the row —
|
||||
* leaving no way to write `flex-wrap: nowrap`. Shared by every template because the row comes from
|
||||
* the shared section components rather than from any one template.
|
||||
*/
|
||||
/** Part key chain passed to `SemanticTemplatePartView`; must match `itemHeaderRowPart.key`. */
|
||||
export const ITEM_HEADER_ROW_PART_KEYS = ["item-header-row"] as const;
|
||||
|
||||
export const itemHeaderRowPart = {
|
||||
name: "item-header-row",
|
||||
key: "item-header-row",
|
||||
owner: { kind: "item-header", key: "item-header", sectionTypes: ITEM_HEADER_ROW_SECTION_TYPES },
|
||||
binding: { type: "primitive", primitive: "View", source: "existing" },
|
||||
route: {
|
||||
parent: "owner",
|
||||
at: "start",
|
||||
take: [
|
||||
{ kind: "field", name: "title", sectionTypes: ["awards", "certifications", "publications"] },
|
||||
{ kind: "field", name: "date", sectionTypes: ["awards", "certifications", "publications"] },
|
||||
{ kind: "field", name: "name", sectionTypes: ["projects"] },
|
||||
{ kind: "field", name: "period", sectionTypes: ["projects"] },
|
||||
{ kind: "link", sectionTypes: ITEM_HEADER_ROW_SECTION_TYPES },
|
||||
],
|
||||
},
|
||||
} as const satisfies TemplateSemanticPrimitivePart;
|
||||
@@ -14,8 +14,32 @@ import {
|
||||
} from "./template-manifest";
|
||||
import { buildSemanticTree } from "./tree";
|
||||
|
||||
const EXPECTED_ITEM_HEADER_ROW = {
|
||||
"item-header-row": {
|
||||
key: "item-header-row",
|
||||
owner: {
|
||||
kind: "item-header",
|
||||
key: "item-header",
|
||||
sectionTypes: ["awards", "certifications", "projects", "publications"],
|
||||
},
|
||||
binding: { type: "primitive", primitive: "View", source: "existing" },
|
||||
route: {
|
||||
parent: "owner",
|
||||
at: "start",
|
||||
take: [
|
||||
{ kind: "field", name: "title", sectionTypes: ["awards", "certifications", "publications"] },
|
||||
{ kind: "field", name: "date", sectionTypes: ["awards", "certifications", "publications"] },
|
||||
{ kind: "field", name: "name", sectionTypes: ["projects"] },
|
||||
{ kind: "field", name: "period", sectionTypes: ["projects"] },
|
||||
{ kind: "link", sectionTypes: ["awards", "certifications", "projects", "publications"] },
|
||||
],
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
const EXPECTED_PARTS = {
|
||||
azurill: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"timeline-line": {
|
||||
key: "timeline-line",
|
||||
owner: { kind: "section-items", key: "section-items", placement: "main", columns: 1 },
|
||||
@@ -42,6 +66,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
bronzor: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"interleaved-section-row": {
|
||||
key: "interleaved-section-row",
|
||||
owner: { kind: "section", key: "section", placement: "main" },
|
||||
@@ -49,6 +74,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
chikorita: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"contact-row-primary": {
|
||||
key: "contact-row-primary",
|
||||
owner: { kind: "contact-list", key: "contact-list" },
|
||||
@@ -78,6 +104,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
ditgar: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"featured-summary": {
|
||||
key: "featured-summary",
|
||||
owner: { kind: "region", key: "featured" },
|
||||
@@ -113,6 +140,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
ditto: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"header-band": {
|
||||
key: "header-band",
|
||||
owner: { kind: "header", key: "header" },
|
||||
@@ -137,6 +165,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
gengar: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"featured-summary": {
|
||||
key: "featured-summary",
|
||||
owner: { kind: "region", key: "featured" },
|
||||
@@ -150,6 +179,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
glalie: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"sidebar-background": {
|
||||
key: "sidebar-background",
|
||||
owner: { kind: "region", key: "sidebar" },
|
||||
@@ -157,9 +187,10 @@ const EXPECTED_PARTS = {
|
||||
route: { parent: "owner", at: "start" },
|
||||
},
|
||||
},
|
||||
kakuna: {},
|
||||
lapras: {},
|
||||
kakuna: { ...EXPECTED_ITEM_HEADER_ROW },
|
||||
lapras: { ...EXPECTED_ITEM_HEADER_ROW },
|
||||
leafish: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"header-intro": {
|
||||
key: "header-intro",
|
||||
owner: { kind: "header", key: "header" },
|
||||
@@ -184,6 +215,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
meowth: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"inline-item-header-leading": {
|
||||
key: "inline-item-header-leading",
|
||||
owner: {
|
||||
@@ -247,8 +279,9 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
onyx: {},
|
||||
onyx: { ...EXPECTED_ITEM_HEADER_ROW },
|
||||
pikachu: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"header-divider": {
|
||||
key: "header-divider",
|
||||
owner: { kind: "header", key: "header" },
|
||||
@@ -257,6 +290,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
rhyhorn: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"contact-item-content": {
|
||||
key: "contact-item-content",
|
||||
owner: { kind: "contact-item", key: "contact-item" },
|
||||
@@ -274,6 +308,7 @@ const EXPECTED_PARTS = {
|
||||
},
|
||||
},
|
||||
scizor: {
|
||||
...EXPECTED_ITEM_HEADER_ROW,
|
||||
"header-name-rule": {
|
||||
key: "header-name-rule",
|
||||
owner: { kind: "header", key: "header" },
|
||||
@@ -456,6 +491,16 @@ const buildFixture = (): ResumeData => {
|
||||
roles: [],
|
||||
},
|
||||
];
|
||||
data.sections.projects.items = [
|
||||
{
|
||||
id: "projects/1",
|
||||
hidden: false,
|
||||
name: "Analytical Engine",
|
||||
period: "1843",
|
||||
website: { url: "https://project.example.com", label: "Project", inlineLink: true },
|
||||
description: "<p>Wrote the first program.</p>",
|
||||
},
|
||||
];
|
||||
data.sections.skills.items = [
|
||||
{
|
||||
id: "skills/1",
|
||||
@@ -474,7 +519,7 @@ const buildFixture = (): ResumeData => {
|
||||
|
||||
const buildFixtureTree = (template: Template, showHeader = true): SemanticNode => {
|
||||
const data = buildFixture();
|
||||
const page = { fullWidth: false, main: ["summary", "experience"], sidebar: ["skills"] };
|
||||
const page = { fullWidth: false, main: ["summary", "experience", "projects"], sidebar: ["skills"] };
|
||||
|
||||
return buildSemanticTree({ data, template, page, pageNumber: 1, showHeader });
|
||||
};
|
||||
@@ -555,7 +600,7 @@ describe("template semantic manifests", () => {
|
||||
|
||||
(unknownRegionPlacement.regions[0] as { placement: string }).placement = "footer";
|
||||
(unknownHeaderPlacement.header as { placement: string }).placement = "footer";
|
||||
const alias = ownerLie.parts[0]?.binding;
|
||||
const alias = ownerLie.parts.find((part) => part.name === "interleaved-section-row")?.binding;
|
||||
if (alias?.type !== "alias") throw new Error("Missing Bronzor alias fixture");
|
||||
(alias as { canonicalKind: string }).canonicalKind = "item";
|
||||
const primitive = synthetic.parts[0]?.binding;
|
||||
@@ -606,7 +651,7 @@ describe("template semantic manifests", () => {
|
||||
token: "contact-item-content",
|
||||
};
|
||||
delete (content as unknown as { route?: object }).route;
|
||||
const row = aliasToPrimitive.parts[0];
|
||||
const row = aliasToPrimitive.parts.find((part) => part.name === "interleaved-section-row");
|
||||
if (!row) throw new Error("Missing Bronzor row");
|
||||
(row as unknown as { binding: object; route?: object }).binding = {
|
||||
type: "primitive",
|
||||
@@ -766,9 +811,20 @@ describe("template semantic manifests", () => {
|
||||
description: "",
|
||||
},
|
||||
];
|
||||
data.sections.awards.items = [
|
||||
{
|
||||
id: "award/coverage",
|
||||
hidden: false,
|
||||
title: "Order of Merit",
|
||||
awarder: "Royal Society",
|
||||
date: "1844",
|
||||
website: { url: "", label: "", inlineLink: false },
|
||||
description: "",
|
||||
},
|
||||
];
|
||||
const page = {
|
||||
fullWidth: false,
|
||||
main: ["summary", "experience", "education", "volunteer", "skills"],
|
||||
main: ["summary", "experience", "education", "volunteer", "projects", "awards", "skills"],
|
||||
sidebar: [],
|
||||
};
|
||||
const partNames = new Set<string>();
|
||||
@@ -803,6 +859,7 @@ describe("template semantic manifests", () => {
|
||||
"inline-item-header-leading",
|
||||
"inline-item-header-middle",
|
||||
"inline-item-header-trailing",
|
||||
"item-header-row",
|
||||
"picture-anchor",
|
||||
"sidebar-background",
|
||||
"timeline-content",
|
||||
@@ -836,6 +893,8 @@ describe("template semantic manifests", () => {
|
||||
"inline-item-header-middle:field",
|
||||
"inline-item-header-middle:link",
|
||||
"inline-item-header-trailing:field",
|
||||
"item-header-row:field",
|
||||
"item-header-row:link",
|
||||
"picture-anchor:picture",
|
||||
"timeline-content:field",
|
||||
"timeline-content:item",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const azurillSemanticManifest = {
|
||||
template: "azurill",
|
||||
@@ -10,6 +11,7 @@ export const azurillSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "timeline-line",
|
||||
key: "timeline-line",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const bronzorSemanticManifest = {
|
||||
template: "bronzor",
|
||||
@@ -9,6 +10,7 @@ export const bronzorSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "interleaved-section-row",
|
||||
key: "interleaved-section-row",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const chikoritaSemanticManifest = {
|
||||
template: "chikorita",
|
||||
@@ -10,6 +11,7 @@ export const chikoritaSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "contact-row-primary",
|
||||
key: "contact-row-primary",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
const borderedItemHeaderSectionTypes = [
|
||||
"profiles",
|
||||
@@ -26,6 +27,7 @@ export const ditgarSemanticManifest = {
|
||||
header: { region: "header", placement: "sidebar" },
|
||||
specialSummary: { region: "featured", placement: "main", source: "main-with-header" },
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "featured-summary",
|
||||
key: "featured-summary",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const dittoSemanticManifest = {
|
||||
template: "ditto",
|
||||
@@ -10,6 +11,7 @@ export const dittoSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "header-band",
|
||||
key: "header-band",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const gengarSemanticManifest = {
|
||||
template: "gengar",
|
||||
@@ -11,6 +12,7 @@ export const gengarSemanticManifest = {
|
||||
header: { region: "header", placement: "sidebar" },
|
||||
specialSummary: { region: "featured", placement: "main", source: "main-with-header" },
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "featured-summary",
|
||||
key: "featured-summary",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const glalieSemanticManifest = {
|
||||
template: "glalie",
|
||||
@@ -10,6 +11,7 @@ export const glalieSemanticManifest = {
|
||||
header: { region: "header", placement: "sidebar" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "sidebar-background",
|
||||
key: "sidebar-background",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const kakunaSemanticManifest = {
|
||||
template: "kakuna",
|
||||
@@ -9,5 +10,5 @@ export const kakunaSemanticManifest = {
|
||||
],
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [],
|
||||
parts: [itemHeaderRowPart],
|
||||
} as const satisfies TemplateSemanticManifest;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const laprasSemanticManifest = {
|
||||
template: "lapras",
|
||||
@@ -9,5 +10,5 @@ export const laprasSemanticManifest = {
|
||||
],
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [],
|
||||
parts: [itemHeaderRowPart],
|
||||
} as const satisfies TemplateSemanticManifest;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const leafishSemanticManifest = {
|
||||
template: "leafish",
|
||||
@@ -10,6 +11,7 @@ export const leafishSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: { region: "header", placement: "main", source: "always" },
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "header-intro",
|
||||
key: "header-intro",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
const inlineHeaderSectionTypes = ["experience", "education", "volunteer"] as const;
|
||||
|
||||
@@ -12,6 +13,7 @@ export const meowthSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "inline-item-header-leading",
|
||||
key: "inline-item-header-leading",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const onyxSemanticManifest = {
|
||||
template: "onyx",
|
||||
@@ -9,5 +10,5 @@ export const onyxSemanticManifest = {
|
||||
],
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [],
|
||||
parts: [itemHeaderRowPart],
|
||||
} as const satisfies TemplateSemanticManifest;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const pikachuSemanticManifest = {
|
||||
template: "pikachu",
|
||||
@@ -10,6 +11,7 @@ export const pikachuSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "header-divider",
|
||||
key: "header-divider",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const rhyhornSemanticManifest = {
|
||||
template: "rhyhorn",
|
||||
@@ -10,6 +11,7 @@ export const rhyhornSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "contact-item-content",
|
||||
key: "contact-item-content",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { TemplateSemanticManifest } from "../../semantic/template-manifest";
|
||||
import { itemHeaderRowPart } from "../../semantic/shared-parts";
|
||||
|
||||
export const scizorSemanticManifest = {
|
||||
template: "scizor",
|
||||
@@ -9,6 +10,7 @@ export const scizorSemanticManifest = {
|
||||
header: { region: "header", placement: "main" },
|
||||
specialSummary: null,
|
||||
parts: [
|
||||
itemHeaderRowPart,
|
||||
{
|
||||
name: "header-name-rule",
|
||||
key: "header-name-rule",
|
||||
|
||||
@@ -17,9 +17,8 @@ describe("ExperienceSection", () => {
|
||||
describe("ItemTitle", () => {
|
||||
it("renders award titles without the bold style", () => {
|
||||
expect(source).toContain("const ItemTitle = ({ children, website, field, bold = true }: ItemTitleProps)");
|
||||
expect(source).toContain(
|
||||
"const title = bold ? <Bold semanticField={field}>{children}</Bold> : <Text semanticField={field}>{children}</Text>;",
|
||||
);
|
||||
expect(source).toContain("const title = bold ? (\n\t\t<Bold style={style} semanticField={field}>");
|
||||
expect(source).toContain("\t) : (\n\t\t<Text style={style} semanticField={field}>");
|
||||
expect(source).toContain('<ItemTitle field="title" website={item.website} bold={false}>');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -42,6 +42,7 @@ import {
|
||||
useSemanticSectionNodeKey,
|
||||
} from "../../semantic/context";
|
||||
import { semanticNodeKeys } from "../../semantic/node-keys";
|
||||
import { ITEM_HEADER_ROW_PART_KEYS } from "../../semantic/shared-parts";
|
||||
import { getSectionItemRows, getSectionItemsLayout, shouldUseSectionTimeline } from "./columns";
|
||||
import { getWebsiteDisplayText } from "./contact";
|
||||
import {
|
||||
@@ -74,7 +75,7 @@ import { createRtlStyleHelpers } from "./rtl";
|
||||
import { getInlineItemWebsiteUrl, shouldRenderSeparateItemWebsite } from "./section-links";
|
||||
import { hasSplitRowText } from "./split-row";
|
||||
import { getSectionStyleRuleContext } from "./style-rules";
|
||||
import { composeStyles } from "./styles";
|
||||
import { composeStyles, mergeStyles } from "./styles";
|
||||
|
||||
type SectionItemsContextValue = {
|
||||
itemStyle: StyleInput;
|
||||
@@ -612,6 +613,46 @@ const useSectionSplitRowStyle = () => {
|
||||
);
|
||||
};
|
||||
|
||||
type ItemHeaderRowProps = {
|
||||
children: ReactNode;
|
||||
style: StyleInput;
|
||||
};
|
||||
|
||||
/**
|
||||
* React PDF lays a `Text` out once, at the width it is first measured at, and reuses those lines
|
||||
* afterwards. `flex-wrap: nowrap` asks Yoga to shrink the title so the date fits beside it, and the
|
||||
* cached lines keep the wider layout, so the title's glyphs run over the date. A zero flex basis
|
||||
* makes the title's first measurement its final width, so it wraps inside its own box instead.
|
||||
*/
|
||||
const nowrapItemTitleStyle = { flexGrow: 1, flexBasis: 0 } satisfies Style;
|
||||
const wrappingItemTitleStyle = {} satisfies Style;
|
||||
|
||||
/** True while rendering inside an item header row a stylesheet turned into a single line. */
|
||||
const ItemHeaderRowNowrapContext = createContext(false);
|
||||
|
||||
/**
|
||||
* The title/date row inside a section item header, exposed to Semantic CSS as
|
||||
* `template-part[name="item-header-row"]`.
|
||||
*
|
||||
* It has to be addressable on its own: the row carries `flex-wrap: wrap`, so a long title pushes
|
||||
* the trailing date onto its own line, and `item-header` selects the box around the row rather than
|
||||
* the row itself. The owning item-header key comes from the surrounding provider.
|
||||
*/
|
||||
const ItemHeaderRow = ({ children, style }: ItemHeaderRowProps) => {
|
||||
const ownerNodeKey = useSemanticNodeKey();
|
||||
const resolved = useResolvedNode(semanticTemplatePartNodeKey(ownerNodeKey, ...ITEM_HEADER_ROW_PART_KEYS));
|
||||
// Same order the rendered row composes in, so a template that ships `nowrap` counts too.
|
||||
const { flexWrap } = mergeStyles(style, resolved.style);
|
||||
|
||||
return (
|
||||
<SemanticTemplatePartView partKeys={ITEM_HEADER_ROW_PART_KEYS} style={composeStyles(style)}>
|
||||
<ItemHeaderRowNowrapContext.Provider value={flexWrap === "nowrap"}>
|
||||
{children}
|
||||
</ItemHeaderRowNowrapContext.Provider>
|
||||
</SemanticTemplatePartView>
|
||||
);
|
||||
};
|
||||
|
||||
const SectionItemHeader = ({ children }: SectionItemHeaderProps) => {
|
||||
const itemNodeKey = useSemanticNodeKey();
|
||||
const itemHeaderNodeKey = itemNodeKey ? semanticNodeKeys.itemHeader(itemNodeKey) : undefined;
|
||||
@@ -667,12 +708,21 @@ const SectionItemHeader = ({ children }: SectionItemHeaderProps) => {
|
||||
|
||||
const ItemTitle = ({ children, website, field, bold = true }: ItemTitleProps) => {
|
||||
const inlineWebsiteUrl = getInlineItemWebsiteUrl(website);
|
||||
const title = bold ? <Bold semanticField={field}>{children}</Bold> : <Text semanticField={field}>{children}</Text>;
|
||||
const style = use(ItemHeaderRowNowrapContext) ? nowrapItemTitleStyle : wrappingItemTitleStyle;
|
||||
const title = bold ? (
|
||||
<Bold style={style} semanticField={field}>
|
||||
{children}
|
||||
</Bold>
|
||||
) : (
|
||||
<Text style={style} semanticField={field}>
|
||||
{children}
|
||||
</Text>
|
||||
);
|
||||
|
||||
if (!inlineWebsiteUrl) return title;
|
||||
|
||||
return (
|
||||
<Link semanticRole="inline-website" src={inlineWebsiteUrl}>
|
||||
<Link style={style} semanticRole="inline-website" src={inlineWebsiteUrl}>
|
||||
{title}
|
||||
</Link>
|
||||
);
|
||||
@@ -1109,14 +1159,14 @@ const ProjectsSection = ({ sectionId = "projects", sectionData }: ItemSectionPro
|
||||
{items.map((item) => (
|
||||
<SectionItem key={item.id} itemId={item.id}>
|
||||
<SectionItemHeader>
|
||||
<View style={composeStyles(splitRowStyle)}>
|
||||
<ItemHeaderRow style={composeStyles(splitRowStyle)}>
|
||||
<ItemTitle field="name" website={item.website}>
|
||||
{item.name}
|
||||
</ItemTitle>
|
||||
<Text semanticField="period" style={composeStyles(alignEndStyle)}>
|
||||
{item.period}
|
||||
</Text>
|
||||
</View>
|
||||
</ItemHeaderRow>
|
||||
</SectionItemHeader>
|
||||
|
||||
<RichText semanticField="description">{item.description}</RichText>
|
||||
@@ -1232,14 +1282,14 @@ const AwardsSection = ({ sectionId = "awards", sectionData }: ItemSectionProps<A
|
||||
{items.map((item) => (
|
||||
<SectionItem key={item.id} itemId={item.id}>
|
||||
<SectionItemHeader>
|
||||
<View style={composeStyles(splitRowStyle, awardTitleDateRowStyle)}>
|
||||
<ItemHeaderRow style={composeStyles(splitRowStyle, awardTitleDateRowStyle)}>
|
||||
<ItemTitle field="title" website={item.website} bold={false}>
|
||||
{item.title}
|
||||
</ItemTitle>
|
||||
<Text semanticField="date" style={composeStyles(alignEndStyle)}>
|
||||
{item.date}
|
||||
</Text>
|
||||
</View>
|
||||
</ItemHeaderRow>
|
||||
<Text semanticField="awarder">{item.awarder}</Text>
|
||||
</SectionItemHeader>
|
||||
<RichText semanticField="description">{item.description}</RichText>
|
||||
@@ -1270,14 +1320,14 @@ const CertificationsSection = ({
|
||||
{items.map((item) => (
|
||||
<SectionItem key={item.id} itemId={item.id}>
|
||||
<SectionItemHeader>
|
||||
<View style={composeStyles(splitRowStyle)}>
|
||||
<ItemHeaderRow style={composeStyles(splitRowStyle)}>
|
||||
<ItemTitle field="title" website={item.website}>
|
||||
{item.title}
|
||||
</ItemTitle>
|
||||
<Text semanticField="date" style={composeStyles(alignEndStyle)}>
|
||||
{item.date}
|
||||
</Text>
|
||||
</View>
|
||||
</ItemHeaderRow>
|
||||
<Text semanticField="issuer">{item.issuer}</Text>
|
||||
</SectionItemHeader>
|
||||
|
||||
@@ -1306,14 +1356,14 @@ const PublicationsSection = ({ sectionId = "publications", sectionData }: ItemSe
|
||||
{items.map((item) => (
|
||||
<SectionItem key={item.id} itemId={item.id}>
|
||||
<SectionItemHeader>
|
||||
<View style={composeStyles(splitRowStyle)}>
|
||||
<ItemHeaderRow style={composeStyles(splitRowStyle)}>
|
||||
<ItemTitle field="title" website={item.website}>
|
||||
{item.title}
|
||||
</ItemTitle>
|
||||
<Text semanticField="date" style={composeStyles(alignEndStyle)}>
|
||||
{item.date}
|
||||
</Text>
|
||||
</View>
|
||||
</ItemHeaderRow>
|
||||
|
||||
<Text semanticField="publisher">{item.publisher}</Text>
|
||||
</SectionItemHeader>
|
||||
|
||||
@@ -86,6 +86,7 @@ const expectedTemplatePartChildren = {
|
||||
"header-intro": ["template-part"],
|
||||
"header-body": ["picture", "name", "headline", "section"],
|
||||
"header-contact-band": ["contact-list"],
|
||||
"item-header-row": ["field", "link"],
|
||||
"inline-item-header-leading": ["field", "combined-text"],
|
||||
"inline-item-header-middle": ["field", "link"],
|
||||
"inline-item-header-trailing": ["field"],
|
||||
|
||||
@@ -193,6 +193,7 @@ const templatePartChildKinds = {
|
||||
"header-intro": ["template-part"],
|
||||
"header-body": ["picture", "name", "headline", "section"],
|
||||
"header-contact-band": ["contact-list"],
|
||||
"item-header-row": ["field", "link"],
|
||||
"inline-item-header-leading": ["field", "combined-text"],
|
||||
"inline-item-header-middle": ["field", "link"],
|
||||
"inline-item-header-trailing": ["field"],
|
||||
|
||||
Generated
+470
-674
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user