Skip to content

feat(board): improve board editor UI with tables, callouts, and drag-drop#32

Merged
tendtoyj merged 23 commits into
mainfrom
tendtoyj/plu-226-board-ui-improvement
Feb 19, 2026
Merged

feat(board): improve board editor UI with tables, callouts, and drag-drop#32
tendtoyj merged 23 commits into
mainfrom
tendtoyj/plu-226-board-ui-improvement

Conversation

@tendtoyj

Copy link
Copy Markdown
Collaborator

Summary

  • Board 에디터에 마크다운 테이블 파싱/렌더링 기능 추가 (overflow 스크롤, 스타일 헤더)
  • Callout 블록 및 Divider 지원 추가, Slash 커맨드 메뉴 개선
  • Draggable block 플러그인을 로컬 모듈로 포크하여 드래그 앤 드롭 안정화
  • Board 탭 툴바 UI 개선 (add-tab 버튼 고정, 패딩 조정, 우클릭 메뉴 placeholder)
  • Board 에디터 테마 스타일링 개선 (텍스트 색상, 여백, placeholder 정렬)
  • Board title 블록 추가 및 탭 상태 동기화 안정화
  • 관련 테스트 추가 (board title, draggable block, editor transformers, markdown table, slash menu)

Test plan

  • Board 에디터에서 마크다운 테이블이 올바르게 렌더링되는지 확인
  • Callout 블록 삽입 및 스타일 확인
  • Draggable block 드래그 앤 드롭이 정상 동작하는지 확인
  • Board 탭 추가/전환 시 UI 깨짐 없는지 확인
  • Slash 커맨드 메뉴에서 새 블록 타입 접근 가능한지 확인
  • npm test 통과 확인

🤖 Generated with Claude Code

tendtoyj and others added 23 commits February 18, 2026 22:55
Reduce toolbar padding (pl-6 → pl-4 pr-2) and editor content padding
(px-8 → px-6) for tighter board layout alignment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Override --tw-prose-body with the project's --foreground color so body
text appears darker without affecting headings, links, or code styles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace pageY with clientY and event.x/y with clientX/clientY to unify
the coordinate system with getBoundingClientRect (viewport-relative).
Extract shouldInsertAfterBlock for midpoint-based insertion and add
resolveEventTargetElement to handle non-HTMLElement drag targets.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The target line element lacked an explicit top:0, causing CSS to place
it at its static position (after ContentEditable) instead of the anchor
origin. This offset grew with content height, pushing the line 4-5
lines below with little content and completely off-screen with many
blocks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add explicit mt-0 to paragraph to prevent prose plugin from injecting
  inconsistent top margins (0px after headings vs 20px elsewhere)
- Increase paragraph bottom margin from 8px to 12px (mb-2 → mb-3)
- Change list left margin from 16px to 0px (ml-4 → ml-0)
- Add explicit list left padding of 20px (pl-5) to override prose default 26px

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove max-width constraint and center margin from editor container,
reduce top padding from 64px to 20px, bottom padding from 32px to 24px,
apply 22px left padding for optical alignment, reduce date margin-bottom
from 16px to 12px, and fix placeholder left offset to match content area.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@tendtoyj tendtoyj merged commit 29ae4a7 into main Feb 19, 2026
1 check passed
@tendtoyj tendtoyj deleted the tendtoyj/plu-226-board-ui-improvement branch February 19, 2026 10:36

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2da6ff52dc

ℹ️ 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".

Comment on lines 135 to 139
saveTimeoutRef.current = setTimeout(async () => {
isSavingRef.current = true;
const saveSequence = ++saveSequenceRef.current;
try {
await updateBoard(activeBoard.id, {
const updated = await updateBoard(activeBoard.id, {
settings: {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Serialize board settings writes before sending PATCH

saveTabs schedules updateBoard calls without any in-flight guard, so fast tab/content edits can issue overlapping PATCH requests; on slow or reordered networks, an older request can arrive last and overwrite newer state. This is especially risky because backend BoardsRepository.update_board replaces the entire settings payload (backend/pluto_duck_backend/app/services/boards/repository.py, settings = ?), so saveSequence only protecting onBoardUpdate does not prevent persisted data rollback.

Useful? React with 👍 / 👎.

Comment on lines +18 to +20
<Script
src="https://mcp.figma.com/mcp/html-to-design/capture.js"
strategy="afterInteractive"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove temporary third-party script from root layout

Loading https://mcp.figma.com/mcp/html-to-design/capture.js in RootLayout executes remote third-party code for every page load in all environments, which introduces unnecessary security/privacy risk and an external runtime dependency (and can fail under strict CSP or restricted egress). Since this is marked temporary, it should be removed or explicitly gated to local/dev-only tooling.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant