@wealthx/shadcn 1.5.5 → 1.5.7
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/.turbo/turbo-build.log +164 -158
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-2LLFNGJZ.mjs → chunk-3OOUI5TO.mjs} +1 -1
- package/dist/{chunk-AUEUTZIC.mjs → chunk-3QAQQBCM.mjs} +2 -2
- package/dist/chunk-3Z75IKFO.mjs +34 -0
- package/dist/{chunk-RAKBWNQH.mjs → chunk-5WCIGJ3E.mjs} +26 -65
- package/dist/chunk-65PZNG4Y.mjs +129 -0
- package/dist/{chunk-D447W45Z.mjs → chunk-7OLKVKJF.mjs} +41 -49
- package/dist/{chunk-UEREFDAE.mjs → chunk-AZGLSIHF.mjs} +1 -1
- package/dist/{chunk-QRVEI6J3.mjs → chunk-BQBSYM2I.mjs} +1 -3
- package/dist/{chunk-BFB3UH7V.mjs → chunk-C2QMHKLT.mjs} +1 -1
- package/dist/chunk-CEEVYRQA.mjs +61 -0
- package/dist/{chunk-VJ3GC7W3.mjs → chunk-CXGZSIQN.mjs} +4 -30
- package/dist/{chunk-VLELWBEW.mjs → chunk-E2BNCA6L.mjs} +1 -1
- package/dist/{chunk-46Q4335I.mjs → chunk-F73QFUZH.mjs} +10 -20
- package/dist/{chunk-Q35PNFJ7.mjs → chunk-FBNEIYSE.mjs} +1 -1
- package/dist/{chunk-HO6S3ECM.mjs → chunk-G4WLCKFV.mjs} +1 -1
- package/dist/{chunk-ODO6BUOF.mjs → chunk-HRHXZIX5.mjs} +1 -3
- package/dist/{chunk-IXR4BQSQ.mjs → chunk-I6QVWQCD.mjs} +1 -1
- package/dist/{chunk-PV7PNA6K.mjs → chunk-IKDTOCSY.mjs} +2 -4
- package/dist/{chunk-Q5SGEIJV.mjs → chunk-IXKE6LHN.mjs} +1 -1
- package/dist/{chunk-OL65UQHQ.mjs → chunk-JCH2BG24.mjs} +26 -60
- package/dist/{chunk-PV3Y7QGK.mjs → chunk-LHWJQNLG.mjs} +3 -3
- package/dist/{chunk-JTG5R5YV.mjs → chunk-MS4PDUSU.mjs} +284 -58
- package/dist/{chunk-VFH632TB.mjs → chunk-SDNG4XL6.mjs} +1 -1
- package/dist/{chunk-DFL5CV75.mjs → chunk-T6MMCOX6.mjs} +1 -1
- package/dist/{chunk-6TX73WG7.mjs → chunk-TCE5L44O.mjs} +3 -2
- package/dist/{chunk-HROG643K.mjs → chunk-W5QJ57PU.mjs} +1 -1
- package/dist/{chunk-EW72FINW.mjs → chunk-XVZGXPIX.mjs} +1 -1
- package/dist/components/ui/about-you-form.mjs +3 -3
- package/dist/components/ui/add-column-modal.js +56 -227
- package/dist/components/ui/add-column-modal.mjs +1 -2
- package/dist/components/ui/ai-conversations.js +278 -58
- package/dist/components/ui/ai-conversations.mjs +1 -1
- package/dist/components/ui/appointment-action-dialogs.mjs +3 -3
- package/dist/components/ui/appointment-availability-settings.js +2 -28
- package/dist/components/ui/appointment-availability-settings.mjs +4 -4
- package/dist/components/ui/appointment-book-dialog.js +11 -21
- package/dist/components/ui/appointment-book-dialog.mjs +3 -3
- package/dist/components/ui/appointment-calendar-view.mjs +2 -2
- package/dist/components/ui/appointment-detail-sheet.mjs +4 -4
- package/dist/components/ui/appointment-upcoming-card.mjs +3 -3
- package/dist/components/ui/bank-statement-generate-dialog.mjs +4 -4
- package/dist/components/ui/calendar.mjs +2 -2
- package/dist/components/ui/dashboard-transactions-table.mjs +1 -1
- package/dist/components/ui/date-picker.mjs +3 -3
- package/dist/components/ui/financial-cards.mjs +2 -2
- package/dist/components/ui/financial-sections.mjs +3 -3
- package/dist/components/ui/integration-card.js +326 -0
- package/dist/components/ui/integration-card.mjs +11 -0
- package/dist/components/ui/kanban-column.js +151 -243
- package/dist/components/ui/kanban-column.mjs +3 -4
- package/dist/components/ui/loan-application-cards.mjs +1 -1
- package/dist/components/ui/onboarding-layout.js +65 -4
- package/dist/components/ui/onboarding-layout.mjs +6 -4
- package/dist/components/ui/opportunity-card.js +126 -216
- package/dist/components/ui/opportunity-card.mjs +2 -3
- package/dist/components/ui/opportunity-edit-modals.mjs +4 -4
- package/dist/components/ui/opportunity-summary-tab.mjs +6 -6
- package/dist/components/ui/pipeline-board.js +167 -261
- package/dist/components/ui/pipeline-board.mjs +4 -5
- package/dist/components/ui/pipeline-chart.js +128 -55
- package/dist/components/ui/pipeline-chart.mjs +2 -1
- package/dist/components/ui/pipeline-dialogs.mjs +4 -4
- package/dist/components/ui/savings-goal-modal.mjs +3 -3
- package/dist/components/ui/selectable-card.js +163 -0
- package/dist/components/ui/selectable-card.mjs +9 -0
- package/dist/components/ui/sidebar-nav.js +2 -4
- package/dist/components/ui/sidebar-nav.mjs +1 -1
- package/dist/components/ui/signup-shell.js +3 -2
- package/dist/components/ui/signup-shell.mjs +2 -2
- package/dist/components/ui/stepper.js +3 -2
- package/dist/components/ui/stepper.mjs +1 -1
- package/dist/index.js +2122 -1881
- package/dist/index.mjs +56 -46
- package/dist/styles.css +1 -1
- package/package.json +11 -1
- package/src/components/index.tsx +26 -2
- package/src/components/ui/add-column-modal.tsx +9 -58
- package/src/components/ui/ai-conversations.tsx +308 -42
- package/src/components/ui/appointment-availability-settings.tsx +2 -35
- package/src/components/ui/appointment-book-dialog.tsx +25 -48
- package/src/components/ui/integration-card.tsx +88 -0
- package/src/components/ui/kanban-column.tsx +0 -7
- package/src/components/ui/onboarding-layout.tsx +102 -1
- package/src/components/ui/opportunity-card.tsx +5 -53
- package/src/components/ui/pipeline-board.tsx +0 -3
- package/src/components/ui/pipeline-chart.tsx +47 -53
- package/src/components/ui/selectable-card.tsx +37 -0
- package/src/components/ui/sidebar-nav.tsx +0 -2
- package/src/components/ui/stepper.tsx +3 -2
- package/src/lib/format-date.ts +6 -6
- package/src/styles/styles-css.ts +1 -1
- package/tsup.config.ts +2 -0
- package/dist/chunk-2P7HP7LR.mjs +0 -68
|
@@ -71,7 +71,7 @@ __export(ai_conversations_exports, {
|
|
|
71
71
|
LeadInfoPanel: () => LeadInfoPanel
|
|
72
72
|
});
|
|
73
73
|
module.exports = __toCommonJS(ai_conversations_exports);
|
|
74
|
-
var import_react3 = require("react");
|
|
74
|
+
var import_react3 = __toESM(require("react"));
|
|
75
75
|
var import_lucide_react4 = require("lucide-react");
|
|
76
76
|
|
|
77
77
|
// src/lib/utils.ts
|
|
@@ -980,6 +980,7 @@ function ConversationListItem({
|
|
|
980
980
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "truncate text-sm font-semibold text-foreground", children: displayContactName(data.contact.name) }),
|
|
981
981
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex shrink-0 items-center gap-1", children: [
|
|
982
982
|
data.status === "needs-attention" && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Flag, { className: "size-3 text-warning-text" }),
|
|
983
|
+
data.channel === "email" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Mail, { className: "size-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.MessageSquare, { className: "size-3 text-muted-foreground" }),
|
|
983
984
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "whitespace-nowrap text-xs text-muted-foreground", children: data.timestamp })
|
|
984
985
|
] })
|
|
985
986
|
] }),
|
|
@@ -1013,12 +1014,14 @@ function ConversationListItem({
|
|
|
1013
1014
|
}
|
|
1014
1015
|
);
|
|
1015
1016
|
}
|
|
1016
|
-
function filterConversations(conversations, query, filter) {
|
|
1017
|
+
function filterConversations(conversations, query, filter, channelFilter) {
|
|
1017
1018
|
const q = query.toLowerCase();
|
|
1018
1019
|
return conversations.filter((c) => {
|
|
1020
|
+
var _a;
|
|
1019
1021
|
const matchesFilter = filter === "all" || (filter === "open" ? c.status !== "closed" : c.status === filter);
|
|
1022
|
+
const matchesChannel = channelFilter === "all" || ((_a = c.channel) != null ? _a : "chat") === channelFilter;
|
|
1020
1023
|
const matchesSearch = !q || c.contact.name.toLowerCase().includes(q) || c.lastMessage.toLowerCase().includes(q);
|
|
1021
|
-
return matchesFilter && matchesSearch;
|
|
1024
|
+
return matchesFilter && matchesChannel && matchesSearch;
|
|
1022
1025
|
});
|
|
1023
1026
|
}
|
|
1024
1027
|
var FILTER_TABS = [
|
|
@@ -1033,15 +1036,25 @@ function ConversationList({
|
|
|
1033
1036
|
activeId,
|
|
1034
1037
|
searchQuery = "",
|
|
1035
1038
|
activeFilter = "all",
|
|
1039
|
+
channelFilter: channelFilterProp = "all",
|
|
1036
1040
|
hasMore,
|
|
1037
1041
|
isLoadingMore,
|
|
1038
1042
|
onSearchChange,
|
|
1039
1043
|
onFilterChange,
|
|
1044
|
+
onChannelFilterChange,
|
|
1040
1045
|
onSelect,
|
|
1041
1046
|
onRead,
|
|
1042
1047
|
onLoadMore,
|
|
1043
1048
|
className
|
|
1044
1049
|
}) {
|
|
1050
|
+
const [channelFilter, setChannelFilter] = (0, import_react3.useState)(channelFilterProp);
|
|
1051
|
+
function handleChannelFilterChange(vals) {
|
|
1052
|
+
const v = vals[0];
|
|
1053
|
+
if (v) {
|
|
1054
|
+
setChannelFilter(v);
|
|
1055
|
+
onChannelFilterChange == null ? void 0 : onChannelFilterChange(v);
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1045
1058
|
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1046
1059
|
"div",
|
|
1047
1060
|
{
|
|
@@ -1051,18 +1064,37 @@ function ConversationList({
|
|
|
1051
1064
|
),
|
|
1052
1065
|
children: [
|
|
1053
1066
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: cn(PANEL_HEADER_HEIGHT, "flex shrink-0 flex-col"), children: [
|
|
1054
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.
|
|
1055
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.
|
|
1056
|
-
|
|
1057
|
-
|
|
1067
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex shrink-0 items-center gap-2 border-b border-border px-3 py-2.5", children: [
|
|
1068
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "relative flex-1", children: [
|
|
1069
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Search, { className: "absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
1070
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1071
|
+
Input,
|
|
1072
|
+
{
|
|
1073
|
+
value: searchQuery,
|
|
1074
|
+
onChange: (e) => onSearchChange == null ? void 0 : onSearchChange(e.target.value),
|
|
1075
|
+
placeholder: "Search conversations...",
|
|
1076
|
+
className: "h-8 pl-8 text-sm"
|
|
1077
|
+
}
|
|
1078
|
+
)
|
|
1079
|
+
] }),
|
|
1080
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1081
|
+
ToggleGroup,
|
|
1058
1082
|
{
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1083
|
+
type: "single",
|
|
1084
|
+
variant: "outline",
|
|
1085
|
+
size: "sm",
|
|
1086
|
+
spacing: 0,
|
|
1087
|
+
value: [channelFilter],
|
|
1088
|
+
onValueChange: handleChannelFilterChange,
|
|
1089
|
+
className: "shrink-0",
|
|
1090
|
+
children: [
|
|
1091
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ToggleGroupItem, { value: "all", "aria-label": "All channels", children: "All" }),
|
|
1092
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ToggleGroupItem, { value: "chat", "aria-label": "Chat", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.MessageSquare, { className: "size-3.5" }) }),
|
|
1093
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ToggleGroupItem, { value: "email", "aria-label": "Email", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Mail, { className: "size-3.5" }) })
|
|
1094
|
+
]
|
|
1063
1095
|
}
|
|
1064
1096
|
)
|
|
1065
|
-
] })
|
|
1097
|
+
] }),
|
|
1066
1098
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex flex-1 items-center border-b border-border", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1067
1099
|
Tabs,
|
|
1068
1100
|
{
|
|
@@ -1092,7 +1124,8 @@ function ConversationList({
|
|
|
1092
1124
|
const filtered = filterConversations(
|
|
1093
1125
|
conversations,
|
|
1094
1126
|
searchQuery,
|
|
1095
|
-
activeFilter
|
|
1127
|
+
activeFilter,
|
|
1128
|
+
channelFilter
|
|
1096
1129
|
);
|
|
1097
1130
|
return filtered.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex flex-col items-center justify-center gap-2 p-8 text-muted-foreground", children: [
|
|
1098
1131
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.MessageSquare, { className: "size-8 opacity-30" }),
|
|
@@ -1209,6 +1242,9 @@ function ChatBubble({ message, className }) {
|
|
|
1209
1242
|
}
|
|
1210
1243
|
function ChatComposer({
|
|
1211
1244
|
mode,
|
|
1245
|
+
channel: channelProp = "chat",
|
|
1246
|
+
onChannelChange,
|
|
1247
|
+
contactEmail = "",
|
|
1212
1248
|
inputValue = "",
|
|
1213
1249
|
onInputChange,
|
|
1214
1250
|
onSend,
|
|
@@ -1216,68 +1252,234 @@ function ChatComposer({
|
|
|
1216
1252
|
onLetAiHandle,
|
|
1217
1253
|
className
|
|
1218
1254
|
}) {
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1255
|
+
const [channel, setChannel] = import_react3.default.useState(channelProp);
|
|
1256
|
+
const [emailTo, setEmailTo] = import_react3.default.useState(contactEmail);
|
|
1257
|
+
const [emailCc, setEmailCc] = import_react3.default.useState("");
|
|
1258
|
+
const [showCc, setShowCc] = import_react3.default.useState(false);
|
|
1259
|
+
const [emailSubject, setEmailSubject] = import_react3.default.useState("");
|
|
1260
|
+
const [bold, setBold] = import_react3.default.useState(false);
|
|
1261
|
+
const [italic, setItalic] = import_react3.default.useState(false);
|
|
1262
|
+
const [underline, setUnderline] = import_react3.default.useState(false);
|
|
1263
|
+
const handleChannelChange = (c) => {
|
|
1264
|
+
setChannel(c);
|
|
1265
|
+
onChannelChange == null ? void 0 : onChannelChange(c);
|
|
1266
|
+
};
|
|
1267
|
+
function ToolbarButton({
|
|
1268
|
+
label,
|
|
1269
|
+
icon: Icon,
|
|
1270
|
+
pressed,
|
|
1271
|
+
onToggle
|
|
1272
|
+
}) {
|
|
1273
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1274
|
+
"button",
|
|
1222
1275
|
{
|
|
1276
|
+
type: "button",
|
|
1277
|
+
"aria-label": label,
|
|
1278
|
+
"aria-pressed": pressed,
|
|
1279
|
+
onClick: onToggle,
|
|
1223
1280
|
className: cn(
|
|
1224
|
-
"flex items-center
|
|
1225
|
-
|
|
1281
|
+
"flex size-7 items-center justify-center transition-colors",
|
|
1282
|
+
pressed ? "bg-foreground text-background" : "text-muted-foreground hover:bg-muted hover:text-foreground"
|
|
1226
1283
|
),
|
|
1227
|
-
children:
|
|
1228
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Bot, { className: "size-3.5 shrink-0 text-muted-foreground" }),
|
|
1229
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: "AI is handling this conversation." }),
|
|
1230
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1231
|
-
Button,
|
|
1232
|
-
{
|
|
1233
|
-
variant: "link",
|
|
1234
|
-
size: "sm",
|
|
1235
|
-
className: "h-auto p-0 text-[12px] font-medium text-foreground",
|
|
1236
|
-
onClick: onTakeOver,
|
|
1237
|
-
children: "Take Over"
|
|
1238
|
-
}
|
|
1239
|
-
),
|
|
1240
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: "to reply directly." })
|
|
1241
|
-
]
|
|
1284
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { className: "size-3.5" })
|
|
1242
1285
|
}
|
|
1243
1286
|
);
|
|
1244
1287
|
}
|
|
1288
|
+
function EmailFieldRow({
|
|
1289
|
+
label,
|
|
1290
|
+
children
|
|
1291
|
+
}) {
|
|
1292
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-3 border-b border-border px-4 py-2.5", children: [
|
|
1293
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "w-14 shrink-0 text-sm text-muted-foreground", children: label }),
|
|
1294
|
+
children
|
|
1295
|
+
] });
|
|
1296
|
+
}
|
|
1245
1297
|
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1246
1298
|
"div",
|
|
1247
1299
|
{
|
|
1248
1300
|
className: cn(
|
|
1249
|
-
"flex flex-col
|
|
1301
|
+
"flex flex-col border-t border-border bg-background",
|
|
1250
1302
|
className
|
|
1251
1303
|
),
|
|
1252
1304
|
children: [
|
|
1253
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1254
|
-
|
|
1305
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "border-b border-border px-3 py-2", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1306
|
+
Tabs,
|
|
1255
1307
|
{
|
|
1256
|
-
value:
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1308
|
+
value: channel,
|
|
1309
|
+
onValueChange: (v) => v && handleChannelChange(v),
|
|
1310
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(TabsList, { variant: "default", className: "w-full", children: [
|
|
1311
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(TabsTrigger, { value: "chat", className: "flex-1 gap-1.5", children: [
|
|
1312
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.MessageSquare, { className: "size-3.5" }),
|
|
1313
|
+
"Chat"
|
|
1314
|
+
] }),
|
|
1315
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(TabsTrigger, { value: "email", className: "flex-1 gap-1.5", children: [
|
|
1316
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Mail, { className: "size-3.5" }),
|
|
1317
|
+
"Email"
|
|
1318
|
+
] })
|
|
1319
|
+
] })
|
|
1261
1320
|
}
|
|
1262
|
-
),
|
|
1263
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center
|
|
1264
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
] }),
|
|
1268
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1321
|
+
) }),
|
|
1322
|
+
mode === "ai" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-2 bg-muted/30 px-4 py-2.5 text-[12px] text-muted-foreground", children: [
|
|
1323
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Bot, { className: "size-3.5 shrink-0 text-muted-foreground" }),
|
|
1324
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: "AI is handling this conversation." }),
|
|
1325
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1269
1326
|
Button,
|
|
1270
1327
|
{
|
|
1328
|
+
variant: "link",
|
|
1271
1329
|
size: "sm",
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
children:
|
|
1275
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Send, { className: "mr-1.5 size-3.5" }),
|
|
1276
|
-
"Send"
|
|
1277
|
-
]
|
|
1330
|
+
className: "h-auto p-0 text-[12px] font-medium text-foreground",
|
|
1331
|
+
onClick: onTakeOver,
|
|
1332
|
+
children: "Take Over"
|
|
1278
1333
|
}
|
|
1279
|
-
)
|
|
1280
|
-
|
|
1334
|
+
),
|
|
1335
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: "to reply directly." })
|
|
1336
|
+
] }) : (
|
|
1337
|
+
/* Email panel stays in normal flow to anchor container height;
|
|
1338
|
+
chat panel is an absolute overlay so both tabs share identical dimensions */
|
|
1339
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "relative", children: [
|
|
1340
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1341
|
+
"div",
|
|
1342
|
+
{
|
|
1343
|
+
className: cn(
|
|
1344
|
+
"flex flex-col",
|
|
1345
|
+
channel !== "email" && "invisible pointer-events-none"
|
|
1346
|
+
),
|
|
1347
|
+
"aria-hidden": channel !== "email",
|
|
1348
|
+
children: [
|
|
1349
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(EmailFieldRow, { label: "To", children: [
|
|
1350
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1351
|
+
"input",
|
|
1352
|
+
{
|
|
1353
|
+
type: "email",
|
|
1354
|
+
value: emailTo,
|
|
1355
|
+
onChange: (e) => setEmailTo(e.target.value),
|
|
1356
|
+
placeholder: "Recipient email",
|
|
1357
|
+
className: "min-w-0 flex-1 bg-transparent text-base text-foreground outline-none placeholder:text-muted-foreground"
|
|
1358
|
+
}
|
|
1359
|
+
),
|
|
1360
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1361
|
+
"button",
|
|
1362
|
+
{
|
|
1363
|
+
type: "button",
|
|
1364
|
+
onClick: () => setShowCc((v) => !v),
|
|
1365
|
+
className: "flex shrink-0 items-center gap-0.5 text-sm text-muted-foreground hover:text-foreground",
|
|
1366
|
+
children: [
|
|
1367
|
+
"CC",
|
|
1368
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.ChevronDown, { className: "size-3.5" })
|
|
1369
|
+
]
|
|
1370
|
+
}
|
|
1371
|
+
)
|
|
1372
|
+
] }),
|
|
1373
|
+
showCc && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EmailFieldRow, { label: "CC", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1374
|
+
"input",
|
|
1375
|
+
{
|
|
1376
|
+
type: "email",
|
|
1377
|
+
value: emailCc,
|
|
1378
|
+
onChange: (e) => setEmailCc(e.target.value),
|
|
1379
|
+
placeholder: "CC email",
|
|
1380
|
+
className: "min-w-0 flex-1 bg-transparent text-base text-foreground outline-none placeholder:text-muted-foreground"
|
|
1381
|
+
}
|
|
1382
|
+
) }),
|
|
1383
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EmailFieldRow, { label: "Subject", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1384
|
+
"input",
|
|
1385
|
+
{
|
|
1386
|
+
type: "text",
|
|
1387
|
+
value: emailSubject,
|
|
1388
|
+
onChange: (e) => setEmailSubject(e.target.value),
|
|
1389
|
+
placeholder: "Email subject",
|
|
1390
|
+
className: "min-w-0 flex-1 bg-transparent text-base text-foreground outline-none placeholder:text-muted-foreground"
|
|
1391
|
+
}
|
|
1392
|
+
) }),
|
|
1393
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1394
|
+
Textarea,
|
|
1395
|
+
{
|
|
1396
|
+
value: inputValue,
|
|
1397
|
+
onChange: (e) => onInputChange == null ? void 0 : onInputChange(e.target.value),
|
|
1398
|
+
placeholder: "Write your email...",
|
|
1399
|
+
rows: 6,
|
|
1400
|
+
className: "resize-y border-0 px-4 py-3 text-base shadow-none focus-visible:ring-0"
|
|
1401
|
+
}
|
|
1402
|
+
),
|
|
1403
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center justify-between border-t border-border px-3 py-2", children: [
|
|
1404
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-0.5", children: [
|
|
1405
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1406
|
+
ToolbarButton,
|
|
1407
|
+
{
|
|
1408
|
+
label: "Bold",
|
|
1409
|
+
icon: import_lucide_react4.Bold,
|
|
1410
|
+
pressed: bold,
|
|
1411
|
+
onToggle: () => setBold((v) => !v)
|
|
1412
|
+
}
|
|
1413
|
+
),
|
|
1414
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1415
|
+
ToolbarButton,
|
|
1416
|
+
{
|
|
1417
|
+
label: "Italic",
|
|
1418
|
+
icon: import_lucide_react4.Italic,
|
|
1419
|
+
pressed: italic,
|
|
1420
|
+
onToggle: () => setItalic((v) => !v)
|
|
1421
|
+
}
|
|
1422
|
+
),
|
|
1423
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1424
|
+
ToolbarButton,
|
|
1425
|
+
{
|
|
1426
|
+
label: "Underline",
|
|
1427
|
+
icon: import_lucide_react4.Underline,
|
|
1428
|
+
pressed: underline,
|
|
1429
|
+
onToggle: () => setUnderline((v) => !v)
|
|
1430
|
+
}
|
|
1431
|
+
),
|
|
1432
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Separator, { orientation: "vertical", className: "mx-1.5 h-4" }),
|
|
1433
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ToolbarButton, { label: "Link", icon: import_lucide_react4.Link2 }),
|
|
1434
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ToolbarButton, { label: "Attach file", icon: import_lucide_react4.Paperclip })
|
|
1435
|
+
] }),
|
|
1436
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1437
|
+
Button,
|
|
1438
|
+
{
|
|
1439
|
+
size: "sm",
|
|
1440
|
+
onClick: () => onSend == null ? void 0 : onSend(inputValue),
|
|
1441
|
+
disabled: !inputValue.trim() || !emailTo.trim(),
|
|
1442
|
+
children: [
|
|
1443
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Send, { className: "mr-1.5 size-3.5" }),
|
|
1444
|
+
"Send Email"
|
|
1445
|
+
]
|
|
1446
|
+
}
|
|
1447
|
+
)
|
|
1448
|
+
] })
|
|
1449
|
+
]
|
|
1450
|
+
}
|
|
1451
|
+
),
|
|
1452
|
+
channel === "chat" && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "absolute inset-0 flex flex-col gap-3 p-4", children: [
|
|
1453
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1454
|
+
Textarea,
|
|
1455
|
+
{
|
|
1456
|
+
value: inputValue,
|
|
1457
|
+
onChange: (e) => onInputChange == null ? void 0 : onInputChange(e.target.value),
|
|
1458
|
+
placeholder: "Reply to lead...",
|
|
1459
|
+
className: "min-h-0 flex-1 resize-none text-base"
|
|
1460
|
+
}
|
|
1461
|
+
),
|
|
1462
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1463
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(Button, { variant: "outline", size: "sm", onClick: onLetAiHandle, children: [
|
|
1464
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Bot, { className: "mr-1.5 size-3.5" }),
|
|
1465
|
+
"Let AI Handle"
|
|
1466
|
+
] }),
|
|
1467
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1468
|
+
Button,
|
|
1469
|
+
{
|
|
1470
|
+
size: "sm",
|
|
1471
|
+
onClick: () => onSend == null ? void 0 : onSend(inputValue),
|
|
1472
|
+
disabled: !inputValue.trim(),
|
|
1473
|
+
children: [
|
|
1474
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react4.Send, { className: "mr-1.5 size-3.5" }),
|
|
1475
|
+
"Send"
|
|
1476
|
+
]
|
|
1477
|
+
}
|
|
1478
|
+
)
|
|
1479
|
+
] })
|
|
1480
|
+
] })
|
|
1481
|
+
] })
|
|
1482
|
+
)
|
|
1281
1483
|
]
|
|
1282
1484
|
}
|
|
1283
1485
|
);
|
|
@@ -1288,6 +1490,8 @@ function ChatThread({
|
|
|
1288
1490
|
mode,
|
|
1289
1491
|
messages,
|
|
1290
1492
|
isAiTyping = false,
|
|
1493
|
+
channel,
|
|
1494
|
+
onChannelChange,
|
|
1291
1495
|
inputValue,
|
|
1292
1496
|
onInputChange,
|
|
1293
1497
|
onSend,
|
|
@@ -1431,6 +1635,9 @@ function ChatThread({
|
|
|
1431
1635
|
ChatComposer,
|
|
1432
1636
|
{
|
|
1433
1637
|
mode,
|
|
1638
|
+
channel,
|
|
1639
|
+
onChannelChange,
|
|
1640
|
+
contactEmail: contact.email,
|
|
1434
1641
|
inputValue,
|
|
1435
1642
|
onInputChange,
|
|
1436
1643
|
onSend,
|
|
@@ -1548,6 +1755,7 @@ function LeadInfoPanel({
|
|
|
1548
1755
|
contact,
|
|
1549
1756
|
firstSeen,
|
|
1550
1757
|
source = "Website Chatbot",
|
|
1758
|
+
topic,
|
|
1551
1759
|
aiFields = [],
|
|
1552
1760
|
appointment,
|
|
1553
1761
|
internalNotes = "",
|
|
@@ -1625,7 +1833,8 @@ function LeadInfoPanel({
|
|
|
1625
1833
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContactAvatar, { name: contact.name, size: "lg" }),
|
|
1626
1834
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "min-w-0 flex-1", children: [
|
|
1627
1835
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "truncate text-sm font-semibold text-foreground", children: displayContactName(contact.name) }),
|
|
1628
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-sm text-muted-foreground", children: source })
|
|
1836
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-sm text-muted-foreground", children: source }),
|
|
1837
|
+
topic && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Badge, { variant: "secondary", className: "mt-1 text-xs", children: topic })
|
|
1629
1838
|
] })
|
|
1630
1839
|
] }),
|
|
1631
1840
|
(contact.email || contact.phone || firstSeen) && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "mt-3 flex flex-col gap-1.5", children: [
|
|
@@ -1775,8 +1984,13 @@ function ConversationsPage({
|
|
|
1775
1984
|
appointment,
|
|
1776
1985
|
leadFirstSeen,
|
|
1777
1986
|
leadSource,
|
|
1987
|
+
leadTopic,
|
|
1778
1988
|
searchQuery,
|
|
1779
1989
|
activeFilter,
|
|
1990
|
+
channelFilter,
|
|
1991
|
+
onChannelFilterChange,
|
|
1992
|
+
channel,
|
|
1993
|
+
onChannelChange,
|
|
1780
1994
|
inputValue,
|
|
1781
1995
|
internalNotes,
|
|
1782
1996
|
showLeadPanel = true,
|
|
@@ -1832,10 +2046,12 @@ function ConversationsPage({
|
|
|
1832
2046
|
activeId: activeConversationId,
|
|
1833
2047
|
searchQuery,
|
|
1834
2048
|
activeFilter,
|
|
2049
|
+
channelFilter,
|
|
1835
2050
|
hasMore,
|
|
1836
2051
|
isLoadingMore,
|
|
1837
2052
|
onSearchChange,
|
|
1838
2053
|
onFilterChange,
|
|
2054
|
+
onChannelFilterChange,
|
|
1839
2055
|
onSelect: handleSelectConversation,
|
|
1840
2056
|
onRead,
|
|
1841
2057
|
onLoadMore,
|
|
@@ -1854,6 +2070,8 @@ function ConversationsPage({
|
|
|
1854
2070
|
mode,
|
|
1855
2071
|
messages,
|
|
1856
2072
|
isAiTyping,
|
|
2073
|
+
channel,
|
|
2074
|
+
onChannelChange,
|
|
1857
2075
|
inputValue,
|
|
1858
2076
|
onInputChange,
|
|
1859
2077
|
onSend,
|
|
@@ -1870,7 +2088,8 @@ function ConversationsPage({
|
|
|
1870
2088
|
"min-w-0 flex-1 border-r border-border",
|
|
1871
2089
|
mobilePanel === "chat" ? "flex flex-col md:flex" : "hidden md:flex"
|
|
1872
2090
|
)
|
|
1873
|
-
}
|
|
2091
|
+
},
|
|
2092
|
+
contact.id
|
|
1874
2093
|
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1875
2094
|
"div",
|
|
1876
2095
|
{
|
|
@@ -1901,6 +2120,7 @@ function ConversationsPage({
|
|
|
1901
2120
|
contact,
|
|
1902
2121
|
firstSeen: leadFirstSeen,
|
|
1903
2122
|
source: leadSource,
|
|
2123
|
+
topic: leadTopic,
|
|
1904
2124
|
aiFields,
|
|
1905
2125
|
appointment,
|
|
1906
2126
|
internalNotes,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
ConversationStatusChip,
|
|
10
10
|
ConversationsPage,
|
|
11
11
|
LeadInfoPanel
|
|
12
|
-
} from "../../chunk-
|
|
12
|
+
} from "../../chunk-MS4PDUSU.mjs";
|
|
13
13
|
import "../../chunk-HNDTLT5X.mjs";
|
|
14
14
|
import "../../chunk-6SR4K5T5.mjs";
|
|
15
15
|
import "../../chunk-WE4YKBDE.mjs";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AppointmentConfirmDialog,
|
|
3
3
|
AppointmentRescheduleDialog
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-3OOUI5TO.mjs";
|
|
5
5
|
import "../../chunk-FRT3S72S.mjs";
|
|
6
6
|
import "../../chunk-2GIYVERS.mjs";
|
|
7
7
|
import "../../chunk-BS75ICOO.mjs";
|
|
8
8
|
import "../../chunk-NCUH54IZ.mjs";
|
|
9
9
|
import "../../chunk-WL6WVV47.mjs";
|
|
10
10
|
import "../../chunk-BD3DWDT4.mjs";
|
|
11
|
-
import "../../chunk-
|
|
12
|
-
import "../../chunk-
|
|
11
|
+
import "../../chunk-FBNEIYSE.mjs";
|
|
12
|
+
import "../../chunk-LHWJQNLG.mjs";
|
|
13
13
|
import "../../chunk-P7CEBZM6.mjs";
|
|
14
14
|
import "../../chunk-6QAFGZC2.mjs";
|
|
15
15
|
import "../../chunk-WDTXHLYM.mjs";
|
|
@@ -1174,32 +1174,6 @@ var MEETING_PLATFORM_OPTIONS = [
|
|
|
1174
1174
|
{ value: "microsoft-teams", label: "Microsoft Teams" },
|
|
1175
1175
|
{ value: "any", label: "Let client choose" }
|
|
1176
1176
|
];
|
|
1177
|
-
var MEETING_DURATION_OPTIONS = [
|
|
1178
|
-
{ value: "15", label: "15 minutes" },
|
|
1179
|
-
{ value: "30", label: "30 minutes" },
|
|
1180
|
-
{ value: "45", label: "45 minutes" },
|
|
1181
|
-
{ value: "60", label: "60 minutes" },
|
|
1182
|
-
{ value: "90", label: "90 minutes" }
|
|
1183
|
-
];
|
|
1184
|
-
var SCHEDULING_BUFFER_OPTIONS = [
|
|
1185
|
-
{ value: "0", label: "No buffer" },
|
|
1186
|
-
{ value: "5", label: "5 minutes" },
|
|
1187
|
-
{ value: "10", label: "10 minutes" },
|
|
1188
|
-
{ value: "15", label: "15 minutes" },
|
|
1189
|
-
{ value: "30", label: "30 minutes" }
|
|
1190
|
-
];
|
|
1191
|
-
var MAX_SLOTS_OPTIONS = [
|
|
1192
|
-
{ value: "2", label: "2 per day" },
|
|
1193
|
-
{ value: "4", label: "4 per day" },
|
|
1194
|
-
{ value: "6", label: "6 per day" },
|
|
1195
|
-
{ value: "8", label: "8 per day" },
|
|
1196
|
-
{ value: "10", label: "10 per day" },
|
|
1197
|
-
{ value: "unlimited", label: "Unlimited" }
|
|
1198
|
-
];
|
|
1199
|
-
var selectLabel = (opts, v) => {
|
|
1200
|
-
var _a, _b;
|
|
1201
|
-
return (_b = (_a = opts.find((o) => o.value === String(v))) == null ? void 0 : _a.label) != null ? _b : String(v != null ? v : "");
|
|
1202
|
-
};
|
|
1203
1177
|
var TIME_OPTIONS = (() => {
|
|
1204
1178
|
const opts = [];
|
|
1205
1179
|
for (let h = 6; h <= 21; h++) {
|
|
@@ -1585,7 +1559,7 @@ function AppointmentAvailabilitySettings({
|
|
|
1585
1559
|
value: timezone,
|
|
1586
1560
|
onValueChange: (v) => setTimezone(v),
|
|
1587
1561
|
children: [
|
|
1588
|
-
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-56", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {
|
|
1562
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-56", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {}) }),
|
|
1589
1563
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectContent, { children: TIMEZONE_OPTIONS.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: opt.value, children: opt.label }, opt.value)) })
|
|
1590
1564
|
]
|
|
1591
1565
|
}
|
|
@@ -1605,7 +1579,7 @@ function AppointmentAvailabilitySettings({
|
|
|
1605
1579
|
v
|
|
1606
1580
|
),
|
|
1607
1581
|
children: [
|
|
1608
|
-
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-48", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {
|
|
1582
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-48", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {}) }),
|
|
1609
1583
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectContent, { children: MEETING_PLATFORM_OPTIONS.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: opt.value, children: opt.label }, opt.value)) })
|
|
1610
1584
|
]
|
|
1611
1585
|
}
|
|
@@ -2,16 +2,16 @@ import {
|
|
|
2
2
|
AppointmentAvailabilitySettings,
|
|
3
3
|
MEETING_PLATFORM_OPTIONS,
|
|
4
4
|
TIMEZONE_OPTIONS
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-CXGZSIQN.mjs";
|
|
6
6
|
import "../../chunk-TAX3KL66.mjs";
|
|
7
7
|
import "../../chunk-PNSYFE3K.mjs";
|
|
8
8
|
import "../../chunk-WE4YKBDE.mjs";
|
|
9
9
|
import "../../chunk-2GIYVERS.mjs";
|
|
10
10
|
import "../../chunk-NCUH54IZ.mjs";
|
|
11
|
-
import "../../chunk-
|
|
11
|
+
import "../../chunk-C2QMHKLT.mjs";
|
|
12
12
|
import "../../chunk-C6SWS7OW.mjs";
|
|
13
|
-
import "../../chunk-
|
|
14
|
-
import "../../chunk-
|
|
13
|
+
import "../../chunk-FBNEIYSE.mjs";
|
|
14
|
+
import "../../chunk-LHWJQNLG.mjs";
|
|
15
15
|
import "../../chunk-P7CEBZM6.mjs";
|
|
16
16
|
import "../../chunk-LBTHZSBT.mjs";
|
|
17
17
|
import "../../chunk-WDTXHLYM.mjs";
|