Compare commits
12 Commits
eff9aa55cf
...
main
Author | SHA1 | Date | |
---|---|---|---|
ce54138492 | |||
eb40610536 | |||
dac81fc223 | |||
460617e424 | |||
590a372417 | |||
6b21292003 | |||
89a75c94ca | |||
7e4b13606c | |||
2250721be3 | |||
e22584b600 | |||
758df7627a | |||
738f5a348a |
2
.omni.yaml
Normal file
2
.omni.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
up:
|
||||
- just
|
12
Justfile
Normal file
12
Justfile
Normal file
@@ -0,0 +1,12 @@
|
||||
set shell := ["zsh", "-c"]
|
||||
|
||||
deploy:
|
||||
vercel pull --yes --environment=production
|
||||
vercel --prod --yes
|
||||
|
||||
preview:
|
||||
vercel pull --yes --environment=preview
|
||||
vercel --yes
|
||||
|
||||
dev:
|
||||
yarn dev
|
14
README.md
14
README.md
@@ -73,3 +73,17 @@ bun run preview
|
||||
```
|
||||
|
||||
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
||||
|
||||
## Favicons
|
||||
|
||||
The SVG favicon is the source of truth: `public/favicon.svg`.
|
||||
|
||||
Generate a multi-size `favicon.ico` from the SVG using rsvg-convert + ImageMagick:
|
||||
|
||||
```bash
|
||||
yarn favicons
|
||||
```
|
||||
|
||||
Notes:
|
||||
- ImageMagick on macOS can have issues loading arbitrary TTFs by file path (RenderFreetype errors). To avoid font lookup issues entirely, this project rasterizes the SVG directly using `rsvg-convert` and then packages the sizes into a single ICO using ImageMagick.
|
||||
- If browsers fail to load webfonts in an external SVG, consider converting the “b” glyph to paths inside the SVG to guarantee pixel-identical rendering across formats.
|
||||
|
@@ -1,8 +1,15 @@
|
||||
<template>
|
||||
<div>
|
||||
<NuxtRouteAnnouncer />
|
||||
<Analytics />
|
||||
<SpeedInsights />
|
||||
<NuxtLayout>
|
||||
<NuxtPage />
|
||||
</NuxtLayout>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Analytics } from '@vercel/analytics/nuxt'
|
||||
import { SpeedInsights } from '@vercel/speed-insights/nuxt'
|
||||
</script>
|
||||
|
@@ -1,5 +1,7 @@
|
||||
/* Match brosner.com font */
|
||||
@import url("@fontsource-variable/roboto-slab/index.css");
|
||||
@import url("@fontsource/noto-sans-hebrew/400.css");
|
||||
@import url("@fontsource/noto-sans-hebrew/600.css");
|
||||
html, body {
|
||||
font-family: "Roboto Slab Variable", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
font-optical-sizing: auto;
|
||||
@@ -10,4 +12,12 @@ html, body {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.hebrew, :lang(he) {
|
||||
font-family: "Noto Sans Hebrew", system-ui, sans-serif;
|
||||
}
|
||||
:lang(he) {
|
||||
direction: rtl;
|
||||
unicode-bidi: isolate;
|
||||
}
|
||||
|
||||
|
||||
|
2070
app/assets/fonts/RobotoSlab-Bold.ttf
Normal file
2070
app/assets/fonts/RobotoSlab-Bold.ttf
Normal file
File diff suppressed because one or more lines are too long
9
app/components/Heb.vue
Normal file
9
app/components/Heb.vue
Normal file
@@ -0,0 +1,9 @@
|
||||
<template>
|
||||
<span class="hebrew" lang="he" dir="rtl"><slot /></span>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// no-op
|
||||
</script>
|
||||
|
||||
|
@@ -35,7 +35,7 @@
|
||||
<footer class="footer">
|
||||
<div class="content is-small has-text-centered">
|
||||
<p>
|
||||
Site built with <a href="https://nuxt.com" target="_blank">Nuxt</a> and <a href="https://bulma.io" target="_blank">Bulma</a>. Hosted on <a href="https://firebase.google.com" target="_blank">Firebase</a>.
|
||||
Site built with <a href="https://nuxt.com" target="_blank">Nuxt</a> and <a href="https://bulma.io" target="_blank">Bulma</a>. Hosted on <a href="https://vercel.com" target="_blank">Vercel</a>.
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
@@ -29,6 +29,45 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section" id="learning">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-two-thirds content is-large">
|
||||
<h2>Learning</h2>
|
||||
<p>These are some topics I am actively exploring:</p>
|
||||
|
||||
<h3 class="title is-4">Aviation</h3>
|
||||
<p>I learn aviation through flight sims—mostly MSFS 2020 (X‑Plane nostalgia is real). I’m drawn to airliners; the A350 and 757 are my favorites.</p>
|
||||
|
||||
<h3 class="title is-4">Israel</h3>
|
||||
<p>I visited Israel for the first time in December 2024. I’m reconnecting with my family’s Jewish roots, and I left with a deep appreciation for the country and its people.</p>
|
||||
|
||||
<h3 class="title is-4">Hebrew</h3>
|
||||
<p><Heb>אני לומד עברית</Heb></p>
|
||||
<p>I’d love to be fluent. I’m a little embarrassed that most of my study is Duolingo right now—but it keeps me consistent—and I lean on <a href="https://www.pealim.com/">Pealim</a> for vocab and verbs.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section" id="projects">
|
||||
<div class="container">
|
||||
<div class="columns">
|
||||
<div class="column is-two-thirds content is-large">
|
||||
<h2>Projects</h2>
|
||||
<h3 class="title is-4">Project Name</h3>
|
||||
<p>Short description of what it is, why it exists, and your role.</p>
|
||||
|
||||
<h3 class="title is-4">Project Name</h3>
|
||||
<p>Short description of what it is, why it exists, and your role.</p>
|
||||
|
||||
<h3 class="title is-4">Project Name</h3>
|
||||
<p>Short description of what it is, why it exists, and your role.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@@ -9,7 +9,10 @@ export default defineNuxtConfig({
|
||||
},
|
||||
app: {
|
||||
head: {
|
||||
link: []
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
|
||||
{ rel: 'alternate icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||
]
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@@ -7,10 +7,14 @@
|
||||
"dev": "nuxt dev",
|
||||
"generate": "nuxt generate",
|
||||
"preview": "nuxt preview",
|
||||
"favicons": "bash tools/generate-favicon.sh",
|
||||
"postinstall": "nuxt prepare"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fontsource-variable/roboto-slab": "^5.2.6",
|
||||
"@fontsource/noto-sans-hebrew": "^5.2.6",
|
||||
"@vercel/analytics": "^1.5.0",
|
||||
"@vercel/speed-insights": "^1.2.0",
|
||||
"bulma": "^1.0.4",
|
||||
"nuxt": "^4.0.3",
|
||||
"typescript": "^5.6.3",
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 31 KiB |
17
public/favicon.svg
Normal file
17
public/favicon.svg
Normal file
@@ -0,0 +1,17 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
||||
<defs>
|
||||
<style>
|
||||
.bg { fill: #111111; }
|
||||
.txt {
|
||||
fill: #ffffff;
|
||||
font-family: "Roboto Slab Variable", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 88px;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<rect class="bg" x="0" y="0" width="128" height="128" rx="24" ry="24" />
|
||||
<text class="txt" x="50%" y="50%" dominant-baseline="central" text-anchor="middle">b</text>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 499 B |
40
tools/generate-favicon.sh
Executable file
40
tools/generate-favicon.sh
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Generates a multi-size favicon.ico from public/favicon.svg
|
||||
# Dependencies:
|
||||
# - rsvg-convert (from librsvg)
|
||||
# - ImageMagick (magick)
|
||||
# macOS install:
|
||||
# brew install librsvg imagemagick
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
SVG_PATH="${ROOT_DIR}/public/favicon.svg"
|
||||
OUT_ICO_PATH="${ROOT_DIR}/public/favicon.ico"
|
||||
|
||||
if ! command -v rsvg-convert >/dev/null 2>&1; then
|
||||
echo "ERROR: rsvg-convert not found. Install with: brew install librsvg" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! command -v magick >/dev/null 2>&1; then
|
||||
echo "ERROR: ImageMagick (magick) not found. Install with: brew install imagemagick" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tmp_dir="$(mktemp -d)"
|
||||
cleanup() { rm -rf "${tmp_dir}"; }
|
||||
trap cleanup EXIT
|
||||
|
||||
sizes=(16 32 48 64)
|
||||
pngs=()
|
||||
for s in "${sizes[@]}"; do
|
||||
out_png="${tmp_dir}/favicon-${s}.png"
|
||||
rsvg-convert -w "${s}" -h "${s}" "${SVG_PATH}" -o "${out_png}"
|
||||
pngs+=("${out_png}")
|
||||
done
|
||||
|
||||
magick "${pngs[@]}" "${OUT_ICO_PATH}"
|
||||
echo "Generated ${OUT_ICO_PATH}"
|
||||
|
||||
|
Reference in New Issue
Block a user