@startsimpli/ui 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/__mocks__/next/link.js +11 -0
- package/src/components/account/__tests__/account.test.tsx +315 -0
- package/src/components/command-palette/CommandGroup.tsx +23 -0
- package/src/components/command-palette/CommandPalette.tsx +183 -200
- package/src/components/command-palette/CommandResultItem.tsx +59 -0
- package/src/components/command-palette/__tests__/CommandGroup.test.tsx +81 -0
- package/src/components/command-palette/__tests__/CommandResultItem.test.tsx +166 -0
- package/src/components/command-palette/__tests__/command-palette-context.test.tsx +166 -0
- package/src/components/command-palette/__tests__/useCommandPaletteSearch.test.ts +271 -0
- package/src/components/command-palette/index.ts +6 -0
- package/src/components/command-palette/useCommandPaletteSearch.ts +114 -0
- package/src/components/compose/__tests__/compose.test.tsx +656 -0
- package/src/components/dashboard/PipelineFunnel.tsx +126 -0
- package/src/components/dashboard/TopCampaigns.tsx +132 -0
- package/src/components/dashboard/__tests__/dashboard.test.tsx +785 -0
- package/src/components/dashboard/index.ts +6 -0
- package/src/components/dialog/ConfirmDialog.tsx +72 -0
- package/src/components/dialog/__tests__/ConfirmDialog.test.tsx +126 -0
- package/src/components/dialog/index.ts +3 -0
- package/src/components/email-dialogs/__tests__/email-dialogs.test.tsx +982 -0
- package/src/components/email-editor/BlockRenderer.tsx +120 -0
- package/src/components/email-editor/__tests__/BlockRenderer.test.tsx +332 -0
- package/src/components/email-editor/__tests__/block-renderers.test.ts +624 -0
- package/src/components/email-editor/__tests__/email-html-renderer.test.ts +376 -0
- package/src/components/email-editor/blocks/__tests__/blocks.test.tsx +818 -0
- package/src/components/email-editor/editor-sidebar.tsx +6 -731
- package/src/components/email-editor/email-editor.tsx +78 -467
- package/src/components/email-editor/hooks/__tests__/useDragDrop.test.ts +355 -0
- package/src/components/email-editor/hooks/__tests__/useEmailEditorState.test.ts +551 -0
- package/src/components/email-editor/hooks/useDragDrop.ts +181 -0
- package/src/components/email-editor/hooks/useEmailEditorState.ts +426 -0
- package/src/components/email-editor/index.ts +1 -0
- package/src/components/email-editor/panels/BlockPropertyPanel.tsx +637 -0
- package/src/components/email-editor/panels/GlobalStylesPanel.tsx +108 -0
- package/src/components/email-editor/panels/SectionSettingsPanel.tsx +80 -0
- package/src/components/email-editor/panels/__tests__/BlockPropertyPanel.test.tsx +707 -0
- package/src/components/email-editor/panels/__tests__/GlobalStylesPanel.test.tsx +226 -0
- package/src/components/email-editor/panels/index.ts +3 -0
- package/src/components/enrichment/__tests__/enrichment.test.tsx +184 -0
- package/src/components/gantt/GanttBoardView.tsx +71 -0
- package/src/components/gantt/GanttChart.tsx +134 -881
- package/src/components/gantt/GanttFilterBar.tsx +100 -0
- package/src/components/gantt/GanttListView.tsx +63 -0
- package/src/components/gantt/GanttTimelineView.tsx +215 -0
- package/src/components/gantt/__tests__/GanttBoardView.test.tsx +305 -0
- package/src/components/gantt/__tests__/GanttFilterBar.test.tsx +544 -0
- package/src/components/gantt/__tests__/GanttListView.test.tsx +337 -0
- package/src/components/gantt/__tests__/GanttTimelineView.test.tsx +375 -0
- package/src/components/gantt/__tests__/gantt-utils.test.ts +341 -0
- package/src/components/gantt/__tests__/useGanttState.test.ts +535 -0
- package/src/components/gantt/hooks/useGanttState.ts +644 -0
- package/src/components/gantt/index.ts +10 -0
- package/src/components/integrations/__tests__/integrations.test.tsx +191 -0
- package/src/components/kanban/__tests__/kanban.test.tsx +157 -0
- package/src/components/lists/__tests__/lists.test.tsx +263 -0
- package/src/components/loading/__tests__/loading.test.tsx +114 -0
- package/src/components/navigation/__tests__/navigation.test.tsx +194 -0
- package/src/components/pipeline/__tests__/pipeline.test.tsx +169 -0
- package/src/components/settings/__tests__/settings.test.tsx +181 -0
- package/src/components/wizard/__tests__/wizard.test.tsx +97 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useCallback, useMemo } from 'react'
|
|
4
|
+
|
|
5
|
+
/** Unified command item for the palette */
|
|
6
|
+
export interface CommandItem {
|
|
7
|
+
id: string
|
|
8
|
+
icon?: React.ElementType
|
|
9
|
+
label: string
|
|
10
|
+
detail?: string
|
|
11
|
+
shortcut?: string
|
|
12
|
+
group: string
|
|
13
|
+
/** Navigate path or action callback */
|
|
14
|
+
onSelect: (() => void) | string
|
|
15
|
+
/** Optional color class for icon container */
|
|
16
|
+
colorClass?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface CommandGroup {
|
|
20
|
+
label: string
|
|
21
|
+
items: CommandItem[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface UseCommandPaletteOptions {
|
|
25
|
+
commands: CommandItem[]
|
|
26
|
+
onExecute: (command: CommandItem) => void
|
|
27
|
+
isOpen: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface UseCommandPaletteReturn {
|
|
31
|
+
query: string
|
|
32
|
+
setQuery: (q: string) => void
|
|
33
|
+
filteredGroups: CommandGroup[]
|
|
34
|
+
selectedIndex: number
|
|
35
|
+
onKeyDown: (e: React.KeyboardEvent) => void
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function useCommandPaletteSearch(opts: UseCommandPaletteOptions): UseCommandPaletteReturn {
|
|
39
|
+
const { commands, onExecute, isOpen } = opts
|
|
40
|
+
const [query, setQuery] = useState('')
|
|
41
|
+
const [selectedIndex, setSelectedIndex] = useState(0)
|
|
42
|
+
|
|
43
|
+
// Filter commands by query and group them
|
|
44
|
+
const filteredGroups = useMemo(() => {
|
|
45
|
+
const lowerQuery = query.toLowerCase()
|
|
46
|
+
const filtered = query
|
|
47
|
+
? commands.filter(
|
|
48
|
+
(cmd) =>
|
|
49
|
+
cmd.label.toLowerCase().includes(lowerQuery) ||
|
|
50
|
+
(cmd.detail && cmd.detail.toLowerCase().includes(lowerQuery))
|
|
51
|
+
)
|
|
52
|
+
: commands
|
|
53
|
+
|
|
54
|
+
// Group by group label, preserving insertion order
|
|
55
|
+
const groupMap = new Map<string, CommandItem[]>()
|
|
56
|
+
for (const cmd of filtered) {
|
|
57
|
+
const existing = groupMap.get(cmd.group)
|
|
58
|
+
if (existing) {
|
|
59
|
+
existing.push(cmd)
|
|
60
|
+
} else {
|
|
61
|
+
groupMap.set(cmd.group, [cmd])
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const groups: CommandGroup[] = []
|
|
66
|
+
for (const [label, items] of groupMap) {
|
|
67
|
+
groups.push({ label, items })
|
|
68
|
+
}
|
|
69
|
+
return groups
|
|
70
|
+
}, [commands, query])
|
|
71
|
+
|
|
72
|
+
// Flat list for keyboard nav
|
|
73
|
+
const flatItems = useMemo(
|
|
74
|
+
() => filteredGroups.flatMap((g) => g.items),
|
|
75
|
+
[filteredGroups]
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
// Reset state when palette opens/closes
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (isOpen) {
|
|
81
|
+
setQuery('')
|
|
82
|
+
setSelectedIndex(0)
|
|
83
|
+
}
|
|
84
|
+
}, [isOpen])
|
|
85
|
+
|
|
86
|
+
// Reset selection when filtered results change
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
setSelectedIndex(0)
|
|
89
|
+
}, [filteredGroups])
|
|
90
|
+
|
|
91
|
+
const onKeyDown = useCallback(
|
|
92
|
+
(e: React.KeyboardEvent) => {
|
|
93
|
+
if (e.key === 'ArrowDown') {
|
|
94
|
+
e.preventDefault()
|
|
95
|
+
setSelectedIndex((prev) => Math.min(prev + 1, flatItems.length - 1))
|
|
96
|
+
} else if (e.key === 'ArrowUp') {
|
|
97
|
+
e.preventDefault()
|
|
98
|
+
setSelectedIndex((prev) => Math.max(prev - 1, 0))
|
|
99
|
+
} else if (e.key === 'Enter' && flatItems[selectedIndex]) {
|
|
100
|
+
e.preventDefault()
|
|
101
|
+
onExecute(flatItems[selectedIndex])
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
[flatItems, selectedIndex, onExecute]
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
query,
|
|
109
|
+
setQuery,
|
|
110
|
+
filteredGroups,
|
|
111
|
+
selectedIndex,
|
|
112
|
+
onKeyDown,
|
|
113
|
+
}
|
|
114
|
+
}
|