diff --git a/docs/blog/abstract-algebra-modules/index.html b/docs/blog/abstract-algebra-modules/index.html index 8bfbbcc..cdf119c 100644 --- a/docs/blog/abstract-algebra-modules/index.html +++ b/docs/blog/abstract-algebra-modules/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

Abstract Algebra: Modules

\providecommand{\FF}{\mathbb{F}} +Published
\providecommand{\FF}{\mathbb{F}} \providecommand{\ZZ}{\mathbb{Z}} \providecommand{\NN}{\mathbb{N}} \providecommand{\End}{\mathrm{End}} @@ -200,4 +200,4 @@

\ No newline at end of file +Generated January 9, 2025

\ No newline at end of file diff --git a/docs/blog/dnd-character-tokens/index.html b/docs/blog/dnd-character-tokens/index.html index d640f01..05216b7 100644 --- a/docs/blog/dnd-character-tokens/index.html +++ b/docs/blog/dnd-character-tokens/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

Character Tokens for D&D

My weekly D&D group has been playing more often at bars, without room for map grids or minis. I designed a compact set of tokens to help combat run smoothly with limited table space!

+Published

My weekly D&D group has been playing more often at bars, without room for map grids or minis. I designed a compact set of tokens to help combat run smoothly with limited table space!

  • The tokens are multi-colored with bright white labels, to be as readable as possible from a distance in dim bar lighting.
  • Each token has “bright” and “dark” sides, which can be used as a binary indicator of low hitpoints or any other condition relevant to the encounter.
  • @@ -34,4 +34,4 @@

\ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/blog/dnd-condition-cards/index.html b/docs/blog/dnd-condition-cards/index.html index 214954f..fd249ff 100644 --- a/docs/blog/dnd-condition-cards/index.html +++ b/docs/blog/dnd-condition-cards/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

"Print and Play" Condition Cards for D&D

In my weekly D&D group, I play a Paladin who often casts support spells like Bless and Aid to buff allies in combat. It’s not always easy to remember which effects are active at any given time, so I created a custom deck of condition cards to help keep track!

+Published

In my weekly D&D group, I play a Paladin who often casts support spells like Bless and Aid to buff allies in combat. It’s not always easy to remember which effects are active at any given time, so I created a custom deck of condition cards to help keep track!

I designed the cards with Inkscape and used Typst to create a print-and-cut template to aid with assembly. After several weeks of experimentation with different materials, I succeeded in creating a deck of cards flexible enough to riffle shuffle like real playing cards!

Designing a Parametric Cutting Template with Typst

@@ -83,4 +83,4 @@

Done!

\ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/blog/index.html b/docs/blog/index.html index 90e7dc0..ca5bc6d 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -1,82 +1,82 @@ Blog Posts / Benjamin R. Bray

