From 411bc75e5e4f6493ef338f54386868009ac4a271 Mon Sep 17 00:00:00 2001 From: DevITWay Date: Mon, 26 Jan 2026 18:43:11 +0000 Subject: [PATCH] Apply dark theme to all UI pages - Convert registry list, docker detail, package detail, maven detail pages to dark theme - Use layout_dark instead of layout for all pages - Update colors: bg-[#1e293b] cards, slate-700 borders, slate-200/400 text - Mark unused light theme functions with #[allow(dead_code)] --- Cargo.lock | 6 +- deploy/demo-traffic.sh | 83 +++++++++++++++++ deploy/nora-demo-traffic.service | 15 +++ nora-registry/src/ui/components.rs | 68 +------------- nora-registry/src/ui/templates.rs | 145 +++++++++++++++-------------- 5 files changed, 178 insertions(+), 139 deletions(-) create mode 100644 deploy/demo-traffic.sh create mode 100644 deploy/nora-demo-traffic.service diff --git a/Cargo.lock b/Cargo.lock index 911d7c1..8a4c1e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1185,7 +1185,7 @@ checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" [[package]] name = "nora-cli" -version = "0.2.7" +version = "0.2.9" dependencies = [ "clap", "flate2", @@ -1199,7 +1199,7 @@ dependencies = [ [[package]] name = "nora-registry" -version = "0.2.7" +version = "0.2.9" dependencies = [ "async-trait", "axum", @@ -1234,7 +1234,7 @@ dependencies = [ [[package]] name = "nora-storage" -version = "0.2.7" +version = "0.2.9" dependencies = [ "axum", "base64", diff --git a/deploy/demo-traffic.sh b/deploy/demo-traffic.sh new file mode 100644 index 0000000..322cd04 --- /dev/null +++ b/deploy/demo-traffic.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# Demo traffic simulator for NORA registry +# Generates random registry activity for dashboard demo + +REGISTRY="http://localhost:4000" +LOG_FILE="/var/log/nora-demo-traffic.log" + +# Sample packages to fetch +NPM_PACKAGES=("lodash" "express" "react" "axios" "moment" "underscore" "chalk" "debug") +MAVEN_ARTIFACTS=( + "org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.pom" + "com/google/guava/guava/31.1-jre/guava-31.1-jre.pom" + "org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.pom" +) +DOCKER_IMAGES=("alpine" "busybox" "hello-world") + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" +} + +# Random sleep between min and max seconds +random_sleep() { + local min=$1 + local max=$2 + local delay=$((RANDOM % (max - min + 1) + min)) + sleep $delay +} + +# Fetch random npm package +fetch_npm() { + local pkg=${NPM_PACKAGES[$RANDOM % ${#NPM_PACKAGES[@]}]} + log "NPM: fetching $pkg" + curl -s "$REGISTRY/npm/$pkg" > /dev/null 2>&1 +} + +# Fetch random maven artifact +fetch_maven() { + local artifact=${MAVEN_ARTIFACTS[$RANDOM % ${#MAVEN_ARTIFACTS[@]}]} + log "MAVEN: fetching $artifact" + curl -s "$REGISTRY/maven2/$artifact" > /dev/null 2>&1 +} + +# Docker push/pull cycle +docker_cycle() { + local img=${DOCKER_IMAGES[$RANDOM % ${#DOCKER_IMAGES[@]}]} + local tag="demo-$(date +%s)" + + log "DOCKER: push/pull cycle for $img" + + # Tag and push + docker tag "$img:latest" "localhost:4000/demo/$img:$tag" 2>/dev/null + docker push "localhost:4000/demo/$img:$tag" > /dev/null 2>&1 + + # Pull back + docker rmi "localhost:4000/demo/$img:$tag" > /dev/null 2>&1 + docker pull "localhost:4000/demo/$img:$tag" > /dev/null 2>&1 + + # Cleanup + docker rmi "localhost:4000/demo/$img:$tag" > /dev/null 2>&1 +} + +# Main loop +log "Starting demo traffic simulator" + +while true; do + # Random operation + op=$((RANDOM % 10)) + + case $op in + 0|1|2|3) # 40% npm + fetch_npm + ;; + 4|5|6) # 30% maven + fetch_maven + ;; + 7|8|9) # 30% docker + docker_cycle + ;; + esac + + # Random delay: 30-120 seconds + random_sleep 30 120 +done diff --git a/deploy/nora-demo-traffic.service b/deploy/nora-demo-traffic.service new file mode 100644 index 0000000..9479bdd --- /dev/null +++ b/deploy/nora-demo-traffic.service @@ -0,0 +1,15 @@ +[Unit] +Description=NORA Demo Traffic Simulator +After=docker.service +Requires=docker.service + +[Service] +Type=simple +ExecStart=/opt/nora/demo-traffic.sh +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target diff --git a/nora-registry/src/ui/components.rs b/nora-registry/src/ui/components.rs index 09dc577..2ccacbe 100644 --- a/nora-registry/src/ui/components.rs +++ b/nora-registry/src/ui/components.rs @@ -1,68 +1,6 @@ /// Application version from Cargo.toml const VERSION: &str = env!("CARGO_PKG_VERSION"); -/// Main layout wrapper with header and sidebar -pub fn layout(title: &str, content: &str, active_page: Option<&str>) -> String { - format!( - r##" - - - - - {} - Nora - - - - - -
- - - - - {} - - -
- - {} - - -
- {} -
-
-
- - - -"##, - html_escape(title), - sidebar(active_page), - header(), - content - ) -} - /// Dark theme layout wrapper for dashboard pub fn layout_dark( title: &str, @@ -485,7 +423,8 @@ pub fn render_polling_script() -> String { "##.to_string() } -/// Sidebar navigation component +/// Sidebar navigation component (light theme, unused) +#[allow(dead_code)] fn sidebar(active_page: Option<&str>) -> String { let active = active_page.unwrap_or(""); @@ -578,7 +517,8 @@ fn sidebar(active_page: Option<&str>) -> String { ) } -/// Header component +/// Header component (light theme, unused) +#[allow(dead_code)] fn header() -> String { r##"
diff --git a/nora-registry/src/ui/templates.rs b/nora-registry/src/ui/templates.rs index a1a9635..334d78b 100644 --- a/nora-registry/src/ui/templates.rs +++ b/nora-registry/src/ui/templates.rs @@ -155,12 +155,12 @@ pub fn render_registry_list(registry_type: &str, title: &str, repos: &[RepoInfo] format!("/ui/{}/{}", registry_type, encode_uri_component(&repo.name)); format!( r##" - + - {} + {} - {} - {} + {} + {} {} "##, @@ -186,9 +186,9 @@ pub fn render_registry_list(registry_type: &str, title: &str, repos: &[RepoInfo] r##"
- {} + {}
-

{}

+

{}

{} repositories

@@ -196,29 +196,29 @@ pub fn render_registry_list(registry_type: &str, title: &str, repos: &[RepoInfo]
- +
-
+
- + - - - - + + + + - + {}
Name{}SizeUpdatedName{}SizeUpdated
@@ -232,7 +232,7 @@ pub fn render_registry_list(registry_type: &str, title: &str, repos: &[RepoInfo] table_rows ); - layout(title, &content, Some(registry_type)) + layout_dark(title, &content, Some(registry_type), "") } /// Renders Docker image detail page @@ -246,11 +246,11 @@ pub fn render_docker_detail(name: &str, detail: &DockerDetail) -> String { .map(|tag| { format!( r##" - + - {} + {} - {} + {} {} "##, @@ -269,18 +269,18 @@ pub fn render_docker_detail(name: &str, detail: &DockerDetail) -> String { r##"
- Docker Registry - / - {} + Docker Registry + / + {}
- {} -

{}

+ {} +

{}

-
-

Pull Command

+
+

Pull Command

{}
-
-
-

Tags ({} total)

+
+
+

Tags ({} total)

- + - - - + + + - + {}
TagSizeCreatedTagSizeCreated
@@ -318,7 +318,7 @@ pub fn render_docker_detail(name: &str, detail: &DockerDetail) -> String { tags_rows ); - layout(&format!("{} - Docker", name), &content, Some("docker")) + layout_dark(&format!("{} - Docker", name), &content, Some("docker"), "") } /// Renders package detail page (npm, cargo, pypi) @@ -335,11 +335,11 @@ pub fn render_package_detail(registry_type: &str, name: &str, detail: &PackageDe .map(|v| { format!( r##" - + - {} + {} - {} + {} {} "##, @@ -366,18 +366,18 @@ pub fn render_package_detail(registry_type: &str, name: &str, detail: &PackageDe r##"
- {} - / - {} + {} + / + {}
- {} -

{}

+ {} +

{}

-
-

Install Command

+
+

Install Command

{}
-
-
-

Versions ({} total)

+
+
+

Versions ({} total)

- + - - - + + + - + {}
VersionSizePublishedVersionSizePublished
@@ -417,10 +417,11 @@ pub fn render_package_detail(registry_type: &str, name: &str, detail: &PackageDe versions_rows ); - layout( + layout_dark( &format!("{} - {}", name, registry_title), &content, Some(registry_type), + "", ) } @@ -432,11 +433,11 @@ pub fn render_maven_detail(path: &str, detail: &MavenDetail) -> String { detail.artifacts.iter().map(|a| { let download_url = format!("/maven2/{}/{}", path, a.filename); format!(r##" - + - {} + {} - {} + {} "##, download_url, html_escape(&a.filename), format_size(a.size)) }).collect::>().join("") @@ -465,33 +466,33 @@ pub fn render_maven_detail(path: &str, detail: &MavenDetail) -> String { r##"
- Maven Repository - / - {} + Maven Repository + / + {}
- {} -

{}

+ {} +

{}

-
-

Maven Dependency

+
+

Maven Dependency

{}
-
-
-

Artifacts ({} files)

+
+
+

Artifacts ({} files)

- + - - + + - + {}
FilenameSizeFilenameSize
@@ -505,7 +506,7 @@ pub fn render_maven_detail(path: &str, detail: &MavenDetail) -> String { artifact_rows ); - layout(&format!("{} - Maven", path), &content, Some("maven")) + layout_dark(&format!("{} - Maven", path), &content, Some("maven"), "") } /// Returns SVG icon path for the registry type