Compare commits

..

7 Commits

35 changed files with 14888 additions and 160 deletions

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Portfolio.Domain.Features.Portfolio
{
public class WorkExperience
{
public string Title { get; set; }
public string Company { get; set; }
public int StartYear { get; set; }
public int EndYear { get; set; }
public string Details { get; set; }
}
}

View File

@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Portfolio.Application.Services.Articles; using Portfolio.Application.Services.Articles;
using Portfolio.Application.Services.NWSWeatherService; using Portfolio.Application.Services.NWSWeatherService;
using Portfolio.Application.Services.PokemonService; using Portfolio.Application.Services.PokemonService;

View File

@ -1,22 +1,22 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" class="">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" /> <base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap-brite.css" /> <!-- app.css --> <link rel="stylesheet" href="bootstrap/bootstrap-pulse.css" /> <!-- app.css -->
<link rel="stylesheet" href="Portfolio.WebUI.Server.styles.css" /> <link rel="stylesheet" href="Portfolio.WebUI.Server.styles.css" />
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet /> <HeadOutlet />
</head> </head>
<body class="bg-primary-subtle"> <body class="bg-primary-subtle">
<Routes /> <Routes />
<script src="_framework/blazor.web.js"></script> <script src="_framework/blazor.web.js"></script>
<script src="js/site.js"></script> <script src="js/site.js"></script>
</body> </body>
</html> </html>

View File

@ -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">

View File

@ -78,7 +78,7 @@
<div class="row align-items-center mb-2 ms-1"> <div class="row align-items-center mb-2 ms-1">
<div class="col-6 text-end pe-2"> <div class="col-6 text-end pe-2">
<label class="form-label mb-0"> <label class="form-label mb-0 text-nowrap">
@TempRanges[i].Min&deg; @TempRanges[i].Max&deg; @TempRanges[i].Min&deg; @TempRanges[i].Max&deg;
</label> </label>
</div> </div>

View File

@ -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>

View File

@ -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);
}
}
}

View File

@ -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,9 +40,9 @@
</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>

View File

@ -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-info 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>
<!-- 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> </div>
<!-- Desktop B: Mobile View --> <!-- Desktop B: Mobile View -->

View File

@ -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}");
}
} }
} }

View File

@ -1,9 +1,9 @@
@inherits LayoutComponentBase @inherits LayoutComponentBase
<div class="page bg-primary-subtle h-100"> <div class="page">
<main class="h-100 w-100"> <main class="">
<NavMenu3 /> <NavMenu3 />
<article class="container m-auto"> <article class="container ">
<div class=""> <div class="">
@Body @Body
</div> </div>

View File

