Compare commits
3 Commits
a844aa54dc
...
bc07f56c97
| Author | SHA1 | Date |
|---|---|---|
|
|
bc07f56c97 | |
|
|
2bf560f6f0 | |
|
|
568e66f7aa |
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Portfolio.Domain.Features.Portfolio
|
||||||
|
{
|
||||||
|
public class ProjectEntry
|
||||||
|
{
|
||||||
|
public string Title { get; set; }
|
||||||
|
public List<string> Descriptions { get; set; }
|
||||||
|
public List<ProjectLink> Links { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Portfolio.Domain.Features.Portfolio
|
||||||
|
{
|
||||||
|
public class ProjectLink
|
||||||
|
{
|
||||||
|
public string Type { get; set; }
|
||||||
|
public string Url { get; set; }
|
||||||
|
public string Label { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
@attribute [StreamRendering]
|
@attribute [StreamRendering]
|
||||||
@rendermode InteractiveServer
|
@rendermode InteractiveServer
|
||||||
|
|
||||||
<div>
|
<div class="pt-4">
|
||||||
@if (TemperatureDays is null || TemperatureRanges is null)
|
@if (TemperatureDays is null || TemperatureRanges is null)
|
||||||
{
|
{
|
||||||
<Loading />
|
<Loading />
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
<h3 class="text-xl font-bold mb-4">Temperature Blanket Visualizer</h3>
|
<h3 class="text-xl font-bold mb-4 mt-4">Temperature Blanket Visualizer</h3>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
@inject IJSRuntime JS
|
||||||
|
|
||||||
|
<div class="">
|
||||||
|
<button class="btn btn-sm btn-primary p-1 rounded rounded-5 align-self-start text-white " @onclick="DownloadPokemonJson">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="currentColor" class="bi bi-arrow-down-circle" viewBox="0 0 16 16">
|
||||||
|
<path fill-rule="evenodd" d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293z" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Portfolio.Domain.Features.Pokemon;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace Portfolio.WebUI.Server.Components.Component.Pokemon_Components
|
||||||
|
{
|
||||||
|
partial class PokemonDownload
|
||||||
|
{
|
||||||
|
[Parameter]
|
||||||
|
public List<Pokemon> _Pokemon { get; set; }
|
||||||
|
|
||||||
|
private List<Pokemon> pokemons = new List<Pokemon>();
|
||||||
|
|
||||||
|
|
||||||
|
protected override void OnParametersSet()
|
||||||
|
{
|
||||||
|
if (_Pokemon != null)
|
||||||
|
{
|
||||||
|
pokemons = _Pokemon.ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task DownloadPokemonJson()
|
||||||
|
{
|
||||||
|
var json = JsonSerializer.Serialize(pokemons, new JsonSerializerOptions { WriteIndented = true });
|
||||||
|
await JS.InvokeVoidAsync("downloadFileFromText", "pokemon.json", "application/json", json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
<!-- Home -->
|
<!-- Home -->
|
||||||
<button class="btn btn-primary mx-1 align-content-center" style="border-radius: 50px 15px; max-width: 60px;">
|
<button class="btn btn-primary mx-1 align-content-center" style="border-radius: 50px 15px; max-width: 60px;">
|
||||||
<NavLink href="/pokemonsleep">
|
<NavLink href="/pokemonsleep">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" class="bi bi-house-fill mb-1" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house-fill mb-1 text-white" viewBox="0 0 16 16">
|
||||||
<path d="M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L8 2.207l6.646 6.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293z" />
|
<path d="M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L8 2.207l6.646 6.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293z" />
|
||||||
<path d="m8 3.293 6 6V13.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5V9.293z" />
|
<path d="m8 3.293 6 6V13.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5V9.293z" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<!-- Pokemon Table-->
|
<!-- Pokemon Table-->
|
||||||
<button class="btn btn-info mx-1" style="border-radius: 50px 15px; max-width: 60px;">
|
<button class="btn btn-info mx-1" style="border-radius: 50px 15px; max-width: 60px;">
|
||||||
<NavLink href="/pokemon">
|
<NavLink href="/pokemon">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" class="bi bi-table mb-1" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-table mb-1 text-white" viewBox="0 0 16 16">
|
||||||
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 2h-4v3h4zm0 4h-4v3h4zm0 4h-4v3h3a1 1 0 0 0 1-1zm-5 3v-3H6v3zm-5 0v-3H1v2a1 1 0 0 0 1 1zm-4-4h4V8H1zm0-4h4V4H1zm5-3v3h4V4zm4 4H6v3h4z" />
|
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 2h-4v3h4zm0 4h-4v3h4zm0 4h-4v3h3a1 1 0 0 0 1-1zm-5 3v-3H6v3zm-5 0v-3H1v2a1 1 0 0 0 1 1zm-4-4h4V8H1zm0-4h4V4H1zm5-3v3h4V4zm4 4H6v3h4z" />
|
||||||
</svg>
|
</svg>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
<!-- Rate Pokemon -->
|
<!-- Rate Pokemon -->
|
||||||
<button class="btn btn-success mx-1" style="border-radius: 50px 15px; max-width: 60px;">
|
<button class="btn btn-success mx-1" style="border-radius: 50px 15px; max-width: 60px;">
|
||||||
<NavLink href="/rate-pokemon">
|
<NavLink href="/rate-pokemon">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" class="bi bi-award-fill mb-1" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-award-fill mb-1 text-white" viewBox="0 0 16 16">
|
||||||
<path d="m8 0 1.669.864 1.858.282.842 1.68 1.337 1.32L13.4 6l.306 1.854-1.337 1.32-.842 1.68-1.858.282L8 12l-1.669-.864-1.858-.282-.842-1.68-1.337-1.32L2.6 6l-.306-1.854 1.337-1.32.842-1.68L6.331.864z" />
|
<path d="m8 0 1.669.864 1.858.282.842 1.68 1.337 1.32L13.4 6l.306 1.854-1.337 1.32-.842 1.68-1.858.282L8 12l-1.669-.864-1.858-.282-.842-1.68-1.337-1.32L2.6 6l-.306-1.854 1.337-1.32.842-1.68L6.331.864z" />
|
||||||
<path d="M4 11.794V16l4-1 4 1v-4.206l-2.018.306L8 13.126 6.018 12.1z" />
|
<path d="M4 11.794V16l4-1 4 1v-4.206l-2.018.306L8 13.126 6.018 12.1z" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -40,11 +40,11 @@
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Add Pokemon (Wrap in Auth) -->
|
<!-- Add Pokemon (Wrap in Auth) -->
|
||||||
<button class="btn btn-warning mx-1" style="border-radius: 50px 15px; max-width: 60px;">
|
<button class="btn btn-warning mx-1 " style="border-radius: 50px 15px; max-width: 60px;">
|
||||||
<NavLink href="/pokemonsleep/add-new-pokemon">
|
<NavLink href="/pokemonsleep/add-new-pokemon">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" class="bi bi-plus-circle-fill mb-1" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-circle-fill text-white" viewBox="0 0 16 16">
|
||||||
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.5 4.5a.5.5 0 0 0-1 0v3h-3a.5.5 0 0 0 0 1h3v3a.5.5 0 0 0 1 0v-3h3a.5.5 0 0 0 0-1h-3z" />
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.5 4.5a.5.5 0 0 0-1 0v3h-3a.5.5 0 0 0 0 1h3v3a.5.5 0 0 0 1 0v-3h3a.5.5 0 0 0 0-1h-3z" />
|
||||||
</svg>
|
</svg>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,25 +5,43 @@
|
||||||
@attribute [StreamRendering]
|
@attribute [StreamRendering]
|
||||||
@rendermode InteractiveServer
|
@rendermode InteractiveServer
|
||||||
|
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
<!-- Table A: Desktop View-->
|
<!-- Table A: Desktop View-->
|
||||||
<div class="container d-none d-md-block " style="height: 70vh;">
|
<div class="container d-none d-md-block " style="height: 70vh;">
|
||||||
<!-- Main UI -->
|
<!-- Main UI -->
|
||||||
<div class="card shadow-sm border-0 mt-4 mx-auto col-12 col-md-10 col-lg-8 pokemontable">
|
<div class="border-0 mt-4 mx-auto col-12 col-md-10 col-lg-8 pokemontable ">
|
||||||
<!-- Table Header -->
|
<!-- Table Header -->
|
||||||
<div class="row card-header bg-secondary bg-gradient py-3 border-0">
|
<div class="row bg-secondary bg-gradient py-3 border-0">
|
||||||
<div class="flex-row justify-content-between">
|
<div class="d-flex align-items-center justify-content-between w-100 position-relative px-3">
|
||||||
<div class="text-center position-relative">
|
|
||||||
<input class="form-control position-absolute top-0 start-0 border-0 w-25" placeholder="Search Pokémon..." @bind="SearchTerm" @oninput="HandleSearch" />
|
|
||||||
|
|
||||||
<h2 class="text-white text-decoration-underline">Available Pokémon</h2>
|
<!-- Left: Search -->
|
||||||
<div class="m-1 badge bg-info position-absolute top-0 end-0 border-0"><p class="statText">@(pokemons.Count()) Pokémon</p></div>
|
<input class="form-control w-25 me-3"
|
||||||
|
placeholder="Search Pokémon..."
|
||||||
|
@bind="SearchTerm"
|
||||||
|
@oninput="HandleSearch" />
|
||||||
|
|
||||||
|
<!-- Center: Title -->
|
||||||
|
<h2 class="text-white text-decoration-underline mb-0 position-absolute start-50 translate-middle-x">
|
||||||
|
Available Pokémon
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<!-- Right: Count + Download -->
|
||||||
|
<div class="d-flex align-items-center gap-2">
|
||||||
|
<div class="badge bg-info">
|
||||||
|
<p class="statText mb-0">@(pokemons.Count()) Pokémon</p>
|
||||||
|
</div>
|
||||||
|
<PokemonDownload _Pokemon="pokemons" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="tableFixHead d-flex flex-column justify-content-start bg-secondary table-responsive row">
|
<div class="tableFixHead d-flex flex-column justify-content-start bg-secondary table-responsive row ">
|
||||||
<table class="table col table-borderless border-0 table-secondary table-striped align-middle">
|
<table class="table table-borderless border-0 table-secondary table-striped align-middle">
|
||||||
<!-- Table Head -->
|
<!-- Table Head -->
|
||||||
<thead class="">
|
<thead class="">
|
||||||
<tr class="">
|
<tr class="">
|
||||||
|
|
@ -33,7 +51,11 @@
|
||||||
<th class="text-white text-bg-info col-1 text-center" scope="col">Type</th>
|
<th class="text-white text-bg-info col-1 text-center" scope="col">Type</th>
|
||||||
<th class="text-white text-bg-info col-2 text-center" scope="col">Sleep Type</th>
|
<th class="text-white text-bg-info col-2 text-center" scope="col">Sleep Type</th>
|
||||||
<th class="text-white text-bg-info col-2 text-center" scope="col">Speciality</th>
|
<th class="text-white text-bg-info col-2 text-center" scope="col">Speciality</th>
|
||||||
|
@if (adminToggle)
|
||||||
|
{
|
||||||
|
<th class="text-white text-bg-info col-1 text-center" scope="col">Edit</th>
|
||||||
|
|
||||||
|
}
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<!-- If/Else Pokemon Loaded-->
|
<!-- If/Else Pokemon Loaded-->
|
||||||
|
|
@ -113,6 +135,17 @@
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
@if (adminToggle)
|
||||||
|
{
|
||||||
|
<td class="" style="">
|
||||||
|
<div class="d-flex justify-content-center">
|
||||||
|
<PokemonEditButton PokemonId="@pokemon.PokemonId" />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -131,11 +164,16 @@
|
||||||
|
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- Wrap in Auth -->
|
||||||
|
<div class="d-flex justify-content-end mt-1">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input rounded rounded-3" type="checkbox" role="switch" id="flexSwitchCheckDefault" @bind="adminToggle">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Desktop B: Mobile View -->
|
<!-- Desktop B: Mobile View -->
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
||||||
using Microsoft.JSInterop;
|
using Microsoft.JSInterop;
|
||||||
using Portfolio.Domain.Features.Pokemon;
|
using Portfolio.Domain.Features.Pokemon;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace Portfolio.WebUI.Server.Components.Component.Pokemon_Components
|
namespace Portfolio.WebUI.Server.Components.Component.Pokemon_Components
|
||||||
{
|
{
|
||||||
|
|
@ -10,9 +11,12 @@ namespace Portfolio.WebUI.Server.Components.Component.Pokemon_Components
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public List<Pokemon> AllPokemon { get; set; }
|
public List<Pokemon> AllPokemon { get; set; }
|
||||||
|
|
||||||
|
|
||||||
private List<Pokemon> pokemons = new List<Pokemon>();
|
private List<Pokemon> pokemons = new List<Pokemon>();
|
||||||
private Dictionary<int, bool> isShiny = new Dictionary<int, bool>();
|
private Dictionary<int, bool> isShiny = new Dictionary<int, bool>();
|
||||||
|
|
||||||
|
private bool adminToggle = false;
|
||||||
|
|
||||||
|
|
||||||
protected override void OnParametersSet()
|
protected override void OnParametersSet()
|
||||||
{
|
{
|
||||||
|
|
@ -92,6 +96,9 @@ namespace Portfolio.WebUI.Server.Components.Component.Pokemon_Components
|
||||||
|
|
||||||
return $"https://www.serebii.net/pokemonsleep/pokemon/type/{pokemonType.ToLower()}.png";
|
return $"https://www.serebii.net/pokemonsleep/pokemon/type/{pokemonType.ToLower()}.png";
|
||||||
}
|
}
|
||||||
|
private void HandleToggleChange(ChangeEventArgs e)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Admin Toggle is now: {adminToggle}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
<PageTitle>Crochet Tools</PageTitle>
|
<PageTitle>Crochet Tools</PageTitle>
|
||||||
|
|
||||||
|
|
||||||
<h3 class="text-xl font-bold mb-4">Crochet</h3>
|
@* <h3 class="text-xl font-bold mb-4">Crochet</h3> *@
|
||||||
<div class="">
|
<div class="">
|
||||||
<TemperatureBlanketVisualizer TemperatureDays="temperatureDays" />
|
<TemperatureBlanketVisualizer TemperatureDays="temperatureDays" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,13 @@
|
||||||
|
|
||||||
<!-- Start of Grid -->
|
<!-- Start of Grid -->
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
|
<!-- Profile Image -->
|
||||||
<div class="col-auto ">
|
<div class="col-auto ">
|
||||||
<img class="card-img rounded-3" style="width: 18em;" src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg" />
|
<img class="card-img rounded-3" style="width: 18.1em;" src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col ">
|
<div class="col ">
|
||||||
<!-- About Me-->
|
<!-- About Me-->
|
||||||
<div class="row card rounded fs-5 mb-3 p-2 ps-3 pe-3 border-0">
|
<div class="d-inline-flex row card rounded fs-5 mb-3 p-2 ps-3 pe-3 border-0">
|
||||||
I am a full-stack web developer with additional
|
I am a full-stack web developer with additional
|
||||||
experience in Data Analysis and Visualization, as well as
|
experience in Data Analysis and Visualization, as well as
|
||||||
Simulation/VR development, and AI/ML programming.
|
Simulation/VR development, and AI/ML programming.
|
||||||
|
|
@ -28,7 +29,7 @@
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- School Experience -->
|
<!-- School Experience -->
|
||||||
<div class="col ">
|
<div class="col-auto ps-0">
|
||||||
<div class="card rounded p-2 ps-3 pe-3 border border-1 border-primary">
|
<div class="card rounded p-2 ps-3 pe-3 border border-1 border-primary">
|
||||||
<p class="fs-6 fw-lighter card-subtitle p-0">September 2018 – March 2022</p>
|
<p class="fs-6 fw-lighter card-subtitle p-0">September 2018 – March 2022</p>
|
||||||
<p class="fs-5 card-title m-0">B.S. in Computer Science</p>
|
<p class="fs-5 card-title m-0">B.S. in Computer Science</p>
|
||||||
|
|
@ -37,6 +38,7 @@
|
||||||
<p class="fs-6 fw-lighter card-subtitle">Dean’s List: Fall 2020, Fall 2021</p>
|
<p class="fs-6 fw-lighter card-subtitle">Dean’s List: Fall 2020, Fall 2021</p>
|
||||||
<p class="fs-6 fw-lighter card-subtitle">Final GPA: 3.33</p>
|
<p class="fs-6 fw-lighter card-subtitle">Final GPA: 3.33</p>
|
||||||
|
|
||||||
|
@**@
|
||||||
<!-- Courses -->
|
<!-- Courses -->
|
||||||
<label class="text-decoration-underline fw-semibold">Courses</label>
|
<label class="text-decoration-underline fw-semibold">Courses</label>
|
||||||
<div class="overflow-auto" style="height: auto; max-height: 12rem">
|
<div class="overflow-auto" style="height: auto; max-height: 12rem">
|
||||||
|
|
@ -71,13 +73,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--Skills \ Languages-->
|
<!--Skills \ Languages-->
|
||||||
<div class="col ">
|
<div class="col p-0 ">
|
||||||
<div class="bg-white rounded p-2 border border-1 border-primary" >
|
<div class="bg-white rounded p-2 border border-1 border-primary" >
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<label class="text-decoration-underline fw-semibold">Skills \ Languages</label>
|
<label class="text-decoration-underline fw-semibold">Skills \ Languages</label>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="overflow-auto" style="max-height: 20rem">
|
<div class="overflow-auto" style="max-height: 20.1rem">
|
||||||
@if (skills == null)
|
@if (skills == null)
|
||||||
{
|
{
|
||||||
<div>Loading...</div>
|
<div>Loading...</div>
|
||||||
|
|
@ -96,14 +98,14 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tools -->
|
<!-- Tools -->
|
||||||
<div class="col ">
|
<div class="col pe-0">
|
||||||
<div class="bg-white rounded p-2 border border-1 border-primary">
|
<div class="bg-white rounded p-2 border border-1 border-primary">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
|
|
||||||
<label class="text-decoration-underline fw-semibold">Tools</label>
|
<label class="text-decoration-underline fw-semibold">Tools</label>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="overflow-auto" style="max-height: 20rem">
|
<div class="overflow-auto" style="max-height: 20.1rem">
|
||||||
@if (tools == null)
|
@if (tools == null)
|
||||||
{
|
{
|
||||||
<div>Loading...</div>
|
<div>Loading...</div>
|
||||||
|
|
@ -125,6 +127,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Experiences / Projects -->
|
||||||
<div class="row ">
|
<div class="row ">
|
||||||
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
|
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
|
||||||
<!-- Button Bay-->
|
<!-- Button Bay-->
|
||||||
|
|
@ -164,94 +167,58 @@
|
||||||
{
|
{
|
||||||
<div class="row justify-content-md-center fst-italic fs-1 mb-2">Projects</div>
|
<div class="row justify-content-md-center fst-italic fs-1 mb-2">Projects</div>
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
@if (projects == null)
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">Temperature Blanket Visualizer</p>
|
<p>Loading projects...</p>
|
||||||
<p class="fs-6 fw-lighter card-text">Useful tool to help visualize and refine blanket planning for crochet temperature blankets.
|
}
|
||||||
</p>
|
else
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
{
|
||||||
</p>
|
@foreach (var project in projects)
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
{
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
<div class="row justify-content-md-center mb-3">
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
<p class="fs-5 card-title m-0">@project.Title</p>
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
@foreach (var desc in project.Descriptions)
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">PokemonSleep Toolset</p>
|
<p class="fs-6 fw-lighter card-text">@((MarkupString)FormatDescription(desc))</p>
|
||||||
<p class="fs-6 fw-lighter card-text">A webpage constructed for the purposes of assisting players in the mobile game, Pokemon Sleep. Featuring a Pokemon Rater that derives ratings utilizing <a href="https://docs.google.com/spreadsheets/d/14nzQ--k4XhpFHI0qhgNRQlpWswh6WAxBCfq_QvIVZyI/edit?gid=339317073#gid=339317073">this</a> publically available spreadsheet constructed by other fans of the game.
|
}
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
@if (project.Links?.Any() == true)
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">AI-Driven D&D 5E Character Generator with React, Next.js, and OpenAI GPT-3 Engine</p>
|
<div class="mt-2 align-self-end">
|
||||||
<p class="fs-6 fw-lighter card-text">Creates a credible D&D 5E character sheet, including backstory, based on user input. Ex."I would like to play a magical elf." Or "I want to smash things with a big hammer." Would result in the AI choosing the best character to play with given the limitations and rules of the game (class, race, etc). The user would still be able to customize their character afterwards, and be prompted if they happen to “break” the rules of character generation; i.e. too many skill points assigned.
|
@foreach (var link in project.Links)
|
||||||
</p>
|
{
|
||||||
<p class="fs-6 fw-lighter card-text">Lead development in core functionality, including front and back-end development. Developed all JavaScript components and pages including the deterministic logic depending on decisions made by the AI, and the styling using the emotion library.
|
@switch (link.Type)
|
||||||
</p>
|
{
|
||||||
<a class="" href="https://web.engr.oregonstate.edu/~hessro/teaching/hof/cs494#w22">CS 494 Hall of Fame recipient.</a>
|
case "external":
|
||||||
<a class="mt-2" href="https://github.com/tylertitsworth/ai-character-generator">
|
<a class="me-2" href="@link.Url">@link.Label</a>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
break;
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
case "internal":
|
||||||
</svg>
|
<a class="mt-2 " href=""@link.Url">
|
||||||
</a>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
||||||
</div>
|
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
||||||
</div>
|
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
case "github":
|
||||||
|
<a class="mt-2" href="@link.Url">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
}
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
}
|
||||||
<p class="fs-5 card-title m-0">iOS Gesture Alphabet with Swift and CoreML</p>
|
</div>
|
||||||
<p class="fs-6 fw-lighter card-text">iOS keyboard extension that translates movements made by the user’s phone to corresponding letters. The model used has been trained with Apple’s CoreML to follow the user’s movements as though they were writing them in the air, through the detection of the device’s sensors, primarily through roll/pitch/yaw. Developed as a means of accessibility for users who may not be able to use a traditional phone keyboard effectively.
|
}
|
||||||
</p>
|
</div>
|
||||||
<p class="fs-6 fw-lighter card-text">SCRUM team lead and lead developer during each phase of project lifecycle. Collected, cleaned, trained and tested model with data personally collected and collected by other users. Developed core functionality, including keyboard extension interface and translation of motion to letter.
|
</div>
|
||||||
</p>
|
}
|
||||||
<a class="mt-2" href="https://github.com/kjiroux/iOS-Gesture-Alphabet">
|
}
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">Android Mobile App with Backend PokeAPI and Java</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Using the PokeAPI, created the app “UltimateDex”, which acts as a complete Pokedex from the series Pokemon. Accesses all possible Pokemon, allows the user to search, filter their searches, and save entries to their personal repository for easy retrieval. Each entry when selected comes with its own page which displays all relevant information regarding the entry, including the image associated with the Pokemon, and styled similarly to that of the series.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/osu-cs492-w20/final-project-tamagucci/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">NodeJS WebApp with MYSQL Database and Handlebars</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Fantasy task-assignment system. Utilizes MYSQL to organize and contain guilds, “quests” posted to the forum/board, and guild members whose accounts are associated with the webapp. Handlebars template to display contents, NodeJS to serve.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/yanyan2019/cs340_project/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -263,9 +230,12 @@
|
||||||
|
|
||||||
<!-- View 2: Smaller Desktop View -->
|
<!-- View 2: Smaller Desktop View -->
|
||||||
<div class="container d-none d-md-none d-xl-none d-lg-block mt-4 pt-3 pb-4 ">
|
<div class="container d-none d-md-none d-xl-none d-lg-block mt-4 pt-3 pb-4 ">
|
||||||
<h1 class="fst-italic fw-light fs-1 font-monospace">Hello, World!</h1>
|
<div class="row">
|
||||||
|
<h1 class="fst-italic fw-light fs-1 font-monospace ps-1">Hello, World!</h1>
|
||||||
|
|
||||||
|
</div>
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col-auto ">
|
<div class="col-auto ps-0">
|
||||||
<img class="card-img rounded-3" style="width: 16.9em;" src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg" />
|
<img class="card-img rounded-3" style="width: 16.9em;" src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col ">
|
<div class="col ">
|
||||||
|
|
@ -362,145 +332,108 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Experience / Projects -->
|
<!-- Experience / Projects -->
|
||||||
<div>
|
<div>
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
|
|
||||||
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
|
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
|
||||||
<!-- Button Bay-->
|
<!-- Button Bay-->
|
||||||
<div class="row mt-2">
|
<div class="row mt-2">
|
||||||
<div class="d-grid gap-2 d-md-flex justify-content-around">
|
<div class="d-grid gap-2 d-md-flex justify-content-around">
|
||||||
<button class="btn rounded-4 w-25 @(isExperience ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleExperience()">Experience</button>
|
<button class="btn rounded-4 w-25 @(isExperience ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleExperience()">Experience</button>
|
||||||
<button class="btn rounded-4 w-25 @(isProjects ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleProjects()">Projects</button>
|
<button class="btn rounded-4 w-25 @(isProjects ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleProjects()">Projects</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="row">
|
||||||
<div class="row">
|
<div class="col">
|
||||||
<div class="col">
|
@if (isExperience)
|
||||||
@if (isExperience)
|
|
||||||
{
|
|
||||||
<div class="row justify-content-md-center fst-italic fs-1 mb-2">
|
|
||||||
Experience
|
|
||||||
</div>
|
|
||||||
@if (experiences == null)
|
|
||||||
{
|
{
|
||||||
<div>Loading...</div>
|
<div class="row justify-content-md-center fst-italic fs-1 mb-2">
|
||||||
|
Experience
|
||||||
|
</div>
|
||||||
|
@if (experiences == null)
|
||||||
|
{
|
||||||
|
<div>Loading...</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@foreach (var experience in experiences)
|
||||||
|
{
|
||||||
|
<div class="row justify-content-md-center mb-3">
|
||||||
|
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
||||||
|
<p class="fs-6 fw-lighter card-subtitle p-0"> @experience.StartYear – @experience.EndYear</p>
|
||||||
|
<p class="fs-5 card-title m-0">@experience.Title - @experience.Company</p>
|
||||||
|
<p class="fs-6 fw-lighter card-text">@experience.Details</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (isProjects)
|
||||||
|
{
|
||||||
|
<div class="row justify-content-md-center fst-italic fs-1 mb-2">Projects</div>
|
||||||
|
|
||||||
|
@if (projects == null)
|
||||||
|
{
|
||||||
|
<p>Loading projects...</p>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@foreach (var experience in experiences)
|
@foreach (var project in projects)
|
||||||
{
|
{
|
||||||
<div class="row justify-content-md-center mb-3">
|
<div class="row justify-content-md-center mb-3">
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
||||||
<p class="fs-6 fw-lighter card-subtitle p-0"> @experience.StartYear – @experience.EndYear</p>
|
|
||||||
<p class="fs-5 card-title m-0">@experience.Title - @experience.Company</p>
|
<p class="fs-5 card-title m-0">@project.Title</p>
|
||||||
<p class="fs-6 fw-lighter card-text">@experience.Details</p>
|
|
||||||
|
@foreach (var desc in project.Descriptions)
|
||||||
|
{
|
||||||
|
<p class="fs-6 fw-lighter card-text">@((MarkupString)FormatDescription(desc))</p>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (project.Links?.Any() == true)
|
||||||
|
{
|
||||||
|
<div class="mt-2 align-self-end">
|
||||||
|
@foreach (var link in project.Links)
|
||||||
|
{
|
||||||
|
@switch (link.Type)
|
||||||
|
{
|
||||||
|
case "external":
|
||||||
|
<a class="me-2" href="@link.Url">@link.Label</a>
|
||||||
|
break;
|
||||||
|
case "internal":
|
||||||
|
<a class="mt-2 " href=""@link.Url">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
||||||
|
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
||||||
|
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
case "github":
|
||||||
|
<a class="mt-2" href="@link.Url">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
else if (isProjects)
|
|
||||||
{
|
|
||||||
<div class="row justify-content-md-center fst-italic fs-1 mb-2">Projects</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">Temperature Blanket Visualizer</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Useful tool to help visualize and refine blanket planning for crochet temperature blankets.
|
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">PokemonSleep Toolset</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">A webpage constructed for the purposes of assisting players in the mobile game, Pokemon Sleep. Featuring a Pokemon Rater that derives ratings utilizing <a href="https://docs.google.com/spreadsheets/d/14nzQ--k4XhpFHI0qhgNRQlpWswh6WAxBCfq_QvIVZyI/edit?gid=339317073#gid=339317073">this</a> publically available spreadsheet constructed by other fans of the game.
|
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">AI-Driven D&D 5E Character Generator with React, Next.js, and OpenAI GPT-3 Engine</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Creates a credible D&D 5E character sheet, including backstory, based on user input. Ex."I would like to play a magical elf." Or "I want to smash things with a big hammer." Would result in the AI choosing the best character to play with given the limitations and rules of the game (class, race, etc). The user would still be able to customize their character afterwards, and be prompted if they happen to “break” the rules of character generation; i.e. too many skill points assigned.
|
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Lead development in core functionality, including front and back-end development. Developed all JavaScript components and pages including the deterministic logic depending on decisions made by the AI, and the styling using the emotion library.
|
|
||||||
</p>
|
|
||||||
<a class="" href="https://web.engr.oregonstate.edu/~hessro/teaching/hof/cs494#w22">CS 494 Hall of Fame recipient.</a>
|
|
||||||
<a class="mt-2" href="https://github.com/tylertitsworth/ai-character-generator">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">iOS Gesture Alphabet with Swift and CoreML</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">iOS keyboard extension that translates movements made by the user’s phone to corresponding letters. The model used has been trained with Apple’s CoreML to follow the user’s movements as though they were writing them in the air, through the detection of the device’s sensors, primarily through roll/pitch/yaw. Developed as a means of accessibility for users who may not be able to use a traditional phone keyboard effectively.
|
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">SCRUM team lead and lead developer during each phase of project lifecycle. Collected, cleaned, trained and tested model with data personally collected and collected by other users. Developed core functionality, including keyboard extension interface and translation of motion to letter.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/kjiroux/iOS-Gesture-Alphabet">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">Android Mobile App with Backend PokeAPI and Java</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Using the PokeAPI, created the app “UltimateDex”, which acts as a complete Pokedex from the series Pokemon. Accesses all possible Pokemon, allows the user to search, filter their searches, and save entries to their personal repository for easy retrieval. Each entry when selected comes with its own page which displays all relevant information regarding the entry, including the image associated with the Pokemon, and styled similarly to that of the series.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/osu-cs492-w20/final-project-tamagucci/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">NodeJS WebApp with MYSQL Database and Handlebars</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Fantasy task-assignment system. Utilizes MYSQL to organize and contain guilds, “quests” posted to the forum/board, and guild members whose accounts are associated with the webapp. Handlebars template to display contents, NodeJS to serve.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/yanyan2019/cs340_project/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -652,96 +585,60 @@
|
||||||
}
|
}
|
||||||
else if (isProjects)
|
else if (isProjects)
|
||||||
{
|
{
|
||||||
<div class="row justify-content-md-center fst-italic fs-1 mb-2">Projects</div>
|
<div class="row justify-content-md-center fst-italic fs-1 mb-2">Projects</div>
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
@if (projects == null)
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">Temperature Blanket Visualizer</p>
|
<p>Loading projects...</p>
|
||||||
<p class="fs-6 fw-lighter card-text">Useful tool to help visualize and refine blanket planning for crochet temperature blankets.
|
}
|
||||||
</p>
|
else
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
{
|
||||||
</p>
|
@foreach (var project in projects)
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
{
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
<div class="row justify-content-md-center mb-3">
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
<p class="fs-5 card-title m-0">@project.Title</p>
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
@foreach (var desc in project.Descriptions)
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">PokemonSleep Toolset</p>
|
<p class="fs-6 fw-lighter card-text">@((MarkupString)FormatDescription(desc))</p>
|
||||||
<p class="fs-6 fw-lighter card-text">A webpage constructed for the purposes of assisting players in the mobile game, Pokemon Sleep. Featuring a Pokemon Rater that derives ratings utilizing <a href="https://docs.google.com/spreadsheets/d/14nzQ--k4XhpFHI0qhgNRQlpWswh6WAxBCfq_QvIVZyI/edit?gid=339317073#gid=339317073">this</a> publically available spreadsheet constructed by other fans of the game.
|
}
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
@if (project.Links?.Any() == true)
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">AI-Driven D&D 5E Character Generator with React, Next.js, and OpenAI GPT-3 Engine</p>
|
<div class="mt-2 align-self-end">
|
||||||
<p class="fs-6 fw-lighter card-text">Creates a credible D&D 5E character sheet, including backstory, based on user input. Ex."I would like to play a magical elf." Or "I want to smash things with a big hammer." Would result in the AI choosing the best character to play with given the limitations and rules of the game (class, race, etc). The user would still be able to customize their character afterwards, and be prompted if they happen to “break” the rules of character generation; i.e. too many skill points assigned.
|
@foreach (var link in project.Links)
|
||||||
</p>
|
{
|
||||||
<p class="fs-6 fw-lighter card-text">Lead development in core functionality, including front and back-end development. Developed all JavaScript components and pages including the deterministic logic depending on decisions made by the AI, and the styling using the emotion library.
|
@switch (link.Type)
|
||||||
</p>
|
{
|
||||||
<a class="" href="https://web.engr.oregonstate.edu/~hessro/teaching/hof/cs494#w22">CS 494 Hall of Fame recipient.</a>
|
case "external":
|
||||||
<a class="mt-2" href="https://github.com/tylertitsworth/ai-character-generator">
|
<a class="me-2" href="@link.Url">@link.Label</a>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
break;
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
case "internal":
|
||||||
</svg>
|
<a class="mt-2 " href=""@link.Url">
|
||||||
</a>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
||||||
</div>
|
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
||||||
</div>
|
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
case "github":
|
||||||
|
<a class="mt-2" href="@link.Url">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
}
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
}
|
||||||
<p class="fs-5 card-title m-0">iOS Gesture Alphabet with Swift and CoreML</p>
|
</div>
|
||||||
<p class="fs-6 fw-lighter card-text">iOS keyboard extension that translates movements made by the user’s phone to corresponding letters. The model used has been trained with Apple’s CoreML to follow the user’s movements as though they were writing them in the air, through the detection of the device’s sensors, primarily through roll/pitch/yaw. Developed as a means of accessibility for users who may not be able to use a traditional phone keyboard effectively.
|
}
|
||||||
</p>
|
</div>
|
||||||
<p class="fs-6 fw-lighter card-text">SCRUM team lead and lead developer during each phase of project lifecycle. Collected, cleaned, trained and tested model with data personally collected and collected by other users. Developed core functionality, including keyboard extension interface and translation of motion to letter.
|
</div>
|
||||||
</p>
|
}
|
||||||
<a class="mt-2" href="https://github.com/kjiroux/iOS-Gesture-Alphabet">
|
}
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">Android Mobile App with Backend PokeAPI and Java</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Using the PokeAPI, created the app “UltimateDex”, which acts as a complete Pokedex from the series Pokemon. Accesses all possible Pokemon, allows the user to search, filter their searches, and save entries to their personal repository for easy retrieval. Each entry when selected comes with its own page which displays all relevant information regarding the entry, including the image associated with the Pokemon, and styled similarly to that of the series.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/osu-cs492-w20/final-project-tamagucci/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-md-center mb-3">
|
|
||||||
<div class="card w-75 p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">NodeJS WebApp with MYSQL Database and Handlebars</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Fantasy task-assignment system. Utilizes MYSQL to organize and contain guilds, “quests” posted to the forum/board, and guild members whose accounts are associated with the webapp. Handlebars template to display contents, NodeJS to serve.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/yanyan2019/cs340_project/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -752,7 +649,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- View 4: Mobile View -->
|
<!-- View 4: Mobile View -->
|
||||||
<div class="container card rounded border-0 d-block d-md-none mx-auto mt-4 mb-3 shadow-sm ">
|
<div class="container card rounded border-0 d-block d-md-none mx-auto mt-4 mb-3">
|
||||||
<h1 class="fst-italic fw-light fs-1 font-monospace pt-2">Hello, World!</h1>
|
<h1 class="fst-italic fw-light fs-1 font-monospace pt-2">Hello, World!</h1>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
@ -781,7 +678,7 @@
|
||||||
|
|
||||||
<!-- Education -->
|
<!-- Education -->
|
||||||
<div class="row mb-3 ms-2 me-2 ">
|
<div class="row mb-3 ms-2 me-2 ">
|
||||||
<div class="card p-2 ps-3 pe-3 border border-1 border-primary">
|
<div class="card p-2 ps-3 pe-3 border border-1 border-primary rounded rounded-1">
|
||||||
<p class="fs-6 fw-lighter card-subtitle m-0">September 2018 – March 2022</p>
|
<p class="fs-6 fw-lighter card-subtitle m-0">September 2018 – March 2022</p>
|
||||||
<p class="fs-4 card-title m-0">B.S. in Computer Science</p>
|
<p class="fs-4 card-title m-0">B.S. in Computer Science</p>
|
||||||
<p class="fs-6 fw-lighter card-subtitle">Oregon State University</p>
|
<p class="fs-6 fw-lighter card-subtitle">Oregon State University</p>
|
||||||
|
|
@ -879,106 +776,63 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (isProjects)
|
else if (isProjects)
|
||||||
{
|
{
|
||||||
<div class="row justify-content-center fst-italic fs-1 mt-2">Projects</div>
|
<div class="row justify-content-center fst-italic fs-1 mt-2">Projects</div>
|
||||||
|
|
||||||
<div class="overflow-auto" style="max-height: 16rem">
|
<div class="overflow-auto" style="max-height: 16rem">
|
||||||
|
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
|
@foreach (var project in projects)
|
||||||
|
{
|
||||||
|
<div class="justify-content-center">
|
||||||
|
<div class="card p-3 ps-4 pe-4 rounded">
|
||||||
|
|
||||||
|
<p class="fs-5 card-title m-0">@project.Title</p>
|
||||||
|
|
||||||
|
@foreach (var desc in project.Descriptions)
|
||||||
|
{
|
||||||
|
<p class="fs-6 fw-lighter card-text">@((MarkupString)FormatDescription(desc))</p>
|
||||||
|
}
|
||||||
|
|
||||||
<div class="justify-content-md-center">
|
@if (project.Links?.Any() == true)
|
||||||
<div class="card p-3 ps-4 pe-4 rounded">
|
{
|
||||||
<p class="fs-5 card-title m-0">Temperature Blanket Visualizer</p>
|
<div class="mt-2 align-self-end">
|
||||||
<p class="fs-6 fw-lighter card-text">Useful tool to help visualize and refine blanket planning for crochet temperature blankets.
|
@foreach (var link in project.Links)
|
||||||
</p>
|
{
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
@switch (link.Type)
|
||||||
</p>
|
{
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
case "external":
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
<a class="me-2" href="@link.Url">@link.Label</a>
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
break;
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
case "internal":
|
||||||
</svg>
|
<a class="mt-2 " href=""@link.Url">
|
||||||
</a>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
||||||
</div>
|
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
||||||
</div>
|
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
case "github":
|
||||||
|
<a class="mt-2" href="@link.Url">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
break;
|
||||||
|
|
||||||
<div class="justify-content-md-center">
|
}
|
||||||
<div class="card p-3 ps-4 pe-4 rounded">
|
}
|
||||||
<p class="fs-5 card-title m-0">PokemonSleep Toolset</p>
|
</div>
|
||||||
<p class="fs-6 fw-lighter card-text">A webpage constructed for the purposes of assisting players in the mobile game, Pokemon Sleep. Featuring a Pokemon Rater that derives ratings utilizing <a href="https://docs.google.com/spreadsheets/d/14nzQ--k4XhpFHI0qhgNRQlpWswh6WAxBCfq_QvIVZyI/edit?gid=339317073#gid=339317073">this</a> publically available spreadsheet constructed by other fans of the game.
|
}
|
||||||
</p>
|
</div>
|
||||||
<p class="fs-6 fw-lighter card-text">A personal project, but a fun one.
|
</div>
|
||||||
</p>
|
}
|
||||||
<a class="mt-2" href="https://localhost:7189/pokemonsleep">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-file-code" viewBox="0 0 16 16">
|
|
||||||
<path d="M6.646 5.646a.5.5 0 1 1 .708.708L5.707 8l1.647 1.646a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708zm2.708 0a.5.5 0 1 0-.708.708L10.293 8 8.646 9.646a.5.5 0 0 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/>
|
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="justify-content-md-center">
|
|
||||||
<div class="card p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">AI-Driven D&D 5E Character Generator with React, Next.js, and OpenAI GPT-3 Engine</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Creates a credible D&D 5E character sheet, including backstory, based on user input. Ex."I would like to play a magical elf." Or "I want to smash things with a big hammer." Would result in the AI choosing the best character to play with given the limitations and rules of the game (class, race, etc). The user would still be able to customize their character afterwards, and be prompted if they happen to “break” the rules of character generation; i.e. too many skill points assigned.
|
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Lead development in core functionality, including front and back-end development. Developed all JavaScript components and pages including the deterministic logic depending on decisions made by the AI, and the styling using the emotion library.
|
|
||||||
</p>
|
|
||||||
<a class="" href="https://web.engr.oregonstate.edu/~hessro/teaching/hof/cs494#w22">CS 494 Hall of Fame recipient.</a>
|
|
||||||
<a class="mt-2" href="https://github.com/tylertitsworth/ai-character-generator">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="justify-content-md-center">
|
|
||||||
<div class="card p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">iOS Gesture Alphabet with Swift and CoreML</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">iOS keyboard extension that translates movements made by the user’s phone to corresponding letters. The model used has been trained with Apple’s CoreML to follow the user’s movements as though they were writing them in the air, through the detection of the device’s sensors, primarily through roll/pitch/yaw. Developed as a means of accessibility for users who may not be able to use a traditional phone keyboard effectively.
|
|
||||||
</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">SCRUM team lead and lead developer during each phase of project lifecycle. Collected, cleaned, trained and tested model with data personally collected and collected by other users. Developed core functionality, including keyboard extension interface and translation of motion to letter.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/kjiroux/iOS-Gesture-Alphabet">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="justify-content-md-center">
|
|
||||||
<div class="card p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">Android Mobile App with Backend PokeAPI and Java</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Using the PokeAPI, created the app “UltimateDex”, which acts as a complete Pokedex from the series Pokemon. Accesses all possible Pokemon, allows the user to search, filter their searches, and save entries to their personal repository for easy retrieval. Each entry when selected comes with its own page which displays all relevant information regarding the entry, including the image associated with the Pokemon, and styled similarly to that of the series.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/osu-cs492-w20/final-project-tamagucci/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="justify-content-md-center">
|
|
||||||
<div class="card p-3 ps-4 pe-4 rounded">
|
|
||||||
<p class="fs-5 card-title m-0">NodeJS WebApp with MYSQL Database and Handlebars</p>
|
|
||||||
<p class="fs-6 fw-lighter card-text">Fantasy task-assignment system. Utilizes MYSQL to organize and contain guilds, “quests” posted to the forum/board, and guild members whose accounts are associated with the webapp. Handlebars template to display contents, NodeJS to serve.
|
|
||||||
</p>
|
|
||||||
<a class="mt-2" href="https://github.com/yanyan2019/cs340_project/">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
|
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using Portfolio.Domain.Features.Portfolio;
|
using Portfolio.Domain.Features.Portfolio;
|
||||||
|
using static System.Net.WebRequestMethods;
|
||||||
|
|
||||||
namespace Portfolio.WebUI.Server.Components.Pages
|
namespace Portfolio.WebUI.Server.Components.Pages
|
||||||
{
|
{
|
||||||
|
|
@ -8,6 +9,7 @@ namespace Portfolio.WebUI.Server.Components.Pages
|
||||||
private List<string> tools;
|
private List<string> tools;
|
||||||
private List<string> courses;
|
private List<string> courses;
|
||||||
private List<WorkExperience> experiences;
|
private List<WorkExperience> experiences;
|
||||||
|
private List<ProjectEntry> projects;
|
||||||
|
|
||||||
private bool isExperience = true;
|
private bool isExperience = true;
|
||||||
private bool isProjects = false;
|
private bool isProjects = false;
|
||||||
|
|
@ -19,6 +21,7 @@ namespace Portfolio.WebUI.Server.Components.Pages
|
||||||
tools = await http.GetFromJsonAsync<List<string>>("data/tools.json");
|
tools = await http.GetFromJsonAsync<List<string>>("data/tools.json");
|
||||||
courses = await http.GetFromJsonAsync<List<string>>("data/courses.json");
|
courses = await http.GetFromJsonAsync<List<string>>("data/courses.json");
|
||||||
experiences = await http.GetFromJsonAsync<List<WorkExperience>>("data/workexperiences.json");
|
experiences = await http.GetFromJsonAsync<List<WorkExperience>>("data/workexperiences.json");
|
||||||
|
projects = await http.GetFromJsonAsync<List<ProjectEntry>>("data/projects.json");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ToggleExperience()
|
private void ToggleExperience()
|
||||||
|
|
@ -40,5 +43,11 @@ namespace Portfolio.WebUI.Server.Components.Pages
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string FormatDescription(string desc)
|
||||||
|
{
|
||||||
|
// Simple replacement for [text](url) markdown-style links
|
||||||
|
return System.Text.RegularExpressions.Regex.Replace(desc, @"\[(.+?)\]\((.+?)\)", "<a href=\"$2\">$1</a>");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
@page "/pokemonsleep/admincontrol"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="w-100">
|
||||||
|
<!-- <PokemonBackground PokemonImages="pokemonImageUrls" ShinyPokemonImages="pokemonShinyImageUrls" /> -->
|
||||||
|
|
||||||
|
<PokemonHeader />
|
||||||
|
|
||||||
|
|
||||||
|
<hr class="mt-5" />
|
||||||
|
|
||||||
|
<!-- Add Pokemon (Wrap in Auth) -->
|
||||||
|
<button class="btn btn-warning mx-1" style="border-radius: 50px 15px; max-width: 60px;">
|
||||||
|
<NavLink href="/pokemonsleep/addmincontrol/add-new-pokemon">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" class="bi bi-plus-circle-fill mb-1" viewBox="0 0 16 16">
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.5 4.5a.5.5 0 0 0-1 0v3h-3a.5.5 0 0 0 0 1h3v3a.5.5 0 0 0 1 0v-3h3a.5.5 0 0 0 0-1h-3z" />
|
||||||
|
</svg>
|
||||||
|
</NavLink>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
@ -17,24 +17,22 @@
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<div class="w-50 mt-5 m-auto create-container bg-info">
|
<div class="w-50 mt-5 m-auto create-container bg-info border border-5 border-info-subtle">
|
||||||
|
|
||||||
<div class="card-header bg-secondary bg-gradient ml-0 py-3">
|
<div class="card-header rounded-top-3 bg-info py-3">
|
||||||
<div class="row">
|
<div class="row text-center">
|
||||||
<div class="col-12 text-center">
|
<h2 class="text-white text-decoration-underline">Add New Pokémon</h2>
|
||||||
<h2 class="text-info">Add New Pokémon</h2>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="container m-lg-1" >
|
<div class="p-3" >
|
||||||
<EditForm class=" col mb-3" Model="NewPokemon" OnValidSubmit="HandleSubmit">
|
<EditForm class=" col" Model="NewPokemon" OnValidSubmit="HandleSubmit">
|
||||||
<DataAnnotationsValidator />
|
<DataAnnotationsValidator />
|
||||||
|
|
||||||
<!-- Section 1 -->
|
<!-- Pokemon Number and Name -->
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
<div class="col-sm-3 input-group mb-3 ">
|
<div class="col-sm-3 input-group mb-3">
|
||||||
<!-- Pokemon #-->
|
<!-- Pokemon #-->
|
||||||
<span for="PokemonId" class="input-group-text">#</span>
|
<span for="PokemonId" class="input-group-text">#</span>
|
||||||
<InputNumber min="0" placeholder="Pokedex #" id="PokemonId" @bind-Value="NewPokemon.PokemonId" class="form-control " required />
|
<InputNumber min="0" placeholder="Pokedex #" id="PokemonId" @bind-Value="NewPokemon.PokemonId" class="form-control " required />
|
||||||
|
|
@ -44,9 +42,9 @@ else
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Pokemon Type, Sleep Type, and Speciality -->
|
<!-- Pokemon Type, Sleep Type, and Speciality -->
|
||||||
<div class="row">
|
<div class="row mb-3">
|
||||||
<!-- Pokemon Type -->
|
<!-- Pokemon Type -->
|
||||||
<div class="col mb-3 m-auto">
|
<div class="col m-auto">
|
||||||
<label for="PokemonType" class="form-label">Pokemon Type</label>
|
<label for="PokemonType" class="form-label">Pokemon Type</label>
|
||||||
<InputSelect id="PokemonType" @bind-Value="NewPokemon.PokemonType" class="form-select">
|
<InputSelect id="PokemonType" @bind-Value="NewPokemon.PokemonType" class="form-select">
|
||||||
<option dsabled value="">Select Type</option>
|
<option dsabled value="">Select Type</option>
|
||||||
|
|
@ -71,7 +69,7 @@ else
|
||||||
</InputSelect>
|
</InputSelect>
|
||||||
</div>
|
</div>
|
||||||
<!-- Sleep Type -->
|
<!-- Sleep Type -->
|
||||||
<div class="col mb-3 m-auto">
|
<div class="col m-auto">
|
||||||
<label for="SleepType" class="form-label">Sleep Type</label>
|
<label for="SleepType" class="form-label">Sleep Type</label>
|
||||||
<InputSelect id="SleepType" @bind-Value="NewPokemon.SleepType" class="form-select">
|
<InputSelect id="SleepType" @bind-Value="NewPokemon.SleepType" class="form-select">
|
||||||
<option value="Dozing">Dozing</option>
|
<option value="Dozing">Dozing</option>
|
||||||
|
|
@ -80,7 +78,7 @@ else
|
||||||
</InputSelect>
|
</InputSelect>
|
||||||
</div>
|
</div>
|
||||||
<!-- Speciality-->
|
<!-- Speciality-->
|
||||||
<div class="col mb-3 m-auto">
|
<div class="col m-auto">
|
||||||
<label for="Speciality" class="form-label">Specialty</label>
|
<label for="Speciality" class="form-label">Specialty</label>
|
||||||
<InputSelect id="Speciality" @bind-Value="NewPokemon.Speciality" class="form-select">
|
<InputSelect id="Speciality" @bind-Value="NewPokemon.Speciality" class="form-select">
|
||||||
<option value="Berries">Berries</option>
|
<option value="Berries">Berries</option>
|
||||||
|
|
@ -91,22 +89,23 @@ else
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Section 2 -->
|
<!-- If New Pokemon is Variant -->
|
||||||
<div class="row">
|
<div class="row mb-3">
|
||||||
<div class="input-group mb-3">
|
<div class="input-group align-items-center">
|
||||||
<!-- Variation Check -->
|
<!-- Variation Check -->
|
||||||
<div class=" d-inline-flex">
|
<div class="d-flex">
|
||||||
<InputCheckbox id="IsVariation" @bind-Value="NewPokemon.IsVariation" @onclick="@Toggle" class="form-check-input checkbox-styling p-3 mt-1" />
|
<InputCheckbox id="IsVariation" @bind-Value="NewPokemon.IsVariation" @onclick="@Toggle" class="form-check-input checkbox-styling p-3 rounded" />
|
||||||
<span for="IsVariation" class="input-group-text m-1">Variation?</span>
|
<span for="IsVariation" class="input-group-text mx-2">Variation?</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Variation Region Input -->
|
<!-- Variation Region Input -->
|
||||||
<div class="w-75 mx-2 mt-1">
|
<div class="flex-fill">
|
||||||
|
|
||||||
<InputText placeholder="What Variant? (Alolan, Paldean)" hidden="@HideLabel" id="VariationName" @bind-Value="NewPokemon.VariationName" class="form-control" />
|
<InputText placeholder="What Variant? (Alolan, Paldean)" hidden="@HideLabel" id="VariationName" @bind-Value="NewPokemon.VariationName" class="form-control" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- New Image URL Field -->
|
<!-- New Image URL Field -->
|
||||||
<div class="row mb-3 m-auto">
|
<div class="row mb-3 m-auto">
|
||||||
<label for="ImageUrl" class="form-label">Base Image URL</label>
|
<label for="ImageUrl" class="form-label">Base Image URL</label>
|
||||||
|
|
@ -125,9 +124,9 @@ else
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Form Buttons -->
|
<!-- Form Buttons -->
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex mt-5 justify-content-between">
|
||||||
<button type="button" class="btn btn-secondary mb-3" @onclick="Cancel">Cancel</button>
|
<button type="button" class="btn btn-danger rounded rouneded-4 mb-3 " @onclick="Cancel">Cancel</button>
|
||||||
<button type="submit" class="btn btn-primary mb-3">Add Pokemon</button>
|
<button type="submit" class="btn btn-success rounded rouneded-4 mb-3 ">Add Pokemon</button>
|
||||||
</div>
|
</div>
|
||||||
</EditForm>
|
</EditForm>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,3 @@
|
||||||
border-radius: 15px;
|
border-radius: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkbox-styling {
|
|
||||||
border: 1px solid black;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,87 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"title": "AI-Driven D&D 5E Character Generator with React, Next.js, and OpenAI GPT-3 Engine",
|
"title": "Temperature Blanket Visualizer",
|
||||||
"description": "Creates a credible D&D 5E character sheet, including backstory, based on user input. Ex.’I would like to play a magical elf.’ Or ‘I want to smash things with a big hammer.’ Would result in the AI choosing the best character to play with given the limitations and rules of the game (class, race, etc). The user would still be able to customize their character afterwards, and be prompted if they happen to “break” the rules of character generation; i.e. too many skill points assigned.",
|
"descriptions": [
|
||||||
"responsibilities": "Lead development in core functionality, including front and back-end development. Developed all JavaScript components and pages including the deterministic logic depending on decisions made by the AI, and the styling using the emotion library."
|
"Useful tool to help visualize and refine blanket planning for crochet temperature blankets.",
|
||||||
|
"A personal project, but a fun one."
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"type": "internal",
|
||||||
|
"url": "/pokemonsleep",
|
||||||
|
"icon": "code"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
]
|
{
|
||||||
|
"title": "PokemonSleep Toolset",
|
||||||
|
"descriptions": [
|
||||||
|
"A webpage constructed for assisting players in the mobile game Pokemon Sleep. Featuring a Pokemon Rater that derives ratings utilizing [this public spreadsheet](https://docs.google.com/spreadsheets/d/14nzQ--k4XhpFHI0qhgNRQlpWswh6WAxBCfq_QvIVZyI/edit?gid=339317073#gid=339317073).",
|
||||||
|
"A personal project, but a fun one."
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"type": "internal",
|
||||||
|
"url": "/pokemonsleep",
|
||||||
|
"icon": "code"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "AI-Driven D&D 5E Character Generator with React, Next.js, and OpenAI GPT-3 Engine",
|
||||||
|
"descriptions": [
|
||||||
|
"Creates a credible D&D 5E character sheet, including backstory, based on user input. Ex. 'I would like to play a magical elf.' or 'I want to smash things with a big hammer.' The AI chooses the best-fitting character while ensuring rules compliance.",
|
||||||
|
"Lead development in core functionality, including front and back-end logic and deterministic decision flows styled with Emotion."
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"type": "external",
|
||||||
|
"url": "https://web.engr.oregonstate.edu/~hessro/teaching/hof/cs494#w22",
|
||||||
|
"label": "CS 494 Hall of Fame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/tylertitsworth/ai-character-generator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "iOS Gesture Alphabet with Swift and CoreML",
|
||||||
|
"descriptions": [
|
||||||
|
"iOS keyboard extension that translates movements made by the user’s phone to corresponding letters using CoreML. Developed as an accessibility solution for users who struggle with traditional keyboards.",
|
||||||
|
"SCRUM team lead. Collected, cleaned, trained, and tested the model. Developed core translation logic and interface."
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/kjiroux/iOS-Gesture-Alphabet"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Android Mobile App with Backend PokeAPI and Java",
|
||||||
|
"descriptions": [
|
||||||
|
"Created 'UltimateDex', a complete Pokedex app accessing the PokeAPI. Users can search, filter, and save entries, with each entry displaying comprehensive information styled to match the series."
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/osu-cs492-w20/final-project-tamagucci/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "NodeJS WebApp with MYSQL Database and Handlebars",
|
||||||
|
"descriptions": [
|
||||||
|
"Fantasy task-assignment system utilizing MYSQL to manage guilds, 'quests', and members. NodeJS for backend, Handlebars for templating."
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/yanyan2019/cs340_project/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,14 @@ window.registerResizeCallback = (dotNetHelper) => {
|
||||||
window.onresize = () => {
|
window.onresize = () => {
|
||||||
dotNetHelper.invokeMethodAsync('UpdateScreenWidth', window.innerWidth);
|
dotNetHelper.invokeMethodAsync('UpdateScreenWidth', window.innerWidth);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
window.downloadFileFromText = (filename, contentType, content) => {
|
||||||
|
const blob = new Blob([content], { type: contentType });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const anchor = document.createElement('a');
|
||||||
|
anchor.href = url;
|
||||||
|
anchor.download = filename;
|
||||||
|
anchor.click();
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue