@claudelaw/taichu 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.dockerignore +13 -0
  2. package/Dockerfile +51 -0
  3. package/LICENSE +21 -0
  4. package/README.md +208 -0
  5. package/docker-compose.yml +42 -0
  6. package/docs/ROADMAP.md +101 -0
  7. package/docs/api/README.md +102 -0
  8. package/docs/architecture/001-zero-dependency-core.md +61 -0
  9. package/docs/architecture/002-structured-content-model.md +70 -0
  10. package/docs/architecture/003-hook-based-extension.md +82 -0
  11. package/docs/architecture/004-api-first-architecture.md +122 -0
  12. package/docs/architecture/README.md +24 -0
  13. package/docs/logo.svg +40 -0
  14. package/docs/research/ai-era-cms-user-research.md +247 -0
  15. package/docs/zh/README.md +81 -0
  16. package/docs/zh/guides/deploy.md +75 -0
  17. package/docs/zh/guides/mcp.md +84 -0
  18. package/docs/zh/guides/promotion.md +51 -0
  19. package/marketplace.json +78 -0
  20. package/package.json +60 -0
  21. package/packages/core/src/auth.js +158 -0
  22. package/packages/core/src/content-type.js +244 -0
  23. package/packages/core/src/core.test.js +406 -0
  24. package/packages/core/src/errors.js +60 -0
  25. package/packages/core/src/hooks.js +104 -0
  26. package/packages/core/src/index.js +16 -0
  27. package/packages/core/src/server.test.js +149 -0
  28. package/packages/core/src/sm-crypto.js +31 -0
  29. package/packages/core/src/sqlite-store.js +354 -0
  30. package/packages/core/src/store.js +174 -0
  31. package/packages/core/src/tokenizer.js +89 -0
  32. package/packages/core/src/vector-index.js +131 -0
  33. package/packages/llm-providers/src/index.js +181 -0
  34. package/packages/mcp/src/index.js +355 -0
  35. package/packages/server/public/admin/assets/index-DApxOVTx.js +191 -0
  36. package/packages/server/public/admin/assets/index-DtMvdQm9.css +1 -0
  37. package/packages/server/public/admin/index.html +28 -0
  38. package/packages/server/public/aurora/style.css +1173 -0
  39. package/packages/server/public/favicon.svg +46 -0
  40. package/packages/server/public/theme/index.html +288 -0
  41. package/packages/server/public/theme/style.css +133 -0
  42. package/packages/server/public/theme-minimal/index.html +223 -0
  43. package/packages/server/public/theme-minimal/style.css +109 -0
  44. package/packages/server/public/ws-test.html +106 -0
  45. package/packages/server/src/activitypub.js +228 -0
  46. package/packages/server/src/audit.js +104 -0
  47. package/packages/server/src/auth-provider.js +76 -0
  48. package/packages/server/src/body-parser.js +52 -0
  49. package/packages/server/src/bootstrap.js +272 -0
  50. package/packages/server/src/collab.js +154 -0
  51. package/packages/server/src/config.js +136 -0
  52. package/packages/server/src/context.js +86 -0
  53. package/packages/server/src/email.js +317 -0
  54. package/packages/server/src/index.js +195 -0
  55. package/packages/server/src/logger.js +78 -0
  56. package/packages/server/src/media-store.js +213 -0
  57. package/packages/server/src/middleware/auth.js +203 -0
  58. package/packages/server/src/middleware/cors.js +15 -0
  59. package/packages/server/src/middleware/error-handler.js +49 -0
  60. package/packages/server/src/middleware/rate-limit.js +118 -0
  61. package/packages/server/src/multipart.js +150 -0
  62. package/packages/server/src/notify.js +126 -0
  63. package/packages/server/src/pipeline.js +206 -0
  64. package/packages/server/src/plugin-installer.js +139 -0
  65. package/packages/server/src/plugin-manager.js +165 -0
  66. package/packages/server/src/relationships.js +217 -0
  67. package/packages/server/src/revisions.js +114 -0
  68. package/packages/server/src/router.js +194 -0
  69. package/packages/server/src/routes/activitypub.js +140 -0
  70. package/packages/server/src/routes/api.js +363 -0
  71. package/packages/server/src/routes/audit.js +222 -0
  72. package/packages/server/src/routes/auth.js +205 -0
  73. package/packages/server/src/routes/collab.js +90 -0
  74. package/packages/server/src/routes/export.js +77 -0
  75. package/packages/server/src/routes/graphql.js +344 -0
  76. package/packages/server/src/routes/media.js +169 -0
  77. package/packages/server/src/routes/plugin-marketplace.js +171 -0
  78. package/packages/server/src/routes/relationships.js +133 -0
  79. package/packages/server/src/routes/rss.js +92 -0
  80. package/packages/server/src/routes/sso.js +211 -0
  81. package/packages/server/src/routes/theme.js +119 -0
  82. package/packages/server/src/routes/webhook.js +94 -0
  83. package/packages/server/src/routes/wechat.js +115 -0
  84. package/packages/server/src/routes/workflow.js +157 -0
  85. package/packages/server/src/scheduler.js +96 -0
  86. package/packages/server/src/search.js +100 -0
  87. package/packages/server/src/server.test.js +295 -0
  88. package/packages/server/src/sso-analytics.js +78 -0
  89. package/packages/server/src/static.js +70 -0
  90. package/packages/server/src/theme-engine.js +119 -0
  91. package/packages/server/src/webhook.js +192 -0
  92. package/packages/server/src/websocket.js +308 -0
  93. package/scripts/cli.js +90 -0
