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