@anja.codes/create-vitakit 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -2
  3. package/deployments.mjs +178 -0
  4. package/index.mjs +99 -0
  5. package/package.json +40 -4
  6. package/scaffold.mjs +124 -0
  7. package/template/.gitignore.template +19 -0
  8. package/template/_forgejo/workflows/codeberg.yml +37 -0
  9. package/template/_forgejo/workflows/deploy.yml +31 -0
  10. package/template/_github/workflows/cloudflare.yml +33 -0
  11. package/template/_github/workflows/cv.yml +36 -0
  12. package/template/_github/workflows/deploy.yml +53 -0
  13. package/template/_github/workflows/workers.yml +39 -0
  14. package/template/app/app.vue +5 -0
  15. package/template/app/assets/css/main.css +129 -0
  16. package/template/app/layouts/default.vue +39 -0
  17. package/template/app/pages/[...slug].vue +30 -0
  18. package/template/app/pages/cv.vue +34 -0
  19. package/template/app/pages/index.vue +62 -0
  20. package/template/app/pages/publications.vue +27 -0
  21. package/template/content/education.yml +18 -0
  22. package/template/content/employment.yml +18 -0
  23. package/template/content/pages/cv.md +9 -0
  24. package/template/content/pages/index.md +11 -0
  25. package/template/content/pages/publications.md +8 -0
  26. package/template/content/pages/research.md +32 -0
  27. package/template/content/profile.yml +33 -0
  28. package/template/content/publications.bib +43 -0
  29. package/template/content/supervision.yml +12 -0
  30. package/template/content/talks.yml +17 -0
  31. package/template/content/teaching.yml +17 -0
  32. package/template/cv-tex/cv.tex +39 -0
  33. package/template/cv-tex/cv.yml +7 -0
  34. package/template/cv-tex/latexmkrc +5 -0
  35. package/template/cv-tex/preamble.tex +7 -0
  36. package/template/cv-tex/prose/research-statement.tex +17 -0
  37. package/template/gitlab-ci.yml.template +28 -0
  38. package/template/nuxt.config.ts +32 -0
  39. package/template/package.json.template +33 -0
  40. package/template/public/img/portrait.svg +6 -0
  41. package/template/public/img/tree.svg +10 -0
  42. package/template/tsconfig.json +9 -0
  43. package/template/wrangler.json.template +10 -0
