+
@@ -910,7 +920,7 @@ export default function LightAppManagementPage() {
type="button"
disabled={saving}
onClick={handleSave}
- className="h-9 cursor-pointer rounded-[5px] bg-[#F5222D] px-[18px] text-[14px] font-bold text-white shadow-[0_2px_8px_rgba(34,34,34,0.08)] transition-colors hover:bg-[#CF1322] active:bg-[#A8071A] disabled:cursor-not-allowed disabled:opacity-70"
+ className="lam-dialog-save h-9 cursor-pointer rounded-[5px] bg-[#F5222D] px-[18px] text-[14px] font-bold text-white shadow-[0_2px_8px_rgba(34,34,34,0.08)] transition-colors hover:bg-[#CF1322] active:bg-[#A8071A] disabled:cursor-not-allowed disabled:opacity-70"
>
{saving ? "保存中..." : editing ? "保存修改" : "立即注册"}
diff --git a/frontend-web/src/pages/light-app-management.css b/frontend-web/src/pages/light-app-management.css
new file mode 100644
index 00000000..bc3eafc0
--- /dev/null
+++ b/frontend-web/src/pages/light-app-management.css
@@ -0,0 +1,570 @@
+@import "../../docs/ui规范-深蓝/tokens.css";
+@import "./light-app-pages.css";
+
+/**
+ * 应用管理页 —— 深蓝色主题适配(《深蓝色 UI 规范》)
+ * 浅色样式仍由组件内 Tailwind 承担;.dark 下本文件覆盖为 ZS-004 / ZS-002 令牌。
+ */
+.dark .light-app-management-page {
+ color: var(--color-text);
+}
+
+/* ── 页头 / 文案 ─────────────────────────────────────────────────────── */
+.dark .light-app-management-page .lam-title {
+ color: var(--color-text-strong);
+}
+
+.dark .light-app-management-page .lam-desc {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-desc code {
+ background: rgba(22, 119, 255, 0.12);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-primary-btn {
+ background: var(--color-primary);
+ box-shadow: none;
+}
+
+.dark .light-app-management-page .lam-primary-btn:hover {
+ background: var(--color-primary-hover);
+}
+
+.dark .light-app-management-page .lam-primary-btn:active {
+ background: var(--color-primary-active);
+}
+
+/* ── 工具条 / 搜索 / 视图切换 ─────────────────────────────────────────── */
+.dark .light-app-management-page .lam-toolbar {
+ background: var(--color-bg-card);
+ border: 1px solid var(--color-border);
+ box-shadow: var(--shadow-1);
+}
+
+.dark .light-app-management-page .lam-search-input {
+ background: var(--color-bg-page);
+ border-color: var(--color-border);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-search-input::placeholder {
+ color: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .lam-search-input:hover {
+ background: var(--color-bg-card);
+ border-color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-search-input:focus {
+ background: var(--color-bg-card);
+ border-color: var(--color-primary);
+ box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.16);
+ outline: none;
+}
+
+.dark .light-app-management-page .lam-view-toggle {
+ background: var(--color-bg-page);
+ border-color: var(--color-border);
+}
+
+.dark .light-app-management-page .lam-view-toggle-btn.is-active {
+ background: var(--color-bg-card);
+ color: var(--color-link);
+ box-shadow: var(--shadow-1);
+}
+
+.dark .light-app-management-page .lam-view-toggle-btn:not(.is-active) {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-view-toggle-btn:not(.is-active):hover {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-count {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-count strong {
+ color: var(--color-link);
+}
+
+/* ── 表格(§28)──────────────────────────────────────────────────────── */
+.dark .light-app-management-page .lam-table-wrap {
+ background: var(--color-bg-page);
+ border: 1px solid var(--color-border);
+ box-shadow: var(--shadow-1);
+}
+
+.dark .light-app-management-page .lam-table thead tr {
+ background: var(--color-bg-card);
+ border-color: var(--color-border);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-table tbody {
+ border-color: var(--color-border);
+}
+
+.dark .light-app-management-page .lam-table tbody tr {
+ border-color: var(--color-border);
+}
+
+.dark .light-app-management-page .lam-table tbody tr:hover {
+ background: rgba(22, 119, 255, 0.08);
+}
+
+.dark .light-app-management-page .lam-row-name {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-table tbody tr:hover .lam-row-name {
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-tag-window {
+ border-color: rgba(245, 34, 45, 0.35);
+ background: var(--func-error-bg);
+ color: #ff7875;
+}
+
+.dark .light-app-management-page .lam-tag-iframe {
+ border-color: rgba(22, 119, 255, 0.35);
+ background: var(--func-info-bg);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-url {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-table tbody tr:hover .lam-url {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-url a {
+ color: inherit;
+}
+
+.dark .light-app-management-page .lam-url a:hover {
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-mount-tag {
+ background: var(--func-info-bg);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-mount-dot {
+ background: var(--color-primary);
+}
+
+.dark .light-app-management-page .lam-param-btn {
+ border-color: var(--color-border);
+ background: var(--color-bg-page);
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-param-btn:hover {
+ background: rgba(22, 119, 255, 0.08);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-param-popover {
+ border-color: var(--color-border);
+ background: var(--color-bg-card);
+ box-shadow: var(--shadow-3);
+}
+
+.dark .light-app-management-page .lam-param-popover-head {
+ border-color: var(--color-border);
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-param-popover-close {
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-param-item {
+ border-color: var(--color-border);
+ background: var(--color-bg-page);
+}
+
+.dark .light-app-management-page .lam-param-key {
+ color: #ff7875;
+}
+
+.dark .light-app-management-page .lam-param-val {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-status-on {
+ color: var(--func-success);
+}
+
+.dark .light-app-management-page .lam-status-on-dot {
+ background: var(--func-success);
+}
+
+.dark .light-app-management-page .lam-status-on-ping {
+ background: var(--func-success);
+}
+
+.dark .light-app-management-page .lam-status-off {
+ color: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .lam-status-off-dot {
+ background: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .lam-icon-btn {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-icon-btn:hover {
+ background: rgba(22, 119, 255, 0.08);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-icon-btn-danger:hover {
+ background: var(--func-error-bg);
+ color: var(--func-error);
+}
+
+.dark .light-app-management-page .lam-empty-icon {
+ background: var(--color-bg-page);
+ border: 1px solid var(--color-border);
+ color: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .lam-empty-title {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-empty-sub {
+ color: var(--color-text-disabled);
+}
+
+/* ── 卡片视图(§22 / §43)────────────────────────────────────────────── */
+.dark .light-app-management-page .lam-card {
+ background: var(--color-bg-card);
+ border: 1px solid var(--color-border);
+ box-shadow: var(--shadow-1);
+}
+
+.dark .light-app-management-page .lam-card:hover {
+ box-shadow: var(--shadow-2);
+}
+
+.dark .light-app-management-page .lam-card-title {
+ color: var(--color-text-strong);
+}
+
+.dark .light-app-management-page .lam-card:hover .lam-card-title {
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-card-desc {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-card-url-box {
+ background: var(--color-bg-page);
+}
+
+.dark .light-app-management-page .lam-card-param {
+ border-color: var(--color-border);
+ background: var(--color-bg-page);
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-card-mount {
+ background: var(--func-info-bg);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-card-footer {
+ border-color: var(--color-border);
+ background: rgba(12, 24, 54, 0.5);
+}
+
+/* ── 底部提示(§33 警告)────────────────────────────────────────────── */
+.dark .light-app-management-page .lam-tip-box {
+ background: var(--func-warning-bg);
+ border: 1px solid rgba(250, 173, 20, 0.25);
+ box-shadow: none;
+}
+
+.dark .light-app-management-page .lam-tip-head {
+ border-color: rgba(250, 173, 20, 0.2);
+ color: var(--func-warning);
+}
+
+.dark .light-app-management-page .lam-tip-list {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-tip-list strong {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-tip-bullet {
+ color: var(--func-warning);
+}
+
+/* ── 弹窗(§21 Modal)────────────────────────────────────────────────── */
+.dark .light-app-management-page .lam-dialog-overlay {
+ background: rgba(6, 14, 36, 0.6);
+}
+
+.dark .light-app-management-page .lam-dialog {
+ border-color: var(--color-border);
+ background: linear-gradient(180deg, var(--color-bg-card), var(--color-bg-page));
+ box-shadow: var(--shadow-3);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-dialog-header {
+ border-color: var(--color-border);
+ border-bottom: none;
+ padding-bottom: 0;
+}
+
+.dark .light-app-management-page .lam-dialog-header::after {
+ content: "";
+ display: block;
+ height: 1px;
+ margin-top: 16px;
+ margin-bottom: 0;
+ background: var(--gradient-title-line);
+}
+
+.dark .light-app-management-page .lam-dialog-icon {
+ background: var(--func-info-bg);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-dialog-title {
+ color: var(--color-text-strong);
+}
+
+.dark .light-app-management-page .lam-dialog-close {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-dialog-close:hover {
+ background: rgba(22, 119, 255, 0.08);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-form-label {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-form-label .lam-required {
+ color: var(--func-error);
+}
+
+.dark .light-app-management-page .lam-form-label svg {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-form-hint {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-dialog .lam-input,
+.dark .light-app-management-page .lam-dialog input[type="text"] {
+ background: var(--color-bg-page);
+ border-color: var(--color-border);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-dialog .lam-input::placeholder,
+.dark .light-app-management-page .lam-dialog input[type="text"]::placeholder {
+ color: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .lam-dialog .lam-input:focus,
+.dark .light-app-management-page .lam-dialog input[type="text"]:focus {
+ border-color: var(--color-primary);
+ box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.16);
+ outline: none;
+}
+
+.dark .light-app-management-page .lam-param-panel {
+ border-color: var(--color-border);
+ background: var(--color-bg-page);
+}
+
+.dark .light-app-management-page .lam-param-row {
+ border-color: var(--color-border);
+ background: var(--color-bg-card);
+}
+
+.dark .light-app-management-page .lam-param-theme-box {
+ background: var(--color-bg-page);
+}
+
+.dark .light-app-management-page .lam-param-empty {
+ border-color: var(--color-border);
+ background: var(--color-bg-page);
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-add-param-btn {
+ border-color: var(--color-border-strong);
+ background: var(--color-bg-card);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-add-param-btn:hover {
+ border-color: var(--color-primary);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-dialog-footer {
+ border-color: var(--color-border);
+}
+
+.dark .light-app-management-page .lam-dialog-cancel {
+ border-color: var(--color-border-strong);
+ background: transparent;
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-dialog-cancel:hover {
+ border-color: var(--color-link);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-dialog-save {
+ background: var(--color-primary);
+ box-shadow: none;
+}
+
+.dark .light-app-management-page .lam-dialog-save:hover {
+ background: var(--color-primary-hover);
+}
+
+.dark .light-app-management-page .lam-dialog-save:active {
+ background: var(--color-primary-active);
+}
+
+.dark .light-app-management-page .lam-switch-on {
+ background: var(--color-primary);
+}
+
+.dark .light-app-management-page .lam-switch-off {
+ background: var(--color-text-disabled);
+}
+
+/* ── TDesign Select(§15)──────────────────────────────────────────── */
+.dark .light-app-management-page .t-select .t-input,
+.dark .light-app-management-page .t-select .t-input__wrap {
+ background: var(--color-bg-page);
+ border-color: var(--color-border);
+ border-radius: var(--radius-input);
+}
+
+.dark .light-app-management-page .t-select .t-input__inner {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .t-select .t-input__inner::placeholder {
+ color: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .t-select:hover .t-input,
+.dark .light-app-management-page .t-select:hover .t-input__wrap {
+ border-color: var(--color-link);
+}
+
+.dark .light-app-management-page .t-select.t-is-focused .t-input,
+.dark .light-app-management-page .t-select.t-is-focused .t-input__wrap {
+ border-color: var(--color-primary);
+ box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.16);
+}
+
+.dark .light-app-management-page .t-select .t-fake-arrow {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .t-select__dropdown {
+ background: var(--color-bg-card);
+ border-color: var(--color-border);
+ box-shadow: var(--shadow-2);
+}
+
+.dark .light-app-management-page .t-select-option {
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .t-select-option:hover {
+ background: rgba(22, 119, 255, 0.08);
+}
+
+.dark .light-app-management-page .t-select-option.t-is-selected {
+ background: rgba(22, 119, 255, 0.16);
+ color: var(--color-link);
+}
+
+/* shadcn Input / Textarea in dialog */
+.dark .light-app-management-page .lam-dialog [data-slot="input"],
+.dark .light-app-management-page .lam-dialog textarea {
+ background: var(--color-bg-page);
+ border-color: var(--color-border);
+ color: var(--color-text);
+}
+
+.dark .light-app-management-page .lam-dialog [data-slot="input"]:focus-visible,
+.dark .light-app-management-page .lam-dialog textarea:focus-visible {
+ border-color: var(--color-primary);
+ box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.16);
+}
+
+.dark .light-app-management-page .lam-param-theme-box span {
+ color: var(--color-text-secondary);
+}
+
+/* TDesign 下拉挂载到 body 时的深蓝样式 */
+.dark .lam-select-popup.t-popup {
+ background: var(--color-bg-card);
+ border-color: var(--color-border);
+ box-shadow: var(--shadow-2);
+}
+
+.dark .lam-select-popup .t-select-option {
+ color: var(--color-text);
+}
+
+.dark .lam-select-popup .t-select-option:hover {
+ background: rgba(22, 119, 255, 0.08);
+}
+
+.dark .lam-select-popup .t-select-option.t-is-selected {
+ background: rgba(22, 119, 255, 0.16);
+ color: var(--color-link);
+}
+
+.dark .light-app-management-page .lam-search-input + button,
+.dark .light-app-management-page .lam-toolbar .absolute.text-neutral-400 {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-table .text-neutral-300 {
+ color: var(--color-text-disabled);
+}
+
+.dark .light-app-management-page .lam-card-url-box button {
+ color: var(--color-text-secondary);
+}
+
+.dark .light-app-management-page .lam-card-url-box button:hover {
+ background: rgba(22, 119, 255, 0.08);
+ color: var(--color-link);
+}
diff --git a/frontend-web/src/pages/light-app-pages.css b/frontend-web/src/pages/light-app-pages.css
new file mode 100644
index 00000000..459be997
--- /dev/null
+++ b/frontend-web/src/pages/light-app-pages.css
@@ -0,0 +1,12 @@
+@import "../../docs/ui规范-深蓝/tokens.css";
+
+/** 轻应用中心列表 / 管理页 —— 深色模式共用页面底图(与 workspace 深蓝主题一致) */
+.dark .light-app-management-page,
+.dark .light-app-list-page {
+ background-color: var(--color-bg-page);
+ background-image: url("../assets/img/layout-bg-theme-dark-blue.svg");
+ background-size: cover;
+ background-position: center top;
+ background-repeat: no-repeat;
+ background-attachment: fixed;
+}