@ -1,33 +1,33 @@
<div class="navbar navbar-expand bg-primary border-0"> <div class="navbar navbar-expand bg-primary border-0">
<div class="d-flex align-items-center mb-3 mb-md-0 me-md-auto link-light text-decoration-none px-2"> <div class="d-flex align-items-center mb-3 mb-md-0 me-md-auto link-light text-decoration-none px-3">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#FFFFFF" class="bi bi-arrow-through-heart" viewBox="0 0 16 16" style="cursor: pointer;"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#FFFFFF" class="bi bi-arrow-through-heart" viewBox="0 0 16 16" style="cursor: pointer;">
<path fill-rule="evenodd" d="M2.854 15.854A.5.5 0 0 1 2 15.5V14H.5a.5.5 0 0 1-.354-.854l1.5-1.5A.5.5 0 0 1 2 11.5h1.793l.53-.53c-.771-.802-1.328-1.58-1.704-2.32-.798-1.575-.775-2.996-.213-4.092C3.426 2.565 6.18 1.809 8 3.233c1.25-.98 2.944-.928 4.212-.152L13.292 2 12.147.854A.5.5 0 0 1 12.5 0h3a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.854.354L14 2.707l-1.006 1.006c.236.248.44.531.6.845.562 1.096.585 2.517-.213 4.092-.793 1.563-2.395 3.288-5.105 5.08L8 13.912l-.276-.182a22 22 0 0 1-2.685-2.062l-.539.54V14a.5.5 0 0 1-.146.354zm2.893-4.894A20.4 20.4 0 0 0 8 12.71c2.456-1.666 3.827-3.207 4.489-4.512.679-1.34.607-2.42.215-3.185-.817-1.595-3.087-2.054-4.346-.761L8 4.62l-.358-.368c-1.259-1.293-3.53-.834-4.346.761-.392.766-.464 1.845.215 3.185.323.636.815 1.33 1.519 2.065l1.866-1.867a.5.5 0 1 1 .708.708z" /> <path fill-rule="evenodd" d="M2.854 15.854A.5.5 0 0 1 2 15.5V14H.5a.5.5 0 0 1-.354-.854l1.5-1.5A.5.5 0 0 1 2 11.5h1.793l.53-.53c-.771-.802-1.328-1.58-1.704-2.32-.798-1.575-.775-2.996-.213-4.092C3.426 2.565 6.18 1.809 8 3.233c1.25-.98 2.944-.928 4.212-.152L13.292 2 12.147.854A.5.5 0 0 1 12.5 0h3a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.854.354L14 2.707l-1.006 1.006c.236.248.44.531.6.845.562 1.096.585 2.517-.213 4.092-.793 1.563-2.395 3.288-5.105 5.08L8 13.912l-.276-.182a22 22 0 0 1-2.685-2.062l-.539.54V14a.5.5 0 0 1-.146.354zm2.893-4.894A20.4 20.4 0 0 0 8 12.71c2.456-1.666 3.827-3.207 4.489-4.512.679-1.34.607-2.42.215-3.185-.817-1.595-3.087-2.054-4.346-.761L8 4.62l-.358-.368c-1.259-1.293-3.53-.834-4.346.761-.392.766-.464 1.845.215 3.185.323.636.815 1.33 1.519 2.065l1.866-1.867a.5.5 0 1 1 .708.708z" />
</svg> </svg>
<span class="fs-4 mx-1 text-white">Kira Jiroux</span> <span class="fs-4 mx-2 text-white">Kira Jiroux</span>
</div> </div>
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item"> <li class="nav-item">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All"> <NavLink class="nav-link d-flex align-items-center" href="" Match="NavLinkMatch.All">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house-heart-fill mb-1" viewBox="0 0 16 16"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFFFFF" class="bi bi-house-heart-fill" viewBox="0 0 16 16">
<path d="M7.293 1.5a1 1 0 0 1 1.414 0L11 3.793V2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v3.293l2.354 2.353a.5.5 0 0 1-.708.707L8 2.207 1.354 8.853a.5.5 0 1 1-.708-.707z" /> <path d="M7.293 1.5a1 1 0 0 1 1.414 0L11 3.793V2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v3.293l2.354 2.353a.5.5 0 0 1-.708.707L8 2.207 1.354 8.853a.5.5 0 1 1-.708-.707z" />
<path d="m14 9.293-6-6-6 6V13.5A1.5 1.5 0 0 0 3.5 15h9a1.5 1.5 0 0 0 1.5-1.5zm-6-.811c1.664-1.673 5.825 1.254 0 5.018-5.825-3.764-1.664-6.691 0-5.018" /> <path d="m14 9.293-6-6-6 6V13.5A1.5 1.5 0 0 0 3.5 15h9a1.5 1.5 0 0 0 1.5-1.5zm-6-.811c1.664-1.673 5.825 1.254 0 5.018-5.825-3.764-1.664-6.691 0-5.018" />
</svg> <span class="mx-2 mt-0">Home</span> </svg> <span class="mx-2 mt-0 text-white">Home</span>
</NavLink> </NavLink>
</li> </li>
<li> <li>
<NavLink class="nav-link" href="temperature-blanket"> <NavLink class="nav-link d-flex align-items-center" href="temperature-blanket">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-border-outer" viewBox="0 0 16 16"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFFFFF" class="bi bi-border-outer" viewBox="0 0 16 16">
<path d="M7.5 1.906v.938h1v-.938zm0 1.875v.938h1V3.78h-1zm0 1.875v.938h1v-.938zM1.906 8.5h.938v-1h-.938zm1.875 0h.938v-1H3.78v1zm1.875 0h.938v-1h-.938zm2.813 0v-.031H8.5V7.53h-.031V7.5H7.53v.031H7.5v.938h.031V8.5zm.937 0h.938v-1h-.938zm1.875 0h.938v-1h-.938zm1.875 0h.938v-1h-.938zM7.5 9.406v.938h1v-.938zm0 1.875v.938h1v-.938zm0 1.875v.938h1v-.938z" /> <path d="M7.5 1.906v.938h1v-.938zm0 1.875v.938h1V3.78h-1zm0 1.875v.938h1v-.938zM1.906 8.5h.938v-1h-.938zm1.875 0h.938v-1H3.78v1zm1.875 0h.938v-1h-.938zm2.813 0v-.031H8.5V7.53h-.031V7.5H7.53v.031H7.5v.938h.031V8.5zm.937 0h.938v-1h-.938zm1.875 0h.938v-1h-.938zm1.875 0h.938v-1h-.938zM7.5 9.406v.938h1v-.938zm0 1.875v.938h1v-.938zm0 1.875v.938h1v-.938z" />
<path d="M0 0v16h16V0zm1 1h14v14H1z" /> <path d="M0 0v16h16V0zm1 1h14v14H1z" />
</svg><span class="mx-2 mt-0">Crochet</span> </svg><span class="mx-2 mt-0 text-white">Crochet</span>
</NavLink> </NavLink>
</li> </li>
<li> <li>
<NavLink class="nav-link" href="pokemonsleep"> <NavLink class="nav-link d-flex align-items-center" href="pokemonsleep">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-p-circle-fill" viewBox="0 0 16 16"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFFFFF" class="bi bi-p-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M5.5 4.002V12h1.283V9.164h1.668C10.033 9.164 11 8.08 11 6.586c0-1.482-.955-2.584-2.538-2.584zm2.77 4.072c.893 0 1.419-.545 1.419-1.488s-.526-1.482-1.42-1.482H6.778v2.97z" /> <path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M5.5 4.002V12h1.283V9.164h1.668C10.033 9.164 11 8.08 11 6.586c0-1.482-.955-2.584-2.538-2.584zm2.77 4.072c.893 0 1.419-.545 1.419-1.488s-.526-1.482-1.42-1.482H6.778v2.97z" />
</svg> <span class="mx-2 mt-0">Pokémon Sleep</span> </svg> <span class="mx-2 mt-0 text-white">Pokémon Sleep</span>
</NavLink> </NavLink>
</li> </li>

