@fayz-ai/admin 0.18.0 → 0.19.1
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/dist/CommandPalette-GQ6SPITD.js +297 -0
- package/dist/CommandPalette-GQ6SPITD.js.map +1 -0
- package/dist/{ScheduleEditor-63TVSCJC.js → ScheduleEditor-YZPOCBTW.js} +6 -6
- package/dist/{ScheduleEditor-63TVSCJC.js.map → ScheduleEditor-YZPOCBTW.js.map} +1 -1
- package/dist/SubscriptionPage-JXJ56OOH.js +8 -0
- package/dist/{SubscriptionPage-5PJ25YAD.js.map → SubscriptionPage-JXJ56OOH.js.map} +1 -1
- package/dist/access/headless.d.ts +2 -2
- package/dist/access/limits-registry.d.ts +6 -3
- package/dist/access/limits-registry.d.ts.map +1 -1
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/settings-tabs.store.d.ts +21 -0
- package/dist/app/settings-tabs.store.d.ts.map +1 -0
- package/dist/billing/index.js +2 -2
- package/dist/{chunk-7DFJEXCR.js → chunk-5GWUM4SM.js} +3 -3
- package/dist/{chunk-7DFJEXCR.js.map → chunk-5GWUM4SM.js.map} +1 -1
- package/dist/{chunk-ERDS4OJS.js → chunk-HYDNIBN6.js} +3 -3
- package/dist/{chunk-ERDS4OJS.js.map → chunk-HYDNIBN6.js.map} +1 -1
- package/dist/{chunk-WN6PGQSG.js → chunk-NB6X5O5L.js} +81 -10
- package/dist/chunk-NB6X5O5L.js.map +1 -0
- package/dist/{chunk-LZRLWKJ2.js → chunk-UHHEPU4A.js} +379 -88
- package/dist/chunk-UHHEPU4A.js.map +1 -0
- package/dist/{chunk-VTEP2AQX.js → chunk-WJ3H3RJN.js} +5 -3
- package/dist/chunk-WJ3H3RJN.js.map +1 -0
- package/dist/{chunk-G5PBC5OB.js → chunk-ZNV7Q2TO.js} +8 -8
- package/dist/chunk-ZNV7Q2TO.js.map +1 -0
- package/dist/components/GetStarted.d.ts +45 -0
- package/dist/components/GetStarted.d.ts.map +1 -0
- package/dist/components/RightRail.d.ts.map +1 -1
- package/dist/components/TeachMe.d.ts +83 -0
- package/dist/components/TeachMe.d.ts.map +1 -0
- package/dist/components/auth/SplitLogin.d.ts.map +1 -1
- package/dist/components/billing/SoftLimitProbes.d.ts +5 -0
- package/dist/components/billing/SoftLimitProbes.d.ts.map +1 -0
- package/dist/components/billing/SoftLimitWidget.d.ts +3 -0
- package/dist/components/billing/SoftLimitWidget.d.ts.map +1 -0
- package/dist/components/billing/index.d.ts +3 -1
- package/dist/components/billing/index.d.ts.map +1 -1
- package/dist/components/billing/soft-limit.store.d.ts +23 -0
- package/dist/components/billing/soft-limit.store.d.ts.map +1 -0
- package/dist/components/chat/ChatConversation.d.ts.map +1 -1
- package/dist/components/chat/ChatHistory.d.ts.map +1 -1
- package/dist/components/chat/ChatMessages.d.ts.map +1 -1
- package/dist/components/chat/ConfirmActionCard.d.ts +5 -1
- package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -1
- package/dist/components/chat/index.d.ts +0 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/connect/ConnectorRuns.d.ts +1 -1
- package/dist/components/connect/ConnectorsPanel.d.ts.map +1 -1
- package/dist/components/connect/ConnectorsTab.d.ts.map +1 -1
- package/dist/components/connect/connector-status.d.ts +1 -1
- package/dist/components/connect/model.d.ts +1 -1
- package/dist/components/layout/CommandPalette.d.ts.map +1 -1
- package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -1
- package/dist/components/settings/LocationsCrudPage.d.ts.map +1 -1
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/shared/RecordPickerModal.d.ts +24 -1
- package/dist/components/shared/RecordPickerModal.d.ts.map +1 -1
- package/dist/components/survey/PublicSurveyPage.d.ts +8 -0
- package/dist/components/survey/PublicSurveyPage.d.ts.map +1 -0
- package/dist/crud/CrudDetailPage.d.ts.map +1 -1
- package/dist/crud/CrudFormPage.d.ts.map +1 -1
- package/dist/crud/CrudListView.d.ts +3 -1
- package/dist/crud/CrudListView.d.ts.map +1 -1
- package/dist/crud/CrudPage.d.ts.map +1 -1
- package/dist/crud/CrudRecordModal.d.ts.map +1 -1
- package/dist/crud/LookupCreateInline.d.ts.map +1 -1
- package/dist/crud/RelatedListTab.d.ts +10 -0
- package/dist/crud/RelatedListTab.d.ts.map +1 -0
- package/dist/crud/archetypes/BookableToggle.d.ts +12 -0
- package/dist/crud/archetypes/BookableToggle.d.ts.map +1 -0
- package/dist/crud/archetypes/DetailTabHeader.d.ts +23 -0
- package/dist/crud/archetypes/DetailTabHeader.d.ts.map +1 -0
- package/dist/crud/archetypes/KanbanBoard.d.ts +89 -0
- package/dist/crud/archetypes/KanbanBoard.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderAmount.d.ts +25 -0
- package/dist/crud/archetypes/OrderAmount.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderBoardView.d.ts +61 -0
- package/dist/crud/archetypes/OrderBoardView.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderCreateScreen.d.ts +116 -0
- package/dist/crud/archetypes/OrderCreateScreen.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderDetailPage.d.ts +35 -0
- package/dist/crud/archetypes/OrderDetailPage.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderDetailRail.d.ts +97 -0
- package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderFormView.d.ts +20 -1
- package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderListView.d.ts +59 -1
- package/dist/crud/archetypes/OrderListView.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderPaymentChip.d.ts +8 -0
- package/dist/crud/archetypes/OrderPaymentChip.d.ts.map +1 -0
- package/dist/crud/archetypes/PaymentStatusBadge.d.ts +47 -0
- package/dist/crud/archetypes/PaymentStatusBadge.d.ts.map +1 -0
- package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -1
- package/dist/crud/archetypes/orderVocabulary.d.ts +19 -0
- package/dist/crud/archetypes/orderVocabulary.d.ts.map +1 -0
- package/dist/crud/archetypes/useOrderEditor.d.ts +20 -0
- package/dist/crud/archetypes/useOrderEditor.d.ts.map +1 -0
- package/dist/crud/archetypes/useOrderReceivable.d.ts +46 -0
- package/dist/crud/archetypes/useOrderReceivable.d.ts.map +1 -0
- package/dist/crud/archetypes/useOrdersPaymentStatus.d.ts +15 -0
- package/dist/crud/archetypes/useOrdersPaymentStatus.d.ts.map +1 -0
- package/dist/crud/createCrudPage.d.ts +3 -0
- package/dist/crud/createCrudPage.d.ts.map +1 -1
- package/dist/crud/relation-field.d.ts.map +1 -1
- package/dist/directory/AppSwitcher.d.ts +48 -0
- package/dist/directory/AppSwitcher.d.ts.map +1 -0
- package/dist/directory/FamilyWordmark.d.ts +20 -0
- package/dist/directory/FamilyWordmark.d.ts.map +1 -0
- package/dist/directory/app-id.d.ts +21 -0
- package/dist/directory/app-id.d.ts.map +1 -0
- package/dist/directory/directory.store.d.ts +20 -0
- package/dist/directory/directory.store.d.ts.map +1 -0
- package/dist/directory/index.d.ts +7 -0
- package/dist/directory/index.d.ts.map +1 -0
- package/dist/directory/types.d.ts +43 -0
- package/dist/directory/types.d.ts.map +1 -0
- package/dist/directory/useAppDirectory.d.ts +14 -0
- package/dist/directory/useAppDirectory.d.ts.map +1 -0
- package/dist/hooks/useAITools.d.ts +7 -0
- package/dist/hooks/useAITools.d.ts.map +1 -1
- package/dist/hooks/useAppConfig.d.ts.map +1 -1
- package/dist/hooks/useChat.d.ts +4 -0
- package/dist/hooks/useChat.d.ts.map +1 -1
- package/dist/hooks/useTenant.d.ts +12 -12
- package/dist/hooks/useTenant.d.ts.map +1 -1
- package/dist/index.d.ts +43 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25069 -21491
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-staff.d.ts +46 -96
- package/dist/lib/agent-staff.d.ts.map +1 -1
- package/dist/lib/ai-tool-handlers.d.ts +24 -7
- package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
- package/dist/lib/assistant-invite.d.ts.map +1 -1
- package/dist/lib/bookable-service.d.ts +7 -0
- package/dist/lib/bookable-service.d.ts.map +1 -0
- package/dist/lib/core-ai-tools.d.ts +0 -17
- package/dist/lib/core-ai-tools.d.ts.map +1 -1
- package/dist/lib/fayz-agent.d.ts +2 -0
- package/dist/lib/fayz-agent.d.ts.map +1 -1
- package/dist/lib/product-name.d.ts +38 -0
- package/dist/lib/product-name.d.ts.map +1 -0
- package/dist/lib/tool-search.d.ts +82 -0
- package/dist/lib/tool-search.d.ts.map +1 -0
- package/dist/onboarding/ActivationAgentSurface.d.ts.map +1 -1
- package/dist/onboarding/ActivationChecklistCard.d.ts +11 -1
- package/dist/onboarding/ActivationChecklistCard.d.ts.map +1 -1
- package/dist/onboarding/ActivationProvider.d.ts.map +1 -1
- package/dist/onboarding/WorkspaceSetupFlow.d.ts.map +1 -1
- package/dist/onboarding/business-profile.d.ts +67 -0
- package/dist/onboarding/business-profile.d.ts.map +1 -0
- package/dist/onboarding/checklist.d.ts +10 -0
- package/dist/onboarding/checklist.d.ts.map +1 -1
- package/dist/onboarding/decide.d.ts +23 -0
- package/dist/onboarding/decide.d.ts.map +1 -1
- package/dist/onboarding/guided-runner.d.ts +11 -0
- package/dist/onboarding/guided-runner.d.ts.map +1 -1
- package/dist/onboarding/guided.d.ts +21 -1
- package/dist/onboarding/guided.d.ts.map +1 -1
- package/dist/onboarding/index.d.ts +4 -2
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/packs/retail.d.ts.map +1 -1
- package/dist/onboarding/programs.d.ts +25 -1
- package/dist/onboarding/programs.d.ts.map +1 -1
- package/dist/onboarding/useWorkspaceSetupGate.d.ts.map +1 -1
- package/dist/onboarding/welcome.d.ts +27 -0
- package/dist/onboarding/welcome.d.ts.map +1 -0
- package/dist/org/WorkspaceChooser.d.ts +20 -0
- package/dist/org/WorkspaceChooser.d.ts.map +1 -0
- package/dist/org/WorkspaceChooserGate.d.ts +21 -0
- package/dist/org/WorkspaceChooserGate.d.ts.map +1 -0
- package/dist/org/WorkspaceSwitching.d.ts +25 -0
- package/dist/org/WorkspaceSwitching.d.ts.map +1 -0
- package/dist/org/WorkspaceSwitchingHost.d.ts +11 -0
- package/dist/org/WorkspaceSwitchingHost.d.ts.map +1 -0
- package/dist/org/adapters/supabase.d.ts +1 -1
- package/dist/org/adapters/supabase.d.ts.map +1 -1
- package/dist/org/choice.d.ts +41 -0
- package/dist/org/choice.d.ts.map +1 -0
- package/dist/org/context.d.ts +8 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/index.d.ts +12 -1
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +4 -4
- package/dist/org/self.d.ts.map +1 -1
- package/dist/org/store.d.ts +2 -1
- package/dist/org/store.d.ts.map +1 -1
- package/dist/org/switching.store.d.ts +27 -0
- package/dist/org/switching.store.d.ts.map +1 -0
- package/dist/permissions/context.d.ts +26 -0
- package/dist/permissions/context.d.ts.map +1 -1
- package/dist/permissions/index.js +1 -1
- package/dist/projects/SeuSiteWidget.d.ts.map +1 -1
- package/dist/setup/SetupAgentSurface.d.ts +2 -0
- package/dist/setup/SetupAgentSurface.d.ts.map +1 -0
- package/dist/setup/format.d.ts +21 -0
- package/dist/setup/format.d.ts.map +1 -0
- package/dist/setup/registry.d.ts +29 -0
- package/dist/setup/registry.d.ts.map +1 -0
- package/dist/setup/validate.d.ts +26 -0
- package/dist/setup/validate.d.ts.map +1 -0
- package/dist/stores/chat.store.d.ts +15 -18
- package/dist/stores/chat.store.d.ts.map +1 -1
- package/dist/stores/createCrudStore.d.ts +2 -0
- package/dist/stores/createCrudStore.d.ts.map +1 -1
- package/dist/tasks/components/TaskDetail.d.ts.map +1 -1
- package/dist/units/UnitMenuSection.d.ts.map +1 -1
- package/dist/units/UnitSwitcher.d.ts.map +1 -1
- package/dist/units/UnitSwitching.d.ts +24 -0
- package/dist/units/UnitSwitching.d.ts.map +1 -0
- package/dist/units/UnitSwitchingHost.d.ts +11 -0
- package/dist/units/UnitSwitchingHost.d.ts.map +1 -0
- package/dist/units/data.d.ts +30 -4
- package/dist/units/data.d.ts.map +1 -1
- package/dist/units/index.d.ts +2 -0
- package/dist/units/index.d.ts.map +1 -1
- package/dist/units/switching.store.d.ts +31 -0
- package/dist/units/switching.store.d.ts.map +1 -0
- package/package.json +7 -7
- package/dist/CommandPalette-XY3VOEAV.js +0 -291
- package/dist/CommandPalette-XY3VOEAV.js.map +0 -1
- package/dist/SubscriptionPage-5PJ25YAD.js +0 -8
- package/dist/chunk-G5PBC5OB.js.map +0 -1
- package/dist/chunk-LZRLWKJ2.js.map +0 -1
- package/dist/chunk-VTEP2AQX.js.map +0 -1
- package/dist/chunk-WN6PGQSG.js.map +0 -1
- package/dist/components/billing/SoftLimitBanner.d.ts +0 -5
- package/dist/components/billing/SoftLimitBanner.d.ts.map +0 -1
- package/dist/components/chat/StaffHireView.d.ts +0 -21
- package/dist/components/chat/StaffHireView.d.ts.map +0 -1
- package/dist/components/chat/StaffPitchCard.d.ts +0 -15
- package/dist/components/chat/StaffPitchCard.d.ts.map +0 -1
- package/dist/components/chat/StaffSwitcher.d.ts +0 -23
- package/dist/components/chat/StaffSwitcher.d.ts.map +0 -1
- package/dist/lib/staff-cards.d.ts +0 -11
- package/dist/lib/staff-cards.d.ts.map +0 -1
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { useTranslation } from './chunk-YUHCC7JY.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { useState, useEffect, useRef, useMemo } from 'react';
|
|
4
|
+
import { Command } from 'cmdk';
|
|
5
|
+
import * as Dialog from '@radix-ui/react-dialog';
|
|
6
|
+
import { Search, Loader2, X, Zap, UserX, UserPlus, UserCheck, TrendingUp, Star, Inbox, Clock3, Clock, Ban, Receipt, Landmark, Sparkles, Boxes, Box, User, FolderOpen, ListPlus, Shield, List, Plus, Filter, Building2, Contact, Handshake, Map, MapPin, UtensilsCrossed, Camera, Tags, Tag, Percent, Globe, MessageCircle, BookOpenCheck, BookOpen, UserCog, Briefcase, ListChecks, ClipboardList, Wrench, Target, ShoppingBag, ShoppingCart, Megaphone, CircleDollarSign, BadgeDollarSign, DollarSign, Mail, FileCheck2, FileText, CalendarX, CalendarCheck2, BarChart3, Activity, Package, CalendarClock, Calendar, Bell, CreditCard, Settings, Users, Home } from 'lucide-react';
|
|
7
|
+
import { foldText, MIN_QUERY_LENGTH, normalizeQuery, scoreCandidate, highlightRanges } from '@fayz-ai/core';
|
|
8
|
+
import { RefreshButton } from '@fayz-ai/ui';
|
|
9
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var ICON_MAP = {
|
|
12
|
+
Home,
|
|
13
|
+
Users,
|
|
14
|
+
Settings,
|
|
15
|
+
CreditCard,
|
|
16
|
+
Bell,
|
|
17
|
+
Calendar,
|
|
18
|
+
CalendarClock,
|
|
19
|
+
Package,
|
|
20
|
+
Activity,
|
|
21
|
+
BarChart3,
|
|
22
|
+
CalendarCheck2,
|
|
23
|
+
CalendarX,
|
|
24
|
+
FileText,
|
|
25
|
+
FileCheck2,
|
|
26
|
+
Mail,
|
|
27
|
+
Search,
|
|
28
|
+
DollarSign,
|
|
29
|
+
BadgeDollarSign,
|
|
30
|
+
CircleDollarSign,
|
|
31
|
+
Megaphone,
|
|
32
|
+
ShoppingCart,
|
|
33
|
+
ShoppingBag,
|
|
34
|
+
Target,
|
|
35
|
+
Wrench,
|
|
36
|
+
ClipboardList,
|
|
37
|
+
ListChecks,
|
|
38
|
+
Briefcase,
|
|
39
|
+
UserCog,
|
|
40
|
+
BookOpen,
|
|
41
|
+
BookOpenCheck,
|
|
42
|
+
MessageCircle,
|
|
43
|
+
Globe,
|
|
44
|
+
Percent,
|
|
45
|
+
Tag,
|
|
46
|
+
Tags,
|
|
47
|
+
Camera,
|
|
48
|
+
UtensilsCrossed,
|
|
49
|
+
MapPin,
|
|
50
|
+
Map,
|
|
51
|
+
Handshake,
|
|
52
|
+
Contact,
|
|
53
|
+
Building2,
|
|
54
|
+
Filter,
|
|
55
|
+
Plus,
|
|
56
|
+
List,
|
|
57
|
+
Shield,
|
|
58
|
+
ListPlus,
|
|
59
|
+
FolderOpen,
|
|
60
|
+
User,
|
|
61
|
+
Box,
|
|
62
|
+
Boxes,
|
|
63
|
+
Sparkles,
|
|
64
|
+
Landmark,
|
|
65
|
+
Receipt,
|
|
66
|
+
Ban,
|
|
67
|
+
Clock,
|
|
68
|
+
Clock3,
|
|
69
|
+
Inbox,
|
|
70
|
+
Star,
|
|
71
|
+
TrendingUp,
|
|
72
|
+
UserCheck,
|
|
73
|
+
UserPlus,
|
|
74
|
+
UserX,
|
|
75
|
+
Zap
|
|
76
|
+
};
|
|
77
|
+
var DEBOUNCE_MS = 140;
|
|
78
|
+
function Highlight({ text, query }) {
|
|
79
|
+
const parts = useMemo(() => {
|
|
80
|
+
const normalized = normalizeQuery(query);
|
|
81
|
+
const ranges = highlightRanges(text, normalized);
|
|
82
|
+
if (ranges.length === 0) return [{ text, hit: false }];
|
|
83
|
+
const out = [];
|
|
84
|
+
let cursor = 0;
|
|
85
|
+
for (const [from, to] of ranges) {
|
|
86
|
+
if (from > cursor) out.push({ text: text.slice(cursor, from), hit: false });
|
|
87
|
+
out.push({ text: text.slice(from, to), hit: true });
|
|
88
|
+
cursor = to;
|
|
89
|
+
}
|
|
90
|
+
if (cursor < text.length) out.push({ text: text.slice(cursor), hit: false });
|
|
91
|
+
return out;
|
|
92
|
+
}, [text, query]);
|
|
93
|
+
return /* @__PURE__ */ jsx(Fragment, { children: parts.map(
|
|
94
|
+
(part, i) => part.hit ? /* @__PURE__ */ jsx("mark", { className: "bg-transparent font-semibold text-foreground", children: part.text }, i) : /* @__PURE__ */ jsx(React.Fragment, { children: part.text }, i)
|
|
95
|
+
) });
|
|
96
|
+
}
|
|
97
|
+
function useEntitySearch(searchFn, query, open) {
|
|
98
|
+
const [result, setResult] = useState(null);
|
|
99
|
+
const [loading, setLoading] = useState(false);
|
|
100
|
+
const generation = useRef(0);
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const trimmed = query.trim();
|
|
103
|
+
if (!open || !searchFn || foldText(trimmed).length < MIN_QUERY_LENGTH) {
|
|
104
|
+
setResult(null);
|
|
105
|
+
setLoading(false);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const token = ++generation.current;
|
|
109
|
+
setLoading(true);
|
|
110
|
+
const timer = setTimeout(() => {
|
|
111
|
+
searchFn(trimmed, (partial) => {
|
|
112
|
+
if (token === generation.current) setResult((prev) => prev?.partial === false && prev.query === trimmed ? prev : partial);
|
|
113
|
+
}).then((final) => {
|
|
114
|
+
if (token !== generation.current) return;
|
|
115
|
+
setResult(final);
|
|
116
|
+
setLoading(false);
|
|
117
|
+
}).catch(() => {
|
|
118
|
+
if (token !== generation.current) return;
|
|
119
|
+
setLoading(false);
|
|
120
|
+
});
|
|
121
|
+
}, DEBOUNCE_MS);
|
|
122
|
+
return () => clearTimeout(timer);
|
|
123
|
+
}, [query, searchFn, open]);
|
|
124
|
+
const refresh = React.useCallback(async () => {
|
|
125
|
+
const trimmed = query.trim();
|
|
126
|
+
if (!searchFn || foldText(trimmed).length < MIN_QUERY_LENGTH) return;
|
|
127
|
+
const token = ++generation.current;
|
|
128
|
+
setLoading(true);
|
|
129
|
+
try {
|
|
130
|
+
const final = await searchFn(trimmed, void 0, { fresh: true });
|
|
131
|
+
if (token === generation.current) setResult(final);
|
|
132
|
+
} finally {
|
|
133
|
+
if (token === generation.current) setLoading(false);
|
|
134
|
+
}
|
|
135
|
+
}, [query, searchFn]);
|
|
136
|
+
return { result, loading, refresh };
|
|
137
|
+
}
|
|
138
|
+
function useRankedCommands(commands, query) {
|
|
139
|
+
return useMemo(() => {
|
|
140
|
+
const trimmed = query.trim();
|
|
141
|
+
if (!trimmed) return commands;
|
|
142
|
+
const normalized = normalizeQuery(trimmed);
|
|
143
|
+
if (normalized.tokens.length === 0) return commands;
|
|
144
|
+
return commands.map((cmd) => ({
|
|
145
|
+
cmd,
|
|
146
|
+
score: scoreCandidate(normalized, {
|
|
147
|
+
title: foldText(cmd.label),
|
|
148
|
+
haystack: foldText(`${cmd.label} ${cmd.group ?? ""} ${cmd.keywords ?? ""} ${cmd.subtitle ?? ""}`)
|
|
149
|
+
})
|
|
150
|
+
})).filter((c) => c.score > 0).sort((a, b) => b.score - a.score).map((c) => c.cmd);
|
|
151
|
+
}, [commands, query]);
|
|
152
|
+
}
|
|
153
|
+
var GROUP_HEADING = "[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground";
|
|
154
|
+
var ITEM = "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm outline-none transition-colors aria-selected:bg-muted";
|
|
155
|
+
function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onEntitySelect }) {
|
|
156
|
+
const { t } = useTranslation();
|
|
157
|
+
const [search, setSearch] = useState("");
|
|
158
|
+
const { result, loading, refresh } = useEntitySearch(onEntitySearch, search, open);
|
|
159
|
+
const rankedCommands = useRankedCommands(commands, search);
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
const handleKeyDown = (e) => {
|
|
162
|
+
if ((e.metaKey || e.ctrlKey) && e.key === "k") {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
onOpenChange(!open);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
168
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
169
|
+
}, [open, onOpenChange]);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (!open) setSearch("");
|
|
172
|
+
}, [open]);
|
|
173
|
+
const grouped = rankedCommands.reduce((acc, cmd) => {
|
|
174
|
+
const group = cmd.group ?? "Actions";
|
|
175
|
+
if (!acc[group]) acc[group] = [];
|
|
176
|
+
acc[group].push(cmd);
|
|
177
|
+
return acc;
|
|
178
|
+
}, {});
|
|
179
|
+
const hasQuery = foldText(search).length >= MIN_QUERY_LENGTH;
|
|
180
|
+
const recordGroups = hasQuery ? result?.groups ?? [] : [];
|
|
181
|
+
const recordCount = recordGroups.reduce((n, g) => n + g.hits.length, 0);
|
|
182
|
+
const totalResults = rankedCommands.length + recordCount;
|
|
183
|
+
const nothingYet = totalResults === 0;
|
|
184
|
+
return /* @__PURE__ */ jsx(Dialog.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Dialog.Overlay, { className: "saas-overlay fixed inset-0 z-[100] bg-black/40 backdrop-blur-sm" }),
|
|
186
|
+
/* @__PURE__ */ jsxs(
|
|
187
|
+
Dialog.Content,
|
|
188
|
+
{
|
|
189
|
+
className: "fayz-glass-surface saas-cmd-palette fixed inset-0 z-[100] flex flex-col overflow-hidden border-border/50 bg-popover shadow-2xl",
|
|
190
|
+
children: [
|
|
191
|
+
/* @__PURE__ */ jsx(Dialog.Title, { className: "sr-only", children: t("layout.commandPalette.title") }),
|
|
192
|
+
/* @__PURE__ */ jsx(Dialog.Description, { className: "sr-only", children: t("layout.commandPalette.description") }),
|
|
193
|
+
/* @__PURE__ */ jsxs(Command, { className: "flex min-h-0 flex-1 flex-col", label: "Command palette", shouldFilter: false, children: [
|
|
194
|
+
/* @__PURE__ */ jsxs("div", { className: "fz-safe-t flex shrink-0 items-center gap-3 border-b border-border/50 px-4", children: [
|
|
195
|
+
/* @__PURE__ */ jsx(Search, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
196
|
+
/* @__PURE__ */ jsx(
|
|
197
|
+
Command.Input,
|
|
198
|
+
{
|
|
199
|
+
placeholder: t("layout.commandPalette.placeholder"),
|
|
200
|
+
className: "flex h-12 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground",
|
|
201
|
+
autoFocus: true,
|
|
202
|
+
value: search,
|
|
203
|
+
onValueChange: setSearch
|
|
204
|
+
}
|
|
205
|
+
),
|
|
206
|
+
loading && /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground" }),
|
|
207
|
+
/* @__PURE__ */ jsx("kbd", { className: "hidden shrink-0 rounded-md border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground sm:inline-block", children: "ESC" }),
|
|
208
|
+
/* @__PURE__ */ jsx(
|
|
209
|
+
Dialog.Close,
|
|
210
|
+
{
|
|
211
|
+
"aria-label": t("common.close"),
|
|
212
|
+
className: "fz-tap -mr-2 flex shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors active:bg-muted sm:hidden",
|
|
213
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-5 w-5" })
|
|
214
|
+
}
|
|
215
|
+
)
|
|
216
|
+
] }),
|
|
217
|
+
/* @__PURE__ */ jsxs(Command.List, { className: "fz-scroll-contain min-h-0 flex-1 overflow-y-auto p-1.5 sm:max-h-[360px] sm:flex-none", children: [
|
|
218
|
+
nothingYet && /* @__PURE__ */ jsx(Command.Empty, { className: "py-8 text-center text-sm text-muted-foreground", children: loading ? t("layout.commandPalette.searching") : t("layout.commandPalette.noResults") }),
|
|
219
|
+
recordGroups.map((group) => {
|
|
220
|
+
const GroupIcon = group.icon ? ICON_MAP[group.icon] ?? User : User;
|
|
221
|
+
return /* @__PURE__ */ jsx(Command.Group, { heading: group.label, className: GROUP_HEADING, children: group.hits.map((hit) => {
|
|
222
|
+
const Icon = hit.icon ? ICON_MAP[hit.icon] ?? GroupIcon : GroupIcon;
|
|
223
|
+
return /* @__PURE__ */ jsxs(
|
|
224
|
+
Command.Item,
|
|
225
|
+
{
|
|
226
|
+
value: hit.uid,
|
|
227
|
+
onSelect: () => {
|
|
228
|
+
onEntitySelect?.(hit);
|
|
229
|
+
onOpenChange(false);
|
|
230
|
+
},
|
|
231
|
+
className: ITEM,
|
|
232
|
+
children: [
|
|
233
|
+
/* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
234
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
235
|
+
/* @__PURE__ */ jsx("span", { className: "block truncate", children: /* @__PURE__ */ jsx(Highlight, { text: hit.title, query: search }) }),
|
|
236
|
+
hit.subtitle && /* @__PURE__ */ jsx("span", { className: "block truncate text-[11px] text-muted-foreground", children: /* @__PURE__ */ jsx(Highlight, { text: hit.subtitle, query: search }) })
|
|
237
|
+
] }),
|
|
238
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-[11px] text-muted-foreground/40", children: group.label })
|
|
239
|
+
]
|
|
240
|
+
},
|
|
241
|
+
hit.uid
|
|
242
|
+
);
|
|
243
|
+
}) }, `entity:${group.key}`);
|
|
244
|
+
}),
|
|
245
|
+
Object.entries(grouped).map(([group, items]) => /* @__PURE__ */ jsx(Command.Group, { heading: group, className: GROUP_HEADING, children: items.map((cmd, i) => {
|
|
246
|
+
const Icon = cmd.icon ? ICON_MAP[cmd.icon] ?? null : null;
|
|
247
|
+
const uid = `${group}:${cmd.id}:${i}`;
|
|
248
|
+
return /* @__PURE__ */ jsxs(
|
|
249
|
+
Command.Item,
|
|
250
|
+
{
|
|
251
|
+
value: uid,
|
|
252
|
+
onSelect: () => {
|
|
253
|
+
cmd.action();
|
|
254
|
+
onOpenChange(false);
|
|
255
|
+
},
|
|
256
|
+
className: ITEM,
|
|
257
|
+
children: [
|
|
258
|
+
Icon && /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
259
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: /* @__PURE__ */ jsx(Highlight, { text: cmd.label, query: search }) }),
|
|
260
|
+
/* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground/40", children: cmd.group })
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
uid
|
|
264
|
+
);
|
|
265
|
+
}) }, group))
|
|
266
|
+
] }),
|
|
267
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-t border-border/50 px-4 py-2", children: [
|
|
268
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: loading ? t("layout.commandPalette.searching") : hasQuery ? t("layout.commandPalette.resultCount", { count: String(totalResults), plural: totalResults !== 1 ? "s" : "" }) : t("layout.commandPalette.commandCount", { count: String(commands.length), plural: commands.length !== 1 ? "s" : "" }) }),
|
|
269
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[10px] text-muted-foreground", children: [
|
|
270
|
+
hasQuery && result && /* @__PURE__ */ jsx(
|
|
271
|
+
RefreshButton,
|
|
272
|
+
{
|
|
273
|
+
onRefresh: refresh,
|
|
274
|
+
fromCache: result.cached,
|
|
275
|
+
label: t("layout.commandPalette.refresh"),
|
|
276
|
+
labelCached: t("layout.commandPalette.refreshCached"),
|
|
277
|
+
className: "rounded p-1 text-muted-foreground hover:text-foreground"
|
|
278
|
+
}
|
|
279
|
+
),
|
|
280
|
+
/* @__PURE__ */ jsxs("span", { className: "hidden items-center gap-2 sm:flex", children: [
|
|
281
|
+
/* @__PURE__ */ jsx("kbd", { className: "rounded border border-border bg-muted px-1 py-0.5 font-medium", children: "\u2191\u2193" }),
|
|
282
|
+
/* @__PURE__ */ jsx("span", { children: t("layout.commandPalette.navigate") }),
|
|
283
|
+
/* @__PURE__ */ jsx("kbd", { className: "rounded border border-border bg-muted px-1 py-0.5 font-medium", children: "\u21B5" }),
|
|
284
|
+
/* @__PURE__ */ jsx("span", { children: t("layout.commandPalette.open") })
|
|
285
|
+
] })
|
|
286
|
+
] })
|
|
287
|
+
] })
|
|
288
|
+
] })
|
|
289
|
+
]
|
|
290
|
+
}
|
|
291
|
+
)
|
|
292
|
+
] }) });
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export { CommandPalette };
|
|
296
|
+
//# sourceMappingURL=CommandPalette-GQ6SPITD.js.map
|
|
297
|
+
//# sourceMappingURL=CommandPalette-GQ6SPITD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/CommandPalette.tsx"],"names":["Fragment"],"mappings":";;;;;;;;;;AAgDA,IAAM,QAAA,GAAuC;AAAA,EAC3C,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,aAAA;AAAA,EAAe,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,SAAA;AAAA,EACrF,cAAA;AAAA,EAAgB,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,UAAA;AAAA,EAAY,eAAA;AAAA,EAAiB,gBAAA;AAAA,EAAkB,SAAA;AAAA,EAAW,YAAA;AAAA,EAAc,WAAA;AAAA,EAAa,MAAA;AAAA,EACpJ,MAAA;AAAA,EAAQ,aAAA;AAAA,EAAe,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,aAAA;AAAA,EAAe,aAAA;AAAA,EAChF,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,eAAA;AAAA,EAAiB,MAAA;AAAA,EAAQ,GAAA;AAAA,EAAK,SAAA;AAAA,EACjE,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,GAAA;AAAA,EAAK,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,GAAA;AAAA,EAAK,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EACzI,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO;AAChD,CAAA;AAGA,IAAM,WAAA,GAAc,GAAA;AAIpB,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,KAAA,EAAM,EAAoC;AACnE,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG,OAAO,CAAC,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,CAAA;AACrD,IAAA,MAAM,MAA6C,EAAC;AACpD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,MAAA,EAAQ;AAC/B,MAAA,IAAI,IAAA,GAAO,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAA,EAAK,OAAO,CAAA;AAC1E,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAM,EAAE,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,CAAA;AAClD,MAAA,MAAA,GAAS,EAAA;AAAA,IACX;AACA,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAG,GAAA,EAAK,OAAO,CAAA;AAC3E,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,uBACE,GAAA,CAAAA,QAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,CAAA,KAChB,KAAK,GAAA,mBACD,GAAA,CAAC,UAAa,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,IAAA,CAAK,IAAA,EAAA,EAAlE,CAAuE,CAAA,mBAClF,GAAA,CAAO,gBAAN,EAAwB,QAAA,EAAA,IAAA,CAAK,QAAT,CAAc;AAAA,GACzC,EACF,CAAA;AAEJ;AAKA,SAAS,eAAA,CAAgB,QAAA,EAAsC,KAAA,EAAe,IAAA,EAAe;AAC3F,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAoC,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAE3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,QAAQ,CAAC,QAAA,IAAY,SAAS,OAAO,CAAA,CAAE,SAAS,gBAAA,EAAkB;AACrE,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,EAAE,UAAA,CAAW,OAAA;AAC3B,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,CAAS,OAAA,EAAS,CAAC,OAAA,KAAY;AAE7B,QAAA,IAAI,KAAA,KAAU,UAAA,CAAW,OAAA,EAAS,SAAA,CAAU,CAAC,IAAA,KAAU,IAAA,EAAM,OAAA,KAAY,KAAA,IAAS,IAAA,CAAK,KAAA,KAAU,OAAA,GAAU,OAAO,OAAQ,CAAA;AAAA,MAC5H,CAAC,CAAA,CACE,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,QAAA,IAAI,KAAA,KAAU,WAAW,OAAA,EAAS;AAClC,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAEX,QAAA,IAAI,KAAA,KAAU,WAAW,OAAA,EAAS;AAClC,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACL,GAAG,WAAW,CAAA;AAEd,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,IAAI,CAAC,CAAA;AAI1B,EAAA,MAAM,OAAA,GAAgB,kBAAY,YAAY;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,OAAO,CAAA,CAAE,SAAS,gBAAA,EAAkB;AAC9D,IAAA,MAAM,KAAA,GAAQ,EAAE,UAAA,CAAW,OAAA;AAC3B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,OAAA,EAAS,QAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAChE,MAAA,IAAI,KAAA,KAAU,UAAA,CAAW,OAAA,EAAS,SAAA,CAAU,KAAK,CAAA;AAAA,IACnD,CAAA,SAAE;AACA,MAAA,IAAI,KAAA,KAAU,UAAA,CAAW,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AACpC;AAQA,SAAS,iBAAA,CAAkB,UAAyB,KAAA,EAA8B;AAChF,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,SAAS,OAAO,QAAA;AACrB,IAAA,MAAM,UAAA,GAAa,eAAe,OAAO,CAAA;AACzC,IAAA,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAC3C,IAAA,OAAO,QAAA,CACJ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACb,GAAA;AAAA,MACA,KAAA,EAAO,eAAe,UAAA,EAAY;AAAA,QAChC,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA,QACzB,UAAU,QAAA,CAAS,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA,CAAA,EAAI,IAAI,QAAA,IAAY,EAAE,IAAI,GAAA,CAAI,QAAA,IAAY,EAAE,CAAA,CAAE;AAAA,OACjG;AAAA,KACH,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,CACzB,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAK,EAChC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AACtB;AAEA,IAAM,aAAA,GACJ,qQAAA;AAEF,IAAM,IAAA,GACJ,6HAAA;AAEK,SAAS,cAAA,CAAe,EAAE,QAAA,GAAW,IAAI,IAAA,EAAM,YAAA,EAAc,cAAA,EAAgB,cAAA,EAAe,EAAwB;AACzH,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,OAAA,KAAY,eAAA,CAAgB,cAAA,EAAgB,QAAQ,IAAI,CAAA;AACjF,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA;AAEzD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAA,CAAK,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,QAAQ,GAAA,EAAK;AAC7C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,CAAC,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM,SAAA,CAAU,EAAE,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,CAAsC,CAAC,KAAK,GAAA,KAAQ;AACjF,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,IAAS,SAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,CAAI,KAAK,GAAG,GAAA,CAAI,KAAK,IAAI,EAAC;AAC/B,IAAA,GAAA,CAAI,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACnB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAM,CAAA,CAAE,MAAA,IAAU,gBAAA;AAE5C,EAAA,MAAM,eAAe,QAAA,GAAY,MAAA,EAAQ,MAAA,IAAU,KAAM,EAAC;AAC1D,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,eAAe,MAAA,GAAS,WAAA;AAC7C,EAAA,MAAM,aAAa,YAAA,KAAiB,CAAA;AAEpC,EAAA,2BACU,MAAA,CAAA,IAAA,EAAP,EAAY,MAAY,YAAA,EACvB,QAAA,kBAAA,IAAA,CAAQ,eAAP,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAQ,MAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,iEAAA,EAAkE,CAAA;AAAA,oBAK5F,IAAA;AAAA,MAAQ,MAAA,CAAA,OAAA;AAAA,MAAP;AAAA,QAED,SAAA,EAAU,gIAAA;AAAA,QACR,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAQ,cAAP,EAAa,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE,CAAA;AAAA,8BAC5D,MAAA,CAAA,WAAA,EAAP,EAAmB,WAAU,SAAA,EAAW,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EAAE,CAAA;AAAA,+BAE/E,OAAA,EAAA,EAAQ,SAAA,EAAU,gCAA+B,KAAA,EAAM,iBAAA,EAAkB,cAAc,KAAA,EACtF,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2EAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,wCAAA,EAAyC,CAAA;AAAA,8BAC3D,GAAA;AAAA,gBAAC,OAAA,CAAQ,KAAA;AAAA,gBAAR;AAAA,kBACC,WAAA,EAAa,EAAE,mCAAmC,CAAA;AAAA,kBAClD,SAAA,EAAU,wFAAA;AAAA,kBACV,SAAA,EAAS,IAAA;AAAA,kBACT,KAAA,EAAO,MAAA;AAAA,kBACP,aAAA,EAAe;AAAA;AAAA,eACjB;AAAA,cACC,OAAA,oBAAW,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,yDAAA,EAA0D,CAAA;AAAA,8BACzF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sIAAA,EAAuI,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,8BAIzJ,GAAA;AAAA,gBAAQ,MAAA,CAAA,KAAA;AAAA,gBAAP;AAAA,kBACC,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,kBAC5B,SAAA,EAAU,uIAAA;AAAA,kBAEV,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,aAAA,EACF,CAAA;AAAA,4BAEA,IAAA,CAAC,OAAA,CAAQ,IAAA,EAAR,EAAa,WAAU,sFAAA,EACrB,QAAA,EAAA;AAAA,cAAA,UAAA,oBACC,GAAA,CAAC,OAAA,CAAQ,KAAA,EAAR,EAAc,SAAA,EAAU,gDAAA,EACtB,QAAA,EAAA,OAAA,GAAU,CAAA,CAAE,iCAAiC,CAAA,GAAI,CAAA,CAAE,iCAAiC,CAAA,EACvF,CAAA;AAAA,cAID,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3B,gBAAA,MAAM,YAAY,KAAA,CAAM,IAAA,GAAQ,SAAS,KAAA,CAAM,IAAI,KAAK,IAAA,GAAQ,IAAA;AAChE,gBAAA,uBACE,GAAA,CAAC,OAAA,CAAQ,KAAA,EAAR,EAA0C,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,SAAA,EAAW,aAAA,EACzE,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,kBAAA,MAAM,OAAO,GAAA,CAAI,IAAA,GAAQ,SAAS,GAAA,CAAI,IAAI,KAAK,SAAA,GAAa,SAAA;AAC5D,kBAAA,uBACE,IAAA;AAAA,oBAAC,OAAA,CAAQ,IAAA;AAAA,oBAAR;AAAA,sBAEC,OAAO,GAAA,CAAI,GAAA;AAAA,sBACX,UAAU,MAAM;AAAE,wBAAA,cAAA,GAAiB,GAAG,CAAA;AAAG,wBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,sBAAE,CAAA;AAAA,sBAC7D,SAAA,EAAW,IAAA;AAAA,sBAEX,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,wCAAA,EAAyC,CAAA;AAAA,wCACzD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0CAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,MAAM,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAE,CAAA;AAAA,0BAC7E,GAAA,CAAI,QAAA,oBACH,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACd,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,GAAA,CAAI,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA,EAChD;AAAA,yBAAA,EAEJ,CAAA;AAAA,wCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EAAiD,gBAAM,KAAA,EAAM;AAAA;AAAA,qBAAA;AAAA,oBAdxE,GAAA,CAAI;AAAA,mBAeX;AAAA,gBAEJ,CAAC,CAAA,EAAA,EAtBiB,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,CAuBvC,CAAA;AAAA,cAEJ,CAAC,CAAA;AAAA,cAGA,MAAA,CAAO,QAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,KAAA,EAAO,KAAK,CAAA,qBACzC,GAAA,CAAC,QAAQ,KAAA,EAAR,EAA0B,SAAS,KAAA,EAAO,SAAA,EAAW,eACnD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACrB,gBAAA,MAAM,OAAO,GAAA,CAAI,IAAA,GAAQ,SAAS,GAAA,CAAI,IAAI,KAAK,IAAA,GAAQ,IAAA;AAGvD,gBAAA,MAAM,MAAM,CAAA,EAAG,KAAK,IAAI,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAAA;AACnC,gBAAA,uBACE,IAAA;AAAA,kBAAC,OAAA,CAAQ,IAAA;AAAA,kBAAR;AAAA,oBAEC,KAAA,EAAO,GAAA;AAAA,oBACP,UAAU,MAAM;AAAE,sBAAA,GAAA,CAAI,MAAA,EAAO;AAAG,sBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,oBAAE,CAAA;AAAA,oBACpD,SAAA,EAAW,IAAA;AAAA,oBAEV,QAAA,EAAA;AAAA,sBAAA,IAAA,oBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,sCAClE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAE,CAAA;AAAA,sCACtE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAwC,cAAI,KAAA,EAAM;AAAA;AAAA,mBAAA;AAAA,kBAP7D;AAAA,iBAQP;AAAA,cAEJ,CAAC,CAAA,EAAA,EAlBiB,KAmBpB,CACD;AAAA,aAAA,EACH,CAAA;AAAA,4BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA,OAAA,GACG,CAAA,CAAE,iCAAiC,CAAA,GACnC,QAAA,GACE,CAAA,CAAE,mCAAA,EAAqC,EAAE,KAAA,EAAO,MAAA,CAAO,YAAY,CAAA,EAAG,QAAQ,YAAA,KAAiB,CAAA,GAAI,GAAA,GAAM,EAAA,EAAI,CAAA,GAC7G,CAAA,CAAE,oCAAA,EAAsC,EAAE,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,QAAQ,QAAA,CAAS,MAAA,KAAW,IAAI,GAAA,GAAM,EAAA,EAAI,CAAA,EAC5H,CAAA;AAAA,8BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,QAAA,IAAY,MAAA,oBACX,GAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,OAAA;AAAA,oBACX,WAAW,MAAA,CAAO,MAAA;AAAA,oBAClB,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,oBACxC,WAAA,EAAa,EAAE,qCAAqC,CAAA;AAAA,oBACpD,SAAA,EAAU;AAAA;AAAA,iBACZ;AAAA,gCAIF,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACd,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,kCAC3F,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EAAE,CAAA;AAAA,kCAC3C,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,QAAA,EAAO,CAAA;AAAA,kCACtF,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EAAE;AAAA,iBAAA,EACzC;AAAA,eAAA,EACF;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"CommandPalette-GQ6SPITD.js","sourcesContent":["import * as React from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { Command } from 'cmdk'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport {\n Home, Users, Settings, CreditCard, Bell, Calendar, CalendarCheck2,\n CalendarClock, CalendarX, Package, Activity, BarChart3, FileText, FileCheck2, Mail, Search,\n DollarSign, BadgeDollarSign, CircleDollarSign, Megaphone, ShoppingCart, ShoppingBag, Target,\n Wrench, ClipboardList, ListChecks, Briefcase, UserCog, BookOpen, BookOpenCheck, MessageCircle,\n Globe, Percent, Tag, Tags, Camera, UtensilsCrossed, MapPin, Map, Handshake,\n Contact, Building2, Filter, Plus, List, Shield, User, Box, Sparkles, Loader2, X,\n ListPlus, FolderOpen, Boxes, Landmark, Receipt, Ban, Clock, Clock3, Inbox,\n Star, TrendingUp, UserCheck, UserPlus, UserX, Zap,\n type LucideIcon,\n} from 'lucide-react'\nimport {\n MIN_QUERY_LENGTH, highlightRanges, normalizeQuery, scoreCandidate, foldText,\n type GlobalSearchResult, type SearchHit,\n} from '@fayz-ai/core'\nimport { RefreshButton } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport interface CommandItem {\n id: string\n label: string\n icon?: string\n action: () => void\n group?: string\n keywords?: string\n subtitle?: string\n}\n\n/** Runs one global search. `onPartial` paints a cheap early answer, if there is one.\n * `opts.fresh` bypasses every cache — the footer's refresh button uses it. */\nexport type EntitySearchFn = (\n query: string,\n onPartial?: (result: GlobalSearchResult) => void,\n opts?: { fresh?: boolean },\n) => Promise<GlobalSearchResult>\n\ninterface CommandPaletteProps {\n commands?: CommandItem[]\n open: boolean\n onOpenChange: (open: boolean) => void\n onEntitySearch?: EntitySearchFn\n onEntitySelect?: (hit: SearchHit) => void\n}\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, CalendarClock, Package, Activity, BarChart3,\n CalendarCheck2, CalendarX, FileText, FileCheck2, Mail, Search, DollarSign, BadgeDollarSign, CircleDollarSign, Megaphone, ShoppingCart, ShoppingBag, Target,\n Wrench, ClipboardList, ListChecks, Briefcase, UserCog, BookOpen, BookOpenCheck, MessageCircle,\n Globe, Percent, Tag, Tags, Camera, UtensilsCrossed, MapPin, Map, Handshake,\n Contact, Building2, Filter, Plus, List, Shield, ListPlus, FolderOpen, User, Box, Boxes, Sparkles, Landmark, Receipt, Ban, Clock, Clock3, Inbox,\n Star, TrendingUp, UserCheck, UserPlus, UserX, Zap,\n}\n\n/** Long enough that a fast typist issues one request per word, not per letter. */\nconst DEBOUNCE_MS = 140\n\n// Highlighting — the matched run, in the record's own spelling\n\nfunction Highlight({ text, query }: { text: string; query: string }) {\n const parts = useMemo(() => {\n const normalized = normalizeQuery(query)\n const ranges = highlightRanges(text, normalized)\n if (ranges.length === 0) return [{ text, hit: false }]\n const out: Array<{ text: string; hit: boolean }> = []\n let cursor = 0\n for (const [from, to] of ranges) {\n if (from > cursor) out.push({ text: text.slice(cursor, from), hit: false })\n out.push({ text: text.slice(from, to), hit: true })\n cursor = to\n }\n if (cursor < text.length) out.push({ text: text.slice(cursor), hit: false })\n return out\n }, [text, query])\n\n return (\n <>\n {parts.map((part, i) =>\n part.hit\n ? <mark key={i} className=\"bg-transparent font-semibold text-foreground\">{part.text}</mark>\n : <React.Fragment key={i}>{part.text}</React.Fragment>,\n )}\n </>\n )\n}\n\n// Records arrive from the server; commands are already in memory. Same scorer,\n// different clocks — commands re-rank per keystroke, records refine as they land.\n\nfunction useEntitySearch(searchFn: EntitySearchFn | undefined, query: string, open: boolean) {\n const [result, setResult] = useState<GlobalSearchResult | null>(null)\n const [loading, setLoading] = useState(false)\n const generation = useRef(0)\n\n useEffect(() => {\n const trimmed = query.trim()\n if (!open || !searchFn || foldText(trimmed).length < MIN_QUERY_LENGTH) {\n setResult(null)\n setLoading(false)\n return\n }\n\n const token = ++generation.current\n setLoading(true)\n\n const timer = setTimeout(() => {\n searchFn(trimmed, (partial) => {\n // A partial must never replace a final answer for this same query.\n if (token === generation.current) setResult((prev) => (prev?.partial === false && prev.query === trimmed ? prev : partial))\n })\n .then((final) => {\n if (token !== generation.current) return\n setResult(final)\n setLoading(false)\n })\n .catch(() => {\n // Keep what is on screen: a failed refresh is not an empty result.\n if (token !== generation.current) return\n setLoading(false)\n })\n }, DEBOUNCE_MS)\n\n return () => clearTimeout(timer)\n }, [query, searchFn, open])\n\n // The footer refresh: same query, every cache bypassed. Returned as a\n // promise so the button spins until the network answer lands.\n const refresh = React.useCallback(async () => {\n const trimmed = query.trim()\n if (!searchFn || foldText(trimmed).length < MIN_QUERY_LENGTH) return\n const token = ++generation.current\n setLoading(true)\n try {\n const final = await searchFn(trimmed, undefined, { fresh: true })\n if (token === generation.current) setResult(final)\n } finally {\n if (token === generation.current) setLoading(false)\n }\n }, [query, searchFn])\n\n return { result, loading, refresh }\n}\n\n/**\n * Commands, ranked by the same ladder records use. cmdk's own filter is OFF:\n * it re-filtered the SERVER's results with its own substring rules, so a record\n * matched by phone, by a note or by an accent-folded name was fetched and then\n * dropped — the list said \"no results\" while the footer counted them.\n */\nfunction useRankedCommands(commands: CommandItem[], query: string): CommandItem[] {\n return useMemo(() => {\n const trimmed = query.trim()\n if (!trimmed) return commands\n const normalized = normalizeQuery(trimmed)\n if (normalized.tokens.length === 0) return commands\n return commands\n .map((cmd) => ({\n cmd,\n score: scoreCandidate(normalized, {\n title: foldText(cmd.label),\n haystack: foldText(`${cmd.label} ${cmd.group ?? ''} ${cmd.keywords ?? ''} ${cmd.subtitle ?? ''}`),\n }),\n }))\n .filter((c) => c.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((c) => c.cmd)\n }, [commands, query])\n}\n\nconst GROUP_HEADING =\n '[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground'\n\nconst ITEM =\n 'flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm outline-none transition-colors aria-selected:bg-muted'\n\nexport function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onEntitySelect }: CommandPaletteProps) {\n const { t } = useTranslation()\n const [search, setSearch] = useState('')\n const { result, loading, refresh } = useEntitySearch(onEntitySearch, search, open)\n const rankedCommands = useRankedCommands(commands, search)\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n onOpenChange(!open)\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, onOpenChange])\n\n // Reset search when closed\n useEffect(() => {\n if (!open) setSearch('')\n }, [open])\n\n const grouped = rankedCommands.reduce<Record<string, CommandItem[]>>((acc, cmd) => {\n const group = cmd.group ?? 'Actions'\n if (!acc[group]) acc[group] = []\n acc[group].push(cmd)\n return acc\n }, {})\n\n const hasQuery = foldText(search).length >= MIN_QUERY_LENGTH\n // A lookup wants the client, not the page that lists clients.\n const recordGroups = hasQuery ? (result?.groups ?? []) : []\n const recordCount = recordGroups.reduce((n, g) => n + g.hits.length, 0)\n const totalResults = rankedCommands.length + recordCount\n const nothingYet = totalResults === 0\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"saas-overlay fixed inset-0 z-[100] bg-black/40 backdrop-blur-sm\" />\n {/* Search is a PLACE on a phone, not a card floating over one. A centred\n dialog leaves the page showing round the edges, puts the field under\n the thumb's reach, and gives the results a 360px window inside a\n 660px screen. Full-bleed below sm; the desktop card is unchanged. */}\n <Dialog.Content // Desktop position lives in styles.css beside the animation that depends on\n // it — see the note there. Utilities here are the mobile full-bleed only.\n className=\"fayz-glass-surface saas-cmd-palette fixed inset-0 z-[100] flex flex-col overflow-hidden border-border/50 bg-popover shadow-2xl\">\n <Dialog.Title className=\"sr-only\">{t('layout.commandPalette.title')}</Dialog.Title>\n <Dialog.Description className=\"sr-only\">{t('layout.commandPalette.description')}</Dialog.Description>\n\n <Command className=\"flex min-h-0 flex-1 flex-col\" label=\"Command palette\" shouldFilter={false}>\n <div className=\"fz-safe-t flex shrink-0 items-center gap-3 border-b border-border/50 px-4\">\n <Search className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <Command.Input\n placeholder={t('layout.commandPalette.placeholder')}\n className=\"flex h-12 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n autoFocus\n value={search}\n onValueChange={setSearch}\n />\n {loading && <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground\" />}\n <kbd className=\"hidden shrink-0 rounded-md border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground sm:inline-block\">ESC</kbd>\n {/* Full-bleed on a phone means the page behind is gone, and with it\n every hint that tapping outside would close this. ESC is the\n desktop's way out; this is the phone's. */}\n <Dialog.Close\n aria-label={t('common.close')}\n className=\"fz-tap -mr-2 flex shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors active:bg-muted sm:hidden\"\n >\n <X className=\"h-5 w-5\" />\n </Dialog.Close>\n </div>\n\n <Command.List className=\"fz-scroll-contain min-h-0 flex-1 overflow-y-auto p-1.5 sm:max-h-[360px] sm:flex-none\">\n {nothingYet && (\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n {loading ? t('layout.commandPalette.searching') : t('layout.commandPalette.noResults')}\n </Command.Empty>\n )}\n\n {/* Records first */}\n {recordGroups.map((group) => {\n const GroupIcon = group.icon ? (ICON_MAP[group.icon] ?? User) : User\n return (\n <Command.Group key={`entity:${group.key}`} heading={group.label} className={GROUP_HEADING}>\n {group.hits.map((hit) => {\n const Icon = hit.icon ? (ICON_MAP[hit.icon] ?? GroupIcon) : GroupIcon\n return (\n <Command.Item\n key={hit.uid}\n value={hit.uid}\n onSelect={() => { onEntitySelect?.(hit); onOpenChange(false) }}\n className={ITEM}\n >\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <span className=\"block truncate\"><Highlight text={hit.title} query={search} /></span>\n {hit.subtitle && (\n <span className=\"block truncate text-[11px] text-muted-foreground\">\n <Highlight text={hit.subtitle} query={search} />\n </span>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground/40\">{group.label}</span>\n </Command.Item>\n )\n })}\n </Command.Group>\n )\n })}\n\n {/* Pages and actions */}\n {Object.entries(grouped).map(([group, items]) => (\n <Command.Group key={group} heading={group} className={GROUP_HEADING}>\n {items.map((cmd, i) => {\n const Icon = cmd.icon ? (ICON_MAP[cmd.icon] ?? null) : null\n // Command ids are not unique — \"Clientes\" and its \"Lista\"\n // child both mint `page:/clients`. Also the cmdk value.\n const uid = `${group}:${cmd.id}:${i}`\n return (\n <Command.Item\n key={uid}\n value={uid}\n onSelect={() => { cmd.action(); onOpenChange(false) }}\n className={ITEM}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"flex-1\"><Highlight text={cmd.label} query={search} /></span>\n <span className=\"text-[11px] text-muted-foreground/40\">{cmd.group}</span>\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n </Command.List>\n\n <div className=\"flex items-center justify-between border-t border-border/50 px-4 py-2\">\n <span className=\"text-xs text-muted-foreground\">\n {loading\n ? t('layout.commandPalette.searching')\n : hasQuery\n ? t('layout.commandPalette.resultCount', { count: String(totalResults), plural: totalResults !== 1 ? 's' : '' })\n : t('layout.commandPalette.commandCount', { count: String(commands.length), plural: commands.length !== 1 ? 's' : '' })}\n </span>\n <div className=\"flex items-center gap-2 text-[10px] text-muted-foreground\">\n {hasQuery && result && (\n <RefreshButton\n onRefresh={refresh}\n fromCache={result.cached}\n label={t('layout.commandPalette.refresh')}\n labelCached={t('layout.commandPalette.refreshCached')}\n className=\"rounded p-1 text-muted-foreground hover:text-foreground\"\n />\n )}\n {/* Arrow-key and Enter hints on a device with neither. They are\n the desktop's affordance; a finger just taps the row. */}\n <span className=\"hidden items-center gap-2 sm:flex\">\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">↑↓</kbd>\n <span>{t('layout.commandPalette.navigate')}</span>\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">↵</kbd>\n <span>{t('layout.commandPalette.open')}</span>\n </span>\n </div>\n </div>\n </Command>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { subscribeScheduleBlockConfig, getScheduleBlockConfig } from './chunk-RKXZ7RUG.js';
|
|
2
|
-
import { getFayzSupabaseClient } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import { useOrganizationStore } from './chunk-
|
|
2
|
+
import { getFayzSupabaseClient } from './chunk-UHHEPU4A.js';
|
|
3
|
+
import './chunk-NB6X5O5L.js';
|
|
4
|
+
import './chunk-WJ3H3RJN.js';
|
|
5
|
+
import { useOrganizationStore } from './chunk-5GWUM4SM.js';
|
|
6
6
|
import { useState, useSyncExternalStore, useEffect, useCallback, useRef } from 'react';
|
|
7
7
|
import { Clock, Save, Check, Plus, CalendarOff, CalendarPlus, Trash2, X, Copy, Settings, ChevronDown } from 'lucide-react';
|
|
8
8
|
import { toast, Skeleton, Card, CardContent, Button, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, DatePicker, Tabs, TabsList, TabsTrigger, TimePicker, ModalFooter, Badge } from '@fayz-ai/ui';
|
|
@@ -1037,5 +1037,5 @@ function ScheduleEditor({ assigneeId }) {
|
|
|
1037
1037
|
}
|
|
1038
1038
|
|
|
1039
1039
|
export { ScheduleEditor };
|
|
1040
|
-
//# sourceMappingURL=ScheduleEditor-
|
|
1041
|
-
//# sourceMappingURL=ScheduleEditor-
|
|
1040
|
+
//# sourceMappingURL=ScheduleEditor-YZPOCBTW.js.map
|
|
1041
|
+
//# sourceMappingURL=ScheduleEditor-YZPOCBTW.js.map
|