Skip to content

Develop#509

Merged
fccview merged 50 commits into
mainfrom
develop
May 20, 2026
Merged

Develop#509
fccview merged 50 commits into
mainfrom
develop

Conversation

@fccview
Copy link
Copy Markdown
Owner

@fccview fccview commented May 12, 2026

Changelog

features

bufixes

direct dependency upgrades

  • @excalidraw/excalidraw: 0.18.0 -> 0.18.1 (XSS via Mermaid/KaTeX)
  • mermaid: 10.9.4 -> 10.9.6 (Gantt chart infinite loop DoS)
  • next: 16.2.3 -> 16.2.6 (2x high-severity: DoS + middleware bypass)
  • next-intl: 4.9.1 -> 4.9.2 (prototype pollution)
  • uuid: 11.1.0 -> 11.1.1 (buffer bounds check)
  • ws: 8.19.0 -> 8.20.1 (uninitialized memory disclosure)

resolutions added/updated

  • **/mermaid: 10.9.4 -> 10.9.6 (force patched version for transitive deps)
  • brace-expansion: >=5.0.6 (DoS via large numeric range, pulled in by multiple deps)
  • postcss: >=8.5.10 (XSS via unescaped </style>, pulled in by next)

fccview and others added 30 commits April 28, 2026 18:40
…buttons

Adds editor.toggleOrderedList, editor.indentListItem, editor.outdentListItem
and editor.createOrderedList to all 13 translation files.
Adds three buttons after the existing bulletList button:
- orderedList (LeftToRightListNumberIcon, Ctrl+Shift+7, dual-mode aware)
- indent/sinkListItem (TextIndentMoreIcon, disabled when not in a list)
- outdent/liftListItem (TextIndentLessIcon, disabled when not in a list)
Inserts an orderedList item directly after bulletList in the slash command
list, using LeftToRightListNumberIcon and the existing toggleOrderedList command.
- Indent: was disabled for first list item (can().sinkListItem returns false
  without a previous sibling). Changed to isActive('listItem') so the button
  stays visible; clicking on an unsinkable item is a no-op but less confusing
  than a grayed-out button.
- Outdent: was enabled on top-level list items, causing liftListItem to remove
  the list entirely on click. Added a ProseMirror depth check so outdent is
  only enabled when the item is nested (grandgrandparent node is a listItem).
- Ordered list button: bypass handleButtonClick wrapper for rich-text mode.
  The wrapper saved/restored cursor positions (from/to) around the command,
  but toggleOrderedList changes document structure so the saved positions
  become stale, causing the next click to land outside the list and create
  a new one instead of toggling. Now calls chain().focus() directly.
- Indent disabled: changed from isActive('listItem') (checks current block
  type = paragraph, always false) to isActive('bulletList')||isActive('orderedList').
- Outdent disabled: same reliable list-active check, depth condition unchanged.
TipTap's built-in ListItem Tab handler wasn't reliably firing after the
custom extension returned false. Now explicitly:
- Tab in ordered/bullet list: sinkListItem (indent), event always consumed
  to prevent browser focus-jump even if the item has no previous sibling.
- Shift-Tab in list: liftListItem only when nested (depth check); at level 1
  the event is consumed but the list is preserved.
- Import useEditorState (TipTap v3) to subscribe to selection changes;
  the toolbar now re-renders when the cursor moves in/out of a list, fixing
  the stale disabled state on mouse-click and arrow-key navigation.
- Selector computes isInList, isNested (ancestor traversal, no fixed depth
  offset), isInOrderedList, and currentItemIsEmpty — all driven by the
  live editor state.
- Ordered list toggle: when already in an ordered list with an empty item,
  use liftListItem instead of toggleOrderedList, which avoids the "cursor
  jumps / extra 1. inserted" bug that occurs on empty paragraphs.
- Outdent disabled: replaced editor.state.selection.$anchor.node(depth-3)
  fixed-offset heuristic with a proper ancestor walk through listItem nodes,
  which works correctly regardless of document nesting depth.
Same root cause as the ordered list fix: toggleBulletList on an empty list
item caused cursor jumps or extra bullet symbols. Now uses liftListItem when
the current item is empty, consistent with the ordered list behaviour.
Also adds isInBulletList to the useEditorState selector so the button's
active variant is driven by reactive state rather than a stale isActive call.
Adds an optional `status` argument to `handleAddItem` in `useKanban.ts`
so callers can create items pre-assigned to a specific column status.
The value is forwarded via FormData; the server action already handles it.
- Adds a small "+" button in each KanbanColumn header (hidden for
  autoComplete columns and when the user lacks canEdit permission)
- Clicking the button reveals an inline text input inside the column;
  Enter saves, Esc or blur-without-text cancels
- New item is created with the column status pre-set via the extended
  handleAddItem hook
- Adds i18n keys `kanban.addItemToColumn` and `kanban.addItemPlaceholder`
  to all 13 locale files (en, de, fr, es, it, nl, pl, ru, ko, tr, zh,
  pirate, klingon)
The SortableStatusItem row contained too many fixed-width elements
(color picker, toggle, whitespace-nowrap label, delete button) causing
the flex-1 name input to collapse to zero width on any viewport narrower
than ~430px, including the default modal width on desktop.

Restructures each status row into two lines:
- Line 1: drag handle + name input (flex-1) + color picker + delete button
- Line 2: auto-complete toggle + label (indented to align with input)

