diff --git a/apps/web/package.json b/apps/web/package.json index 1921126..e7dbfec 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -39,6 +39,7 @@ "superjson": "^2.2.2" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.1", "@testing-library/user-event": "^14.6.1", diff --git a/apps/web/src/app/(app)/dashboard/boards/[boardId]/board-client.tsx b/apps/web/src/app/(app)/dashboard/boards/[boardId]/board-client.tsx index 3bbbc04..71dc4c5 100644 --- a/apps/web/src/app/(app)/dashboard/boards/[boardId]/board-client.tsx +++ b/apps/web/src/app/(app)/dashboard/boards/[boardId]/board-client.tsx @@ -934,9 +934,9 @@ export default function BoardClient({ boardId }: { boardId: string }) { return (
-
-
-
+
+
+
{isEditingBoardTitle ? ( { setBoardTitleDraft(board.title); setIsEditingBoardTitle(true); @@ -975,15 +975,15 @@ export default function BoardClient({ boardId }: { boardId: string }) { )}
- {board.description ?
{board.description}
: null} + {board.description ?
{board.description}
: null}
-
+
- @@ -1073,9 +1073,9 @@ export default function BoardClient({ boardId }: { boardId: string }) { - @@ -1130,7 +1130,7 @@ export default function BoardClient({ boardId }: { boardId: string }) { - + diff --git a/apps/web/src/app/(app)/dashboard/dashboard-client.tsx b/apps/web/src/app/(app)/dashboard/dashboard-client.tsx index 92f06be..28a303a 100644 --- a/apps/web/src/app/(app)/dashboard/dashboard-client.tsx +++ b/apps/web/src/app/(app)/dashboard/dashboard-client.tsx @@ -190,20 +190,20 @@ export default function DashboardClient() { const pageWorkspaces = workspaces.slice(wsStart, wsStart + WORKSPACES_PER_PAGE); return ( -
-
-
-

Dashboard

-

+

+
+
+

Dashboard

+

{archivedView ? t('dashboard.archived_workspaces') : t('dashboard.all_workspaces')}

-
+
{!archivedView && ( - + @@ -236,22 +236,23 @@ export default function DashboardClient() { {pageWorkspaces.map((ws) => { const page = boardsPagesByWorkspace[ws.id] ?? 1; return ( -
-
-
-
{ws.title}
+
+
+
+
{ws.title}
{ws.description ?
{ws.description}
: null}
{archivedView ? ( ) : ( - )} diff --git a/apps/web/src/app/(app)/dashboard/members/members-client.tsx b/apps/web/src/app/(app)/dashboard/members/members-client.tsx index c96a809..14a2d6c 100644 --- a/apps/web/src/app/(app)/dashboard/members/members-client.tsx +++ b/apps/web/src/app/(app)/dashboard/members/members-client.tsx @@ -60,15 +60,15 @@ function MemberRow({ const cannotRemove = isLastMember || isLastAdmin; return ( -
+
{label}
{secondary ?
{secondary}
: null}
-
+
; + } + return ; + }, } as const; }, [usersById]); @@ -329,37 +395,13 @@ export default function TicketDialogV2({ open, onOpenChange, ticketId, boardId } const [descMentionIndex, setDescMentionIndex] = React.useState(0); const renderCommentContent = React.useCallback((content: string) => { - // Parse @username mentions and render them as blue chips (not clickable) - const tokens = parseMentionTokens(content); - if (tokens.length === 0) { - // No mentions, just render as text (or with basic markdown if needed) - return
{content}
; - } - - const parts: React.ReactNode[] = []; - let cursor = 0; - for (let i = 0; i < tokens.length; i++) { - const t = tokens[i]!; - if (t.start > cursor) { - parts.push({content.slice(cursor, t.start)}); - } - const mentionText = content.slice(t.start, t.end); // "@username" - parts.push( - - {mentionText} - , - ); - cursor = t.end; - } - if (cursor < content.length) { - parts.push({content.slice(cursor)}); - } - return
{parts}
; - }, []); + // Render comments as markdown with mention support + return ( + + {linkifyMentionsMarkdown(content)} + + ); + }, [markdownComponents]); const descMentionCandidates = React.useMemo(() => { if (!descMention) return []; @@ -692,9 +734,9 @@ export default function TicketDialogV2({ open, onOpenChange, ticketId, boardId } return ( <> - + {/* Header */} -
+
@@ -736,9 +778,9 @@ export default function TicketDialogV2({ open, onOpenChange, ticketId, boardId }
{/* Body: 2 colonnes */} -
+
{/* Colonne principale */} -
+
{/* Labels (si présents) */} {ticketLabelIds.length > 0 && (
@@ -1053,16 +1095,17 @@ export default function TicketDialogV2({ open, onOpenChange, ticketId, boardId } {/* Comments / Activity */}
-
- +
+

{ticketFeedView === 'history' ? t('ticket.activity_tab') : t('ticket.comments_tab')}

-
+
@@ -1070,6 +1113,7 @@ export default function TicketDialogV2({ open, onOpenChange, ticketId, boardId } size="sm" variant={ticketFeedView === 'history' ? 'trello' : 'ghost'} onClick={() => setTicketFeedView('history')} + className="text-xs sm:text-sm px-2 sm:px-3" > {t('ticket.history_tab')} @@ -1077,8 +1121,8 @@ export default function TicketDialogV2({ open, onOpenChange, ticketId, boardId }
{ticketFeedView === 'comments' && canComment && ( -
- +
+