Feat/design - #26
Conversation
Phase 0: add design-token violation guard (scripts/design/tokens-guard.mjs) with renderer-wide baselines that only ratchet down. Phase 1: codemod shadcn long-form utility classes to Luie short-form (scripts/design/unify-token-vocab.mjs). 226 replacements across 50 files. Every mapping resolves to the same CSS variable via the @theme bridge, so zero visual change. shadcnVocab count: 226 -> 0. text-muted-foreground -> text-muted text-foreground -> text-fg bg-background -> bg-app *-accent-foreground -> *-accent-fg *-destructive -> *-danger (excl. destructive-foreground) Excluded: components/ui/* (shadcn primitives) and surface/card/popover (@theme vs tailwind.config double-definition — handled in Phase 2). Verified: tsc --noEmit passes; guard green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Alias all --namu-* wiki tokens to core tokens (accent-bg / text-accent / border-default / bg-sidebar / bg-surface-hover / text-on-accent), defined once in :root so they cascade per [data-theme]. Delete the per-theme (dark/sepia) namu overrides. Removes the second accent blue (#00a2e8 / #38bdf8 / #0ea5e9) so the wiki shares Luie's single accent. rawHex 352 -> 332. Zero component changes (var names preserved). Guard ratcheted. Note: investigation found the suspected surface "double-definition conflict" does not exist — this is Tailwind v4 with no @config, so tailwind.config.js is dead and @theme is the sole source. Real bug found instead: config-only classes (rounded-control x28, shadow-panel, z-dropdown ...) are dead/no-op. Tracked as Phase 2b in docs/design-redesign-plan.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… tokens Tailwind v4 here has no @config, so tailwind.config.js was never loaded — its radius/shadow/spacing classes emitted no CSS and its darkMode setting was inert. Fix: - Migrate the *used* tokens into @theme (global.tokens.css): --radius-control/-panel, --shadow-panel, --spacing-control-x/-y/-panel-pad/-panel-gap. Revives rounded-control (x28), shadow-panel, p-panel-pad, etc. - Named z-index tokens have no v4 theme namespace -> convert usages: z-overlay->z-20, z-dropdown->z-50, z-modal->z-[9000] (6 files). - Restore darkMode intent via @custom-variant in global.css so `dark:` utilities (x72) follow [data-theme="dark"] instead of OS preference (was a latent bug). - Delete tailwind.config.js. Verified: pnpm build exit 0; tsc --noEmit clean; built CSS emits rounded-control / shadow-panel / spacing tokens and compiles `dark:` to [data-theme=dark]; guard green. Visible deltas (intended restoration): rounded-control elements gain their 10px radius; dark: utilities now track the in-app theme. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the warm/cool color-temperature and paper-texture options that multiplied visual permutations and diluted product identity. Scope corrected during investigation: - uiMode is the 4-layout selector (default/docs/editor/scrivener/focus), not a cosmetic axis — kept. - themeContrast soft|high is an accessibility (high-contrast) feature — kept. Removed from the product: - AppearanceTab: atmosphere (temp) + texture sections. - Apply layer: data-temp / data-texture attributes in setup.ts, useThemeAttributes.ts, App.tsx. - Dead CSS: [data-temp] (6 blocks) and [data-texture] (2 blocks). Kept inert (zod schema is z.strictObject, so removing the keys would fail validation on existing users' saved settings): the themeTemp/themeTexture fields in types, schema, defaults and store. Full field deletion needs a settings migration — tracked as follow-up. Verified: pnpm build exit 0; tsc clean; built CSS drops data-temp/ data-texture, keeps data-contrast; guard ratcheted (rawHex 332->313, rawColor 201->197, roundedBig 175->170). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Follow-up cleanup to D2: delete the now-inert temperature/texture settings fields everywhere, with a backward-compat shim. - schema: wrap editorSettingsSchema in z.preprocess that strips the legacy themeTemp/themeTexture keys before the strictObject runs, so existing users' stored settings keep parsing (the renderer safeParses loaded settings and falls back to defaults on failure — without the shim, the removed keys would reset ALL settings). Strict validation otherwise kept. - remove fields/types/defaults from shared types, index re-export, constants, main settingsDefaults, editorStore (state + normalizer), and uiModeIntegrity snapshot. - i18n: drop appearance.texture / appearance.atmosphere from ko/en/ja. Verified: tsx runtime test (legacy parses, keys stripped, kept fields preserved, unknown keys still rejected); tsc clean; pnpm build exit 0; guard green; no new i18n parity diffs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Establish the role->background convention (inspector = bg-panel) and apply it to the inspector trio as a reviewable pilot. InspectorPanel and GraphNodeInspector already own bg-panel at their roots. CanvasNodeInspector had a transparent root, so it inherited bg-panel from ContextPanel but bg-surface from the binder sidebar's canvas tab — the same inspector looked different per host. Give its root branches their own bg-panel so it presents consistently everywhere. Methodology note (see plan): raw per-role bg grep counts overstate the inconsistency because they include legitimate nested card surfaces. The fix touches root containers only, not inner cards — and structural bg changes need visual review, so this is scoped as a small pilot before expanding to sidebar/binder/panel. Verified: tsc clean; pnpm build exit 0; guard green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ebar The structured-mode left navigation shells used different role colors: ScrivenerLayout and EditorLayout sidebar wrappers and the BinderSidebar shell were bg-panel, while MainLayout and ScrivenerSidebar were already bg-sidebar. Align the three outliers to bg-sidebar (root containers only; inner lists/cards untouched). Held back for visual review: GoogleDocsLayout / DocsSidebar keep their intentional docs-mode white (bg-app); BinderSidebar's shadow-xl (SaaS-ish shadow) noted separately. Verified: tsc clean; pnpm build exit 0; guard green. Visible change: structured-mode left column shifts from panel to sidebar tone. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
In dark theme --bg-sidebar was #09090b, identical to --bg-app, so the left binder/sidebar had no visual separation from the editor canvas (only a 1px border). Confirmed by running the app. Lift dark --bg-sidebar to #121214 so the binder/sidebar reads as structure across all layouts (Main/Scrivener/Editor). Light/sepia already had separation; unchanged. Verified: pnpm build exit 0; guard green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bring marketing-scale corner radii and shadows down to a writer-tool tone: - rounded-3xl -> rounded-xl (1) - rounded-2xl -> rounded-lg (13) - shadow-2xl -> shadow-xl (9) Left alone: rounded-full (circular avatars/dots/toggles), rounded-xl/lg, and components/ui shadcn primitives. Verified: pnpm build exit 0; guard green (roundedBig 170->157). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s tokens, accent 5→1, graph flatten Mechanical, value-preserving design-system cleanup from design-audit-2026-06: - B4: unify left-nav surfaces (DocsSidebar/BinderSidebarTabs/FocusHoverSidebar) to bg-sidebar; ScrivenerSidebar was already the reference. - B1-shadow: 17 overlay shadow-xl (modals/popovers/dropdowns/drawers/tooltips) → shadow-panel token (tokenizes + downtunes elevation). - B1-zindex: new z-index layer (z-dropdown/banner/toast/modal via @Utility, sourced from --z-index-* vars) replaces ad-hoc z-[9999]/z-[9000]/z-[10000]. - B1-radius: rounded-md→rounded-control, rounded-lg/xl→rounded-panel across renderer (273 occurrences); 1 directional rounded-t-xl left as-is. - B3 (safe subset): merge value-identical aliases bg-canvas/bg-bg-primary into bg-app (identical in all themes) + drop their dead @theme aliases. Genuine elevation surfaces (surface/panel/element) preserved. - B6: converge accent to single blue brand; remove violet/green/amber/rose/slate swatches, AppearanceTab picker, and orphaned i18n keys. themeAccent plumbing kept (stored non-blue degrades gracefully to base blue). - B7: flatten remaining graph decoration (node focus scale, legend neon glow, hovercard tag scale). Verified: pnpm typecheck + pnpm build pass; z-* utilities confirmed in built CSS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…n prefix No visual change. Lifts the CharacterWikiAttrs coupling and hardcoded character.* i18n namespace so event/faction can reuse the same TOC + sections + add-section block. Co-Authored-By: Claude <noreply@anthropic.com>
…mes wrapper Moves PropertyRow / MarkdownDocumentEditor / decomposeBody out of CharacterDocumentView into shared/NotionDocumentView so event/faction can reuse the same Notion-style surface. No visual change for characters. Co-Authored-By: Claude <noreply@anthropic.com>
Event/faction document mode now uses the shared NotionDocumentView with property rows (classification/description/custom fields) and a markdown body synced 1:1 with wiki sections — same model as characters. BREAKING-ish: the legacy attributes.document HTML field is no longer read or written; it becomes inert. No migration is provided (accepted per spec); existing document HTML content on events/factions will not surface. Co-Authored-By: Claude <noreply@anthropic.com>
Drops the last --namu-border/table-bg/table-label/hover-bg references in Infobox in favor of border-border / bg-surface-hover / text-muted. Phase 2a already aliased these to the same values, so this is a no-op visually and removes the dead alias dependency. Header tone intentionally kept. Co-Authored-By: Claude <noreply@anthropic.com>
Unused after event/faction migrated to the shared NotionDocumentView. Co-Authored-By: Claude <noreply@anthropic.com>
크롬(sideBar/ToolBar/footer) 색은 통일됐으나 border가 같은 색 영역을 다시 조각내 "레고 이음새"로 읽히던 문제 + 토글 행/툴바 이중 띠 + 순수 검정 에디터의 차가운 색감을 정리. - MainLayout: 사이드바 border-r 제거, 리사이즈 핸들 hover 시만 표시, 별도 h-12 토글 행 삭제 → 패널 토글을 에디터 코너 고스트 버튼으로 통일. 툴바가 사이드바와 이음새 없는 최상단 단일 크롬 바가 됨. - EditorToolbar border-b / StatusFooter border-t 제거 → 어두운 에디터 우물은 색 단차로만 정의(이중 경계 제거). - 다크 토큰 완화: bg-app #09090b→#0d0d0f, editor-bg 정합, bg-sidebar #121214→#161619(panel #18181b 아래 유지), text-primary #fff→#f4f4f5. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 709 files, which is 609 over the limit of 100. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Run ID: ⛔ Files ignored due to path filters (13)
📒 Files selected for processing (750)
You can disable this status message by setting the ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| UnusedCode | 2 medium |
| BestPractice | 17 medium |
| Security | 39 critical |
🟢 Metrics 1584 complexity · 52 duplication
Metric Results Complexity 1584 Duplication 52
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dd65a57908
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const [initialBody] = useState(() => | ||
| sections | ||
| .map((s) => `# ${s.label}\n\n${getSectionContent(s.id)}`.trim()) | ||
| .join("\n\n"), |
There was a problem hiding this comment.
문서 뷰가 열린 상태에서 다른 캐릭터/이벤트/팩션을 선택하면 이 state는 최초 마운트 때의 sections만 유지합니다. 부모들은 NotionDocumentView를 entity id로 key하지 않으므로 TipTap에는 이전 엔티티 본문이 남고, 다음 debounce/언마운트 저장이 새 엔티티의 setter로 실행되어 위키 섹션을 덮어쓸 수 있습니다. entity id/key를 전달해 remount하거나 sections/content 변경 시 editor content를 갱신해야 합니다.
Useful? React with 👍 / 👎.
| if (!graphData?.nodes.length) { | ||
| return { sourceNodes: MOCK_GRAPH_NODES, sourceEdges: MOCK_GRAPH_EDGES }; |
| export const getProjectLayoutPersistenceMode = ( | ||
| uiMode: EditorUiMode, | ||
| mainViewType: MainView["type"], | ||
| ): ProjectLayoutPersistenceMode => | ||
| mainViewType === "canvas" ? "canvas" : uiMode; |
There was a problem hiding this comment.
캔버스를 열면 EditorRoot가 이 함수 결과를 useProjectLayoutPersistence에 넘기는데, hook 내부 isSupportedMode는 default/docs/editor/scrivener만 허용합니다. 따라서 mainViewType이 canvas인 동안 restore/persist effect가 전부 return되어 이번 변경에서 추가한 canvas.activity/canvas.binder 비율과 열림 상태가 프로젝트별로 저장되지 않습니다. canvas를 switch 처리하거나 기존 uiMode로 유지해야 합니다.
Useful? React with 👍 / 👎.
| panelRef={sidebarPanelRef} | ||
| collapsible | ||
| collapsedSize={0} | ||
| defaultSize={isSidebarOpen ? sidebarDefaultSize : 0} |
There was a problem hiding this comment.
enableAnimations=false 상태에서 사이드바를 닫으면 useResizablePanelPresence는 shouldRender만 false로 바꾸고 panel.collapse()를 호출하지 않습니다. 이 변경으로 Panel은 항상 마운트되어 있고 defaultSize는 이미 등록된 패널 크기를 제어하지 않으므로, 콘텐츠만 사라진 빈 사이드바 폭이 남습니다. 비애니메이션 경로에서도 collapse/resize(0)를 호출하거나 닫힌 패널을 다시 언마운트해야 합니다.
Useful? React with 👍 / 👎.
| "jszip": "3.10.1", | ||
| "sanitize-filename": "1.6.4", | ||
| "sqlite-vec": "0.1.9", | ||
| "tiptap-markdown": "^0.9.0", |
There was a problem hiding this comment.
- Replace rounded-[18px/24px/28px] with rounded-panel / rounded-full / rounded-3xl - Remove hardcoded inset shadows and rgba shadows; use shadow-panel / shadow-sm - Replace hardcoded neutral-* / emerald-* / white/5 colors with semantic tokens - Unify glassmorphism: bg-panel/surface with backdrop-blur + border-border/30 - Replace transition-all with explicit transition-[colors,transform,box-shadow] Relates to ORIGINAL_REQUEST glassmorphism + liquid UI requirements
- Add role=tablist/tab + aria-selected to chat/review tabs - Add aria-label to icon-only buttons (plus, minimize, dock, view toggle) - Add aria-label to PromptComposer textarea - Add aria-haspopup/aria-expanded/aria-controls to RuntimeStatusDot popover - Add role=alert to review panel error messages - Add aria-hidden to decorative MessageList icons - Add role=separator + tabIndex to floating resize handles - Add resizeHandle i18n key
…id accent to liquid glass (bg-panel/80, border-border/30, backdrop-blur-xl, shadow-panel)\n- Add aria-label/aria-hidden to FAB button and icon; switch div -> button\n- Reset isMinimized=false when docking or switching to floating view\n- Use i18n title for FAB tooltip
- Remove 6 review queue panels from AnalysisSection review tab - Remove MemoryEvalReportPanel from review tab rendering - Keep NarrativeSummaryStatusPanel and SummaryDrawer via analysis store state - Connect PromptComposer summary toggle to analysis store - Show safety chrome for memory-intent questions with effective safety labels - Update analysisViewMode DOM tests for summary-only review tab - Update analysisMessageSafety DOM tests to match current safety label behavior - Verify typecheck and analysis DOM tests
Summary
Verification
pnpm -s typecheckpnpm -s lint-allpnpm -s qa:coreState Ownership Review
Hook / Effect Review
Persist / Rehydrate Review
Observability Review
domain/event/scopevalues should operators expect?IPC / Electron Boundary Review
argsSchema?AI Review Gate
useXStore()subscriptions were introduced.References