Also adds shrink-0 to fixed-width elements and min-w-0 to the input
wrapper to prevent future flex overflow issues.
"Automatische Vervollständigung" reads as UI autocomplete (like text
field suggestions). The feature marks a Kanban item as done when moved
to this column, so "Automatisch abschließen" (auto-close/finish) is
the correct term.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…toggle

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…setting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… files

Translations for languages other than English and German are machine-generated.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(kanban): add per-column add button with inline input
fix(kanban): fix status manager layout on narrow viewports
fix(i18n): improve German translation for autoComplete toggle
Turndown serialises bullet items as '-   ' (dash + 3 spaces) and ordered
items as 'N.  ' (number + dot + 2 spaces), placing text at column 4.
The insertBulletList and insertOrderedList helpers used single-space
variants, causing visual inconsistency after a RT→MD roundtrip.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pressing Enter on a numbered list line ('1. text') now inserts a new
line with the incremented number and same spacing ('2.  '). Pressing
Enter on an empty numbered item ('1.  ') removes the marker, consistent
with bullet list behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds two text-based helpers in markdown-editor-utils that operate on all
selected lines (or the cursor line when nothing is selected).
indentLines prepends 4 spaces; outdentLines removes the first 4 spaces
if present, otherwise leaves the line unchanged — consistent with the
library's Shift+Tab outdent behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Indent and outdent buttons now route to the text-based indentLines/
outdentLines helpers in MD mode instead of calling TipTap commands that
have no effect there. The disabled condition is also corrected: buttons
are always enabled in MD mode (outdent on a line with <4 spaces is a
no-op, consistent with Shift+Tab).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New key for the list menu dropdown trigger button label, added to
en, de, es, fr, it, ko, nl, pl, ru, tr, zh, klingon, and pirate.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
reniko and others added 18 commits May 12, 2026 18:39
Bullet list, ordered list, indent and outdent are now grouped under a
single dropdown in the toolbar, following the same pattern as
CodeBlocksDropdown. The dropdown handles both rich-text (TipTap
commands) and MD mode (text-based helpers), and shows an active state
when the cursor is inside a list in rich-text mode.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
handleBulletListEnter and handleOrderedListEnter matched only at the
line start, so pressing Enter on a nested/indented item (e.g.
'    -   sub') inserted a plain newline instead of continuing the list.
Regex now captures leading whitespace and includes it in the new line
prefix so all indent levels work correctly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… mode

Replaced isInList/isNested with reactive editor.can().sinkListItem() and
editor.can().liftListItem() calls so the dropdown items are disabled
precisely when TipTap cannot execute the command — e.g. indent is now
correctly disabled on the first item of a list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
remark does not reliably parse nested ordered lists starting at numbers
other than 1 (a CommonMark edge case where the 'cannot interrupt
paragraph' rule is over-applied). To ensure the MD→RT roundtrip is
always correct, indentLines now renumbers ordered list items in the
selection starting from 1 when they are indented. Each contiguous group
of ordered items gets its own counter that resets at blank lines and
non-ordered lines.

Also fixes the RT indent disabled state: uses editor.can().sinkListItem
and editor.can().liftListItem so the dropdown items reflect the exact
command availability, e.g. indent is disabled on the first item of a
list level.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…r after indent

Two fixes in markdown-editor-utils:

1. insertBulletList / insertOrderedList now add list markers to empty
   lines when toggling on, so clicking the list button on a blank line
   produces a list item. When toggling off (allMatch), empty lines are
   left unchanged as before.

2. indentLines / outdentLines collapse the selection to a cursor after
   the operation. processLineSelection selected the full modified block
   which caused the next keystroke to delete all indented content.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
processLineSelection treated empty lines as 'matching' the pattern so
an all-empty selection produced allMatch=true, sending the callback into
toggle-off mode instead of toggle-on. Added a hasNonEmpty guard so
allMatch is only true when at least one non-empty line actually matches.

Result: clicking the ordered list button (or bullet list) on a blank
line now inserts a list marker, consistent with non-empty lines.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add liftOutOfList() loop in ListMenuDropdown that repeatedly calls
liftListItem until the cursor is no longer inside any list, instead of
lifting only one level. Also enables cross-type switching (bullet ↔
ordered) without first exiting the list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e switching

Rewrite insertBulletList and insertOrderedList to use /^\s*-\s/ and
/^\s*\d+\.\s/ patterns so indented list items are recognized. When all
selected lines are already a list of the other type, convert markers
instead of stacking a new marker on top.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The paragraphInLi Turndown rule only stripped paragraph block-wrapping
when P was the sole child of LI. Lifting that restriction ensures P
elements inside LI are inlined even when a nested list is a sibling,
preventing a blank line from appearing before the nested list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add getListDepth() to count listItem ancestors and switchListType() that
lifts the item all the way out, toggles to the new list type, then sinks
back to the original depth. This fixes the bug where switching bullet↔
ordered on a nested item always moved it to level 1.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Detect the innermost list type with a ProseMirror ancestor walk instead
of listState flags, which are both true for nested lists. When the
clicked type differs from the innermost list, call toggleBulletList/
toggleOrderedList directly — their internal toggleList implementation
runs setNodeMarkup on the immediate parent list and preserves nesting
depth. Same-type clicks still call liftOutOfList for a full exit.

This restores the ability to switch a level-2 bullet to a level-2
ordered list (and vice versa) without flattening to level 1.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…uttons

Feature/ordered list and indent buttons
@fccview fccview merged commit 3a7c22f into main May 20, 2026
4 checks passed
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.

3 participants