feat(web): add workspace management UI (M2 #12)

- Create workspace listing page at /settings/workspaces
  - List all user workspaces with role badges
  - Create new workspace functionality
  - Display member count per workspace

- Create workspace detail page at /settings/workspaces/[id]
  - Workspace settings (name, ID, created date)
  - Member management with role editing
  - Invite member functionality
  - Delete workspace (owner only)

- Add workspace components:
  - WorkspaceCard: Display workspace info with role badge
  - WorkspaceSettings: Edit workspace settings and delete
  - MemberList: Display and manage workspace members
  - InviteMember: Send invitations with role selection

- Add WorkspaceMemberWithUser type to shared package
- Follow existing app patterns for styling and structure
- Use mock data (ready for API integration)
This commit is contained in:
Jason Woltje
2026-01-29 16:59:26 -06:00
parent 287a0e2556
commit 5291fece26
43 changed files with 4152 additions and 99 deletions

View File

@@ -0,0 +1,39 @@
"use client";
import React from "react";
import type { KnowledgeEntryWithTags } from "@mosaic/shared";
interface EntryViewerProps {
entry: KnowledgeEntryWithTags;
}
/**
* EntryViewer - Displays rendered markdown content
*/
export function EntryViewer({ entry }: EntryViewerProps): JSX.Element {
return (
<div className="entry-viewer">
<div className="entry-content">
{entry.contentHtml ? (
<div
className="prose prose-sm max-w-none dark:prose-invert"
dangerouslySetInnerHTML={{ __html: entry.contentHtml }}
/>
) : (
<div className="whitespace-pre-wrap text-gray-700 dark:text-gray-300">
{entry.content}
</div>
)}
</div>
{entry.summary && (
<div className="mt-6 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg">
<h3 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
Summary
</h3>
<p className="text-sm text-gray-600 dark:text-gray-400">{entry.summary}</p>
</div>
)}
</div>
);
}