commit
cbb38edfef
29 changed files with 855 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||||
|
bin/ |
||||||
|
obj/ |
||||||
|
/packages/ |
||||||
|
riderModule.iml |
||||||
|
/_ReSharper.Caches/ |
||||||
@ -0,0 +1,13 @@ |
|||||||
|
# Default ignored files |
||||||
|
/shelf/ |
||||||
|
/workspace.xml |
||||||
|
# Rider ignored files |
||||||
|
/.idea.Resume.iml |
||||||
|
/contentModel.xml |
||||||
|
/modules.xml |
||||||
|
/projectSettingsUpdater.xml |
||||||
|
# Editor-based HTTP Client requests |
||||||
|
/httpRequests/ |
||||||
|
# Datasource local storage ignored files |
||||||
|
/dataSources/ |
||||||
|
/dataSources.local.xml |
||||||
@ -0,0 +1,4 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project version="4"> |
||||||
|
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" /> |
||||||
|
</project> |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project version="4"> |
||||||
|
<component name="UserContentModel"> |
||||||
|
<attachedFolders /> |
||||||
|
<explicitIncludes /> |
||||||
|
<explicitExcludes /> |
||||||
|
</component> |
||||||
|
</project> |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project version="4"> |
||||||
|
<component name="VcsDirectoryMappings"> |
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" /> |
||||||
|
</component> |
||||||
|
</project> |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Resume", "Resume\Resume.csproj", "{8B25A112-5EEE-41D1-8782-290A0EDB60C5}" |
||||||
|
EndProject |
||||||
|
Global |
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||||
|
Debug|Any CPU = Debug|Any CPU |
||||||
|
Release|Any CPU = Release|Any CPU |
||||||
|
EndGlobalSection |
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||||
|
{8B25A112-5EEE-41D1-8782-290A0EDB60C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||||
|
{8B25A112-5EEE-41D1-8782-290A0EDB60C5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||||
|
{8B25A112-5EEE-41D1-8782-290A0EDB60C5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||||
|
{8B25A112-5EEE-41D1-8782-290A0EDB60C5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||||
|
EndGlobalSection |
||||||
|
EndGlobal |
||||||
@ -0,0 +1,3 @@ |
|||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> |
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> |
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMidpointRounding_002Ecs_002Fl_003A_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F174cdfd56bcd471abff8d95d61867f0ec90938_003Fe4_003Fb8a35b5f_003FMidpointRounding_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary> |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
<Router AppAssembly="@typeof(App).Assembly"> |
||||||
|
<Found Context="routeData"> |
||||||
|
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/> |
||||||
|
<FocusOnNavigate RouteData="@routeData" Selector="h1"/> |
||||||
|
</Found> |
||||||
|
<NotFound> |
||||||
|
<PageTitle>Not found</PageTitle> |
||||||
|
<LayoutView Layout="@typeof(MainLayout)"> |
||||||
|
<p role="alert">Sorry, there's nothing at this address.</p> |
||||||
|
</LayoutView> |
||||||
|
</NotFound> |
||||||
|
</Router> |
||||||
@ -0,0 +1,35 @@ |
|||||||
|
namespace Resume.Data; |
||||||
|
|
||||||
|
public static class Overview |
||||||
|
{ |
||||||
|
public static Data Get() |
||||||
|
{ |
||||||
|
return new Data |
||||||
|
{ |
||||||
|
Parts = |
||||||
|
[ |
||||||
|
new Part |
||||||
|
{ |
||||||
|
IsVisible = true, |
||||||
|
Order = 1, |
||||||
|
Description = |
||||||
|
"Software Developer with a focus on the .NET tech stack.", |
||||||
|
LastModified = new DateTime(2025, 9, 8) |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
public class Data |
||||||
|
{ |
||||||
|
public List<Part> Parts { get; set; } |
||||||
|
} |
||||||
|
|
||||||
|
public class Part |
||||||
|
{ |
||||||
|
public bool IsVisible { get; set; } |
||||||
|
public int Order { get; set; } = 9999; |
||||||
|
public required string Description { get; set; } |
||||||
|
public DateTime LastModified { get; set; } |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,79 @@ |
|||||||
|
namespace Resume.Data; |
||||||
|
|
||||||
|
public static class PersonalInfo |
||||||
|
{ |
||||||
|
public static Data Get() |
||||||
|
{ |
||||||
|
return new Data |
||||||
|
{ |
||||||
|
Info = |
||||||
|
[ |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Location", |
||||||
|
Value = "Ottawa, ON" |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Email", |
||||||
|
Value = "jonmcc0723@gmail.com" |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Phone", |
||||||
|
Value = "613-277-8353", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Experience Length", |
||||||
|
Value = Math.Round((DateTime.Today - new DateTime(2012, 1, 1)).TotalDays / 360, |
||||||
|
MidpointRounding.ToNegativeInfinity) |
||||||
|
+ " years in tech, 3 in education" |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Education", |
||||||
|
Value = "Game Development (2012)" |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Currently Watching", |
||||||
|
Value = "Fiona and Cake", |
||||||
|
IsVisible = false |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Currently Playing", |
||||||
|
Value = "StarCraft 2", |
||||||
|
IsVisible = false |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Awaiting Release", |
||||||
|
Value = "Path of Exile 2", |
||||||
|
IsVisible = false |
||||||
|
}, |
||||||
|
new Info |
||||||
|
{ |
||||||
|
Name = "Favourite Games", |
||||||
|
Value = "Armored Core 4: For Answers, Warcraft 3, TimeSplitters: Future Perfect, Mass Effect 2", |
||||||
|
IsVisible = false |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public class Data |
||||||
|
{ |
||||||
|
public required List<Info> Info { get; set; } |
||||||
|
} |
||||||
|
|
||||||
|
public class Info |
||||||
|
{ |
||||||
|
public required string Name { get; set; } |
||||||
|
public required string Value { get; set; } |
||||||
|
public bool IsVisible { get; set; } = true; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,101 @@ |
|||||||
|
namespace Resume.Data; |
||||||
|
|
||||||
|
public static class Skills |
||||||
|
{ |
||||||
|
public static Data Get() |
||||||
|
{ |
||||||
|
return new Data |
||||||
|
{ |
||||||
|
Skills = |
||||||
|
[ |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "C#, .NET" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Blazor" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "React" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Angular" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "HTML, CSS" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "JS, TypeScript" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Agile, Scrum" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Jira, Azure DevOps" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Unit Tests" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Test Automation" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Jenkins, Azure Pipelines" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "REST, APIs" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "SQL" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "git" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "PC, Mac, Linux, Mobile" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Azure, AWS, Self-Hosting (Ubuntu Server)" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Google Analytics, 3rd Party APIs/Libraries" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Documentation, Training Videos" |
||||||
|
}, |
||||||
|
new Skill |
||||||
|
{ |
||||||
|
Name = "Customer Support and Debugging" |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
public class Data |
||||||
|
{ |
||||||
|
public required List<Skill> Skills { get; init; } |
||||||
|
} |
||||||
|
|
||||||
|
public class Skill |
||||||
|
{ |
||||||
|
public string Name { get; init; } = ""; |
||||||
|
public bool IsVisible { get; init; } = true; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,194 @@ |
|||||||
|
namespace Resume.Data; |
||||||
|
|
||||||
|
public static class WorkExperience |
||||||
|
{ |
||||||
|
public static Data Get() |
||||||
|
{ |
||||||
|
return new Data |
||||||
|
{ |
||||||
|
Experiences = |
||||||
|
[ |
||||||
|
new Experience |
||||||
|
{ |
||||||
|
Role = "Server Developer", |
||||||
|
Location = "TotalETO, Company providing engineering to order solutions", |
||||||
|
DateRange = "2021 - 2026", |
||||||
|
Points = |
||||||
|
[ |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Wrote various API calls, unit tests to test said calls, and exact examples to show the frontend team on how to consume the GraphQL API.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Converted SQL stored procedures into views usable by Entity Framework to support old functionality with new web app features.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Moved from backend to frontend as needed to fix bugs and add features to React frontend to help the UI team with their higher workload.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Took part in converting legacy VB-coded app functionality to a C# web development server.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Taken the initiative in creating a variety of onboarding internal wiki documents explaining parts of the codebase that were well-loved by the team.", |
||||||
|
IsVisible = true |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
new Experience |
||||||
|
{ |
||||||
|
Role = "Fullstack Blazor Developer", |
||||||
|
Location = "Personal Projects, on various interests", |
||||||
|
DateRange = "2021", |
||||||
|
Points = |
||||||
|
[ |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Created igpfanreference.ca to teach players in unreleased game basic play patterns, and to experiment with Blazor, Linux self-hosting and Azure web hosting.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Twitch streamed live coding sessions to demonstrate developing the website, and crowd-sourced and credited players on ideas and functionality for the website.", |
||||||
|
IsVisible = true |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
new Experience |
||||||
|
{ |
||||||
|
Role = "Angular Web Developer", |
||||||
|
Location = "CleanCode, Software consultancy on various projects", |
||||||
|
DateRange = "2020 - 2021", |
||||||
|
Points = |
||||||
|
[ |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Came to the conclusion that I wanted to focus my career in .NET, and left the company to pursue Blazor research and C# opportunities. Unfortunately, Blazor development work is not as popular as one would hope.", |
||||||
|
IsVisible = true |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
|
||||||
|
new Experience |
||||||
|
{ |
||||||
|
Role = "Full Stack Developer", |
||||||
|
Location = "bitHeads, Tech shop with a focus on cloud-based technology", |
||||||
|
DateRange = "2015 - 2020", |
||||||
|
Points = |
||||||
|
[ |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Worked on a portal and mobile-facing web app for a SaaS project written in React.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Eliminated routine project hours spent documenting by creating a Node.js tool in TypeScript that generated the API doc contents.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Created brainCloud’s Command Line tool in Node.js and other test tools, for developers and QA to test and stress test API and server features.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Maintained customer success and brainCloud’s unit tests, examples, and libraries in Java, ObjC, C++, C#, JS, Unity, and Unreal.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Wrote documentation, tutorials, and offered guidance to bring new co-workers up to speed on the BaaS environment.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Maintained and wrote Jenkins Pipeline in Groovy for improved test reporting and team CI.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Developed Test Automation for brainCloud and Nortec/Condair Help websites in Java, to reduce manual testing time spent on an agile team.", |
||||||
|
IsVisible = true |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
new Experience |
||||||
|
{ |
||||||
|
Role = "Mobile Game Developer", |
||||||
|
Location = "Smoke Labs, Tech startup with a focus on mobile games", |
||||||
|
DateRange = "2012 - 2015", |
||||||
|
Points = |
||||||
|
[ |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Developed key systems in Blokus, Mattel-branded title nominated in the Canadian Video Game Awards for 'Best Game Design' and 'Best Social or Casual Game.'", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Experience integrating a multitude of analytics, ad systems, and backends, including Google Analytics, Game Analytics, Flurry, Mopub, and Playhaven.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Spent time working with the external QA team to bridge the company's knowledge gaps between the developer and QA workflows.", |
||||||
|
IsVisible = true |
||||||
|
}, |
||||||
|
new Point |
||||||
|
{ |
||||||
|
Description = |
||||||
|
"Integrated ads, in-app purchases, analytics, and handled product releases of legacy client apps.", |
||||||
|
IsVisible = true |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
public class Data |
||||||
|
{ |
||||||
|
public List<Experience> Experiences = new(); |
||||||
|
} |
||||||
|
|
||||||
|
public class Experience |
||||||
|
{ |
||||||
|
public string Role { get; set; } |
||||||
|
public string Location { get; set; } |
||||||
|
public string DateRange { get; set; } |
||||||
|
|
||||||
|
public List<Point> Points { get; set; } |
||||||
|
} |
||||||
|
|
||||||
|
public class Point |
||||||
|
{ |
||||||
|
public string Description { get; set; } |
||||||
|
public bool IsVisible { get; set; } |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,19 @@ |
|||||||
|
@inherits LayoutComponentBase |
||||||
|
<div class="page"> |
||||||
|
<main> |
||||||
|
|
||||||
|
<article class="content px-4"> |
||||||
|
@Body |
||||||
|
</article> |
||||||
|
</main> |
||||||
|
</div> |
||||||
|
|
||||||
|
@* Required *@ |
||||||
|
<MudThemeProvider/> |
||||||
|
<MudPopoverProvider/> |
||||||
|
|
||||||
|
@* Needed for dialogs *@ |
||||||
|
<MudDialogProvider/> |
||||||
|
|
||||||
|
@* Needed for snackbars *@ |
||||||
|
<MudSnackbarProvider/> |
||||||
@ -0,0 +1,54 @@ |
|||||||
|
@page "/" |
||||||
|
@using Resume.Data |
||||||
|
|
||||||
|
<div class="page"> |
||||||
|
<div class="title"> |
||||||
|
<div><b>Jonathan McCaffrey</b></div> |
||||||
|
@foreach (var part in Overview.Get().Parts.OrderBy(a => a.Order)) |
||||||
|
{ |
||||||
|
@if (part.IsVisible) |
||||||
|
{ |
||||||
|
<div>@part.Description</div> |
||||||
|
} |
||||||
|
} |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="side"> |
||||||
|
@foreach (var info in PersonalInfo.Get().Info) |
||||||
|
{ |
||||||
|
@if (info.IsVisible) |
||||||
|
{ |
||||||
|
<div><i>@info.Name</i></div> |
||||||
|
<div>@info.Value</div> |
||||||
|
<br/> |
||||||
|
} |
||||||
|
} |
||||||
|
<br/> |
||||||
|
<i>Skills:</i> |
||||||
|
@foreach (var skill in Skills.Get().Skills) |
||||||
|
{ |
||||||
|
@if (skill.IsVisible) |
||||||
|
{ |
||||||
|
<div>@skill.Name</div> |
||||||
|
} |
||||||
|
} |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="experience"> |
||||||
|
@foreach (var experience in WorkExperience.Get().Experiences) |
||||||
|
{ |
||||||
|
<div><b>@experience.Role</b></div> |
||||||
|
<div>@experience.Location</div> |
||||||
|
<div>@experience.DateRange</div> |
||||||
|
<ul> |
||||||
|
@foreach (var point in experience.Points) |
||||||
|
{ |
||||||
|
@if (point.IsVisible) |
||||||
|
{ |
||||||
|
<li>@point.Description</li> |
||||||
|
} |
||||||
|
} |
||||||
|
</ul> |
||||||
|
} |
||||||
|
</div> |
||||||
|
</div> |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
.page { |
||||||
|
width: 816px; |
||||||
|
height: 1054px; |
||||||
|
|
||||||
|
display: grid; |
||||||
|
|
||||||
|
gap: 14px; |
||||||
|
|
||||||
|
grid-template-columns: min-content 1fr; |
||||||
|
grid-template-rows: min-content 1fr; |
||||||
|
|
||||||
|
grid-template-areas: |
||||||
|
"title title" |
||||||
|
"side experience"; |
||||||
|
} |
||||||
|
|
||||||
|
.title { |
||||||
|
grid-area: title; |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.side { |
||||||
|
grid-area: side; |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.experience { |
||||||
|
grid-area: experience; |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
using Microsoft.AspNetCore.Components.Web; |
||||||
|
using Microsoft.AspNetCore.Components.WebAssembly.Hosting; |
||||||
|
using MudBlazor.Services; |
||||||
|
using Resume; |
||||||
|
|
||||||
|
var builder = WebAssemblyHostBuilder.CreateDefault(args); |
||||||
|
builder.RootComponents.Add<App>("#app"); |
||||||
|
builder.RootComponents.Add<HeadOutlet>("head::after"); |
||||||
|
|
||||||
|
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); |
||||||
|
|
||||||
|
builder.Services.AddMudServices(); |
||||||
|
|
||||||
|
await builder.Build().RunAsync(); |
||||||
@ -0,0 +1,41 @@ |
|||||||
|
{ |
||||||
|
"$schema": "http://json.schemastore.org/launchsettings.json", |
||||||
|
"iisSettings": { |
||||||
|
"windowsAuthentication": false, |
||||||
|
"anonymousAuthentication": true, |
||||||
|
"iisExpress": { |
||||||
|
"applicationUrl": "http://localhost:25488", |
||||||
|
"sslPort": 44361 |
||||||
|
} |
||||||
|
}, |
||||||
|
"profiles": { |
||||||
|
"http": { |
||||||
|
"commandName": "Project", |
||||||
|
"dotnetRunMessages": true, |
||||||
|
"launchBrowser": true, |
||||||
|
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", |
||||||
|
"applicationUrl": "http://localhost:5242", |
||||||
|
"environmentVariables": { |
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||||
|
} |
||||||
|
}, |
||||||
|
"https": { |
||||||
|
"commandName": "Project", |
||||||
|
"dotnetRunMessages": true, |
||||||
|
"launchBrowser": true, |
||||||
|
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", |
||||||
|
"applicationUrl": "https://localhost:7294;http://localhost:5242", |
||||||
|
"environmentVariables": { |
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||||
|
} |
||||||
|
}, |
||||||
|
"IIS Express": { |
||||||
|
"commandName": "IISExpress", |
||||||
|
"launchBrowser": true, |
||||||
|
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", |
||||||
|
"environmentVariables": { |
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> |
||||||
|
|
||||||
|
<PropertyGroup> |
||||||
|
<TargetFramework>net10.0</TargetFramework> |
||||||
|
<Nullable>enable</Nullable> |
||||||
|
<ImplicitUsings>enable</ImplicitUsings> |
||||||
|
<LangVersion>latestmajor</LangVersion> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<ItemGroup> |
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.5" /> |
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.5" PrivateAssets="all" /> |
||||||
|
<PackageReference Include="MudBlazor" Version="9.2.0" /> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
<ItemGroup> |
||||||
|
<Content Update="Pages\Home.razor.css"> |
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile> |
||||||
|
</Content> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
</Project> |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||||
|
<PropertyGroup> |
||||||
|
<ActiveDebugProfile>https</ActiveDebugProfile> |
||||||
|
</PropertyGroup> |
||||||
|
</Project> |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
@using System.Net.Http |
||||||
|
@using System.Net.Http.Json |
||||||
|
@using Microsoft.AspNetCore.Components.Forms |
||||||
|
@using Microsoft.AspNetCore.Components.Routing |
||||||
|
@using Microsoft.AspNetCore.Components.Web |
||||||
|
@using Microsoft.AspNetCore.Components.Web.Virtualization |
||||||
|
@using Microsoft.AspNetCore.Components.WebAssembly.Http |
||||||
|
@using Microsoft.JSInterop |
||||||
|
@using Resume |
||||||
|
@using Resume.Layout |
||||||
|
@using MudBlazor |
||||||
@ -0,0 +1,103 @@ |
|||||||
|
html, body { |
||||||
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; |
||||||
|
} |
||||||
|
|
||||||
|
h1:focus { |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
a, .btn-link { |
||||||
|
color: #0071c1; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-primary { |
||||||
|
color: #fff; |
||||||
|
background-color: #1b6ec2; |
||||||
|
border-color: #1861ac; |
||||||
|
} |
||||||
|
|
||||||
|
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { |
||||||
|
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; |
||||||
|
} |
||||||
|
|
||||||
|
.content { |
||||||
|
padding-top: 1.1rem; |
||||||
|
} |
||||||
|
|
||||||
|
.valid.modified:not([type=checkbox]) { |
||||||
|
outline: 1px solid #26b050; |
||||||
|
} |
||||||
|
|
||||||
|
.invalid { |
||||||
|
outline: 1px solid red; |
||||||
|
} |
||||||
|
|
||||||
|
.validation-message { |
||||||
|
color: red; |
||||||
|
} |
||||||
|
|
||||||
|
#blazor-error-ui { |
||||||
|
background: lightyellow; |
||||||
|
bottom: 0; |
||||||
|
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); |
||||||
|
display: none; |
||||||
|
left: 0; |
||||||
|
padding: 0.6rem 1.25rem 0.7rem 1.25rem; |
||||||
|
position: fixed; |
||||||
|
width: 100%; |
||||||
|
z-index: 1000; |
||||||
|
} |
||||||
|
|
||||||
|
#blazor-error-ui .dismiss { |
||||||
|
cursor: pointer; |
||||||
|
position: absolute; |
||||||
|
right: 0.75rem; |
||||||
|
top: 0.5rem; |
||||||
|
} |
||||||
|
|
||||||
|
.blazor-error-boundary { |
||||||
|
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; |
||||||
|
padding: 1rem 1rem 1rem 3.7rem; |
||||||
|
color: white; |
||||||
|
} |
||||||
|
|
||||||
|
.blazor-error-boundary::after { |
||||||
|
content: "An error has occurred." |
||||||
|
} |
||||||
|
|
||||||
|
.loading-progress { |
||||||
|
position: relative; |
||||||
|
display: block; |
||||||
|
width: 8rem; |
||||||
|
height: 8rem; |
||||||
|
margin: 20vh auto 1rem auto; |
||||||
|
} |
||||||
|
|
||||||
|
.loading-progress circle { |
||||||
|
fill: none; |
||||||
|
stroke: #e0e0e0; |
||||||
|
stroke-width: 0.6rem; |
||||||
|
transform-origin: 50% 50%; |
||||||
|
transform: rotate(-90deg); |
||||||
|
} |
||||||
|
|
||||||
|
.loading-progress circle:last-child { |
||||||
|
stroke: #1b6ec2; |
||||||
|
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; |
||||||
|
transition: stroke-dasharray 0.05s ease-in-out; |
||||||
|
} |
||||||
|
|
||||||
|
.loading-progress-text { |
||||||
|
position: absolute; |
||||||
|
text-align: center; |
||||||
|
font-weight: bold; |
||||||
|
inset: calc(20vh + 3.25rem) 0 auto 0.2rem; |
||||||
|
} |
||||||
|
|
||||||
|
.loading-progress-text:after { |
||||||
|
content: var(--blazor-load-percentage-text, "Loading"); |
||||||
|
} |
||||||
|
|
||||||
|
code { |
||||||
|
color: #c02d76; |
||||||
|
} |
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,37 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
|
||||||
|
<head> |
||||||
|
<meta charset="utf-8"/> |
||||||
|
<meta content="width=device-width, initial-scale=1.0" name="viewport"/> |
||||||
|
<title>Resume</title> |
||||||
|
<base href="/"/> |
||||||
|
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet"/> |
||||||
|
<link href="css/app.css" rel="stylesheet"/> |
||||||
|
<link href="favicon.png" rel="icon" type="image/png"/> |
||||||
|
<link href="Resume.styles.css" rel="stylesheet"/> |
||||||
|
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet"/> |
||||||
|
<link href="_content/MudBlazor/MudBlazor.min.css?v=@(MudBlazor.Metadata.Version)" rel="stylesheet"/> |
||||||
|
|
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<div id="app"> |
||||||
|
<svg class="loading-progress"> |
||||||
|
<circle cx="50%" cy="50%" r="40%"/> |
||||||
|
<circle cx="50%" cy="50%" r="40%"/> |
||||||
|
</svg> |
||||||
|
<div class="loading-progress-text"></div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="blazor-error-ui"> |
||||||
|
An unhandled error has occurred. |
||||||
|
<a class="reload" href="">Reload</a> |
||||||
|
<a class="dismiss">🗙</a> |
||||||
|
</div> |
||||||
|
<script src="_framework/blazor.webassembly.js"></script> |
||||||
|
<script src="_content/MudBlazor/MudBlazor.min.js?v=@(MudBlazor.Metadata.Version)"></script> |
||||||
|
|
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
[ |
||||||
|
{ |
||||||
|
"date": "2022-01-06", |
||||||
|
"temperatureC": 1, |
||||||
|
"summary": "Freezing" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"date": "2022-01-07", |
||||||
|
"temperatureC": 14, |
||||||
|
"summary": "Bracing" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"date": "2022-01-08", |
||||||
|
"temperatureC": -13, |
||||||
|
"summary": "Freezing" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"date": "2022-01-09", |
||||||
|
"temperatureC": -16, |
||||||
|
"summary": "Balmy" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"date": "2022-01-10", |
||||||
|
"temperatureC": -2, |
||||||
|
"summary": "Chilly" |
||||||
|
} |
||||||
|
] |
||||||
Loading…
Reference in new issue