Blog Posts

  • GitHub
  • Resume
  • \ No newline at end of file +Generated January 9, 2025
    \ No newline at end of file diff --git a/docs/blog/rust-wasm/index.html b/docs/blog/rust-wasm/index.html index 7b30e27..bd2e350 100644 --- a/docs/blog/rust-wasm/index.html +++ b/docs/blog/rust-wasm/index.html @@ -6,16 +6,16 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Minimal Example of Rust‑Wasm with WebGL and specs

    Rust-Wasm Example!

    +Published

    Rust-Wasm Example!

    The following demo is implemented in Rust and compiled to WASM using wasm-bindgen. WebGL rendering is achieved with glow. Uses the specs entity-component-system library for managing game state. Longer writeup coming soon!

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/favorites/index.html b/docs/favorites/index.html index 693c81a..7326fac 100644 --- a/docs/favorites/index.html +++ b/docs/favorites/index.html @@ -150,4 +150,4 @@

    neal.fun by Neal

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index b0e0c50..ed7359f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,5 +1,5 @@ Home / Benjamin R. Bray @@ -110,7 +110,7 @@ top: -2em; } } -

    Selected Projects

    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    An open-source Markdown editor with bidirectional links and excellent math support!
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor with research on 19th-century German literature.
    I used linear algebra to give my high school robotics team a competitive edge! Since robots compete in teams of three, an individual's contribution to the final score cannot be known. By scraping public match data and solving a linear system, I estimated an offensive power rating for each robot, which my team used to predict match outcomes and choose alliances.
    A collection of Flash games I published to the Newgrounds game portal as a teenager.

    Selected Posts

    \ No newline at end of file diff --git a/docs/projects/aask/index.html b/docs/projects/aask/index.html index 7ce5e38..99dec90 100644 --- a/docs/projects/aask/index.html +++ b/docs/projects/aask/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    AdamBots Automated Scouting Kit

    Borscht Music Organizer

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/projects/dhgp/index.html b/docs/projects/dhgp/index.html index cbe1749..9712ccd 100644 --- a/docs/projects/dhgp/index.html +++ b/docs/projects/dhgp/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Digital Humanities & German Periodicals

    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor (Dr. Peter McIsaac, University of Michigan) with his research on 19th-century German literature. The application allowed him to run statistical topic models (LDA, HDP, DTM, etc.) on a large corpus of text and displayed helpful visualizations of the results. The application was built using Python / Flask / Bootstrap and also supported toponym detection and full-text search. We used gensim for topic modeling.

    +Published

    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor (Dr. Peter McIsaac, University of Michigan) with his research on 19th-century German literature. The application allowed him to run statistical topic models (LDA, HDP, DTM, etc.) on a large corpus of text and displayed helpful visualizations of the results. The application was built using Python / Flask / Bootstrap and also supported toponym detection and full-text search. We used gensim for topic modeling.

    Using the web application I built, my supervisor was able study cultural and historical trends in a large corpus of previously unstudied documents. The results of this work were published in humanities journals and conferences, including [0] and [1].

    McIsaac, Peter M.. Rethinking Nonfiction: Distant Reading the Nineteenth-Century Science-Literature Divide. In Distant Readings: Topologies of German Culture in the Long Nineteenth Century. Edited by Erlin, Matt,; and Tatlock, Lynne. Boydell & Brewer. Edition NED. 2014. Accessed 2024-07-11
    McIsaac, Peter; Jamin, Sugih; Ibanez, Ines; Singer, Oskar; and Bray, Benjamin. Die Geowissenschaftliche Analyse von großen Mengen historischer Texte: Die Visualisierung geographischer Verhältnisse in deutschen Familienzeitschriften. In 3. Tagung des Verbands Digital Humanities im deutschsprachigen Raum, DHd 2016, Leipzig, Germany, March 7 - 12, 2016. Edited by Burr, Elisabeth; and Helling, Patrick. 2016
    @@ -111,4 +111,4 @@

    Bibliography
    [0]
    McIsaac, Peter M.. Rethinking Nonfiction: Distant Reading the Nineteenth-Century Science-Literature Divide. In Distant Readings: Topologies of German Culture in the Long Nineteenth Century. Edited by Erlin, Matt,; and Tatlock, Lynne. Boydell & Brewer. Edition NED. 2014. Accessed 2024-07-11
    [1]
    McIsaac, Peter; Jamin, Sugih; Ibanez, Ines; Singer, Oskar; and Bray, Benjamin. Die Geowissenschaftliche Analyse von großen Mengen historischer Texte: Die Visualisierung geographischer Verhältnisse in deutschen Familienzeitschriften. In 3. Tagung des Verbands Digital Humanities im deutschsprachigen Raum, DHd 2016, Leipzig, Germany, March 7 - 12, 2016. Edited by Burr, Elisabeth; and Helling, Patrick. 2016
    [4]
    [5]
    Blei, David M; Ng, Andrew Y; and Jordan, Michael I. Latent dirichlet allocation. In Journal of machine Learning research (Vol. 3, 993-1022). 2003
    [6]
    Hoffman, Matthew; Bach, Francis; and Blei, David. Online learning for latent dirichlet allocation. In advances in neural information processing systems (Vol. 23). 2010
    [7]
    Wang, Chong; Paisley, John; and Blei, David M. Online variational inference for the hierarchical Dirichlet process. In Proceedings of the fourteenth international conference on artificial intelligence and statistics, 752-760. JMLR Workshop, Conference Proceedings. 2011
    [8]
    Blei, David M; and Lafferty, John D. Dynamic topic models. In Proceedings of the 23rd international conference on Machine learning, 113-120. 2006

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/projects/flash-games/index.html b/docs/projects/flash-games/index.html index cd2df37..5602e3d 100644 --- a/docs/projects/flash-games/index.html +++ b/docs/projects/flash-games/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Windows Doors (2009)

    Windows Doors
    The classic Windows simulation game!
    @@ -54,4 +54,4 @@

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/projects/index.html b/docs/projects/index.html index 33e5d04..41cc49c 100644 --- a/docs/projects/index.html +++ b/docs/projects/index.html @@ -1,64 +1,64 @@ Projects / Benjamin R. Bray

    Projects

    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
  • GitHub
  • Resume
  • Projects

    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    Yagi is a toy functional language for understanding dependent type theory.
    Yagi is a toy functional language for understanding dependent type theory.
    A command line tool to help organize my own music library, written in Haskell. Helps the user fill in missing music metadata by querying Discogs and MusicBrainz for matching tracks.
    A command line tool to help organize my own music library, written in Haskell. Helps the user fill in missing music metadata by querying Discogs and MusicBrainz for matching tracks.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    An open-source Markdown editor with bidirectional links and excellent math support!
    An open-source Markdown editor with bidirectional links and excellent math support!
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    Generate a boggle board containing your custom list of words!
    Generate a boggle board containing your custom list of words!
    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor with research on 19th-century German literature.
    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor with research on 19th-century German literature.
    I used linear algebra to give my high school robotics team a competitive edge! Since robots compete in teams of three, an individual's contribution to the final score cannot be known. By scraping public match data and solving a linear system, I estimated an offensive power rating for each robot, which my team used to predict match outcomes and choose alliances.
    I used linear algebra to give my high school robotics team a competitive edge! Since robots compete in teams of three, an individual's contribution to the final score cannot be known. By scraping public match data and solving a linear system, I estimated an offensive power rating for each robot, which my team used to predict match outcomes and choose alliances.
    A collection of Flash games I published to the Newgrounds game portal as a teenager.
    A collection of Flash games I published to the Newgrounds game portal as a teenager.
    \ No newline at end of file +Generated January 9, 2025
    \ No newline at end of file diff --git a/docs/projects/noteworthy/index.html b/docs/projects/noteworthy/index.html index 7edc813..c816af7 100644 --- a/docs/projects/noteworthy/index.html +++ b/docs/projects/noteworthy/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Noteworthy

    A free, open-source, local-first Markdown editor built with ProseMirror.

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/projects/type-safari/index.html b/docs/projects/type-safari/index.html index 5ea7315..622d48d 100644 --- a/docs/projects/type-safari/index.html +++ b/docs/projects/type-safari/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Type Safari

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/projects/unboggler/index.html b/docs/projects/unboggler/index.html index ec16f08..93e3b21 100644 --- a/docs/projects/unboggler/index.html +++ b/docs/projects/unboggler/index.html @@ -6,14 +6,14 @@ .admonition{--admonition-color-bg: rgb(218, 248, 255);--admonition-color-fg: rgb(35, 173, 204);--admonition-color-text: var(--font-normal-color)}.admonition{padding:var(--gap-0);background-color:var(--admonition-color-bg);border:1px dotted var(--admonition-color-fg);border-radius:.2em;color:var(--admonition-color-text)} .todo-block{padding:1em;background:repeating-linear-gradient(45deg,#f9f7ff,#f9f7ff 10px,#eee9ff 10px 20px);border:2px solid #d8ccff} .post-preview[data-astro-cid-drrcoycf]{margin:var(--gap-0) 0} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .preview-link[data-astro-cid-gaprsfch]{display:block;color:unset;text-decoration:unset}.preview-box[data-astro-cid-gaprsfch]{margin:var(--gap-1) 0;padding:var(--gap-1);border-radius:var(--gap-0);background-color:#f6f6f6;border:1px dashed #ccc}.preview-box[data-astro-cid-gaprsfch]:hover{background-color:#eee}.preview-title[data-astro-cid-gaprsfch]{font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-decoration:2px limegreen underline}.preview-title[data-astro-cid-gaprsfch] a[data-astro-cid-gaprsfch]{color:unset}.preview-summary[data-astro-cid-gaprsfch]{margin-top:var(--gap-0)} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Unboggler

    yagi-lang

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/resources/index.html b/docs/resources/index.html index fd571f6..77152e0 100644 --- a/docs/resources/index.html +++ b/docs/resources/index.html @@ -4,4 +4,4 @@
    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/resume/index.html b/docs/resume/index.html index 8fe44f9..b6a18b5 100644 --- a/docs/resume/index.html +++ b/docs/resume/index.html @@ -10,7 +10,7 @@ .resume-header[data-astro-cid-yo75cwor]{display:flex;align-items:center;margin-top:2em}.resume-header[data-astro-cid-yo75cwor] .resume-header-profile[data-astro-cid-yo75cwor]{flex-basis:14em}.resume-header[data-astro-cid-yo75cwor] .resume-header-body[data-astro-cid-yo75cwor]{flex:1}@media (max-width: 42rem){.resume-header[data-astro-cid-yo75cwor]{flex-direction:column;align-items:center}.resume-header[data-astro-cid-yo75cwor] .resume-header-profile[data-astro-cid-yo75cwor]{width:12rem}}.resume-header[data-astro-cid-yo75cwor] h1[data-astro-cid-yo75cwor].name{border:none;font-size:2em;font-weight:var(--font-bold-weight);margin:0 0 .5em;text-align:center}.resume-header[data-astro-cid-yo75cwor] .body[data-astro-cid-yo75cwor]{text-wrap:pretty}.pdf-resume-callout[data-astro-cid-yo75cwor]{padding:0 2em}.pdf-resume-button[data-astro-cid-yo75cwor]{display:block;margin:var(--gap-1) auto 0 auto;padding:.1em .3em;border:2px solid rgb(0,128,64);color:#008040;text-align:center;font-weight:600;font-size:1.6em}.pdf-resume-welcome[data-astro-cid-yo75cwor]{color:#008040;font-weight:600}.pdf-resume-button[data-astro-cid-yo75cwor]:hover{background-color:#ffa3ff} .preview-grid-cell>*{margin:0}.preview-grid-cell{display:grid} .preview-grid[data-astro-cid-p4xamgo3]{--columns: 2;display:grid;grid-template-columns:repeat(var(--columns),minmax(0,1fr));grid-auto-flow:row dense;gap:var(--gap-1);place-items:stretch;justify-content:stretch;align-content:stretch}.preview-grid-cell[data-astro-cid-p4xamgo3]{container:preview-grid / inline-size;grid-column:span var(--span)} -.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.1em .4em;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} +.post-tags[data-astro-cid-aalyhqf5]{font-family:var(--sans-font)}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5]{display:inline-block;padding:.2em .4em 0;white-space:nowrap;font-size:var(--font-size-small);border:1px solid;border-radius:.2em;line-height:1.2em}.post-tags[data-astro-cid-aalyhqf5] .tag[data-astro-cid-aalyhqf5] a[data-astro-cid-aalyhqf5]{color:unset}.post-tags[data-astro-cid-aalyhqf5] .category[data-astro-cid-aalyhqf5]{background-color:#e3e9ef;color:#254298}.post-tags[data-astro-cid-aalyhqf5] .tool[data-astro-cid-aalyhqf5]{background-color:#e3efe4;color:#006400}.post-tags[data-astro-cid-aalyhqf5] .format[data-astro-cid-aalyhqf5]{background-color:#fff;color:#666} .post-summary[data-astro-cid-b6i2um25]{padding:var(--gap-1);border-radius:.2em;border:.075rem solid #bfbfbf;background-color:#fff;--shadow-distance: .2rem;--shadow-color: #eaeaea;box-shadow:calc(-1 * var(--shadow-distance)) var(--shadow-distance) 0 0 var(--shadow-color)}@container (max-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:column;gap:var(--gap-0)}.summary-header[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{text-wrap:balance}}@container (min-width: 24rem){.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{flex-direction:row;gap:var(--gap-0)}}.summary-header[data-astro-cid-b6i2um25] .header-title[data-astro-cid-b6i2um25]{display:flex;margin-bottom:var(--gap-0);font-size:var(--font-size-large);font-weight:var(--font-title-weight);text-wrap:pretty}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25]{flex:1}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{flex:0}.header-title[data-astro-cid-b6i2um25] .title[data-astro-cid-b6i2um25] a[data-astro-cid-b6i2um25]{color:unset}.header-title[data-astro-cid-b6i2um25] .year[data-astro-cid-b6i2um25]{font-weight:var(--font-normal-weight);font-size:var(--font-size-normal);color:gray;white-space:nowrap}.summary-body[data-astro-cid-b6i2um25]:empty{display:none}.summary-body[data-astro-cid-b6i2um25]{display:flex;flex-direction:column;gap:1rem;margin-top:var(--gap-1);justify-content:space-between}.summary-body[data-astro-cid-b6i2um25] .summary[data-astro-cid-b6i2um25]{flex:1}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25]{flex-basis:40%;max-height:8em;display:flex;justify-content:center;align-items:center;overflow:hidden;border-radius:3mm}.summary-body[data-astro-cid-b6i2um25] .thumb[data-astro-cid-b6i2um25] img[data-astro-cid-b6i2um25]{display:block;min-width:100%} .demo canvas{display:block;max-width:100%;margin:0 auto}.demo canvas:focus{outline-width:thick;outline-color:green;box-shadow:0 0 10px green}

    Benjamin R. Bray

    @@ -24,7 +24,7 @@

    Noteworthy markdown editor, as well as the prosemirror-math and remark-cite packages. +
  • Tools for composing rich text documents. I created the Noteworthy markdown editor, as well as the prosemirror-math and remark-cite packages.
  • Computer graphics, simulation, and numerical methods. I originally learned to code by making Flash games, and fell in love with the unique confluence of art, math, and code involved.
  • Education

    @@ -83,7 +83,7 @@

    I created the Noteworthy WYSIWYG desktop markdown editor, tailored for personal research notes making extensive use of math and citations. Built with TypeScript and Electron.
  • I maintain the prosemirror-math and remark-cite packages on NPM.
  • -
    An open-source Markdown editor with bidirectional links and excellent math support!
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    +
    An open-source Markdown editor with bidirectional links and excellent math support!
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.

    Backend Engineering

    I worked for one year as a backend engineer at Smartpay KK, a Japanese fintech startup.

      @@ -111,7 +111,7 @@

      cats-effect made it easy to mock side-effects in our hedgehog property-based tests.

    In my free time, I enjoy experimenting with dependently-typed languages like Coq and Lean. I’d love to work on tools which make dependently-typed programming more user-friendly. I created the toy language yagi-lang to learn more about dependent type theory and language implementation:

    -
    Yagi is a toy functional language for understanding dependent type theory.
    Yagi is a toy functional language for understanding dependent type theory.

    Here are a few other related personal projects:

    -
    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    A command line tool to help organize my own music library, written in Haskell. Helps the user fill in missing music metadata by querying Discogs and MusicBrainz for matching tracks.
    +
    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    A command line tool to help organize my own music library, written in Haskell. Helps the user fill in missing music metadata by querying Discogs and MusicBrainz for matching tracks.

    Computer Graphics & Numerical Methods

    I’m comfortable with the foundations of computer graphics, including:

    +

    I have also served as a lecturer and teaching assistant for a several courses in Machine Learning at the undergraduate & graduate levels. See the teaching section below for more details.

    Open Source

    Open Source Packages

    I maintain the following npm packages:

    -
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    +
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.

    Open Source Contributions

    I’m quick to git clone open source software that I rely on. Here are a few of my contributions:

    \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/sitemap-0.xml b/docs/sitemap-0.xml index f2fb4f0..a78e8c7 100644 --- a/docs/sitemap-0.xml +++ b/docs/sitemap-0.xml @@ -1 +1 @@ -https://benrbray.com/https://benrbray.com/blog/https://benrbray.com/blog/abstract-algebra-modules/https://benrbray.com/blog/dnd-character-tokens/https://benrbray.com/blog/dnd-condition-cards/https://benrbray.com/blog/rust-wasm/https://benrbray.com/favorites/https://benrbray.com/game/particle-playground/https://benrbray.com/game/pixel-launch/https://benrbray.com/game/santas-rampage/https://benrbray.com/game/tctstc/https://benrbray.com/game/thoreau/https://benrbray.com/game/voting-minigame/https://benrbray.com/game/windows-doors/https://benrbray.com/projects/https://benrbray.com/projects/aask/https://benrbray.com/projects/borscht/https://benrbray.com/projects/dhgp/https://benrbray.com/projects/flash-games/https://benrbray.com/projects/noteworthy/https://benrbray.com/projects/prosemirror-math/https://benrbray.com/projects/remark-cite/https://benrbray.com/projects/type-safari/https://benrbray.com/projects/unboggler/https://benrbray.com/projects/yagi-lang/https://benrbray.com/resources/https://benrbray.com/resume-pdf/https://benrbray.com/resume/https://benrbray.com/sitemap/ \ No newline at end of file +https://benrbray.com/https://benrbray.com/blog/https://benrbray.com/blog/abstract-algebra-modules/https://benrbray.com/blog/dnd-character-tokens/https://benrbray.com/blog/dnd-condition-cards/https://benrbray.com/blog/rust-wasm/https://benrbray.com/favorites/https://benrbray.com/game/particle-playground/https://benrbray.com/game/pixel-launch/https://benrbray.com/game/santas-rampage/https://benrbray.com/game/tctstc/https://benrbray.com/game/thoreau/https://benrbray.com/game/voting-minigame/https://benrbray.com/game/windows-doors/https://benrbray.com/projects/https://benrbray.com/projects/aask/https://benrbray.com/projects/borscht/https://benrbray.com/projects/dhgp/https://benrbray.com/projects/flash-games/https://benrbray.com/projects/noteworthy/https://benrbray.com/projects/prosemirror-math/https://benrbray.com/projects/remark-cite/https://benrbray.com/projects/type-safari/https://benrbray.com/projects/unboggler/https://benrbray.com/projects/yagi-lang/https://benrbray.com/resources/https://benrbray.com/resume-pdf/https://benrbray.com/resume/https://benrbray.com/sitemap/https://benrbray.com/tags/crafts/https://benrbray.com/tags/electron/https://benrbray.com/tags/flash/https://benrbray.com/tags/formal-methods/https://benrbray.com/tags/frontend/https://benrbray.com/tags/games/https://benrbray.com/tags/graphics/https://benrbray.com/tags/haskell/https://benrbray.com/tags/javascript/https://benrbray.com/tags/machine-learning/https://benrbray.com/tags/math/https://benrbray.com/tags/plt/https://benrbray.com/tags/python/https://benrbray.com/tags/rpg/https://benrbray.com/tags/Rust/https://benrbray.com/tags/typescript/https://benrbray.com/tags/typst/https://benrbray.com/tags/wasm/https://benrbray.com/tags/WebGL/ \ No newline at end of file diff --git a/docs/sitemap/index.html b/docs/sitemap/index.html index a6d45bf..3421707 100644 --- a/docs/sitemap/index.html +++ b/docs/sitemap/index.html @@ -6,4 +6,4 @@ \ No newline at end of file +Generated January 9, 2025 \ No newline at end of file diff --git a/docs/tags/Rust/index.html b/docs/tags/Rust/index.html new file mode 100644 index 0000000..187d837 --- /dev/null +++ b/docs/tags/Rust/index.html @@ -0,0 +1,16 @@ + Rust / Benjamin R. Bray + +

    Posts Tagged Rust

    \ No newline at end of file diff --git a/docs/tags/WebGL/index.html b/docs/tags/WebGL/index.html new file mode 100644 index 0000000..ac8fafd --- /dev/null +++ b/docs/tags/WebGL/index.html @@ -0,0 +1,16 @@ + WebGL / Benjamin R. Bray + +

    Posts Tagged WebGL

    \ No newline at end of file diff --git a/docs/tags/crafts/index.html b/docs/tags/crafts/index.html new file mode 100644 index 0000000..c82a3d9 --- /dev/null +++ b/docs/tags/crafts/index.html @@ -0,0 +1,22 @@ + crafts / Benjamin R. Bray + +

    Posts Tagged crafts

    \ No newline at end of file diff --git a/docs/tags/electron/index.html b/docs/tags/electron/index.html new file mode 100644 index 0000000..b86a0b8 --- /dev/null +++ b/docs/tags/electron/index.html @@ -0,0 +1,16 @@ + electron / Benjamin R. Bray + +

    Posts Tagged electron

    An open-source Markdown editor with bidirectional links and excellent math support!
    \ No newline at end of file diff --git a/docs/tags/flash/index.html b/docs/tags/flash/index.html new file mode 100644 index 0000000..50fd2b5 --- /dev/null +++ b/docs/tags/flash/index.html @@ -0,0 +1,16 @@ + flash / Benjamin R. Bray + +

    Posts Tagged flash

    A collection of Flash games I published to the Newgrounds game portal as a teenager.
    \ No newline at end of file diff --git a/docs/tags/formal-methods/index.html b/docs/tags/formal-methods/index.html new file mode 100644 index 0000000..0e0382f --- /dev/null +++ b/docs/tags/formal-methods/index.html @@ -0,0 +1,16 @@ + formal-methods / Benjamin R. Bray + +

    Posts Tagged formal-methods

    Generate a boggle board containing your custom list of words!
    \ No newline at end of file diff --git a/docs/tags/frontend/index.html b/docs/tags/frontend/index.html new file mode 100644 index 0000000..aab18da --- /dev/null +++ b/docs/tags/frontend/index.html @@ -0,0 +1,40 @@ + frontend / Benjamin R. Bray + +

    Posts Tagged frontend

    I used linear algebra to give my high school robotics team a competitive edge! Since robots compete in teams of three, an individual's contribution to the final score cannot be known. By scraping public match data and solving a linear system, I estimated an offensive power rating for each robot, which my team used to predict match outcomes and choose alliances.
    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor with research on 19th-century German literature.
    An open-source Markdown editor with bidirectional links and excellent math support!
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    \ No newline at end of file diff --git a/docs/tags/games/index.html b/docs/tags/games/index.html new file mode 100644 index 0000000..e6b7b20 --- /dev/null +++ b/docs/tags/games/index.html @@ -0,0 +1,34 @@ + games / Benjamin R. Bray + +

    Posts Tagged games

    A collection of Flash games I published to the Newgrounds game portal as a teenager.
    Generate a boggle board containing your custom list of words!
    \ No newline at end of file diff --git a/docs/tags/graphics/index.html b/docs/tags/graphics/index.html new file mode 100644 index 0000000..c556f74 --- /dev/null +++ b/docs/tags/graphics/index.html @@ -0,0 +1,16 @@ + graphics / Benjamin R. Bray + +

    Posts Tagged graphics

    \ No newline at end of file diff --git a/docs/tags/haskell/index.html b/docs/tags/haskell/index.html new file mode 100644 index 0000000..80882ce --- /dev/null +++ b/docs/tags/haskell/index.html @@ -0,0 +1,28 @@ + haskell / Benjamin R. Bray + +

    Posts Tagged haskell

    A command line tool to help organize my own music library, written in Haskell. Helps the user fill in missing music metadata by querying Discogs and MusicBrainz for matching tracks.
    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    Yagi is a toy functional language for understanding dependent type theory.
    \ No newline at end of file diff --git a/docs/tags/javascript/index.html b/docs/tags/javascript/index.html new file mode 100644 index 0000000..7a49cf9 --- /dev/null +++ b/docs/tags/javascript/index.html @@ -0,0 +1,22 @@ + javascript / Benjamin R. Bray + +

    Posts Tagged javascript

    I used linear algebra to give my high school robotics team a competitive edge! Since robots compete in teams of three, an individual's contribution to the final score cannot be known. By scraping public match data and solving a linear system, I estimated an offensive power rating for each robot, which my team used to predict match outcomes and choose alliances.
    Generate a boggle board containing your custom list of words!
    \ No newline at end of file diff --git a/docs/tags/machine-learning/index.html b/docs/tags/machine-learning/index.html new file mode 100644 index 0000000..120a76c --- /dev/null +++ b/docs/tags/machine-learning/index.html @@ -0,0 +1,16 @@ + machine-learning / Benjamin R. Bray + +

    Posts Tagged machine-learning

    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor with research on 19th-century German literature.
    \ No newline at end of file diff --git a/docs/tags/math/index.html b/docs/tags/math/index.html new file mode 100644 index 0000000..571823e --- /dev/null +++ b/docs/tags/math/index.html @@ -0,0 +1,82 @@ + math / Benjamin R. Bray + +

    Posts Tagged math

    I used linear algebra to give my high school robotics team a competitive edge! Since robots compete in teams of three, an individual's contribution to the final score cannot be known. By scraping public match data and solving a linear system, I estimated an offensive power rating for each robot, which my team used to predict match outcomes and choose alliances.
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    \ No newline at end of file diff --git a/docs/tags/plt/index.html b/docs/tags/plt/index.html new file mode 100644 index 0000000..6a5d7ba --- /dev/null +++ b/docs/tags/plt/index.html @@ -0,0 +1,22 @@ + plt / Benjamin R. Bray + +

    Posts Tagged plt

    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    Yagi is a toy functional language for understanding dependent type theory.
    \ No newline at end of file diff --git a/docs/tags/python/index.html b/docs/tags/python/index.html new file mode 100644 index 0000000..dd9e8ef --- /dev/null +++ b/docs/tags/python/index.html @@ -0,0 +1,16 @@ + python / Benjamin R. Bray + +

    Posts Tagged python

    As an undergraduate research assistant, I spent three years as the primary developer for an NLP-driven web application built to assist a humanities professor with research on 19th-century German literature.
    \ No newline at end of file diff --git a/docs/tags/rpg/index.html b/docs/tags/rpg/index.html new file mode 100644 index 0000000..4275f15 --- /dev/null +++ b/docs/tags/rpg/index.html @@ -0,0 +1,22 @@ + rpg / Benjamin R. Bray + +

    Posts Tagged rpg

    \ No newline at end of file diff --git a/docs/tags/typescript/index.html b/docs/tags/typescript/index.html new file mode 100644 index 0000000..36382c4 --- /dev/null +++ b/docs/tags/typescript/index.html @@ -0,0 +1,28 @@ + typescript / Benjamin R. Bray + +

    Posts Tagged typescript

    An open-source Markdown editor with bidirectional links and excellent math support!
    Schema and plugins for writing mathematics in prosemirror, using KaTeX.
    A collection of plugins for the remark markdown processor adding support for pandoc-style inline citation syntax and bibliography formatting.
    \ No newline at end of file diff --git a/docs/tags/typst/index.html b/docs/tags/typst/index.html new file mode 100644 index 0000000..14eff54 --- /dev/null +++ b/docs/tags/typst/index.html @@ -0,0 +1,22 @@ + typst / Benjamin R. Bray + +

    Posts Tagged typst

    \ No newline at end of file diff --git a/docs/tags/wasm/index.html b/docs/tags/wasm/index.html new file mode 100644 index 0000000..26e0ed7 --- /dev/null +++ b/docs/tags/wasm/index.html @@ -0,0 +1,16 @@ + wasm / Benjamin R. Bray + +

    Posts Tagged wasm

    A collection of reference implementations of type inference algorithms, with particular emphasis on features which are necessary for practical implementations, such as error reporting.
    \ No newline at end of file diff --git a/src/components/content/PostTags.astro b/src/components/content/PostTags.astro index 067614c..bce1337 100644 --- a/src/components/content/PostTags.astro +++ b/src/components/content/PostTags.astro @@ -11,10 +11,10 @@ const { tags, tools, formats } = Astro.props; {tags.map(tag => { - return <>{tag} + return <>{tag} })} {tools.map(tool => { - return <>{tool} ; + return <>{tool} ; })} {formats.map(format => { return <>{format} ; @@ -28,7 +28,7 @@ const { tags, tools, formats } = Astro.props; .post-tags .tag { display: inline-block; - padding: 0.1em 0.4em; + padding: 0.2em 0.4em 0em 0.4em; border-radius: 0.1em; white-space: nowrap; font-size: var(--font-size-small); @@ -37,6 +37,10 @@ const { tags, tools, formats } = Astro.props; line-height: 1.2em; } +.post-tags .tag a { + color: unset; +} + .post-tags .category { background-color: #e3e9ef; color: #254298; diff --git a/src/content/pages/resume.mdx b/src/content/pages/resume.mdx index 571b914..b60d42e 100644 --- a/src/content/pages/resume.mdx +++ b/src/content/pages/resume.mdx @@ -8,7 +8,7 @@ import { getPostUrlBySlug } from "@root/util/query"; * Building reliable, reusable, and maintainable software that is enjoyable to use. * Working on **language servers**, static analysis, and type inference in order to upgrade the user experience of software engineering workflows. -* Tools for composing **rich text documents**. I created the [Noteworthy](https://github.com/benrbray/noteworthy) markdown editor, as well as the [`prosemirror-math`](/projects/prosemirror-math) and [`remark-cite`](/projects/remark-cite) packages. +* Tools for composing **rich text documents**. I created the [Noteworthy](https://github.com/benrbray/noteworthy) markdown editor, as well as the [`prosemirror-math`](https://github.com/benrbray/prosemirror-math) and [`remark-cite`](https://github.com/benrbray/remark-cite) packages. * Computer graphics, simulation, and numerical methods. I originally learned to code by [making Flash games](/projects/flash-games), and fell in love with the unique confluence of art, math, and code involved. ## Education diff --git a/src/pages/tags/[tag].astro b/src/pages/tags/[tag].astro new file mode 100644 index 0000000..0858c80 --- /dev/null +++ b/src/pages/tags/[tag].astro @@ -0,0 +1,64 @@ +--- +import { type CollectionEntry } from 'astro:content'; + +import LayoutDefault from '@layouts/LayoutDefault.astro'; +import { getBlogPosts, getProjects } from '@root/util/query'; +import ColumnNormal from '@root/layouts/ColumnNormal.astro'; +import PostPreview from '@root/components/content/PostPreview.astro'; +import type { GetStaticPaths, GetStaticPathsResult } from 'astro'; + +export const getStaticPaths = (async () => { + const blog = await getBlogPosts({ includeSeries: true }) + const projects = await getProjects(); + const posts = [...blog, ...projects]; + + // associate each tag with the list of posts it labels + const tags = new Map["slug"][]>(); + + const insertTag = (tag: string, slug: CollectionEntry<"post">["slug"]) => { + const entry = tags.get(tag); + if(entry) { + entry.push(slug) + } else { + tags.set(tag, [slug]) + } + } + + // collect all tags + posts.forEach(post => { + let postTags = [...post.data.tags||[], ...post.data.tools||[]]; + postTags.forEach(t => { + insertTag(t, post.slug) + }) + }); + + console.log(tags); + + const entries = new Array(...tags.entries()); + const paths: GetStaticPathsResult = entries.map(([tag, slugs]) => ({ + params: { tag: tag }, // url is /tags/[tag] + props: { tag, slugs }, + })); + + return paths; +}) satisfies GetStaticPaths; + +type Props = { tag: string, slugs: CollectionEntry<'post'>["slug"][] }; +console.log("----") +console.log(Astro.props); +console.log("----\n\n\n\n\n") +const { tag, slugs } = Astro.props; +--- + + + +

    Posts Tagged {`${tag}`}

    +
    + { + slugs.map((slug) => ( + + )) + } +
    +
    +
    \ No newline at end of file