@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.
- package/CHANGELOG.md +23 -0
- package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -1
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +151 -3
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/accessibility.md +142 -0
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/coach-marks.md +169 -0
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +382 -0
- package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +56 -0
- package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +17 -1
- package/consumer-extras/patterns/collaboration-access-pattern.md +2 -0
- package/package.json +3 -3
- package/src/components/ui/banner.tsx +2 -0
- package/src/components/ui/chart.tsx +57 -2
- package/src/components/ui/sidebar.tsx +1 -0
- package/src/globals.css +21 -2
- package/src/theme.css +4 -2
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +1 -1
- package/template/.cursor/rules/exxat-mono-ids.mdc +30 -0
- package/template/AGENTS.md +23 -18
- package/template/app/(app)/data-list/page.tsx +2 -2
- package/template/app/(app)/question-bank/layout.tsx +27 -7
- package/template/app/(app)/question-bank/new/page.tsx +58 -0
- package/template/app/globals.css +136 -2
- package/template/app/layout.tsx +41 -5
- package/template/components/app-sidebar.tsx +141 -59
- package/template/components/ask-leo-sidebar.tsx +1 -4
- package/template/components/brand-color-picker.tsx +344 -0
- package/template/components/compliance-list-view.tsx +33 -51
- package/template/components/compliance-table.tsx +24 -0
- package/template/components/data-table/index.tsx +68 -24
- package/template/components/data-table/pagination.tsx +0 -1
- package/template/components/data-table/types.ts +4 -1
- package/template/components/data-table/use-table-state.ts +243 -94
- package/template/components/data-views/data-row-list.tsx +183 -0
- package/template/components/data-views/finder-panel-view.tsx +2 -2
- package/template/components/data-views/index.ts +26 -3
- package/template/components/data-views/list-page-split-details-placeholder.tsx +3 -3
- package/template/components/data-views/list-page-split-hub-tokens.ts +1 -1
- package/template/components/data-views/list-page-tree-column-header.tsx +1 -1
- package/template/components/data-views/os-folder-glyph.tsx +8 -0
- package/template/components/data-views/outline-tree-menu.tsx +157 -0
- package/template/components/data-views/question-bank-folder-tree-branch.tsx +210 -0
- package/template/components/export-drawer.tsx +1 -1
- package/template/components/exxat-product-logo.tsx +173 -379
- package/template/components/folder-details-shell.tsx +1 -1
- package/template/components/hub-tree-panel-view.tsx +88 -80
- package/template/components/invite-collaborators-drawer.tsx +5 -3
- package/template/components/key-metrics.tsx +116 -51
- package/template/components/new-placement-form.tsx +4 -2
- package/template/components/new-question-composer.tsx +2208 -0
- package/template/components/page-breadcrumb-trail.tsx +131 -0
- package/template/components/page-header.tsx +21 -11
- package/template/components/{data-views/placement-board-card.tsx → placement-board-card.tsx} +1 -1
- package/template/components/placement-detail.tsx +1 -1
- package/template/components/placements-board-view.tsx +1 -1
- package/template/components/{data-list-client.tsx → placements-client.tsx} +9 -7
- package/template/components/placements-list-view.tsx +18 -132
- package/template/components/{data-list-table-cells.test.tsx → placements-table-cells.test.tsx} +2 -2
- package/template/components/{data-list-table-cells.tsx → placements-table-cells.tsx} +1 -1
- package/template/components/placements-table-columns.tsx +2 -2
- package/template/components/{data-list-table.tsx → placements-table.tsx} +67 -58
- package/template/components/product-switcher.tsx +26 -11
- package/template/components/product-wordmark.tsx +285 -0
- package/template/components/question-bank-client.tsx +130 -70
- package/template/components/question-bank-hub-client.tsx +108 -115
- package/template/components/question-bank-list-view.tsx +30 -54
- package/template/components/question-bank-new-folder-sheet.tsx +1 -1
- package/template/components/question-bank-page-header.tsx +18 -2
- package/template/components/question-bank-secondary-nav.tsx +12 -228
- package/template/components/question-bank-table.tsx +30 -5
- package/template/components/rotations-empty-state.tsx +3 -0
- package/template/components/secondary-panel.tsx +24 -4
- package/template/components/settings-appearance-card.tsx +584 -141
- package/template/components/site-header.tsx +56 -32
- package/template/components/sites-list-view.tsx +31 -36
- package/template/components/sites-table.tsx +24 -0
- package/template/components/table-properties/drawer.tsx +1 -1
- package/template/components/team-client.tsx +1 -1
- package/template/components/team-list-view.tsx +34 -50
- package/template/components/team-table.tsx +29 -3
- package/template/components/templates/dedicated-search-landing-template.tsx +86 -20
- package/template/components/templates/list-page.tsx +1 -3
- package/template/components/templates/nested-secondary-panel-shell.tsx +11 -6
- package/template/components/ui/dot-pattern.tsx +50 -26
- package/template/components/ui/leo-icon.tsx +23 -3
- package/template/contexts/product-context.tsx +51 -7
- package/template/contexts/system-banner-context.tsx +112 -4
- package/template/docs/collaboration-access-pattern.md +2 -0
- package/template/docs/question-bank-hub-header-pattern.md +25 -0
- package/template/eslint.config.mjs +18 -0
- package/template/hooks/use-secondary-panel-hub-nav.ts +17 -1
- package/template/hooks/use-sidebar-reflow-zoom.ts +21 -11
- package/template/lib/data-list-persistence.ts +57 -257
- package/template/lib/dev-log.test.ts +6 -5
- package/template/lib/exxat-palette.json +1462 -0
- package/template/lib/exxat-palette.ts +136 -0
- package/template/lib/list-page-table-properties.ts +1 -1
- package/template/lib/list-status-badges.ts +1 -1
- package/template/lib/mailto.ts +29 -0
- package/template/lib/mock/navigation.tsx +30 -1
- package/template/lib/placement-board-card-layout.ts +1 -1
- package/template/lib/product-brand.ts +268 -0
- package/template/lib/question-bank-authoring.ts +308 -0
- package/template/lib/question-bank-nav.ts +70 -0
- package/template/lib/raf-throttle.ts +45 -0
- package/template/lib/table-state-lifecycle.ts +474 -0
- package/template/next.config.mjs +156 -0
- package/template/package.json +6 -6
- package/template/stores/app-store.ts +46 -1
- package/template/components/command-menu-01.tsx +0 -133
- 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 <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
|
|
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
|
|
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
|
|
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 <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
|
|
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
|
|
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 <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
|
|
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
|
-
}
|