Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
6e8bb12
UX revamp: Lumina bright media-library for image-gallery
IEvangelist Jun 6, 2026
98582a2
Revamp aspire-with-python frontend with Swiss typographic identity
IEvangelist Jun 6, 2026
cc1e738
Revamp vite-react-fastapi with claymorphism UX
IEvangelist Jun 6, 2026
64633fd
Revamp Node frontend as a printed Weather Almanac
IEvangelist Jun 6, 2026
1fc1c71
Redesign Aspire Shop frontend as Atelier Aspire boutique
IEvangelist Jun 6, 2026
02b98bd
Revamp rag-document-qa-svelte UX as the "Athenaeum" reading room
IEvangelist Jun 6, 2026
24a4934
Revamp node-express-redis UX: Memphis-pop visit dashboard
IEvangelist Jun 6, 2026
948a1e6
Revamp volume-mount Blazor UX with bespoke "Vault" identity
IEvangelist Jun 6, 2026
2de8733
Revamp vite-csharp-postgres UX with "Quiet Office" identity
IEvangelist Jun 6, 2026
6d32041
Harden overlay surfaces to opaque + caption illustrative rag shots
IEvangelist Jun 6, 2026
49ecea9
Revamp Vite/YARP static sample as a retro Aspire Arcade
IEvangelist Jun 6, 2026
466261c
image-gallery: make the thumbnail "Ready" badge fully opaque
IEvangelist Jun 6, 2026
e56a6b8
Merge Gallery/RAG fleet: image-gallery (Lumina) + rag-document-qa-sve…
IEvangelist Jun 6, 2026
7114e6a
Redesign health-checks-ui frontend as bespoke Aspire Status console
IEvangelist Jun 6, 2026
e243739
Revamp polyglot-task-queue UX: cyberpunk control room
IEvangelist Jun 6, 2026
30d1d27
Merge JS SPA fleet: vite-react-fastapi + node-express-redis + polyglo…
IEvangelist Jun 6, 2026
2b8df75
Revamp python-openai-agent UX as cozy 'Ember' assistant
IEvangelist Jun 6, 2026
9523fd1
Merge SSR/python fleet: aspire-with-python + aspire-with-node + vite-…
IEvangelist Jun 6, 2026
1cbbc84
WIP: redesign orleans-voting frontend as Grain Poll live game-show
IEvangelist Jun 6, 2026
c38940c
Revamp aspire-with-javascript: four distinct weather UIs
IEvangelist Jun 6, 2026
c822737
Merge Weather fleet: aspire-with-javascript four-ways UX revamp
IEvangelist Jun 6, 2026
4eb60ce
Complete orleans-voting Grain Poll validation
IEvangelist Jun 7, 2026
177eff7
Redesign Metrics frontend as the "Telemetry Console"
IEvangelist Jun 7, 2026
c6a47fe
WIP: azure-functions ImageGallery de-template (Darkroom shell)
IEvangelist Jun 7, 2026
dd66f57
Fix polyglot-task-queue layout and make copy demo-focused
IEvangelist Jun 7, 2026
2ed70c2
Rewrite vite-react-fastapi UI copy to describe the todo demo
IEvangelist Jun 7, 2026
7318160
Rewrite node-express-redis subtitle to describe the visit counter
IEvangelist Jun 7, 2026
05336fc
Remove typeface meta-commentary from aspire-with-node colophon
IEvangelist Jun 7, 2026
8bad94c
Remove typographic meta-commentary from aspire-with-python copy
IEvangelist Jun 7, 2026
37607e1
Remove "CRT-style" visual descriptor from vite-yarp-static copy
IEvangelist Jun 7, 2026
15d7d76
Fix meta UI copy in image-gallery sample
IEvangelist Jun 7, 2026
69e4e0f
Fix meta UI copy in rag-document-qa-svelte sample
IEvangelist Jun 7, 2026
7a40d9b
Redesign python-openai-agent chat UI as a modern AI assistant
IEvangelist Jun 7, 2026
c341a1a
Redesign Vue weather sample as an accessible forecast carousel
IEvangelist Jun 7, 2026
79b92d2
Reimagine the Angular weather app with a Material 3 brand-forward UI
IEvangelist Jun 7, 2026
1785883
Polish React weather frontend: demo-focused copy + fresh screenshots
IEvangelist Jun 7, 2026
d6f2256
Polish Vite weather frontend: stronger synthwave scene + demo-focused…
IEvangelist Jun 7, 2026
ffb86db
Refine Ember chat palette to a warm-neutral scheme
IEvangelist Jun 7, 2026
3266e38
Convert volume-mount to the Aspire migration-worker pattern
IEvangelist Jun 7, 2026
914afdf
Rework python-openai-agent chat UI to a clean slate + indigo theme
IEvangelist Jun 7, 2026
9642250
Merge Vue weather carousel: accessible forecast carousel UX
IEvangelist Jun 7, 2026
72d94b1
Merge Angular weather: Material 3 brand-forward UI
IEvangelist Jun 7, 2026
2f4f147
Merge React/Vite weather polish: neo-brutalism + synthwave
IEvangelist Jun 7, 2026
3a3518c
Merge Ember chat redesign: AI assistant UX
IEvangelist Jun 7, 2026
fa8c33d
Merge copy audit A: demo-focused UI copy across SSR/SPA samples
IEvangelist Jun 7, 2026
b5503f0
Merge copy audit B: demo-focused copy for image-gallery + rag
IEvangelist Jun 7, 2026
cd1967e
Finalize aspire-with-javascript README for new weather designs (Vue c…
IEvangelist Jun 7, 2026
5447962
Remove orphaned Vite template assets from aspire-with-python
IEvangelist Jun 7, 2026
981fff3
Merge completed Blazor de-template samples: aspire-shop, health-check…
IEvangelist Jun 7, 2026
d0401be
Rework vite-react-fastapi clay todos: drop the panel, fix the bevels
IEvangelist Jun 7, 2026
568f99f
Merge azure-functions ImageGallery Darkroom de-template (WIP base)
IEvangelist Jun 7, 2026
fa0eccb
Complete azure-functions ImageGallery "Darkroom Studio" de-template
IEvangelist Jun 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
35 changes: 24 additions & 11 deletions samples/Metrics/MetricsApp.Client/Layout/MainLayout.razor
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
@inherits LayoutComponentBase
<div class="page">
<div class="sidebar">
@inherits LayoutComponentBase

<a class="skip-link" href="#main">Skip to main content</a>

<div class="console">
<header class="appbar">
<a class="brand" href="">
<span class="brand__mark" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 12h4l2-7 4 16 3-10 1.5 3H21" />
</svg>
</span>
<span class="brand__text">
<span class="brand__name">Telemetry Console</span>
<span class="brand__sub">Aspire · OpenTelemetry</span>
</span>
</a>

<NavMenu />
</div>

<main>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
</div>
<span class="appbar__status chip" title="This app is emitting metrics">
<span class="dot" aria-hidden="true"></span> live
</span>
</header>

<article class="content px-4">
@Body
</article>
<main id="main" class="content" tabindex="-1">
@Body
</main>
</div>
111 changes: 49 additions & 62 deletions samples/Metrics/MetricsApp.Client/Layout/MainLayout.razor.css
Original file line number Diff line number Diff line change
@@ -1,77 +1,64 @@
.page {
position: relative;
.console {
min-height: 100vh;
display: flex;
flex-direction: column;
}

main {
flex: 1;
}

.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
.appbar {
display: flex;
align-items: center;
gap: 1rem 1.25rem;
flex-wrap: wrap;
padding: 0.7rem clamp(1rem, 4vw, 2.5rem);
background: var(--surface);
border-bottom: 1px solid var(--border);
position: sticky;
top: 0;
z-index: 20;
box-shadow: var(--shadow);
}

.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}

.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}

