-
Notifications
You must be signed in to change notification settings - Fork 2k
Update Blazor Hybrid template to match ASP.NET Core Blazor Web template #17946
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,7 @@ | ||
| { | ||
| "author": "Microsoft", | ||
| "name": ".NET MAUI Blazor App", | ||
| "description": "A project for creating a .NET MAUI application for iOS, Android, Mac Catalyst, WinUI, and Tizen using Blazor", | ||
| "name": ".NET MAUI Blazor Hybrid App", | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This wasn't really part of this change, but the build auto-updates this file. Looks like it should have been already updated due to some earlier change, but somehow wasn't. Might as well get the change in here. |
||
| "description": "A project for creating a .NET MAUI application for iOS, Android, Mac Catalyst, WinUI, and Tizen using Blazor Hybrid", | ||
| "postActions/openInEditor/description": "Opens Pages/Index.razor in the editor.", | ||
| "symbols/applicationId/description": "Overrides the $(ApplicationId) in the project", | ||
| "symbols/Framework/description": "The target framework for the project.", | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| <div class="top-row ps-3 navbar navbar-dark"> | ||
| <div class="container-fluid"> | ||
| <a class="navbar-brand" href="">BlazorWeb-CSharp</a> | ||
| </div> | ||
| </div> | ||
|
|
||
| <input type="checkbox" title="Navigation menu" class="navbar-toggler" /> | ||
|
|
||
| <div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()"> | ||
| <nav class="flex-column"> | ||
| <div class="nav-item px-3"> | ||
| <NavLink class="nav-link" href="" Match="NavLinkMatch.All"> | ||
| <span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home | ||
| </NavLink> | ||
| </div> | ||
| <div class="nav-item px-3"> | ||
| <NavLink class="nav-link" href="counter"> | ||
| <span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter | ||
| </NavLink> | ||
| </div> | ||
| <div class="nav-item px-3"> | ||
| <NavLink class="nav-link" href="weather"> | ||
| <span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather | ||
| </NavLink> | ||
| </div> | ||
| </nav> | ||
| </div> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,101 @@ | ||
| .navbar-toggler { | ||
| appearance: none; | ||
| cursor: pointer; | ||
| width: 3.5rem; | ||
| height: 2.5rem; | ||
| color: white; | ||
| position: absolute; | ||
| top: 0.5rem; | ||
| right: 1rem; | ||
| border: 1px solid rgba(255, 255, 255, 0.1); | ||
| background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); | ||
| } | ||
|
|
||
| .navbar-toggler:checked { | ||
| background-color: rgba(255, 255, 255, 0.5); | ||
| } | ||
|
|
||
| .top-row { | ||
| height: 3.5rem; | ||
| background-color: rgba(0,0,0,0.4); | ||
| } | ||
|
|
||
| .navbar-brand { | ||
| font-size: 1.1rem; | ||
| } | ||
|
|
||
| .bi { | ||
| display: inline-block; | ||
| position: relative; | ||
| width: 1.25rem; | ||
| height: 1.25rem; | ||
| margin-right: 0.75rem; | ||
| top: -1px; | ||
| background-size: cover; | ||
| } | ||
|
|
||
| .bi-house-door-fill-nav-menu { | ||
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); | ||
| } | ||
|
|
||
| .bi-plus-square-fill-nav-menu { | ||
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); | ||
| } | ||
|
|
||
| .bi-list-nested-nav-menu { | ||
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); | ||
| } | ||
|
|
||
| .nav-item { | ||
| font-size: 0.9rem; | ||
| padding-bottom: 0.5rem; | ||
| } | ||
|
|
||
| .nav-item:first-of-type { | ||
| padding-top: 1rem; | ||
| } | ||
|
|
||
| .nav-item:last-of-type { | ||
| padding-bottom: 1rem; | ||
| } | ||
|
|
||
| .nav-item ::deep a { | ||
| color: #d7d7d7; | ||
| border-radius: 4px; | ||
| height: 3rem; | ||
| display: flex; | ||
| align-items: center; | ||
| line-height: 3rem; | ||
| } | ||
|
|
||
| .nav-item ::deep a.active { | ||
| background-color: rgba(255,255,255,0.37); | ||
| color: white; | ||
| } | ||
|
|
||
| .nav-item ::deep a:hover { | ||
| background-color: rgba(255,255,255,0.1); | ||
| color: white; | ||
| } | ||
|
|
||
| .nav-scrollable { | ||
| display: none; | ||
| } | ||
|
|
||
| .navbar-toggler:checked ~ .nav-scrollable { | ||
| display: block; | ||
| } | ||
|
|
||
| @media (min-width: 641px) { | ||
| .navbar-toggler { | ||
| display: none; | ||
| } | ||
|
|
||
| .nav-scrollable { | ||
| /* Never collapse the sidebar for wide screens */ | ||
| display: block; | ||
| /* Allow sidebar to scroll for tall menus */ | ||
| height: calc(100vh - 3.5rem); | ||
| overflow-y: auto; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| @page "/weather" | ||
|
|
||
| <h1>Weather</h1> | ||
|
|
||
| <p>This component demonstrates showing data.</p> | ||
|
|
||
| @if (forecasts == null) | ||
| { | ||
| <p><em>Loading...</em></p> | ||
| } | ||
| else | ||
| { | ||
| <table class="table"> | ||
| <thead> | ||
| <tr> | ||
| <th>Date</th> | ||
| <th>Temp. (C)</th> | ||
| <th>Temp. (F)</th> | ||
| <th>Summary</th> | ||
| </tr> | ||
| </thead> | ||
| <tbody> | ||
| @foreach (var forecast in forecasts) | ||
| { | ||
| <tr> | ||
| <td>@forecast.Date.ToShortDateString()</td> | ||
| <td>@forecast.TemperatureC</td> | ||
| <td>@forecast.TemperatureF</td> | ||
| <td>@forecast.Summary</td> | ||
| </tr> | ||
| } | ||
| </tbody> | ||
| </table> | ||
| } | ||
|
|
||
| @code { | ||
| private WeatherForecast[] forecasts; | ||
|
|
||
| protected override async Task OnInitializedAsync() | ||
| { | ||
| // Simulate asynchronous loading to demonstrate a loading indicator | ||
| await Task.Delay(500); | ||
|
|
||
| var startDate = DateOnly.FromDateTime(DateTime.Now); | ||
| var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; | ||
| forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast | ||
| { | ||
| Date = startDate.AddDays(index), | ||
| TemperatureC = Random.Shared.Next(-20, 55), | ||
| Summary = summaries[Random.Shared.Next(summaries.Length)] | ||
| }).ToArray(); | ||
| } | ||
|
|
||
| private class WeatherForecast | ||
| { | ||
| public DateOnly Date { get; set; } | ||
| public int TemperatureC { get; set; } | ||
| public string Summary { get; set; } | ||
| public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); | ||
| } | ||
| } |
This file was deleted.
This file was deleted.
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does mean you really can only have Blazor components with component specific styles (.razor.css) in these folders?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe so, at least, that's what it originally was for. But in the intervening years no one has ever complained about it even once...
Having said that, I'm not entirely sure it's necessary, but I feel it's quite safe to add (that is, it shouldn't cause any harm, and at most should help some scenarios).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does the same thing appear on lines 73 and 95? Is that an accident?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The top one is a target for not-hot-restart, the bottom one is hot-restart specifically. At one point we had only the not-hot-restart target and the fix was to duplicate everything into another target.