From 7060279f4d4fe38fe2b836627d319e096c5587cc Mon Sep 17 00:00:00 2001 From: DavidHLP Date: Thu, 18 Jun 2026 21:07:31 +0800 Subject: [PATCH 01/38] docs: sync CODEMAPS/RUNBOOK/CONTRIBUTING to 2026-06-18 codebase state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CODEMAPS: refresh 5 freshness headers; data.md migrations 25→34 (+judge_outbox, notification_delivery_ledger, virtual_contest_sessions, contest scoring hardening, problem resource limits); architecture/ dependencies add shared/sandbox-types, Arthas 4.1.9→4.2.2, PM2 4→5 apps - RUNBOOK §1: PM2 app count 4→5 (4 long-running + one-shot ulticode-init-db) - CONTRIBUTING: add @ulticode/sandbox-types to Shared Packages table - ecosystem.config.cjs: fix stale arthas protocol comment STREAMABLE→STATELESS (project-pinned in arthas.properties) - .reports/codemap-diff.txt: refresh diff report --- .reports/codemap-diff.txt | 215 ++++++++++------------------------ docs/CODEMAPS/architecture.md | 39 +++--- docs/CODEMAPS/backend.md | 2 +- docs/CODEMAPS/data.md | 36 ++++-- docs/CODEMAPS/dependencies.md | 13 +- docs/CODEMAPS/frontend.md | 2 +- docs/CONTRIBUTING.md | 16 ++- docs/RUNBOOK.md | 6 +- ecosystem.config.cjs | 2 +- 9 files changed, 137 insertions(+), 194 deletions(-) diff --git a/.reports/codemap-diff.txt b/.reports/codemap-diff.txt index d32f51105..d3880b171 100644 --- a/.reports/codemap-diff.txt +++ b/.reports/codemap-diff.txt @@ -1,153 +1,62 @@ -Codemap Update Report - 2026-06-12 -================================== - -Files Scanned : 2038 (was 1923 — ↑115) - Java 735, Vue 821, TS 482 (excl. shared), test files 46 - __tests__ dirs 21 -Backend Java : 735 (was 708, +27) -Vue (both FEs) : 821 (was 820, +1) -TS (both FEs) : 482 (was 445, +37) -Migrations : 25 (was 20, +5) -Controllers : 43 (was 41, +2 — ProblemNote + SolutionTopic) -Modules : 26 (unchanged) -Shared Packages : 4 (unchanged) -Codemaps Updated : 5 (all) - -Change Magnitude ----------------- -Cumulative delta vs 2026-06-10 baseline: - Migrations: 20 → 25 (+25.0%) - Controllers: 41 → 43 (+4.9%) - Java sources: 708 → 735 (+3.8%) - TS sources: 445 → 482 (+8.3%) -Weighted overall: ~10-15% — under 30% threshold → in-place update. - -Change Summary -------------- -[MINOR] docs/CODEMAPS/architecture.md - - Freshness header: 2026-06-10 → 2026-06-12, new file counts - - Backend purpose: appended ", notes, topics, etc." (new domain features) - - Data flow: +2 bullets (reactions / notes & topics) - - Migration listing: refreshed to 25 files; latest 5 listed - - New "Recent Architectural Themes" section (5 bullets) - -[MINOR] docs/CODEMAPS/backend.md - - Controllers: 41 → 43, with new ProblemNote + SolutionTopic rows - - User-facing routes: +3 (problem note GET/POST, solution topics) - - Edge operations: noted LIKE/DISLIKE/FAVORITE expansion - - problem/ module: noted "notes NEW 2026-06-11" - - solution/ module: noted "topics NEW 2026-06-11" - - notification: noted "logical delete added 2026-06-11" - -[MINOR] docs/CODEMAPS/frontend.md - - New "Recent Console Changes" section with full file list (10 modified, - 2 new __tests__ dirs) - - features/sider/ note: AppLayout/SidebarInset refactored 2026-06-12 - - Vue/TS counts refreshed (Console ~351/~217, Mgmt ~470/~265) - -[MINOR] docs/CODEMAPS/data.md - - Migrations: 20 → 25, appended 5 newest - - Table groups: +problem_notes, +solution_topics - - Notification group: noted is_deleted + system→system_enabled - - Edge ops: noted enum expansion - - Relationships: +users30% delta requires user approval before - overwrite; this pass at ~10-15% was in-place -- Files re-read in full via Read tool before Write (per Write-tool contract) +# Codemap Diff Report + +Generated: 2026-06-18 +Previous codemap baseline: 2026-06-12 +Scan scope: docs/CODEMAPS/ (6 files) +Diff threshold: <=30% → update in place (no overwrite approval needed). Overall weighted drift ~12%; data.md highest at ~25-30%. + +## Codemaps modified (5/6) + +| File | Change | Est. drift | +| ---- | ------ | ---------- | +| architecture.md | header + Arthas 4.2.2 + sandbox-types + PM2 5 apps + 4 new Data-Flow bullets + Migration Strategy + 4 new themes | ~12% | +| data.md | header + migrations 25→34 + 9 new migration rows + Table Groups (6 new tables) + Key Relationships (contest) | ~25-30% | +| dependencies.md | header + Arthas 4.2.2 + sandbox-types row + PM2 5 apps | ~8% | +| backend.md | header date only (controllers 43 / modules 26 unchanged & verified) | <1% | +| frontend.md | header date only (view/store tree stable) | <1% | +| sandbox.md | unchanged (recently maintained, ADR-002 refs up to 2026-06-16) | 0% | + +## Files added/removed/modified since last scan (codebase side) + +### New shared package +- shared/sandbox-types/ (@ulticode/sandbox-types, Phase 4) — typed sandbox DTOs; now documented in architecture.md + dependencies.md + +### Migrations: 25 → 34 (+9) +- V20260611141000__Create_Problem_Notes_Table (timestamp corrected; was mis-duped as _140000) +- V20260613100000__Create_Judge_Outbox [ADR-003 outbox] +- V20260613110000__Add_Submission_Generation_And_Lease [queue gen counter + lease] +- V20260613120000__Create_Notification_Delivery_Ledger [per-channel delivery] +- V20260615140000__Seed_Problem_Category_Tags [seed] +- V20260616000000__Seed_Missing_Test_Cases [seed] +- V20260616120000__Add_Problem_Resource_Limits [time/memory/cpus cols] +- V20260617120000__Contest_Scoring_Hardening [ADR-006] +- V20260617130000__Contest_Slug_Unique [unique constraint] +- V20260617140000__Contest_Real_Unique_And_Session_Length [virtual_contest_sessions, ADR-007] + +### New tables (post-baseline) +judge_outbox, notification_delivery_ledger, virtual_contest_sessions, +contest_rankings, contest_analytics, contest_scoring_rules (+ problem resource-limit columns) + +## New dependencies detected +- @ulticode/sandbox-types (shared DTO package, Phase 4) + +## Architecture changes +- Queue/outbox pattern (ADR-003): judge_outbox + submission generation/lease for exactly-once verdict delivery +- Contest scoring engine (ADR-006): scoring-rule activation, slug/real unique constraints +- Virtual contests (ADR-007): virtual_contest_sessions, rating isolation +- Problem resource limits: per-problem time/memory/cpus +- Notification delivery ledger: per-channel delivery tracking +- Runtime: Arthas 4.1.9 → 4.2.2 (STATELESS MCP); PM2 app count 4 → 5 (added one-shot ulticode-init-db) + +## Verified accurate (no drift) +- Backend: 26 modules, 43 controllers (matches ecosystem + source scan) +- Frontend: console/management view + store + composable trees stable +- ENV.md / CONTRIBUTING.md script tables (synced in prior /ecc:update-docs pass) +- Infrastructure images/ports (MySQL 9.1:23306, Redis 7:26379, Nacos 2.3.2:28848, Sandbox) + +## Staleness warnings (90+ days) +None. Oldest docs/*.md commit is 2026-06-10 (8 days). All CODEMAPS now stamped 2026-06-18. + +## Follow-up (not auto-fixed) +- ecosystem.config.cjs code comment still says "协议 STREAMABLE"; project pins STATELESS (see infrastructure/arthas/arthas.properties). Stale CODE comment, out of codemap scope. +- Frontend recommendation* orphan/dead-code dirs still flagged (pre-existing). diff --git a/docs/CODEMAPS/architecture.md b/docs/CODEMAPS/architecture.md index 42e4c3b77..e49724fb9 100644 --- a/docs/CODEMAPS/architecture.md +++ b/docs/CODEMAPS/architecture.md @@ -1,4 +1,4 @@ - + # Architecture @@ -34,7 +34,7 @@ | MySQL | 23306 | MySQL 9.1 | Primary data store | | Redis | 26379 | Redis 7 | Session (Redisson), rate limit, CSRF | | Nacos | 28848 | Nacos 2.3.2 | Service discovery + config | -| Arthas MCP | 8563 | Arthas 4.1.9 (wrapper) | Runtime JVM diagnostics (PM2 / hook / CLI, three-way mutex) | +| Arthas MCP | 8563 | Arthas 4.2.2 (wrapper, STATELESS MCP) | Runtime JVM diagnostics (PM2 / hook / CLI, three-way mutex) | > **Removed (2026-05-30)**: `recommend-provider` (:20881) and `recommend-web` (:9005) > services + Dubbo RPC stack. The `recommendation` module is no longer active. @@ -48,41 +48,48 @@ - **Real-time**: WebSocket STOMP on `/ws`, `/ws/contest`, `/ws/notifications` (cookie-based auth only) - **Search**: MeiliSearch SDK 0.20.0 for problem/solution full-text (off by default in dev) - **Reactions**: `edge_operations` enum extended with LIKE / DISLIKE / FAVORITE (V20260610150000) for viewer-reaction display -- **Notes & Topics**: per-user problem notes (1:1, V20260611_140000) + solution topic taxonomy (V20260611140000) +- **Notes & Topics**: per-user problem notes (1:1, V20260611141000) + solution topic taxonomy (V20260611140000) +- **Verdict delivery**: `judge_outbox` (V20260613100000, ADR-003) + submission generation counter / lease (V20260613110000) for the queue/outbox pattern +- **Notifications**: `notification_delivery_ledger` (V20260613120000) tracks per-channel delivery +- **Contest scoring**: scoring engine activation (ADR-006, V20260617120000) + virtual contest sessions / rating isolation (ADR-007, V20260617140000) - **Audit**: `@Audited` annotation on privileged writes; persisted in `audit_logs` ## Migration Strategy | Tool | Location | Versions | Purpose | | ------ | ------------------------- | ---------------------- | ----------------------------- | -| Flyway | `init-db/migrations/` | Timestamp-based (25 files) | Schema + seed migrations | +| Flyway | `init-db/migrations/` | Timestamp-based (34 files) | Schema + seed migrations | Baseline: `V20260602_120000__Create_All_Tables.sql` (67 tables). Security: `V20260606130000__Secure_Refresh_Tokens_And_Lock_Seed_Accounts.sql`. -Latest additions (2026-06-10 → 2026-06-12): -- `V20260610150000__Extend_Edge_Operations_For_Problem_Reactions` (enum expand) -- `V20260611120000__Rename_Notification_Pref_System_Column` (MySQL 9.x reserved keyword) -- `V20260611130000__Add_Notifications_Is_Deleted` (logical delete) -- `V20260611_140000__Create_Problem_Notes_Table` (new feature table) -- `V20260611140000__Create_Solution_Topics_Table` (BUG-01 fix, 8 seeded topics) +Latest additions (2026-06-13 → 2026-06-17): +- `V20260613100000__Create_Judge_Outbox` + `V20260613110000__Add_Submission_Generation_And_Lease` (queue/outbox, ADR-003) +- `V20260613120000__Create_Notification_Delivery_Ledger` (per-channel delivery tracking) +- `V20260616120000__Add_Problem_Resource_Limits` (time/memory/cpus columns) +- `V20260617120000__Contest_Scoring_Hardening` + `V20260617130000__Contest_Slug_Unique` + `V20260617140000__Contest_Real_Unique_And_Session_Length` (ADR-006 scoring + ADR-007 virtual sessions) ## Shared Libraries -- `shared/auth-core/` — Vue composable: types, cookie utils, CSRF manager, auth state, axios CSRF interceptor, permission checker -- `shared/badge-config/` — Achievement/badge configuration (token-level config shared by both FEs) -- `shared/theme/` — Theme tokens + Vue theme composable + `public/theme-bootstrap.js` source-of-truth (FOUC mitigation) -- `shared/design-system/` — Legacy: `style.css` only (residual; consolidated under `shared/theme`) +- `shared/auth-core/` — Vue composable: types, cookie utils, CSRF manager, auth state, axios CSRF interceptor, permission checker +- `shared/badge-config/` — Achievement/badge configuration (token-level config shared by both FEs) +- `shared/sandbox-types/` — Shared sandbox DTO types (Phase 4, consumed by backend + sandbox harness) +- `shared/theme/` — Theme tokens + Vue theme composable + `public/theme-bootstrap.js` source-of-truth (FOUC mitigation) +- `shared/design-system/` — Legacy: `style.css` only (residual; consolidated under `shared/theme`) ## Runtime Tooling -- **PM2** (`ecosystem.config.cjs`): 4 apps — `ulticode-9001`, `ulticode-9002`, `ulticode-9003`, `ulticode-arthas` +- **PM2** (`ecosystem.config.cjs`): 5 apps — 4 long-running (`ulticode-9001`, `ulticode-9002`, `ulticode-9003`, `ulticode-arthas`) + one-shot `ulticode-init-db` migration task - **Arthas MCP** (`scripts/start-arthas.sh`): three-launcher mutex (PM2 / SessionStart hook / CLI) on port 8563 - **MailHog** (optional, `SMTP_HOST=localhost:1025`): local email capture, off by default -## Recent Architectural Themes (2026-06-10 → 2026-06-12) +## Recent Architectural Themes (2026-06-10 → 2026-06-18) 1. **Personal dashboard refactor** (console): 5 chart components reworked (LearningProgressChart, SkillRadarChart, SubmissionHistoryChart, UserProfileCard, UserStatsPanel); SidebarInset, AppLayout, DataTableToolbar, ProblemSetSidebar touched 2. **Component test coverage expansion** (console): new `__tests__/` under `components/common/data-table/` and `components/ui/sidebar/` 3. **New domain features**: problem notes (1:1 per user×problem), solution topics taxonomy 4. **Notification hardening**: column rename (reserved keyword) + logical delete 5. **Edge operations expansion**: viewer reaction tracking via enum extension +6. **Queue/outbox pattern** (ADR-003): `judge_outbox` + submission generation counter / lease for exactly-once verdict delivery +7. **Contest scoring engine** (ADR-006 / ADR-007): scoring-rule activation, contest slug/real unique constraints, virtual contest sessions with rating isolation +8. **Problem resource limits**: per-problem time/memory/cpus columns (V20260616120000) +9. **Notification delivery ledger**: per-channel delivery tracking (V20260613120000) diff --git a/docs/CODEMAPS/backend.md b/docs/CODEMAPS/backend.md index 2b3bcc3dc..a03d313d3 100644 --- a/docs/CODEMAPS/backend.md +++ b/docs/CODEMAPS/backend.md @@ -1,4 +1,4 @@ - + # Backend Architecture diff --git a/docs/CODEMAPS/data.md b/docs/CODEMAPS/data.md index 51a728623..f2aa5c95d 100644 --- a/docs/CODEMAPS/data.md +++ b/docs/CODEMAPS/data.md @@ -1,4 +1,4 @@ - + # Data Architecture @@ -12,19 +12,24 @@ and seed schema. Subsequent migrations add columns / data / constraints. ``` Identity : users, roles, user_roles, user_follows, user_achievements, achievements, badges -Problem : problems, problem_tags, problem_test_cases, problem_examples, +Problem : problems (+ time/memory/cpus resource limits 2026-06-16), + problem_tags, problem_test_cases, problem_examples, problem_versions, problem_lists, problem_lists_version, problem_details_content, test_cases, problem_notes [new 2026-06-11] Submission : submissions, submission_retry_count, submission_memory_nullable, solutions, solution_comments, solution_votes, - solution_topics [new 2026-06-11] -Contest : contests, contest_problems, contest_participants, - contest_submissions, contest_actual_times, scoring_rules + solution_topics, [new 2026-06-11] + judge_outbox [new 2026-06-13 — verdict delivery, ADR-003] +Contest : contests (+ slug/real unique 2026-06-17), contest_problems, + contest_participants, contest_submissions, contest_actual_times, + scoring_rules, contest_scoring_rules, contest_rankings, + contest_analytics, virtual_contest_sessions [scoring+virtual new 2026-06-13→17, ADR-006/007] Forum : forum_posts, post_comments, post_likes Moderation : moderation_queue, reports, moderation_actions, appeals Notification : notifications (is_deleted added 2026-06-11), - notification_preferences (system → system_enabled 2026-06-11) + notification_preferences (system → system_enabled 2026-06-11), + notification_delivery_ledger [new 2026-06-13] Subscription : subscriptions, subscription_plans Edge ops : edge_operations (enum extended: LIKE/DISLIKE/FAVORITE 2026-06-10) Auth : refresh_tokens, password_reset_tokens, oauth_states, @@ -35,7 +40,7 @@ Recommendation : recommendation_seed_problems, recommendation_seed_submissions, daily_recommendations_feedback [orphaned] ``` -### Migrations (`init-db/migrations/`) — 25 files +### Migrations (`init-db/migrations/`) — 34 files ``` V20260602_120000 Create_All_Tables [baseline, 67 tables] V20260602_120100 Insert_Admin_User_And_Permissions [seed admin + roles] @@ -60,8 +65,17 @@ V20260610_140000 Add_User_Permission_Expires_At [new] V20260610_150000 Extend_Edge_Operations_For_Problem_Reactions [new — enum +LIKE/+DISLIKE/+FAVORITE] V20260611_120000 Rename_Notification_Pref_System_Column [new — MySQL 9.x reserved keyword] V20260611_130000 Add_Notifications_Is_Deleted [new — logical delete] -V20260611_140000 Create_Problem_Notes_Table [new — user×problem 1:1] V20260611_140000 Create_Solution_Topics_Table [new — 8 seeded topics] +V20260611_141000 Create_Problem_Notes_Table [new — user×problem 1:1] +V20260613_100000 Create_Judge_Outbox [new — verdict delivery outbox, ADR-003] +V20260613_110000 Add_Submission_Generation_And_Lease [new — generation counter + queue lease] +V20260613_120000 Create_Notification_Delivery_Ledger [new — delivery tracking] +V20260615_140000 Seed_Problem_Category_Tags [seed] +V20260616_000000 Seed_Missing_Test_Cases [seed] +V20260616_120000 Add_Problem_Resource_Limits [new — time/memory/cpus columns] +V20260617_120000 Contest_Scoring_Hardening [new — ADR-006 scoring engine] +V20260617_130000 Contest_Slug_Unique [new — unique constraint] +V20260617_140000 Contest_Real_Unique_And_Session_Length [new — virtual_contest_sessions, ADR-007] ``` > **Security migration note**: `V20260606130000` revokes/rotates refresh tokens @@ -82,7 +96,7 @@ init-db/ ├── README.md ├── flyway.conf ├── pom.xml (Maven, Flyway 10.10.0) -├── migrations/ (25 SQL files) +├── migrations/ (34 SQL files) ├── sql/ (one-time dumps) └── validate-migration.sh ``` @@ -114,7 +128,9 @@ problems ─┬─< problem_test_cases (1:N) └─< problem_notes (1:1 per user) [new 2026-06-11] contests ─┬─< contest_problems (1:N) - └─< contest_participants (M:N) + ├─< contest_participants (M:N) + ├─< contest_rankings (1:N, scored) [new 2026-06-17] + └─< virtual_contest_sessions (1:N, virtual replay) [new 2026-06-17] solutions ─┬─< solution_comments (1:N) ├─< solution_votes (1:N via edge_operations) diff --git a/docs/CODEMAPS/dependencies.md b/docs/CODEMAPS/dependencies.md index f144c6635..5ce2e2ee3 100644 --- a/docs/CODEMAPS/dependencies.md +++ b/docs/CODEMAPS/dependencies.md @@ -1,4 +1,4 @@ - + # Dependencies & Integrations @@ -82,9 +82,10 @@ | Package | Purpose | | ---------------------- | ------------------------------------------------------ | -| `shared/auth-core` | Vue composable: cookie/CSRF/auth-state/permission | -| `shared/badge-config` | Achievement / badge token config (shared by both FEs) | -| `shared/theme` | Theme tokens + Vue composable + `public/theme-bootstrap.js` source | +| `shared/auth-core` | Vue composable: cookie/CSRF/auth-state/permission | +| `shared/badge-config` | Achievement / badge token config (shared by both FEs) | +| `shared/sandbox-types` | Shared sandbox DTO types (backend + sandbox harness) | +| `shared/theme` | Theme tokens + Vue composable + `public/theme-bootstrap.js` source | | `shared/design-system` | Legacy `style.css` only — to be retired | ## Infrastructure (docker-compose) @@ -103,8 +104,8 @@ publish the infra ports externally. Sandbox image is built locally from ## Runtime Tooling -- **PM2** (`ecosystem.config.cjs`): 4 apps — `ulticode-9001`, `ulticode-9002`, `ulticode-9003`, `ulticode-arthas` -- **Arthas 4.1.9** (`tools/arthas-boot.jar`): runtime JVM diagnostics +- **PM2** (`ecosystem.config.cjs`): 5 apps — 4 long-running (`ulticode-9001`, `ulticode-9002`, `ulticode-9003`, `ulticode-arthas`) + one-shot `ulticode-init-db` migration task +- **Arthas 4.2.2** (`tools/arthas-boot.jar`): runtime JVM diagnostics - Wrapper: `scripts/start-arthas.sh` (port 8563, three-launcher mutex: PM2 / SessionStart hook / CLI) - MCP endpoint: `http://localhost:8563/mcp` diff --git a/docs/CODEMAPS/frontend.md b/docs/CODEMAPS/frontend.md index c2fffc526..97c8c4a1e 100644 --- a/docs/CODEMAPS/frontend.md +++ b/docs/CODEMAPS/frontend.md @@ -1,4 +1,4 @@ - + # Frontend Architecture diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 99a827ea9..7db57fa88 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -71,7 +71,7 @@ cd management && pnpm dev ## Available Commands - + ### Console Frontend (console/) @@ -107,9 +107,9 @@ Same scripts as console (except `validate:mocks*`), plus: > excludes only `**/shared/theme/**`. Both rely on the shared `auth-core` > package's own `pnpm test` for that module's coverage. -### Shared Packages (shared/auth-core/, shared/theme/) +### Shared Packages (shared/auth-core/, shared/theme/, shared/sandbox-types/) -Both `@ulticode/auth-core` and `@ulticode/theme` expose the same script set: +`@ulticode/auth-core` and `@ulticode/theme` expose the same script set: | Command | Description | |---------|-------------| @@ -117,7 +117,15 @@ Both `@ulticode/auth-core` and `@ulticode/theme` expose the same script set: | `pnpm test` | Vitest unit tests (single run) | | `pnpm test:watch` | Vitest in watch mode | -`shared/badge-config` ships source-only — no scripts. +`@ulticode/sandbox-types` (shared sandbox DTO package) exposes `type-check` and +`test` (no watch mode): + +| Command | Description | +|---------|-------------| +| `pnpm type-check` | `tsc --noEmit` | +| `pnpm test` | Vitest unit tests (single run) | + +`shared/badge-config` and `shared/design-system` ship source-only — no scripts. ### Backend (backend-spring/) diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index dd78a1d2d..645b54300 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -18,8 +18,10 @@ stack. Targets the PM2 + Docker Compose dev topology described in | Redis 7 | 26379 | Docker `ulticode-redis` | `docker logs ulticode-redis` | | Nacos 2.3.2 | 28848 | Docker `ulticode-nacos` | `docker logs ulticode-nacos` | -> **PM2 app count = 4** (including `ulticode-arthas`). PM2 logs rotate at 20 MB -> with 5 retained files (see `ecosystem.config.cjs`). +> **PM2 defines 5 apps**: 4 long-running (`ulticode-9001`, `ulticode-9002`, +> `ulticode-9003`, `ulticode-arthas`) plus the one-shot `ulticode-init-db` +> migration task (runs once, then `stopped` — see §4.6). PM2 logs rotate at +> 20 MB with 5 retained files (see `ecosystem.config.cjs`). --- diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs index 6a109481b..b891fd323 100644 --- a/ecosystem.config.cjs +++ b/ecosystem.config.cjs @@ -130,7 +130,7 @@ module.exports = { // - 自愈 loop: 端口 8563 死了就重 attach (修复 pm2 restart 9001 后断连) // - 也可由 Claude Code SessionStart hook 拉起 (见 .claude/settings.json) // - 两路互斥: 任何一路发现 8563 已监听都会跳过, 不会重复 attach - // - 端口: 8563 (HTTP MCP 端点 /mcp, 协议 STREAMABLE) + // - 端口: 8563 (HTTP MCP 端点 /mcp, 协议 STATELESS — 项目级 pin, 见 infrastructure/arthas/arthas.properties) // 启动顺序: ulticode-9001 之后 (wrapper 等 Spring Boot 就绪再 attach) name: "ulticode-arthas", script: "./scripts/start-arthas.sh", From 14ca103ba6023d83601ca513680d2d24ef3d5330 Mon Sep 17 00:00:00 2001 From: DavidHLP Date: Fri, 19 Jun 2026 02:36:25 +0800 Subject: [PATCH 02/38] chore: rollup prior session WIP and shared typography migration --- console/package.json | 3 +- console/src/assets/charts.css | 2 +- console/src/assets/markdown.css | 100 +- console/src/components/LanguageSwitcher.vue | 2 +- console/src/components/ThemeSwitcher.vue | 6 +- .../achievement/AchievementBadge.vue | 4 +- .../bookmark/BookmarkFolderList.vue | 2 +- .../bookmark/CreateFolderDialog.vue | 6 +- .../src/components/comments/CommentForm.vue | 6 +- .../src/components/comments/CommentNode.vue | 6 +- .../src/components/comments/CommentThread.vue | 4 +- .../common/data-table/DataTable.vue | 4 +- .../common/data-table/DataTableToolbar.vue | 2 +- .../common/data-table/TagFilter.vue | 6 +- .../components/dashboard/ActivityHeatmap.vue | 4 +- .../components/dashboard/SkillRadarChart.vue | 2 +- .../components/edge-operations/ActionItem.vue | 4 +- .../edge-operations/ProblemSaveButton.vue | 4 +- .../vote-control/VoteControl.vue | 8 +- .../notification/NotificationBadge.vue | 8 +- .../components/problem/FeaturedBanners.vue | 2 +- .../components/problem/ProblemListDrawer.vue | 4 +- .../components/problem/ProblemSetSidebar.vue | 6 +- .../problem/components/ProblemFilterPanel.vue | 2 +- .../ui/calendar/CalendarHeadCell.vue | 2 +- .../src/composables/useTypographyDensity.ts | 25 + .../layout/panels/LayoutPanelHeader.vue | 2 +- console/src/features/sider/AppLayout.vue | 4 +- console/src/features/sider/NavUser.vue | 2 +- console/src/features/sider/SidebarNav.vue | 14 +- .../sider/components/SidebarListSections.vue | 24 +- console/src/main.ts | 8 + console/src/views/LandingView.vue | 50 +- console/src/views/auth/ForgotPasswordView.vue | 50 +- console/src/views/auth/LoginView.vue | 38 +- console/src/views/auth/RegisterView.vue | 38 +- console/src/views/auth/ResetPasswordView.vue | 50 +- .../src/views/auth/components/AuthButton.vue | 6 +- .../src/views/auth/components/AuthCard.vue | 6 +- .../src/views/auth/components/AuthDivider.vue | 6 +- .../src/views/auth/components/AuthInput.vue | 20 +- .../src/views/auth/components/LoginForm.vue | 22 +- .../src/views/auth/components/OAuthButton.vue | 6 +- .../views/auth/components/RegisterForm.vue | 18 +- .../src/views/contest/ContestBrowseView.vue | 2 +- .../contest/components/GlobalRanking.vue | 12 +- .../views/contest/components/MyContests.vue | 2 +- .../views/contest/components/PastContests.vue | 2 +- .../contest/components/RunningContests.vue | 6 +- .../contest/detailed/ContestDetailView.vue | 8 +- .../detailed/components/ContestHeader.vue | 2 +- .../components/ContestProblemList.vue | 22 +- .../components/ContestRankingTable.vue | 16 +- .../components/ContestRegistration.vue | 18 +- console/src/views/forum/ForumEditorView.vue | 8 +- console/src/views/forum/ForumFeedView.vue | 2 +- console/src/views/forum/ForumThreadView.vue | 10 +- .../views/forum/components/ForumPostCard.vue | 6 +- .../views/forum/components/ThreadContent.vue | 12 +- console/src/views/personal/AccountView.vue | 6 +- console/src/views/personal/BookmarksView.vue | 2 +- console/src/views/personal/ForumPostsView.vue | 8 +- .../src/views/personal/ProblemListsView.vue | 12 +- console/src/views/personal/SolutionsView.vue | 6 +- .../src/views/personal/SubmissionsView.vue | 6 +- .../personal/components/CategoriesTab.vue | 2 +- .../views/personal/components/MyListsTab.vue | 4 +- .../personal/components/SavedListsTab.vue | 4 +- .../personal/components/UserProfileCard.vue | 2 +- .../personal/components/UserStatsPanel.vue | 24 +- .../solutions/SolutionsEditView.vue | 12 +- console/src/views/problems/code/CodeView.vue | 2 +- .../components/ContestAnnouncementBell.vue | 18 +- .../components/ContestProblemDock.vue | 42 +- .../components/ContestProblemNotInContest.vue | 4 +- .../components/ContestProblemShell.vue | 16 +- .../components/ContestReviewPanel.vue | 14 +- .../description/DescriptionMarkdown.vue | 36 +- .../problems/description/DescriptionView.vue | 26 +- .../problems/headers/LayoutHeaderCenter.vue | 4 +- .../problems/solutions/SolutionListView.vue | 14 +- .../solutions/components/SolutionCard.vue | 22 +- .../solutions/components/SolutionDetail.vue | 22 +- .../submissions/SubmissionsDetail.vue | 4 +- .../src/views/problems/test/TestCaseView.vue | 4 +- docs/CONTRIBUTING.md | 2 + docs/DOCS-SPEC.md | 200 ++++ docs/ENV.md | 7 +- docs/PRIVACY.md | 19 +- docs/README.md | 192 ++++ docs/RUNBOOK.md | 26 +- docs/SHARED_TYPOGRAPHY_DESIGN.md | 884 ++++++++++++++++++ ...DR-008-websocket-auth-and-realtime-push.md | 4 +- ...rated-gate-and-virtual-rating-isolation.md | 4 +- ...ancel-state-and-virtual-replay-boundary.md | 4 +- .../ADR-011-crit6-shadow-mode-evaluation.md | 4 +- docs/adr/README.md | 8 +- docs/arthas-mcp-usage.md | 17 + docs/contest/EXECUTION_PLAN.md | 429 ++++----- docs/contest/F-01-STATE_MACHINE_AUDIT.md | 6 +- ...-22-VIRTUAL-SESSION-CROSS-CONTEST-AUDIT.md | 2 +- docs/contest/I18N_AUDIT_R10.md | 4 +- docs/contest/PRD.md | 2 +- docs/contest/README.md | 137 +-- docs/contest/REVIEW_V3.md | 16 +- .../DESIGN_ANALYSIS_2026-06-16.md} | 0 .../EXECUTION_PLAN_R10_2026-06-18.md} | 12 +- .../EXECUTION_PLAN_R6_2026-06-17.md} | 0 .../EXECUTION_PLAN_R7_2026-06-17.md} | 0 .../EXECUTION_PLAN_R8_2026-06-17.md} | 0 .../EXECUTION_PLAN_R9_2026-06-17.md} | 0 .../FINDINGS_RAW_v1-v2_2026-06-17.md} | 2 +- docs/contest/_archive/INDEX.md | 62 ++ .../LOW_REMAINING_R8.6_2026-06-17.md} | 2 +- .../PLAN_v1.0_2026-06-17.md} | 5 + .../REVIEW_v1_2026-06-17.md} | 2 +- .../REVIEW_v2_2026-06-17.md} | 4 +- .../SECURITY_REVIEW_2026-06-17.md} | 2 +- init-db/README.md | 2 +- management/package.json | 3 +- .../src/components/LanguageSwitcher.vue | 2 +- management/src/components/ThemeSwitcher.vue | 6 +- .../components/analytics/AnalyticsHeatmap.vue | 8 +- .../analytics/AnalyticsMetricCard.vue | 4 +- .../analytics/AnalyticsOverviewPanel.vue | 8 +- .../src/components/dashboard/AreaChart.vue | 2 +- .../dashboard/DashboardTimeline.vue | 8 +- .../src/components/dashboard/StatCards.vue | 4 +- management/src/components/layout/NavMain.vue | 4 +- management/src/components/layout/NavUser.vue | 10 +- .../src/components/layout/SiteHeader.vue | 6 +- .../src/components/problem/MarkdownEditor.vue | 20 +- .../components/problem/TestCasesEditor.vue | 2 +- .../problem/components/TestCaseList.vue | 4 +- .../problems/DescriptionMarkdown.vue | 46 +- .../components/problems/FlagInfoDialog.vue | 16 +- .../problems/VersionHistoryTimeline.vue | 2 +- management/src/components/ui/button/index.ts | 2 +- .../range-calendar/RangeCalendarHeadCell.vue | 2 +- .../src/composables/useTypographyDensity.ts | 25 + management/src/main.ts | 7 + management/src/style.css | 168 +--- .../src/views/analytics/AnalyticsView.vue | 2 +- .../components/UserActivityReport.vue | 14 +- management/src/views/auth/LoginView.vue | 42 +- management/src/views/auth/SignupView.vue | 42 +- .../src/views/auth/components/AuthButton.vue | 18 +- .../src/views/auth/components/AuthCard.vue | 8 +- .../src/views/auth/components/AuthDivider.vue | 6 +- .../src/views/auth/components/AuthInput.vue | 8 +- .../views/auth/components/AuthThemeToggle.vue | 16 +- .../src/views/auth/components/LoginForm.vue | 20 +- .../src/views/auth/components/OAuthButton.vue | 4 +- .../src/views/auth/components/SignupForm.vue | 18 +- .../src/views/comments/CommentDetailView.vue | 4 +- management/src/views/comments/columns.ts | 12 +- .../views/contest/components/ContestCard.vue | 2 +- .../contest/components/ContestStatusBadge.vue | 4 +- .../views/contest/components/ContestTimer.vue | 2 +- .../components/FirstSolveNotification.vue | 2 +- .../views/contest/components/RankingTable.vue | 12 +- management/src/views/contests/columns.ts | 12 +- .../components/ContestParticipantsTab.vue | 6 +- .../components/ContestProblemsTab.vue | 10 +- .../components/ContestRankingsTab.vue | 10 +- .../components/ScoringRuleSelector.vue | 12 +- .../views/contests/wizard/StepProblems.vue | 10 +- .../src/views/contests/wizard/StepReview.vue | 6 +- management/src/views/forum/columns.ts | 10 +- .../views/forum/components/CommentsTab.vue | 10 +- .../moderation/ModerationDashboardView.vue | 6 +- .../src/views/moderation/appeals-columns.ts | 14 +- management/src/views/moderation/columns.ts | 20 +- .../src/views/moderation/reports-columns.ts | 16 +- .../problem-lists/ProblemListDetailView.vue | 2 +- management/src/views/problem-lists/columns.ts | 16 +- .../components/BannerSection.vue | 14 +- .../components/BasicInfoSection.vue | 16 +- .../components/ProblemsManager.vue | 34 +- .../components/VisibilitySection.vue | 10 +- .../src/views/problems/ProblemDetailView.vue | 26 +- management/src/views/problems/columns.ts | 24 +- .../problems/components/DescriptionForm.vue | 16 +- .../problems/components/ExamplesEditor.vue | 6 +- .../problems/components/LivePreviewPanel.vue | 10 +- .../components/ProblemAuditDrawer.vue | 12 +- .../components/ProblemBulkActions.vue | 8 +- .../problems/components/TagsSelector.vue | 4 +- .../problems/composables/useProblemColumns.ts | 2 +- .../src/views/problems/tabs/OverviewTab.vue | 2 +- .../views/solutions/SolutionDetailView.vue | 2 +- management/src/views/solutions/columns.ts | 14 +- .../components/DescriptionDisplay.vue | 2 +- .../src/views/users/UserDetailDrawer.vue | 2 +- management/src/views/users/columns.ts | 12 +- scripts/dev/typography-guard.sh | 207 ++++ scripts/verify-typography-tokens.mjs | 229 +++++ shared/design-system/style.css | 246 +++-- shared/theme/__tests__/typography.spec.ts | 153 +++ shared/theme/src/index.ts | 16 + shared/theme/src/typography.css | 275 ++++++ shared/theme/src/typography.ts | 141 +++ 202 files changed, 3865 insertions(+), 1465 deletions(-) create mode 100644 console/src/composables/useTypographyDensity.ts create mode 100644 docs/DOCS-SPEC.md create mode 100644 docs/README.md create mode 100644 docs/SHARED_TYPOGRAPHY_DESIGN.md rename docs/contest/{DESIGN_ANALYSIS.md => _archive/DESIGN_ANALYSIS_2026-06-16.md} (100%) rename docs/contest/{EXECUTION_PLAN_R10.md => _archive/EXECUTION_PLAN_R10_2026-06-18.md} (97%) rename docs/contest/{completed/EXECUTION_PLAN_R6.md => _archive/EXECUTION_PLAN_R6_2026-06-17.md} (100%) rename docs/contest/{completed/EXECUTION_PLAN_R7.md => _archive/EXECUTION_PLAN_R7_2026-06-17.md} (100%) rename docs/contest/{completed/EXECUTION_PLAN_R8.md => _archive/EXECUTION_PLAN_R8_2026-06-17.md} (100%) rename docs/contest/{completed/EXECUTION_PLAN_R9.md => _archive/EXECUTION_PLAN_R9_2026-06-17.md} (100%) rename docs/contest/{FINDINGS_RAW.md => _archive/FINDINGS_RAW_v1-v2_2026-06-17.md} (98%) create mode 100644 docs/contest/_archive/INDEX.md rename docs/contest/{completed/LOW_REMAINING.md => _archive/LOW_REMAINING_R8.6_2026-06-17.md} (96%) rename docs/contest/{PLAN.md => _archive/PLAN_v1.0_2026-06-17.md} (98%) rename docs/contest/{REVIEW.md => _archive/REVIEW_v1_2026-06-17.md} (99%) rename docs/contest/{REVIEW_V2.md => _archive/REVIEW_v2_2026-06-17.md} (99%) rename docs/contest/{SECURITY_REVIEW.md => _archive/SECURITY_REVIEW_2026-06-17.md} (98%) create mode 100644 management/src/composables/useTypographyDensity.ts create mode 100755 scripts/dev/typography-guard.sh create mode 100644 scripts/verify-typography-tokens.mjs create mode 100644 shared/theme/__tests__/typography.spec.ts create mode 100644 shared/theme/src/typography.css create mode 100644 shared/theme/src/typography.ts diff --git a/console/package.json b/console/package.json index fe1a6d51b..97aaf5832 100644 --- a/console/package.json +++ b/console/package.json @@ -20,7 +20,8 @@ "validate:mocks": "node scripts/validate-mock-data.mjs", "validate:mocks:verbose": "node scripts/validate-mock-data.mjs --verbose", "validate:mocks:strict": "node scripts/validate-mock-data.mjs --strict", - "verify:theme-sync": "node ../scripts/verify-theme-sync.mjs" + "verify:theme-sync": "node ../scripts/verify-theme-sync.mjs", + "verify:typography-tokens": "node ../scripts/verify-typography-tokens.mjs" }, "dependencies": { "@internationalized/date": "^3.12.1", diff --git a/console/src/assets/charts.css b/console/src/assets/charts.css index 42660f3b3..21cdc8014 100644 --- a/console/src/assets/charts.css +++ b/console/src/assets/charts.css @@ -233,7 +233,7 @@ display: flex; align-items: center; gap: 0.5rem; - font-size: 0.875rem; + font-size: var(--uc-text-sm); color: var(--vis-text-color); } diff --git a/console/src/assets/markdown.css b/console/src/assets/markdown.css index fbd4a1dd3..57fb94b9b 100644 --- a/console/src/assets/markdown.css +++ b/console/src/assets/markdown.css @@ -1,6 +1,6 @@ -/* Global Code Block Styling for LeetCode Design */ -/* Code Tabs Styles - Container */ + + .lc-code-tabs { border-radius: 0.5rem; overflow: hidden; @@ -9,22 +9,22 @@ background-color: var(--surface-sunken); } -/* Header */ + .lc-tabs-header { display: flex; align-items: center; - background-color: inherit; /* Match container background for transparency */ + background-color: inherit; border-bottom: 1px solid var(--border); padding: 0.5rem 1rem; overflow-x: auto; gap: 1rem; } -/* Tab Buttons */ + .lc-tab-btn { padding: 0; - font-size: 0.875rem; - font-weight: 500; + font-size: var(--uc-text-sm); + font-weight: var(--uc-font-weight-medium) color: var(--muted-foreground); background: none; border: none; @@ -42,19 +42,19 @@ .lc-tab-btn.active { color: var(--foreground); - font-weight: 600; + font-weight: var(--uc-font-weight-semibold) background-color: transparent; border-radius: 0; box-shadow: none; } -/* Body Panel */ + .lc-tabs-body { position: relative; background-color: var(--surface-sunken); } -/* Panel Visibility */ + .lc-code-panel { display: none; } @@ -63,14 +63,14 @@ display: block; } -/* Code Block Override */ + .lc-code-block { position: relative; margin: 0 !important; background-color: transparent; } -/* Copy Button */ + .lc-copy-wrapper { position: absolute; top: 0.5rem; @@ -96,34 +96,34 @@ background-color: var(--accent); } -/* Pre/Code Overrides */ + .lc-code-block pre, .lc-code-body pre { margin: 0 !important; padding: 1rem; font-family: var(--font-mono) !important; - font-size: 0.875em !important; + font-size: var(--uc-text-sm) !important; line-height: var(--leading-code) !important; background-color: transparent !important; overflow-x: auto; } -/* --- Unifying Typography & Layout from SolutionDetail.vue --- */ + .markdown-view .prose { - font-size: 14px; + font-size: var(--uc-text-sm); line-height: 1.6; color: var(--foreground); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - max-width: none; /* Override prose max-width */ + max-width: none; } -/* Headings */ + .markdown-view .prose h1 { - font-size: 1.125rem; - font-weight: 600; + font-size: var(--uc-text-lg); + font-weight: var(--uc-font-weight-semibold) margin-top: 1.25rem; margin-bottom: 0.625rem; color: var(--foreground); @@ -131,8 +131,8 @@ } .markdown-view .prose h2 { - font-size: 1rem; - font-weight: 600; + font-size: var(--uc-text-md); + font-weight: var(--uc-font-weight-semibold) margin-top: 1.125rem; margin-bottom: 0.5rem; color: var(--foreground); @@ -140,8 +140,8 @@ } .markdown-view .prose h3 { - font-size: 0.95rem; - font-weight: 600; + font-size: var(--uc-text-sm); + font-weight: var(--uc-font-weight-semibold) margin-top: 1rem; margin-bottom: 0.5rem; color: var(--foreground); @@ -149,8 +149,8 @@ } .markdown-view .prose h4 { - font-size: 0.875rem; - font-weight: 600; + font-size: var(--uc-text-sm); + font-weight: var(--uc-font-weight-semibold) margin-top: 0.875rem; margin-bottom: 0.375rem; color: var(--foreground); @@ -163,7 +163,7 @@ line-height: 1.6; } -/* Lists */ + .markdown-view .prose ul, .markdown-view .prose ol { padding-left: 1.25rem; @@ -178,32 +178,32 @@ .markdown-view .prose li { margin-bottom: 0.25rem; margin-top: 0; - padding-left: 0; /* Remove prose padding if any */ + padding-left: 0; } -/* Inline Code - LeetCode Pill Style */ + .markdown-view .prose :not(pre) > code { font-family: var(--font-mono); - font-size: 0.85em; + font-size: var(--uc-text-xl); background-color: var(--muted); color: var(--foreground); padding: 0.125rem 0.375rem; border-radius: 0.25rem; white-space: pre-wrap; word-break: break-word; - font-weight: normal; /* Prose makes code bold by default sometimes */ + font-weight: var(--uc-font-weight-regular) } -/* Code Blocks */ -/* Note: lc-code-tabs handles complex blocks, this is for standard ones or overrides */ + + .markdown-view .prose pre { - background-color: var(--muted); /* Fallback or match theme */ + background-color: var(--muted); border-radius: 0.5rem; padding: 1rem; margin: 1rem 0; overflow-x: auto; color: inherit; - font-size: 0.9em; + font-size: var(--uc-text-sm); line-height: var(--leading-code); } @@ -211,39 +211,39 @@ background-color: transparent; padding: 0; border-radius: 0; - font-weight: normal; + font-weight: var(--uc-font-weight-regular) color: inherit; font-family: var(--font-mono); } -/* Blockquote */ + .markdown-view .prose blockquote { border-left: 3px solid var(--border); padding-left: 1rem; color: var(--muted-foreground); margin: 1rem 0; - font-style: normal; /* Prose makes it italic */ + font-style: normal; } -/* Links */ + .markdown-view .prose a { color: hsl(var(--primary)); text-decoration: none; - font-weight: 500; + font-weight: var(--uc-font-weight-medium) } .markdown-view .prose a:hover { text-decoration: underline; } -/* Images */ + .markdown-view .prose img { margin-top: 1rem; margin-bottom: 1rem; border-radius: 0.5rem; } -/* --- High Contrast Solarized Theme Adjustments --- */ + .markdown-view .prose { color: var(--solarized-base02) !important; } @@ -264,10 +264,10 @@ color: var(--solarized-base1) !important; } -/* --- Section Heading Accent Lines --- */ + .markdown-view .prose h2 { - font-size: 1.25rem !important; - font-weight: 700 !important; + font-size: var(--uc-text-xl) !important; + font-weight: var(--uc-font-weight-bold) !important; border-left: 4px solid var(--solarized-blue) !important; padding-left: 0.75rem !important; margin-top: 2.5rem !important; @@ -276,8 +276,8 @@ } .markdown-view .prose h3 { - font-size: 1.1rem !important; - font-weight: 700 !important; + font-size: var(--uc-text-lg) !important; + font-weight: var(--uc-font-weight-bold) !important; border-left: 3px solid var(--solarized-cyan) !important; padding-left: 0.6rem !important; margin-top: 2rem !important; @@ -285,7 +285,7 @@ line-height: 1.4 !important; } -/* --- Standalone Code Block Toolbar & Styling --- */ + .lc-code-block-standalone { margin: 1.5rem 0; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); @@ -298,8 +298,8 @@ } .lc-code-block-header span { - font-size: 0.75rem; - font-weight: 600; + font-size: var(--uc-text-sm); + font-weight: var(--uc-font-weight-semibold) color: var(--silver-600); } diff --git a/console/src/components/LanguageSwitcher.vue b/console/src/components/LanguageSwitcher.vue index 828222f12..fb9a043e8 100644 --- a/console/src/components/LanguageSwitcher.vue +++ b/console/src/components/LanguageSwitcher.vue @@ -32,7 +32,7 @@ const { availableLocales, setLocale, isCurrentLocale } = useLocale(); >
{{ localeConfig.flag }} - {{ + {{ localeConfig.nativeName }}
diff --git a/console/src/components/ThemeSwitcher.vue b/console/src/components/ThemeSwitcher.vue index 6cced6945..5451a580f 100644 --- a/console/src/components/ThemeSwitcher.vue +++ b/console/src/components/ThemeSwitcher.vue @@ -44,7 +44,7 @@ const { t } = useI18n(); >
- {{ + {{ t("common.appearance.light") }}
@@ -65,7 +65,7 @@ const { t } = useI18n(); >
- {{ + {{ t("common.appearance.dark") }}
@@ -86,7 +86,7 @@ const { t } = useI18n(); >
- {{ + {{ t("common.appearance.system") }}
diff --git a/console/src/components/achievement/AchievementBadge.vue b/console/src/components/achievement/AchievementBadge.vue index 7ece4ce85..4648e5a66 100644 --- a/console/src/components/achievement/AchievementBadge.vue +++ b/console/src/components/achievement/AchievementBadge.vue @@ -103,7 +103,7 @@ const categoryColor = computed( v-if="achievement.points > 0" :class=" cn( - 'absolute -right-1 -top-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-primary px-1.5 text-[10px] font-bold text-primary-foreground', + 'absolute -right-1 -top-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-primary px-1.5 text-2xs font-bold text-primary-foreground', size === 'lg' && 'h-6 text-xs', ) " @@ -115,7 +115,7 @@ const categoryColor = computed( { {{ folder.isDefault ? t("bookmark.defaultFolder") : folder.name }}

{{ folder.itemCount }} {{ t("bookmark.items") }}

diff --git a/console/src/components/bookmark/CreateFolderDialog.vue b/console/src/components/bookmark/CreateFolderDialog.vue index 7ebc8dc0a..b388e3925 100644 --- a/console/src/components/bookmark/CreateFolderDialog.vue +++ b/console/src/components/bookmark/CreateFolderDialog.vue @@ -128,7 +128,7 @@ function handleClose() {