@@ -0,0 +1,17 @@
1
+ - date: 2025
2
+ title: Analytic Combinatorics
3
+ role: Lecturer
4
+ term: 2025S
5
+ institution: University of Graz
6
+
7
+ - date: 2024
8
+ title: Discrete Mathematics
9
+ role: Lecturer
10
+ term: 2024W
11
+ institution: University of Graz
12
+
13
+ - date: 2023
14
+ title: Calculus I
15
+ role: Teaching Assistant
16
+ term: 2023W
17
+ institution: University of Klagenfurt
@@ -0,0 +1,39 @@
1
+ % Your CV. This file decides the ORDER of things and their headings; cv.yml
2
+ % decides what goes in. app/pages/cv.vue does the same for the website.
3
+ %
4
+ % Styling: redefine the macros in preamble.tex. For deeper changes run
5
+ % pnpm vitakit eject vitakit-cv.cls
6
+ % which copies the document class into cv-tex/, where it is yours to edit and
7
+ % takes precedence. Do not edit the copy in cv-tex/generated/ -- every build
8
+ % overwrites it.
9
+ %
10
+ % A variant (say, for one application) is just a copy of this file:
11
+ % cp cv-tex/cv.tex cv-tex/application-xyz.tex and change \vitadocument below.
12
+ \documentclass{vitakit-cv}
13
+ \vitadocument{cv}
14
+
15
+ % The class already loads biblatex; just point it at your .bib file.
16
+ \addbibresource{../content/publications.bib}
17
+
18
+ \input{preamble.tex}
19
+ \vitainput{profile}
20
+
21
+ \begin{document}
22
+ \vitaheader
23
+
24
+ % Prose (cover letters, statements) lives in cv-tex/prose/ as plain LaTeX and
25
+ % is included with \input, not \vitasection -- \vitasection is only for
26
+ % sections vitakit generates from content/.
27
+ % \input{prose/research-statement.tex}
28
+
29
+ \vitasection[Employment]{employment}
30
+ \vitasection[Education]{education}
31
+ \vitasection[Teaching]{teaching}
32
+
33
+ \section{Publications}
34
+ \vitainput{publications}
35
+
36
+ \vitasection[Supervised theses]{supervision}
37
+ \vitasection[Selected talks]{talks}
38
+
39
+ \end{document}
@@ -0,0 +1,7 @@
1
+ # Selection for this document. Order lives in cv.tex.
2
+ visibility: cv # include entries marked public and cv, not private
3
+
4
+ sections:
5
+ talks:
6
+ where: { kind: invited }
7
+ limit: 10
@@ -0,0 +1,5 @@
1
+ # Lets a plain `latexmk cv.tex` (in CI, or from an editor) find the document
2
+ # class, which `pnpm pdf` writes to generated/<document>/. A copy in this
3
+ # directory (`pnpm vitakit eject vitakit-cv.cls`) still wins: `.` comes first.
4
+ # The trailing separator keeps TeX's default search path.
5
+ $ENV{'TEXINPUTS'} = join($search_path_separator, '.', './generated//', $ENV{'TEXINPUTS'} // '');
@@ -0,0 +1,7 @@
1
+ % Your styling lives here. The generated files only use the macros from
2
+ % vitakit-cv.cls, so redefining them changes the design without touching
3
+ % anything vitakit produces.
4
+
5
+ % Headings are written where a section is included, \vitasection[Talks]{talks}.
6
+ % For one wording shared by every document that includes this preamble:
7
+ % \vitasectiontitle{talks}{Selected talks}
@@ -0,0 +1,17 @@
1
+ % Prose for your CV and applications: plain LaTeX, written by you.
2
+ %
3
+ % Files in this directory are never read by the website build, which makes them
4
+ % the right place for a cover letter, a research or teaching statement, or
5
+ % anything else that should not end up online.
6
+ %
7
+ % Include one wherever you want it in a document:
8
+ %
9
+ % \input{prose/research-statement.tex}
10
+ %
11
+ % (\vitasection is only for sections vitakit generates from content/.)
12
+
13
+ \section{Research statement}
14
+
15
+ Replace this text. Because it is ordinary LaTeX, anything you would normally
16
+ write works here --- environments, figures, citations such as
17
+ \cite{example-published}, and mathematics like $\zeta(s) = \sum_{n \ge 1} n^{-s}$.
@@ -0,0 +1,28 @@
1
+ # Builds and checks the site, then publishes only the static output.
2
+ # Requires GitLab 17.10+ with Pages and a Docker-compatible CI runner enabled.
3
+ # Private source projects are supported; set Pages access to Everyone for a
4
+ # public website (Settings -> General -> Visibility, project features, permissions).
5
+ # For a root-level custom domain, set NUXT_APP_BASE_URL=/ in CI/CD variables.
6
+ image: node:22-bookworm
7
+
8
+ stages: [deploy]
9
+
10
+ deploy-pages:
11
+ stage: deploy
12
+ before_script:
13
+ - corepack enable
14
+ - corepack install
15
+ - pnpm install --frozen-lockfile
16
+ script:
17
+ # CI_PAGES_URL handles unique domains, project paths and subgroup paths.
18
+ # An explicit CI/CD variable can override it for a custom domain.
19
+ - |
20
+ if [ -z "${NUXT_APP_BASE_URL:-}" ]; then
21
+ NUXT_APP_BASE_URL="$(node -e 'const path = new URL(process.env.CI_PAGES_URL).pathname; process.stdout.write(path.endsWith("/") ? path : path + "/")')"
22
+ export NUXT_APP_BASE_URL
23
+ fi
24
+ - pnpm check
25
+ pages:
26
+ publish: .output/public
27
+ rules:
28
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
@@ -0,0 +1,32 @@
1
+ import tailwindcss from '@tailwindcss/vite'
2
+
3
+ const baseURL = process.env.NUXT_APP_BASE_URL || '/'
4
+ if (!baseURL.startsWith('/') || !baseURL.endsWith('/') || baseURL.includes('//')) {
5
+ throw new Error('NUXT_APP_BASE_URL must be a path with leading and trailing slashes, e.g. /my-site/')
6
+ }
7
+
8
+ export default defineNuxtConfig({
9
+ compatibilityDate: '2026-09-06',
10
+ devtools: { enabled: false },
11
+
12
+ modules: ['@nuxt/fonts', '@anja.codes/vitakit/nuxt'],
13
+
14
+ // Formulas are rendered at build time; vitakit adds the matching KaTeX
15
+ // stylesheet itself, so no KaTeX is installed here.
16
+ css: ['~/assets/css/main.css'],
17
+
18
+ vite: { plugins: [tailwindcss()] },
19
+
20
+ app: {
21
+ baseURL,
22
+ head: { htmlAttrs: { lang: 'en' } },
23
+ },
24
+
25
+ nitro: {
26
+ prerender: {
27
+ failOnError: true,
28
+ // Routes come from vitakit, so an unlinked page is still generated.
29
+ crawlLinks: false,
30
+ },
31
+ },
32
+ })
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "__SLUG__",
3
+ "private": true,
4
+ "type": "module",
5
+ "packageManager": "pnpm@10.29.1",
6
+ "engines": {
7
+ "node": ">=22.18"
8
+ },
9
+ "scripts": {
10
+ "dev": "nuxt dev",
11
+ "generate": "nuxt generate",
12
+ "preview": "nuxt preview",
13
+ "postinstall": "nuxt prepare",
14
+ "typecheck": "nuxt typecheck",
15
+ "check": "pnpm typecheck && pnpm generate && vitakit verify",
16
+ "pdf": "vitakit pdf"
17
+ },
18
+ "dependencies": {
19
+ "@anja.codes/vitakit": "^0.2.0",
20
+ "@nuxt/fonts": "^0.14.0",
21
+ "@tailwindcss/vite": "^4.3.3",
22
+ "nuxt": "^4.5.2",
23
+ "tailwindcss": "^4.3.3",
24
+ "vue": "^3.5.43",
25
+ "vue-router": "^5.3.1"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^26.6.2",
29
+ "typescript": "^5.9.3",
30
+ "vue-tsc": "^3.3.11",
31
+ "zod": "^4.6.5"
32
+ }
33
+ }
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128" role="img" aria-label="Placeholder portrait">
2
+ <rect width="128" height="128" fill="#e2e8f0"/>
3
+ <circle cx="64" cy="50" r="23" fill="#94a3b8"/>
4
+ <path d="M20 128c0-27 20-44 44-44s44 17 44 44z" fill="#94a3b8"/>
5
+ <text x="64" y="120" font-family="system-ui, sans-serif" font-size="9" fill="#475569" text-anchor="middle">replace me</text>
6
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 140" width="240" height="140">
2
+ <g stroke="#475569" stroke-width="2" fill="none">
3
+ <path d="M120 130 V100 M120 100 L80 70 M120 100 L160 70 M80 70 L60 40 M80 70 L100 40 M160 70 L150 40 M150 40 L140 15 M150 40 L165 15"/>
4
+ </g>
5
+ <g fill="#1d4ed8">
6
+ <circle cx="120" cy="100" r="4"/><circle cx="80" cy="70" r="4"/><circle cx="160" cy="70" r="4"/>
7
+ <circle cx="60" cy="40" r="4"/><circle cx="100" cy="40" r="4"/><circle cx="150" cy="40" r="4"/>
8
+ <circle cx="140" cy="15" r="4"/><circle cx="165" cy="15" r="4"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,9 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./.nuxt/tsconfig.app.json" },
5
+ { "path": "./.nuxt/tsconfig.server.json" },
6
+ { "path": "./.nuxt/tsconfig.shared.json" },
7
+ { "path": "./.nuxt/tsconfig.node.json" }
8
+ ]
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "__SLUG__",
3
+ "compatibility_date": "2026-10-18",
4
+ "workers_dev": true,
5
+ "assets": {
6
+ "directory": "./.output/public",
7
+ "html_handling": "auto-trailing-slash",
8
+ "not_found_handling": "404-page"
9
+ }
10
+ }