@startsimpli/ui 0.4.7 → 0.4.9

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.
Files changed (62) hide show
  1. package/package.json +21 -23
  2. package/src/__mocks__/next/link.js +11 -0
  3. package/src/components/account/__tests__/account.test.tsx +315 -0
  4. package/src/components/command-palette/CommandGroup.tsx +23 -0
  5. package/src/components/command-palette/CommandPalette.tsx +183 -200
  6. package/src/components/command-palette/CommandResultItem.tsx +59 -0
  7. package/src/components/command-palette/__tests__/CommandGroup.test.tsx +81 -0
  8. package/src/components/command-palette/__tests__/CommandResultItem.test.tsx +166 -0
  9. package/src/components/command-palette/__tests__/command-palette-context.test.tsx +166 -0
  10. package/src/components/command-palette/__tests__/useCommandPaletteSearch.test.ts +271 -0
  11. package/src/components/command-palette/index.ts +6 -0
  12. package/src/components/command-palette/useCommandPaletteSearch.ts +114 -0
  13. package/src/components/compose/__tests__/compose.test.tsx +656 -0
  14. package/src/components/dashboard/PipelineFunnel.tsx +126 -0
  15. package/src/components/dashboard/TopCampaigns.tsx +132 -0
  16. package/src/components/dashboard/__tests__/dashboard.test.tsx +785 -0
  17. package/src/components/dashboard/index.ts +6 -0
  18. package/src/components/dialog/ConfirmDialog.tsx +72 -0
  19. package/src/components/dialog/__tests__/ConfirmDialog.test.tsx +126 -0
  20. package/src/components/dialog/index.ts +3 -0
  21. package/src/components/email-dialogs/__tests__/email-dialogs.test.tsx +982 -0
  22. package/src/components/email-editor/BlockRenderer.tsx +120 -0
  23. package/src/components/email-editor/__tests__/BlockRenderer.test.tsx +332 -0
  24. package/src/components/email-editor/__tests__/block-renderers.test.ts +624 -0
  25. package/src/components/email-editor/__tests__/email-html-renderer.test.ts +376 -0
  26. package/src/components/email-editor/blocks/__tests__/blocks.test.tsx +818 -0
  27. package/src/components/email-editor/editor-sidebar.tsx +6 -731
  28. package/src/components/email-editor/email-editor.tsx +78 -467
  29. package/src/components/email-editor/hooks/__tests__/useDragDrop.test.ts +355 -0
  30. package/src/components/email-editor/hooks/__tests__/useEmailEditorState.test.ts +551 -0
  31. package/src/components/email-editor/hooks/useDragDrop.ts +181 -0
  32. package/src/components/email-editor/hooks/useEmailEditorState.ts +426 -0
  33. package/src/components/email-editor/index.ts +1 -0
  34. package/src/components/email-editor/panels/BlockPropertyPanel.tsx +637 -0
  35. package/src/components/email-editor/panels/GlobalStylesPanel.tsx +108 -0
  36. package/src/components/email-editor/panels/SectionSettingsPanel.tsx +80 -0
  37. package/src/components/email-editor/panels/__tests__/BlockPropertyPanel.test.tsx +707 -0
  38. package/src/components/email-editor/panels/__tests__/GlobalStylesPanel.test.tsx +226 -0
  39. package/src/components/email-editor/panels/index.ts +3 -0
  40. package/src/components/enrichment/__tests__/enrichment.test.tsx +184 -0
  41. package/src/components/gantt/GanttBoardView.tsx +71 -0
  42. package/src/components/gantt/GanttChart.tsx +134 -881
  43. package/src/components/gantt/GanttFilterBar.tsx +100 -0
  44. package/src/components/gantt/GanttListView.tsx +63 -0
  45. package/src/components/gantt/GanttTimelineView.tsx +215 -0
  46. package/src/components/gantt/__tests__/GanttBoardView.test.tsx +305 -0
  47. package/src/components/gantt/__tests__/GanttFilterBar.test.tsx +544 -0
  48. package/src/components/gantt/__tests__/GanttListView.test.tsx +337 -0
  49. package/src/components/gantt/__tests__/GanttTimelineView.test.tsx +375 -0
  50. package/src/components/gantt/__tests__/gantt-utils.test.ts +341 -0
  51. package/src/components/gantt/__tests__/useGanttState.test.ts +535 -0
  52. package/src/components/gantt/hooks/useGanttState.ts +644 -0
  53. package/src/components/gantt/index.ts +10 -0
  54. package/src/components/integrations/__tests__/integrations.test.tsx +191 -0
  55. package/src/components/kanban/__tests__/kanban.test.tsx +157 -0
  56. package/src/components/lists/__tests__/lists.test.tsx +263 -0
  57. package/src/components/loading/__tests__/loading.test.tsx +114 -0
  58. package/src/components/navigation/__tests__/navigation.test.tsx +194 -0
  59. package/src/components/pipeline/__tests__/pipeline.test.tsx +169 -0
  60. package/src/components/safe-html.tsx +9 -8
  61. package/src/components/settings/__tests__/settings.test.tsx +181 -0
  62. 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
+ }