diff --git a/docs/ui-consistency/ScadaBridge-verification.md b/docs/ui-consistency/ScadaBridge-verification.md
index bcb85767..48d82179 100644
--- a/docs/ui-consistency/ScadaBridge-verification.md
+++ b/docs/ui-consistency/ScadaBridge-verification.md
@@ -89,3 +89,29 @@ The native after proof uses actual segmented keyboard entry, not programmatic in
Dashboard initial reads alone were sequential, but an early Retry could overlap the next repository read. All initial/retry operations now share a component-owned async gate. The renderer claims each fact's pending state before its first await, coalescing duplicate target requests. A deterministic delayed-Connections/early-Sites-retry regression reproduces the prior3 Sites invocations before Connections completed (expected1); final code waits and makes exactly one recovery read. Counts remain independent, and successful facts are not reloaded. The first async test attempt had CS4014 in NSubstitute verification; compile output is preserved separately, then meaningful red/green evidence follows.
Reviewed full Release suite1576/1576 passed, zero skips/failures (reviewed-full-suite.log/sb04-06-reviewed.trx). The only following production change was omitting the false ARIA override; final focused31/31 and final20 audit cases in each of UTC/Indianapolis/Tokyo pass. Native Chromium focused after proof passes including AX invalid=true. These correction checks are narrow technical regressions, not another broad screenshot/polish round. No batch commit or SB07+ expansion until parent accepts the corrected frozen source.
+
+## SB07–09 review batch
+
+SB07 replaces flow/status text foregrounds with the published semantic ink/deep-accent tokens; status signal borders/dots/backgrounds remain unchanged. The supported-dark palette already owned by actual site.css is retained. Local Bootstrap text utilities now bridge to those same shared ink tokens, including muted/secondary text. No new color/font literals or independent palette. A scoped trace-row rule previously suppressed keyboard outline; removing that suppression exposes the shared2px focus recipe. Before actual computed pairs include light warning1.48:1/info1.78:1 and dark success/danger about3.73:1; before keyboard trace outline was0px. The retained before JSON/calculation records exact sampled pairs, not a source-only contrast guess.
+
+SB08 adopts shared page-head/h1 anatomy across44 page components/57 route declarations. Login continues to render the shared LoginCard h1; no local login theme fork. Topology title remains present while loading/failed, and Template detail has mutually exclusive placeholder/loaded titles. Existing title copy/state expressions are preserved except adding the missing LDAP/Site page titles and a subordinate Site details section label. Compact20px published heading scale is measured in actual dashboard/SMS/SMTP samples. Infrequent topology Area/expand/collapse/recheck actions use one native More actions disclosure; Instance/Refresh/search/Live updates remain visible, with existing handler/disabled/policy expressions preserved.
+
+All33 manual page tables in19 files have one named keyboard-scrollable local container, reusing existing responsive/overflow ancestors rather than double wrapping. Repeated Health/connection/instance/template/import groups use contextual names. Forced light/dark thead classes are removed so shared scheme tokens own both modes; shared1.0.1 semantic row headers remain static/title case. Existing columns, row loops, actions, role checks and data bindings are retained. binding-preservation.json mechanically compares the exact event/bind/policy expression multisets across modified page source, all unchanged; source review and existing tests remain the behavioral evidence.
+
+SB09 shared DataTable now emits exactly0 items for empty/filter-empty state and restores its existing count/paging range after Clear. An optional TableLabel defaults safely to Data table and updates its named keyboard overflow region. No production page currently calls this reusable component; the33 manual page table adaptations above are separate, not falsely attributed to DataTable.
+
+Six new heading/table regressions failed as intended (red-heading-table.log). Topology now asserts one h1 in loading/loaded/error; table cases cover true empty, filter-empty/Clear and named keyboard region. Existing behavior-focused full suite1582/1582 passes with zero skips/failures (final-full-suite.log/sb07-09-final.trx). The subsequent optional TableLabel update assertion passes with final heading/table focused tests; only the scoped graph text-opacity correction below followed that full run. Scoped CSS uses actual computed/browser validation, not declaration-mirroring tests.
+
+Actual after matrix20/20 passes in browser/results.json: flow/list/table light/dark at1440/1024/390 and actual200% browser zoom (720 CSS pixels/DPR2), plus real dashboard/SMS/SMTP component samples in both schemes at desktop/mobile. All sampled state/utility text contrast is at least4.544:1; keyboard trace focus is solid2px in the family focus color; data table scroll accepts keyboard input, empty filtering/Clear is correct, row-header computed position/static and textTransform/none are retained, and each sample has one page h1. No document overflow or browser errors. Screenshots were captured in one after inspection batch and inspected at mobile/dark and desktop/light; a subsequent focused normal-motion/ghost opacity correction is documented below; no additional broad polish round was performed. The baseline used ScriptRun graph samples; the after fixture adds outbound-kind samples to exercise the real graph status-pill branch as well as the trace.
+
+These are actual components with synthetic data/read-only fixture adapters, not full authenticated deployment route captures. Topology loaded-tree geometry/touch and health operational-state ordering are still owned by later SB11/SB12; full-route integration remains SB00/SB15 acceptance work. Original G1 proof unchanged. Frozen source is source-freeze.json. No SB10+ source changes or commit before this batch review.
+
+### Focused unbroken-identifier negative case
+
+The broad presentation fixture initially used a hyphenated value that could wrap, so it did not establish actual horizontal overflow. A separate focused fixture-only221-character unbroken reference now proves the actual DataTable scroll region at390 and real200% zoom in both schemes: scrollWidth1989px, region350/680px, native ArrowRight moves scrollLeft, focus stays on the named region, full text length221 remains present, and document width stays390/720. Font is the shared IBM Plex Mono. focused-table-overflow.json retains all four cases. No production UI correction or extra broad screenshot round was performed for this additional negative condition.
+
+### Normal-motion and predicted-ghost text opacity
+
+The reduced-motion matrix alone did not cover two existing opacity paths: pending pills faded to0.6 mid-animation, and predicted ghost groups faded all labels to0.45. Focused actual before proof is pending-motion-before.json and ghost-opacity-before.json (the fixture now supplies a real PredictedFlow overlay). The decorative pending fade is removed; ghost text stays opaque while its existing dashed shape/tinted fill still conveys prediction. No state mapping, edge math, poll or callback change.
+
+Focused after proof covers light/dark × normal/reduced motion, four cases: pending opacity1/no animation, ghost group opacity1, and actual title/caption/pill text contrast at least4.5:1. The SVG ghost-background calculation composites its actual fill opacity over the actual alternate lane and wrap surfaces, rather than ignoring ancestor opacity. Existing FlowGraph/FlowDebugger/FlowTrace semantics118/118 tests pass (flow-opacity-focused.log). This is a narrow readability correction after the reduced-motion matrix, not a third broad screenshot review. Last full functional baseline remains1582/1582 with only these CSS opacity changes following it.
diff --git a/docs/ui-consistency/evidence/sb07-09/before-contrast-calculation.json b/docs/ui-consistency/evidence/sb07-09/before-contrast-calculation.json
new file mode 100644
index 00000000..60d0bb54
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/before-contrast-calculation.json
@@ -0,0 +1,204 @@
+[
+ {
+ "scheme": "light",
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 4.112
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(255, 193, 7)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 1.479
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 4.109
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(13, 202, 240)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 1.777
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgba(33, 37, 41, 0.75)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.427
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(108, 117, 125)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 4.255
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 4.112
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 4.109
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 4.109
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(47, 95, 208)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.195
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(232, 146, 12)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 2.229
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outline": "rgb(27, 29, 33) none 0px"
+ }
+ },
+ {
+ "scheme": "dark",
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 3.725
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(255, 193, 7)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.354
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 3.728
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(13, 202, 240)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.618
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgba(222, 226, 230, 0.75)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 7.809
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(108, 117, 125)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 3.599
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 3.725
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 3.728
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 3.728
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(122, 160, 239)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 6.511
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(240, 160, 48)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 7.857
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outline": "rgb(230, 232, 236) none 0px"
+ }
+ }
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/binding-preservation.json b/docs/ui-consistency/evidence/sb07-09/binding-preservation.json
new file mode 100644
index 00000000..167567b8
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/binding-preservation.json
@@ -0,0 +1,260 @@
+[
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
+ "policyAttributesUnchanged": true,
+ "eventBindingsUnchanged": true,
+ "bindExpressionsUnchanged": true
+ }
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/dashboard-dark-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-dark-1440-zoom1.png
new file mode 100644
index 00000000..07fd2ccd
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-dark-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/dashboard-dark-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-dark-390-zoom1.png
new file mode 100644
index 00000000..08745928
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-dark-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/dashboard-light-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-light-1440-zoom1.png
new file mode 100644
index 00000000..50ac5e82
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-light-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/dashboard-light-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-light-390-zoom1.png
new file mode 100644
index 00000000..6f86abd2
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/dashboard-light-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1024-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1024-zoom1.png
new file mode 100644
index 00000000..5f10c098
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1024-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1440-zoom1.png
new file mode 100644
index 00000000..05ab9f3c
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1440-zoom2.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1440-zoom2.png
new file mode 100644
index 00000000..6104e6ca
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-1440-zoom2.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-390-zoom1.png
new file mode 100644
index 00000000..8a3a0d2b
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-dark-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1024-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1024-zoom1.png
new file mode 100644
index 00000000..1dfb894d
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1024-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1440-zoom1.png
new file mode 100644
index 00000000..8acbf96d
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1440-zoom2.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1440-zoom2.png
new file mode 100644
index 00000000..4725b0a9
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-1440-zoom2.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-390-zoom1.png
new file mode 100644
index 00000000..78004d29
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/presentation-light-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/results.json b/docs/ui-consistency/evidence/sb07-09/browser/results.json
new file mode 100644
index 00000000..57c21bfe
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/browser/results.json
@@ -0,0 +1,1711 @@
+{
+ "results": [
+ {
+ "kind": "presentation",
+ "width": 1440,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(98, 105, 112)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.05
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.775
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(233, 246, 236)",
+ "contrast": 5.555
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(30, 63, 153)"
+ },
+ "table": {
+ "width": 1180,
+ "scrollWidth": 1180,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 1440,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(180, 198, 255)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.015
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(168, 176, 188)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 7.716
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 6.415
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(26, 46, 30)",
+ "contrast": 8.634
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(157, 186, 246)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.67
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(167, 193, 255)"
+ },
+ "table": {
+ "width": 1180,
+ "scrollWidth": 1180,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 1024,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1024,
+ "scrollWidth": 1024,
+ "DPR": 1
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(98, 105, 112)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.05
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.775
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(233, 246, 236)",
+ "contrast": 5.555
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(30, 63, 153)"
+ },
+ "table": {
+ "width": 764,
+ "scrollWidth": 764,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 1024,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1024,
+ "scrollWidth": 1024,
+ "DPR": 1
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(180, 198, 255)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.015
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(168, 176, 188)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 7.716
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 6.415
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(26, 46, 30)",
+ "contrast": 8.634
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(157, 186, 246)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.67
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(167, 193, 255)"
+ },
+ "table": {
+ "width": 764,
+ "scrollWidth": 764,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 390,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(98, 105, 112)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.05
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.775
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(233, 246, 236)",
+ "contrast": 5.555
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(30, 63, 153)"
+ },
+ "table": {
+ "width": 350,
+ "scrollWidth": 350,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 390,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(180, 198, 255)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.015
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(168, 176, 188)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 7.716
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 6.415
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(26, 46, 30)",
+ "contrast": 8.634
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(157, 186, 246)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.67
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(167, 193, 255)"
+ },
+ "table": {
+ "width": 350,
+ "scrollWidth": 350,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 1440,
+ "scheme": "light",
+ "zoom": 2,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "browserZoom": 2,
+ "layout": {
+ "innerWidth": 720,
+ "scrollWidth": 720,
+ "DPR": 2
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(98, 105, 112)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.05
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.775
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(233, 246, 236)",
+ "contrast": 5.555
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(252, 234, 234)",
+ "contrast": 5.69
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(90, 96, 102)",
+ "background": "rgb(228, 228, 223)",
+ "contrast": 4.989
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(35, 111, 52)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.614
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(180, 33, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 5.992
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 15.315
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(30, 63, 153)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 8.56
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(244, 244, 241)",
+ "contrast": 6.06
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(30, 63, 153)"
+ },
+ "table": {
+ "width": 680,
+ "scrollWidth": 680,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "presentation",
+ "width": 1440,
+ "scheme": "dark",
+ "zoom": 2,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "readableStateAndUtilityText": true,
+ "traceKeyboardFocus": true,
+ "tableKeyboardRegion": true,
+ "rowHeadersKeepSemantics": true,
+ "emptyCount": true,
+ "noBrowserError": true
+ },
+ "browserZoom": 2,
+ "layout": {
+ "innerWidth": 720,
+ "scrollWidth": 720,
+ "DPR": 2
+ },
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(180, 198, 255)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.015
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgb(168, 176, 188)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 7.716
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 6.415
+ },
+ {
+ "text": "Ok",
+ "class": "fg-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(26, 46, 30)",
+ "contrast": 8.634
+ },
+ {
+ "text": "Failed",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Timed out",
+ "class": "fg-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(46, 22, 22)",
+ "contrast": 8.5
+ },
+ {
+ "text": "Predicted",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Not traced",
+ "class": "fg-pill",
+ "color": "rgb(154, 160, 170)",
+ "background": "rgb(51, 55, 62)",
+ "contrast": 4.544
+ },
+ {
+ "text": "Pending",
+ "class": "fg-pill pending",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Parked",
+ "class": "fg-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(138, 218, 150)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 10.086
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(255, 157, 157)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.488
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 13.757
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(157, 186, 246)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 8.67
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(27, 29, 33)",
+ "contrast": 9.748
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outlineWidth": "2px",
+ "outlineStyle": "solid",
+ "outlineColor": "rgb(167, 193, 255)"
+ },
+ "table": {
+ "width": 680,
+ "scrollWidth": 680,
+ "tabindex": 0
+ },
+ "rowHeader": {
+ "position": "static",
+ "textTransform": "none"
+ },
+ "errors": []
+ },
+ {
+ "kind": "dashboard",
+ "width": 1440,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "dashboard",
+ "width": 1440,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "dashboard",
+ "width": 390,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "dashboard",
+ "width": 390,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "sms",
+ "width": 1440,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "sms",
+ "width": 1440,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "sms",
+ "width": 390,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "sms",
+ "width": 390,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "smtp",
+ "width": 1440,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "smtp",
+ "width": 1440,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 1440,
+ "scrollWidth": 1440,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "smtp",
+ "width": 390,
+ "scheme": "light",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ },
+ {
+ "kind": "smtp",
+ "width": 390,
+ "scheme": "dark",
+ "zoom": 1,
+ "checks": {
+ "noDocumentOverflow": true,
+ "onePageHeading": true,
+ "sharedHeadingScale": true,
+ "noBrowserError": true
+ },
+ "layout": {
+ "innerWidth": 390,
+ "scrollWidth": 390,
+ "DPR": 1
+ },
+ "headingStyle": {
+ "font": "\"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif",
+ "size": "20px"
+ },
+ "errors": []
+ }
+ ],
+ "passed": true
+}
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/sms-dark-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/sms-dark-1440-zoom1.png
new file mode 100644
index 00000000..7588dd9e
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/sms-dark-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/sms-dark-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/sms-dark-390-zoom1.png
new file mode 100644
index 00000000..d483b3a8
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/sms-dark-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/sms-light-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/sms-light-1440-zoom1.png
new file mode 100644
index 00000000..1a6adfaf
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/sms-light-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/sms-light-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/sms-light-390-zoom1.png
new file mode 100644
index 00000000..a3e16efd
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/sms-light-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/smtp-dark-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/smtp-dark-1440-zoom1.png
new file mode 100644
index 00000000..712ec0b0
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/smtp-dark-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/smtp-dark-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/smtp-dark-390-zoom1.png
new file mode 100644
index 00000000..b8f63bc3
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/smtp-dark-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/smtp-light-1440-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/smtp-light-1440-zoom1.png
new file mode 100644
index 00000000..edbc2ac8
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/smtp-light-1440-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/browser/smtp-light-390-zoom1.png b/docs/ui-consistency/evidence/sb07-09/browser/smtp-light-390-zoom1.png
new file mode 100644
index 00000000..16f2a0db
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/browser/smtp-light-390-zoom1.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/contextual-regions-green.log b/docs/ui-consistency/evidence/sb07-09/contextual-regions-green.log
new file mode 100644
index 00000000..ef5f25c3
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/contextual-regions-green.log
@@ -0,0 +1,25 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+
+Passed! - Failed: 0, Passed: 161, Skipped: 0, Total: 161, Duration: 1 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/final-full-suite.log b/docs/ui-consistency/evidence/sb07-09/final-full-suite.log
new file mode 100644
index 00000000..295bd6eb
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/final-full-suite.log
@@ -0,0 +1,26 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb07-09/sb07-09-final.trx
+
+Passed! - Failed: 0, Passed: 1582, Skipped: 0, Total: 1582, Duration: 34 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/final-heading-table-focused.log b/docs/ui-consistency/evidence/sb07-09/final-heading-table-focused.log
new file mode 100644
index 00000000..6b6d78e9
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/final-heading-table-focused.log
@@ -0,0 +1,25 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+
+Passed! - Failed: 0, Passed: 44, Skipped: 0, Total: 44, Duration: 386 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/final-manual-table-inventory.json b/docs/ui-consistency/evidence/sb07-09/final-manual-table-inventory.json
new file mode 100644
index 00000000..cc619e31
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/final-manual-table-inventory.json
@@ -0,0 +1,233 @@
+[
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "line": 235,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "line": 350,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "line": 403,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 493,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 683,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 913,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 996,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 1166,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
+ "line": 48,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
+ "line": 80,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
+ "line": 45,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
+ "line": 46,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "line": 125,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "line": 195,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
+ "line": 88,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
+ "line": 122,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 213,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 351,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 441,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 653,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
+ "line": 164,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
+ "line": 181,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 364,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 450,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 491,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 546,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
+ "line": 102,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
+ "line": 147,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "line": 92,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "line": 137,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
+ "line": 48,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
+ "line": 96,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
+ "line": 146,
+ "regionMarkup": "
",
+ "namedRegion": true,
+ "oneLocalScrollContainer": true
+ }
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/final-page-inventory.json b/docs/ui-consistency/evidence/sb07-09/final-page-inventory.json
new file mode 100644
index 00000000..363da217
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/final-page-inventory.json
@@ -0,0 +1,455 @@
+[
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Login.razor",
+ "routes": [
+ "/login"
+ ],
+ "directH1Count": 0,
+ "sharedLoginCardHeading": true,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor",
+ "routes": [
+ "/"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
+ "routes": [
+ "/design/api-methods/create",
+ "/design/api-methods/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
+ "routes": [
+ "/design/external-systems/create",
+ "/design/external-systems/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "routes": [
+ "/design/transport/import"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor",
+ "routes": [
+ "/design/shared-scripts"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "routes": [
+ "/design/templates/{Id:int}"
+ ],
+ "directH1Count": 2,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": true,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
+ "routes": [
+ "/design/connections/{Id:int}/certificates"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor",
+ "routes": [
+ "/design/connections",
+ "/design/data-connections"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
+ "routes": [
+ "/design/db-connections/create",
+ "/design/db-connections/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
+ "routes": [
+ "/design/connections/create",
+ "/design/connections/{Id:int}/edit",
+ "/design/data-connections/create",
+ "/design/data-connections/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
+ "routes": [
+ "/design/templates"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor",
+ "routes": [
+ "/design/external-systems"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
+ "routes": [
+ "/design/templates/create"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
+ "routes": [
+ "/design/schema-library"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
+ "routes": [
+ "/design/shared-scripts/create",
+ "/design/shared-scripts/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor",
+ "routes": [
+ "/design/transport/export"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
+ "routes": [
+ "/admin/sites"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
+ "routes": [
+ "/admin/api-keys/create",
+ "/admin/api-keys/{KeyId}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
+ "routes": [
+ "/admin/ldap-mappings"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor",
+ "routes": [
+ "/admin/ldap-mappings/create",
+ "/admin/ldap-mappings/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor",
+ "routes": [
+ "/admin/sites/create",
+ "/admin/sites/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
+ "routes": [
+ "/admin/api-keys"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "routes": [
+ "/operations/secured-writes"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
+ "routes": [
+ "/audit/configuration"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor",
+ "routes": [
+ "/audit/execution-tree"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor",
+ "routes": [
+ "/audit/log"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor",
+ "routes": [
+ "/deployment/topology",
+ "/deployment/instances"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
+ "routes": [
+ "/deployment/deployments"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
+ "routes": [
+ "/deployment/instances/create"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "routes": [
+ "/deployment/instances/{Id:int}/configure"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
+ "routes": [
+ "/deployment/flow-debugger"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
+ "routes": [
+ "/deployment/debug-view"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
+ "routes": [
+ "/monitoring/parked-messages"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
+ "routes": [
+ "/monitoring/alarms"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "routes": [
+ "/monitoring/health"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
+ "routes": [
+ "/monitoring/event-logs"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
+ "routes": [
+ "/site-calls/report"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
+ "routes": [
+ "/notifications/sms"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
+ "routes": [
+ "/notifications/smtp"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "routes": [
+ "/notifications/kpis"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
+ "routes": [
+ "/notifications/lists"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
+ "routes": [
+ "/notifications/lists/create",
+ "/notifications/lists/{Id:int}/edit"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
+ "routes": [
+ "/notifications/report"
+ ],
+ "directH1Count": 1,
+ "sharedLoginCardHeading": false,
+ "conditionalHeadingBranches": false,
+ "forcedLightOrDarkThead": false
+ }
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/flow-opacity-focused.log b/docs/ui-consistency/evidence/sb07-09/flow-opacity-focused.log
new file mode 100644
index 00000000..5dfbe9b8
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/flow-opacity-focused.log
@@ -0,0 +1,25 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+
+Passed! - Failed: 0, Passed: 118, Skipped: 0, Total: 118, Duration: 773 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/flow-text-opacity-after.json b/docs/ui-consistency/evidence/sb07-09/flow-text-opacity-after.json
new file mode 100644
index 00000000..85b5ed40
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/flow-text-opacity-after.json
@@ -0,0 +1,125 @@
+{
+ "results": [
+ {
+ "pending": {
+ "opacity": "1",
+ "animations": 0,
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ "ghost": {
+ "opacity": "1",
+ "titleColor": "rgb(27, 29, 33)",
+ "captionColor": "rgb(98, 105, 112)",
+ "boxFill": "rgb(228, 228, 223)",
+ "boxFillOpacity": "0.35",
+ "strokeDasharray": "4px, 3px",
+ "laneFill": "rgb(228, 228, 223)",
+ "laneFillOpacity": "0.25",
+ "wrapBackground": "rgb(244, 244, 241)",
+ "effectiveBackground": [
+ 235.8,
+ 235.8,
+ 231.77499999999998
+ ],
+ "titleContrast": 14.223,
+ "captionContrast": 4.689
+ },
+ "scheme": "light",
+ "motion": "no-preference",
+ "passed": true
+ },
+ {
+ "pending": {
+ "opacity": "1",
+ "animations": 0,
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "contrast": 5.979
+ },
+ "ghost": {
+ "opacity": "1",
+ "titleColor": "rgb(27, 29, 33)",
+ "captionColor": "rgb(98, 105, 112)",
+ "boxFill": "rgb(228, 228, 223)",
+ "boxFillOpacity": "0.35",
+ "strokeDasharray": "4px, 3px",
+ "laneFill": "rgb(228, 228, 223)",
+ "laneFillOpacity": "0.25",
+ "wrapBackground": "rgb(244, 244, 241)",
+ "effectiveBackground": [
+ 235.8,
+ 235.8,
+ 231.77499999999998
+ ],
+ "titleContrast": 14.223,
+ "captionContrast": 4.689
+ },
+ "scheme": "light",
+ "motion": "reduce",
+ "passed": true
+ },
+ {
+ "pending": {
+ "opacity": "1",
+ "animations": 0,
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ "ghost": {
+ "opacity": "1",
+ "titleColor": "rgb(230, 232, 236)",
+ "captionColor": "rgb(168, 176, 188)",
+ "boxFill": "rgb(51, 55, 62)",
+ "boxFillOpacity": "0.35",
+ "strokeDasharray": "4px, 3px",
+ "laneFill": "rgb(51, 55, 62)",
+ "laneFillOpacity": "0.25",
+ "wrapBackground": "rgb(27, 29, 33)",
+ "effectiveBackground": [
+ 39.3,
+ 42.325,
+ 47.8625
+ ],
+ "titleContrast": 11.679,
+ "captionContrast": 6.551
+ },
+ "scheme": "dark",
+ "motion": "no-preference",
+ "passed": true
+ },
+ {
+ "pending": {
+ "opacity": "1",
+ "animations": 0,
+ "color": "rgb(239, 189, 99)",
+ "background": "rgb(46, 34, 16)",
+ "contrast": 8.968
+ },
+ "ghost": {
+ "opacity": "1",
+ "titleColor": "rgb(230, 232, 236)",
+ "captionColor": "rgb(168, 176, 188)",
+ "boxFill": "rgb(51, 55, 62)",
+ "boxFillOpacity": "0.35",
+ "strokeDasharray": "4px, 3px",
+ "laneFill": "rgb(51, 55, 62)",
+ "laneFillOpacity": "0.25",
+ "wrapBackground": "rgb(27, 29, 33)",
+ "effectiveBackground": [
+ 39.3,
+ 42.325,
+ 47.8625
+ ],
+ "titleContrast": 11.679,
+ "captionContrast": 6.551
+ },
+ "scheme": "dark",
+ "motion": "reduce",
+ "passed": true
+ }
+ ],
+ "passed": true
+}
diff --git a/docs/ui-consistency/evidence/sb07-09/focused-table-overflow.json b/docs/ui-consistency/evidence/sb07-09/focused-table-overflow.json
new file mode 100644
index 00000000..176c31b4
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/focused-table-overflow.json
@@ -0,0 +1,65 @@
+{
+ "results": [
+ {
+ "width": 350,
+ "scrollWidth": 1989,
+ "scrollLeft": 25,
+ "focused": true,
+ "payloadLength": 221,
+ "font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
+ "innerWidth": 390,
+ "documentScrollWidth": 390,
+ "DPR": 1,
+ "scheme": "light",
+ "physicalWidth": 390,
+ "zoom": 1,
+ "passed": true
+ },
+ {
+ "width": 350,
+ "scrollWidth": 1989,
+ "scrollLeft": 1,
+ "focused": true,
+ "payloadLength": 221,
+ "font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
+ "innerWidth": 390,
+ "documentScrollWidth": 390,
+ "DPR": 1,
+ "scheme": "dark",
+ "physicalWidth": 390,
+ "zoom": 1,
+ "passed": true
+ },
+ {
+ "width": 680,
+ "scrollWidth": 1989,
+ "scrollLeft": 19.5,
+ "focused": true,
+ "payloadLength": 221,
+ "font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
+ "innerWidth": 720,
+ "documentScrollWidth": 720,
+ "DPR": 2,
+ "scheme": "light",
+ "physicalWidth": 1440,
+ "zoom": 2,
+ "passed": true
+ },
+ {
+ "width": 680,
+ "scrollWidth": 1989,
+ "scrollLeft": 5,
+ "focused": true,
+ "payloadLength": 221,
+ "font": "\"IBM Plex Mono\", ui-monospace, \"Cascadia Mono\", Consolas, monospace",
+ "innerWidth": 720,
+ "documentScrollWidth": 720,
+ "DPR": 2,
+ "scheme": "dark",
+ "physicalWidth": 1440,
+ "zoom": 2,
+ "passed": true
+ }
+ ],
+ "passed": true
+}
diff --git a/docs/ui-consistency/evidence/sb07-09/full-suite.log b/docs/ui-consistency/evidence/sb07-09/full-suite.log
new file mode 100644
index 00000000..317c7b32
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/full-suite.log
@@ -0,0 +1,26 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+Results File: /Users/dohertj2/Desktop/ScadaBridge/docs/ui-consistency/evidence/sb07-09/sb07-09.trx
+
+Passed! - Failed: 0, Passed: 1582, Skipped: 0, Total: 1582, Duration: 33 s - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/ghost-opacity-before.json b/docs/ui-consistency/evidence/sb07-09/ghost-opacity-before.json
new file mode 100644
index 00000000..aedc1124
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/ghost-opacity-before.json
@@ -0,0 +1,7 @@
+{
+ "opacity": "0.45",
+ "text": "SCRIPT RUN\n predicted\n Synthetic predicted-only branch\n Not observed in this synthetic run",
+ "boxFill": "rgb(228, 228, 223)",
+ "boxFillOpacity": "0.35",
+ "titleColor": "rgb(27, 29, 33)"
+}
diff --git a/docs/ui-consistency/evidence/sb07-09/green-focused.log b/docs/ui-consistency/evidence/sb07-09/green-focused.log
new file mode 100644
index 00000000..481ebff2
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/green-focused.log
@@ -0,0 +1,25 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+
+Passed! - Failed: 0, Passed: 99, Skipped: 0, Total: 99, Duration: 857 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/manual-table-inventory.json b/docs/ui-consistency/evidence/sb07-09/manual-table-inventory.json
new file mode 100644
index 00000000..1e067236
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/manual-table-inventory.json
@@ -0,0 +1,200 @@
+[
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "line": 235,
+ "label": "Bundle import preview",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "line": 349,
+ "label": "Bundle import preview",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "line": 400,
+ "label": "Bundle import preview",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 492,
+ "label": "Template definitions",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 680,
+ "label": "Template definitions",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 908,
+ "label": "Template definitions",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 989,
+ "label": "Template definitions",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "line": 1157,
+ "label": "Template definitions",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
+ "line": 47,
+ "label": "Connection Certificates records",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
+ "line": 79,
+ "label": "Schema library",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
+ "line": 44,
+ "label": "LDAP group mappings",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
+ "line": 45,
+ "label": "API keys",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "line": 124,
+ "label": "Secured write requests",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "line": 192,
+ "label": "Secured write requests",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
+ "line": 87,
+ "label": "Configuration audit log",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
+ "line": 121,
+ "label": "Deployment status",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 213,
+ "label": "Instance configuration",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 350,
+ "label": "Instance configuration",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 438,
+ "label": "Instance configuration",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "line": 648,
+ "label": "Instance configuration",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
+ "line": 164,
+ "label": "Parked messages",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
+ "line": 181,
+ "label": "Alarm summary",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 363,
+ "label": "Health details",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 447,
+ "label": "Health details",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 486,
+ "label": "Health details",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "line": 539,
+ "label": "Health details",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
+ "line": 101,
+ "label": "Site event log results",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
+ "line": 147,
+ "label": "Site call results",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "line": 92,
+ "label": "Notification KPIs",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "line": 137,
+ "label": "Notification KPIs",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
+ "line": 48,
+ "label": "Notification lists",
+ "action": "reuse existing scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
+ "line": 95,
+ "label": "Notification recipients",
+ "action": "add local scroll container"
+ },
+ {
+ "file": "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor",
+ "line": 146,
+ "label": "Notification report results",
+ "action": "reuse existing scroll container"
+ }
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/page-header-paths.json b/docs/ui-consistency/evidence/sb07-09/page-header-paths.json
new file mode 100644
index 00000000..a23a019f
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/page-header-paths.json
@@ -0,0 +1,42 @@
+[
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor"
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/pending-motion-before.json b/docs/ui-consistency/evidence/sb07-09/pending-motion-before.json
new file mode 100644
index 00000000..7f0db442
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/pending-motion-before.json
@@ -0,0 +1,7 @@
+{
+ "opacity": "0.6",
+ "color": "rgb(133, 80, 0)",
+ "background": "rgb(253, 241, 221)",
+ "animationName": "fg-pulse-b-vd16xyvy19",
+ "reduced": false
+}
diff --git a/docs/ui-consistency/evidence/sb07-09/presentation-before-dark.png b/docs/ui-consistency/evidence/sb07-09/presentation-before-dark.png
new file mode 100644
index 00000000..02d1bf62
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/presentation-before-dark.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/presentation-before-light.png b/docs/ui-consistency/evidence/sb07-09/presentation-before-light.png
new file mode 100644
index 00000000..0123eed6
Binary files /dev/null and b/docs/ui-consistency/evidence/sb07-09/presentation-before-light.png differ
diff --git a/docs/ui-consistency/evidence/sb07-09/presentation-before.json b/docs/ui-consistency/evidence/sb07-09/presentation-before.json
new file mode 100644
index 00000000..d54edb25
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/presentation-before.json
@@ -0,0 +1,178 @@
+[
+ {
+ "scheme": "light",
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(255, 193, 7)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(13, 202, 240)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgba(33, 37, 41, 0.75)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(108, 117, 125)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(27, 29, 33)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(47, 95, 208)",
+ "background": "rgb(244, 244, 241)"
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(232, 146, 12)",
+ "background": "rgb(244, 244, 241)"
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outline": "rgb(27, 29, 33) none 0px"
+ }
+ },
+ {
+ "scheme": "dark",
+ "pairs": [
+ {
+ "text": "Successful sample",
+ "class": "text-success",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Warning sample",
+ "class": "text-warning",
+ "color": "rgb(255, 193, 7)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Failure sample",
+ "class": "text-danger",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Information sample",
+ "class": "text-info",
+ "color": "rgb(13, 202, 240)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Muted sample",
+ "class": "text-muted",
+ "color": "rgba(222, 226, 230, 0.75)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Secondary sample",
+ "class": "text-secondary",
+ "color": "rgb(108, 117, 125)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Ok",
+ "class": "ft-pill ok",
+ "color": "rgb(25, 135, 84)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Failed",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Timed out",
+ "class": "ft-pill failed",
+ "color": "rgb(220, 53, 69)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Predicted",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Not traced",
+ "class": "ft-pill",
+ "color": "rgb(230, 232, 236)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Pending",
+ "class": "ft-pill pending",
+ "color": "rgb(122, 160, 239)",
+ "background": "rgb(27, 29, 33)"
+ },
+ {
+ "text": "Parked",
+ "class": "ft-pill parked",
+ "color": "rgb(240, 160, 48)",
+ "background": "rgb(27, 29, 33)"
+ }
+ ],
+ "focus": {
+ "active": true,
+ "visible": true,
+ "outline": "rgb(230, 232, 236) none 0px"
+ }
+ }
+]
diff --git a/docs/ui-consistency/evidence/sb07-09/red-heading-table.log b/docs/ui-consistency/evidence/sb07-09/red-heading-table.log
new file mode 100644
index 00000000..3fe9356d
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/red-heading-table.log
@@ -0,0 +1,83 @@
+ ZB.MOM.WW.ScadaBridge.Commons -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Commons/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Commons.dll
+ ZB.MOM.WW.ScadaBridge.KpiHistory -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.KpiHistory/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.KpiHistory.dll
+ ZB.MOM.WW.ScadaBridge.Security -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Security/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Security.dll
+ ZB.MOM.WW.ScadaBridge.ScriptAnalysis -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.dll
+ ZB.MOM.WW.ScadaBridge.SiteEventLogging -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.SiteEventLogging/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.SiteEventLogging.dll
+ ZB.MOM.WW.ScadaBridge.StoreAndForward -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.StoreAndForward/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.StoreAndForward.dll
+ ZB.MOM.WW.ScadaBridge.ConfigurationDatabase -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.dll
+ ZB.MOM.WW.ScadaBridge.Communication -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Communication/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Communication.dll
+ ZB.MOM.WW.ScadaBridge.TemplateEngine -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.TemplateEngine.dll
+ ZB.MOM.WW.ScadaBridge.AuditLog -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.AuditLog/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.AuditLog.dll
+ ZB.MOM.WW.ScadaBridge.DeploymentManager -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.DeploymentManager/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.DeploymentManager.dll
+ ZB.MOM.WW.ScadaBridge.Transport -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.Transport/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.Transport.dll
+ ZB.MOM.WW.ScadaBridge.InboundAPI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.InboundAPI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.InboundAPI.dll
+ ZB.MOM.WW.ScadaBridge.ExternalSystemGateway -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ExternalSystemGateway.dll
+ ZB.MOM.WW.ScadaBridge.HealthMonitoring -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.HealthMonitoring/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.HealthMonitoring.dll
+ ZB.MOM.WW.ScadaBridge.NotificationService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationService.dll
+ ZB.MOM.WW.ScadaBridge.NotificationOutbox -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.NotificationOutbox/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.NotificationOutbox.dll
+ ZB.MOM.WW.ScadaBridge.ManagementService -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.ManagementService/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.ManagementService.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker -> /Users/dohertj2/Desktop/ScadaBridge/src/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.SandboxWorker.dll
+ ZB.MOM.WW.ScadaBridge.CentralUI.Tests -> /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll
+Test run for /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/bin/Release/net10.0/ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (.NETCoreApp,Version=v10.0)
+A total of 1 test files matched the specified pattern.
+[xUnit.net 00:00:00.31] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "error") [FAIL]
+[xUnit.net 00:00:00.32] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.Table_HasNamedKeyboardScrollRegion [FAIL]
+[xUnit.net 00:00:00.34] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loaded") [FAIL]
+[xUnit.net 00:00:00.34] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loading") [FAIL]
+[xUnit.net 00:00:00.35] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.FilterToEmpty_ThenClear_RestoresRealCount [FAIL]
+[xUnit.net 00:00:00.35] ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.EmptyTable_ShowsZeroItems [FAIL]
+ Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "error") [156 ms]
+ Error Message:
+ Assert.Single() Failure: The collection was empty
+ Stack Trace:
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 167
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 170
+--- End of stack trace from previous location ---
+ Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.Table_HasNamedKeyboardScrollRegion [154 ms]
+ Error Message:
+ Bunit.ElementNotFoundException : No elements were found that matches the selector '[role=region]'
+ Stack Trace:
+ at Bunit.RenderedComponentExtensions.Find[TComponent,TElement](IRenderedComponent`1 renderedComponent, String cssSelector) in /_/src/bunit/Extensions/RenderedComponentExtensions.cs:line 42
+ at Bunit.RenderedComponentExtensions.Find[TComponent](IRenderedComponent`1 renderedComponent, String cssSelector) in /_/src/bunit/Extensions/RenderedComponentExtensions.cs:line 21
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.Table_HasNamedKeyboardScrollRegion() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs:line 51
+ at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
+ at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
+ Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loaded") [15 ms]
+ Error Message:
+ Assert.Single() Failure: The collection was empty
+ Stack Trace:
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 167
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 170
+--- End of stack trace from previous location ---
+ Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(state: "loading") [4 ms]
+ Error Message:
+ Assert.Single() Failure: The collection was empty
+ Stack Trace:
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 167
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.TopologyPageTests.PageTitle_RemainsOneH1AcrossLoadStates(String state) in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs:line 170
+--- End of stack trace from previous location ---
+ Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.FilterToEmpty_ThenClear_RestoresRealCount [33 ms]
+ Error Message:
+ Assert.Equal() Failure: Strings differ
+ ↓ (pos 0)
+Expected: "0 items"
+Actual: "Showing 1–0 of 0 items"
+ ↑ (pos 0)
+ Stack Trace:
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.FilterToEmpty_ThenClear_RestoresRealCount() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs:line 41
+ at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
+ at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
+ Failed ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.EmptyTable_ShowsZeroItems [< 1 ms]
+ Error Message:
+ Assert.Equal() Failure: Strings differ
+ ↓ (pos 0)
+Expected: "0 items"
+Actual: "Showing 1–0 of 0 items"
+ ↑ (pos 0)
+ Stack Trace:
+ at ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared.DataTablePagerTests.EmptyTable_ShowsZeroItems() in /Users/dohertj2/Desktop/ScadaBridge/tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs:line 31
+ at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
+ at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
+
+Failed! - Failed: 6, Passed: 0, Skipped: 0, Total: 6, Duration: 197 ms - ZB.MOM.WW.ScadaBridge.CentralUI.Tests.dll (net10.0)
diff --git a/docs/ui-consistency/evidence/sb07-09/sb07-09-final.trx b/docs/ui-consistency/evidence/sb07-09/sb07-09-final.trx
new file mode 100644
index 00000000..1c1699c2
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/sb07-09-final.trx
@@ -0,0 +1,9654 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.4+50e68bbb8b (64-bit .NET 10.0.14)
+[xUnit.net 00:00:00.09] Discovering: ZB.MOM.WW.ScadaBridge.CentralUI.Tests
+[xUnit.net 00:00:00.20] Discovered: ZB.MOM.WW.ScadaBridge.CentralUI.Tests
+[xUnit.net 00:00:00.27] Starting: ZB.MOM.WW.ScadaBridge.CentralUI.Tests
+[INFO][11/13/2026 23:39:53.805Z][Thread 0017][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.813Z][Thread 0025][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.896Z][Thread 0025][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.938Z][Thread 0025][CoordinatedShutdown (akka://qs-drillin-notif-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.964Z][Thread 0025][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.976Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.984Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.984Z][Thread 0025][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:53.985Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.022Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.023Z][Thread 0025][CoordinatedShutdown (akka://qs-drillin-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.035Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.038Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.052Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.054Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.068Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.069Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.079Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.087Z][Thread 0028][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.093Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.096Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.103Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.103Z][Thread 0053][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.113Z][Thread 0020][CoordinatedShutdown (akka://notif-kpis-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.122Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.123Z][Thread 0046][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.132Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.138Z][Thread 0046][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.147Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.154Z][Thread 0042][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.168Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.170Z][Thread 0042][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.184Z][Thread 0042][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.186Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.193Z][Thread 0042][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.203Z][Thread 0042][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.226Z][Thread 0042][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.237Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.239Z][Thread 0050][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.253Z][Thread 0030][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.261Z][Thread 0036][CoordinatedShutdown (akka://notif-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.264Z][Thread 0030][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.274Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.290Z][Thread 0030][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.313Z][Thread 0030][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.316Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.325Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.333Z][Thread 0033][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.334Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.345Z][Thread 0033][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.363Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.371Z][Thread 0043][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.374Z][Thread 0043][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.381Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.381Z][Thread 0043][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.397Z][Thread 0043][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.399Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.412Z][Thread 0044][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.430Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.430Z][Thread 0044][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.448Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.456Z][Thread 0037][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.465Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.473Z][Thread 0054][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.476Z][Thread 0054][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.497Z][Thread 0054][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.503Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.513Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.514Z][Thread 0037][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.532Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.542Z][Thread 0037][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.543Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.557Z][Thread 0073][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.557Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.571Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.584Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.586Z][Thread 0073][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.600Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.609Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.657Z][Thread 0065][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.658Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.667Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.673Z][Thread 0065][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.674Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.692Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.694Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.695Z][Thread 0065][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.703Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.717Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.728Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.730Z][Thread 0068][CoordinatedShutdown (akka://flow-debug-service-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.739Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.740Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.792Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.798Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.824Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.831Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.843Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.847Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.857Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.940Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.941Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.963Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.970Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:54.978Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.060Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.075Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.093Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.657Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.667Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.676Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.692Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.693Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.711Z][Thread 0060][CoordinatedShutdown (akka://parked-mutation-f635e074ae8c48c1a0801a80984c0afb)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.711Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.725Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.731Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.737Z][Thread 0048][CoordinatedShutdown (akka://parked-mutation-4254058912ef4eb0abe55af27a5ed858)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.737Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.748Z][Thread 0035][CoordinatedShutdown (akka://site-calls-report-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.749Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.753Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.762Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.768Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.771Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.789Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.789Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.798Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.805Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.807Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.816Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.822Z][Thread 0038][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.842Z][Thread 0021][CoordinatedShutdown (akka://health-page-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[INFO][11/13/2026 23:39:55.853Z][Thread 0048][CoordinatedShutdown (akka://notif-report-modal-tests)] CoordinatedShutdown invoked due to [Reason:Akka.Actor.CoordinatedShutdown+ActorSystemTerminateReason]. Exiting with [ExitCode:0].
+[xUnit.net 00:00:34.46] Finished: ZB.MOM.WW.ScadaBridge.CentralUI.Tests
+
+
+
+
\ No newline at end of file
diff --git a/docs/ui-consistency/evidence/sb07-09/source-freeze.json b/docs/ui-consistency/evidence/sb07-09/source-freeze.json
new file mode 100644
index 00000000..98930264
--- /dev/null
+++ b/docs/ui-consistency/evidence/sb07-09/source-freeze.json
@@ -0,0 +1,55 @@
+{
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor": "7e08c7bf2ac55a307e5a0621124954a9c80464b32bec455087c72a47c3860ec1",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor": "6b253b9fe82c162f5e3933178690ecb1c62b766da61211411737214e2a31509b",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor": "7de28db08f9504656cc5f3116fb4ad50b04921a0cf1813d61134b621741d2209",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor": "634e511f9950fae16ca7c135a9fc2525b70dea642eeeb9d8eee006e659bba378",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor": "a51a6d4d78819b204dbb6df32d7f674d4ee192a16a2fa1c44f3d1443b4c01758",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/Sites.razor": "8a836b5b0901c3573c248c8f5c12697ff29c8948ee009b694d2f1b0cc1168fff",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor": "67a62d4e990e1ae70244b2d3146f2db340d3fc8e5ea77d75cbb87903edd89e59",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ConfigurationAuditLog.razor": "ab4a75ec947b28bff820cdf209630fe8ca08d52f7c1ea2e5b91310f55ded74b1",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/ExecutionTreePage.razor": "26b5cd0daa9fab103634b9689dd4c8000cd6710fcd31aefebc2f0b7fb843fb6a",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Dashboard.razor": "b0e07766b1a0cda9da2a51823913cff7f05689b52ad39b8021b06bf6a4c2234c",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/DebugView.razor": "770fb406174ab7178692f7e9838e583fba9e0165c88bbcc2ddc8add02bcc691c",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Deployments.razor": "1fd2773341ccf977a80b1c1dc81d7d0de14f36085f700ead8fbf18d4730eb81c",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor": "222f29b69dcfa79ed74837d918f041eccc4647b8484e47409b5b166cab4ce3c8",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/FlowDebugger.razor.css": "8c2cf0cf6c21115a780219adb6b8733efed8ee3c57df074484935add14e12ee0",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceConfigure.razor": "3a64e6b02af931d5cfcad2cf2c8a3f1a533c81494f2452f666e573490feffa4d",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/InstanceCreate.razor": "25d610f01bf403b2d115a96e9bc433dce2523af602fbd068c063886c0cbea751",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Deployment/Topology.razor": "37eccb6479b1c2a315ac80225d228ee7cd280047fa1be45d97e910f461319aec",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ApiMethodForm.razor": "819b7661d5e82d80e084b6bf44efe4c2ed15d2b68156fe4f27b25614dd280f29",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ConnectionCertificates.razor": "5d2ee928b4baf684399eb3ab8bfc000307541663f1c4c8b378a93fca4dc012e9",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnectionForm.razor": "d8b9771cd6ec48b64dffbdba66fa2ddc5f8cf0ab0555425a6678cf3de3f1cfc9",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DataConnections.razor": "bb90352b01a23d067b4235b3634f847ad5a8bf4746e97769e8c4b845ad5b80dd",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/DbConnectionForm.razor": "e6fd865071030824b3beaf6cea5c2b5c2929c82a2cc999361e3a7c55301fe369",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystemForm.razor": "e21a01b362b55bd65fb4e01e44c4ccfe284b44ef03056c66ac94b48d1befb41c",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/ExternalSystems.razor": "7ea5819b39e282869223183b854c00b5ec1eebc326fd7e0fd8f1179d53dc5f9b",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SchemaLibrary.razor": "d3a06cf247a33d19b4bb95619d513bdc92af845e3cf6b244c4fc37898c0917cd",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScriptForm.razor": "4a57014983f098bce6df59f0f6a16b59042957656d965733f9cbd2e5b3d5ce6c",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/SharedScripts.razor": "66933f0bee3436553eea87f46b08d17c57a166151f344d59029c30d25e36937b",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateCreate.razor": "da7f319b8446aadbc972c2721b169c94e4e28fbe9e5509bed2e6f555875edefd",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TemplateEdit.razor": "61e1e91175c30d60833d4033ae34efec80dea2f8185ba08d4c37f8272a5fc3e0",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/Templates.razor": "2f7d01190a3b2ea7022d3d6d8aa33bc828d8477b3bb0bcdeab666fd7516f241f",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportExport.razor": "f2231b81339001e198cc275c46b22678f3032adad4ebdc92d9399ff3ba5b2bb4",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Design/TransportImport.razor": "a168e80bb1a5dcf1e942a9830e510e12ad5caf6ccdb57741af3a68b4b7e2250f",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/AlarmSummary.razor": "7f0f99955244726429d985472d05c523ad0c09af272ff03aa9747b793333fd76",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/EventLogs.razor": "74e03bd3768e14e57b71e972cb26b617240191b697a78647f07dcd8d440a8af7",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor": "e5b673ddbdda70433358b42db378c3438626244b8355b81baabffedcf6e478e8",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/ParkedMessages.razor": "cd4be2b3549f30010c07f41e17a8a09f8453e3c59daeaef7d5e02433977dfcc9",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationKpis.razor": "df5d70d4759591abd5947a97ef09ced33a5347bd79899763530f01ae9b934f5d",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationListForm.razor": "dce2ae3c5cfb488c0e38601910b3c01aaaeb3c50a569851bf7755a509c054a35",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationLists.razor": "3768242c8e66f5c7ce212d6e77a7522425b73e756a8b27d1208ea9a6b85a3b32",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/NotificationReport.razor": "8a6134e1fd3afd2cd557bd18a14cca6057b86f0f27bf549f6017db2e43bbb8e3",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmsConfiguration.razor": "e349625ebd7b3c876ca72e35853312639b6a4f25b62ab4059cee68c1383273e7",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Notifications/SmtpConfiguration.razor": "f03c8025344d8978aa9d3beb5c87b5adc649a16acd036e203321c8349b51e2c0",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Operations/SecuredWrites.razor": "9820daef67dce91cc9f94eee7ea37ee8a4f6828a1f5d2ddbcf4f905ee80aa1a0",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor": "1ed888f12a6c61fa839d0b562782fd93d590e82dca31b380c5e0a1040a7ed733",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/DataTable.razor": "0089a6b7c20cf18728faa60b52700243abd76a8f97b430a0267055eb0fda7499",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/FlowGraphView.razor.css": "52af8e2873e332cfbdf4993e0c1934370da60f2246dfa527a22807c4decc6e77",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Shared/FlowTraceList.razor.css": "6c69112dffa14a5ed1f54d5a64298df1f3708ec570f0d771ffc8ff814fec9abe",
+ "src/ZB.MOM.WW.ScadaBridge.CentralUI/wwwroot/css/site.css": "e40dc7c5fd9ca6139192cd2698909910c9a4e1e0cab0849a8653aaf627835ca2",
+ "tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/Shared/DataTablePagerTests.cs": "68d8f0d89f92bb04c68bdb9dcf2e0a32f8077ce467b54b8608836aa0532841b7",
+ "tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests/TopologyPageTests.cs": "d9347828d8a9913b7da501377739826d29a7b7479895169332ddfaf160ca6e3c",
+ "infra/tools/inspect_presentation.py": "55d819077c696ff1708646fd07b661c43a075ceef73faa9ffd70fe7a5532620f",
+ "infra/tools/test_table_overflow.py": "df0a611a3c3a85e60e6e74c6eaf074c7f08a68c3ba352dbdaf305bdcd5e25fd2",
+ "infra/tools/test_flow_text_opacity.py": "1ba2dace2b2ac87fce8aa38d545d5ee459eac0772a4776653c8f83a853bbe94d"
+}
diff --git a/infra/tools/inspect_presentation.py b/infra/tools/inspect_presentation.py
new file mode 100644
index 00000000..80f5cb76
--- /dev/null
+++ b/infra/tools/inspect_presentation.py
@@ -0,0 +1,42 @@
+"""Bounded actual-component presentation matrix, loopback synthetic values only."""
+from pathlib import Path
+import json,re,sys
+from playwright.sync_api import sync_playwright
+sys.path.insert(0,'/Users/dohertj2/.codex/worktrees/scada-ui-consistency/scadaproj/components/ui-theme/validation/theme-1.0.0/canary')
+from browser_zoom import zoom_browser,set_browser_zoom
+out=Path('docs/ui-consistency/evidence/sb07-09/browser');out.mkdir(parents=True,exist_ok=True)
+def contrast(fg,bg):
+ def parts(s):return [float(v) for v in re.findall(r'[\d.]+',s)]
+ def lum(a):
+ a=[v/255 for v in a[:3]];a=[v/12.92 if v<=.04045 else ((v+.055)/1.055)**2.4 for v in a];return sum(x*y for x,y in zip(a,[.2126,.7152,.0722]))
+ a,b=parts(fg),parts(bg)
+ if len(a)==4:a=[a[i]*a[3]+b[i]*(1-a[3]) for i in range(3)]
+ lo,hi=sorted([lum(a),lum(b)]);return round((hi+.05)/(lo+.05),3)
+results=[]
+with sync_playwright() as p:
+ with zoom_browser(p,width=1440,height=1000) as (context,worker):
+ cases=[('presentation',w,s,1) for w in [1440,1024,390] for s in ['light','dark']]+[('presentation',1440,s,2) for s in ['light','dark']]+[(kind,w,s,1) for kind in ['dashboard','sms','smtp'] for w in [1440,390] for s in ['light','dark']]
+ for kind,width,scheme,zoom in cases:
+ page=context.new_page();page.set_viewport_size({'width':width,'height':1000});page.emulate_media(reduced_motion='reduce');errors=[];page.on('pageerror',lambda e:errors.append(str(e)))
+ route='/presentation' if kind=='presentation' else '/batch-two?sample=dashboard' if kind=='dashboard' else '/form-samples?view='+kind
+ page.goto('http://127.0.0.1:5201'+route,wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme)
+ if kind in ['sms','smtp']:page.get_by_role('button',name='Add '+kind.upper()+' configuration',exact=True).click();page.locator('input[type=password]').wait_for()
+ record={'kind':kind,'width':width,'scheme':scheme,'zoom':zoom,'checks':{}}
+ if zoom==2:record['browserZoom']=set_browser_zoom(worker,page,2)
+ record['layout']=page.evaluate('({innerWidth,scrollWidth:document.documentElement.scrollWidth,DPR:devicePixelRatio})');record['checks']['noDocumentOverflow']=record['layout']['innerWidth']==record['layout']['scrollWidth'];record['checks']['onePageHeading']=page.locator('h1').count()==1
+ if kind=='presentation':
+ record['pairs']=page.evaluate('''()=>[...document.querySelectorAll('.fg-pill,.ft-pill,#utility-samples span')].map(e=>{let c=getComputedStyle(e),p=e,bg;while(p){let b=getComputedStyle(p).backgroundColor;if(b!=='rgba(0, 0, 0, 0)'&&b!=='transparent'){bg=b;break;}p=p.parentElement;}return {text:e.textContent.trim(),class:e.className,color:c.color,background:bg};})''')
+ for pair in record['pairs']:pair['contrast']=contrast(pair['color'],pair['background'])
+ record['checks']['readableStateAndUtilityText']=all(pair['contrast']>=4.5 for pair in record['pairs'])
+ page.locator('.ft-row').first.focus();page.keyboard.press('Tab');record['focus']=page.locator('.ft-row').nth(1).evaluate('e=>{let c=getComputedStyle(e);return {active:e===document.activeElement,visible:e.matches(":focus-visible"),outlineWidth:c.outlineWidth,outlineStyle:c.outlineStyle,outlineColor:c.outlineColor}}');record['checks']['traceKeyboardFocus']=record['focus']['active'] and record['focus']['visible'] and record['focus']['outlineWidth']=='2px' and record['focus']['outlineStyle']=='solid'
+ region=page.get_by_role('region',name='Synthetic records',exact=True);record['table']=region.evaluate('e=>({width:e.clientWidth,scrollWidth:e.scrollWidth,tabindex:e.tabIndex})')
+ if record['table']['scrollWidth']>record['table']['width']:
+ region.focus();page.keyboard.press('ArrowRight');page.wait_for_function('document.querySelector("[aria-label=\\"Synthetic records\\"]").scrollLeft>0')
+ record['checks']['tableKeyboardRegion']=record['table']['tabindex']==0
+ record['rowHeader']=region.locator('th[scope=row]').first.evaluate('e=>({position:getComputedStyle(e).position,textTransform:getComputedStyle(e).textTransform})');record['checks']['rowHeadersKeepSemantics']=record['rowHeader']=={'position':'static','textTransform':'none'}
+ search=page.get_by_label('Search',exact=True);search.fill('no-match');page.wait_for_function('document.querySelector(".table-responsive + .text-muted")?.textContent.trim()==="0 items" || [...document.querySelectorAll(".text-muted.small")].some(e=>e.textContent.trim()==="0 items")');record['checks']['emptyCount']=page.get_by_text('0 items',exact=True).count()==1;page.get_by_role('button',name='Clear search',exact=True).click();page.wait_for_function('document.querySelector("[aria-label=\\"Synthetic records\\"] tbody").textContent.includes("Plant A")')
+ else:record['headingStyle']=page.locator('h1').evaluate('e=>({font:getComputedStyle(e).fontFamily,size:getComputedStyle(e).fontSize})');record['checks']['sharedHeadingScale']=record['headingStyle']['size']=='20px'
+ record['errors']=errors;record['checks']['noBrowserError']=not errors;page.screenshot(path=str(out/f'{kind}-{scheme}-{width}-zoom{zoom}.png'),full_page=zoom!=2);results.append(record)
+ if zoom==2:set_browser_zoom(worker,page,1)
+ page.close()
+(out/'results.json').write_text(json.dumps({'results':results,'passed':all(all(r['checks'].values()) for r in results)},indent=2)+'\n');print([(r['kind'],r['width'],r['scheme'],r['zoom'],all(r['checks'].values())) for r in results])
diff --git a/infra/tools/test_flow_text_opacity.py b/infra/tools/test_flow_text_opacity.py
new file mode 100644
index 00000000..946e90a8
--- /dev/null
+++ b/infra/tools/test_flow_text_opacity.py
@@ -0,0 +1,20 @@
+"""Focused normal/reduced-motion and predicted-ghost text proof; no screenshot loop."""
+import json,re
+from pathlib import Path
+from playwright.sync_api import sync_playwright
+
+def rgb(s):return [float(v) for v in re.findall(r'[\d.]+',s)][:3]
+def mix(f,b,a):return [f[i]*a+b[i]*(1-a) for i in range(3)]
+def ratio(a,b):
+ def lum(v):
+ v=[x/255 for x in v];v=[x/12.92 if x<=.04045 else ((x+.055)/1.055)**2.4 for x in v];return sum(x*y for x,y in zip(v,[.2126,.7152,.0722]))
+ lo,hi=sorted([lum(a),lum(b)]);return round((hi+.05)/(lo+.05),3)
+results=[]
+with sync_playwright() as p:
+ browser=p.chromium.launch(channel='chromium')
+ for scheme in ['light','dark']:
+ for motion in ['no-preference','reduce']:
+ page=browser.new_page(reduced_motion=motion);page.goto('http://127.0.0.1:5201/presentation',wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme)
+ record=page.evaluate('''()=>{const p=document.querySelector('.fg-node.pending .fg-pill'),g=document.querySelector('.fg-node.ghost'),r=g.querySelector('.fg-node-box'),lane=document.querySelector('.fg-lane-bg.alt');const pc=getComputedStyle(p),gc=getComputedStyle(g),rc=getComputedStyle(r),lc=getComputedStyle(lane);return {pending:{opacity:pc.opacity,animations:p.getAnimations().length,color:pc.color,background:pc.backgroundColor},ghost:{opacity:gc.opacity,titleColor:getComputedStyle(g.querySelector('.fg-title')).color,captionColor:getComputedStyle(g.querySelector('.fg-eyebrow')).color,boxFill:rc.fill,boxFillOpacity:rc.fillOpacity,strokeDasharray:rc.strokeDasharray,laneFill:lc.fill,laneFillOpacity:lc.fillOpacity,wrapBackground:getComputedStyle(document.querySelector('.fg-wrap')).backgroundColor}};}''');record.update({'scheme':scheme,'motion':motion});ghost=record['ghost'];base=mix(rgb(ghost['laneFill']),rgb(ghost['wrapBackground']),float(ghost['laneFillOpacity']));background=mix(rgb(ghost['boxFill']),base,float(ghost['boxFillOpacity']));ghost['effectiveBackground']=background;ghost['titleContrast']=ratio(rgb(ghost['titleColor']),background);ghost['captionContrast']=ratio(rgb(ghost['captionColor']),background);record['pending']['contrast']=ratio(rgb(record['pending']['color']),rgb(record['pending']['background']));record['passed']=record['pending']['opacity']=='1' and record['pending']['animations']==0 and ghost['opacity']=='1' and min(ghost['titleContrast'],ghost['captionContrast'],record['pending']['contrast'])>=4.5;results.append(record);page.close()
+ browser.close()
+Path('docs/ui-consistency/evidence/sb07-09/flow-text-opacity-after.json').write_text(json.dumps({'results':results,'passed':all(r['passed'] for r in results)},indent=2)+'\n');print([(r['scheme'],r['motion'],r['passed'],r['ghost']['titleContrast'],r['ghost']['captionContrast']) for r in results])
diff --git a/infra/tools/test_table_overflow.py b/infra/tools/test_table_overflow.py
new file mode 100644
index 00000000..d86a7d53
--- /dev/null
+++ b/infra/tools/test_table_overflow.py
@@ -0,0 +1,18 @@
+"""Focused long unbroken identifier case for the actual DataTable region."""
+import json,sys
+from pathlib import Path
+from playwright.sync_api import sync_playwright
+sys.path.insert(0,'/Users/dohertj2/.codex/worktrees/scada-ui-consistency/scadaproj/components/ui-theme/validation/theme-1.0.0/canary')
+from browser_zoom import zoom_browser,set_browser_zoom
+results=[]
+with sync_playwright() as p:
+ with zoom_browser(p,width=1440,height=1000) as (context,worker):
+ for width,zoom in [(390,1),(1440,2)]:
+ for scheme in ['light','dark']:
+ page=context.new_page();page.set_viewport_size({'width':width,'height':1000});page.emulate_media(reduced_motion='reduce');page.goto('http://127.0.0.1:5201/presentation',wait_until='networkidle');page.evaluate('s=>window.sbTheme.set(s)',scheme)
+ if zoom==2:set_browser_zoom(worker,page,2)
+ region=page.get_by_role('region',name='Synthetic records',exact=True);region.focus();page.keyboard.press('ArrowRight');page.wait_for_function('selector=>document.querySelector(selector).scrollLeft>0',arg='[aria-label="Synthetic records"]')
+ result=region.evaluate('e=>({width:e.clientWidth,scrollWidth:e.scrollWidth,scrollLeft:e.scrollLeft,focused:e===document.activeElement,payloadLength:e.querySelector("tbody td span").textContent.length,font:getComputedStyle(e.querySelector("tbody td span")).fontFamily})');result.update(page.evaluate('({innerWidth,documentScrollWidth:document.documentElement.scrollWidth,DPR:devicePixelRatio})'));result.update({'scheme':scheme,'physicalWidth':width,'zoom':zoom});result['passed']=result['scrollWidth']>result['width'] and result['scrollLeft']>0 and result['focused'] and result['innerWidth']==result['documentScrollWidth'] and result['payloadLength']==221;results.append(result)
+ if zoom==2:set_browser_zoom(worker,page,1)
+ page.close()
+Path('docs/ui-consistency/evidence/sb07-09/focused-table-overflow.json').write_text(json.dumps({'results':results,'passed':all(r['passed'] for r in results)},indent=2)+'\n');print(results)
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor
index 2ee97635..65690568 100644
--- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor
+++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeyForm.razor
@@ -13,11 +13,11 @@
@inject IJSRuntime JS
-
+
← Back
·
-
+
@if (_saved)
{
@:API Key Created
@@ -30,7 +30,7 @@
{
@:Add API Key
}
-
+
@* Drill-in: deep-link into the central Audit Log
pre-filtered to this API key's inbound calls. Inbound audit rows record
the key Name as Actor and live on the ApiInbound channel. *@
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor
index 5d08d6ef..1c5f8531 100644
--- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor
+++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/ApiKeys.razor
@@ -9,8 +9,8 @@
@inject IDialogService Dialog
-
-
API Key Management
+
+
API Key Management
NavigationManager.NavigateTo("/admin/api-keys/create")'>Add API Key
@@ -42,8 +42,9 @@
}
else
{
-
-
+
+
+
Key ID
Name
@@ -99,6 +100,7 @@
}
+
}
}
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor
index 5586169a..d49d5c95 100644
--- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor
+++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappingForm.razor
@@ -14,6 +14,7 @@
@inject IDialogService Dialog
+
@(Id.HasValue ? "Edit LDAP Mapping" : "Add LDAP Mapping")
-
Mapping
+
Mapping
LDAP Group Name
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor
index a3837af5..6fedfdb9 100644
--- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor
+++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/LdapMappings.razor
@@ -10,8 +10,8 @@
@inject NavigationManager NavigationManager
-
-
LDAP Group Mappings
+
+
LDAP Group Mappings
NavigationManager.NavigateTo("/admin/ldap-mappings/create")'>Add Mapping
@@ -41,8 +41,9 @@
}
else
{
-
-
+
+
+
ID
LDAP Group Name
@@ -95,6 +96,7 @@
}
+
}
}
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor
index a907913d..9c325214 100644
--- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor
+++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Admin/SiteForm.razor
@@ -13,6 +13,7 @@
@inject NavigationManager NavigationManager
+
@(IsEditMode ? "Edit Site" : "Add Site")