diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..ae63cc6
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,6 @@
+[*.{js,ts,vue,md}]
+charset = utf-8
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+end_of_line = lf
\ No newline at end of file
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..5bd6120
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,40 @@
+name: Angel-of-Dev
+on:
+ workflow_dispatch:
+ push:
+ branches: [ bereshit ]
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - run: corepack enable
+ - uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+ # Pick your own package manager and build script
+ - run: npm install
+ - run: npx nuxt build --preset github_pages
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./.output/public
+ # Deployment job
+ deploy:
+ # Add a dependency to the build job
+ needs: build
+ # Grant GITHUB_TOKEN the permissions required to make a Pages deployment
+ permissions:
+ pages: write # to deploy to Pages
+ id-token: write # to verify the deployment originates from an appropriate source
+ # Deploy to the github_pages environment
+ environment:
+ name: github_pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ # Specify runner + deployment step
+ runs-on: ubuntu-latest
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4a7f73a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Nuxt dev/build outputs
+.output
+.data
+.nuxt
+.nitro
+.cache
+dist
+
+# Node dependencies
+node_modules
+
+# Logs
+logs
+*.log
+
+# Misc
+.DS_Store
+.fleet
+.idea
+
+# Local env files
+.env
+.env.*
+!.env.example
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..74c38c2
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "tabWidth": 4,
+ "semi": true,
+ "singleQuote": false,
+ "trailingComma": "none",
+ "vueIndentScriptAndStyle": true,
+ "singleAttributePerLine": false,
+ "printWidth": 180,
+ "proseWrap": "always",
+ "bracketSpacing": false,
+ "bracketSameLine": true,
+ "quoteProps": "consistent"
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e69de29
diff --git a/angel-of-dev.code-workspace b/angel-of-dev.code-workspace
new file mode 100644
index 0000000..876a149
--- /dev/null
+++ b/angel-of-dev.code-workspace
@@ -0,0 +1,8 @@
+{
+ "folders": [
+ {
+ "path": "."
+ }
+ ],
+ "settings": {}
+}
\ No newline at end of file
diff --git a/app.vue b/app.vue
new file mode 100644
index 0000000..aebe8a4
--- /dev/null
+++ b/app.vue
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/assets/base/css/colors.css b/assets/base/css/colors.css
new file mode 100644
index 0000000..5296487
--- /dev/null
+++ b/assets/base/css/colors.css
@@ -0,0 +1,86 @@
+@layer base {
+ /*
+ This is a complete list of colors in use.
+
+ Every key color is defined by six variables:
+ * --color- - key color itself
+ * --color--w<1-3> - key color shades moving towards white
+ * --color--b<1-3> - key color shades moving towards black
+
+ All definitions follow the same shade-order, from the lightest to the darkest.
+ Some colors have additional aliased names, for example pencils are also accessible using "HB"-naming.
+ */
+ :root {
+ --color-pencil-w3: oklch(0.66 0 90);
+ --color-pencil-w2: oklch(0.56 0 90);
+ --color-pencil-w1: oklch(0.46 0 90);
+ --color-pencil: oklch(0.36 0 90);
+ --color-pencil-b1: oklch(0.32 0 90);
+ --color-pencil-b2: oklch(0.28 0 90);
+ --color-pencil-b3: oklch(0.24 0 90);
+
+ --color-H3: var(--color-pencil-w3);
+ --color-H2: var(--color-pencil-w2);
+ --color-H1: var(--color-pencil-w1);
+ --color-HB: var(--color-pencil);
+ --color-B1: var(--color-pencil-b1);
+ --color-B2: var(--color-pencil-b2);
+ --color-B3: var(--color-pencil-b3);
+
+ --color-khaki-w3: oklch(0.92 0.046 71.531);
+ --color-khaki-w2: oklch(0.87 0.046 71.531);
+ --color-khaki-w1: oklch(0.82 0.046 71.531);
+ --color-khaki: oklch(0.77 0.046 71.531);
+ --color-khaki-b1: oklch(0.72 0.046 71.531);
+ --color-khaki-b2: oklch(0.67 0.046 71.531);
+ --color-khaki-b3: oklch(0.62 0.046 71.531);
+
+ --color-BG-w3: var(--color-khaki-w3);
+ --color-BG-w2: var(--color-khaki-w2);
+ --color-BG-w1: var(--color-khaki-w1);
+ --color-BG: var(--color-khaki);
+ --color-BG-b1: var(--color-khaki-b1);
+ --color-BG-b2: var(--color-khaki-b2);
+ --color-BG-b3: var(--color-khaki-b3);
+
+ --color-brown-w3: oklch(0.53 0.046 71.531);
+ --color-brown-w2: oklch(0.48 0.046 71.531);
+ --color-brown-w1: oklch(0.43 0.039 61);
+ --color-brown: oklch(0.38 0.039 61);
+ --color-brown-b1: oklch(0.34 0.046 71.531);
+ --color-brown-b2: oklch(0.3 0.046 71.531);
+ --color-brown-b3: oklch(0.26 0.046 71.531);
+
+ --color-red-w3: oklch(0.68 0.135 31);
+ --color-red-w2: oklch(0.58 0.135 31);
+ --color-red-w1: oklch(0.48 0.135 31);
+ --color-red: oklch(0.4 0.135 31);
+ --color-red-b1: oklch(0.35 0.135 31);
+ --color-red-b2: oklch(0.3 0.135 31);
+ --color-red-b3: oklch(0.25 0.135 31);
+
+ --color-blue-w3: oklch(0.7 0.1 250);
+ --color-blue-w2: oklch(0.6 0.1 250);
+ --color-blue-w1: oklch(0.5 0.1 250);
+ --color-blue: oklch(0.4 0.1 250);
+ --color-blue-b1: oklch(0.35 0.1 250);
+ --color-blue-b2: oklch(0.3 0.1 250);
+ --color-blue-b3: oklch(0.25 0.1 250);
+
+ --color-slate-w3: oklch(0.55 0.05 250);
+ --color-slate-w2: oklch(0.5 0.05 250);
+ --color-slate-w1: oklch(0.45 0.05 250);
+ --color-slate: oklch(0.4 0.05 250);
+ --color-slate-b1: oklch(0.35 0.05 250);
+ --color-slate-b2: oklch(0.3 0.05 250);
+ --color-slate-b3: oklch(0.25 0.05 250);
+
+ --color-yellow-w3: oklch(1 0.18 95);
+ --color-yellow-w2: oklch(0.96 0.18 95);
+ --color-yellow-w1: oklch(0.92 0.18 95);
+ --color-yellow: oklch(0.88 0.18 95);
+ --color-yellow-b1: oklch(0.84 0.18 95);
+ --color-yellow-b2: oklch(0.8 0.18 95);
+ --color-yellow-b3: oklch(0.76 0.18 95);
+ }
+}
diff --git a/assets/base/css/containers.css b/assets/base/css/containers.css
new file mode 100644
index 0000000..b06764c
--- /dev/null
+++ b/assets/base/css/containers.css
@@ -0,0 +1,8 @@
+@layer base {
+ body {
+ width: 100%;
+ background-color: var(--color-background);
+ margin: auto;
+ overflow-y: scroll;
+ }
+}
diff --git a/assets/base/css/cursors.css b/assets/base/css/cursors.css
new file mode 100644
index 0000000..814b4be
--- /dev/null
+++ b/assets/base/css/cursors.css
@@ -0,0 +1,7 @@
+@layer base {
+ @media (prefers-reduced-motion: reduce) {
+ * {
+ cursor: auto;
+ }
+ }
+}
diff --git a/assets/base/css/fonts.css b/assets/base/css/fonts.css
new file mode 100644
index 0000000..7204d4f
--- /dev/null
+++ b/assets/base/css/fonts.css
@@ -0,0 +1,88 @@
+@import url("https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700&family=Quicksand:wght@300..700&display=swap");
+@font-face {
+ font-family: "Essays 1743";
+ src: url("../fonts/Essays1743.ttf");
+ src:
+ local("Essays 1743"),
+ url("../fonts/Essays1743.ttf") format("truetype");
+ font-weight: normal;
+ font-style: normal;
+}
+
+@layer base {
+ :root {
+ --font-essays: "Essays 1743", Palatino, "Palatino Linotype", "Book Antiqua", Georgia, "Times New Roman", serif;
+ --font-quicksand: Quicksand, serif;
+ --font-fira-code: "Fira Code", monospace;
+ }
+
+ .font-fira-code-300 {
+ font-family: "Fira Code", serif;
+ font-optical-sizing: auto;
+ font-weight: 300;
+ font-style: normal;
+ }
+
+ .font-fira-code-400 {
+ font-family: "Fira Code", serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+ }
+
+ .font-fira-code-500 {
+ font-family: "Fira Code", serif;
+ font-optical-sizing: auto;
+ font-weight: 500;
+ font-style: normal;
+ }
+
+ .font-fira-code-600 {
+ font-family: "Fira Code", serif;
+ font-optical-sizing: auto;
+ font-weight: 600;
+ font-style: normal;
+ }
+
+ .font-fira-code-700 {
+ font-family: "Fira Code", serif;
+ font-optical-sizing: auto;
+ font-weight: 700;
+ font-style: normal;
+ }
+
+ .font-quicksand-300 {
+ font-family: "Quicksand", serif;
+ font-optical-sizing: auto;
+ font-weight: 300;
+ font-style: normal;
+ }
+
+ .font-quicksand-400 {
+ font-family: "Quicksand", serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+ }
+
+ .font-quicksand-500 {
+ font-family: "Quicksand", serif;
+ font-optical-sizing: auto;
+ font-weight: 500;
+ font-style: normal;
+ }
+
+ .font-quicksand-600 {
+ font-family: "Quicksand", serif;
+ font-optical-sizing: auto;
+ font-weight: 600;
+ font-style: normal;
+ }
+
+ .font-quicksand-700 {
+ font-family: "Quicksand", serif;
+ font-optical-sizing: auto;
+ font-weight: 700;
+ font-style: normal;
+ }
+}
diff --git a/assets/base/css/print.css b/assets/base/css/print.css
new file mode 100644
index 0000000..37c0964
--- /dev/null
+++ b/assets/base/css/print.css
@@ -0,0 +1,17 @@
+@media print {
+ [print-exact],
+ .print-exact {
+ -webkit-print-color-adjust: exact;
+ }
+
+ :not([print-exact]):not(.print-exact) {
+ background-color: unset;
+ }
+
+ img,
+ [print-exclude],
+ .print-exclude {
+ float: none !important;
+ display: none !important;
+ }
+}
diff --git a/assets/base/css/props.css b/assets/base/css/props.css
new file mode 100644
index 0000000..cec18a9
--- /dev/null
+++ b/assets/base/css/props.css
@@ -0,0 +1,95 @@
+@layer base {
+ :root {
+ --roundness: 0;
+ --border-style: solid;
+ --border-width-factor: 0.08;
+
+ --scrollbar-width-factor: 1;
+
+ --color-not-implemented-background: var(--color-red-w3);
+ --color-not-implemented-foreground: var(--color-yellow-w3);
+ --color-background: var(--color-khaki);
+ --color-track: var(--color-background);
+ --color-thumb: var(--color-khaki-w1);
+ --color-hover: var(--color-khaki-w2);
+ --color-prose: var(--color-pencil);
+ --color-prose-strong: var(--color-slate);
+ --color-prose-em: var(--color-brown);
+ --color-prose-h1: var(--color-red);
+ --color-prose-h2: var(--color-red);
+ --color-prose-h3: var(--color-slate);
+ --color-prose-h4: var(--color-slate);
+ --color-prose-h5: var(--color-slate);
+ --color-prose-h6: var(--color-slate);
+
+ --font-family-sans: var(--font-quicksand);
+ --font-family-serif: var(--font-quicksand);
+ --font-family-mono: var(--font-fira-code);
+
+ --weight-thin: 300;
+ --weight-normal: 400;
+ --weight-semi: 500;
+ --weight-bold: 700;
+
+ --size-factor: 1;
+ --size-minus-6: calc(8 * var(--size-factor));
+ --size-minus-5: calc(10 * var(--size-factor));
+ --size-minus-4: calc(12 * var(--size-factor));
+ --size-minus-3: calc(14 * var(--size-factor));
+ --size-minus-2: calc(16 * var(--size-factor));
+ --size-minus-1: calc(18 * var(--size-factor));
+ --size-baseline: calc(20 * var(--size-factor));
+ --size-plus-1: calc(22 * var(--size-factor));
+ --size-plus-2: calc(26 * var(--size-factor));
+ --size-plus-3: calc(30 * var(--size-factor));
+ --size-plus-4: calc(34 * var(--size-factor));
+ --size-plus-5: calc(38 * var(--size-factor));
+ --size-plus-6: calc(42 * var(--size-factor));
+
+ --size-prose-h1: var(--size-plus-6);
+ --size-prose-h2: var(--size-plus-5);
+ --size-prose-h3: var(--size-plus-4);
+ --size-prose-h4: var(--size-plus-3);
+ --size-prose-h5: var(--size-plus-2);
+ --size-prose-h6: var(--size-plus-1);
+ --size-prose-p: var(--size-baseline);
+
+ --padding-prose-header-factor: 0.2;
+ --padding-prose-hx-pair-factor: 0.05;
+ --margin-compact-content-x-factor: 0.2;
+
+ --padding-container-factor: 1;
+
+ --layout-width-min: 720;
+ --layout-width-max: 1440;
+ }
+
+ @media screen and (max-width: 740px) {
+ :root {
+ --layout-width: var(--layout-width-min);
+ --margin-compact-content-x-factor: 1;
+ }
+
+ *[maybe],
+ *.maybe {
+ float: none !important;
+ display: none !important;
+ }
+
+ /* Apply extra margin on some elements directly under root divs.
+ This is to move content away from screen-edge where it does not look great.
+ */
+ div.root div > p,
+ div.root div > ul,
+ div.root div > details {
+ margin-left: calc(1em * var(--margin-compact-content-x-factor));
+ margin-right: calc(1em * (2 * var(--margin-compact-content-x-factor)));
+ }
+ }
+
+ @media screen and (min-width: 1440px) {
+ :root {
+ --layout-width: var(--layout-width-max);
+ }
+ }
+}
diff --git a/assets/base/css/prose.css b/assets/base/css/prose.css
new file mode 100644
index 0000000..e4786ea
--- /dev/null
+++ b/assets/base/css/prose.css
@@ -0,0 +1,131 @@
+@layer base {
+ body {
+ font-size: calc(1px * var(--size-prose-p));
+ font-family: var(--font-family-serif), serif;
+ font-weight: var(--weight-normal);
+ color: var(--color-prose);
+ }
+
+ a {
+ color: inherit;
+ font-weight: var(--weight-semi);
+ text-decoration: none;
+ }
+
+ a:hover {
+ color: var(--color-red);
+ }
+
+ a[href^="#"] {
+ color: inherit;
+ text-decoration: none;
+ }
+
+ p {
+ font-size: inherit;
+ }
+
+ b {
+ color: var(--color-prose-strong);
+ font-weight: var(--weight-semi);
+ font-style: normal;
+ }
+ i {
+ color: var(--color-prose-em);
+ font-weight: var(--weight-semi);
+ font-style: normal;
+ }
+
+ strong {
+ font-weight: var(--weight-bold);
+ color: var(--color-prose-strong);
+ font-style: normal;
+ }
+ em {
+ color: var(--color-prose-em);
+ font-weight: var(--weight-bold);
+ font-style: normal;
+ }
+
+ /* NOTE: style every header individually */
+ h1 {
+ color: var(--color-prose-h1);
+ font-size: calc(1px * var(--size-prose-h1));
+ }
+ h2 {
+ color: var(--color-prose-h2);
+ font-size: calc(1px * var(--size-prose-h2));
+ }
+ h3 {
+ color: var(--color-prose-h3);
+ font-size: calc(1px * var(--size-prose-h3));
+ }
+ h4 {
+ color: var(--color-prose-h4);
+ font-size: calc(1px * var(--size-prose-h4));
+ }
+ h5 {
+ color: var(--color-prose-h5);
+ font-size: calc(1px * var(--size-prose-h5));
+ }
+ h6 {
+ color: var(--color-prose-h6);
+ font-size: calc(1px * var(--size-prose-h6));
+ }
+ /* NOTE: style all headers together */
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ text-align: center;
+ padding-top: calc(1em * var(--padding-prose-header-factor));
+ padding-bottom: calc(1em * var(--padding-prose-header-factor));
+ margin-top: 0;
+ margin-bottom: 0;
+ border-style: var(--border-style);
+ border-left-width: 0;
+ border-right-width: 0;
+ border-top-width: calc(1em * var(--border-width-factor));
+ border-bottom-width: calc(1em * var(--border-width-factor));
+ }
+ *[join-next],
+ /* :has(+ )
+ Meaning: Select element type on the left if it has next sibling of type in the bracket.
+ See: https://developer.mozilla.org/en-US/docs/Web/CSS/Next-sibling_combinator#selecting_a_previous_sibling
+ */
+ h1:has(+ h2),
+ h2:has(+ h3),
+ h3:has(+ h4),
+ h4:has(+ h5),
+ h5:has(+ h6) {
+ padding-bottom: calc(1em * var(--padding-prose-hx-pair-factor));
+ border-bottom-width: 0;
+ }
+ *[join-prev],
+ h1 + h1,
+ h2 + h2,
+ h3 + h3,
+ h4 + h4,
+ h5 + h5,
+ h6 + h6,
+ h1 + h2,
+ h2 + h3,
+ h3 + h4,
+ h4 + h5,
+ h5 + h6 {
+ padding-top: calc(1em * var(--padding-prose-hx-pair-factor));
+ border-top-width: 0;
+ }
+
+ hr {
+ display: block;
+ margin-block-start: 0.5em;
+ margin-block-end: 0.5em;
+ overflow: hidden;
+ border-color: var(--color-HB);
+ border-style: solid;
+ border-width: calc(1em * var(--border-width-factor));
+ }
+}
diff --git a/assets/base/css/scrollbars.css b/assets/base/css/scrollbars.css
new file mode 100644
index 0000000..e2a1acd
--- /dev/null
+++ b/assets/base/css/scrollbars.css
@@ -0,0 +1,18 @@
+@layer base {
+ ::-webkit-scrollbar {
+ width: calc(1em * var(--scrollbar-width-factor));
+ }
+
+ ::-webkit-scrollbar-track {
+ background: var(--color-track);
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: var(--color-thumb);
+ border-radius: var(--roundness);
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: var(--color-hover);
+ }
+}
diff --git a/assets/base/fonts/Essays1743-Bold.ttf b/assets/base/fonts/Essays1743-Bold.ttf
new file mode 100644
index 0000000..9be4f61
Binary files /dev/null and b/assets/base/fonts/Essays1743-Bold.ttf differ
diff --git a/assets/base/fonts/Essays1743.ttf b/assets/base/fonts/Essays1743.ttf
new file mode 100644
index 0000000..63cc4d8
Binary files /dev/null and b/assets/base/fonts/Essays1743.ttf differ
diff --git a/assets/base/style.css b/assets/base/style.css
new file mode 100644
index 0000000..a0f6bba
--- /dev/null
+++ b/assets/base/style.css
@@ -0,0 +1,8 @@
+@import "./css/props.css";
+@import "./css/fonts.css";
+@import "./css/cursors.css";
+@import "./css/scrollbars.css";
+@import "./css/colors.css";
+@import "./css/containers.css";
+@import "./css/prose.css";
+@import "./css/print.css";
\ No newline at end of file
diff --git a/assets/cv/card.back.pdn b/assets/cv/card.back.pdn
new file mode 100644
index 0000000..f644d6d
--- /dev/null
+++ b/assets/cv/card.back.pdn
@@ -0,0 +1,934 @@
+PDN3d