v0.3.15-pre.005-fix.002
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-app-raw-transaction-ingest-desk/frontend/main.html -->
|
||||
<!-- version: 1 -->
|
||||
<!-- version: 2 -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
@@ -8,27 +8,30 @@
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
||||
<link rel="icon" href="imgs/logo.png">
|
||||
<link rel="stylesheet" href="sass/main.scss">
|
||||
<title>KSP Raw Transaction Ingest Desk</title>
|
||||
<title>Raw Transaction Ingest Desk — Routes</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="app-header bg-dark text-light">
|
||||
<div class="container-fluid h-100 d-flex align-items-center gap-3 px-4">
|
||||
<img class="app-logo" src="imgs/logo.png" alt="KSP">
|
||||
<div>
|
||||
<div class="fw-semibold">KSP Raw Transaction Ingest Desk</div>
|
||||
<small class="text-light-emphasis">Composition et supervision des routes live RawTransaction</small>
|
||||
<header class="app-header">
|
||||
<nav class="navbar h-100 py-0 bg-light text-dark">
|
||||
<div class="container-fluid px-4 flex-nowrap">
|
||||
<div class="navbar-brand d-flex align-items-center me-4 flex-nowrap">
|
||||
<img alt="KSP" src="imgs/logo.png" class="app-logo">
|
||||
<span class="ps-2 fs-4 fw-semibold text-primary text-nowrap">Raw Transaction Ingest Desk</span>
|
||||
<span class="mx-2 fs-5 text-body-secondary" aria-hidden="true">—</span>
|
||||
<span id="headerViewTitle" class="fs-5 text-body text-nowrap">Routes</span>
|
||||
</div>
|
||||
<span id="headerPhase" class="badge text-bg-secondary ms-auto">scaffold</span>
|
||||
</div>
|
||||
<span id="headerPhase" class="badge text-bg-secondary ms-auto">scaffold</span>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="app-main container-fluid px-0">
|
||||
<div class="row g-0 h-100">
|
||||
<aside class="app-sidebar bg-dark text-light">
|
||||
<div class="app-sidebar-scroll" data-simplebar>
|
||||
<nav class="nav nav-pills flex-column p-3 gap-2" aria-label="Navigation principale">
|
||||
<button class="nav-link active text-start" type="button" data-view="routes">
|
||||
<main class="app-main container-fluid p-0">
|
||||
<div class="row g-0 h-100 flex-nowrap">
|
||||
<aside class="col-auto app-sidebar border-end bg-body-tertiary">
|
||||
<div class="app-sidebar-scroll h-100" data-simplebar>
|
||||
<nav class="nav nav-pills flex-column gap-1 p-3" aria-label="Navigation Raw Transaction Ingest Desk">
|
||||
<button class="nav-link text-start active" type="button" data-view="routes">
|
||||
<i class="fa-solid fa-route me-2" aria-hidden="true"></i>Routes
|
||||
</button>
|
||||
<button class="nav-link text-start" type="button" data-view="diagnostics">
|
||||
@@ -37,56 +40,58 @@
|
||||
</nav>
|
||||
</div>
|
||||
</aside>
|
||||
<section class="app-content flex-grow-1">
|
||||
<div class="h-100" data-simplebar>
|
||||
<div class="container-fluid p-4">
|
||||
<section data-view-panel="routes">
|
||||
<div class="d-flex align-items-start justify-content-between gap-3 flex-wrap mb-4">
|
||||
<div>
|
||||
<h1 class="h3 mb-1">Routes live</h1>
|
||||
<p class="text-body-secondary mb-0">Fondation statique V1 ; la composabilité Config sera matérialisée en pre.006.</p>
|
||||
<section class="col app-content app-scrollable h-100" data-simplebar>
|
||||
<div class="container-fluid px-4 py-4">
|
||||
<div class="card app-shell-card mx-auto shadow-sm border-0">
|
||||
<div class="card-body p-4">
|
||||
<section data-view-panel="routes">
|
||||
<div class="d-flex align-items-start justify-content-between gap-3 flex-wrap mb-4">
|
||||
<div>
|
||||
<h1 class="h3 mb-1">Routes live</h1>
|
||||
<p class="text-body-secondary mb-0">Fondation statique V1 ; la composabilité Config sera matérialisée en pre.006.</p>
|
||||
</div>
|
||||
<button id="refreshRouteFoundation" class="btn btn-outline-primary btn-sm" type="button">
|
||||
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
|
||||
</button>
|
||||
</div>
|
||||
<button id="refreshRouteFoundation" class="btn btn-outline-primary btn-sm" type="button">
|
||||
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
|
||||
</button>
|
||||
</div>
|
||||
<div class="alert alert-info" role="status">
|
||||
Aucun Worker n'est démarré par ce scaffold. Les cinq IDs ci-dessous ne constituent aucune preuve de disponibilité runtime.
|
||||
</div>
|
||||
<div id="routeFoundation" class="row g-3" aria-live="polite"></div>
|
||||
<div class="card shadow-sm mt-4">
|
||||
<div class="card-header fw-semibold">États réservés</div>
|
||||
<div class="card-body">
|
||||
<div id="routeStates" class="d-flex flex-wrap gap-2"></div>
|
||||
<div class="alert alert-info" role="status">
|
||||
Aucun Worker n'est démarré par ce scaffold. Les cinq IDs ci-dessous ne constituent aucune preuve de disponibilité runtime.
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div id="routeFoundation" class="row g-3 app-route-grid" aria-live="polite"></div>
|
||||
<div class="card shadow-sm mt-4">
|
||||
<div class="card-header fw-semibold">États réservés</div>
|
||||
<div class="card-body">
|
||||
<div id="routeStates" class="d-flex flex-wrap gap-2"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section data-view-panel="diagnostics" hidden>
|
||||
<div class="d-flex align-items-center justify-content-between gap-3 flex-wrap mb-4">
|
||||
<div>
|
||||
<h1 class="h3 mb-1">Diagnostics</h1>
|
||||
<p class="text-body-secondary mb-0">État sûr du scaffold Config, Logging et desktop.</p>
|
||||
<section data-view-panel="diagnostics" hidden>
|
||||
<div class="d-flex align-items-center justify-content-between gap-3 flex-wrap mb-4">
|
||||
<div>
|
||||
<h1 class="h3 mb-1">Diagnostics</h1>
|
||||
<p class="text-body-secondary mb-0">État sûr du scaffold Config, Logging et desktop.</p>
|
||||
</div>
|
||||
<button id="refreshRuntimeStatus" class="btn btn-outline-primary btn-sm" type="button">
|
||||
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
|
||||
</button>
|
||||
</div>
|
||||
<button id="refreshRuntimeStatus" class="btn btn-outline-primary btn-sm" type="button">
|
||||
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
|
||||
</button>
|
||||
</div>
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-header fw-semibold">Runtime</div>
|
||||
<div class="card-body">
|
||||
<dl class="row mb-0 app-runtime-list">
|
||||
<dt class="col-sm-5">Version</dt><dd id="runtimeVersion" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Phase</dt><dd id="runtimeShellPhase" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Documents Config</dt><dd id="runtimeConfigDocuments" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Profil composite</dt><dd id="runtimeCompositeProfile" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Profil Logging</dt><dd id="runtimeLoggingProfile" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Fallback Logging</dt><dd id="runtimeLoggingFallback" class="col-sm-7">—</dd>
|
||||
</dl>
|
||||
<div id="runtimeDiagnostic" class="alert alert-warning mt-3 mb-0" role="status" aria-live="polite" hidden></div>
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-header fw-semibold">Runtime</div>
|
||||
<div class="card-body">
|
||||
<dl class="row mb-0 app-runtime-list">
|
||||
<dt class="col-sm-5">Version</dt><dd id="runtimeVersion" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Phase</dt><dd id="runtimeShellPhase" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Documents Config</dt><dd id="runtimeConfigDocuments" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Profil composite</dt><dd id="runtimeCompositeProfile" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Profil Logging</dt><dd id="runtimeLoggingProfile" class="col-sm-7">—</dd>
|
||||
<dt class="col-sm-5">Fallback Logging</dt><dd id="runtimeLoggingFallback" class="col-sm-7">—</dd>
|
||||
</dl>
|
||||
<div id="runtimeDiagnostic" class="alert alert-warning mt-3 mb-0" role="status" aria-live="polite" hidden></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-raw-transaction-ingest-desk/frontend/sass/_app.scss
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
$app-header-height: 72px;
|
||||
$app-footer-height: 42px;
|
||||
@@ -52,6 +52,17 @@ body {
|
||||
height: 42px;
|
||||
}
|
||||
|
||||
.app-scrollable {
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.app-shell-card {
|
||||
width: 100%;
|
||||
max-width: 1320px;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.app-sidebar {
|
||||
width: $app-sidebar-width;
|
||||
min-width: $app-sidebar-width;
|
||||
@@ -77,12 +88,30 @@ body {
|
||||
font-family: var(--bs-font-monospace);
|
||||
}
|
||||
|
||||
.app-route-grid {
|
||||
margin-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.app-route-grid > * {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.app-route-card {
|
||||
min-width: 0;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
border-left: 4px solid rgba($primary, 0.55);
|
||||
}
|
||||
|
||||
.app-route-code {
|
||||
min-width: 0;
|
||||
overflow-wrap: anywhere;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.app-placeholder {
|
||||
min-height: 220px;
|
||||
min-height: 320px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
@@ -90,6 +119,7 @@ body {
|
||||
gap: 1rem;
|
||||
padding: 2rem;
|
||||
border: 1px dashed var(--bs-border-color);
|
||||
border-radius: var(--bs-border-radius-lg);
|
||||
color: var(--bs-secondary-color);
|
||||
background: var(--bs-body-bg);
|
||||
text-align: center;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-raw-transaction-ingest-desk/frontend/ts/main.ts
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
import "bootstrap";
|
||||
import ResizeObserver from "resize-observer-polyfill";
|
||||
@@ -14,6 +14,11 @@ installFrontendConsoleBridge("main");
|
||||
|
||||
type ViewId = "routes" | "diagnostics";
|
||||
|
||||
const viewTitles: Record<ViewId, string> = {
|
||||
routes: "Routes",
|
||||
diagnostics: "Diagnostics",
|
||||
};
|
||||
|
||||
function isViewId(value: string | undefined): value is ViewId {
|
||||
return value === "routes" || value === "diagnostics";
|
||||
}
|
||||
@@ -27,7 +32,11 @@ function activateView(viewId: ViewId, source: "startup" | "user"): void {
|
||||
button.classList.toggle("active", active);
|
||||
button.setAttribute("aria-current", active ? "page" : "false");
|
||||
});
|
||||
document.title = `Raw Transaction Ingest Desk — ${viewId === "routes" ? "Routes" : "Diagnostics"}`;
|
||||
const header = document.querySelector<HTMLElement>("#headerViewTitle");
|
||||
if (header) {
|
||||
header.textContent = viewTitles[viewId];
|
||||
}
|
||||
document.title = `Raw Transaction Ingest Desk — ${viewTitles[viewId]}`;
|
||||
frontendTrace("main", "Raw Transaction Ingest Desk view DOM updated", { viewId, source });
|
||||
}
|
||||
|
||||
@@ -83,7 +92,7 @@ function renderRouteFoundation(foundation: RawIngestRouteFoundationDto): void {
|
||||
routeRoot.replaceChildren();
|
||||
for (const routeId of foundation.routeIds) {
|
||||
const column = document.createElement("div");
|
||||
column.className = "col-12 col-xl-6";
|
||||
column.className = "col-12 col-xl-6 app-route-column";
|
||||
const card = document.createElement("div");
|
||||
card.className = "card h-100 shadow-sm app-route-card";
|
||||
const body = document.createElement("div");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-raw-transaction-ingest-desk/tests/desktop_contract.rs
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
//! Desktop scaffold contract canaries for Raw Transaction Ingest Desk.
|
||||
|
||||
@@ -122,3 +122,34 @@ fn pre_005_route_foundation_is_backend_owned_and_has_exact_five_ids_and_seven_st
|
||||
assert!(!tauri.contains(forbidden), "scaffold Tauri surface contains premature runtime marker {forbidden}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pre_005_fix_002_shell_reuses_common_light_template_and_bounds_route_foundation() {
|
||||
let html = read_text(app_root().join("frontend/main.html").as_path());
|
||||
for required in [
|
||||
"<header class=\"app-header\">",
|
||||
"navbar h-100 py-0 bg-light text-dark",
|
||||
"col-auto app-sidebar border-end bg-body-tertiary",
|
||||
"col app-content app-scrollable h-100",
|
||||
"card app-shell-card mx-auto shadow-sm border-0",
|
||||
"id=\"routeFoundation\" class=\"row g-3 app-route-grid\"",
|
||||
] {
|
||||
assert!(html.contains(required), "missing common shell marker: {required}");
|
||||
}
|
||||
for forbidden in ["app-header bg-dark", "app-sidebar bg-dark text-light", "app-content flex-grow-1"] {
|
||||
assert!(!html.contains(forbidden), "obsolete shell marker remains: {forbidden}");
|
||||
}
|
||||
let styles = read_text(app_root().join("frontend/sass/_app.scss").as_path());
|
||||
for required in [
|
||||
".app-scrollable {",
|
||||
".app-shell-card {",
|
||||
".app-route-grid {",
|
||||
".app-route-grid > * {",
|
||||
"min-width: 0;",
|
||||
"max-width: 100%;",
|
||||
"overflow: hidden;",
|
||||
"overflow-wrap: anywhere;",
|
||||
] {
|
||||
assert!(styles.contains(required), "missing bounded layout marker: {required}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-app-raw-transaction-ingest-desk/tests/release_completeness.rs
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
//! Release-completeness canaries for the Raw Transaction Ingest Desk scaffold tranche.
|
||||
|
||||
@@ -46,7 +46,7 @@ fn pre_005_production_module_inventory_is_exact_and_scaffold_only() {
|
||||
#[test]
|
||||
fn pre_005_public_surface_exposes_only_application_run_entry_point() {
|
||||
let lib = read_text(app_root().join("src/lib.rs").as_path());
|
||||
let public_reexports = lib.lines().filter(|line| line.starts_with("pub use ")).collect::<std::vec::Vec<_>>();
|
||||
let public_reexports = lib.lines().filter(|line| return line.starts_with("pub use ")).collect::<std::vec::Vec<_>>();
|
||||
assert_eq!(public_reexports, vec!["pub use self::tauri::run;"]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user