@@ -0,0 +1 @@
1
+ .layout{display:flex;height:100vh}.sidebar{width:220px;background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;padding:16px 0;overflow-y:auto}.logo{font-size:18px;font-weight:700;color:var(--primary);padding:0 20px 20px;cursor:pointer}.nav-section{font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;padding:12px 20px 6px;letter-spacing:.5px}.nav-item{display:block;padding:8px 20px;color:var(--text-secondary);text-decoration:none;font-size:13px;transition:all .15s}.nav-item:hover,.nav-item.router-link-active{color:var(--primary);background:#f0fdf4}.sidebar-footer{margin-top:auto;padding:16px 20px;border-top:1px solid var(--border)}.lang-switch{margin-bottom:8px}.lang-select{width:100%;padding:4px 8px;background:var(--bg);border:1px solid var(--border);border-radius:4px;font-size:12px;color:var(--text-primary);cursor:pointer}.user{font-size:13px;color:var(--text-secondary);display:block;margin-bottom:8px}.btn-logout{font-size:12px;color:var(--danger);background:none;border:none;cursor:pointer}.main{flex:1;overflow-y:auto;padding:32px;background:var(--bg)}.login-page[data-v-abdec1a4]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg)}.login-card[data-v-abdec1a4]{background:var(--surface);padding:40px;border-radius:12px;border:1px solid var(--border);width:380px;max-width:90vw}h1[data-v-abdec1a4]{font-size:24px;text-align:center;margin-bottom:4px}.sub[data-v-abdec1a4]{text-align:center;color:var(--text-secondary);font-size:13px;margin-bottom:24px}.tabs[data-v-abdec1a4]{display:flex;gap:0;margin-bottom:20px}.tabs button[data-v-abdec1a4]{flex:1;padding:8px;border:1px solid var(--border);background:var(--bg);font-size:13px;cursor:pointer;color:var(--text-secondary)}.tabs button[data-v-abdec1a4]:first-child{border-radius:var(--radius) 0 0 var(--radius)}.tabs button[data-v-abdec1a4]:last-child{border-radius:0 var(--radius) var(--radius) 0}.tabs button.active[data-v-abdec1a4]{background:var(--primary);color:#fff;border-color:var(--primary)}input[data-v-abdec1a4]{width:100%;padding:10px 12px;margin-bottom:12px;border:1px solid var(--border);border-radius:var(--radius);font-size:14px;outline:none}input[data-v-abdec1a4]:focus{border-color:var(--primary)}.btn[data-v-abdec1a4]{width:100%;padding:10px;background:var(--primary);color:#fff;border:none;border-radius:var(--radius);font-size:14px;font-weight:600;cursor:pointer}.btn[data-v-abdec1a4]:hover{background:var(--primary-dark)}.btn[data-v-abdec1a4]:disabled{opacity:.6}.error[data-v-abdec1a4]{color:var(--danger);font-size:13px;margin-bottom:8px}.page-title[data-v-d8e754bb]{font-size:22px;margin-bottom:24px}.cards[data-v-d8e754bb]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px}.card[data-v-d8e754bb]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:20px;text-align:center}.card-num[data-v-d8e754bb]{font-size:28px;font-weight:700;color:var(--primary)}.card-label[data-v-d8e754bb]{font-size:13px;color:var(--text-secondary);margin-top:4px}.row[data-v-d8e754bb]{display:flex;gap:32px;flex-wrap:wrap}.recent[data-v-d8e754bb]{background:var(--surface);border:1px solid var(--border);border-radius:8px}.recent-item[data-v-d8e754bb]{padding:12px 16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border);gap:8px}.recent-item[data-v-d8e754bb]:last-child{border-bottom:none}.recent-link[data-v-d8e754bb]{font-size:14px;color:var(--text-primary);text-decoration:none;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recent-link[data-v-d8e754bb]:hover{color:var(--primary)}.meta[data-v-d8e754bb]{font-size:12px;color:var(--text-secondary);white-space:nowrap}.system-info[data-v-d8e754bb]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:12px 16px}.sys-row[data-v-d8e754bb]{display:flex;justify-content:space-between;align-items:center;padding:6px 0;font-size:13px;border-bottom:1px solid var(--border)}.sys-row[data-v-d8e754bb]:last-child{border-bottom:none}.sys-row span[data-v-d8e754bb]{color:var(--text-secondary)}.sys-row code[data-v-d8e754bb]{color:var(--primary);font-size:12px}.empty[data-v-d8e754bb]{color:var(--text-secondary);font-size:14px}.chart-bar[data-v-d8e754bb]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:16px}.bar-row[data-v-d8e754bb]{display:flex;align-items:center;gap:12px;padding:6px 0}.bar-label[data-v-d8e754bb]{width:50px;font-size:13px;color:var(--text-secondary);text-align:right;flex-shrink:0}.bar-track[data-v-d8e754bb]{flex:1;height:20px;background:#f3f4f6;border-radius:4px;overflow:hidden}.bar-fill[data-v-d8e754bb]{height:100%;border-radius:4px;transition:width .6s ease;min-width:2px}.bar-count[data-v-d8e754bb]{width:32px;font-size:13px;font-weight:600;color:var(--text-primary);text-align:left}.header[data-v-940c1dc1]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.page-title[data-v-940c1dc1]{font-size:22px}.btn[data-v-940c1dc1]{padding:8px 20px;background:var(--primary);color:#fff;border:none;border-radius:var(--radius);font-size:14px;cursor:pointer;font-weight:600}.btn[data-v-940c1dc1]:hover{background:var(--primary-dark)}.table[data-v-940c1dc1]{width:100%;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);border-collapse:collapse}.table th[data-v-940c1dc1],.table td[data-v-940c1dc1]{padding:10px 16px;text-align:left;font-size:14px;border-bottom:1px solid var(--border)}.table th[data-v-940c1dc1]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.table a[data-v-940c1dc1]{color:var(--primary);text-decoration:none}tr.selected[data-v-940c1dc1]{background:#f0fdf4}.batch-bar[data-v-940c1dc1]{display:flex;align-items:center;gap:8px;padding:10px 16px;background:#f0fdf4;border:1px solid #10B981;border-radius:8px;margin-bottom:12px;font-size:13px;color:var(--text-secondary)}.btn-batch[data-v-940c1dc1]{color:#065f46;border-color:#10b981;background:#d1fae5}.btn-batch[data-v-940c1dc1]:hover{background:#a7f3d0}.btn-batch-danger[data-v-940c1dc1]{color:#991b1b;border-color:#fca5a5;background:#fee2e2}.btn-batch-danger[data-v-940c1dc1]:hover{background:#fecaca}.badge[data-v-940c1dc1]{display:inline-block;padding:2px 10px;border-radius:12px;font-size:12px;font-weight:600}.badge-published[data-v-940c1dc1]{background:#d1fae5;color:#065f46}.badge-draft[data-v-940c1dc1]{background:#fef3c7;color:#92400e}.badge-archived[data-v-940c1dc1]{background:#f3f4f6;color:#6b7280}.badge-active[data-v-940c1dc1]{background:#d1fae5;color:#065f46}.badge-revoked[data-v-940c1dc1]{background:#fee2e2;color:#991b1b}.date[data-v-940c1dc1]{color:var(--text-secondary);font-size:13px}.btn-sm[data-v-940c1dc1]{padding:4px 12px;font-size:12px;border:1px solid var(--border);background:var(--surface);border-radius:4px;cursor:pointer;margin-right:4px}.btn-sm[data-v-940c1dc1]:hover{border-color:var(--primary)}.btn-danger[data-v-940c1dc1]{color:var(--danger)}.btn-danger[data-v-940c1dc1]:hover{border-color:var(--danger);background:#fef2f2}.empty[data-v-940c1dc1]{color:var(--text-secondary);font-size:14px;margin-top:40px;text-align:center}.search-bar[data-v-940c1dc1]{display:flex;gap:12px;margin-bottom:16px;align-items:center}.input[data-v-940c1dc1]{padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);font-size:14px;color:var(--text-primary);background:var(--surface)}.select-sm[data-v-940c1dc1]{max-width:130px}.pagination[data-v-940c1dc1]{display:flex;justify-content:center;align-items:center;gap:16px;margin-top:24px;padding:16px}.btn-page[data-v-940c1dc1]{padding:6px 16px;background:var(--surface);border:1px solid var(--border);border-radius:6px;font-size:13px;cursor:pointer;color:var(--text-secondary)}.btn-page[data-v-940c1dc1]:hover:not(:disabled){border-color:var(--primary);color:var(--primary)}.btn-page[data-v-940c1dc1]:disabled{opacity:.4;cursor:default}.page-info[data-v-940c1dc1]{font-size:13px;color:var(--text-muted)}.editor-wrapper[data-v-9ceb8c6d]{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);overflow:hidden}.toolbar[data-v-9ceb8c6d]{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;background:var(--bg);border-bottom:1px solid var(--border)}.toolbar button[data-v-9ceb8c6d]{padding:4px 8px;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer;font-size:13px;color:var(--text-secondary);white-space:nowrap;min-width:28px;text-align:center}.toolbar button[data-v-9ceb8c6d]:hover{background:var(--surface);border-color:var(--border);color:var(--text)}.toolbar button.active[data-v-9ceb8c6d]{background:var(--primary);color:#fff;border-color:var(--primary)}.sep[data-v-9ceb8c6d]{width:1px;background:var(--border);margin:0 4px;align-self:stretch}.editor-content[data-v-9ceb8c6d]{padding:16px;min-height:300px;outline:none}.editor-content[data-v-9ceb8c6d] p{margin:0 0 8px;line-height:1.7}.editor-content[data-v-9ceb8c6d] h1{font-size:24px;margin:16px 0 8px}.editor-content[data-v-9ceb8c6d] h2{font-size:20px;margin:14px 0 6px}.editor-content[data-v-9ceb8c6d] h3{font-size:16px;margin:12px 0 4px}.editor-content[data-v-9ceb8c6d] blockquote{border-left:3px solid var(--primary);padding:4px 12px;margin:8px 0;color:var(--text-secondary);background:var(--bg)}.editor-content[data-v-9ceb8c6d] code{background:#f1f5f9;padding:2px 4px;border-radius:3px;font-size:13px}.editor-content[data-v-9ceb8c6d] pre{background:#1e293b;color:#e2e8f0;padding:12px 16px;border-radius:6px;overflow-x:auto;margin:8px 0}.editor-content[data-v-9ceb8c6d] pre code{background:none;padding:0;color:inherit}.editor-content[data-v-9ceb8c6d] ul,.editor-content[data-v-9ceb8c6d] ol{padding-left:24px;margin:8px 0}.editor-content[data-v-9ceb8c6d] li{margin-bottom:4px}.editor-content[data-v-9ceb8c6d] img{max-width:100%;border-radius:6px;margin:8px 0}.editor-content[data-v-9ceb8c6d] hr{border:none;border-top:1px solid var(--border);margin:16px 0}.editor-content[data-v-9ceb8c6d] .is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;color:#94a3b8;pointer-events:none;height:0}.modal-overlay[data-v-9ceb8c6d]{position:fixed;top:0;left:0;right:0;bottom:0;background:#0006;z-index:1000;display:flex;align-items:center;justify-content:center}.media-browser[data-v-9ceb8c6d]{background:var(--surface);border-radius:12px;width:90vw;max-width:680px;max-height:80vh;overflow-y:auto;box-shadow:0 20px 60px #00000026}.mb-header[data-v-9ceb8c6d]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--surface);z-index:1}.mb-header h3[data-v-9ceb8c6d]{font-size:16px;margin:0}.btn-close[data-v-9ceb8c6d]{background:none;border:none;font-size:18px;cursor:pointer;color:var(--text-secondary);padding:4px 8px}.btn-close[data-v-9ceb8c6d]:hover{color:var(--text)}.mb-loading[data-v-9ceb8c6d],.mb-error[data-v-9ceb8c6d],.mb-empty[data-v-9ceb8c6d]{padding:40px;text-align:center;color:var(--text-secondary);font-size:14px}.mb-error[data-v-9ceb8c6d]{color:var(--danger)}.mb-grid[data-v-9ceb8c6d]{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:12px;padding:20px}.mb-item[data-v-9ceb8c6d]{cursor:pointer;border:2px solid var(--border);border-radius:8px;overflow:hidden;transition:border-color .15s;background:var(--bg)}.mb-item[data-v-9ceb8c6d]:hover{border-color:var(--primary)}.mb-item img[data-v-9ceb8c6d]{width:100%;height:100px;object-fit:cover;display:block}.mb-name[data-v-9ceb8c6d]{display:block;padding:4px 8px;font-size:11px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rel-panel[data-v-004f093c]{margin-top:32px;padding:20px;background:var(--surface);border:1px solid var(--border);border-radius:8px}.rel-header[data-v-004f093c]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.rel-header h3[data-v-004f093c]{font-size:15px;margin:0}.rel-add[data-v-004f093c]{display:flex;gap:8px;margin-bottom:16px}.input-sm[data-v-004f093c]{padding:6px 10px;border:1px solid var(--border);border-radius:4px;font-size:13px;color:var(--text-primary);background:var(--surface)}.select-sm[data-v-004f093c]{width:90px}.btn-sm[data-v-004f093c]{padding:4px 12px;font-size:12px;border:1px solid var(--border);background:var(--surface);border-radius:4px;cursor:pointer}.btn-primary-sm[data-v-004f093c]{background:var(--primary);color:#fff;border-color:var(--primary)}.add-error[data-v-004f093c]{color:var(--danger);font-size:12px;margin-bottom:8px}.rel-sections[data-v-004f093c]{display:flex;gap:24px}.rel-group[data-v-004f093c]{flex:1}.rel-group h4[data-v-004f093c]{font-size:13px;color:var(--text-secondary);margin-bottom:8px}.rel-empty[data-v-004f093c]{font-size:12px;color:var(--text-muted);padding:8px 0}.rel-item[data-v-004f093c]{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border);font-size:13px}.rel-type[data-v-004f093c]{display:inline-block;padding:1px 6px;border-radius:3px;font-size:11px;background:#f3f4f6;color:var(--text-secondary)}.rel-type.type-parent_of[data-v-004f093c],.rel-type.type-child_of[data-v-004f093c]{background:#fef3c7;color:#92400e}.rel-type.type-references[data-v-004f093c]{background:#d1fae5;color:#065f46}.rel-title[data-v-004f093c]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-del[data-v-004f093c]{background:none;border:none;cursor:pointer;color:var(--text-muted);font-size:13px;padding:2px 6px}.btn-del[data-v-004f093c]:hover{color:var(--danger)}.rel-graph[data-v-004f093c]{margin-top:20px}.rel-graph h4[data-v-004f093c]{font-size:13px;color:var(--text-secondary);margin-bottom:12px}.graph-svg[data-v-004f093c]{width:100%;height:auto;border:1px solid var(--border);border-radius:8px;background:var(--bg)}.graph-edge[data-v-004f093c]{stroke:#d1d5db;stroke-width:1.5}.graph-node[data-v-004f093c]{fill:#e0e7ff;stroke:#6366f1;stroke-width:2}.graph-node-self[data-v-004f093c]{fill:#6366f1;stroke:#4338ca;stroke-width:3}.graph-label[data-v-004f093c]{font-size:9px;fill:var(--text-primary)}.header[data-v-3d49b859]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}h2[data-v-3d49b859]{font-size:22px}.actions[data-v-3d49b859]{display:flex;gap:8px}.btn[data-v-3d49b859]{padding:8px 20px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);font-size:14px;cursor:pointer}.btn[data-v-3d49b859]:hover{border-color:var(--primary)}.btn-publish[data-v-3d49b859]{background:var(--primary);color:#fff;border-color:var(--primary)}.btn-publish[data-v-3d49b859]:hover{background:var(--primary-dark)}.form[data-v-3d49b859]{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px}.field[data-v-3d49b859]{margin-bottom:16px}.field label[data-v-3d49b859]{display:block;font-size:13px;font-weight:600;margin-bottom:6px;color:var(--text)}.req[data-v-3d49b859]{color:var(--danger)}input[data-v-3d49b859],select[data-v-3d49b859],textarea[data-v-3d49b859]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);font-size:14px;outline:none;font-family:inherit}input[data-v-3d49b859]:focus,select[data-v-3d49b859]:focus,textarea[data-v-3d49b859]:focus{border-color:var(--primary)}textarea[data-v-3d49b859]{resize:vertical;min-height:100px;font-family:Courier New,monospace;font-size:13px}.error[data-v-3d49b859]{color:var(--danger);font-size:14px;margin-top:12px}.info[data-v-3d49b859]{color:var(--text-secondary);font-size:14px;margin-top:12px}.header[data-v-e1fe1fb1]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.page-title[data-v-e1fe1fb1]{font-size:22px}.btn[data-v-e1fe1fb1]{padding:8px 20px;background:var(--primary);color:#fff;border:none;border-radius:var(--radius);font-size:14px;cursor:pointer;font-weight:600}.btn[data-v-e1fe1fb1]:hover{background:var(--primary-dark)}.btn-cancel[data-v-e1fe1fb1]{background:var(--bg);color:var(--text);border:1px solid var(--border)}.create-box[data-v-e1fe1fb1]{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px;margin-bottom:20px}.create-box input[data-v-e1fe1fb1]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);font-size:14px;outline:none;margin-bottom:12px}.create-actions[data-v-e1fe1fb1]{display:flex;gap:8px}.new-key-display[data-v-e1fe1fb1]{margin-top:16px;padding:12px;background:#fef3c7;border-radius:var(--radius)}.warn[data-v-e1fe1fb1]{font-size:13px;color:#92400e;margin-bottom:8px}code[data-v-e1fe1fb1]{font-size:12px;word-break:break-all;color:var(--text)}.table[data-v-e1fe1fb1]{width:100%;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);border-collapse:collapse}.table th[data-v-e1fe1fb1],.table td[data-v-e1fe1fb1]{padding:10px 16px;text-align:left;font-size:14px;border-bottom:1px solid var(--border)}.table th[data-v-e1fe1fb1]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.date[data-v-e1fe1fb1]{color:var(--text-secondary);font-size:13px}.btn-sm[data-v-e1fe1fb1]{padding:4px 12px;font-size:12px;border:1px solid var(--border);background:var(--surface);border-radius:4px;cursor:pointer}.btn-danger[data-v-e1fe1fb1]{color:var(--danger)}.btn-danger[data-v-e1fe1fb1]:hover{border-color:var(--danger);background:#fef2f2}.empty[data-v-e1fe1fb1]{color:var(--text-secondary);font-size:14px;margin-top:40px;text-align:center}.scope-section[data-v-e1fe1fb1]{margin:12px 0}.scope-label[data-v-e1fe1fb1]{font-size:13px;font-weight:600;color:var(--text-secondary);display:block;margin-bottom:8px}.scope-grid[data-v-e1fe1fb1]{display:flex;flex-wrap:wrap;gap:8px}.scope-chip[data-v-e1fe1fb1]{display:flex;align-items:center;gap:4px;padding:4px 10px;background:var(--bg);border:1px solid var(--border);border-radius:4px;font-size:12px;cursor:pointer}.scope-chip[data-v-e1fe1fb1]:hover{border-color:var(--primary)}.scope-chip input[data-v-e1fe1fb1]{margin:0}.scope-hint[data-v-e1fe1fb1]{font-size:11px;color:var(--text-secondary);margin-top:8px}.scope-badge[data-v-e1fe1fb1]{font-size:12px;background:var(--bg);padding:2px 8px;border-radius:4px;color:var(--text-secondary)}.header[data-v-ce3df3f4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.page-title[data-v-ce3df3f4]{font-size:22px}.btn[data-v-ce3df3f4]{padding:8px 20px;background:var(--primary);color:#fff;border:none;border-radius:var(--radius);font-size:14px;cursor:pointer;font-weight:600}.btn[data-v-ce3df3f4]:hover{background:var(--primary-dark)}.upload-status[data-v-ce3df3f4]{padding:12px;background:#dbeafe;border-radius:var(--radius);margin-bottom:16px;font-size:14px}.upload-error[data-v-ce3df3f4]{padding:12px;background:#fee2e2;border-radius:var(--radius);margin-bottom:16px;font-size:14px;color:#dc2626}.grid[data-v-ce3df3f4]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px}.card[data-v-ce3df3f4]{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;transition:border-color .2s}.card[data-v-ce3df3f4]:hover{border-color:var(--primary)}.preview[data-v-ce3df3f4]{height:160px;display:flex;align-items:center;justify-content:center;background:var(--bg);cursor:pointer;overflow:hidden}.preview img[data-v-ce3df3f4]{width:100%;height:100%;object-fit:cover}.file-icon[data-v-ce3df3f4]{font-size:48px}.info[data-v-ce3df3f4]{padding:12px}.name[data-v-ce3df3f4]{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:4px}.meta[data-v-ce3df3f4]{font-size:11px;color:var(--text-secondary);display:flex;gap:8px;margin-bottom:8px}.actions[data-v-ce3df3f4]{display:flex;gap:6px}.btn-sm[data-v-ce3df3f4]{padding:4px 10px;font-size:11px;border:1px solid var(--border);background:var(--surface);border-radius:4px;cursor:pointer}.btn-sm[data-v-ce3df3f4]:hover{background:var(--bg)}.btn-danger[data-v-ce3df3f4]{color:var(--danger)}.btn-danger[data-v-ce3df3f4]:hover{border-color:var(--danger);background:#fef2f2}.empty[data-v-ce3df3f4]{color:var(--text-secondary);font-size:14px;margin-top:40px;text-align:center}.page-title[data-v-18dfc30b]{font-size:24px;margin-bottom:24px}.card[data-v-18dfc30b]{max-width:640px;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px}.section-title[data-v-18dfc30b]{font-size:15px;font-weight:600;color:var(--text-primary);margin:24px 0 12px;padding-top:16px;border-top:1px solid var(--border)}.form-group[data-v-18dfc30b]{margin-bottom:16px}.form-group label[data-v-18dfc30b]{display:block;font-size:13px;color:var(--text-secondary);margin-bottom:6px;font-weight:500}.form-row[data-v-18dfc30b]{display:flex;gap:16px}.form-row .form-group[data-v-18dfc30b]{flex:1}.input[data-v-18dfc30b]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:var(--bg);color:var(--text-primary)}.textarea[data-v-18dfc30b]{resize:vertical}.actions[data-v-18dfc30b]{margin-top:24px;display:flex;align-items:center;gap:12px}.btn-primary[data-v-18dfc30b]{padding:10px 24px;background:var(--primary);color:#fff;border:none;border-radius:6px;font-size:14px;cursor:pointer}.btn-primary[data-v-18dfc30b]:disabled{opacity:.6}.saved[data-v-18dfc30b]{color:var(--primary);font-size:13px}.page-title[data-v-75fcdd2a]{font-size:24px;margin-bottom:16px}.toolbar[data-v-75fcdd2a]{display:flex;gap:12px;margin-bottom:16px;align-items:center}.input[data-v-75fcdd2a]{padding:6px 10px;border:1px solid var(--border);border-radius:6px;font-size:13px;background:var(--bg);color:var(--text-primary)}.btn[data-v-75fcdd2a]{padding:6px 16px;background:var(--surface);border:1px solid var(--border);border-radius:6px;font-size:13px;cursor:pointer;color:var(--text-primary)}.table-wrap[data-v-75fcdd2a]{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}table[data-v-75fcdd2a]{width:100%;border-collapse:collapse;font-size:13px}th[data-v-75fcdd2a],td[data-v-75fcdd2a]{padding:10px 16px;text-align:left;border-bottom:1px solid var(--border)}th[data-v-75fcdd2a]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.time[data-v-75fcdd2a]{white-space:nowrap;color:var(--text-secondary)}.tag[data-v-75fcdd2a]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:600}.tag-create[data-v-75fcdd2a],.tag-publish[data-v-75fcdd2a]{background:#dcfce7;color:#166534}.tag-update[data-v-75fcdd2a]{background:#fef3c7;color:#92400e}.tag-delete[data-v-75fcdd2a],.tag-review_requested[data-v-75fcdd2a],.tag-rejected[data-v-75fcdd2a]{background:#fee2e2;color:#991b1b}.tag-approved[data-v-75fcdd2a]{background:#dcfce7;color:#166534}.empty[data-v-75fcdd2a]{padding:32px;text-align:center;color:var(--text-muted)}.page-title[data-v-50acd464]{font-size:24px;margin-bottom:0}.header[data-v-50acd464]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.card[data-v-50acd464]{max-width:640px;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin-bottom:24px}.card h3[data-v-50acd464]{margin-bottom:16px;font-size:16px}.form-group[data-v-50acd464]{margin-bottom:16px}.form-group label[data-v-50acd464]{display:block;font-size:13px;color:var(--text-secondary);margin-bottom:6px}.form-row[data-v-50acd464]{display:flex;gap:16px}.form-row .form-group[data-v-50acd464]{flex:1}.input[data-v-50acd464]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:var(--bg);color:var(--text-primary)}.actions[data-v-50acd464]{display:flex;gap:8px;margin-top:16px}.btn-primary[data-v-50acd464]{padding:10px 24px;background:var(--primary);color:#fff;border:none;border-radius:6px;font-size:14px;cursor:pointer}.btn[data-v-50acd464]{padding:10px 16px;background:var(--surface);border:1px solid var(--border);border-radius:6px;font-size:14px;cursor:pointer}.btn-danger[data-v-50acd464]{padding:4px 12px;background:var(--danger);color:#fff;border:none;border-radius:4px;font-size:12px;cursor:pointer}.table-wrap[data-v-50acd464]{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}table[data-v-50acd464]{width:100%;border-collapse:collapse;font-size:13px}th[data-v-50acd464],td[data-v-50acd464]{padding:10px 16px;text-align:left;border-bottom:1px solid var(--border)}.url[data-v-50acd464]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tag[data-v-50acd464]{display:inline-block;margin:1px;padding:1px 6px;background:#f0fdf4;color:var(--primary);border-radius:3px;font-size:11px}.empty[data-v-50acd464]{padding:32px;text-align:center;color:var(--text-muted)}.page-title[data-v-acbe49a3]{font-size:24px;margin-bottom:8px}.desc[data-v-acbe49a3]{color:var(--text-secondary);margin-bottom:24px;font-size:14px}code[data-v-acbe49a3]{background:var(--bg);padding:1px 6px;border-radius:3px;font-size:12px}.cards[data-v-acbe49a3]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}.card[data-v-acbe49a3]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:20px}.card h3[data-v-acbe49a3]{font-size:16px;margin-bottom:12px}.steps[data-v-acbe49a3]{display:flex;flex-wrap:wrap;gap:6px}.step[data-v-acbe49a3]{display:flex;align-items:center;gap:4px;padding:4px 10px;background:var(--bg);border-radius:4px;font-size:12px}.step-num[data-v-acbe49a3]{width:18px;height:18px;background:var(--primary);color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600}.step-name[data-v-acbe49a3]{font-weight:500}.step-config[data-v-acbe49a3]{color:var(--text-muted);font-size:10px}.empty[data-v-acbe49a3]{padding:32px;text-align:center;color:var(--text-muted)}.page-title[data-v-20d89a06]{font-size:24px;margin-bottom:16px}.table-wrap[data-v-20d89a06]{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}table[data-v-20d89a06]{width:100%;border-collapse:collapse;font-size:13px}th[data-v-20d89a06],td[data-v-20d89a06]{padding:10px 16px;text-align:left;border-bottom:1px solid var(--border)}th[data-v-20d89a06]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.tag[data-v-20d89a06]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:600}.tag-pending_review[data-v-20d89a06]{background:#fef3c7;color:#92400e}.tag-published[data-v-20d89a06],.tag-approved[data-v-20d89a06]{background:#dcfce7;color:#166534}.tag-rejected[data-v-20d89a06]{background:#fee2e2;color:#991b1b}.actions[data-v-20d89a06]{display:flex;gap:6px}.btn-sm[data-v-20d89a06]{padding:4px 12px;border:none;border-radius:4px;font-size:12px;cursor:pointer}.btn-green[data-v-20d89a06]{background:#10b981;color:#fff}.btn-red[data-v-20d89a06]{background:#ef4444;color:#fff}.empty[data-v-20d89a06]{padding:32px;text-align:center;color:var(--text-muted)}.page-title[data-v-61a02dc6]{font-size:24px;margin-bottom:8px}.back-link[data-v-61a02dc6]{color:var(--primary);text-decoration:none;font-size:14px;display:inline-block;margin-bottom:16px}.rev-list[data-v-61a02dc6]{display:flex;flex-direction:column;gap:12px}.rev-item[data-v-61a02dc6]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:16px}.rev-header[data-v-61a02dc6]{display:flex;align-items:center;gap:12px;margin-bottom:8px;font-size:13px}.rev-idx[data-v-61a02dc6]{font-weight:700;color:var(--primary)}.rev-time[data-v-61a02dc6],.rev-author[data-v-61a02dc6]{color:var(--text-secondary)}.btn-sm[data-v-61a02dc6]{padding:4px 12px;border:none;border-radius:4px;font-size:12px;cursor:pointer;margin-left:auto}.btn-green[data-v-61a02dc6]{background:#10b981;color:#fff}.diff[data-v-61a02dc6]{margin-top:8px;padding:8px 12px;background:var(--bg);border-radius:4px;font-size:12px;font-family:monospace}.diff-line[data-v-61a02dc6]{margin-bottom:4px;display:flex;gap:8px;align-items:baseline}.diff-field[data-v-61a02dc6]{color:var(--text-secondary);min-width:80px;font-weight:600}.diff-removed[data-v-61a02dc6]{color:#ef4444}.diff-added[data-v-61a02dc6]{color:#10b981}.no-diff[data-v-61a02dc6],.empty[data-v-61a02dc6]{padding:16px;text-align:center;color:var(--text-muted);font-size:13px}.page-title[data-v-b2de5510]{font-size:24px;margin-bottom:16px}.table-wrap[data-v-b2de5510]{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}table[data-v-b2de5510]{width:100%;border-collapse:collapse;font-size:13px}th[data-v-b2de5510],td[data-v-b2de5510]{padding:10px 16px;text-align:left;border-bottom:1px solid var(--border)}th[data-v-b2de5510]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.tag[data-v-b2de5510]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:600}.tag-active[data-v-b2de5510]{background:#dcfce7;color:#166534}.tag-inactive[data-v-b2de5510]{background:#fee2e2;color:#991b1b}.btn-sm[data-v-b2de5510]{padding:4px 12px;border:1px solid var(--border);border-radius:4px;font-size:12px;cursor:pointer;background:var(--bg);color:var(--text-primary)}.empty[data-v-b2de5510]{padding:32px;text-align:center;color:var(--text-muted)}.page-title[data-v-ee892e33]{font-size:24px;margin-bottom:0}.header[data-v-ee892e33]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.card[data-v-ee892e33]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin-bottom:16px}.card h3[data-v-ee892e33]{margin-bottom:16px;font-size:16px}.form-group[data-v-ee892e33]{margin-bottom:14px;flex:1}.form-group label[data-v-ee892e33]{display:block;font-size:13px;color:var(--text-secondary);margin-bottom:6px}.form-row[data-v-ee892e33]{display:flex;gap:16px}.input[data-v-ee892e33]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:var(--bg);color:var(--text-primary)}.actions[data-v-ee892e33]{margin-top:12px}.btn-primary[data-v-ee892e33]{padding:10px 24px;background:var(--primary);color:#fff;border:none;border-radius:6px;font-size:14px;cursor:pointer}.btn-sm[data-v-ee892e33]{padding:4px 12px;border:1px solid var(--border);border-radius:4px;font-size:12px;cursor:pointer;background:var(--bg);color:var(--text-primary);margin-right:4px}.btn-red[data-v-ee892e33]{color:var(--danger);border-color:var(--danger)}.table-wrap[data-v-ee892e33]{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}table[data-v-ee892e33]{width:100%;border-collapse:collapse;font-size:13px}th[data-v-ee892e33],td[data-v-ee892e33]{padding:10px 16px;text-align:left;border-bottom:1px solid var(--border)}th[data-v-ee892e33]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.empty[data-v-ee892e33]{padding:32px;text-align:center;color:var(--text-muted)}.page-title[data-v-8a1d5af7]{font-size:24px;margin-bottom:8px}.desc[data-v-8a1d5af7]{color:var(--text-secondary);margin-bottom:24px;font-size:14px}.cards[data-v-8a1d5af7]{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px;margin-bottom:24px}.card[data-v-8a1d5af7]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:20px}.card h3[data-v-8a1d5af7]{font-size:14px;font-weight:600;margin-bottom:14px;color:var(--text-primary)}.form-group[data-v-8a1d5af7]{margin-bottom:14px}.form-group label[data-v-8a1d5af7]{display:block;font-size:12px;color:var(--text-secondary);margin-bottom:6px}.color-row[data-v-8a1d5af7]{display:flex;gap:8px;align-items:center}.color-input[data-v-8a1d5af7]{width:36px;height:36px;border:1px solid var(--border);border-radius:4px;cursor:pointer;padding:2px}.input[data-v-8a1d5af7]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:var(--bg);color:var(--text-primary)}.textarea[data-v-8a1d5af7]{resize:vertical;font-family:monospace}.actions[data-v-8a1d5af7]{margin-bottom:24px;display:flex;align-items:center;gap:12px}.btn-primary[data-v-8a1d5af7]{padding:10px 24px;background:var(--primary);color:#fff;border:none;border-radius:6px;font-size:14px;cursor:pointer}.saved[data-v-8a1d5af7]{color:var(--primary);font-size:13px}.note[data-v-8a1d5af7]{background:#f0fdf4;border:1px solid #BBF7D0;border-radius:8px;padding:16px 20px}.note h3[data-v-8a1d5af7]{font-size:14px;margin-bottom:6px}.note p[data-v-8a1d5af7]{font-size:13px;color:var(--text-secondary);line-height:1.6}code[data-v-8a1d5af7]{background:#dcfce7;padding:1px 6px;border-radius:3px;font-size:12px}.page-title[data-v-ea8df18c]{font-size:24px;margin-bottom:8px}.desc[data-v-ea8df18c]{color:var(--text-secondary);font-size:14px;margin-bottom:24px}.cards[data-v-ea8df18c]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:24px}.card[data-v-ea8df18c]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:20px}.card.active[data-v-ea8df18c]{border-color:var(--primary)}.card-header[data-v-ea8df18c]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.card h3[data-v-ea8df18c]{font-size:16px}.badge[data-v-ea8df18c]{background:var(--primary);color:#fff;padding:2px 10px;border-radius:12px;font-size:11px;font-weight:600}.badge.active[data-v-ea8df18c]{background:#10b981}.card-desc[data-v-ea8df18c]{font-size:13px;color:var(--text-secondary);margin-bottom:12px}.card-actions[data-v-ea8df18c]{display:flex;gap:8px}.upload-card[data-v-ea8df18c]{margin-bottom:24px}.form-group[data-v-ea8df18c]{margin-bottom:14px}.form-group label[data-v-ea8df18c]{display:block;font-size:13px;color:var(--text-secondary);margin-bottom:6px}.input[data-v-ea8df18c]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:var(--bg);color:var(--text-primary)}.btn-primary[data-v-ea8df18c]{padding:10px 24px;background:var(--primary);color:#fff;border:none;border-radius:6px;font-size:14px;cursor:pointer}.btn-primary[data-v-ea8df18c]:disabled{opacity:.6}.btn-danger[data-v-ea8df18c]{padding:6px 14px;background:var(--danger);color:#fff;border:none;border-radius:4px;font-size:12px;cursor:pointer}.note[data-v-ea8df18c]{background:#f0fdf4;border:1px solid #BBF7D0;border-radius:8px;padding:20px}.note h3[data-v-ea8df18c]{font-size:14px;margin-bottom:8px}.note p[data-v-ea8df18c]{font-size:13px;color:var(--text-secondary);margin-bottom:4px;line-height:1.8}.mt-8[data-v-ea8df18c]{margin-top:12px}.code-block[data-v-ea8df18c]{background:#1f2937;color:#e5e7eb;padding:12px 16px;border-radius:6px;font-size:12px;overflow-x:auto;margin-top:8px;white-space:pre}.page-title[data-v-ee0445d5]{font-size:24px;margin-bottom:0}.header[data-v-ee0445d5]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.card[data-v-ee0445d5]{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin-bottom:16px}.card h3[data-v-ee0445d5]{margin-bottom:16px;font-size:16px}.form-group[data-v-ee0445d5]{margin-bottom:14px;flex:1}.form-group label[data-v-ee0445d5]{display:block;font-size:13px;color:var(--text-secondary);margin-bottom:6px}.form-row[data-v-ee0445d5]{display:flex;gap:16px}.input[data-v-ee0445d5]{width:100%;padding:8px 12px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:var(--bg);color:var(--text-primary)}.actions[data-v-ee0445d5]{display:flex;gap:8px;margin-top:12px}.btn-primary[data-v-ee0445d5]{padding:10px 24px;background:var(--primary);color:#fff;border:none;border-radius:6px;font-size:14px;cursor:pointer}.btn[data-v-ee0445d5]{padding:10px 16px;background:var(--surface);border:1px solid var(--border);border-radius:6px;font-size:14px;cursor:pointer}.btn-sm[data-v-ee0445d5]{padding:4px 12px;border:1px solid var(--border);border-radius:4px;font-size:12px;cursor:pointer;margin-right:4px}.btn-red[data-v-ee0445d5]{color:var(--danger);border-color:var(--danger)}.table-wrap[data-v-ee0445d5]{background:var(--surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}table[data-v-ee0445d5]{width:100%;border-collapse:collapse;font-size:13px}th[data-v-ee0445d5],td[data-v-ee0445d5]{padding:10px 16px;text-align:left;border-bottom:1px solid var(--border)}th[data-v-ee0445d5]{font-weight:600;color:var(--text-secondary);background:var(--bg)}.empty[data-v-ee0445d5]{padding:32px;text-align:center;color:var(--text-muted)}.header[data-v-cb1ccabd]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.search-bar[data-v-cb1ccabd]{display:flex;gap:12px;margin-bottom:20px}.search-bar .input[data-v-cb1ccabd]{flex:1}.select-sm[data-v-cb1ccabd]{max-width:140px}.plugin-grid[data-v-cb1ccabd]{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px}.plugin-card[data-v-cb1ccabd]{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:20px;display:flex;flex-direction:column;gap:10px;transition:box-shadow .15s}.plugin-card[data-v-cb1ccabd]:hover{box-shadow:0 2px 12px #0000000f}.plugin-card.installed[data-v-cb1ccabd]{border-color:#10b981}.plugin-header[data-v-cb1ccabd]{display:flex;justify-content:space-between;align-items:center}.plugin-header h3[data-v-cb1ccabd]{font-size:15px;font-weight:600;color:var(--text-primary);margin:0}.badge-done[data-v-cb1ccabd]{font-size:11px;color:#065f46;background:#d1fae5;padding:2px 8px;border-radius:4px}.badge-ver[data-v-cb1ccabd]{font-size:11px;color:var(--text-muted)}.plugin-desc[data-v-cb1ccabd]{font-size:13px;color:var(--text-secondary);line-height:1.5;margin:0}.plugin-meta[data-v-cb1ccabd]{font-size:11px;color:var(--text-muted);display:flex;gap:12px}.plugin-tags[data-v-cb1ccabd]{display:flex;flex-wrap:wrap;gap:4px}.plugin-actions[data-v-cb1ccabd]{margin-top:auto;padding-top:8px}.btn-sm[data-v-cb1ccabd]{padding:6px 14px;font-size:12px}.error[data-v-cb1ccabd]{color:var(--danger);margin-bottom:12px;font-size:13px}
@@ -0,0 +1,28 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Taichu Admin</title>
7
+ <style>
8
+ * { margin: 0; padding: 0; box-sizing: border-box; }
9
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
10
+ :root {
11
+ --primary: #10B981;
12
+ --primary-dark: #059669;
13
+ --bg: #F9FAFB;
14
+ --surface: #FFFFFF;
15
+ --border: #E5E7EB;
16
+ --text: #111827;
17
+ --text-secondary: #6B7280;
18
+ --danger: #EF4444;
19
+ --radius: 8px;
20
+ }
21
+ </style>
22
+ <script type="module" crossorigin src="/admin/assets/index-DApxOVTx.js"></script>
23
+ <link rel="stylesheet" crossorigin href="/admin/assets/index-DtMvdQm9.css">
24
+ </head>
25
+ <body>
26
+ <div id="app"></div>
27
+ </body>
28
+ </html>