diff --git a/web/assets/css/cyberpunk-theme.css b/web/assets/css/cyberpunk-theme.css
new file mode 100644
index 00000000..074bbe04
--- /dev/null
+++ b/web/assets/css/cyberpunk-theme.css
@@ -0,0 +1,532 @@
+@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap');
+
+body.cyberpunk {
+ --font-mono: 'JetBrains Mono', 'IBM Plex Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
+
+ --bg-app: #090b10;
+ --bg-panel: #0f131b;
+ --bg-elev: #161c27;
+ --bg-soft: #1b2331;
+
+ --text-1: #e6edf7;
+ --text-2: #b8c3d6;
+ --text-3: #7d8aa1;
+
+ --line-1: #263044;
+ --line-2: #33415a;
+ --accent: #8aa4d6;
+ --accent-2: #9fb5dd;
+ --danger: #c97f90;
+ --success: #85b79a;
+ --warn: #c8b08a;
+
+ color: var(--text-1);
+ font-family: var(--font-mono);
+ letter-spacing: 0;
+ background-color: var(--bg-app);
+ background-image:
+ linear-gradient(rgba(160, 180, 210, 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(160, 180, 210, 0.03) 1px, transparent 1px);
+ background-size: 24px 24px;
+}
+
+body.cyberpunk * {
+ font-family: var(--font-mono) !important;
+ transition: background-color 180ms ease, color 180ms ease, border-color 180ms ease, box-shadow 180ms ease !important;
+}
+
+body.cyberpunk #app {
+ padding: 10px;
+}
+
+body.cyberpunk .ant-layout,
+body.cyberpunk .ant-layout-content,
+body.cyberpunk #content-layout,
+body.cyberpunk .ant-drawer-content,
+body.cyberpunk .ant-drawer-wrapper-body,
+body.cyberpunk .ant-menu,
+body.cyberpunk .ant-menu-sub {
+ background: transparent !important;
+ color: var(--text-1);
+}
+
+body.cyberpunk .ant-layout-content {
+ margin-left: 10px;
+}
+
+body.cyberpunk .ant-layout-sider {
+ background: var(--bg-panel) !important;
+ border: 1px solid var(--line-1);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+body.cyberpunk .ant-layout-sider,
+body.cyberpunk .ant-card,
+body.cyberpunk .ant-alert,
+body.cyberpunk .ant-tabs,
+body.cyberpunk .ant-table,
+body.cyberpunk .ant-modal-content {
+ box-shadow: none !important;
+ text-shadow: none !important;
+}
+
+body.cyberpunk .ant-layout-sider-children {
+ padding: 8px;
+}
+
+body.cyberpunk .ant-sidebar > .ant-layout-sider {
+ min-width: 72px !important;
+}
+
+body.cyberpunk .panel-brand {
+ margin: 8px;
+ padding: 8px;
+ border: 1px solid var(--line-1);
+ border-radius: 2px;
+ background: var(--bg-elev);
+}
+
+body.cyberpunk .panel-brand-mark {
+ border-radius: 2px;
+ background: #202938;
+ border: 1px solid var(--line-2);
+ color: var(--text-1);
+}
+
+body.cyberpunk .panel-brand-text {
+ color: var(--text-2);
+}
+
+body.cyberpunk .ant-menu-item,
+body.cyberpunk .ant-menu-submenu-title,
+body.cyberpunk .ant-menu-theme-switch {
+ min-height: 40px;
+ line-height: 40px;
+ border-radius: 2px;
+ border: 1px solid transparent;
+ margin: 4px 0 !important;
+ color: var(--text-2) !important;
+}
+
+body.cyberpunk .ant-menu-inline .ant-menu-item,
+body.cyberpunk .ant-menu-inline .ant-menu-submenu-title {
+ width: calc(100% - 4px);
+ margin-left: 2px !important;
+ margin-right: 2px !important;
+}
+
+body.cyberpunk .ant-menu-item > span {
+ display: inline-block;
+ max-width: 100%;
+}
+
+body.cyberpunk .ant-menu-inline-collapsed > .ant-menu-item > span {
+ display: none;
+}
+
+body.cyberpunk .ant-menu-item .anticon,
+body.cyberpunk .ant-menu-submenu-title .anticon {
+ color: var(--text-3) !important;
+}
+
+body.cyberpunk .ant-menu-item:hover,
+body.cyberpunk .ant-menu-submenu-title:hover,
+body.cyberpunk .ant-menu-theme-switch:hover {
+ background: var(--bg-elev) !important;
+ border-color: var(--line-1);
+ color: var(--text-1) !important;
+}
+
+body.cyberpunk .ant-menu-item-selected {
+ background: #202d43 !important;
+ border-color: #435779 !important;
+ color: var(--text-1) !important;
+}
+
+body.cyberpunk .ant-menu-item-selected .anticon {
+ color: var(--accent) !important;
+}
+
+body.cyberpunk .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {
+ background-color: #202d43 !important;
+ background-image: none !important;
+ animation: none !important;
+ border-radius: 2px !important;
+}
+
+body.cyberpunk .ant-layout-sider .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected,
+body.cyberpunk .ant-layout-sider .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected:hover,
+body.cyberpunk .ant-layout-sider .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected:active {
+ background: #202d43 !important;
+ background-color: #202d43 !important;
+ background-image: none !important;
+ border-color: #435779 !important;
+ color: var(--text-1) !important;
+}
+
+body.cyberpunk .ant-layout-sider .ant-menu-item-active,
+body.cyberpunk .ant-layout-sider .ant-menu-item:hover,
+body.cyberpunk .ant-layout-sider .ant-menu-submenu-title:hover {
+ background: #172033 !important;
+ background-image: none !important;
+ border-color: var(--line-1) !important;
+ color: var(--text-1) !important;
+}
+
+body.cyberpunk .ant-menu-item:active,
+body.cyberpunk .ant-menu-item-active,
+body.cyberpunk .ant-menu-item:hover,
+body.cyberpunk .ant-menu-submenu-title:hover {
+ background-image: none !important;
+}
+
+body.cyberpunk .ant-layout-sider-collapsed .ant-menu-item,
+body.cyberpunk .ant-layout-sider-collapsed .ant-menu-submenu-title {
+ padding-inline: 0 !important;
+ text-align: center;
+}
+
+body.cyberpunk .ant-layout-sider-collapsed .ant-menu-item .anticon,
+body.cyberpunk .ant-layout-sider-collapsed .ant-menu-submenu-title .anticon {
+ margin: 0 !important;
+ font-size: 14px;
+ color: #94a4bf !important;
+}
+
+body.cyberpunk .ant-layout-sider-collapsed .ant-menu-item-selected .anticon {
+ color: #d0dcef !important;
+}
+
+body.cyberpunk .ant-layout-sider-trigger {
+ background: #141e2f !important;
+ border-top: 1px solid var(--line-1);
+ color: var(--text-3) !important;
+ height: 36px;
+ line-height: 36px;
+}
+
+body.cyberpunk .ant-layout-sider-trigger:hover {
+ background: #1a273c !important;
+ color: var(--text-1) !important;
+}
+
+body.cyberpunk .ant-submenu-arrow,
+body.cyberpunk .ant-menu-submenu-arrow::before,
+body.cyberpunk .ant-menu-submenu-arrow::after {
+ background: var(--text-3) !important;
+}
+
+body.cyberpunk .ant-radio-wrapper {
+ color: var(--text-1) !important;
+ opacity: 1 !important;
+ font-size: 12px;
+}
+
+body.cyberpunk .ant-radio-inner {
+ border-radius: 2px;
+ border-color: var(--line-2);
+ background: #101521;
+}
+
+body.cyberpunk .ant-radio-inner::after {
+ background: var(--accent);
+}
+
+body.cyberpunk .ant-radio-wrapper:hover .ant-radio-inner,
+body.cyberpunk .ant-radio-checked .ant-radio-inner {
+ border-color: var(--accent);
+}
+
+body.cyberpunk .ant-alert {
+ border-radius: 2px;
+ border: 1px solid #5b3740;
+ background: #271a1f;
+}
+
+body.cyberpunk .theme-picker-item,
+body.cyberpunk .theme-picker-item.ant-menu-item {
+ height: auto !important;
+ line-height: normal !important;
+}
+
+body.cyberpunk .theme-picker-item .ant-radio-group,
+body.cyberpunk .theme-picker-item .ant-space {
+ width: 100%;
+}
+
+body.cyberpunk .theme-picker-item .ant-radio-wrapper {
+ min-height: 24px;
+ align-items: center;
+}
+
+body.cyberpunk .ant-alert-message {
+ color: #dfb0bb;
+ font-weight: 600;
+}
+
+body.cyberpunk .ant-alert-description {
+ color: #c396a1;
+}
+
+body.cyberpunk .ant-card,
+body.cyberpunk .ant-tabs,
+body.cyberpunk .ant-table,
+body.cyberpunk .ant-modal-content,
+body.cyberpunk .ant-dropdown-menu,
+body.cyberpunk .ant-popover-inner,
+body.cyberpunk .ant-select-dropdown,
+body.cyberpunk .ant-calendar,
+body.cyberpunk .ant-collapse {
+ background: var(--bg-panel);
+ border: 1px solid var(--line-1);
+ border-radius: 2px !important;
+ box-shadow: none;
+ color: var(--text-1);
+}
+
+body.cyberpunk .ant-card::before,
+body.cyberpunk .ant-card::after {
+ content: none !important;
+}
+
+body.cyberpunk .ant-card:hover {
+ border-color: var(--line-2);
+}
+
+body.cyberpunk .ant-card-head,
+body.cyberpunk .ant-modal-header,
+body.cyberpunk .ant-collapse > .ant-collapse-item > .ant-collapse-header,
+body.cyberpunk .ant-table-thead > tr > th {
+ background: var(--bg-elev);
+ border-bottom: 1px solid var(--line-1);
+}
+
+body.cyberpunk .ant-card-head-title,
+body.cyberpunk .ant-modal-title,
+body.cyberpunk .ant-form-item-label > label,
+body.cyberpunk .ant-statistic-title,
+body.cyberpunk .ant-table-thead > tr > th {
+ color: var(--text-2) !important;
+ font-size: 12px;
+ font-weight: 600;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+}
+
+body.cyberpunk .ant-card-actions {
+ background: var(--bg-elev);
+ border-top: 1px solid var(--line-1);
+}
+
+body.cyberpunk .ant-card-actions > li > span {
+ color: var(--text-2);
+}
+
+body.cyberpunk .ant-btn {
+ border-radius: 2px !important;
+ height: 34px;
+ text-transform: uppercase;
+ font-size: 11px;
+ letter-spacing: 0.05em;
+}
+
+body.cyberpunk .ant-btn,
+body.cyberpunk .ant-btn-default {
+ background: var(--bg-elev);
+ border-color: var(--line-2);
+ color: var(--text-2);
+}
+
+body.cyberpunk .ant-btn:hover,
+body.cyberpunk .ant-btn:focus {
+ border-color: var(--accent);
+ color: var(--text-1);
+ background: var(--bg-soft);
+ box-shadow: none;
+}
+
+body.cyberpunk .ant-btn-primary {
+ background: #243248;
+ border-color: #3e5374;
+ color: #dbe6f7;
+}
+
+body.cyberpunk .ant-btn-primary:hover,
+body.cyberpunk .ant-btn-primary:focus {
+ background: #2a3b56;
+ border-color: #4b6288;
+}
+
+body.cyberpunk .ant-btn-danger,
+body.cyberpunk .ant-btn-dangerous {
+ background: #3a262c;
+ border-color: #70424d;
+ color: #d9a9b4;
+}
+
+body.cyberpunk .ant-input,
+body.cyberpunk .ant-input-number,
+body.cyberpunk .ant-input-number-input,
+body.cyberpunk .ant-select-selection,
+body.cyberpunk textarea.ant-input {
+ background: #0d121d !important;
+ border: 1px solid var(--line-2) !important;
+ border-radius: 2px !important;
+ color: var(--text-1) !important;
+ min-height: 34px;
+}
+
+body.cyberpunk .ant-input::placeholder,
+body.cyberpunk textarea.ant-input::placeholder {
+ color: var(--text-3);
+}
+
+body.cyberpunk .ant-input:hover,
+body.cyberpunk .ant-input:focus,
+body.cyberpunk .ant-input-number:hover,
+body.cyberpunk .ant-input-number-focused,
+body.cyberpunk .ant-select-focused .ant-select-selection,
+body.cyberpunk .ant-select-selection:hover {
+ border-color: var(--accent) !important;
+ box-shadow: none !important;
+}
+
+body.cyberpunk .ant-tag {
+ border-radius: 2px;
+ background: #1a2230;
+ border: 1px solid var(--line-2);
+ color: var(--text-2);
+ font-size: 11px;
+}
+
+body.cyberpunk .ant-tag-green { background: #1d2b25; border-color: #355241; color: #9cccb0; }
+body.cyberpunk .ant-tag-red { background: #2f2025; border-color: #5f3a45; color: #d6a0ad; }
+body.cyberpunk .ant-tag-orange { background: #31291f; border-color: #64523a; color: #d2bc97; }
+body.cyberpunk .ant-tag-purple { background: #202736; border-color: #3f4f6b; color: #b6c7e7; }
+
+body.cyberpunk .ant-statistic-content {
+ font-size: 18px;
+ font-weight: 700;
+ color: var(--text-1);
+}
+
+body.cyberpunk .ant-progress-text {
+ color: var(--text-2);
+ font-size: 12px;
+}
+
+body.cyberpunk .ant-progress-trail {
+ stroke: #273247;
+}
+
+body.cyberpunk .ant-table {
+ font-size: 12px;
+}
+
+body.cyberpunk .ant-table-thead > tr > th {
+ color: var(--text-2);
+}
+
+body.cyberpunk .ant-table-tbody > tr > td {
+ border-bottom: 1px solid #212c3f;
+ color: var(--text-2);
+}
+
+body.cyberpunk .ant-table-tbody > tr:hover > td {
+ background: #1a2232;
+}
+
+body.cyberpunk .ant-pagination-item,
+body.cyberpunk .ant-pagination-prev .ant-pagination-item-link,
+body.cyberpunk .ant-pagination-next .ant-pagination-item-link {
+ background: var(--bg-elev);
+ border: 1px solid var(--line-2);
+ border-radius: 2px;
+ color: var(--text-2);
+}
+
+body.cyberpunk .ant-pagination-item-active {
+ border-color: var(--accent);
+}
+
+body.cyberpunk .ant-tabs-bar {
+ border-bottom: 1px solid var(--line-1);
+}
+
+body.cyberpunk .ant-tabs-tab {
+ color: var(--text-3);
+ text-transform: uppercase;
+ font-size: 12px;
+}
+
+body.cyberpunk .ant-tabs-tab:hover,
+body.cyberpunk .ant-tabs-tab-active {
+ color: var(--text-1);
+}
+
+body.cyberpunk .ant-tabs-ink-bar {
+ background: var(--accent-2);
+ height: 2px;
+}
+
+body.cyberpunk .ant-modal-mask {
+ background: rgba(6, 8, 12, 0.78);
+}
+
+body.cyberpunk .waves-header {
+ background: transparent !important;
+}
+
+body.cyberpunk .title,
+body.cyberpunk h1,
+body.cyberpunk h2,
+body.cyberpunk h3 {
+ letter-spacing: 0.03em;
+}
+
+body.cyberpunk .xray-running-animation .ant-badge-status-dot,
+body.cyberpunk .online-animation .ant-badge-status-dot {
+ animation: none;
+ box-shadow: none;
+}
+
+body.cyberpunk ::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+
+body.cyberpunk ::-webkit-scrollbar-thumb {
+ border-radius: 2px;
+ background: #2a3448;
+}
+
+body.cyberpunk ::-webkit-scrollbar-thumb:hover {
+ background: #374761;
+}
+
+@media (max-width: 768px) {
+ body.cyberpunk #app { padding: 6px; }
+ body.cyberpunk .ant-layout-content { margin-left: 0; margin-top: 8px; }
+}
+
+@media (min-width: 992px) {
+ body.cyberpunk .index-page .dashboard-grid {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+ gap: 12px 16px;
+ margin: 0 !important;
+ }
+
+ body.cyberpunk .index-page .dashboard-grid > .ant-col {
+ max-width: none !important;
+ width: auto !important;
+ flex: none !important;
+ float: none !important;
+ padding: 0 !important;
+ }
+
+ body.cyberpunk .index-page .dashboard-grid > .ant-col:first-child {
+ grid-column: 1 / -1;
+ }
+}
diff --git a/web/html/common/page.html b/web/html/common/page.html
index 058682d5..b4de48bf 100644
--- a/web/html/common/page.html
+++ b/web/html/common/page.html
@@ -8,6 +8,7 @@
+
-{{end}}
\ No newline at end of file
+{{end}}
diff --git a/web/html/index.html b/web/html/index.html
index bbbbb708..d576aaa9 100644
--- a/web/html/index.html
+++ b/web/html/index.html
@@ -19,7 +19,7 @@
-
+