@exxatdesignux/ui 0.2.15 → 0.2.17

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 (110) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -1
  3. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +151 -3
  4. package/consumer-extras/cursor-skills/exxat-ds-skill/references/accessibility.md +142 -0
  5. package/consumer-extras/cursor-skills/exxat-ds-skill/references/coach-marks.md +169 -0
  6. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +382 -0
  7. package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +56 -0
  8. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +17 -1
  9. package/consumer-extras/patterns/collaboration-access-pattern.md +2 -0
  10. package/package.json +3 -3
  11. package/src/components/ui/banner.tsx +2 -0
  12. package/src/components/ui/chart.tsx +57 -2
  13. package/src/components/ui/sidebar.tsx +1 -0
  14. package/src/globals.css +21 -2
  15. package/src/theme.css +4 -2
  16. package/template/.claude/skills/exxat-ds-skill/SKILL.md +1 -1
  17. package/template/.cursor/rules/exxat-mono-ids.mdc +30 -0
  18. package/template/AGENTS.md +23 -18
  19. package/template/app/(app)/data-list/page.tsx +2 -2
  20. package/template/app/(app)/question-bank/layout.tsx +27 -7
  21. package/template/app/(app)/question-bank/new/page.tsx +58 -0
  22. package/template/app/globals.css +136 -2
  23. package/template/app/layout.tsx +41 -5
  24. package/template/components/app-sidebar.tsx +141 -59
  25. package/template/components/ask-leo-sidebar.tsx +1 -4
  26. package/template/components/brand-color-picker.tsx +344 -0
  27. package/template/components/compliance-list-view.tsx +33 -51
  28. package/template/components/compliance-table.tsx +24 -0
  29. package/template/components/data-table/index.tsx +68 -24
  30. package/template/components/data-table/pagination.tsx +0 -1
  31. package/template/components/data-table/types.ts +4 -1
  32. package/template/components/data-table/use-table-state.ts +243 -94
  33. package/template/components/data-views/data-row-list.tsx +183 -0
  34. package/template/components/data-views/finder-panel-view.tsx +2 -2
  35. package/template/components/data-views/index.ts +26 -3
  36. package/template/components/data-views/list-page-split-details-placeholder.tsx +3 -3
  37. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -1
  38. package/template/components/data-views/list-page-tree-column-header.tsx +1 -1
  39. package/template/components/data-views/os-folder-glyph.tsx +8 -0
  40. package/template/components/data-views/outline-tree-menu.tsx +157 -0
  41. package/template/components/data-views/question-bank-folder-tree-branch.tsx +210 -0
  42. package/template/components/export-drawer.tsx +1 -1
  43. package/template/components/exxat-product-logo.tsx +173 -379
  44. package/template/components/folder-details-shell.tsx +1 -1
  45. package/template/components/hub-tree-panel-view.tsx +88 -80
  46. package/template/components/invite-collaborators-drawer.tsx +5 -3
  47. package/template/components/key-metrics.tsx +116 -51
  48. package/template/components/new-placement-form.tsx +4 -2
  49. package/template/components/new-question-composer.tsx +2208 -0
  50. package/template/components/page-breadcrumb-trail.tsx +131 -0
  51. package/template/components/page-header.tsx +21 -11
  52. package/template/components/{data-views/placement-board-card.tsx → placement-board-card.tsx} +1 -1
  53. package/template/components/placement-detail.tsx +1 -1
  54. package/template/components/placements-board-view.tsx +1 -1
  55. package/template/components/{data-list-client.tsx → placements-client.tsx} +9 -7
  56. package/template/components/placements-list-view.tsx +18 -132
  57. package/template/components/{data-list-table-cells.test.tsx → placements-table-cells.test.tsx} +2 -2
  58. package/template/components/{data-list-table-cells.tsx → placements-table-cells.tsx} +1 -1
  59. package/template/components/placements-table-columns.tsx +2 -2
  60. package/template/components/{data-list-table.tsx → placements-table.tsx} +67 -58
  61. package/template/components/product-switcher.tsx +26 -11
  62. package/template/components/product-wordmark.tsx +285 -0
  63. package/template/components/question-bank-client.tsx +130 -70
  64. package/template/components/question-bank-hub-client.tsx +108 -115
  65. package/template/components/question-bank-list-view.tsx +30 -54
  66. package/template/components/question-bank-new-folder-sheet.tsx +1 -1
  67. package/template/components/question-bank-page-header.tsx +18 -2
  68. package/template/components/question-bank-secondary-nav.tsx +12 -228
  69. package/template/components/question-bank-table.tsx +30 -5
  70. package/template/components/rotations-empty-state.tsx +3 -0
  71. package/template/components/secondary-panel.tsx +24 -4
  72. package/template/components/settings-appearance-card.tsx +584 -141
  73. package/template/components/site-header.tsx +56 -32
  74. package/template/components/sites-list-view.tsx +31 -36
  75. package/template/components/sites-table.tsx +24 -0
  76. package/template/components/table-properties/drawer.tsx +1 -1
  77. package/template/components/team-client.tsx +1 -1
  78. package/template/components/team-list-view.tsx +34 -50
  79. package/template/components/team-table.tsx +29 -3
  80. package/template/components/templates/dedicated-search-landing-template.tsx +86 -20
  81. package/template/components/templates/list-page.tsx +1 -3
  82. package/template/components/templates/nested-secondary-panel-shell.tsx +11 -6
  83. package/template/components/ui/dot-pattern.tsx +50 -26
  84. package/template/components/ui/leo-icon.tsx +23 -3
  85. package/template/contexts/product-context.tsx +51 -7
  86. package/template/contexts/system-banner-context.tsx +112 -4
  87. package/template/docs/collaboration-access-pattern.md +2 -0
  88. package/template/docs/question-bank-hub-header-pattern.md +25 -0
  89. package/template/eslint.config.mjs +18 -0
  90. package/template/hooks/use-secondary-panel-hub-nav.ts +17 -1
  91. package/template/hooks/use-sidebar-reflow-zoom.ts +21 -11
  92. package/template/lib/data-list-persistence.ts +57 -257
  93. package/template/lib/dev-log.test.ts +6 -5
  94. package/template/lib/exxat-palette.json +1462 -0
  95. package/template/lib/exxat-palette.ts +136 -0
  96. package/template/lib/list-page-table-properties.ts +1 -1
  97. package/template/lib/list-status-badges.ts +1 -1
  98. package/template/lib/mailto.ts +29 -0
  99. package/template/lib/mock/navigation.tsx +30 -1
  100. package/template/lib/placement-board-card-layout.ts +1 -1
  101. package/template/lib/product-brand.ts +268 -0
  102. package/template/lib/question-bank-authoring.ts +308 -0
  103. package/template/lib/question-bank-nav.ts +70 -0
  104. package/template/lib/raf-throttle.ts +45 -0
  105. package/template/lib/table-state-lifecycle.ts +474 -0
  106. package/template/next.config.mjs +156 -0
  107. package/template/package.json +6 -6
  108. package/template/stores/app-store.ts +46 -1
  109. package/template/components/command-menu-01.tsx +0 -133
  110. package/template/components/command-menu-02.tsx +0 -386
