Rename web project
This commit is contained in:
Generated
-1
@@ -1 +0,0 @@
|
|||||||
Website
|
|
||||||
Generated
+22
-22
@@ -19,34 +19,34 @@
|
|||||||
<commands />
|
<commands />
|
||||||
<urls />
|
<urls />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectColorInfo"><![CDATA[{
|
<component name="ProjectColorInfo">{
|
||||||
"associatedIndex": 6,
|
"associatedIndex": 6,
|
||||||
"fromUser": false
|
"fromUser": false
|
||||||
}]]></component>
|
}</component>
|
||||||
<component name="ProjectId" id="3J6G2pWKb6yAOf9g9caEG0zRCFB" />
|
<component name="ProjectId" id="3J6G2pWKb6yAOf9g9caEG0zRCFB" />
|
||||||
<component name="ProjectViewState">
|
<component name="ProjectViewState">
|
||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
<option name="showLibraryContents" value="true" />
|
<option name="showLibraryContents" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent"><![CDATA[{
|
<component name="PropertiesComponent">{
|
||||||
"keyToString": {
|
"keyToString": {
|
||||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||||
"RunOnceActivity.MCP Project settings loaded": "true",
|
"RunOnceActivity.MCP Project settings loaded": "true",
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
"RunOnceActivity.cidr.known.project.marker": "true",
|
"RunOnceActivity.cidr.known.project.marker": "true",
|
||||||
"RunOnceActivity.git.unshallow": "true",
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
||||||
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
||||||
"cidr.known.project.marker": "true",
|
"cidr.known.project.marker": "true",
|
||||||
"codeWithMe.voiceChat.enabledByDefault": "false",
|
"codeWithMe.voiceChat.enabledByDefault": "false",
|
||||||
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
|
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
|
||||||
"git-widget-placeholder": "master",
|
"git-widget-placeholder": "master",
|
||||||
"junie.onboarding.icon.badge.shown": "true",
|
"junie.onboarding.icon.badge.shown": "true",
|
||||||
"nodejs_package_manager_path": "npm",
|
"nodejs_package_manager_path": "npm",
|
||||||
"settings.editor.selected.configurable": "preferences.lookFeel",
|
"settings.editor.selected.configurable": "preferences.lookFeel",
|
||||||
"to.speed.mode.migration.done": "true"
|
"to.speed.mode.migration.done": "true"
|
||||||
}
|
}
|
||||||
}]]></component>
|
}</component>
|
||||||
<component name="RunManager" selected=".NET Launch Settings Profile.Website: https">
|
<component name="RunManager" selected=".NET Launch Settings Profile.Website: https">
|
||||||
<configuration name="Website.Client" type="DotNetProject" factoryName=".NET Project">
|
<configuration name="Website.Client" type="DotNetProject" factoryName=".NET Project">
|
||||||
<option name="EXE_PATH" value="" />
|
<option name="EXE_PATH" value="" />
|
||||||
|
|||||||
Generated
+298
@@ -0,0 +1,298 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
|
</component>
|
||||||
|
<component name="CMakeProjectFlavorService">
|
||||||
|
<option name="flavorId" value="CMakePlainProjectFlavor" />
|
||||||
|
</component>
|
||||||
|
<component name="CMakeSettings">
|
||||||
|
<configurations />
|
||||||
|
</component>
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="95e2bd25-4260-499e-9561-08c9bd005d95" name="Changes" comment="...">
|
||||||
|
<change beforePath="$PROJECT_DIR$/.idea/.idea.Resume/.idea/.name" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Resume.slnx" beforeDir="false" afterPath="$PROJECT_DIR$/Resume.slnx" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/App.razor" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/App.razor" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Layout/MainLayout.razor" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/Layout/MainLayout.razor" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Layout/MainLayout.razor.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/Layout/MainLayout.razor.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Layout/ReconnectModal.razor" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Layout/ReconnectModal.razor.css" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Layout/ReconnectModal.razor.js" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Pages/Error.razor" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Pages/Home.razor" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/Pages/Home.razor" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Pages/Home.razor.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/Pages/Home.razor.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Pages/NotFound.razor" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/Pages/NotFound.razor" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/Routes.razor" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Components/_Imports.razor" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Components/_Imports.razor" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Data/Overview.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Data/Overview.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Data/PersonalInfo.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Data/PersonalInfo.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Data/Skills.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Data/Skills.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Data/WorkExperience.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Data/WorkExperience.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Program.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Program.cs" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Properties/launchSettings.json" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Properties/launchSettings.json" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Website.csproj" beforeDir="false" afterPath="$PROJECT_DIR$/Web/Web.csproj" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/Website.csproj.user" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/appsettings.Development.json" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/appsettings.Development.json" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/appsettings.json" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/appsettings.json" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/app.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/app.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/favicon.png" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/favicon.png" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.js" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/Website/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map" afterDir="false" />
|
||||||
|
</list>
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="EmbeddingIndexingInfo">
|
||||||
|
<option name="cachedIndexableFilesCount" value="3" />
|
||||||
|
<option name="fileBasedEmbeddingIndicesEnabled" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="HighlightingSettingsPerFile">
|
||||||
|
<setting file="file://$PROJECT_DIR$/Web/Components/Routes.razor" root0="FORCE_HIGHLIGHTING" root1="FORCE_HIGHLIGHTING" root2="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Web/Components/_Imports.razor" root0="FORCE_HIGHLIGHTING" root1="FORCE_HIGHLIGHTING" root2="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Web/Program.cs" root0="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Web/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map" root0="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Website/Components/App.razor" root0="SKIP_HIGHLIGHTING" root1="FORCE_HIGHLIGHTING" root2="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Website/Components/Routes.razor" root0="SKIP_HIGHLIGHTING" root1="FORCE_HIGHLIGHTING" root2="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Website/Components/_Imports.razor" root0="SKIP_HIGHLIGHTING" root1="FORCE_HIGHLIGHTING" root2="FORCE_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Website/Data/Overview.cs" root0="SKIP_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Website/Data/WorkExperience.cs" root0="SKIP_HIGHLIGHTING" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/Website/Program.cs" root0="SKIP_HIGHLIGHTING" />
|
||||||
|
</component>
|
||||||
|
<component name="McpProjectServerCommands">
|
||||||
|
<commands />
|
||||||
|
<urls />
|
||||||
|
</component>
|
||||||
|
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
|
||||||
|
<component name="NextEditCompletionFeaturesState">
|
||||||
|
<decayedCancelled>
|
||||||
|
<entry key="MS100" value="1.0000000000000009" />
|
||||||
|
<entry key="MS500" value="1.0050994901858847" />
|
||||||
|
<entry key="S2" value="4.101690328538105" />
|
||||||
|
<entry key="S5" value="19.018382043166984" />
|
||||||
|
<entry key="S10" value="39.71523121752031" />
|
||||||
|
<entry key="S30" value="72.90463246125027" />
|
||||||
|
<entry key="S60" value="87.20317227707109" />
|
||||||
|
<entry key="M2" value="99.81774420145119" />
|
||||||
|
<entry key="M5" value="120.50407654167986" />
|
||||||
|
<entry key="M10" value="135.04212796954374" />
|
||||||
|
<entry key="M15" value="141.5340735070901" />
|
||||||
|
<entry key="M30" value="149.11695120307738" />
|
||||||
|
<entry key="H1" value="153.38134378362767" />
|
||||||
|
<entry key="H2" value="155.64441439634584" />
|
||||||
|
<entry key="H4" value="156.81038608530915" />
|
||||||
|
<entry key="D1" value="157.80006692377847" />
|
||||||
|
<entry key="W1" value="157.9713970850689" />
|
||||||
|
</decayedCancelled>
|
||||||
|
<decayedSelected>
|
||||||
|
<entry key="MS100" value="0.0" />
|
||||||
|
<entry key="MS500" value="3.5782377544021416E-151" />
|
||||||
|
<entry key="S2" value="3.7471443324747387E-38" />
|
||||||
|
<entry key="S5" value="1.607388086562078E-15" />
|
||||||
|
<entry key="S10" value="5.690204080972909E-8" />
|
||||||
|
<entry key="S30" value="0.00687500510489259" />
|
||||||
|
<entry key="S60" value="0.14911159558544165" />
|
||||||
|
<entry key="M2" value="0.7817155485517258" />
|
||||||
|
<entry key="M5" value="2.301905292336947" />
|
||||||
|
<entry key="M10" value="3.3706858437997136" />
|
||||||
|
<entry key="M15" value="3.8383914503531655" />
|
||||||
|
<entry key="M30" value="4.377501612856021" />
|
||||||
|
<entry key="H1" value="4.677497605133485" />
|
||||||
|
<entry key="H2" value="4.835824025441964" />
|
||||||
|
<entry key="H4" value="4.917166365510947" />
|
||||||
|
<entry key="D1" value="4.986089580486071" />
|
||||||
|
<entry key="W1" value="4.998010213852367" />
|
||||||
|
</decayedSelected>
|
||||||
|
<decayedShown>
|
||||||
|
<entry key="MS100" value="0.9659363289248465" />
|
||||||
|
<entry key="MS500" value="0.9981385064135936" />
|
||||||
|
<entry key="S2" value="4.093396703074468" />
|
||||||
|
<entry key="S5" value="19.003594307431616" />
|
||||||
|
<entry key="S10" value="39.69964762624771" />
|
||||||
|
<entry key="S30" value="72.90062931350627" />
|
||||||
|
<entry key="S60" value="87.34342986497892" />
|
||||||
|
<entry key="M2" value="100.59054935669975" />
|
||||||
|
<entry key="M5" value="122.79879157618508" />
|
||||||
|
<entry key="M10" value="138.4080379148097" />
|
||||||
|
<entry key="M15" value="145.36894583326196" />
|
||||||
|
<entry key="M30" value="153.49250279445826" />
|
||||||
|
<entry key="H1" value="158.05781393879576" />
|
||||||
|
<entry key="H2" value="160.47971093163628" />
|
||||||
|
<entry key="H4" value="161.72728517901427" />
|
||||||
|
<entry key="D1" value="162.78611146171838" />
|
||||||
|
<entry key="W1" value="162.96940085199657" />
|
||||||
|
</decayedShown>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectColorInfo"><![CDATA[{
|
||||||
|
"associatedIndex": 6,
|
||||||
|
"fromUser": false
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectId" id="3J6G2pWKb6yAOf9g9caEG0zRCFB" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||||
|
"RunOnceActivity.MCP Project settings loaded": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"RunOnceActivity.cidr.known.project.marker": "true",
|
||||||
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
|
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
||||||
|
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
||||||
|
"cidr.known.project.marker": "true",
|
||||||
|
"codeWithMe.voiceChat.enabledByDefault": "false",
|
||||||
|
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
|
||||||
|
"git-widget-placeholder": "master",
|
||||||
|
"junie.onboarding.icon.badge.shown": "true",
|
||||||
|
"node.js.detected.package.eslint": "true",
|
||||||
|
"node.js.detected.package.tslint": "true",
|
||||||
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
|
"nodejs_package_manager_path": "npm",
|
||||||
|
"settings.editor.selected.configurable": "preferences.lookFeel",
|
||||||
|
"to.speed.mode.migration.done": "true"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="RunManager" selected=".NET Launch Settings Profile.Website: https">
|
||||||
|
<configuration name="Website.Client" type="DotNetProject" factoryName=".NET Project">
|
||||||
|
<option name="EXE_PATH" value="" />
|
||||||
|
<option name="PROGRAM_PARAMETERS" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="PASS_PARENT_ENVS" value="1" />
|
||||||
|
<option name="ENV_FILE_PATHS" value="" />
|
||||||
|
<option name="REDIRECT_INPUT_PATH" value="" />
|
||||||
|
<option name="MIXED_MODE_DEBUG" value="0" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
|
<option name="RUNTIME_ARGUMENTS" value="" />
|
||||||
|
<option name="AUTO_ATTACH_CHILDREN" value="0" />
|
||||||
|
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Website.Client/Website.Client.csproj" />
|
||||||
|
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||||
|
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||||
|
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||||
|
<option name="PROJECT_KIND" value="DotNetCore" />
|
||||||
|
<option name="PROJECT_TFM" value="" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Build" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
<configuration name="Website: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
|
||||||
|
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Website/Website.csproj" />
|
||||||
|
<option name="LAUNCH_PROFILE_TFM" value="net10.0" />
|
||||||
|
<option name="LAUNCH_PROFILE_NAME" value="http" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
|
<option name="RUNTIME_ARGUMENTS" value="" />
|
||||||
|
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
|
||||||
|
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
|
||||||
|
<option name="SEND_DEBUG_REQUEST" value="1" />
|
||||||
|
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
|
||||||
|
<option name="AUTO_ATTACH_CHILDREN" value="0" />
|
||||||
|
<option name="MIXED_MODE_DEBUG" value="0" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Build" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
<configuration name="Website: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
|
||||||
|
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Website/Website.csproj" />
|
||||||
|
<option name="LAUNCH_PROFILE_TFM" value="net10.0" />
|
||||||
|
<option name="LAUNCH_PROFILE_NAME" value="https" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
|
<option name="RUNTIME_ARGUMENTS" value="" />
|
||||||
|
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
|
||||||
|
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
|
||||||
|
<option name="SEND_DEBUG_REQUEST" value="1" />
|
||||||
|
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
|
||||||
|
<option name="AUTO_ATTACH_CHILDREN" value="0" />
|
||||||
|
<option name="MIXED_MODE_DEBUG" value="0" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Build" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="95e2bd25-4260-499e-9561-08c9bd005d95" name="Changes" comment="" />
|
||||||
|
<created>1788973899895</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1788973899895</updated>
|
||||||
|
<workItem from="1788973902958" duration="1320000" />
|
||||||
|
</task>
|
||||||
|
<task id="LOCAL-00001" summary="Resume update">
|
||||||
|
<option name="closed" value="true" />
|
||||||
|
<created>1788974571977</created>
|
||||||
|
<option name="number" value="00001" />
|
||||||
|
<option name="presentableId" value="LOCAL-00001" />
|
||||||
|
<option name="project" value="LOCAL" />
|
||||||
|
<updated>1788974571977</updated>
|
||||||
|
</task>
|
||||||
|
<task id="LOCAL-00002" summary="...">
|
||||||
|
<option name="closed" value="true" />
|
||||||
|
<created>1788974584246</created>
|
||||||
|
<option name="number" value="00002" />
|
||||||
|
<option name="presentableId" value="LOCAL-00002" />
|
||||||
|
<option name="project" value="LOCAL" />
|
||||||
|
<updated>1788974584247</updated>
|
||||||
|
</task>
|
||||||
|
<option name="localTasksCounter" value="3" />
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="3" />
|
||||||
|
</component>
|
||||||
|
<component name="UnityCheckinConfiguration" checkUnsavedScenes="true" />
|
||||||
|
<component name="UnityProjectConfiguration" hasMinimizedUI="false" />
|
||||||
|
<component name="VcsManagerConfiguration">
|
||||||
|
<MESSAGE value="Resume update" />
|
||||||
|
<MESSAGE value="..." />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value="..." />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
---
|
||||||
|
sessionId: session-260909-131140-mwcu
|
||||||
|
---
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
|
||||||
|
### Overview & Goals
|
||||||
|
The objective of this task is to rename the `Website` project to `Web` and migrate it from an ASP.NET Core server-hosted Blazor model to a Blazor Standalone (client-side WebAssembly) application.
|
||||||
|
|
||||||
|
Converting the resume website to a standalone WebAssembly client maximizes practical utility:
|
||||||
|
- **Zero Server Overhead:** Eliminates the ongoing cost, server compute requirements, and connection state management of Blazor Server.
|
||||||
|
- **Reliability & Availability:** Removes SignalR disconnection fragility for users viewing the resume, ensuring seamless offline and low-bandwidth reading.
|
||||||
|
- **Static Hostability:** Allows the build output to be deployed to any high-efficiency static storage or CDN provider (e.g., GitHub Pages, Cloudflare Pages, Azure Static Web Apps, AWS S3).
|
||||||
|
- **Naming Consistency:** Unifies the repository naming conventions around `Web`.
|
||||||
|
|
||||||
|
### Scope
|
||||||
|
#### In Scope
|
||||||
|
- Rename folder `Website` to `Web` and project file `Website.csproj` to `Web.csproj`.
|
||||||
|
- Update solution configuration `Resume.slnx`.
|
||||||
|
- Refactor all namespaces from `Website.*` to `Web.*`.
|
||||||
|
- Change project SDK to `Microsoft.NET.Sdk.BlazorWebAssembly`.
|
||||||
|
- Replace server package dependencies with `Microsoft.AspNetCore.Components.WebAssembly` and `Microsoft.AspNetCore.Components.WebAssembly.DevServer`.
|
||||||
|
- Add `wwwroot/index.html` as the host document.
|
||||||
|
- Migrate `Program.cs` to `WebAssemblyHostBuilder`.
|
||||||
|
- Convert `App.razor` to client router structure and purge server-only components (`ReconnectModal`, server-bound `Error.razor`).
|
||||||
|
- Update scoped CSS stylesheet references to `Web.styles.css`.
|
||||||
|
|
||||||
|
#### Out of Scope
|
||||||
|
- Altering the resume data models (`Overview.cs`, `PersonalInfo.cs`, `Skills.cs`, `WorkExperience.cs`) or resume content.
|
||||||
|
- Visual restyling of `Home.razor` or `MainLayout.razor`.
|
||||||
|
|
||||||
|
### User Stories
|
||||||
|
- As a recruiter or hiring manager viewing the resume, I want instant page load and resilient navigation without connection drops or server lag so that I can evaluate candidate qualifications smoothly.
|
||||||
|
- As a developer maintaining the site, I want a lightweight static client structure with clean `Web` naming so that deployment pipelines and local iteration are simple, cheap, and efficient.
|
||||||
|
|
||||||
|
### Functional Requirements
|
||||||
|
- The project must build and run successfully via `dotnet build` and `dotnet run`.
|
||||||
|
- Navigating to `/` must render the resume content (`Home.razor`) through `MainLayout.razor`.
|
||||||
|
- Navigating to undefined routes must display the not-found view (`NotFound.razor` / `<NotFound>`).
|
||||||
|
- Client asset loading (Bootstrap, `app.css`, scoped CSS, favicon) must resolve properly without 404 errors.
|
||||||
|
|
||||||
|
### Non-Functional Requirements
|
||||||
|
- **Efficiency:** The published output must consist strictly of static assets (WASM binaries, HTML, CSS, JS) suitable for edge distribution.
|
||||||
|
- **Compatibility:** Targets .NET 10.0 runtime with modern browser support.
|
||||||
|
|
||||||
|
# Technical Design
|
||||||
|
|
||||||
|
### Current Implementation
|
||||||
|
The application currently resides in directory `Website/` with project file `Website/Website.csproj` using `Microsoft.NET.Sdk.Web` on `net10.0`. It utilizes server-side interactive Razor Components with `WebApplication` builder, server routing, and `ReconnectModal` for SignalR circuit reconnections.
|
||||||
|
|
||||||
|
### Key Decisions
|
||||||
|
- **SDK & Package Strategy:** Transition from `Microsoft.NET.Sdk.Web` to `Microsoft.NET.Sdk.BlazorWebAssembly`. Remove `Microsoft.AspNetCore.Components.WebAssembly.Server` and install `Microsoft.AspNetCore.Components.WebAssembly` with `Microsoft.AspNetCore.Components.WebAssembly.DevServer` for seamless local debugging.
|
||||||
|
- **Client Host Document (`index.html`):** In standalone Blazor, the host page is `wwwroot/index.html` rather than `App.razor`. `index.html` will contain `#app` mount point, fallback loader, and script reference to `_framework/blazor.webassembly.js`.
|
||||||
|
- **Component Hierarchy:** Convert `App.razor` to contain the root `<Router>` component, delegating page rendering to `MainLayout` and pages.
|
||||||
|
- **Server Artifact Deletion:** Cleanly delete `ReconnectModal.razor` / `.css` / `.js` (SignalR circuit reconnects) and ASP.NET Core server-dependent `Error.razor` (`HttpContext.TraceIdentifier`).
|
||||||
|
|
||||||
|
### Proposed Changes
|
||||||
|
|
||||||
|
```
|
||||||
|
C:\Users\jonmc\Resume
|
||||||
|
├── Resume.slnx (Updated project path to Web/Web.csproj)
|
||||||
|
└── Web/ (Renamed from Website/)
|
||||||
|
├── Components/
|
||||||
|
│ ├── Layout/
|
||||||
|
│ │ ├── MainLayout.razor
|
||||||
|
│ │ └── MainLayout.razor.css
|
||||||
|
│ ├── Pages/
|
||||||
|
│ │ ├── Home.razor (Updated namespace Web.Data)
|
||||||
|
│ │ ├── Home.razor.css
|
||||||
|
│ │ └── NotFound.razor
|
||||||
|
│ ├── App.razor (Converted to client Router root)
|
||||||
|
│ └── _Imports.razor (Updated usings to Web.*)
|
||||||
|
├── Data/ (Updated namespaces to Web.Data)
|
||||||
|
│ ├── Overview.cs
|
||||||
|
│ ├── PersonalInfo.cs
|
||||||
|
│ ├── Skills.cs
|
||||||
|
│ └── WorkExperience.cs
|
||||||
|
├── Properties/
|
||||||
|
│ └── launchSettings.json (Updated profiles for WebAssembly dev server)
|
||||||
|
├── wwwroot/
|
||||||
|
│ ├── index.html (Added client host document)
|
||||||
|
│ ├── app.css
|
||||||
|
│ ├── favicon.png
|
||||||
|
│ └── lib/bootstrap/...
|
||||||
|
├── Program.cs (WebAssemblyHostBuilder startup)
|
||||||
|
└── Web.csproj (Renamed & converted to BlazorWebAssembly SDK)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Models & Contracts
|
||||||
|
Data classes remain statically available under `Web.Data`:
|
||||||
|
- `Web.Data.Overview.Get()` -> `Overview.Data`
|
||||||
|
- `Web.Data.PersonalInfo.Get()` -> `PersonalInfo.Data`
|
||||||
|
- `Web.Data.Skills.Get()` -> `Skills.Data`
|
||||||
|
- `Web.Data.WorkExperience.Get()` -> `WorkExperience.Data`
|
||||||
|
|
||||||
|
### Entry Point Contract (`Web/Program.cs`)
|
||||||
|
```csharp
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||||
|
using Web;
|
||||||
|
|
||||||
|
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) });
|
||||||
|
|
||||||
|
await builder.Build().RunAsync();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Root Host Document (`Web/wwwroot/index.html`)
|
||||||
|
```html
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Jonathan McCaffrey - Resume</title>
|
||||||
|
<base href="/" />
|
||||||
|
<link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.min.css" />
|
||||||
|
<link rel="stylesheet" href="app.css" />
|
||||||
|
<link rel="stylesheet" href="Web.styles.css" />
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png" />
|
||||||
|
<HeadOutlet />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="app">
|
||||||
|
<svg class="loading-progress">
|
||||||
|
<circle r="40%" cx="50%" cy="50%" />
|
||||||
|
<circle r="40%" cx="50%" cy="50%" />
|
||||||
|
</svg>
|
||||||
|
<div class="loading-progress-text"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="blazor-error-ui">
|
||||||
|
An unhandled error has occurred.
|
||||||
|
<a href="." class="reload">Reload</a>
|
||||||
|
<span class="dismiss">🗙</span>
|
||||||
|
</div>
|
||||||
|
<script src="_framework/blazor.webassembly.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Project File Contract (`Web/Web.csproj`)
|
||||||
|
```xml
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<RootNamespace>Web</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.6" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.6" PrivateAssets="all" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
```
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
|
||||||
|
### Validation Approach
|
||||||
|
Verification focuses on compilation integrity, project file correctness, client asset resolution, and routing fidelity under the standalone execution model.
|
||||||
|
|
||||||
|
### Key Scenarios
|
||||||
|
- **Build Verification:** Run `dotnet build` on `Resume.slnx` and `Web/Web.csproj` to confirm zero compilation warnings or errors across the new namespaces.
|
||||||
|
- **Startup Execution:** Launch the project via `dotnet run --project Web/Web.csproj` and verify that the development server starts up cleanly on the configured localhost port.
|
||||||
|
- **Root Page Rendering (`/`):** Verify `index.html` loads, WebAssembly runtime bootstraps `App.razor`, and `Home.razor` displays Jonathan McCaffrey's overview, contact info, skills, and work experience.
|
||||||
|
- **Routing & Not Found (`/invalid-path`):** Verify that navigating to unmapped routes renders the `NotFound` component inside `MainLayout`.
|
||||||
|
- **Static Assets Integrity:** Check that Bootstrap, `app.css`, `Web.styles.css`, and `favicon.png` are returned with HTTP 200 responses.
|
||||||
|
|
||||||
|
### Edge Cases
|
||||||
|
- Scoped CSS bundle path changes (`Website.styles.css` -> `Web.styles.css`) properly reflected in `index.html`.
|
||||||
|
- No lingering references to `Website` in usings, project configurations, or solution metadata.
|
||||||
|
- Clean removal of `ReconnectModal` and `Error.razor` without dangling references in `App.razor` or `_Imports.razor`.
|
||||||
|
|
||||||
|
# Delivery Steps
|
||||||
|
|
||||||
|
### ✓ Step 1: Rename project files, solution references, and namespace declarations
|
||||||
|
The project directory, project file, solution definition, and all source namespaces are unified under `Web`.
|
||||||
|
|
||||||
|
- Rename the directory `Website` to `Web` and rename `Website.csproj` to `Web.csproj`.
|
||||||
|
- Update the solution file `Resume.slnx` to reference `Web/Web.csproj` instead of `Website/Website.csproj`.
|
||||||
|
- Update the `<RootNamespace>` in `Web.csproj` to `Web`.
|
||||||
|
- Refactor all C# namespace declarations in `Web/Data/Overview.cs`, `Web/Data/PersonalInfo.cs`, `Web/Data/Skills.cs`, and `Web/Data/WorkExperience.cs` from `Website.Data` to `Web.Data`.
|
||||||
|
- Refactor `@using Website.*` statements across `Web/Components/_Imports.razor`, `Web/Components/Pages/Home.razor`, and `Web/Program.cs` to `Web.*`.
|
||||||
|
- Update scoped CSS bundle link references from `Website.styles.css` to `Web.styles.css`.
|
||||||
|
|
||||||
|
### ✓ Step 2: Convert project SDK and package dependencies to Blazor Standalone
|
||||||
|
The project file is configured as a standalone Blazor WebAssembly application with client-side runtime packages and tooling.
|
||||||
|
|
||||||
|
- Update the project SDK in `Web.csproj` from `Microsoft.NET.Sdk.Web` to `Microsoft.NET.Sdk.BlazorWebAssembly`.
|
||||||
|
- Remove the server hosting package `Microsoft.AspNetCore.Components.WebAssembly.Server`.
|
||||||
|
- Add `Microsoft.AspNetCore.Components.WebAssembly` (version `10.0.*`) as a runtime package reference.
|
||||||
|
- Add `Microsoft.AspNetCore.Components.WebAssembly.DevServer` (version `10.0.*`, `PrivateAssets="all"`) for local development execution.
|
||||||
|
- Update `Web/Properties/launchSettings.json` to streamline local development profiles with the WebAssembly debug proxy and browser launch.
|
||||||
|
|
||||||
|
### ✓ Step 3: Restructure client entry point, HTML host, and Blazor component hierarchy
|
||||||
|
The application boots as a client-side WebAssembly single-page application using `index.html` and `WebAssemblyHostBuilder`.
|
||||||
|
|
||||||
|
- Create `Web/wwwroot/index.html` with root mounting target `#app`, `<HeadOutlet />` integration, static stylesheet references, and `_framework/blazor.webassembly.js`.
|
||||||
|
- Rewrite `Web/Program.cs` to initialize `WebAssemblyHostBuilder.CreateDefault(args)`, mount `App` to `#app` and `HeadOutlet` to `head::after`, configure standard scoped `HttpClient`, and execute `await builder.Build().RunAsync()`.
|
||||||
|
- Update `Web/Components/App.razor` to act as the client component router containing `<Router>`, `<Found>`, and `<NotFound>` definitions.
|
||||||
|
- Remove server-specific artifacts that are obsolete in standalone mode: `Web/Components/Layout/ReconnectModal.razor`, `ReconnectModal.razor.css`, `ReconnectModal.razor.js`, and `Web/Components/Pages/Error.razor`.
|
||||||
|
- Clean up `Web/Components/_Imports.razor` to remove server render-mode directives and include client WebAssembly namespaces.
|
||||||
|
- Move or verify client configuration files in `Web/wwwroot/` if required for client settings.
|
||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
<Solution>
|
<Solution>
|
||||||
<Project Path="Website/Website.csproj" />
|
<Project Path="Web/Web.csproj" />
|
||||||
</Solution>
|
</Solution>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<Router AppAssembly="@typeof(Program).Assembly">
|
||||||
|
<Found Context="routeData">
|
||||||
|
<RouteView RouteData="@routeData" DefaultLayout="@typeof(Layout.MainLayout)" />
|
||||||
|
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
|
||||||
|
</Found>
|
||||||
|
<NotFound>
|
||||||
|
<PageTitle>Not found</PageTitle>
|
||||||
|
<LayoutView Layout="@typeof(Layout.MainLayout)">
|
||||||
|
<p role="alert">Sorry, there's nothing at this address.</p>
|
||||||
|
</LayoutView>
|
||||||
|
</NotFound>
|
||||||
|
</Router>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
@page "/"
|
@page "/"
|
||||||
|
|
||||||
@using Website.Data
|
@using Web.Data
|
||||||
|
|
||||||
<div class="page">
|
<div class="page">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
@@ -3,9 +3,9 @@
|
|||||||
@using Microsoft.AspNetCore.Components.Forms
|
@using Microsoft.AspNetCore.Components.Forms
|
||||||
@using Microsoft.AspNetCore.Components.Routing
|
@using Microsoft.AspNetCore.Components.Routing
|
||||||
@using Microsoft.AspNetCore.Components.Web
|
@using Microsoft.AspNetCore.Components.Web
|
||||||
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
|
||||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||||
|
@using Microsoft.AspNetCore.Components.WebAssembly.Http
|
||||||
@using Microsoft.JSInterop
|
@using Microsoft.JSInterop
|
||||||
@using Website
|
@using Web
|
||||||
@using Website.Components
|
@using Web.Components
|
||||||
@using Website.Components.Layout
|
@using Web.Components.Layout
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Website.Data;
|
namespace Web.Data;
|
||||||
|
|
||||||
public static class Overview
|
public static class Overview
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Website.Data;
|
namespace Web.Data;
|
||||||
|
|
||||||
public static class PersonalInfo
|
public static class PersonalInfo
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Website.Data;
|
namespace Web.Data;
|
||||||
|
|
||||||
public static class Skills
|
public static class Skills
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Website.Data;
|
namespace Web.Data;
|
||||||
|
|
||||||
public static class WorkExperience
|
public static class WorkExperience
|
||||||
{
|
{
|
||||||
@@ -46,12 +46,6 @@ public static class WorkExperience
|
|||||||
IsVisible = true
|
IsVisible = true
|
||||||
},
|
},
|
||||||
new Point
|
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 Point
|
|
||||||
{
|
{
|
||||||
Description = "Created an Azure DevOps pipeline to automate taking snapshots of the database schema to be aware of changes from multiple teams altering the database.",
|
Description = "Created an Azure DevOps pipeline to automate taking snapshots of the database schema to be aware of changes from multiple teams altering the database.",
|
||||||
IsVisible = true
|
IsVisible = true
|
||||||
@@ -97,7 +91,7 @@ public static class WorkExperience
|
|||||||
new Point
|
new Point
|
||||||
{
|
{
|
||||||
Description =
|
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 popular.",
|
"Came to the conclusion that I wanted to focus my career on .NET, and left the company to pursue Blazor research and C# opportunities. Unfortunately, Blazor development isn't popular.",
|
||||||
IsVisible = true
|
IsVisible = true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||||
|
using Web.Components;
|
||||||
|
|
||||||
|
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) });
|
||||||
|
|
||||||
|
await builder.Build().RunAsync();
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
|
<RootNamespace>Web</RootNamespace>
|
||||||
<RootNamespace>Website</RootNamespace>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.6" />
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.6" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.6" PrivateAssets="all" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -57,4 +57,58 @@ h1:focus {
|
|||||||
|
|
||||||
.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
|
.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
|
||||||
text-align: start;
|
text-align: start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#blazor-error-ui {
|
||||||
|
color-scheme: light only;
|
||||||
|
background: lightyellow;
|
||||||
|
bottom: 0;
|
||||||
|
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
|
||||||
|
box-sizing: border-box;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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...");
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,33 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Jonathan McCaffrey - Resume</title>
|
||||||
|
<base href="/" />
|
||||||
|
<link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.min.css" />
|
||||||
|
<link rel="stylesheet" href="app.css" />
|
||||||
|
<link rel="stylesheet" href="Web.styles.css" />
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png" />
|
||||||
|
<HeadOutlet />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="app">
|
||||||
|
<svg class="loading-progress">
|
||||||
|
<circle r="40%" cx="50%" cy="50%" />
|
||||||
|
<circle r="40%" cx="50%" cy="50%" />
|
||||||
|
</svg>
|
||||||
|
<div class="loading-progress-text"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="blazor-error-ui">
|
||||||
|
An unhandled error has occurred.
|
||||||
|
<a href="." class="reload">Reload</a>
|
||||||
|
<span class="dismiss">🗙</span>
|
||||||
|
</div>
|
||||||
|
<script src="_framework/blazor.webassembly.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
Vendored
@@ -1,23 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<base href="/" />
|
|
||||||
<ResourcePreloader />
|
|
||||||
<link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" />
|
|
||||||
<link rel="stylesheet" href="@Assets["app.css"]" />
|
|
||||||
<link rel="stylesheet" href="@Assets["Website.styles.css"]" />
|
|
||||||
<ImportMap />
|
|
||||||
<link rel="icon" type="image/png" href="favicon.png" />
|
|
||||||
<HeadOutlet />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<Routes />
|
|
||||||
<ReconnectModal />
|
|
||||||
<script src="@Assets["_framework/blazor.web.js"]"></script>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<script type="module" src="@Assets["Components/Layout/ReconnectModal.razor.js"]"></script>
|
|
||||||
|
|
||||||
<dialog id="components-reconnect-modal" data-nosnippet>
|
|
||||||
<div class="components-reconnect-container">
|
|
||||||
<div class="components-rejoining-animation" aria-hidden="true">
|
|
||||||
<div></div>
|
|
||||||
<div></div>
|
|
||||||
</div>
|
|
||||||
<p class="components-reconnect-first-attempt-visible">
|
|
||||||
Rejoining the server...
|
|
||||||
</p>
|
|
||||||
<p class="components-reconnect-repeated-attempt-visible">
|
|
||||||
Rejoin failed... trying again in <span id="components-seconds-to-next-attempt"></span> seconds.
|
|
||||||
</p>
|
|
||||||
<p class="components-reconnect-failed-visible">
|
|
||||||
Failed to rejoin.<br />Please retry or reload the page.
|
|
||||||
</p>
|
|
||||||
<button id="components-reconnect-button" class="components-reconnect-failed-visible">
|
|
||||||
Retry
|
|
||||||
</button>
|
|
||||||
<p class="components-pause-visible">
|
|
||||||
The session has been paused by the server.
|
|
||||||
</p>
|
|
||||||
<p class="components-resume-failed-visible">
|
|
||||||
Failed to resume the session.<br />Please retry or reload the page.
|
|
||||||
</p>
|
|
||||||
<button id="components-resume-button" class="components-pause-visible components-resume-failed-visible">
|
|
||||||
Resume
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</dialog>
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
.components-reconnect-first-attempt-visible,
|
|
||||||
.components-reconnect-repeated-attempt-visible,
|
|
||||||
.components-reconnect-failed-visible,
|
|
||||||
.components-pause-visible,
|
|
||||||
.components-resume-failed-visible,
|
|
||||||
.components-rejoining-animation {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible,
|
|
||||||
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation,
|
|
||||||
#components-reconnect-modal.components-reconnect-paused .components-pause-visible,
|
|
||||||
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible,
|
|
||||||
#components-reconnect-modal.components-reconnect-retrying,
|
|
||||||
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible,
|
|
||||||
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation,
|
|
||||||
#components-reconnect-modal.components-reconnect-failed,
|
|
||||||
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#components-reconnect-modal {
|
|
||||||
background-color: white;
|
|
||||||
width: 20rem;
|
|
||||||
margin: 20vh auto;
|
|
||||||
padding: 2rem;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
|
|
||||||
opacity: 0;
|
|
||||||
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
|
|
||||||
animation: components-reconnect-modal-fadeOutOpacity 0.5s both;
|
|
||||||
&[open]
|
|
||||||
|
|
||||||
{
|
|
||||||
animation: components-reconnect-modal-slideUp 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity 0.5s ease-in-out 0.3s;
|
|
||||||
animation-fill-mode: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-reconnect-modal::backdrop {
|
|
||||||
background-color: rgba(0, 0, 0, 0.4);
|
|
||||||
animation: components-reconnect-modal-fadeInOpacity 0.5s ease-in-out;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes components-reconnect-modal-slideUp {
|
|
||||||
0% {
|
|
||||||
transform: translateY(30px) scale(0.95);
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes components-reconnect-modal-fadeInOpacity {
|
|
||||||
0% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes components-reconnect-modal-fadeOutOpacity {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.components-reconnect-container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
gap: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-reconnect-modal p {
|
|
||||||
margin: 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-reconnect-modal button {
|
|
||||||
border: 0;
|
|
||||||
background-color: #6b9ed2;
|
|
||||||
color: white;
|
|
||||||
padding: 4px 24px;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-reconnect-modal button:hover {
|
|
||||||
background-color: #3b6ea2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-reconnect-modal button:active {
|
|
||||||
background-color: #6b9ed2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.components-rejoining-animation {
|
|
||||||
position: relative;
|
|
||||||
width: 80px;
|
|
||||||
height: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.components-rejoining-animation div {
|
|
||||||
position: absolute;
|
|
||||||
border: 3px solid #0087ff;
|
|
||||||
opacity: 1;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: components-rejoining-animation 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.components-rejoining-animation div:nth-child(2) {
|
|
||||||
animation-delay: -0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes components-rejoining-animation {
|
|
||||||
0% {
|
|
||||||
top: 40px;
|
|
||||||
left: 40px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
4.9% {
|
|
||||||
top: 40px;
|
|
||||||
left: 40px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
5% {
|
|
||||||
top: 40px;
|
|
||||||
left: 40px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
width: 80px;
|
|
||||||
height: 80px;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
// Set up event handlers
|
|
||||||
const reconnectModal = document.getElementById("components-reconnect-modal");
|
|
||||||
reconnectModal.addEventListener("components-reconnect-state-changed", handleReconnectStateChanged);
|
|
||||||
|
|
||||||
const retryButton = document.getElementById("components-reconnect-button");
|
|
||||||
retryButton.addEventListener("click", retry);
|
|
||||||
|
|
||||||
const resumeButton = document.getElementById("components-resume-button");
|
|
||||||
resumeButton.addEventListener("click", resume);
|
|
||||||
|
|
||||||
function handleReconnectStateChanged(event) {
|
|
||||||
if (event.detail.state === "show") {
|
|
||||||
reconnectModal.showModal();
|
|
||||||
} else if (event.detail.state === "hide") {
|
|
||||||
reconnectModal.close();
|
|
||||||
} else if (event.detail.state === "failed") {
|
|
||||||
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
|
||||||
} else if (event.detail.state === "rejected") {
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function retry() {
|
|
||||||
document.removeEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Reconnect will asynchronously return:
|
|
||||||
// - true to mean success
|
|
||||||
// - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)
|
|
||||||
// - exception to mean we didn't reach the server (this can be sync or async)
|
|
||||||
const successful = await Blazor.reconnect();
|
|
||||||
if (!successful) {
|
|
||||||
// We have been able to reach the server, but the circuit is no longer available.
|
|
||||||
// We'll reload the page so the user can continue using the app as quickly as possible.
|
|
||||||
const resumeSuccessful = await Blazor.resumeCircuit();
|
|
||||||
if (!resumeSuccessful) {
|
|
||||||
location.reload();
|
|
||||||
} else {
|
|
||||||
reconnectModal.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// We got an exception, server is currently unavailable
|
|
||||||
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function resume() {
|
|
||||||
try {
|
|
||||||
const successful = await Blazor.resumeCircuit();
|
|
||||||
if (!successful) {
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
reconnectModal.classList.replace("components-reconnect-paused", "components-reconnect-resume-failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function retryWhenDocumentBecomesVisible() {
|
|
||||||
if (document.visibilityState === "visible") {
|
|
||||||
await retry();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
@page "/Error"
|
|
||||||
@using System.Diagnostics
|
|
||||||
|
|
||||||
<PageTitle>Error</PageTitle>
|
|
||||||
|
|
||||||
<h1 class="text-danger">Error.</h1>
|
|
||||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
|
||||||
|
|
||||||
@if (ShowRequestId)
|
|
||||||
{
|
|
||||||
<p>
|
|
||||||
<strong>Request ID:</strong> <code>@RequestId</code>
|
|
||||||
</p>
|
|
||||||
}
|
|
||||||
|
|
||||||
<h3>Development Mode</h3>
|
|
||||||
<p>
|
|
||||||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
|
||||||
It can result in displaying sensitive information from exceptions to end users.
|
|
||||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
|
||||||
and restarting the app.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
@code{
|
|
||||||
[CascadingParameter]
|
|
||||||
private HttpContext? HttpContext { get; set; }
|
|
||||||
|
|
||||||
private string? RequestId { get; set; }
|
|
||||||
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
|
||||||
|
|
||||||
protected override void OnInitialized() =>
|
|
||||||
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<Router AppAssembly="typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
|
|
||||||
<Found Context="routeData">
|
|
||||||
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
|
|
||||||
<FocusOnNavigate RouteData="routeData" Selector="h1" />
|
|
||||||
</Found>
|
|
||||||
</Router>
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using Website.Components;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
|
|
||||||
// Add services to the container.
|
|
||||||
builder.Services.AddRazorComponents()
|
|
||||||
.AddInteractiveServerComponents()
|
|
||||||
.AddInteractiveWebAssemblyComponents();
|
|
||||||
|
|
||||||
var app = builder.Build();
|
|
||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
|
||||||
if (app.Environment.IsDevelopment())
|
|
||||||
{
|
|
||||||
app.UseWebAssemblyDebugging();
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
app.UseExceptionHandler("/Error", createScopeForErrors: true);
|
|
||||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
|
||||||
app.UseHsts();
|
|
||||||
}
|
|
||||||
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
|
|
||||||
app.UseHttpsRedirection();
|
|
||||||
|
|
||||||
app.UseAntiforgery();
|
|
||||||
|
|
||||||
app.MapStaticAssets();
|
|
||||||
app.MapRazorComponents<App>()
|
|
||||||
.AddInteractiveServerRenderMode()
|
|
||||||
.AddInteractiveWebAssemblyRenderMode();
|
|
||||||
|
|
||||||
app.Run();
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ActiveDebugProfile>https</ActiveDebugProfile>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
Reference in New Issue
Block a user