Skip to content

Commit 65ef1c4

Browse files
Copilothotlong
andcommitted
Use cn() utility for className in ConnectionStatusIndicator, update ROADMAP with designer UX section
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 7e6e6dd commit 65ef1c4

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

ROADMAP.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,45 @@ The v2.0.7 spec introduces 70+ new UI types across 12 domains. This section maps
293293
- [x] Global search results page (beyond command palette)
294294
- [x] Recent items / favorites in sidebar
295295

296+
#### 2.8 Designer UX Enhancement (Feb 2026)
297+
**Target:** Enterprise-quality designer experience across all 5 designers
298+
299+
> 📄 See [DESIGNER_UX_ANALYSIS.md](./DESIGNER_UX_ANALYSIS.md) for full analysis
300+
301+
**Phase 1: Accessibility & Polish ✅ Complete**
302+
- [x] Add ARIA attributes (aria-label, role=toolbar/region/tablist/tab, aria-selected) across all 5 designers
303+
- [x] Add keyboard shortcuts (Delete to remove selected, Escape to deselect) to PageDesigner, DataModelDesigner, ProcessDesigner, ReportDesigner
304+
- [x] Improve empty states with guidance text across all designers
305+
- [x] Add zoom controls (−/+/fit) to PageDesigner canvas
306+
- [x] Improve property panels (PageDesigner label editing, ReportDesigner element details)
307+
- [x] Add ConnectionStatusIndicator component to CollaborationProvider
308+
- [x] Expand user color palette from 8 to 16 colors
309+
- [x] Add tab accessibility (role=tablist, role=tab, aria-selected) to ViewDesigner
310+
- [x] Replace emoji indicators (🔑) with text indicators (PK) in DataModelDesigner
311+
312+
**Phase 2: Interaction Layer (Next Sprint)**
313+
- [ ] Implement drag-and-drop for component/entity/node positioning using @dnd-kit
314+
- [ ] Implement undo/redo using command pattern with state history
315+
- [ ] Add confirmation dialogs for destructive delete actions
316+
- [ ] Implement edge creation UI in ProcessDesigner (click-to-connect nodes)
317+
- [ ] Add inline entity field editing in DataModelDesigner
318+
319+
**Phase 3: Advanced Features (Q2 2026)**
320+
- [ ] Full property editors with live preview for all designers
321+
- [ ] i18n integration for all hardcoded UI strings via resolveI18nLabel
322+
- [ ] Canvas pan/zoom with minimap for DataModelDesigner and ProcessDesigner
323+
- [ ] Auto-layout algorithms for entity and node positioning
324+
- [ ] Copy/paste support (Ctrl+C/V) across all designers
325+
- [ ] Multi-select and bulk operations
326+
- [ ] Responsive/collapsible panel layout
327+
328+
**Phase 4: Collaboration Integration (Q3 2026)**
329+
- [ ] Wire CollaborationProvider into each designer for real-time co-editing
330+
- [ ] Live cursor positions on shared canvases
331+
- [ ] Operation-based undo/redo synchronized across collaborators
332+
- [ ] Conflict resolution UI for concurrent edits
333+
- [ ] Version history browser with visual diff
334+
296335
**Q2 Milestone:**
297336
- **v1.0.0 Release (June 2026):** Full interactive experience — DnD, gestures, focus, animation, notifications, view enhancements
298337
- **Spec compliance: 86% → 96%**

packages/plugin-designer/src/CollaborationProvider.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88

99
import React, { createContext, useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';
1010
import type { CollaborationConfig, CollaborationPresence, CollaborationOperation } from '@object-ui/types';
11+
import { clsx } from 'clsx';
12+
import { twMerge } from 'tailwind-merge';
13+
14+
function cn(...inputs: (string | undefined | false)[]) {
15+
return twMerge(clsx(inputs));
16+
}
1117

1218
export interface CollaborationContextValue {
1319
/** Active users in the session */
@@ -218,7 +224,7 @@ export function ConnectionStatusIndicator({ className }: { className?: string })
218224
const { color, label } = stateConfig[connectionState] ?? stateConfig.disconnected;
219225

220226
return (
221-
<div className={`flex items-center gap-2 text-xs ${className ?? ''}`} role="status" aria-live="polite" aria-label={`Collaboration: ${label}`}>
227+
<div className={cn('flex items-center gap-2 text-xs', className)} role="status" aria-live="polite" aria-label={`Collaboration: ${label}`}>
222228
<span className={`inline-block h-2 w-2 rounded-full ${color}`} />
223229
<span>{label}</span>
224230
{connectionState === 'connected' && users.length > 1 && (

0 commit comments

Comments
 (0)