@@ -11,12 +11,37 @@
11
11
  import { create } from "zustand"
12
12
  import { persist } from "zustand/middleware"
13
13
 
14
- export type Product = "exxat-one" | "exxat-prism"
14
+ export type Product = "exxat-one" | "exxat-prism" | "exxat-assessment" | "exxat-custom"
15
+
16
+ export interface CustomProductBrand {
17
+ suffix: string
18
+ brandColor: string
19
+ }
20
+
21
+ export const DEFAULT_CUSTOM_PRODUCT_BRAND: CustomProductBrand = {
22
+ suffix: "Assessment",
23
+ brandColor: "oklch(0.7 0.0913 159.88)",
24
+ }
15
25
 
16
26
  interface AppState {
17
27
  /** Currently active product — drives theme class and sidebar logo */
18
28
  product: Product
19
29
  setProduct: (product: Product) => void
30
+ customProductBrand: CustomProductBrand | null
31
+ setCustomProductBrand: (brand: CustomProductBrand | null) => void
32
+ /**
33
+ * Per-product brand color overrides — drives the mark gradient + wordmark
34
+ * suffix tint when the user picks a custom color for a built-in product
35
+ * (Exxat One / Prism / Assessment) or the custom slot. Settings →
36
+ * Appearance → Product uses these so the color picker actually re-colours
37
+ * the rendered logo (mark + suffix), instead of just the unused `brandColor`
38
+ * on the underlying `ProductBrandConfig`.
39
+ */
40
+ productBrandColors: Partial<Record<Product, string>>
41
+ setProductBrandColor: (product: Product, color: string | null) => void
42
+ hiddenProductIds: Product[]
43
+ hideProduct: (product: Product) => void
44
+ showProduct: (product: Product) => void
20
45
  }