.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}

@media (max-width: 640.98px) {
.top-row {
justify-content: space-between;
}

.top-row ::deep a, .top-row ::deep .btn-link {
margin-left: 0;
}
.brand {
display: inline-flex;
align-items: center;
gap: 0.65rem;
text-decoration: none;
color: var(--ink);
}
.brand:hover { text-decoration: none; }

@media (min-width: 641px) {
.page {
flex-direction: row;
}
.brand__mark {
width: 2.15rem;
height: 2.15rem;
display: grid;
place-items: center;
background: linear-gradient(135deg, var(--accent), var(--accent-strong));
border-radius: 11px;
color: #fff;
box-shadow: var(--shadow);
}
.brand__mark svg { width: 1.35rem; height: 1.35rem; color: #c7f9ff; }

.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.brand__text { display: flex; flex-direction: column; line-height: 1.12; }
.brand__name { font-weight: 700; font-size: 1.04rem; letter-spacing: -0.01em; }
.brand__sub {
font-family: var(--font-mono);
font-size: 0.66rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ink-muted);
}

.top-row {
position: sticky;
top: 0;
z-index: 1;
}
.appbar__status { margin-left: auto; }

.top-row.auth ::deep a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.content {
flex: 1;
width: 100%;
max-width: 72rem;
margin: 0 auto;
padding: clamp(1.5rem, 4vw, 2.75rem) clamp(1rem, 4vw, 2.5rem) 3.5rem;
}

.top-row, article {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
@media (max-width: 640px) {
.appbar__status { margin-left: 0; }
}
64 changes: 25 additions & 39 deletions samples/Metrics/MetricsApp.Client/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
@@ -1,39 +1,25 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">Metrics sample</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>

<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<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="auth">
<span class="bi bi-lock-nav-menu" aria-hidden="true"></span> Auth Required
</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>

@code {
private bool collapseNavMenu = true;

private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;

private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}
@*
Primary navigation rendered as horizontal "console tabs" in the app bar.
Each page deliberately exercises a different instrument so the sample
produces a spread of OpenTelemetry metrics.
*@
<nav class="topnav" aria-label="Primary">
<NavLink class="topnav__link" href="" Match="NavLinkMatch.All">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M3 10.5 12 4l9 6.5" /><path d="M5 9.5V20h14V9.5" /><path d="M9.5 20v-5h5v5" />
</svg>
<span>Home</span>
</NavLink>
<NavLink class="topnav__link" href="weather">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M3 13h3l2-4 3 8 2.5-6 1.5 2h6" />
</svg>
<span>Weather</span>
</NavLink>
<NavLink class="topnav__link" href="auth">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<rect x="5" y="11" width="14" height="9" rx="2" /><path d="M8 11V8a4 4 0 0 1 8 0v3" />
</svg>
<span>Auth Required</span>
</NavLink>
</nav>
104 changes: 25 additions & 79 deletions samples/Metrics/MetricsApp.Client/Layout/NavMenu.razor.css
Original file line number Diff line number Diff line change
@@ -1,87 +1,33 @@
.navbar-toggler {
background-color: rgba(255, 255, 255, 0.1);
.topnav {
display: flex;
gap: 0.35rem;
flex-wrap: wrap;
align-items: center;
}

.top-row {
height: 3.5rem;
background-color: rgba(0,0,0,0.4);
.topnav__link {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.85rem;
border-radius: 999px;
color: var(--ink-soft);
text-decoration: none;
font-weight: 600;
font-size: 0.92rem;
border: 1px solid transparent;
transition: background-color 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}

.navbar-brand {
font-size: 1.1rem;
.topnav__link:hover {
background: var(--surface-2);
color: var(--ink);
text-decoration: none;
}

.bi {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
.topnav__link.active {
background: var(--accent);
color: var(--accent-ink);
}

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

.bi-lock-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 d='M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z'/%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;
}

@media (min-width: 641px) {
.navbar-toggler {
display: none;
}

.collapse {
/* Never collapse the sidebar for wide screens */
display: block;
}

.nav-scrollable {
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
.topnav__link .icon { width: 1.05rem; height: 1.05rem; }
Loading
Loading