View File

@ -4,11 +4,9 @@
@rendermode InteractiveServer @rendermode InteractiveServer
<PageTitle>Crochet Tools</PageTitle> <PageTitle>Crochet Tools</PageTitle>
<head>
<link rel="stylesheet" href="bootstrap/bootstrap-cosmo.css" /> <!-- app.css -->
</head>
<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" />

View File

@ -1,14 +1,841 @@
@page "/" @page "/"
@inject IHttpClientFactory ClientFactory
@attribute [StreamRendering]
@rendermode InteractiveServer
<PageTitle>Home</PageTitle> <PageTitle>Home</PageTitle>
<!-- <PokemonBackground />--> <!-- View 1: Desktop View -->
<h1 class="test">Hello, world!</h1> <div class="container d-none d-lg-none d-xl-block mt-5 pt-3 pb-5 ps-5 pe-5 ">
<p>Ensuring that git is connected properly.</p> <h1 class="fst-italic fw-light fs-1 font-monospace">Hello, World!</h1>
Welcome to your new app. <!-- Start of Grid -->
<div class="row mb-3">
<!-- Profile Image -->
<div class="col-auto ">
<img class="card-img rounded-3" style="width: 18.1em;" src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg" />
</div>
<div class="col ">
<!-- About Me-->
<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
experience in Data Analysis and Visualization, as well as
Simulation/VR development, and AI/ML programming.
I am a friendly team worker with strong analytical, math
and problem-solving skills that adapts well to an
Agile/SCRUM environment and development lifecycle.
</div>
<div class="row">
<!-- School Experience -->
<div class="col-auto ps-0">
<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-5 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">Graduated Cum Laude</p>
<p class="fs-6 fw-lighter card-subtitle">Deans List: Fall 2020, Fall 2021</p>
<p class="fs-6 fw-lighter card-subtitle">Final GPA: 3.33</p>
@**@
<!-- Courses -->
<label class="text-decoration-underline fw-semibold">Courses</label>
<div class="overflow-auto" style="height: auto; max-height: 12rem">
<ul class="list-group list-group-flush">
@if (courses == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var course in courses)
{
<li class="list-group-item">@course</li>
}
</ul>
}
</ul>
</div>
<div class="w-75 h-100 bg-white"> </div>
@* <div class="ps-3 pe-3">
<ul class="list-group list-group-flush">
<li class="">Organized</li>
<li class="">Responsible</li>
<li class="">Meticulous</li>
<li class="">Analytical</li>
<li class="">Self-motivating</li>
</ul>
</div> *@
</div>
<!--Skills \ Languages-->
<div class="col p-0 ">
<div class="bg-white rounded p-2 border border-1 border-primary" >
<div class="card-header">
<label class="text-decoration-underline fw-semibold">Skills \ Languages</label>
</div>
<div class="overflow-auto" style="max-height: 20.1rem">
@if (skills == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var skill in skills)
{
<li class="list-group-item">@skill</li>
}
</ul>
}
</div>
</div>
</div>
<!-- Tools -->
<div class="col pe-0">
<div class="bg-white rounded p-2 border border-1 border-primary">
<div class="card-header">
<label class="text-decoration-underline fw-semibold">Tools</label>
</div>
<div class="overflow-auto" style="max-height: 20.1rem">
@if (tools == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var tool in tools)
{
<li class="list-group-item">@tool</li>
}
</ul>
}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Experiences / Projects -->
<div class="row ">
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
<!-- Button Bay-->
<div class="row mt-2">
<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 @(isProjects ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleProjects()">Projects</button>
</div>
</div>
<div class="row">
<div class="col">
@if (isExperience)
{
<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
{
@foreach (var project in projects)
{
<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">@project.Title</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>
</div>
</div>
</div> </div>
<!-- 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="row">
<h1 class="fst-italic fw-light fs-1 font-monospace ps-1">Hello, World!</h1>
</div>
<div class="row mb-3">
<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" />
</div>
<div class="col ">
<!-- About Me-->
<div class="row card rounded fs-6 mb-3 p-2 ps-3 pe-3 border-0">
I am a full-stack web developer with additional
experience in Data Analysis and Visualization, as well as
Simulation/VR development, and AI/ML programming.
I am a friendly team worker with strong analytical, math
and problem-solving skills that adapts well to an
Agile/SCRUM environment and development lifecycle.
</div>
<div class="row mt-3">
<!-- School Experience -->
<div class="col me-1">
<div class="row bg-white 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-5 card-title m-0 p-0">B.S. in Computer Science</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Oregon State University</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Graduated Cum Laude</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Deans List: Fall 2020, Fall 2021</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Final GPA: 3.33</p>
<!-- Courses -->
<label class="text-decoration-underline p-0">Courses</label>
<div class="overflow-auto p-0" style="max-height: 10rem">
<ul class="list-group list-group-flush">
@if (courses == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var course in courses)
{
<li class="list-group-item">@course</li>
}
</ul>
}
</ul>
</div>
</div>
</div>
<div class="col ms-1">
<!--Skills \ Languages-->
<div class="row bg-white rounded p-2 border border-1 border-primary mb-2">
<div class="card-header">
<label class="text-decoration-underline">Skills \ Languages</label>
</div>
<div class="overflow-auto p-0" style="max-height: 8rem">
@if (skills == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var skill in skills)
{
<li class="list-group-item">@skill</li>
}
</ul>
}
</div>
</div>
<!-- Tools -->
<div class="row bg-white rounded p-2 border border-1 border-primary">
<div class="card-header">
<label class="text-decoration-underline">Tools</label>
</div>
<div class="overflow-auto p-0" style="max-height: 8rem">
@if (tools == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var tool in tools)
{
<li class="list-group-item">@tool</li>
}
</ul>
}
</div>
</div>
</div>
</div>
</div>
<!-- Experience / Projects -->
<div>
<div class="row mt-3">
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
<!-- Button Bay-->
<div class="row mt-2">
<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 @(isProjects ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleProjects()">Projects</button>
</div>
</div>
<div class="row">
<div class="col">
@if (isExperience)
{
<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
{
@foreach (var project in projects)
{
<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">@project.Title</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>
</div>
</div>
</div>
</div>
</div>
<!-- View 3: Tablet View -->
<div class="container d-none d-md-block d-lg-none mt-4 pt-3 pb-4 ">
<h1 class="fst-italic fw-light fs-1 font-monospace">Hello, World!</h1>
<div class="row">
<div class="card rounded p-3 border-0">
<div class="clearfix">
<img src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg"
class="mobile-profile float-start me-3 mb-2"
style="width: 10em;
height: 10em;
object-fit: cover;
border-radius: 0.5rem;" />
<p class="fs-6 mb-0">
I am a full-stack web developer with additional experience in Data Analysis and Visualization,
as well as Simulation/ VR development, and AI/ ML programming. I am a friendly team worker with
strong analytical, math and problem-solving skills that adapts well to an Agile/SCRUM environment
and development lifecycle.
</p>
</div>
</div>
</div>
<div class="row mt-3">
<!-- School Experience -->
<div class="col me-1">
<div class="row bg-white 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-5 card-title m-0 p-0">B.S. in Computer Science</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Oregon State University</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Graduated Cum Laude</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Deans List: Fall 2020, Fall 2021</p>
<p class="fs-6 fw-lighter card-subtitle p-0">Final GPA: 3.33</p>
<!-- Courses -->
<label class="text-decoration-underline p-0">Courses</label>
<div class="overflow-auto p-0" style="max-height: 9.8rem">
<ul class="list-group list-group-flush">
@if (courses == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var course in courses)
{
<li class="list-group-item">@course</li>
}
</ul>
}
</ul>
</div>
</div
</div>
<div class="col ms-1">
<!--Skills \ Languages-->
<div class="row bg-white rounded p-2 border border-1 border-primary mb-2">
<div class="card-header">
<label class="text-decoration-underline">Skills \ Languages</label>
</div>
<div class="overflow-auto p-0" style="max-height: 8rem">
@if (skills == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var skill in skills)
{
<li class="list-group-item">@skill</li>
}
</ul>
}
</div>
</div>
<!-- Tools -->
<div class="row bg-white rounded p-2 border border-1 border-primary">
<div class="card-header">
<label class="text-decoration-underline">Tools</label>
</div>
<div class="overflow-auto p-0" style="max-height: 8rem">
@if (tools == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var tool in tools)
{
<li class="list-group-item">@tool</li>
}
</ul>
}
</div>
</div>
</div>
</div>
<div>
<div class="row mt-3">
<div class="col card border-0 rounded rounded-4 pt-3 pb-3">
<!-- Button Bay-->
<div class="row mt-2">
<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 @(isProjects ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleProjects()">Projects</button>
</div>
</div>
<div class="row">
<div class="col">
@if (isExperience)
{
<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
{
@foreach (var project in projects)
{
<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">@project.Title</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>
</div>
</div>
</div>
</div>
<!-- View 4: Mobile View -->
<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>
<div class="row">
<div class="card border-0">
<div class="clearfix">
<img src="https://i.pinimg.com/736x/54/63/ed/5463ed9471053712a76c0dd0b301a7ea.jpg"
class="mobile-profile float-start me-3 mb-2" />
<p class="fs-6 mb-0">
I am a full-stack web developer with additional experience in Data Analysis and Visualization,
as well as Simulation/ VR development, and AI/ ML programming. I am a friendly team worker with
strong analytical, math and problem-solving skills that adapts well to an Agile/SCRUM environment
and development lifecycle.
</p>
</div>
</div>
</div>
@* <div class="row mb-3 bg-info rounded rounded-5 pt-1 pb-1">
<p class="fw-lighter fs-6 text-nowrap p-0 m-auto text-center text-white">
Organized • Responsible • Meticulous • Analytical • Self-motivating
</p>
</div> *@
<hr class="text-primary" />
<!-- Education -->
<div class="row mb-3 ms-2 me-2 ">
<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-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">Graduated Cum Laude</p>
<p class="fs-6 fw-lighter card-subtitle">Deans List: Fall 2020, Fall 2021</p>
<p class="fs-6 fw-lighter card-subtitle">Final GPA: 3.33</p>
</div>
</div>
<!-- Skills \ Languages -->
<div class="row mb-3 ms-2 me-2">
<div class="bg-primary-subtle rounded p-2 border-0">
<div class="card-header text-bg-primary text-light fs-3">
Skills \ Languages
</div>
<div class="overflow-auto" style="max-height: 15rem">
@if (skills == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var skill in skills)
{
<li class="list-group-item">@skill</li>
}
</ul>
}
</div>
</div>
</div>
<!-- Technology -->
<div class="row mb-3 ms-2 me-2">
<div class="bg-primary-subtle rounded p-2 border-0">
<div class="card-header text-bg-primary text-light fs-3">
Technology
</div>
<div class="overflow-auto" style="max-height: 15rem">
@if (tools == null)
{
<div>Loading...</div>
}
else
{
<ul class="list-group list-group-flush">
@foreach (var tool in tools)
{
<li class="list-group-item">@tool</li>
}
</ul>
}
</div>
</div>
</div>
<!-- Experience \ Projects -->
<div class="row mb-3 ms-2 me-2">
<div class="col card border-0 rounded rounded-4 pt-3 ">
<!-- Button Bay-->
<div class="row mt-2">
<div class="d-flex justify-content-evenly">
<button class="btn rounded-4 flex-fill @(isExperience ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleExperience()">Experience</button>
<button class="btn rounded-4 flex-fill @(isProjects ? "btn-primary" : "btn-outline-primary")" type="button" @onclick="() => ToggleProjects()">Projects</button>
</div>
</div>
@if (isExperience)
{
<div class="row justify-content-center fst-italic fs-1 mt-2">
Experience
</div>
@if (experiences == null)
{
<div>Loading...</div>
}
else
{
<div class="overflow-auto" style="max-height: 16rem">
<ul class="list-group list-group-flush">
@foreach (var experience in experiences)
{
<div class=" justify-content-md-center">
<div class="card 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>
}
</ul>
</div>
}
}
else if (isProjects)
{
<div class="row justify-content-center fst-italic fs-1 mt-2">Projects</div>
<div class="overflow-auto" style="max-height: 16rem">
<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>
}
@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>
}
</ul>
</div>
}
</div>
</div>
</div>

View File

@ -0,0 +1,53 @@
using Portfolio.Domain.Features.Portfolio;
using static System.Net.WebRequestMethods;
namespace Portfolio.WebUI.Server.Components.Pages
{
partial class Home
{
private List<string> skills;
private List<string> tools;
private List<string> courses;
private List<WorkExperience> experiences;
private List<ProjectEntry> projects;
private bool isExperience = true;
private bool isProjects = false;
protected override async Task OnInitializedAsync()
{
var http = ClientFactory.CreateClient("LocalClient");
skills = await http.GetFromJsonAsync<List<string>>("data/skills.json");
tools = await http.GetFromJsonAsync<List<string>>("data/tools.json");
courses = await http.GetFromJsonAsync<List<string>>("data/courses.json");
experiences = await http.GetFromJsonAsync<List<WorkExperience>>("data/workexperiences.json");
projects = await http.GetFromJsonAsync<List<ProjectEntry>>("data/projects.json");
}
private void ToggleExperience()
{
if (!isExperience)
{
isExperience = true;
isProjects = false;
StateHasChanged();
}
}
private void ToggleProjects()
{
if (!isProjects)
{
isProjects = true;
isExperience = false;
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>");
}
}
}

View File

@ -0,0 +1,6 @@
.mobile-profile {
width: 10em;
height: 10em;
object-fit: cover;
border-radius: 0.5rem;
}

View File

@ -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>

View File

@ -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>

View File

@ -4,6 +4,3 @@
border-radius: 15px; border-radius: 15px;
} }
.checkbox-styling {
border: 1px solid black;
}

View File

@ -8,9 +8,7 @@
<PageTitle>Edit Pokémon</PageTitle> <PageTitle>Edit Pokémon</PageTitle>
<PokemonHeader /> <PokemonHeader />
<head>
<link rel="stylesheet" href="bootstrap/bootstrap-lumen.css" /> <!-- app.css -->
</head>
@if (pokemon == null) @if (pokemon == null)
{ {

View File

@ -8,9 +8,7 @@
@attribute [StreamRendering] @attribute [StreamRendering]
@rendermode InteractiveServer @rendermode InteractiveServer
<head>
<link rel="stylesheet" href="bootstrap/bootstrap-lumen.css" /> <!-- app.css -->
</head>
<PageTitle>Rate Pokémon</PageTitle> <PageTitle>Rate Pokémon</PageTitle>

View File

@ -9,9 +9,6 @@
<PageTitle>Pokémon Sleep</PageTitle> <PageTitle>Pokémon Sleep</PageTitle>
<head>
<link rel="stylesheet" href="bootstrap/bootstrap-lumen.css" /> <!-- app.css -->
</head>
<div class="w-100"> <div class="w-100">
<!-- <PokemonBackground PokemonImages="pokemonImageUrls" ShinyPokemonImages="pokemonShinyImageUrls" /> --> <!-- <PokemonBackground PokemonImages="pokemonImageUrls" ShinyPokemonImages="pokemonShinyImageUrls" /> -->

View File

@ -6,71 +6,62 @@
<PageTitle>Pokémon Sleep</PageTitle> <PageTitle>Pokémon Sleep</PageTitle>
<head>
<link rel="stylesheet" href="bootstrap/bootstrap-lumen.css" /> <!-- app.css -->
</head>
<div class=""> <!-- <PokemonBackground PokemonImages="pokemonImageUrls" ShinyPokemonImages="pokemonShinyImageUrls" /> -->
<div class="row w-100"> <PokemonHeader />
<!-- <PokemonBackground PokemonImages="pokemonImageUrls" ShinyPokemonImages="pokemonShinyImageUrls" /> -->
<div class="row"><PokemonHeader /></div>
<!-- Card --> <!-- Card -->
<div class="row card shadow-sm border-0 p-3 pb-4 mt-4 m-auto w-75 mb-5 bg-white"> <div class="container card shadow-sm border-0 p-3 pb-4 mt-4 m-auto w-75 mb-5 bg-white">
<!-- Top Row-->
<div class="row d-flex flex-row">
<!-- Image side -->
<div class="col w-50 border-0 ">
<div>
</div> <!-- Top Row-->
<img class="shadow-sm w-100 m-auto img-fluid" src="images/Pokemon_Sleep_ID.jpg" /> <div class="row d-flex flex-row">
</div> <!-- Image side -->
<!-- Text side --> <div class="col-5 border-0 ">
<div class="col w-50 p-3"> <img class="shadow-sm w-100 m-auto img-fluid" src="images/Pokemon_Sleep_ID.jpg" />
<p class="fw-bold fst-italic fs-3">Pokémon Sleep? Really?</p> </div>
<p class="fw-normal fs-6 text-start"> <!-- Text side -->
Yes, really! Pokémon Sleep has become a fun addition to my day since it's release. <div class="col w-50 p-3">
</p> <p class="fw-bold fst-italic fs-3">Pokémon Sleep? Really?</p>
<p class="fw-bold fst-italic fs-3">But what do you even do?</p> <p class="fw-normal fs-6 text-start">
<p class="fw-normal fs-6 text-start"> Yes, really! Pokémon Sleep has become a fun addition to my day since it's release.
That's harder to explain. See, it isn't as much a game, as it is a gamified sleep tracker. But it's fun to collect the Pokémon and gather their berries and ingredients and create silly little Pokémon-themed foods. Plus, it encourages me to try to get to bed in a timely manner; though, if I'm honest, I definitely put my Pokémon to bed ahead of when I do. </p>
</p> <p class="fw-bold fst-italic fs-3">But what do you even do?</p>
<p class="fw-normal fs-6 text-start">
That's harder to explain. See, it isn't as much a game, as it is a gamified sleep tracker. But it's fun to collect the Pokémon and gather their berries and ingredients and create silly little Pokémon-themed foods. Plus, it encourages me to try to get to bed in a timely manner; though, if I'm honest, I definitely put my Pokémon to bed ahead of when I do.
</p>
</div>
</div>
<!-- Second Row -->
<div class="row mt-3">
<p class="fw-bold fst-italic fs-3">Okay, but why a whole section dedicated to Pokémon Sleep?</p>
<p class="fw-normal fs-6 text-start">
Well, as it is in any Pokémon game, Natures (and in this case Subskills) matter, amongst other things. This was designed as a helpful tool in assessing new Pokémon acquired from Sleep Research.
</p>
</div>
<!-- Button Row-->
<div class="row btn-group d-flex flex-row justify-content-around mt-4">
<div class="w-auto">
<button class="btn btn-info">
<NavLink href="/pokemon">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-table mb-1" 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" />
</svg>
<span class="ps-1">Available Pokémon</span>
</NavLink>
</button>
</div>
<div class="w-auto">
<button class="btn btn-success link">
<NavLink href="/rate-pokemon">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-award-fill mb-1" 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="M4 11.794V16l4-1 4 1v-4.206l-2.018.306L8 13.126 6.018 12.1z" />
</svg>
<span class="ps-1">Rate Pokémon</span>
</NavLink>
</button>
</div>
</div>
</div> </div>
</div> </div>
<!-- Second Row -->
<div class="row mt-3">
<p class="fw-bold fst-italic fs-3">Okay, but why a whole section dedicated to Pokémon Sleep?</p>
<p class="fw-normal fs-6 text-start">
Well, as it is in any Pokémon game, Natures (and in this case Subskills) matter, amongst other things. This was designed as a helpful tool in assessing new Pokémon acquired from Sleep Research.
</p>
</div>
<!-- Button Row-->
<div class="d-flex justify-content-evenly mt-4 ">
<button class="btn btn-info rounded-4 d-flex justify-content-center" style="width:12rem;">
<NavLink class="nav-link d-flex align-items-center" href="/pokemon">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-table" 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" />
</svg>
<span class="ps-1 text-white">Available Pokémon</span>
</NavLink>
</button>
<button class="btn btn-success rounded-4 d-flex justify-content-center" style="width:12rem;">
<NavLink class="nav-link d-flex align-items-center" href="/rate-pokemon">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" class="bi bi-award-fill" 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="M4 11.794V16l4-1 4 1v-4.206l-2.018.306L8 13.126 6.018 12.1z" />
</svg>
<span class="ps-1 text-white">Rate Pokémon</span>
</NavLink>
</button>
</div>
</div> </div>

View File

@ -8,9 +8,7 @@
<PokemonHeader /> <PokemonHeader />
<head>
<link rel="stylesheet" href="bootstrap/bootstrap-lumen.css" /> <!-- app.css -->
</head>
@if (_pokemon == null) @if (_pokemon == null)
{ {

View File

@ -12,6 +12,7 @@
@using Portfolio.WebUI.Server.Components.Component.Pokemon_Components @using Portfolio.WebUI.Server.Components.Component.Pokemon_Components
@using Portfolio.WebUI.Server.Components.Component.Crochet_Components @using Portfolio.WebUI.Server.Components.Component.Crochet_Components
@using Portfolio.Domain.Features.Articles @using Portfolio.Domain.Features.Articles
@using Portfolio.Domain.Features.Portfolio;
@using Portfolio.Domain.Features.Pokemon @using Portfolio.Domain.Features.Pokemon
@using Portfolio.Domain.Features.Pokemon_Natures @using Portfolio.Domain.Features.Pokemon_Natures
@using Portfolio.Domain.Features.Pokemon_Subskills @using Portfolio.Domain.Features.Pokemon_Subskills

View File

@ -8,6 +8,11 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorComponents() builder.Services.AddRazorComponents()
.AddInteractiveServerComponents(); .AddInteractiveServerComponents();
builder.Services.AddHttpClient("LocalClient", client =>
{
client.BaseAddress = new Uri("https://localhost:7189/"); // or whatever your port is
});
builder.Services.AddApplication(); builder.Services.AddApplication();
builder.Services.AddInfrastructure(builder.Configuration); builder.Services.AddInfrastructure(builder.Configuration);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
[
"Adv. Web Development",
"Operating Systems",
"Game Development",
"Parallel Programming",
"VR / AR Development",
"Artificial Intelligence",
"Machine Learning",
"Computer Graphics",
"Data Visualization",
"Database Management",
"Analysis of Algorithms"
]

View File

@ -0,0 +1,87 @@
[
{
"title": "Temperature Blanket Visualizer",
"descriptions": [
"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 users 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/"
}
]
}
]

View File

@ -0,0 +1,17 @@
[
"C# / C++ / C",
"ASP.NET / .NET Core",
"Blazor WASM",
"React",
"Java",
"JavaScript",
"HTML / CSS",
"SQL / MYSQL / MSSQL",
"JSON / XML",
"Python",
"Swift",
"TypeScript",
"MATLAB",
"R",
"LaTeX"
]

View File

@ -0,0 +1,17 @@
[
"MS Visual Studio 2022",
"Git / GitHub / GitLab",
"RESTful API",
"Docker",
"Terraform",
"Jira",
"Linux / UNIX",
"SQL / MYSQL / MSSQL",
"Unreal Engine",
"Unity",
"Blendr",
"Windows, Android & iOS",
"Gephi",
"Excel / Microsoft Office Suite",
"Figma"
]

View File

@ -0,0 +1,24 @@
[
{
"title": "Junior Web Developer",
"company": "Universal Flight Concepts",
"startYear": 2022,
"endYear": 2024,
"details": "Part of a development team that worked on a full rewrite of a 'Secure Area' used by Admin, Students, Instructors and University coordinators to schedule flight and ground instruction, and took the application from ASP.Net 4.0/SQL Server 2016 to a stand-alone C# .Net Core 8, with Blazor WASM (Web Assembly) Microservices API, Identity Server integration, SQL Server 2019, Code-First Entity Framework & DB Migrations, Auto-Scaling Cloud Application"
},
{
"title": "Web Development & Cybersecurity Teaching Assistant",
"company": "Oregon State University",
"startYear": 2019,
"endYear": 2020,
"details": "Interacted with and mentored students with relation to their area of study; created solutions to development projects before being assigned to students to ensure guidance and engrain best coding practices; held personal office hours to assist students mwith needs. HTML/CSS, C++, JavaScript, JSON, Node.js, RESTFUL API, MYSQL; public/private keys, key exchange, modern encryption methods, cyberattacks, TOR."
},
{
"title": "Junior Web Developer",
"company": "DzyneFX",
"startYear": 2018,
"endYear": 2018,
"details": "Developed front-end UI and code for websites, as well as back-end code, data access layers, web services and RESTful APIs. Worked with symmetric and asymmetric data schemas. Request, register and configure SSL and TLS certificates. C#, PHP, MSSQL and MYSQL."
}
]

View File

@ -7,3 +7,13 @@ window.registerResizeCallback = (dotNetHelper) => {
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);
}