21
46
 
22
47
  export const useAppStore = create<AppState>()(
@@ -24,6 +49,26 @@ export const useAppStore = create<AppState>()(
24
49
  (set) => ({
25
50
  product: "exxat-one",
26
51
  setProduct: (product) => set({ product }),
52
+ customProductBrand: DEFAULT_CUSTOM_PRODUCT_BRAND,
53
+ setCustomProductBrand: (customProductBrand) => set({ customProductBrand }),
54
+ productBrandColors: {},
55
+ setProductBrandColor: (product, color) =>
56
+ set(state => {
57
+ const next = { ...state.productBrandColors }
58
+ if (color && color.trim()) {
59
+ next[product] = color.trim()
60
+ } else {
61
+ delete next[product]
62
+ }
63
+ return { productBrandColors: next }
64
+ }),
65
+ hiddenProductIds: [],
66
+ hideProduct: (product) => set(state => ({
67
+ hiddenProductIds: Array.from(new Set([...state.hiddenProductIds, product])),
68
+ })),
69
+ showProduct: (product) => set(state => ({
70
+ hiddenProductIds: state.hiddenProductIds.filter(id => id !== product),
71
+ })),
27
72
  }),
28
73
  {
29
74
  name: "exxat-app",
@@ -1,133 +0,0 @@
1
- "use client";
2
-
3
- import {
4
- IconBell,
5
- IconBolt,
6
- IconCalendar,
7
- IconChartBar,
8
- IconChartPie,
9
- IconClock,
10
- IconFileText,
11
- IconHelp,
12
- IconKeyboard,
13
- IconLayoutDashboard,
14
- IconLayoutKanban,
15
- IconLogout,
16
- IconMessage,
17
- IconPalette,
18
- IconSettings,
19
- IconSquareCheck,
20
- IconTarget,
21
- IconTrendingUp,
22
- IconUsers,
23
- } from "@tabler/icons-react";
24
- import { useEffect, useState } from "react";
25
- import { Button } from "@/components/ui/button";
26
- import {
27
- Command,
28
- CommandDialog,
29
- CommandEmpty,
30
- CommandGroup,
31
- CommandInput,
32
- CommandItem,
33
- CommandList,
34
- } from "@/components/ui/command";
35
- import { Kbd } from "@/components/ui/kbd";
36
-
37
- const workspaceItems = [
38
- { icon: IconLayoutDashboard, label: "Dashboard" },
39
- { icon: IconLayoutKanban, label: "Projects" },
40
- { icon: IconSquareCheck, label: "Tasks" },
41
- { icon: IconCalendar, label: "Calendar" },
42
- { icon: IconUsers, label: "Team members" },
43
- { icon: IconMessage, label: "Messages" },
44
- { icon: IconFileText, label: "Documents" },
45
- { icon: IconBell, label: "Notifications" },
46
- { icon: IconClock, label: "Time tracking" },
47
- { icon: IconTarget, label: "Goals" },
48
- ];
49
-
50
- const analyticsItems = [
51
- { icon: IconChartBar, label: "Overview" },
52
- { icon: IconTrendingUp, label: "Performance" },
53
- { icon: IconChartPie, label: "Reports" },
54
- { icon: IconBolt, label: "Insights" },
55
- ];
56
-
57
- const settingsItems = [
58
- { icon: IconSettings, label: "Preferences" },
59
- { icon: IconPalette, label: "Appearance" },
60
- { icon: IconKeyboard, label: "Keyboard shortcuts" },
61
- { icon: IconHelp, label: "Help & support" },
62
- { icon: IconLogout, label: "Sign out" },
63
- ];
64
-
65
- export function CommandMenu01() {
66
- const [open, setOpen] = useState(true);
67
-
68
- useEffect(() => {
69
- const down = (e: KeyboardEvent) => {
70
- if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
71
- e.preventDefault();
72
- setOpen((prev) => !prev);
73
- }
74
- };
75
-
76
- document.addEventListener("keydown", down);
77
- return () => document.removeEventListener("keydown", down);
78
- }, []);
79
-
80
- return (
81
- <>
82
- <Button onClick={() => setOpen(true)} variant="outline">
83
- Open Command Menu
84
- </Button>
85
-
86
- <CommandDialog onOpenChange={setOpen} open={open} showCloseButton={false}>
87
- <Command className="rounded-none border-0 bg-transparent shadow-none">
88
- <CommandInput
89
- className="h-12"
90
- placeholder="Type a command or search..."
91
- />
92
- <CommandList className="min-h-[min(420px,50vh)] max-h-[min(560px,65vh)]">
93
- <CommandEmpty>No results found.</CommandEmpty>
94
- <CommandGroup heading="Workspace">
95
- {workspaceItems.map((item) => (
96
- <CommandItem key={item.label}>
97
- <item.icon className="me-2 h-5 w-5" />
98
- <span>{item.label}</span>
99
- </CommandItem>
100
- ))}
101
- </CommandGroup>
102
- <CommandGroup heading="Analytics">
103
- {analyticsItems.map((item) => (
104
- <CommandItem key={item.label}>
105
- <item.icon className="me-2 h-5 w-5" />
106
- <span>{item.label}</span>
107
- </CommandItem>
108
- ))}
109
- </CommandGroup>
110
- <CommandGroup heading="Settings">
111
- {settingsItems.map((item) => (
112
- <CommandItem key={item.label}>
113
- <item.icon className="me-2 h-5 w-5" />
114
- <span>{item.label}</span>
115
- </CommandItem>
116
- ))}
117
- </CommandGroup>
118
- </CommandList>
119
- </Command>
120
- <div className="flex h-12 items-center justify-end border-t px-3">
121
- <button
122
- className="flex items-center gap-1 text-muted-foreground text-sm hover:text-foreground"
123
- onClick={() => setOpen(false)}
124
- type="button"
125
- >
126
- <span>Close</span>
127
- <Kbd className="ms-1">Esc</Kbd>
128
- </button>
129
- </div>
130
- </CommandDialog>
131
- </>
132
- );
133
- }
@@ -1,386 +0,0 @@
1
- "use client"
2
-
3
- import {
4
- IconArrowRight,
5
- IconAt,
6
- IconCopy,
7
- IconDeviceDesktop,
8
- IconDownload,
9
- IconFile,
10
- IconFileSearch,
11
- IconKeyboard,
12
- IconLink,
13
- IconLogout,
14
- IconMessage,
15
- IconPencil,
16
- IconPlus,
17
- IconSend,
18
- IconSettings,
19
- IconTemplate,
20
- IconUser,
21
- IconUsers,
22
- } from "@tabler/icons-react"
23
- import { useEffect, useState } from "react"
24
- import { Button } from "@/components/ui/button"
25
- import {
26
- Command,
27
- CommandEmpty,
28
- CommandGroup,
29
- CommandInput,
30
- CommandItem,
31
- CommandList,
32
- } from "@/components/ui/command"
33
- import {
34
- Dialog,
35
- DialogContent,
36
- DialogDescription,
37
- DialogHeader,
38
- DialogTitle,
39
- } from "@/components/ui/dialog"
40
- import { Kbd, KbdGroup } from "@/components/ui/kbd"
41
-
42
- export function CommandMenu02() {
43
- const [open, setOpen] = useState(false)
44
- const [inputValue, setInputValue] = useState("")
45
-
46
- useEffect(() => {
47
- const down = (e: KeyboardEvent) => {
48
- if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
49
- e.preventDefault()
50
- setOpen((prev) => !prev)
51
- }
52
- }
53
-
54
- document.addEventListener("keydown", down)
55
- return () => document.removeEventListener("keydown", down)
56
- }, [])
57
-
58
- return (
59
- <>
60
- <Button onClick={() => setOpen(true)} type="button" variant="outline">
61
- Open Command Menu
62
- </Button>
63
-
64
- <Dialog onOpenChange={setOpen} open={open}>
65
- <DialogContent
66
- className="max-w-[min(42rem,calc(100%-2rem))] gap-0 overflow-hidden rounded-xl border-border/50 p-0 ring-0 shadow-[0_0_0_1px_color-mix(in_oklch,var(--brand-color)_48%,transparent),0_0_72px_-14px_color-mix(in_oklch,var(--brand-color)_58%,transparent),0_10px_15px_-3px_oklch(0_0_0_/_0.1)] dark:shadow-[0_0_0_1px_color-mix(in_oklch,var(--brand-color)_55%,transparent),0_0_80px_-12px_color-mix(in_oklch,var(--brand-color)_65%,transparent),0_10px_15px_-3px_oklch(0_0_0_/_0.35)] sm:max-w-3xl md:max-w-4xl"
67
- showCloseButton={false}
68
- >
69
- <DialogHeader className="sr-only">
70
- <DialogTitle>Command Menu</DialogTitle>
71
- <DialogDescription>
72
- Use the command menu to navigate through the app.
73
- </DialogDescription>
74
- </DialogHeader>
75
- <Command className="flex h-full w-full flex-col overflow-hidden bg-popover p-0">
76
- <div className="flex h-12 items-center gap-2 border-border/50 border-b px-4">
77
- <CommandInput
78
- variant="palette"
79
- onValueChange={setInputValue}
80
- placeholder="What do you need?"
81
- value={inputValue}
82
- />
83
- <Button
84
- type="button"
85
- variant="ghost"
86
- size="icon-sm"
87
- tabIndex={-1}
88
- className="shrink-0 text-muted-foreground hover:text-foreground"
89
- aria-label="Close command menu"
90
- onClick={() => setOpen(false)}
91
- >
92
- <Kbd>Esc</Kbd>
93
- </Button>
94
- </div>
95
-
96
- <CommandList className="max-h-[min(640px,72vh)] py-2">
97
- <CommandEmpty>No results found.</CommandEmpty>
98
-
99
- <CommandGroup>
100
- <CommandItem
101
- className="mx-2 rounded-lg py-2.5"
102
- onSelect={() => setOpen(false)}
103
- >
104
- <IconSettings aria-hidden />
105
- Account Settings...
106
- <KbdGroup className="ml-auto">
107
- <Kbd>⌘</Kbd>
108
- <Kbd>,</Kbd>
109
- </KbdGroup>
110
- </CommandItem>
111
- <CommandItem
112
- className="mx-2 rounded-lg py-2.5"
113
- onSelect={() => setOpen(false)}
114
- >
115
- <IconUser aria-hidden />
116
- Switch Workspace...
117
- </CommandItem>
118
- <CommandItem
119
- className="mx-2 rounded-lg py-2.5"
120
- onSelect={() => setOpen(false)}
121
- >
122
- <IconLogout aria-hidden />
123
- Log Out
124
- <KbdGroup className="ml-auto">
125
- <Kbd>⌘</Kbd>
126
- <Kbd>Q</Kbd>
127
- </KbdGroup>
128
- </CommandItem>
129
- </CommandGroup>
130
-
131
- <CommandGroup heading="Documents">
132
- <CommandItem
133
- className="mx-2 rounded-lg py-2.5"
134
- onSelect={() => setOpen(false)}
135
- >
136
- <IconFile aria-hidden />
137
- Search Documents...
138
- <KbdGroup className="ml-auto">
139
- <Kbd>⌘</Kbd>
140
- <Kbd>F</Kbd>
141
- </KbdGroup>
142
- </CommandItem>
143
- <CommandItem
144
- className="mx-2 rounded-lg py-2.5"
145
- onSelect={() => setOpen(false)}
146
- >
147
- <IconPlus aria-hidden />
148
- Create New Document...
149
- <KbdGroup className="ml-auto">
150
- <Kbd>⌘</Kbd>
151
- <Kbd>N</Kbd>
152
- </KbdGroup>
153
- </CommandItem>
154
- <CommandItem
155
- className="mx-2 rounded-lg py-2.5"
156
- onSelect={() => setOpen(false)}
157
- >
158
- <IconFile aria-hidden />
159
- Upload Document...
160
- <KbdGroup className="ml-auto">
161
- <Kbd>⌘</Kbd>
162
- <Kbd>U</Kbd>
163
- </KbdGroup>
164
- </CommandItem>
165
- </CommandGroup>
166
-
167
- <CommandGroup heading="Signing">
168
- <CommandItem
169
- className="mx-2 rounded-lg py-2.5"
170
- onSelect={() => setOpen(false)}
171
- >
172
- <IconSend aria-hidden />
173
- Request Signature...
174
- </CommandItem>
175
- <CommandItem
176
- className="mx-2 rounded-lg py-2.5"
177
- onSelect={() => setOpen(false)}
178
- >
179
- <IconPencil aria-hidden />
180
- Sign a Document...
181
- </CommandItem>
182
- <CommandItem
183
- className="mx-2 rounded-lg py-2.5"
184
- onSelect={() => setOpen(false)}
185
- >
186
- <IconUsers aria-hidden />
187
- Bulk Send for Signature...
188
- </CommandItem>
189
- </CommandGroup>
190
-
191
- <CommandGroup heading="Templates">
192
- <CommandItem
193
- className="mx-2 rounded-lg py-2.5"
194
- onSelect={() => setOpen(false)}
195
- >
196
- <IconTemplate aria-hidden />
197
- Search Templates...
198
- </CommandItem>
199
- <CommandItem
200
- className="mx-2 rounded-lg py-2.5"
201
- onSelect={() => setOpen(false)}
202
- >
203
- <IconPlus aria-hidden />
204
- Create New Template...
205
- </CommandItem>
206
- </CommandGroup>
207
-
208
- <CommandGroup heading="General">
209
- <CommandItem
210
- className="mx-2 rounded-lg py-2.5"
211
- onSelect={() => setOpen(false)}
212
- >
213
- <IconDeviceDesktop aria-hidden />
214
- Change Theme...
215
- <KbdGroup className="ml-auto">
216
- <Kbd>⌘</Kbd>
217
- <Kbd>T</Kbd>
218
- </KbdGroup>
219
- </CommandItem>
220
- <CommandItem
221
- className="mx-2 rounded-lg py-2.5"
222
- onSelect={() => setOpen(false)}
223
- >
224
- <IconCopy aria-hidden />
225
- Copy Current URL
226
- <KbdGroup className="ml-auto">
227
- <Kbd>⌘</Kbd>
228
- <Kbd>⇧</Kbd>
229
- <Kbd>C</Kbd>
230
- </KbdGroup>
231
- </CommandItem>
232
- </CommandGroup>
233
-
234
- <CommandGroup heading="Navigation">
235
- <CommandItem
236
- className="mx-2 rounded-lg py-2.5"
237
- onSelect={() => setOpen(false)}
238
- >
239
- <IconArrowRight aria-hidden />
240
- <span>
241
- Go to&nbsp;<strong className="font-semibold">Inbox</strong>
242
- </span>
243
- </CommandItem>
244
- <CommandItem
245
- className="mx-2 rounded-lg py-2.5"
246
- onSelect={() => setOpen(false)}
247
- >
248
- <IconArrowRight aria-hidden />
249
- <span>
250
- Go to&nbsp;
251
- <strong className="font-semibold">Action Required</strong>
252
- </span>
253
- </CommandItem>
254
- <CommandItem
255
- className="mx-2 rounded-lg py-2.5"
256
- onSelect={() => setOpen(false)}
257
- >
258
- <IconArrowRight aria-hidden />
259
- <span>
260
- Go to&nbsp;
261
- <strong className="font-semibold">
262
- Waiting for Others
263
- </strong>
264
- </span>
265
- </CommandItem>
266
- <CommandItem
267
- className="mx-2 rounded-lg py-2.5"
268
- onSelect={() => setOpen(false)}
269
- >
270
- <IconArrowRight aria-hidden />
271
- <span>
272
- Go to&nbsp;
273
- <strong className="font-semibold">Completed</strong>
274
- </span>
275
- </CommandItem>
276
- <CommandItem
277
- className="mx-2 rounded-lg py-2.5"
278
- onSelect={() => setOpen(false)}
279
- >
280
- <IconArrowRight aria-hidden />
281
- <span>
282
- Go to&nbsp;<strong className="font-semibold">Drafts</strong>
283
- </span>
284
- </CommandItem>
285
- <CommandItem
286
- className="mx-2 rounded-lg py-2.5"
287
- onSelect={() => setOpen(false)}
288
- >
289
- <IconArrowRight aria-hidden />
290
- <span>
291
- Go to&nbsp;
292
- <strong className="font-semibold">Templates</strong>
293
- </span>
294
- </CommandItem>
295
- <CommandItem
296
- className="mx-2 rounded-lg py-2.5"
297
- onSelect={() => setOpen(false)}
298
- >
299
- <IconArrowRight aria-hidden />
300
- <span>
301
- Go to&nbsp;
302
- <strong className="font-semibold">Archive</strong>
303
- </span>
304
- </CommandItem>
305
- <CommandItem
306
- className="mx-2 rounded-lg py-2.5"
307
- onSelect={() => setOpen(false)}
308
- >
309
- <IconArrowRight aria-hidden />
310
- <span>
311
- Go to&nbsp;<strong className="font-semibold">Trash</strong>
312
- </span>
313
- </CommandItem>
314
- <CommandItem
315
- className="mx-2 rounded-lg py-2.5"
316
- onSelect={() => setOpen(false)}
317
- >
318
- <IconArrowRight aria-hidden />
319
- <span>
320
- Go to&nbsp;
321
- <strong className="font-semibold">Settings</strong>
322
- </span>
323
- </CommandItem>
324
- </CommandGroup>
325
-
326
- <CommandGroup heading="Quick Actions">
327
- <CommandItem
328
- className="mx-2 rounded-lg py-2.5"
329
- onSelect={() => setOpen(false)}
330
- >
331
- <IconLink aria-hidden />
332
- Copy Signing Link
333
- </CommandItem>
334
- <CommandItem
335
- className="mx-2 rounded-lg py-2.5"
336
- onSelect={() => setOpen(false)}
337
- >
338
- <IconDownload aria-hidden />
339
- Download Document
340
- </CommandItem>
341
- </CommandGroup>
342
-
343
- <CommandGroup heading="Help">
344
- <CommandItem
345
- className="mx-2 rounded-lg py-2.5"
346
- onSelect={() => setOpen(false)}
347
- >
348
- <IconFileSearch aria-hidden />
349
- Search Help Center...
350
- </CommandItem>
351
- <CommandItem
352
- className="mx-2 rounded-lg py-2.5"
353
- onSelect={() => setOpen(false)}
354
- >
355
- <IconMessage aria-hidden />
356
- Send Feedback...
357
- </CommandItem>
358
- <CommandItem
359
- className="mx-2 rounded-lg py-2.5"
360
- onSelect={() => setOpen(false)}
361
- >
362
- <IconAt aria-hidden />
363
- Contact Support
364
- </CommandItem>
365
- </CommandGroup>
366
-
367
- <CommandGroup heading="Keyboard Shortcuts">
368
- <CommandItem
369
- className="mx-2 rounded-lg py-2.5"
370
- onSelect={() => setOpen(false)}
371
- >
372
- <IconKeyboard aria-hidden />
373
- View Keyboard Shortcuts
374
- <KbdGroup className="ml-auto">
375
- <Kbd>⌘</Kbd>
376
- <Kbd>/</Kbd>
377
- </KbdGroup>
378
- </CommandItem>
379
- </CommandGroup>
380
- </CommandList>
381
- </Command>
382
- </DialogContent>
383
- </Dialog>
384
- </>
385
- )
386
- }