@xenide-io/the-old-ui-theme 0.9.13 → 0.9.14
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/suite.d.mts +49 -4
- package/dist/suite.d.ts +49 -4
- package/dist/suite.js +892 -778
- package/dist/suite.mjs +617 -498
- package/package.json +1 -1
- package/src/suite/components/suite-integration-picker.test.tsx +36 -2
- package/src/suite/components/suite-integration-picker.tsx +104 -72
- package/src/suite/components/suite-notification-bell.test.tsx +12 -8
- package/src/suite/components/suite-notification-bell.tsx +23 -170
- package/src/suite/index.ts +7 -5
- package/src/suite/lib/suite-notifications.tsx +282 -0
package/dist/suite.mjs
CHANGED
|
@@ -1028,10 +1028,19 @@ function AppSwitcher({
|
|
|
1028
1028
|
}
|
|
1029
1029
|
|
|
1030
1030
|
// src/suite/components/suite-notification-bell.tsx
|
|
1031
|
-
import { useCallback, useEffect, useState as useState2 } from "react";
|
|
1032
|
-
import { useRouter } from "next/navigation";
|
|
1033
1031
|
import { Bell } from "iconoir-react";
|
|
1034
1032
|
|
|
1033
|
+
// src/suite/lib/suite-notifications.tsx
|
|
1034
|
+
import {
|
|
1035
|
+
createContext,
|
|
1036
|
+
useCallback,
|
|
1037
|
+
useContext,
|
|
1038
|
+
useEffect,
|
|
1039
|
+
useMemo,
|
|
1040
|
+
useState as useState2
|
|
1041
|
+
} from "react";
|
|
1042
|
+
import { useRouter } from "next/navigation";
|
|
1043
|
+
|
|
1035
1044
|
// src/suite/lib/apps.ts
|
|
1036
1045
|
var SUITE_APPS2 = [
|
|
1037
1046
|
{
|
|
@@ -1133,39 +1142,37 @@ function classifySuiteHref(href, bases, currentOrigin = "") {
|
|
|
1133
1142
|
return null;
|
|
1134
1143
|
}
|
|
1135
1144
|
|
|
1136
|
-
// src/suite/
|
|
1137
|
-
import { jsx as jsx6
|
|
1138
|
-
var
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
return `${Math.round(hrs / 24)}d ago`;
|
|
1145
|
+
// src/suite/lib/suite-notifications.tsx
|
|
1146
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
1147
|
+
var SUITE_NOTIFICATIONS_POLL_MS = 6e4;
|
|
1148
|
+
var SuiteNotificationsContext = createContext(null);
|
|
1149
|
+
function useSuiteNotifications() {
|
|
1150
|
+
const value = useContext(SuiteNotificationsContext);
|
|
1151
|
+
if (!value) {
|
|
1152
|
+
throw new Error(
|
|
1153
|
+
"useSuiteNotifications must be used within a SuiteNotificationsProvider"
|
|
1154
|
+
);
|
|
1155
|
+
}
|
|
1156
|
+
return value;
|
|
1149
1157
|
}
|
|
1150
|
-
function
|
|
1158
|
+
function SuiteNotificationsProvider({
|
|
1151
1159
|
fetchNotifications,
|
|
1152
1160
|
markRead,
|
|
1153
|
-
markAllRead,
|
|
1154
|
-
|
|
1161
|
+
markAllRead: markAllReadRequest,
|
|
1162
|
+
pollMs = SUITE_NOTIFICATIONS_POLL_MS,
|
|
1155
1163
|
cacheKey = "suite-notifications-cache",
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
triggerDataTest
|
|
1164
|
+
enabled = true,
|
|
1165
|
+
children
|
|
1159
1166
|
}) {
|
|
1160
1167
|
const router = useRouter();
|
|
1168
|
+
const [notifications, setNotifications] = useState2([]);
|
|
1169
|
+
const [unreadCount, setUnreadCount] = useState2(0);
|
|
1161
1170
|
const [open, setOpen] = useState2(false);
|
|
1162
|
-
const [items, setItems] = useState2([]);
|
|
1163
|
-
const [unread, setUnread] = useState2(0);
|
|
1164
1171
|
const load = useCallback(async () => {
|
|
1165
1172
|
try {
|
|
1166
1173
|
const data = await fetchNotifications();
|
|
1167
|
-
|
|
1168
|
-
|
|
1174
|
+
setNotifications(data.notifications);
|
|
1175
|
+
setUnreadCount(data.unread_count);
|
|
1169
1176
|
if (cacheKey) {
|
|
1170
1177
|
try {
|
|
1171
1178
|
sessionStorage.setItem(
|
|
@@ -1182,57 +1189,80 @@ function SuiteNotificationBell({
|
|
|
1182
1189
|
}
|
|
1183
1190
|
}, [fetchNotifications, cacheKey]);
|
|
1184
1191
|
useEffect(() => {
|
|
1192
|
+
if (!enabled) return;
|
|
1185
1193
|
if (cacheKey) {
|
|
1186
1194
|
queueMicrotask(() => {
|
|
1187
1195
|
var _a2;
|
|
1188
1196
|
try {
|
|
1189
1197
|
const raw = sessionStorage.getItem(cacheKey);
|
|
1190
|
-
if (raw)
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
}
|
|
1198
|
+
if (!raw) return;
|
|
1199
|
+
const cached = JSON.parse(raw);
|
|
1200
|
+
if (Array.isArray(cached.notifications)) {
|
|
1201
|
+
setNotifications(cached.notifications);
|
|
1202
|
+
setUnreadCount((_a2 = cached.unread_count) != null ? _a2 : 0);
|
|
1196
1203
|
}
|
|
1197
1204
|
} catch (e) {
|
|
1198
1205
|
}
|
|
1199
1206
|
});
|
|
1200
1207
|
}
|
|
1201
|
-
|
|
1202
|
-
const
|
|
1208
|
+
let timer;
|
|
1209
|
+
const stop = () => {
|
|
1210
|
+
if (timer !== void 0) {
|
|
1211
|
+
window.clearInterval(timer);
|
|
1212
|
+
timer = void 0;
|
|
1213
|
+
}
|
|
1214
|
+
};
|
|
1215
|
+
const start = () => {
|
|
1216
|
+
if (timer !== void 0) return;
|
|
1217
|
+
void load();
|
|
1218
|
+
timer = window.setInterval(() => void load(), pollMs);
|
|
1219
|
+
};
|
|
1220
|
+
const onVisibilityChange = () => {
|
|
1221
|
+
if (document.visibilityState === "visible") start();
|
|
1222
|
+
else stop();
|
|
1223
|
+
};
|
|
1224
|
+
if (document.visibilityState === "visible") start();
|
|
1225
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
1203
1226
|
return () => {
|
|
1204
|
-
|
|
1205
|
-
|
|
1227
|
+
stop();
|
|
1228
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
1206
1229
|
};
|
|
1207
|
-
}, [load, cacheKey]);
|
|
1208
|
-
const
|
|
1230
|
+
}, [enabled, load, pollMs, cacheKey]);
|
|
1231
|
+
const setOpenAndRefresh = useCallback(
|
|
1209
1232
|
(next) => {
|
|
1210
1233
|
setOpen(next);
|
|
1211
1234
|
if (next) void load();
|
|
1212
1235
|
},
|
|
1213
1236
|
[load]
|
|
1214
1237
|
);
|
|
1215
|
-
const
|
|
1216
|
-
|
|
1238
|
+
const select = useCallback(
|
|
1239
|
+
(notification) => {
|
|
1217
1240
|
setOpen(false);
|
|
1218
|
-
if (!
|
|
1219
|
-
|
|
1241
|
+
if (!notification.read_at) {
|
|
1242
|
+
setNotifications(
|
|
1220
1243
|
(prev) => prev.map(
|
|
1221
|
-
(
|
|
1244
|
+
(item) => item.id === notification.id ? __spreadProps(__spreadValues({}, item), { read_at: (/* @__PURE__ */ new Date()).toISOString() }) : item
|
|
1222
1245
|
)
|
|
1223
1246
|
);
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1247
|
+
setUnreadCount((count) => Math.max(0, count - 1));
|
|
1248
|
+
void (async () => {
|
|
1249
|
+
try {
|
|
1250
|
+
await markRead(notification.id);
|
|
1251
|
+
} catch (e) {
|
|
1252
|
+
}
|
|
1253
|
+
})();
|
|
1229
1254
|
}
|
|
1230
|
-
const target = resolveSuiteNotificationHref(
|
|
1255
|
+
const target = resolveSuiteNotificationHref(
|
|
1256
|
+
notification.href,
|
|
1257
|
+
notification.source_app
|
|
1258
|
+
);
|
|
1231
1259
|
if (!target) return;
|
|
1232
1260
|
if (/^https?:\/\//i.test(target)) {
|
|
1233
1261
|
try {
|
|
1234
1262
|
const url = new URL(target);
|
|
1235
|
-
const sourceApp = suiteAppSlugForNotificationSource(
|
|
1263
|
+
const sourceApp = suiteAppSlugForNotificationSource(
|
|
1264
|
+
notification.source_app
|
|
1265
|
+
);
|
|
1236
1266
|
const path = `${url.pathname}${url.search}${url.hash}`;
|
|
1237
1267
|
if (url.origin === window.location.origin) {
|
|
1238
1268
|
router.push(path);
|
|
@@ -1259,21 +1289,73 @@ function SuiteNotificationBell({
|
|
|
1259
1289
|
},
|
|
1260
1290
|
[router, markRead]
|
|
1261
1291
|
);
|
|
1262
|
-
const
|
|
1263
|
-
|
|
1264
|
-
(prev) => prev.map((
|
|
1292
|
+
const markAllRead = useCallback(() => {
|
|
1293
|
+
setNotifications(
|
|
1294
|
+
(prev) => prev.map((item) => {
|
|
1265
1295
|
var _a2;
|
|
1266
|
-
return __spreadProps(__spreadValues({},
|
|
1267
|
-
read_at: (_a2 =
|
|
1296
|
+
return __spreadProps(__spreadValues({}, item), {
|
|
1297
|
+
read_at: (_a2 = item.read_at) != null ? _a2 : (/* @__PURE__ */ new Date()).toISOString()
|
|
1268
1298
|
});
|
|
1269
1299
|
})
|
|
1270
1300
|
);
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1301
|
+
setUnreadCount(0);
|
|
1302
|
+
void (async () => {
|
|
1303
|
+
try {
|
|
1304
|
+
await markAllReadRequest();
|
|
1305
|
+
} catch (e) {
|
|
1306
|
+
}
|
|
1307
|
+
})();
|
|
1308
|
+
}, [markAllReadRequest]);
|
|
1309
|
+
const value = useMemo(
|
|
1310
|
+
() => ({
|
|
1311
|
+
notifications,
|
|
1312
|
+
unreadCount,
|
|
1313
|
+
open,
|
|
1314
|
+
setOpen: setOpenAndRefresh,
|
|
1315
|
+
refresh: () => void load(),
|
|
1316
|
+
select,
|
|
1317
|
+
markAllRead
|
|
1318
|
+
}),
|
|
1319
|
+
[
|
|
1320
|
+
notifications,
|
|
1321
|
+
unreadCount,
|
|
1322
|
+
open,
|
|
1323
|
+
setOpenAndRefresh,
|
|
1324
|
+
load,
|
|
1325
|
+
select,
|
|
1326
|
+
markAllRead
|
|
1327
|
+
]
|
|
1328
|
+
);
|
|
1329
|
+
return /* @__PURE__ */ jsx6(SuiteNotificationsContext.Provider, { value, children });
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
// src/suite/components/suite-notification-bell.tsx
|
|
1333
|
+
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1334
|
+
function timeAgo(iso) {
|
|
1335
|
+
const then = new Date(iso).getTime();
|
|
1336
|
+
if (Number.isNaN(then)) return "";
|
|
1337
|
+
const secs = Math.max(0, Math.round((Date.now() - then) / 1e3));
|
|
1338
|
+
if (secs < 60) return "just now";
|
|
1339
|
+
const mins = Math.round(secs / 60);
|
|
1340
|
+
if (mins < 60) return `${mins}m ago`;
|
|
1341
|
+
const hrs = Math.round(mins / 60);
|
|
1342
|
+
if (hrs < 24) return `${hrs}h ago`;
|
|
1343
|
+
return `${Math.round(hrs / 24)}d ago`;
|
|
1344
|
+
}
|
|
1345
|
+
function SuiteNotificationBell({
|
|
1346
|
+
dropdownMenu: DropdownMenu2,
|
|
1347
|
+
dataTest = "suite-notifications",
|
|
1348
|
+
triggerId,
|
|
1349
|
+
triggerDataTest
|
|
1350
|
+
}) {
|
|
1351
|
+
const {
|
|
1352
|
+
notifications,
|
|
1353
|
+
unreadCount: unread,
|
|
1354
|
+
open,
|
|
1355
|
+
setOpen,
|
|
1356
|
+
select,
|
|
1357
|
+
markAllRead
|
|
1358
|
+
} = useSuiteNotifications();
|
|
1277
1359
|
return /* @__PURE__ */ jsxs6(
|
|
1278
1360
|
DropdownMenu2,
|
|
1279
1361
|
{
|
|
@@ -1283,45 +1365,45 @@ function SuiteNotificationBell({
|
|
|
1283
1365
|
align: "end",
|
|
1284
1366
|
panelClassName: "w-80 overflow-hidden p-0",
|
|
1285
1367
|
open,
|
|
1286
|
-
onOpenChange,
|
|
1287
|
-
trigger: /* @__PURE__ */
|
|
1288
|
-
/* @__PURE__ */
|
|
1289
|
-
unread > 0 ? /* @__PURE__ */
|
|
1368
|
+
onOpenChange: setOpen,
|
|
1369
|
+
trigger: /* @__PURE__ */ jsx7("span", { className: "relative inline-flex h-11 w-11 items-center justify-center overflow-visible rounded-full text-ph-mutedtext transition hover:bg-ph-muted hover:text-ph-ink", children: /* @__PURE__ */ jsxs6("span", { className: "relative inline-flex h-5 w-5", children: [
|
|
1370
|
+
/* @__PURE__ */ jsx7(Bell, { className: "h-5 w-5", strokeWidth: 1.75, "aria-hidden": true }),
|
|
1371
|
+
unread > 0 ? /* @__PURE__ */ jsx7("span", { className: "pointer-events-none absolute -right-2 -top-2 z-[1] flex h-4 min-w-4 items-center justify-center rounded-full bg-ph-brand px-1 text-[9px] font-semibold leading-none text-[var(--ph-on-accent)] ring-2 ring-ph-surface", children: unread > 9 ? "9+" : unread }) : null
|
|
1290
1372
|
] }) }),
|
|
1291
1373
|
children: [
|
|
1292
1374
|
/* @__PURE__ */ jsxs6("div", { className: "flex items-center justify-between border-b border-ph-border px-3 py-2", children: [
|
|
1293
|
-
/* @__PURE__ */
|
|
1294
|
-
unread > 0 ? /* @__PURE__ */
|
|
1375
|
+
/* @__PURE__ */ jsx7("span", { className: "text-sm font-semibold text-ph-ink", children: "Notifications" }),
|
|
1376
|
+
unread > 0 ? /* @__PURE__ */ jsx7(
|
|
1295
1377
|
"button",
|
|
1296
1378
|
{
|
|
1297
1379
|
type: "button",
|
|
1298
1380
|
id: `${dataTest}-mark-all`,
|
|
1299
1381
|
"data-test": `${dataTest}-mark-all`,
|
|
1300
|
-
onClick:
|
|
1382
|
+
onClick: markAllRead,
|
|
1301
1383
|
className: "text-xs font-medium text-ph-brand hover:underline",
|
|
1302
1384
|
children: "Mark all read"
|
|
1303
1385
|
}
|
|
1304
1386
|
) : null
|
|
1305
1387
|
] }),
|
|
1306
|
-
/* @__PURE__ */
|
|
1388
|
+
/* @__PURE__ */ jsx7("div", { className: "max-h-80 overflow-y-auto py-1", children: notifications.length === 0 ? /* @__PURE__ */ jsx7("p", { className: "px-3 py-6 text-center text-sm text-ph-mutedtext", children: "You're all caught up." }) : notifications.map((n) => /* @__PURE__ */ jsxs6(
|
|
1307
1389
|
"button",
|
|
1308
1390
|
{
|
|
1309
1391
|
id: `${dataTest}-item-${n.id}`,
|
|
1310
1392
|
"data-test": `${dataTest}-item-${n.id}`,
|
|
1311
|
-
onClick: () =>
|
|
1393
|
+
onClick: () => select(n),
|
|
1312
1394
|
className: "flex w-full flex-col gap-0.5 px-3 py-2 text-left transition hover:bg-ph-muted",
|
|
1313
1395
|
children: [
|
|
1314
1396
|
/* @__PURE__ */ jsxs6("span", { className: "flex items-center gap-2", children: [
|
|
1315
|
-
!n.read_at ? /* @__PURE__ */
|
|
1397
|
+
!n.read_at ? /* @__PURE__ */ jsx7(
|
|
1316
1398
|
"span",
|
|
1317
1399
|
{
|
|
1318
1400
|
className: "h-1.5 w-1.5 shrink-0 rounded-full bg-ph-brand",
|
|
1319
1401
|
"aria-hidden": true
|
|
1320
1402
|
}
|
|
1321
1403
|
) : null,
|
|
1322
|
-
/* @__PURE__ */
|
|
1404
|
+
/* @__PURE__ */ jsx7("span", { className: "truncate text-sm font-medium text-ph-ink", children: n.title })
|
|
1323
1405
|
] }),
|
|
1324
|
-
n.body ? /* @__PURE__ */
|
|
1406
|
+
n.body ? /* @__PURE__ */ jsx7("span", { className: "line-clamp-2 text-xs text-ph-mutedtext", children: n.body }) : null,
|
|
1325
1407
|
/* @__PURE__ */ jsxs6("span", { className: "text-[11px] uppercase tracking-wide text-ph-subtle", children: [
|
|
1326
1408
|
n.source_app,
|
|
1327
1409
|
" \xB7 ",
|
|
@@ -1338,7 +1420,7 @@ function SuiteNotificationBell({
|
|
|
1338
1420
|
|
|
1339
1421
|
// src/suite/components/command-palette-host.tsx
|
|
1340
1422
|
import { useEffect as useEffect2, useState as useState3 } from "react";
|
|
1341
|
-
import { jsx as
|
|
1423
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1342
1424
|
function isEditableTarget() {
|
|
1343
1425
|
if (typeof document === "undefined") return false;
|
|
1344
1426
|
const el = document.activeElement;
|
|
@@ -1370,7 +1452,7 @@ function CommandPaletteHost({
|
|
|
1370
1452
|
return () => window.removeEventListener("keydown", onKey);
|
|
1371
1453
|
}, [open]);
|
|
1372
1454
|
if (!isAuthenticated) return null;
|
|
1373
|
-
return /* @__PURE__ */
|
|
1455
|
+
return /* @__PURE__ */ jsx8(
|
|
1374
1456
|
CommandPalette,
|
|
1375
1457
|
{
|
|
1376
1458
|
items,
|
|
@@ -1404,18 +1486,18 @@ function useIdleMount(timeoutMs = 1200) {
|
|
|
1404
1486
|
}
|
|
1405
1487
|
|
|
1406
1488
|
// src/suite/components/deferred-chrome.tsx
|
|
1407
|
-
import { Fragment as Fragment3, jsx as
|
|
1489
|
+
import { Fragment as Fragment3, jsx as jsx9 } from "react/jsx-runtime";
|
|
1408
1490
|
function DeferredChrome({ children }) {
|
|
1409
1491
|
const ready = useIdleMount();
|
|
1410
1492
|
if (!ready) return null;
|
|
1411
|
-
return /* @__PURE__ */
|
|
1493
|
+
return /* @__PURE__ */ jsx9(Fragment3, { children });
|
|
1412
1494
|
}
|
|
1413
1495
|
|
|
1414
1496
|
// src/suite/components/suite-mobile-drawer.tsx
|
|
1415
1497
|
import * as Dialog from "@radix-ui/react-dialog";
|
|
1416
1498
|
import { useEffect as useEffect4, useState as useState5 } from "react";
|
|
1417
1499
|
import { Xmark as X } from "iconoir-react";
|
|
1418
|
-
import { jsx as
|
|
1500
|
+
import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1419
1501
|
function SuiteMobileDrawer({
|
|
1420
1502
|
open,
|
|
1421
1503
|
onClose,
|
|
@@ -1454,8 +1536,8 @@ function SuiteMobileDrawer({
|
|
|
1454
1536
|
return () => window.clearTimeout(timeout);
|
|
1455
1537
|
}, [open, durationMs]);
|
|
1456
1538
|
if (!rendered) return null;
|
|
1457
|
-
return /* @__PURE__ */
|
|
1458
|
-
/* @__PURE__ */
|
|
1539
|
+
return /* @__PURE__ */ jsx10(Dialog.Root, { open, onOpenChange: (nextOpen) => !nextOpen && onClose(), children: /* @__PURE__ */ jsxs7(Dialog.Portal, { forceMount: true, children: [
|
|
1540
|
+
/* @__PURE__ */ jsx10(
|
|
1459
1541
|
Dialog.Overlay,
|
|
1460
1542
|
{
|
|
1461
1543
|
forceMount: true,
|
|
@@ -1469,7 +1551,7 @@ function SuiteMobileDrawer({
|
|
|
1469
1551
|
style: { transitionDuration: `${durationMs}ms` }
|
|
1470
1552
|
}
|
|
1471
1553
|
),
|
|
1472
|
-
/* @__PURE__ */
|
|
1554
|
+
/* @__PURE__ */ jsx10(Dialog.Content, { forceMount: true, asChild: true, children: /* @__PURE__ */ jsxs7(
|
|
1473
1555
|
"aside",
|
|
1474
1556
|
{
|
|
1475
1557
|
role: "dialog",
|
|
@@ -1483,7 +1565,7 @@ function SuiteMobileDrawer({
|
|
|
1483
1565
|
),
|
|
1484
1566
|
style: { transitionDuration: `${durationMs}ms` },
|
|
1485
1567
|
children: [
|
|
1486
|
-
/* @__PURE__ */
|
|
1568
|
+
/* @__PURE__ */ jsx10(Dialog.Title, { className: "sr-only", children: dialogLabel }),
|
|
1487
1569
|
showCloseButton ? /* @__PURE__ */ jsxs7(
|
|
1488
1570
|
"div",
|
|
1489
1571
|
{
|
|
@@ -1492,8 +1574,8 @@ function SuiteMobileDrawer({
|
|
|
1492
1574
|
title ? "justify-between" : "justify-end"
|
|
1493
1575
|
),
|
|
1494
1576
|
children: [
|
|
1495
|
-
title ? /* @__PURE__ */
|
|
1496
|
-
/* @__PURE__ */
|
|
1577
|
+
title ? /* @__PURE__ */ jsx10("span", { className: "truncate text-sm font-semibold text-ph-ink", children: title }) : null,
|
|
1578
|
+
/* @__PURE__ */ jsx10(Dialog.Close, { asChild: true, children: /* @__PURE__ */ jsx10(
|
|
1497
1579
|
"button",
|
|
1498
1580
|
{
|
|
1499
1581
|
type: "button",
|
|
@@ -1501,13 +1583,13 @@ function SuiteMobileDrawer({
|
|
|
1501
1583
|
"data-test": closeButtonDataTest,
|
|
1502
1584
|
className: "-mr-1.5 inline-flex h-11 w-11 items-center justify-center rounded-lg text-ph-mutedtext transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-brand",
|
|
1503
1585
|
"aria-label": closeLabel,
|
|
1504
|
-
children: /* @__PURE__ */
|
|
1586
|
+
children: /* @__PURE__ */ jsx10(X, { className: "h-4 w-4", "aria-hidden": true })
|
|
1505
1587
|
}
|
|
1506
1588
|
) })
|
|
1507
1589
|
]
|
|
1508
1590
|
}
|
|
1509
1591
|
) : null,
|
|
1510
|
-
/* @__PURE__ */
|
|
1592
|
+
/* @__PURE__ */ jsx10(
|
|
1511
1593
|
"div",
|
|
1512
1594
|
{
|
|
1513
1595
|
"data-test": "suite-mobile-drawer-body",
|
|
@@ -1523,7 +1605,7 @@ function SuiteMobileDrawer({
|
|
|
1523
1605
|
|
|
1524
1606
|
// src/suite/components/suite-mobile-header.tsx
|
|
1525
1607
|
import { Menu } from "iconoir-react";
|
|
1526
|
-
import { jsx as
|
|
1608
|
+
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1527
1609
|
function SuiteMobileHeader({
|
|
1528
1610
|
onMenuClick,
|
|
1529
1611
|
menuIcon: MenuIcon = Menu,
|
|
@@ -1544,7 +1626,7 @@ function SuiteMobileHeader({
|
|
|
1544
1626
|
className
|
|
1545
1627
|
),
|
|
1546
1628
|
children: [
|
|
1547
|
-
onMenuClick ? /* @__PURE__ */
|
|
1629
|
+
onMenuClick ? /* @__PURE__ */ jsx11(
|
|
1548
1630
|
"button",
|
|
1549
1631
|
{
|
|
1550
1632
|
type: "button",
|
|
@@ -1553,10 +1635,10 @@ function SuiteMobileHeader({
|
|
|
1553
1635
|
className: "suite-press inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-xl text-ph-ink transition-colors hover:bg-ph-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-brand",
|
|
1554
1636
|
onClick: onMenuClick,
|
|
1555
1637
|
"aria-label": menuLabel,
|
|
1556
|
-
children: /* @__PURE__ */
|
|
1638
|
+
children: /* @__PURE__ */ jsx11(MenuIcon, { className: "h-5 w-5", "aria-hidden": true })
|
|
1557
1639
|
}
|
|
1558
1640
|
) : null,
|
|
1559
|
-
/* @__PURE__ */
|
|
1641
|
+
/* @__PURE__ */ jsx11(
|
|
1560
1642
|
"div",
|
|
1561
1643
|
{
|
|
1562
1644
|
className: cn2(
|
|
@@ -1566,7 +1648,7 @@ function SuiteMobileHeader({
|
|
|
1566
1648
|
children: title
|
|
1567
1649
|
}
|
|
1568
1650
|
),
|
|
1569
|
-
actions ? /* @__PURE__ */
|
|
1651
|
+
actions ? /* @__PURE__ */ jsx11("div", { className: "flex shrink-0 items-center gap-1", children: actions }) : null
|
|
1570
1652
|
]
|
|
1571
1653
|
}
|
|
1572
1654
|
);
|
|
@@ -1578,20 +1660,20 @@ import {
|
|
|
1578
1660
|
useRef,
|
|
1579
1661
|
useState as useState6
|
|
1580
1662
|
} from "react";
|
|
1581
|
-
import { jsx as
|
|
1663
|
+
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1582
1664
|
function SuiteBreadcrumbs({ items, className }) {
|
|
1583
|
-
return /* @__PURE__ */
|
|
1665
|
+
return /* @__PURE__ */ jsx12("nav", { "aria-label": "Breadcrumb", className, children: /* @__PURE__ */ jsx12("ol", { className: "flex min-w-0 items-center gap-1.5", children: items.map((item, index) => {
|
|
1584
1666
|
const isLast = index === items.length - 1;
|
|
1585
1667
|
return /* @__PURE__ */ jsxs9("li", { className: "flex min-w-0 items-center gap-1.5", children: [
|
|
1586
|
-
index > 0 ? /* @__PURE__ */
|
|
1587
|
-
item.href && !isLast ? /* @__PURE__ */
|
|
1668
|
+
index > 0 ? /* @__PURE__ */ jsx12("span", { className: "select-none text-ph-border", "aria-hidden": "true", children: "/" }) : null,
|
|
1669
|
+
item.href && !isLast ? /* @__PURE__ */ jsx12(
|
|
1588
1670
|
"a",
|
|
1589
1671
|
{
|
|
1590
1672
|
href: item.href,
|
|
1591
1673
|
className: "truncate transition hover:text-ph-ink",
|
|
1592
1674
|
children: item.label
|
|
1593
1675
|
}
|
|
1594
|
-
) : /* @__PURE__ */
|
|
1676
|
+
) : /* @__PURE__ */ jsx12(
|
|
1595
1677
|
"span",
|
|
1596
1678
|
{
|
|
1597
1679
|
className: cn2(
|
|
@@ -1616,7 +1698,7 @@ function SuitePage({
|
|
|
1616
1698
|
role,
|
|
1617
1699
|
"aria-live": ariaLive
|
|
1618
1700
|
}) {
|
|
1619
|
-
return /* @__PURE__ */
|
|
1701
|
+
return /* @__PURE__ */ jsx12(
|
|
1620
1702
|
Component,
|
|
1621
1703
|
{
|
|
1622
1704
|
id,
|
|
@@ -1684,7 +1766,7 @@ function SuitePageHeader({
|
|
|
1684
1766
|
sentinel.remove();
|
|
1685
1767
|
};
|
|
1686
1768
|
}, [sticky]);
|
|
1687
|
-
const resolvedIcon = todayIcon ? /* @__PURE__ */
|
|
1769
|
+
const resolvedIcon = todayIcon ? /* @__PURE__ */ jsx12(
|
|
1688
1770
|
TodayTimeIcon,
|
|
1689
1771
|
{
|
|
1690
1772
|
className: cn2(
|
|
@@ -1707,10 +1789,10 @@ function SuitePageHeader({
|
|
|
1707
1789
|
),
|
|
1708
1790
|
children: [
|
|
1709
1791
|
/* @__PURE__ */ jsxs9("div", { className: "min-w-0 flex-1", children: [
|
|
1710
|
-
eyebrow ? /* @__PURE__ */
|
|
1711
|
-
breadcrumb ? /* @__PURE__ */
|
|
1792
|
+
eyebrow ? /* @__PURE__ */ jsx12("div", { className: "mb-0.5 flex min-w-0 items-center gap-1.5 text-xs text-ph-subtle", children: eyebrow }) : null,
|
|
1793
|
+
breadcrumb ? /* @__PURE__ */ jsx12("div", { className: "mb-0.5 flex min-w-0 items-center gap-1.5 text-xs text-ph-subtle", children: breadcrumb }) : null,
|
|
1712
1794
|
/* @__PURE__ */ jsxs9("div", { className: "flex min-w-0 items-center gap-3", children: [
|
|
1713
|
-
resolvedIcon ? /* @__PURE__ */
|
|
1795
|
+
resolvedIcon ? /* @__PURE__ */ jsx12(
|
|
1714
1796
|
"div",
|
|
1715
1797
|
{
|
|
1716
1798
|
className: "hidden shrink-0 sm:flex sm:items-center [&_svg]:h-6 [&_svg]:w-6",
|
|
@@ -1719,7 +1801,7 @@ function SuitePageHeader({
|
|
|
1719
1801
|
}
|
|
1720
1802
|
) : null,
|
|
1721
1803
|
/* @__PURE__ */ jsxs9("div", { className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
1722
|
-
/* @__PURE__ */
|
|
1804
|
+
/* @__PURE__ */ jsx12(
|
|
1723
1805
|
"h1",
|
|
1724
1806
|
{
|
|
1725
1807
|
className: cn2(
|
|
@@ -1729,10 +1811,10 @@ function SuitePageHeader({
|
|
|
1729
1811
|
children: title
|
|
1730
1812
|
}
|
|
1731
1813
|
),
|
|
1732
|
-
badge ? /* @__PURE__ */
|
|
1814
|
+
badge ? /* @__PURE__ */ jsx12("span", { className: "rounded-md bg-ph-muted px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-ph-subtle", children: badge }) : null
|
|
1733
1815
|
] })
|
|
1734
1816
|
] }),
|
|
1735
|
-
description ? /* @__PURE__ */
|
|
1817
|
+
description ? /* @__PURE__ */ jsx12(
|
|
1736
1818
|
"div",
|
|
1737
1819
|
{
|
|
1738
1820
|
className: cn2(
|
|
@@ -1743,7 +1825,7 @@ function SuitePageHeader({
|
|
|
1743
1825
|
}
|
|
1744
1826
|
) : null
|
|
1745
1827
|
] }),
|
|
1746
|
-
actions ? /* @__PURE__ */
|
|
1828
|
+
actions ? /* @__PURE__ */ jsx12("div", { className: "flex max-w-full items-center gap-2 self-stretch overflow-x-auto pb-1 sm:shrink-0 sm:self-center sm:overflow-visible sm:pb-0", children: actions }) : null
|
|
1747
1829
|
]
|
|
1748
1830
|
}
|
|
1749
1831
|
);
|
|
@@ -1754,7 +1836,7 @@ function SuiteToolbar({
|
|
|
1754
1836
|
label = "Page tools",
|
|
1755
1837
|
dataTest
|
|
1756
1838
|
}) {
|
|
1757
|
-
return /* @__PURE__ */
|
|
1839
|
+
return /* @__PURE__ */ jsx12(
|
|
1758
1840
|
"div",
|
|
1759
1841
|
{
|
|
1760
1842
|
role: "toolbar",
|
|
@@ -1771,7 +1853,7 @@ function SuiteTabList({
|
|
|
1771
1853
|
label,
|
|
1772
1854
|
dataTest
|
|
1773
1855
|
}) {
|
|
1774
|
-
return /* @__PURE__ */
|
|
1856
|
+
return /* @__PURE__ */ jsx12(
|
|
1775
1857
|
"nav",
|
|
1776
1858
|
{
|
|
1777
1859
|
"aria-label": label,
|
|
@@ -1799,17 +1881,17 @@ function SuiteSectionHeader({
|
|
|
1799
1881
|
),
|
|
1800
1882
|
children: [
|
|
1801
1883
|
/* @__PURE__ */ jsxs9("div", { className: "min-w-0", children: [
|
|
1802
|
-
/* @__PURE__ */
|
|
1803
|
-
description ? /* @__PURE__ */
|
|
1884
|
+
/* @__PURE__ */ jsx12("h2", { className: "font-display text-balance text-lg font-semibold tracking-tight text-ph-ink sm:text-xl", children: title }),
|
|
1885
|
+
description ? /* @__PURE__ */ jsx12("div", { className: "mt-1 max-w-2xl text-pretty text-sm leading-5 text-ph-subtle", children: description }) : null
|
|
1804
1886
|
] }),
|
|
1805
|
-
action ? /* @__PURE__ */
|
|
1887
|
+
action ? /* @__PURE__ */ jsx12("div", { className: "flex min-h-[44px] shrink-0 items-center", children: action }) : null
|
|
1806
1888
|
]
|
|
1807
1889
|
}
|
|
1808
1890
|
);
|
|
1809
1891
|
}
|
|
1810
1892
|
|
|
1811
1893
|
// src/suite/components/suite-settings-layout.tsx
|
|
1812
|
-
import { jsx as
|
|
1894
|
+
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1813
1895
|
function SuiteSettingsLayout({
|
|
1814
1896
|
children,
|
|
1815
1897
|
sidebar,
|
|
@@ -1829,7 +1911,7 @@ function SuiteSettingsLayout({
|
|
|
1829
1911
|
dataTest,
|
|
1830
1912
|
className: cn2("flex h-full flex-col overflow-hidden", className),
|
|
1831
1913
|
children: [
|
|
1832
|
-
header != null ? header : /* @__PURE__ */
|
|
1914
|
+
header != null ? header : /* @__PURE__ */ jsx13(
|
|
1833
1915
|
SuitePageHeader,
|
|
1834
1916
|
{
|
|
1835
1917
|
sticky: true,
|
|
@@ -1839,9 +1921,9 @@ function SuiteSettingsLayout({
|
|
|
1839
1921
|
}
|
|
1840
1922
|
),
|
|
1841
1923
|
loading != null ? loading : /* @__PURE__ */ jsxs10("div", { className: "suite-page-body mt-6 flex min-h-0 flex-1 flex-col", children: [
|
|
1842
|
-
mobileNav ? /* @__PURE__ */
|
|
1924
|
+
mobileNav ? /* @__PURE__ */ jsx13("div", { className: "sticky top-0 z-20 mb-2 shrink-0 bg-ph-canvas/95 backdrop-blur lg:hidden", children: mobileNav }) : null,
|
|
1843
1925
|
/* @__PURE__ */ jsxs10("div", { className: "flex min-h-0 flex-1 flex-col gap-6 lg:flex-row lg:gap-8", children: [
|
|
1844
|
-
/* @__PURE__ */
|
|
1926
|
+
/* @__PURE__ */ jsx13(
|
|
1845
1927
|
"aside",
|
|
1846
1928
|
{
|
|
1847
1929
|
"aria-label": "Settings",
|
|
@@ -1849,7 +1931,7 @@ function SuiteSettingsLayout({
|
|
|
1849
1931
|
children: sidebar
|
|
1850
1932
|
}
|
|
1851
1933
|
),
|
|
1852
|
-
/* @__PURE__ */
|
|
1934
|
+
/* @__PURE__ */ jsx13(
|
|
1853
1935
|
"div",
|
|
1854
1936
|
{
|
|
1855
1937
|
className: cn2(
|
|
@@ -1870,7 +1952,7 @@ function SuiteSettingsLayout({
|
|
|
1870
1952
|
import Image2 from "next/image";
|
|
1871
1953
|
import { useRouter as useRouter2 } from "next/navigation";
|
|
1872
1954
|
import { LogOut, Settings } from "iconoir-react";
|
|
1873
|
-
import { jsx as
|
|
1955
|
+
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1874
1956
|
function computeInitials(name, email) {
|
|
1875
1957
|
const source = (name || email || "?").trim();
|
|
1876
1958
|
return source.split(/[\s@]+/).filter(Boolean).slice(0, 2).map((part) => part[0]).join("").toUpperCase();
|
|
@@ -1908,7 +1990,7 @@ function SuiteUserMenu({
|
|
|
1908
1990
|
const router = useRouter2();
|
|
1909
1991
|
const initials = fallbackInitials != null ? fallbackInitials : computeInitials(name, email);
|
|
1910
1992
|
const fallbackColor = avatarColorClass(email || name || "?");
|
|
1911
|
-
const avatar = /* @__PURE__ */
|
|
1993
|
+
const avatar = /* @__PURE__ */ jsx14("span", { className: "inline-flex h-10 w-10 items-center justify-center", children: /* @__PURE__ */ jsx14("span", { className: "inline-flex h-8 w-8 items-center justify-center overflow-hidden rounded-full border border-ph-border", children: image ? /* @__PURE__ */ jsx14(
|
|
1912
1994
|
Image2,
|
|
1913
1995
|
{
|
|
1914
1996
|
src: image,
|
|
@@ -1918,7 +2000,7 @@ function SuiteUserMenu({
|
|
|
1918
2000
|
className: "h-full w-full object-cover",
|
|
1919
2001
|
unoptimized: true
|
|
1920
2002
|
}
|
|
1921
|
-
) : /* @__PURE__ */
|
|
2003
|
+
) : /* @__PURE__ */ jsx14(
|
|
1922
2004
|
"span",
|
|
1923
2005
|
{
|
|
1924
2006
|
className: cn2(
|
|
@@ -1931,8 +2013,8 @@ function SuiteUserMenu({
|
|
|
1931
2013
|
const trigger = showDetails ? /* @__PURE__ */ jsxs11("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
1932
2014
|
avatar,
|
|
1933
2015
|
/* @__PURE__ */ jsxs11("span", { className: "flex min-w-0 flex-col text-left", children: [
|
|
1934
|
-
/* @__PURE__ */
|
|
1935
|
-
subtitle ? /* @__PURE__ */
|
|
2016
|
+
/* @__PURE__ */ jsx14("span", { className: "truncate text-sm font-medium text-ph-ink", children: name || email || "Account" }),
|
|
2017
|
+
subtitle ? /* @__PURE__ */ jsx14("span", { className: "truncate text-xs text-ph-mutedtext", children: subtitle }) : null
|
|
1936
2018
|
] })
|
|
1937
2019
|
] }) : avatar;
|
|
1938
2020
|
const accountMenu = /* @__PURE__ */ jsxs11(
|
|
@@ -1955,23 +2037,23 @@ function SuiteUserMenu({
|
|
|
1955
2037
|
"data-test": dataTest,
|
|
1956
2038
|
children: [
|
|
1957
2039
|
/* @__PURE__ */ jsxs11("div", { className: "px-2 py-1.5", children: [
|
|
1958
|
-
/* @__PURE__ */
|
|
1959
|
-
email ? /* @__PURE__ */
|
|
2040
|
+
/* @__PURE__ */ jsx14("p", { className: "truncate text-sm font-medium text-ph-ink", children: name || email || "Account" }),
|
|
2041
|
+
email ? /* @__PURE__ */ jsx14("p", { className: "truncate text-xs text-ph-mutedtext", children: email }) : null
|
|
1960
2042
|
] }),
|
|
1961
|
-
/* @__PURE__ */
|
|
2043
|
+
/* @__PURE__ */ jsx14("div", { className: "my-1 border-t border-ph-border" }),
|
|
1962
2044
|
/* @__PURE__ */ jsxs11(
|
|
1963
2045
|
DropdownItem,
|
|
1964
2046
|
{
|
|
1965
2047
|
"data-test": `${dataTest}-settings`,
|
|
1966
2048
|
onClick: () => router.push(settingsHref),
|
|
1967
2049
|
children: [
|
|
1968
|
-
/* @__PURE__ */
|
|
2050
|
+
/* @__PURE__ */ jsx14(Settings, { className: "h-4 w-4 text-ph-mutedtext", "aria-hidden": true }),
|
|
1969
2051
|
"Profile settings"
|
|
1970
2052
|
]
|
|
1971
2053
|
}
|
|
1972
2054
|
),
|
|
1973
2055
|
/* @__PURE__ */ jsxs11(DropdownItem, { "data-test": `${dataTest}-sign-out`, onClick: onSignOut, children: [
|
|
1974
|
-
/* @__PURE__ */
|
|
2056
|
+
/* @__PURE__ */ jsx14(LogOut, { className: "h-4 w-4 text-ph-mutedtext", "aria-hidden": true }),
|
|
1975
2057
|
"Sign out"
|
|
1976
2058
|
] })
|
|
1977
2059
|
]
|
|
@@ -1988,8 +2070,8 @@ function SuiteUserMenu({
|
|
|
1988
2070
|
className
|
|
1989
2071
|
),
|
|
1990
2072
|
children: [
|
|
1991
|
-
/* @__PURE__ */
|
|
1992
|
-
/* @__PURE__ */
|
|
2073
|
+
/* @__PURE__ */ jsx14("div", { className: "shrink-0", children: accountMenu }),
|
|
2074
|
+
/* @__PURE__ */ jsx14(
|
|
1993
2075
|
"button",
|
|
1994
2076
|
{
|
|
1995
2077
|
type: "button",
|
|
@@ -1998,7 +2080,7 @@ function SuiteUserMenu({
|
|
|
1998
2080
|
"aria-label": "Sign out",
|
|
1999
2081
|
className: "inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg text-ph-mutedtext transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ph-focus-ring",
|
|
2000
2082
|
onClick: onSignOut,
|
|
2001
|
-
children: /* @__PURE__ */
|
|
2083
|
+
children: /* @__PURE__ */ jsx14(LogOut, { className: "h-4 w-4", "aria-hidden": true })
|
|
2002
2084
|
}
|
|
2003
2085
|
)
|
|
2004
2086
|
]
|
|
@@ -2008,7 +2090,7 @@ function SuiteUserMenu({
|
|
|
2008
2090
|
|
|
2009
2091
|
// src/suite/components/suite-bottom-nav.tsx
|
|
2010
2092
|
import Link from "next/link";
|
|
2011
|
-
import { Fragment as Fragment4, jsx as
|
|
2093
|
+
import { Fragment as Fragment4, jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
2012
2094
|
function SuiteBottomNav({
|
|
2013
2095
|
items,
|
|
2014
2096
|
ariaLabel = "Primary navigation",
|
|
@@ -2022,7 +2104,7 @@ function SuiteBottomNav({
|
|
|
2022
2104
|
}
|
|
2023
2105
|
const activeIndex = items.findIndex((item) => item.active);
|
|
2024
2106
|
return /* @__PURE__ */ jsxs12(Fragment4, { children: [
|
|
2025
|
-
/* @__PURE__ */
|
|
2107
|
+
/* @__PURE__ */ jsx15(
|
|
2026
2108
|
"div",
|
|
2027
2109
|
{
|
|
2028
2110
|
"aria-hidden": true,
|
|
@@ -2045,7 +2127,7 @@ function SuiteBottomNav({
|
|
|
2045
2127
|
"--suite-nav-active": activeIndex >= 0 ? activeIndex : 0
|
|
2046
2128
|
},
|
|
2047
2129
|
children: [
|
|
2048
|
-
activeIndex >= 0 ? /* @__PURE__ */
|
|
2130
|
+
activeIndex >= 0 ? /* @__PURE__ */ jsx15("span", { "aria-hidden": true, className: "suite-bottom-nav__indicator" }) : null,
|
|
2049
2131
|
items.map((item) => {
|
|
2050
2132
|
var _a2;
|
|
2051
2133
|
const Icon = item.icon;
|
|
@@ -2062,14 +2144,14 @@ function SuiteBottomNav({
|
|
|
2062
2144
|
active && "font-semibold text-ph-brand"
|
|
2063
2145
|
),
|
|
2064
2146
|
children: [
|
|
2065
|
-
/* @__PURE__ */
|
|
2147
|
+
/* @__PURE__ */ jsx15(
|
|
2066
2148
|
"span",
|
|
2067
2149
|
{
|
|
2068
2150
|
className: cn2(
|
|
2069
2151
|
"suite-bottom-nav__icon relative z-10 inline-flex items-center justify-center",
|
|
2070
2152
|
active && "suite-bottom-nav__icon--active"
|
|
2071
2153
|
),
|
|
2072
|
-
children: /* @__PURE__ */
|
|
2154
|
+
children: /* @__PURE__ */ jsx15(
|
|
2073
2155
|
Icon,
|
|
2074
2156
|
{
|
|
2075
2157
|
className: "h-6 w-6",
|
|
@@ -2079,7 +2161,7 @@ function SuiteBottomNav({
|
|
|
2079
2161
|
)
|
|
2080
2162
|
}
|
|
2081
2163
|
),
|
|
2082
|
-
/* @__PURE__ */
|
|
2164
|
+
/* @__PURE__ */ jsx15("span", { className: "relative z-10 max-w-full truncate", children: item.label })
|
|
2083
2165
|
]
|
|
2084
2166
|
},
|
|
2085
2167
|
item.href
|
|
@@ -2093,7 +2175,7 @@ function SuiteBottomNav({
|
|
|
2093
2175
|
|
|
2094
2176
|
// src/suite/components/today-calibrating.tsx
|
|
2095
2177
|
import { Refresh as RefreshCw2, SunLight as Sun } from "iconoir-react";
|
|
2096
|
-
import { jsx as
|
|
2178
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2097
2179
|
function TodayCalibrating({
|
|
2098
2180
|
onRetry,
|
|
2099
2181
|
retrying = false,
|
|
@@ -2112,17 +2194,17 @@ function TodayCalibrating({
|
|
|
2112
2194
|
),
|
|
2113
2195
|
"data-test": "today-calibrating",
|
|
2114
2196
|
children: [
|
|
2115
|
-
/* @__PURE__ */
|
|
2197
|
+
/* @__PURE__ */ jsx16(
|
|
2116
2198
|
"div",
|
|
2117
2199
|
{
|
|
2118
2200
|
className: "pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_50%_35%,rgba(251,191,36,0.1),transparent_55%)]",
|
|
2119
2201
|
"aria-hidden": true
|
|
2120
2202
|
}
|
|
2121
2203
|
),
|
|
2122
|
-
/* @__PURE__ */
|
|
2123
|
-
/* @__PURE__ */
|
|
2124
|
-
/* @__PURE__ */
|
|
2125
|
-
/* @__PURE__ */
|
|
2204
|
+
/* @__PURE__ */ jsx16("div", { className: "relative mb-5 flex h-14 w-14 items-center justify-center rounded-2xl border border-ph-border bg-ph-surface text-ph-ink shadow-sm", children: /* @__PURE__ */ jsx16(Sun, { className: "h-8 w-8", strokeWidth: 2, "aria-hidden": true }) }),
|
|
2205
|
+
/* @__PURE__ */ jsx16("h2", { className: "relative text-base font-semibold tracking-tight text-ph-ink sm:text-lg md:text-xl", children: "Calibrating your day" }),
|
|
2206
|
+
/* @__PURE__ */ jsx16("p", { className: "relative mt-1.5 max-w-sm text-sm sm:text-[15px] leading-relaxed text-ph-subtle", children: "Pulling together tasks, time and updates from your workspace\u2026" }),
|
|
2207
|
+
/* @__PURE__ */ jsx16("div", { className: "relative mt-5 flex justify-center", children: /* @__PURE__ */ jsx16(Spinner, { size: "sm", className: "opacity-70", label: "Loading today" }) }),
|
|
2126
2208
|
onRetry ? /* @__PURE__ */ jsxs13(
|
|
2127
2209
|
"button",
|
|
2128
2210
|
{
|
|
@@ -2131,7 +2213,7 @@ function TodayCalibrating({
|
|
|
2131
2213
|
disabled: retrying,
|
|
2132
2214
|
className: "relative mt-6 inline-flex items-center gap-2 rounded-xl border border-ph-border bg-ph-canvas px-4 py-2 text-sm font-medium text-ph-ink transition hover:bg-ph-muted disabled:opacity-60",
|
|
2133
2215
|
children: [
|
|
2134
|
-
retrying ? /* @__PURE__ */
|
|
2216
|
+
retrying ? /* @__PURE__ */ jsx16(Spinner, { size: "sm", className: retrySpinnerClassName }) : /* @__PURE__ */ jsx16(RefreshCw2, { className: "h-4 w-4", "aria-hidden": true }),
|
|
2135
2217
|
"Try again"
|
|
2136
2218
|
]
|
|
2137
2219
|
}
|
|
@@ -2143,11 +2225,11 @@ function TodayCalibrating({
|
|
|
2143
2225
|
|
|
2144
2226
|
// src/suite/components/theme-provider.tsx
|
|
2145
2227
|
import {
|
|
2146
|
-
createContext,
|
|
2228
|
+
createContext as createContext2,
|
|
2147
2229
|
useCallback as useCallback2,
|
|
2148
|
-
useContext,
|
|
2230
|
+
useContext as useContext2,
|
|
2149
2231
|
useEffect as useEffect6,
|
|
2150
|
-
useMemo,
|
|
2232
|
+
useMemo as useMemo2,
|
|
2151
2233
|
useRef as useRef2,
|
|
2152
2234
|
useState as useState7
|
|
2153
2235
|
} from "react";
|
|
@@ -2199,8 +2281,8 @@ function clearCookie(name) {
|
|
|
2199
2281
|
}
|
|
2200
2282
|
|
|
2201
2283
|
// src/suite/components/theme-provider.tsx
|
|
2202
|
-
import { jsx as
|
|
2203
|
-
var SuiteThemeContext =
|
|
2284
|
+
import { jsx as jsx17 } from "react/jsx-runtime";
|
|
2285
|
+
var SuiteThemeContext = createContext2(null);
|
|
2204
2286
|
var suiteThemeChannel = null;
|
|
2205
2287
|
function broadcastTheme(theme) {
|
|
2206
2288
|
if (typeof BroadcastChannel === "undefined") return;
|
|
@@ -2364,14 +2446,14 @@ function SuiteThemeProvider({
|
|
|
2364
2446
|
const next = resolveTheme(themeRef.current, config.fallbackTheme) === "dark" ? "light" : "dark";
|
|
2365
2447
|
setTheme(next);
|
|
2366
2448
|
}, [config, setTheme]);
|
|
2367
|
-
const value =
|
|
2449
|
+
const value = useMemo2(
|
|
2368
2450
|
() => ({ theme: state.theme, resolvedTheme: state.resolvedTheme, setTheme, toggleTheme }),
|
|
2369
2451
|
[state.theme, state.resolvedTheme, setTheme, toggleTheme]
|
|
2370
2452
|
);
|
|
2371
|
-
return /* @__PURE__ */
|
|
2453
|
+
return /* @__PURE__ */ jsx17(SuiteThemeContext.Provider, { value, children });
|
|
2372
2454
|
}
|
|
2373
2455
|
function useSuiteTheme() {
|
|
2374
|
-
const ctx =
|
|
2456
|
+
const ctx = useContext2(SuiteThemeContext);
|
|
2375
2457
|
if (!ctx) throw new Error("useTheme must be used within ThemeProvider");
|
|
2376
2458
|
return ctx;
|
|
2377
2459
|
}
|
|
@@ -2398,7 +2480,7 @@ import {
|
|
|
2398
2480
|
Square,
|
|
2399
2481
|
WarningTriangle
|
|
2400
2482
|
} from "iconoir-react";
|
|
2401
|
-
import { Fragment as Fragment5, jsx as
|
|
2483
|
+
import { Fragment as Fragment5, jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2402
2484
|
var SuiteAiMarkdownMessage = lazy(() => import("./ai-message-markdown-AUEMCO7K.mjs"));
|
|
2403
2485
|
var SUITE_OPEN_ASK_AI_EVENT = "shellstack:open-ask-ai";
|
|
2404
2486
|
var SUITE_ASK_AI_OPEN_KEY = "shellstack:shelly-open";
|
|
@@ -2775,7 +2857,7 @@ function SuiteAiPanel({
|
|
|
2775
2857
|
"aria-label": title,
|
|
2776
2858
|
children: [
|
|
2777
2859
|
/* @__PURE__ */ jsxs14("header", { className: "flex items-center gap-2 px-2 pb-2", children: [
|
|
2778
|
-
/* @__PURE__ */
|
|
2860
|
+
/* @__PURE__ */ jsx18("h2", { className: "sr-only", children: title }),
|
|
2779
2861
|
messages.length > 0 ? /* @__PURE__ */ jsxs14(
|
|
2780
2862
|
"button",
|
|
2781
2863
|
{
|
|
@@ -2785,7 +2867,7 @@ function SuiteAiPanel({
|
|
|
2785
2867
|
className: "ml-auto inline-flex h-9 items-center gap-1.5 rounded-lg px-2 text-xs font-medium text-ph-subtle transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus disabled:opacity-40",
|
|
2786
2868
|
"data-test": "ask-ai-clear",
|
|
2787
2869
|
children: [
|
|
2788
|
-
/* @__PURE__ */
|
|
2870
|
+
/* @__PURE__ */ jsx18(Erase, { className: "h-3.5 w-3.5" }),
|
|
2789
2871
|
"Clear"
|
|
2790
2872
|
]
|
|
2791
2873
|
}
|
|
@@ -2804,14 +2886,14 @@ function SuiteAiPanel({
|
|
|
2804
2886
|
className: "suite-scroll-lock h-full space-y-5 overflow-y-auto px-2 py-3",
|
|
2805
2887
|
children: [
|
|
2806
2888
|
hydrating && messages.length === 0 ? /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-2 text-sm text-ph-subtle", children: [
|
|
2807
|
-
/* @__PURE__ */
|
|
2889
|
+
/* @__PURE__ */ jsx18(Spinner, { className: "h-4 w-4 animate-spin" }),
|
|
2808
2890
|
"Loading your chat\u2026"
|
|
2809
2891
|
] }) : null,
|
|
2810
2892
|
!hydrating && messages.length === 0 && !error ? /* @__PURE__ */ jsxs14("div", { className: "mx-auto mt-4 flex max-w-sm flex-col items-center px-1 text-center", children: [
|
|
2811
|
-
/* @__PURE__ */
|
|
2812
|
-
/* @__PURE__ */
|
|
2813
|
-
/* @__PURE__ */
|
|
2814
|
-
presets.length > 0 ? /* @__PURE__ */
|
|
2893
|
+
/* @__PURE__ */ jsx18("span", { className: "flex h-10 w-10 items-center justify-center rounded-2xl bg-ph-brand/10 text-ph-brand", children: /* @__PURE__ */ jsx18(Icon, { className: "h-5 w-5" }) }),
|
|
2894
|
+
/* @__PURE__ */ jsx18("p", { className: "mt-3 font-display text-base font-semibold text-ph-ink", children: "How can I help?" }),
|
|
2895
|
+
/* @__PURE__ */ jsx18("p", { className: "mt-1 text-sm leading-relaxed text-ph-subtle", children: emptyState }),
|
|
2896
|
+
presets.length > 0 ? /* @__PURE__ */ jsx18("div", { className: "mt-4 flex w-full flex-col gap-2", children: presets.map((preset) => /* @__PURE__ */ jsxs14(
|
|
2815
2897
|
"button",
|
|
2816
2898
|
{
|
|
2817
2899
|
type: "button",
|
|
@@ -2819,9 +2901,9 @@ function SuiteAiPanel({
|
|
|
2819
2901
|
disabled: waiting || hydrating,
|
|
2820
2902
|
className: "group flex w-full items-center gap-2 rounded-xl border border-ph-border bg-ph-surface px-3 py-2 text-left text-sm text-ph-ink transition-colors hover:border-ph-brand/40 hover:bg-ph-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus disabled:opacity-40",
|
|
2821
2903
|
children: [
|
|
2822
|
-
/* @__PURE__ */
|
|
2823
|
-
/* @__PURE__ */
|
|
2824
|
-
/* @__PURE__ */
|
|
2904
|
+
/* @__PURE__ */ jsx18(Sparks, { className: "h-4 w-4 shrink-0 text-ph-brand" }),
|
|
2905
|
+
/* @__PURE__ */ jsx18("span", { className: "min-w-0 flex-1 truncate", children: preset.label }),
|
|
2906
|
+
/* @__PURE__ */ jsx18(ArrowUp, { className: "h-3.5 w-3.5 shrink-0 rotate-45 text-ph-mutedtext transition-transform group-hover:translate-x-0.5" })
|
|
2825
2907
|
]
|
|
2826
2908
|
},
|
|
2827
2909
|
preset.label
|
|
@@ -2832,13 +2914,13 @@ function SuiteAiPanel({
|
|
|
2832
2914
|
const isUser = message.role === "user";
|
|
2833
2915
|
if (isUser) {
|
|
2834
2916
|
if (editingIndex === index) {
|
|
2835
|
-
return /* @__PURE__ */
|
|
2917
|
+
return /* @__PURE__ */ jsx18(
|
|
2836
2918
|
"div",
|
|
2837
2919
|
{
|
|
2838
2920
|
className: "suite-msg-in suite-msg-in--user flex justify-end",
|
|
2839
2921
|
"data-test": "ask-ai-user",
|
|
2840
2922
|
children: /* @__PURE__ */ jsxs14("div", { className: "w-full max-w-[85%] space-y-2", children: [
|
|
2841
|
-
/* @__PURE__ */
|
|
2923
|
+
/* @__PURE__ */ jsx18(
|
|
2842
2924
|
"textarea",
|
|
2843
2925
|
{
|
|
2844
2926
|
autoFocus: true,
|
|
@@ -2860,7 +2942,7 @@ function SuiteAiPanel({
|
|
|
2860
2942
|
}
|
|
2861
2943
|
),
|
|
2862
2944
|
/* @__PURE__ */ jsxs14("div", { className: "flex justify-end gap-2", children: [
|
|
2863
|
-
/* @__PURE__ */
|
|
2945
|
+
/* @__PURE__ */ jsx18(
|
|
2864
2946
|
"button",
|
|
2865
2947
|
{
|
|
2866
2948
|
type: "button",
|
|
@@ -2872,7 +2954,7 @@ function SuiteAiPanel({
|
|
|
2872
2954
|
children: "Cancel"
|
|
2873
2955
|
}
|
|
2874
2956
|
),
|
|
2875
|
-
/* @__PURE__ */
|
|
2957
|
+
/* @__PURE__ */ jsx18(
|
|
2876
2958
|
"button",
|
|
2877
2959
|
{
|
|
2878
2960
|
type: "button",
|
|
@@ -2889,14 +2971,14 @@ function SuiteAiPanel({
|
|
|
2889
2971
|
`user-${index}`
|
|
2890
2972
|
);
|
|
2891
2973
|
}
|
|
2892
|
-
return /* @__PURE__ */
|
|
2974
|
+
return /* @__PURE__ */ jsx18(
|
|
2893
2975
|
"div",
|
|
2894
2976
|
{
|
|
2895
2977
|
className: "suite-msg-in suite-msg-in--user flex justify-end",
|
|
2896
2978
|
"data-test": "ask-ai-user",
|
|
2897
2979
|
children: /* @__PURE__ */ jsxs14("div", { className: "group flex items-end gap-1.5", children: [
|
|
2898
2980
|
!waiting ? /* @__PURE__ */ jsxs14("div", { className: "mb-0.5 flex items-center gap-0.5 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-focus-within:opacity-100 [@media(hover:hover)]:group-hover:opacity-100", children: [
|
|
2899
|
-
/* @__PURE__ */
|
|
2981
|
+
/* @__PURE__ */ jsx18(
|
|
2900
2982
|
"button",
|
|
2901
2983
|
{
|
|
2902
2984
|
type: "button",
|
|
@@ -2904,10 +2986,10 @@ function SuiteAiPanel({
|
|
|
2904
2986
|
"aria-label": copiedIndex === index ? "Copied" : "Copy message",
|
|
2905
2987
|
"data-test": "ask-ai-copy",
|
|
2906
2988
|
className: "flex h-7 w-7 items-center justify-center rounded-lg text-ph-mutedtext transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus",
|
|
2907
|
-
children: copiedIndex === index ? /* @__PURE__ */
|
|
2989
|
+
children: copiedIndex === index ? /* @__PURE__ */ jsx18(Check, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx18(Copy, { className: "h-3.5 w-3.5" })
|
|
2908
2990
|
}
|
|
2909
2991
|
),
|
|
2910
|
-
/* @__PURE__ */
|
|
2992
|
+
/* @__PURE__ */ jsx18(
|
|
2911
2993
|
"button",
|
|
2912
2994
|
{
|
|
2913
2995
|
type: "button",
|
|
@@ -2918,11 +3000,11 @@ function SuiteAiPanel({
|
|
|
2918
3000
|
"aria-label": "Edit message",
|
|
2919
3001
|
"data-test": "ask-ai-edit",
|
|
2920
3002
|
className: "flex h-7 w-7 items-center justify-center rounded-lg text-ph-mutedtext transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus",
|
|
2921
|
-
children: /* @__PURE__ */
|
|
3003
|
+
children: /* @__PURE__ */ jsx18(EditPencil, { className: "h-3.5 w-3.5" })
|
|
2922
3004
|
}
|
|
2923
3005
|
)
|
|
2924
3006
|
] }) : null,
|
|
2925
|
-
/* @__PURE__ */
|
|
3007
|
+
/* @__PURE__ */ jsx18("div", { className: "w-fit max-w-[85%] whitespace-pre-wrap break-words rounded-2xl rounded-br-md bg-ph-brand px-3 py-2 text-sm leading-relaxed text-[var(--ph-on-accent)] [overflow-wrap:anywhere]", children: message.content })
|
|
2926
3008
|
] })
|
|
2927
3009
|
},
|
|
2928
3010
|
`user-${index}`
|
|
@@ -2934,25 +3016,25 @@ function SuiteAiPanel({
|
|
|
2934
3016
|
className: "flex items-end gap-2",
|
|
2935
3017
|
"data-test": "ask-ai-assistant",
|
|
2936
3018
|
children: [
|
|
2937
|
-
/* @__PURE__ */
|
|
3019
|
+
/* @__PURE__ */ jsx18(
|
|
2938
3020
|
"span",
|
|
2939
3021
|
{
|
|
2940
3022
|
className: "suite-msg-avatar mb-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-ph-brand/10 text-ph-brand",
|
|
2941
3023
|
"aria-hidden": true,
|
|
2942
|
-
children: /* @__PURE__ */
|
|
3024
|
+
children: /* @__PURE__ */ jsx18(Icon, { className: "h-3.5 w-3.5" })
|
|
2943
3025
|
}
|
|
2944
3026
|
),
|
|
2945
3027
|
/* @__PURE__ */ jsxs14("div", { className: "suite-msg-bubble min-w-0 max-w-[85%] space-y-2", children: [
|
|
2946
|
-
/* @__PURE__ */
|
|
3028
|
+
/* @__PURE__ */ jsx18("div", { className: "rounded-2xl rounded-bl-md bg-ph-muted px-3 py-2 text-sm leading-relaxed text-ph-ink", children: /* @__PURE__ */ jsx18(
|
|
2947
3029
|
Suspense,
|
|
2948
3030
|
{
|
|
2949
3031
|
fallback: (
|
|
2950
3032
|
// The chunk is pre-warmed above, so this only shows on a
|
|
2951
3033
|
// cold cache. Keep it invisible — a skeleton here reads
|
|
2952
3034
|
// as if it were part of the answer.
|
|
2953
|
-
/* @__PURE__ */
|
|
3035
|
+
/* @__PURE__ */ jsx18("span", { className: "sr-only", role: "status", children: "Rendering response\u2026" })
|
|
2954
3036
|
),
|
|
2955
|
-
children: /* @__PURE__ */
|
|
3037
|
+
children: /* @__PURE__ */ jsx18(
|
|
2956
3038
|
SuiteAiMarkdownMessage,
|
|
2957
3039
|
{
|
|
2958
3040
|
markdown: message.content,
|
|
@@ -2968,9 +3050,9 @@ function SuiteAiPanel({
|
|
|
2968
3050
|
"data-status": action.status,
|
|
2969
3051
|
className: "rounded-xl border border-ph-border bg-ph-surface px-3 py-2 text-sm text-ph-ink",
|
|
2970
3052
|
children: [
|
|
2971
|
-
/* @__PURE__ */
|
|
3053
|
+
/* @__PURE__ */ jsx18("p", { className: "font-medium", children: action.summary }),
|
|
2972
3054
|
action.status === "proposed" ? /* @__PURE__ */ jsxs14("div", { className: "mt-2 flex flex-wrap gap-2", children: [
|
|
2973
|
-
/* @__PURE__ */
|
|
3055
|
+
/* @__PURE__ */ jsx18(
|
|
2974
3056
|
"button",
|
|
2975
3057
|
{
|
|
2976
3058
|
type: "button",
|
|
@@ -2981,7 +3063,7 @@ function SuiteAiPanel({
|
|
|
2981
3063
|
children: resolvingId === action.id ? "Working\u2026" : "Confirm"
|
|
2982
3064
|
}
|
|
2983
3065
|
),
|
|
2984
|
-
/* @__PURE__ */
|
|
3066
|
+
/* @__PURE__ */ jsx18(
|
|
2985
3067
|
"button",
|
|
2986
3068
|
{
|
|
2987
3069
|
type: "button",
|
|
@@ -2997,7 +3079,7 @@ function SuiteAiPanel({
|
|
|
2997
3079
|
"Done",
|
|
2998
3080
|
action.href ? /* @__PURE__ */ jsxs14(Fragment5, { children: [
|
|
2999
3081
|
" \xB7 ",
|
|
3000
|
-
/* @__PURE__ */
|
|
3082
|
+
/* @__PURE__ */ jsx18(
|
|
3001
3083
|
"a",
|
|
3002
3084
|
{
|
|
3003
3085
|
href: action.href,
|
|
@@ -3007,8 +3089,8 @@ function SuiteAiPanel({
|
|
|
3007
3089
|
)
|
|
3008
3090
|
] }) : null
|
|
3009
3091
|
] }) : null,
|
|
3010
|
-
action.status === "cancelled" ? /* @__PURE__ */
|
|
3011
|
-
action.status === "failed" ? /* @__PURE__ */
|
|
3092
|
+
action.status === "cancelled" ? /* @__PURE__ */ jsx18("p", { className: "mt-1 text-xs text-ph-subtle", children: "Cancelled" }) : null,
|
|
3093
|
+
action.status === "failed" ? /* @__PURE__ */ jsx18("p", { className: "mt-1 text-xs text-ph-danger", children: action.error || "Could not apply that." }) : null
|
|
3012
3094
|
]
|
|
3013
3095
|
},
|
|
3014
3096
|
action.id
|
|
@@ -3020,25 +3102,25 @@ function SuiteAiPanel({
|
|
|
3020
3102
|
);
|
|
3021
3103
|
}),
|
|
3022
3104
|
waiting ? /* @__PURE__ */ jsxs14("div", { className: "flex items-end gap-2", "aria-hidden": true, children: [
|
|
3023
|
-
/* @__PURE__ */
|
|
3105
|
+
/* @__PURE__ */ jsx18("span", { className: "mb-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-ph-brand/10 text-ph-brand", children: /* @__PURE__ */ jsx18(Icon, { className: "h-3.5 w-3.5" }) }),
|
|
3024
3106
|
/* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-1.5 rounded-2xl rounded-bl-md bg-ph-muted px-3 py-2.5", children: [
|
|
3025
|
-
/* @__PURE__ */
|
|
3026
|
-
/* @__PURE__ */
|
|
3027
|
-
/* @__PURE__ */
|
|
3107
|
+
/* @__PURE__ */ jsx18("span", { className: "suite-think-dot h-1.5 w-1.5 rounded-full bg-ph-mutedtext" }),
|
|
3108
|
+
/* @__PURE__ */ jsx18("span", { className: "suite-think-dot suite-think-dot--2 h-1.5 w-1.5 rounded-full bg-ph-mutedtext" }),
|
|
3109
|
+
/* @__PURE__ */ jsx18("span", { className: "suite-think-dot suite-think-dot--3 h-1.5 w-1.5 rounded-full bg-ph-mutedtext" })
|
|
3028
3110
|
] })
|
|
3029
3111
|
] }) : null,
|
|
3030
|
-
waiting ? /* @__PURE__ */
|
|
3112
|
+
waiting ? /* @__PURE__ */ jsx18("span", { className: "sr-only", "aria-live": "polite", children: "Assistant is responding\u2026" }) : null,
|
|
3031
3113
|
error ? /* @__PURE__ */ jsxs14(
|
|
3032
3114
|
"div",
|
|
3033
3115
|
{
|
|
3034
3116
|
role: "alert",
|
|
3035
3117
|
className: "flex items-start gap-2 rounded-xl border border-ph-danger/30 bg-ph-danger/10 px-3 py-2.5 text-sm text-ph-ink",
|
|
3036
3118
|
children: [
|
|
3037
|
-
/* @__PURE__ */
|
|
3119
|
+
/* @__PURE__ */ jsx18(WarningTriangle, { className: "mt-0.5 h-4 w-4 shrink-0 text-ph-danger" }),
|
|
3038
3120
|
/* @__PURE__ */ jsxs14("div", { className: "min-w-0 flex-1", children: [
|
|
3039
|
-
/* @__PURE__ */
|
|
3040
|
-
/* @__PURE__ */
|
|
3041
|
-
/* @__PURE__ */
|
|
3121
|
+
/* @__PURE__ */ jsx18("p", { className: "font-medium text-ph-danger", children: "Something went wrong" }),
|
|
3122
|
+
/* @__PURE__ */ jsx18("p", { className: "mt-0.5 text-ph-subtle", children: error }),
|
|
3123
|
+
/* @__PURE__ */ jsx18(
|
|
3042
3124
|
"button",
|
|
3043
3125
|
{
|
|
3044
3126
|
type: "button",
|
|
@@ -3055,20 +3137,20 @@ function SuiteAiPanel({
|
|
|
3055
3137
|
]
|
|
3056
3138
|
}
|
|
3057
3139
|
),
|
|
3058
|
-
!atBottom ? /* @__PURE__ */
|
|
3140
|
+
!atBottom ? /* @__PURE__ */ jsx18("div", { className: "absolute bottom-3 left-1/2 -translate-x-1/2", children: /* @__PURE__ */ jsx18(Tooltip, { content: "Scroll to latest", children: /* @__PURE__ */ jsx18(
|
|
3059
3141
|
"button",
|
|
3060
3142
|
{
|
|
3061
3143
|
type: "button",
|
|
3062
3144
|
onClick: () => scrollToBottom("smooth"),
|
|
3063
3145
|
className: "flex h-9 w-9 items-center justify-center rounded-full border border-ph-border bg-ph-surface text-ph-subtle shadow-ph-md transition-colors hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus",
|
|
3064
3146
|
"aria-label": "Scroll to latest",
|
|
3065
|
-
children: /* @__PURE__ */
|
|
3147
|
+
children: /* @__PURE__ */ jsx18(ArrowDown, { className: "h-4 w-4" })
|
|
3066
3148
|
}
|
|
3067
3149
|
) }) }) : null
|
|
3068
3150
|
] }),
|
|
3069
|
-
/* @__PURE__ */
|
|
3070
|
-
/* @__PURE__ */
|
|
3071
|
-
/* @__PURE__ */
|
|
3151
|
+
/* @__PURE__ */ jsx18("div", { className: "px-2 pt-2 pb-[max(2rem,calc(env(safe-area-inset-bottom)+1rem))]", children: /* @__PURE__ */ jsxs14("div", { className: "flex items-end gap-1.5 rounded-2xl border border-ph-border bg-ph-surface px-1.5 py-1 transition-colors focus-within:border-ph-brand/45 focus-within:ring-2 focus-within:ring-ph-focus/35", children: [
|
|
3152
|
+
/* @__PURE__ */ jsx18("label", { htmlFor: inputId, className: "sr-only", children: "Ask a question" }),
|
|
3153
|
+
/* @__PURE__ */ jsx18(
|
|
3072
3154
|
"textarea",
|
|
3073
3155
|
{
|
|
3074
3156
|
id: inputId,
|
|
@@ -3087,7 +3169,7 @@ function SuiteAiPanel({
|
|
|
3087
3169
|
className: "max-h-36 min-h-10 flex-1 resize-none bg-transparent px-1.5 py-2 text-sm leading-relaxed text-ph-ink outline-none placeholder:text-ph-mutedtext"
|
|
3088
3170
|
}
|
|
3089
3171
|
),
|
|
3090
|
-
waiting ? /* @__PURE__ */
|
|
3172
|
+
waiting ? /* @__PURE__ */ jsx18(Tooltip, { content: "Stop generating", children: /* @__PURE__ */ jsx18(
|
|
3091
3173
|
"button",
|
|
3092
3174
|
{
|
|
3093
3175
|
type: "button",
|
|
@@ -3095,9 +3177,9 @@ function SuiteAiPanel({
|
|
|
3095
3177
|
"data-test": "ask-ai-stop",
|
|
3096
3178
|
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-ph-muted text-ph-ink transition-colors hover:bg-ph-border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus",
|
|
3097
3179
|
"aria-label": "Stop generating",
|
|
3098
|
-
children: /* @__PURE__ */
|
|
3180
|
+
children: /* @__PURE__ */ jsx18(Square, { className: "h-3.5 w-3.5 fill-current" })
|
|
3099
3181
|
}
|
|
3100
|
-
) }) : /* @__PURE__ */
|
|
3182
|
+
) }) : /* @__PURE__ */ jsx18(Tooltip, { content: "Send message", children: /* @__PURE__ */ jsx18(
|
|
3101
3183
|
"button",
|
|
3102
3184
|
{
|
|
3103
3185
|
type: "button",
|
|
@@ -3106,7 +3188,7 @@ function SuiteAiPanel({
|
|
|
3106
3188
|
"data-test": "ask-ai-send",
|
|
3107
3189
|
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-ph-brand text-[color:var(--ph-on-accent)] transition-opacity hover:bg-ph-brand-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus disabled:opacity-40",
|
|
3108
3190
|
"aria-label": "Send message",
|
|
3109
|
-
children: /* @__PURE__ */
|
|
3191
|
+
children: /* @__PURE__ */ jsx18(ArrowUp, { className: "h-4 w-4" })
|
|
3110
3192
|
}
|
|
3111
3193
|
) })
|
|
3112
3194
|
] }) })
|
|
@@ -3118,7 +3200,7 @@ function SuiteAiPanel({
|
|
|
3118
3200
|
// src/suite/components/workspace-switcher.tsx
|
|
3119
3201
|
import { useState as useState9 } from "react";
|
|
3120
3202
|
import { Building, Check as Check2, NavArrowDown } from "iconoir-react";
|
|
3121
|
-
import { Fragment as Fragment6, jsx as
|
|
3203
|
+
import { Fragment as Fragment6, jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
3122
3204
|
function SuiteWorkspaceSwitcher({
|
|
3123
3205
|
workspaces = [],
|
|
3124
3206
|
groups,
|
|
@@ -3136,7 +3218,7 @@ function SuiteWorkspaceSwitcher({
|
|
|
3136
3218
|
var _a2;
|
|
3137
3219
|
const [open, setOpen] = useState9(false);
|
|
3138
3220
|
const sections = (_a2 = groups == null ? void 0 : groups.filter((group) => group.workspaces.length > 0)) != null ? _a2 : workspaces.length > 0 ? [{ id: "workspaces", label: "Switch workspace", workspaces }] : [];
|
|
3139
|
-
return /* @__PURE__ */
|
|
3221
|
+
return /* @__PURE__ */ jsx19(
|
|
3140
3222
|
DropdownMenu2,
|
|
3141
3223
|
{
|
|
3142
3224
|
"aria-label": "Switch workspace",
|
|
@@ -3157,10 +3239,10 @@ function SuiteWorkspaceSwitcher({
|
|
|
3157
3239
|
),
|
|
3158
3240
|
"data-test": "workspace-switcher-trigger",
|
|
3159
3241
|
children: [
|
|
3160
|
-
/* @__PURE__ */
|
|
3242
|
+
/* @__PURE__ */ jsx19(Building, { className: "h-4 w-4 shrink-0 text-ph-ink", "aria-hidden": true }),
|
|
3161
3243
|
!collapsed ? /* @__PURE__ */ jsxs15(Fragment6, { children: [
|
|
3162
|
-
/* @__PURE__ */
|
|
3163
|
-
/* @__PURE__ */
|
|
3244
|
+
/* @__PURE__ */ jsx19("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-ph-ink", children: name }),
|
|
3245
|
+
/* @__PURE__ */ jsx19(
|
|
3164
3246
|
NavArrowDown,
|
|
3165
3247
|
{
|
|
3166
3248
|
className: cn2(
|
|
@@ -3181,9 +3263,9 @@ function SuiteWorkspaceSwitcher({
|
|
|
3181
3263
|
className: "p-1",
|
|
3182
3264
|
"data-test": "workspace-switcher-menu",
|
|
3183
3265
|
children: [
|
|
3184
|
-
sections.length === 0 ? /* @__PURE__ */
|
|
3185
|
-
/* @__PURE__ */
|
|
3186
|
-
section.workspaces.map((workspace) => /* @__PURE__ */
|
|
3266
|
+
sections.length === 0 ? /* @__PURE__ */ jsx19("p", { className: "px-3 py-2 text-sm text-ph-mutedtext", children: emptyLabel }) : sections.map((section) => /* @__PURE__ */ jsxs15("div", { children: [
|
|
3267
|
+
/* @__PURE__ */ jsx19("p", { className: "px-3 py-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-ph-mutedtext", children: section.label }),
|
|
3268
|
+
section.workspaces.map((workspace) => /* @__PURE__ */ jsx19(
|
|
3187
3269
|
DropdownItem2,
|
|
3188
3270
|
{
|
|
3189
3271
|
id: `workspace-option-${workspace.id}`,
|
|
@@ -3198,10 +3280,10 @@ function SuiteWorkspaceSwitcher({
|
|
|
3198
3280
|
className: appSwitcherMenuItemClass(),
|
|
3199
3281
|
children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 w-full items-center gap-3", children: [
|
|
3200
3282
|
/* @__PURE__ */ jsxs15("span", { className: "min-w-0 flex-1", children: [
|
|
3201
|
-
/* @__PURE__ */
|
|
3202
|
-
workspace.description ? /* @__PURE__ */
|
|
3283
|
+
/* @__PURE__ */ jsx19("span", { className: "block truncate text-sm font-medium text-ph-ink", children: workspace.name }),
|
|
3284
|
+
workspace.description ? /* @__PURE__ */ jsx19("span", { className: "block truncate text-xs text-ph-mutedtext", children: workspace.description }) : null
|
|
3203
3285
|
] }),
|
|
3204
|
-
workspace.id === currentId ? /* @__PURE__ */
|
|
3286
|
+
workspace.id === currentId ? /* @__PURE__ */ jsx19(
|
|
3205
3287
|
Check2,
|
|
3206
3288
|
{
|
|
3207
3289
|
className: "h-4 w-4 shrink-0 text-ph-brand",
|
|
@@ -3213,7 +3295,7 @@ function SuiteWorkspaceSwitcher({
|
|
|
3213
3295
|
workspace.id
|
|
3214
3296
|
))
|
|
3215
3297
|
] }, section.id)),
|
|
3216
|
-
footer ? /* @__PURE__ */
|
|
3298
|
+
footer ? /* @__PURE__ */ jsx19("div", { className: "mt-1 border-t border-ph-border pt-1", children: footer }) : null
|
|
3217
3299
|
]
|
|
3218
3300
|
}
|
|
3219
3301
|
)
|
|
@@ -3222,7 +3304,7 @@ function SuiteWorkspaceSwitcher({
|
|
|
3222
3304
|
}
|
|
3223
3305
|
|
|
3224
3306
|
// src/suite/icons/suite-icon.tsx
|
|
3225
|
-
import { jsx as
|
|
3307
|
+
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
3226
3308
|
var TODAY_SUN_STYLE = `
|
|
3227
3309
|
@media (prefers-reduced-motion: no-preference) {
|
|
3228
3310
|
.suite-icon-today-sun-rays {
|
|
@@ -3265,8 +3347,8 @@ function SuiteIcon({
|
|
|
3265
3347
|
"aria-label": label,
|
|
3266
3348
|
"aria-hidden": label ? void 0 : true,
|
|
3267
3349
|
children: [
|
|
3268
|
-
glyph.animatedAccent && animated ? /* @__PURE__ */
|
|
3269
|
-
/* @__PURE__ */
|
|
3350
|
+
glyph.animatedAccent && animated ? /* @__PURE__ */ jsx20("style", { children: TODAY_SUN_STYLE }) : null,
|
|
3351
|
+
/* @__PURE__ */ jsx20(
|
|
3270
3352
|
GlyphParts,
|
|
3271
3353
|
{
|
|
3272
3354
|
elements: glyph.elements,
|
|
@@ -3451,9 +3533,9 @@ function useSidebarWidth(storageKey = SUITE_SIDEBAR_WIDTH_KEY, defaultWidth = SI
|
|
|
3451
3533
|
|
|
3452
3534
|
// src/suite/lib/motion.tsx
|
|
3453
3535
|
import { LazyMotion, domAnimation, m } from "motion/react";
|
|
3454
|
-
import { jsx as
|
|
3536
|
+
import { jsx as jsx21 } from "react/jsx-runtime";
|
|
3455
3537
|
function SuiteMotionProvider({ children }) {
|
|
3456
|
-
return /* @__PURE__ */
|
|
3538
|
+
return /* @__PURE__ */ jsx21(LazyMotion, { features: domAnimation, strict: true, children });
|
|
3457
3539
|
}
|
|
3458
3540
|
var SUITE_SPRINGS = {
|
|
3459
3541
|
/** Snappy panel/sheet entrances — small overshoot. */
|
|
@@ -3465,24 +3547,24 @@ var SUITE_SPRINGS = {
|
|
|
3465
3547
|
};
|
|
3466
3548
|
|
|
3467
3549
|
// src/suite/components/suite-skeleton.tsx
|
|
3468
|
-
import { jsx as
|
|
3550
|
+
import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
3469
3551
|
function SuiteSkeleton({
|
|
3470
3552
|
className,
|
|
3471
3553
|
lines = 1,
|
|
3472
3554
|
circle,
|
|
3473
3555
|
width
|
|
3474
3556
|
}) {
|
|
3475
|
-
return /* @__PURE__ */
|
|
3557
|
+
return /* @__PURE__ */ jsx22(
|
|
3476
3558
|
"div",
|
|
3477
3559
|
{
|
|
3478
3560
|
className: cn2("space-y-2", circle ? "flex flex-col items-center" : ""),
|
|
3479
3561
|
"aria-hidden": true,
|
|
3480
|
-
children: Array.from({ length: lines }).map((_, index) => /* @__PURE__ */
|
|
3562
|
+
children: Array.from({ length: lines }).map((_, index) => /* @__PURE__ */ jsx22(
|
|
3481
3563
|
"div",
|
|
3482
3564
|
{
|
|
3483
3565
|
className: "animate-[skeleton-stagger_0.6s_ease-out_both]",
|
|
3484
3566
|
style: { animationDelay: `${index * 80}ms` },
|
|
3485
|
-
children: /* @__PURE__ */
|
|
3567
|
+
children: /* @__PURE__ */ jsx22(
|
|
3486
3568
|
"div",
|
|
3487
3569
|
{
|
|
3488
3570
|
className: cn2(
|
|
@@ -3521,20 +3603,20 @@ function SuiteSkeletonCard({
|
|
|
3521
3603
|
className: "mb-5 flex items-center gap-3 animate-[skeleton-stagger_0.5s_ease-out_both]",
|
|
3522
3604
|
style: { animationDelay: "100ms" },
|
|
3523
3605
|
children: [
|
|
3524
|
-
/* @__PURE__ */
|
|
3606
|
+
/* @__PURE__ */ jsx22("div", { className: "ph-skeleton h-10 w-10 rounded-xl" }),
|
|
3525
3607
|
/* @__PURE__ */ jsxs17("div", { className: "flex-1 space-y-2", children: [
|
|
3526
|
-
/* @__PURE__ */
|
|
3527
|
-
/* @__PURE__ */
|
|
3608
|
+
/* @__PURE__ */ jsx22("div", { className: "ph-skeleton h-4 w-1/3" }),
|
|
3609
|
+
/* @__PURE__ */ jsx22("div", { className: "ph-skeleton h-3 w-1/2" })
|
|
3528
3610
|
] })
|
|
3529
3611
|
]
|
|
3530
3612
|
}
|
|
3531
3613
|
) : null,
|
|
3532
|
-
/* @__PURE__ */
|
|
3614
|
+
/* @__PURE__ */ jsx22("div", { className: "space-y-3", children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsx22(
|
|
3533
3615
|
"div",
|
|
3534
3616
|
{
|
|
3535
3617
|
className: "animate-[skeleton-stagger_0.5s_ease-out_both]",
|
|
3536
3618
|
style: { animationDelay: `${200 + index * 80}ms` },
|
|
3537
|
-
children: /* @__PURE__ */
|
|
3619
|
+
children: /* @__PURE__ */ jsx22(
|
|
3538
3620
|
"div",
|
|
3539
3621
|
{
|
|
3540
3622
|
className: "ph-skeleton h-3",
|
|
@@ -3552,16 +3634,16 @@ function SuiteSkeletonList({
|
|
|
3552
3634
|
className,
|
|
3553
3635
|
items = 4
|
|
3554
3636
|
}) {
|
|
3555
|
-
return /* @__PURE__ */
|
|
3637
|
+
return /* @__PURE__ */ jsx22("div", { className: cn2("space-y-3", className), "aria-hidden": true, children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsx22(
|
|
3556
3638
|
"div",
|
|
3557
3639
|
{
|
|
3558
3640
|
className: "animate-[skeleton-stagger_0.6s_ease-out_both]",
|
|
3559
3641
|
style: { animationDelay: `${index * 100}ms` },
|
|
3560
3642
|
children: /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3 rounded-xl border border-ph-border bg-ph-surface p-4", children: [
|
|
3561
|
-
/* @__PURE__ */
|
|
3643
|
+
/* @__PURE__ */ jsx22("div", { className: "ph-skeleton h-10 w-10 rounded-lg" }),
|
|
3562
3644
|
/* @__PURE__ */ jsxs17("div", { className: "min-w-0 flex-1 space-y-2", children: [
|
|
3563
|
-
/* @__PURE__ */
|
|
3564
|
-
/* @__PURE__ */
|
|
3645
|
+
/* @__PURE__ */ jsx22("div", { className: "ph-skeleton h-3.5 w-3/4" }),
|
|
3646
|
+
/* @__PURE__ */ jsx22("div", { className: "ph-skeleton h-3 w-1/2" })
|
|
3565
3647
|
] })
|
|
3566
3648
|
] })
|
|
3567
3649
|
},
|
|
@@ -3586,12 +3668,12 @@ function SuiteEmptyState({
|
|
|
3586
3668
|
),
|
|
3587
3669
|
children: [
|
|
3588
3670
|
/* @__PURE__ */ jsxs17("div", { className: "pointer-events-none absolute inset-0 overflow-hidden opacity-60", "aria-hidden": true, children: [
|
|
3589
|
-
/* @__PURE__ */
|
|
3590
|
-
/* @__PURE__ */
|
|
3671
|
+
/* @__PURE__ */ jsx22("div", { className: "absolute -left-10 -top-10 h-40 w-40 rounded-full bg-ph-brand/10 blur-3xl" }),
|
|
3672
|
+
/* @__PURE__ */ jsx22("div", { className: "absolute -bottom-10 -right-10 h-40 w-40 rounded-full bg-ph-accent/10 blur-3xl" })
|
|
3591
3673
|
] }),
|
|
3592
3674
|
/* @__PURE__ */ jsxs17("div", { className: "relative", children: [
|
|
3593
|
-
icon ? /* @__PURE__ */
|
|
3594
|
-
/* @__PURE__ */
|
|
3675
|
+
icon ? /* @__PURE__ */ jsx22("div", { className: "mx-auto mb-4 inline-flex items-center justify-center rounded-2xl bg-ph-muted p-3 shadow-sm ring-1 ring-black/[0.06]", children: icon }) : null,
|
|
3676
|
+
/* @__PURE__ */ jsx22(
|
|
3595
3677
|
"h2",
|
|
3596
3678
|
{
|
|
3597
3679
|
className: cn2(
|
|
@@ -3601,8 +3683,8 @@ function SuiteEmptyState({
|
|
|
3601
3683
|
children: title
|
|
3602
3684
|
}
|
|
3603
3685
|
),
|
|
3604
|
-
description ? /* @__PURE__ */
|
|
3605
|
-
action ? /* @__PURE__ */
|
|
3686
|
+
description ? /* @__PURE__ */ jsx22("p", { className: "mx-auto mt-2 max-w-sm text-sm leading-relaxed text-ph-subtle", children: description }) : null,
|
|
3687
|
+
action ? /* @__PURE__ */ jsx22("div", { className: "mt-5 flex flex-wrap items-center justify-center gap-2", children: action }) : null
|
|
3606
3688
|
] })
|
|
3607
3689
|
]
|
|
3608
3690
|
}
|
|
@@ -3611,7 +3693,7 @@ function SuiteEmptyState({
|
|
|
3611
3693
|
|
|
3612
3694
|
// src/suite/components/suite-settings-mobile-nav.tsx
|
|
3613
3695
|
import { isValidElement } from "react";
|
|
3614
|
-
import { jsx as
|
|
3696
|
+
import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
3615
3697
|
function SuiteSettingsMobileNav({
|
|
3616
3698
|
items,
|
|
3617
3699
|
activeHref,
|
|
@@ -3620,16 +3702,16 @@ function SuiteSettingsMobileNav({
|
|
|
3620
3702
|
ariaLabel = "Settings sections",
|
|
3621
3703
|
className
|
|
3622
3704
|
}) {
|
|
3623
|
-
return /* @__PURE__ */
|
|
3705
|
+
return /* @__PURE__ */ jsx23(
|
|
3624
3706
|
"nav",
|
|
3625
3707
|
{
|
|
3626
3708
|
"data-test": dataTest,
|
|
3627
3709
|
"aria-label": ariaLabel,
|
|
3628
3710
|
className: cn2("suite-settings-mobile-nav lg:hidden", className),
|
|
3629
|
-
children: /* @__PURE__ */
|
|
3711
|
+
children: /* @__PURE__ */ jsx23("div", { className: "flex snap-x gap-2 overflow-x-auto pb-3 pt-1 scrollbar-hide [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: items.map((item) => {
|
|
3630
3712
|
const Icon = item.icon;
|
|
3631
3713
|
const active = activeHref === item.href || activeHref.startsWith(`${item.href}/`);
|
|
3632
|
-
const iconNode = isValidElement(item.icon) ? item.icon : /* @__PURE__ */
|
|
3714
|
+
const iconNode = isValidElement(item.icon) ? item.icon : /* @__PURE__ */ jsx23(
|
|
3633
3715
|
Icon,
|
|
3634
3716
|
{
|
|
3635
3717
|
className: cn2(
|
|
@@ -3654,8 +3736,8 @@ function SuiteSettingsMobileNav({
|
|
|
3654
3736
|
),
|
|
3655
3737
|
children: [
|
|
3656
3738
|
iconNode,
|
|
3657
|
-
/* @__PURE__ */
|
|
3658
|
-
active ? /* @__PURE__ */
|
|
3739
|
+
/* @__PURE__ */ jsx23("span", { className: "whitespace-nowrap", children: item.label }),
|
|
3740
|
+
active ? /* @__PURE__ */ jsx23("span", { className: "absolute inset-x-0 -bottom-3 h-0.5 rounded-full bg-ph-ink lg:hidden" }) : null
|
|
3659
3741
|
]
|
|
3660
3742
|
},
|
|
3661
3743
|
item.href
|
|
@@ -3669,7 +3751,7 @@ function SuiteSettingsMobileNav({
|
|
|
3669
3751
|
import Link2 from "next/link";
|
|
3670
3752
|
import { useCallback as useCallback5, useEffect as useEffect8 } from "react";
|
|
3671
3753
|
import { NavArrowLeft, Sparks as Sparks2 } from "iconoir-react";
|
|
3672
|
-
import { Fragment as Fragment7, jsx as
|
|
3754
|
+
import { Fragment as Fragment7, jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
3673
3755
|
function renderNode(node, collapsed) {
|
|
3674
3756
|
if (typeof node === "function") return node(collapsed);
|
|
3675
3757
|
return node;
|
|
@@ -3724,7 +3806,7 @@ function SuiteSidebar({
|
|
|
3724
3806
|
if (collapsed) onRequestExpand == null ? void 0 : onRequestExpand();
|
|
3725
3807
|
setAskAi(true);
|
|
3726
3808
|
}
|
|
3727
|
-
const askAiButton = /* @__PURE__ */
|
|
3809
|
+
const askAiButton = /* @__PURE__ */ jsx24(
|
|
3728
3810
|
"button",
|
|
3729
3811
|
{
|
|
3730
3812
|
type: "button",
|
|
@@ -3736,7 +3818,7 @@ function SuiteSidebar({
|
|
|
3736
3818
|
"inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ph-focus-ring",
|
|
3737
3819
|
askAiOpen ? "bg-ph-brand/10 text-ph-brand" : "text-ph-mutedtext hover:bg-ph-muted hover:text-ph-ink"
|
|
3738
3820
|
),
|
|
3739
|
-
children: /* @__PURE__ */
|
|
3821
|
+
children: /* @__PURE__ */ jsx24(Sparks2, { className: "h-4 w-4", "aria-hidden": true })
|
|
3740
3822
|
}
|
|
3741
3823
|
);
|
|
3742
3824
|
if (chatOpen) {
|
|
@@ -3758,7 +3840,7 @@ function SuiteSidebar({
|
|
|
3758
3840
|
surface ? "bg-ph-surface" : "bg-ph-canvas"
|
|
3759
3841
|
),
|
|
3760
3842
|
children: [
|
|
3761
|
-
/* @__PURE__ */
|
|
3843
|
+
/* @__PURE__ */ jsx24(
|
|
3762
3844
|
"button",
|
|
3763
3845
|
{
|
|
3764
3846
|
type: "button",
|
|
@@ -3766,14 +3848,14 @@ function SuiteSidebar({
|
|
|
3766
3848
|
"aria-label": "Back to navigation",
|
|
3767
3849
|
onClick: () => setAskAi(false),
|
|
3768
3850
|
className: "inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg text-ph-subtle transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-brand",
|
|
3769
|
-
children: /* @__PURE__ */
|
|
3851
|
+
children: /* @__PURE__ */ jsx24(NavArrowLeft, { className: "h-4 w-4", "aria-hidden": true })
|
|
3770
3852
|
}
|
|
3771
3853
|
),
|
|
3772
|
-
/* @__PURE__ */
|
|
3854
|
+
/* @__PURE__ */ jsx24("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-ph-ink", children: "Shelly AI" })
|
|
3773
3855
|
]
|
|
3774
3856
|
}
|
|
3775
3857
|
),
|
|
3776
|
-
/* @__PURE__ */
|
|
3858
|
+
/* @__PURE__ */ jsx24("div", { className: "min-h-0 flex-1", children: askAi })
|
|
3777
3859
|
]
|
|
3778
3860
|
}
|
|
3779
3861
|
);
|
|
@@ -3796,8 +3878,8 @@ function SuiteSidebar({
|
|
|
3796
3878
|
collapsed ? "flex-col items-center gap-1 px-1 py-2" : "h-14 items-center justify-between gap-2 px-3"
|
|
3797
3879
|
),
|
|
3798
3880
|
children: [
|
|
3799
|
-
/* @__PURE__ */
|
|
3800
|
-
collapsed ? null : /* @__PURE__ */
|
|
3881
|
+
/* @__PURE__ */ jsx24("div", { className: cn2("min-w-0", collapsed ? "shrink-0" : "flex-1"), children: renderNode(appSwitcher, collapsed) }),
|
|
3882
|
+
collapsed ? null : /* @__PURE__ */ jsx24("div", { className: "shrink-0", children: renderNode(notificationBell, collapsed) })
|
|
3801
3883
|
]
|
|
3802
3884
|
}
|
|
3803
3885
|
) : null,
|
|
@@ -3811,7 +3893,7 @@ function SuiteSidebar({
|
|
|
3811
3893
|
collapsed ? "px-1.5 py-2" : "p-3"
|
|
3812
3894
|
),
|
|
3813
3895
|
children: [
|
|
3814
|
-
contextSwitcher ? /* @__PURE__ */
|
|
3896
|
+
contextSwitcher ? /* @__PURE__ */ jsx24(
|
|
3815
3897
|
"div",
|
|
3816
3898
|
{
|
|
3817
3899
|
className: cn2(
|
|
@@ -3831,16 +3913,16 @@ function SuiteSidebar({
|
|
|
3831
3913
|
onClick: () => setAskAi(false),
|
|
3832
3914
|
className: "inline-flex h-9 items-center gap-1 rounded-lg px-2 text-sm font-medium text-ph-subtle transition-colors hover:bg-ph-muted hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-brand",
|
|
3833
3915
|
children: [
|
|
3834
|
-
/* @__PURE__ */
|
|
3916
|
+
/* @__PURE__ */ jsx24(NavArrowLeft, { className: "h-4 w-4", "aria-hidden": true }),
|
|
3835
3917
|
"Nav"
|
|
3836
3918
|
]
|
|
3837
3919
|
}
|
|
3838
3920
|
),
|
|
3839
|
-
/* @__PURE__ */
|
|
3921
|
+
/* @__PURE__ */ jsx24("span", { className: "truncate text-sm font-semibold text-ph-ink", children: "Shelly AI" })
|
|
3840
3922
|
] }),
|
|
3841
|
-
/* @__PURE__ */
|
|
3923
|
+
/* @__PURE__ */ jsx24("div", { className: "min-h-0 flex-1", children: askAi })
|
|
3842
3924
|
] }) : /* @__PURE__ */ jsxs19(Fragment7, { children: [
|
|
3843
|
-
/* @__PURE__ */
|
|
3925
|
+
/* @__PURE__ */ jsx24("nav", { "aria-label": "Pages", className: "shrink-0 space-y-1", children: /* @__PURE__ */ jsx24("div", { className: "space-y-1", children: navItems.map((item) => {
|
|
3844
3926
|
var _a2;
|
|
3845
3927
|
const Icon = item.icon;
|
|
3846
3928
|
const active = Boolean(item.active);
|
|
@@ -3858,7 +3940,7 @@ function SuiteSidebar({
|
|
|
3858
3940
|
collapsed ? "mx-auto size-11 shrink-0 justify-center gap-0 px-0 py-0" : "w-full px-2.5 py-2"
|
|
3859
3941
|
),
|
|
3860
3942
|
children: [
|
|
3861
|
-
/* @__PURE__ */
|
|
3943
|
+
/* @__PURE__ */ jsx24(
|
|
3862
3944
|
"span",
|
|
3863
3945
|
{
|
|
3864
3946
|
className: cn2(
|
|
@@ -3866,7 +3948,7 @@ function SuiteSidebar({
|
|
|
3866
3948
|
item.iconClassName
|
|
3867
3949
|
),
|
|
3868
3950
|
"aria-hidden": true,
|
|
3869
|
-
children: /* @__PURE__ */
|
|
3951
|
+
children: /* @__PURE__ */ jsx24(
|
|
3870
3952
|
Icon,
|
|
3871
3953
|
{
|
|
3872
3954
|
className: "h-full w-full",
|
|
@@ -3875,7 +3957,7 @@ function SuiteSidebar({
|
|
|
3875
3957
|
)
|
|
3876
3958
|
}
|
|
3877
3959
|
),
|
|
3878
|
-
/* @__PURE__ */
|
|
3960
|
+
/* @__PURE__ */ jsx24(
|
|
3879
3961
|
"span",
|
|
3880
3962
|
{
|
|
3881
3963
|
className: cn2(
|
|
@@ -3886,14 +3968,14 @@ function SuiteSidebar({
|
|
|
3886
3968
|
children: item.label
|
|
3887
3969
|
}
|
|
3888
3970
|
),
|
|
3889
|
-
!collapsed && item.badge ? /* @__PURE__ */
|
|
3971
|
+
!collapsed && item.badge ? /* @__PURE__ */ jsx24("span", { className: "relative ml-auto shrink-0", children: item.badge }) : null
|
|
3890
3972
|
]
|
|
3891
3973
|
},
|
|
3892
3974
|
item.label
|
|
3893
3975
|
);
|
|
3894
|
-
return collapsed ? /* @__PURE__ */
|
|
3976
|
+
return collapsed ? /* @__PURE__ */ jsx24(Tooltip, { content: item.label, side: "right", children: link }, item.label) : link;
|
|
3895
3977
|
}) }) }),
|
|
3896
|
-
secondaryNav ? /* @__PURE__ */
|
|
3978
|
+
secondaryNav ? /* @__PURE__ */ jsx24(
|
|
3897
3979
|
"div",
|
|
3898
3980
|
{
|
|
3899
3981
|
className: "min-h-0 flex-1",
|
|
@@ -3905,7 +3987,7 @@ function SuiteSidebar({
|
|
|
3905
3987
|
]
|
|
3906
3988
|
}
|
|
3907
3989
|
),
|
|
3908
|
-
/* @__PURE__ */
|
|
3990
|
+
/* @__PURE__ */ jsx24(
|
|
3909
3991
|
"div",
|
|
3910
3992
|
{
|
|
3911
3993
|
className: cn2(
|
|
@@ -3922,8 +4004,8 @@ function SuiteSidebar({
|
|
|
3922
4004
|
),
|
|
3923
4005
|
children: [
|
|
3924
4006
|
renderNode(userMenu, collapsed),
|
|
3925
|
-
showAskAi ? /* @__PURE__ */
|
|
3926
|
-
showAskAi && footerExtras ? /* @__PURE__ */
|
|
4007
|
+
showAskAi ? /* @__PURE__ */ jsx24("div", { className: cn2("shrink-0", collapsed ? "mt-2" : "ml-auto"), children: /* @__PURE__ */ jsx24(Tooltip, { content: "Shelly AI", side: collapsed ? "right" : "top", children: askAiButton }) }) : footerExtras ? /* @__PURE__ */ jsx24("div", { className: cn2("shrink-0", collapsed ? "mt-2" : "ml-auto"), children: renderNode(footerExtras, collapsed) }) : null,
|
|
4008
|
+
showAskAi && footerExtras ? /* @__PURE__ */ jsx24("div", { className: cn2("shrink-0", collapsed && "mt-2"), children: renderNode(footerExtras, collapsed) }) : null
|
|
3927
4009
|
]
|
|
3928
4010
|
}
|
|
3929
4011
|
)
|
|
@@ -3935,7 +4017,7 @@ function SuiteSidebar({
|
|
|
3935
4017
|
}
|
|
3936
4018
|
|
|
3937
4019
|
// src/suite/components/suite-app-layout.tsx
|
|
3938
|
-
import { jsx as
|
|
4020
|
+
import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
3939
4021
|
function SuiteAppLayout({
|
|
3940
4022
|
sidebar,
|
|
3941
4023
|
children,
|
|
@@ -3966,8 +4048,8 @@ function SuiteAppLayout({
|
|
|
3966
4048
|
style: { width: `${sidebarWidth}px` },
|
|
3967
4049
|
"data-collapsed": collapsed ? "true" : "false",
|
|
3968
4050
|
children: [
|
|
3969
|
-
/* @__PURE__ */
|
|
3970
|
-
onStartResize ? /* @__PURE__ */
|
|
4051
|
+
/* @__PURE__ */ jsx25("div", { className: "relative z-0 h-full min-h-0 isolate", children: sidebar }),
|
|
4052
|
+
onStartResize ? /* @__PURE__ */ jsx25(
|
|
3971
4053
|
"div",
|
|
3972
4054
|
{
|
|
3973
4055
|
role: "separator",
|
|
@@ -4000,8 +4082,8 @@ function SuiteAppLayout({
|
|
|
4000
4082
|
}
|
|
4001
4083
|
),
|
|
4002
4084
|
/* @__PURE__ */ jsxs20("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col", children: [
|
|
4003
|
-
mobileHeader ? /* @__PURE__ */
|
|
4004
|
-
/* @__PURE__ */
|
|
4085
|
+
mobileHeader ? /* @__PURE__ */ jsx25("div", { className: "shrink-0 lg:hidden", children: mobileHeader }) : null,
|
|
4086
|
+
/* @__PURE__ */ jsx25(
|
|
4005
4087
|
"main",
|
|
4006
4088
|
{
|
|
4007
4089
|
id: "main-content",
|
|
@@ -4015,7 +4097,7 @@ function SuiteAppLayout({
|
|
|
4015
4097
|
children
|
|
4016
4098
|
}
|
|
4017
4099
|
),
|
|
4018
|
-
bottomNav ? /* @__PURE__ */
|
|
4100
|
+
bottomNav ? /* @__PURE__ */ jsx25("div", { className: "shrink-0 lg:hidden", children: bottomNav }) : null
|
|
4019
4101
|
] })
|
|
4020
4102
|
]
|
|
4021
4103
|
}
|
|
@@ -4025,11 +4107,12 @@ function SuiteAppLayout({
|
|
|
4025
4107
|
// src/suite/components/suite-integration-picker.tsx
|
|
4026
4108
|
import {
|
|
4027
4109
|
useEffect as useEffect9,
|
|
4028
|
-
useMemo as
|
|
4110
|
+
useMemo as useMemo3,
|
|
4029
4111
|
useRef as useRef4,
|
|
4030
4112
|
useState as useState11
|
|
4031
4113
|
} from "react";
|
|
4032
4114
|
import {
|
|
4115
|
+
Bridge3d,
|
|
4033
4116
|
EvPlug as Plug,
|
|
4034
4117
|
Filter,
|
|
4035
4118
|
NavArrowDown as NavArrowDown2,
|
|
@@ -4037,7 +4120,7 @@ import {
|
|
|
4037
4120
|
Search,
|
|
4038
4121
|
Xmark
|
|
4039
4122
|
} from "iconoir-react";
|
|
4040
|
-
import { Fragment as Fragment8, jsx as
|
|
4123
|
+
import { Fragment as Fragment8, jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
4041
4124
|
var DESCRIPTION_LIMIT = 90;
|
|
4042
4125
|
function IntegrationSkeletonCard() {
|
|
4043
4126
|
return /* @__PURE__ */ jsxs21(
|
|
@@ -4047,14 +4130,14 @@ function IntegrationSkeletonCard() {
|
|
|
4047
4130
|
"aria-hidden": "true",
|
|
4048
4131
|
children: [
|
|
4049
4132
|
/* @__PURE__ */ jsxs21("div", { className: "flex items-start gap-3", children: [
|
|
4050
|
-
/* @__PURE__ */
|
|
4133
|
+
/* @__PURE__ */ jsx26("div", { className: "h-8 w-8 shrink-0 rounded-md bg-ph-muted" }),
|
|
4051
4134
|
/* @__PURE__ */ jsxs21("div", { className: "min-w-0 flex-1 space-y-2 pt-1", children: [
|
|
4052
|
-
/* @__PURE__ */
|
|
4053
|
-
/* @__PURE__ */
|
|
4054
|
-
/* @__PURE__ */
|
|
4135
|
+
/* @__PURE__ */ jsx26("div", { className: "h-4 w-3/5 rounded bg-ph-muted" }),
|
|
4136
|
+
/* @__PURE__ */ jsx26("div", { className: "h-3 w-full rounded bg-ph-muted" }),
|
|
4137
|
+
/* @__PURE__ */ jsx26("div", { className: "h-3 w-4/5 rounded bg-ph-muted" })
|
|
4055
4138
|
] })
|
|
4056
4139
|
] }),
|
|
4057
|
-
/* @__PURE__ */
|
|
4140
|
+
/* @__PURE__ */ jsx26("div", { className: "mt-3 h-9 w-20 rounded bg-ph-muted" })
|
|
4058
4141
|
]
|
|
4059
4142
|
}
|
|
4060
4143
|
);
|
|
@@ -4079,33 +4162,18 @@ function authSchemesFor(item) {
|
|
|
4079
4162
|
)
|
|
4080
4163
|
);
|
|
4081
4164
|
}
|
|
4082
|
-
var
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
chat: ["tides", "kraken"],
|
|
4087
|
-
documents: ["kraken"],
|
|
4088
|
-
notes: ["kraken"],
|
|
4089
|
-
knowledge: ["kraken"],
|
|
4090
|
-
file_storage: ["kraken"],
|
|
4091
|
-
crm: ["shellstack", "tides"],
|
|
4092
|
-
finance: ["shellstack", "tides"],
|
|
4093
|
-
payment: ["shellstack", "tides"],
|
|
4094
|
-
monitoring: ["tides", "kraken"],
|
|
4095
|
-
design: ["tides", "kraken"],
|
|
4096
|
-
support: ["tides", "shellstack"],
|
|
4097
|
-
ticketing: ["tides", "kraken"]
|
|
4165
|
+
var BRIDGE_MARK = {
|
|
4166
|
+
turtletime: { src: "/turtletime-icon.svg", name: "TurtleTime" },
|
|
4167
|
+
tides: { src: "/tides-icon.svg", name: "Tides" },
|
|
4168
|
+
kraken: { src: "/kraken-icon.svg", name: "Kraken" }
|
|
4098
4169
|
};
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
const apps = /* @__PURE__ */ new Set();
|
|
4103
|
-
for (const category of categories != null ? categories : []) {
|
|
4104
|
-
for (const app of (_a2 = CATEGORY_APP_AFFINITY[category.trim().toLowerCase()]) != null ? _a2 : []) {
|
|
4105
|
-
apps.add(app);
|
|
4106
|
-
}
|
|
4170
|
+
function suiteAppsForIntegration(itemOrCategories) {
|
|
4171
|
+
if (!itemOrCategories || Array.isArray(itemOrCategories) || !("bridgeTargets" in itemOrCategories)) {
|
|
4172
|
+
return [];
|
|
4107
4173
|
}
|
|
4108
|
-
|
|
4174
|
+
const explicit = itemOrCategories.bridgeTargets;
|
|
4175
|
+
if (!Array.isArray(explicit)) return [];
|
|
4176
|
+
return explicit.filter((app) => app in BRIDGE_MARK);
|
|
4109
4177
|
}
|
|
4110
4178
|
function SuiteIntegrationPicker({
|
|
4111
4179
|
open,
|
|
@@ -4121,6 +4189,8 @@ function SuiteIntegrationPicker({
|
|
|
4121
4189
|
category: controlledCategory,
|
|
4122
4190
|
categories: controlledCategories,
|
|
4123
4191
|
onCategoryChange,
|
|
4192
|
+
bridgeOnly: controlledBridgeOnly,
|
|
4193
|
+
onBridgeOnlyChange,
|
|
4124
4194
|
onClose,
|
|
4125
4195
|
onConnect,
|
|
4126
4196
|
onFetchAuthFields,
|
|
@@ -4134,6 +4204,7 @@ function SuiteIntegrationPicker({
|
|
|
4134
4204
|
const [categoryQuery, setCategoryQuery] = useState11("");
|
|
4135
4205
|
const [categoryMenuOpen, setCategoryMenuOpen] = useState11(false);
|
|
4136
4206
|
const [expanded, setExpanded] = useState11(null);
|
|
4207
|
+
const [bridgeOnlyInternal, setBridgeOnlyInternal] = useState11(false);
|
|
4137
4208
|
const categoryMenuRef = useRef4(null);
|
|
4138
4209
|
const categoryTriggerRef = useRef4(null);
|
|
4139
4210
|
const categorySearchRef = useRef4(null);
|
|
@@ -4144,6 +4215,7 @@ function SuiteIntegrationPicker({
|
|
|
4144
4215
|
const scrollViewportRef = useRef4(null);
|
|
4145
4216
|
const loadMoreSentinelRef = useRef4(null);
|
|
4146
4217
|
const loadMoreInFlightRef = useRef4(false);
|
|
4218
|
+
const sentinelVisibleRef = useRef4(false);
|
|
4147
4219
|
const authRequestRef = useRef4(0);
|
|
4148
4220
|
const [methodItem, setMethodItem] = useState11(null);
|
|
4149
4221
|
const [authItem, setAuthItem] = useState11(null);
|
|
@@ -4155,7 +4227,7 @@ function SuiteIntegrationPicker({
|
|
|
4155
4227
|
const [itemToDisconnect, setItemToDisconnect] = useState11(null);
|
|
4156
4228
|
const [disconnecting, setDisconnecting] = useState11(false);
|
|
4157
4229
|
const [disconnectError, setDisconnectError] = useState11(null);
|
|
4158
|
-
const itemCategories =
|
|
4230
|
+
const itemCategories = useMemo3(
|
|
4159
4231
|
() => Array.from(
|
|
4160
4232
|
new Set(items.flatMap((item) => {
|
|
4161
4233
|
var _a2;
|
|
@@ -4167,11 +4239,20 @@ function SuiteIntegrationPicker({
|
|
|
4167
4239
|
const categories = controlledCategories != null ? controlledCategories : itemCategories;
|
|
4168
4240
|
const activeSearch = controlledSearch != null ? controlledSearch : query;
|
|
4169
4241
|
const activeCategory = controlledCategory != null ? controlledCategory : category;
|
|
4242
|
+
const bridgeOnly = controlledBridgeOnly != null ? controlledBridgeOnly : bridgeOnlyInternal;
|
|
4243
|
+
const setBridgeOnly = (value) => {
|
|
4244
|
+
setBridgeOnlyInternal(value);
|
|
4245
|
+
onBridgeOnlyChange == null ? void 0 : onBridgeOnlyChange(value);
|
|
4246
|
+
};
|
|
4170
4247
|
const categoryLabel = (value) => value.replace(/[-_]/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase());
|
|
4171
|
-
const
|
|
4248
|
+
const catalogItems = onSearchChange || onCategoryChange ? items : items.filter((item) => {
|
|
4172
4249
|
var _a2;
|
|
4173
4250
|
return item.label.toLowerCase().includes(activeSearch.trim().toLowerCase()) && (activeCategory === "all" || ((_a2 = item.categories) != null ? _a2 : []).includes(activeCategory));
|
|
4174
4251
|
});
|
|
4252
|
+
const filtered = bridgeOnly && controlledBridgeOnly === void 0 ? catalogItems.filter((item) => {
|
|
4253
|
+
var _a2;
|
|
4254
|
+
return ((_a2 = item.bridgeTargets) != null ? _a2 : []).length > 0;
|
|
4255
|
+
}) : catalogItems;
|
|
4175
4256
|
const visibleCategories = categories.filter(
|
|
4176
4257
|
(value) => categoryLabel(value).toLowerCase().includes(categoryQuery.trim().toLowerCase())
|
|
4177
4258
|
);
|
|
@@ -4369,23 +4450,31 @@ function SuiteIntegrationPicker({
|
|
|
4369
4450
|
useEffect9(() => {
|
|
4370
4451
|
const root = scrollViewportRef.current;
|
|
4371
4452
|
const sentinel = loadMoreSentinelRef.current;
|
|
4372
|
-
if (!open || !root || !sentinel
|
|
4453
|
+
if (!open || !root || !sentinel) {
|
|
4454
|
+
sentinelVisibleRef.current = false;
|
|
4373
4455
|
return;
|
|
4374
4456
|
}
|
|
4375
4457
|
const observer = new IntersectionObserver(
|
|
4376
4458
|
([entry]) => {
|
|
4377
|
-
if (!entry.isIntersecting
|
|
4459
|
+
if (!entry.isIntersecting) {
|
|
4460
|
+
sentinelVisibleRef.current = false;
|
|
4461
|
+
return;
|
|
4462
|
+
}
|
|
4463
|
+
if (sentinelVisibleRef.current) return;
|
|
4464
|
+
sentinelVisibleRef.current = true;
|
|
4465
|
+
if (loadMoreInFlightRef.current || !hasMore || !onEndReached || loading || catalogLoading || loadingMore) {
|
|
4466
|
+
return;
|
|
4467
|
+
}
|
|
4378
4468
|
loadMoreInFlightRef.current = true;
|
|
4379
|
-
observer.unobserve(entry.target);
|
|
4380
4469
|
onEndReached();
|
|
4381
4470
|
},
|
|
4382
|
-
{ root, rootMargin: "0px 0px
|
|
4471
|
+
{ root, rootMargin: "0px 0px 120px", threshold: 0 }
|
|
4383
4472
|
);
|
|
4384
4473
|
observer.observe(sentinel);
|
|
4385
4474
|
return () => observer.disconnect();
|
|
4386
4475
|
}, [catalogLoading, hasMore, loading, loadingMore, onEndReached, open]);
|
|
4387
4476
|
return /* @__PURE__ */ jsxs21(Fragment8, { children: [
|
|
4388
|
-
/* @__PURE__ */
|
|
4477
|
+
/* @__PURE__ */ jsx26(
|
|
4389
4478
|
Modal,
|
|
4390
4479
|
{
|
|
4391
4480
|
open,
|
|
@@ -4396,17 +4485,45 @@ function SuiteIntegrationPicker({
|
|
|
4396
4485
|
dataTest,
|
|
4397
4486
|
bodyClassName: "!overflow-hidden",
|
|
4398
4487
|
children: /* @__PURE__ */ jsxs21("div", { className: "space-y-4", children: [
|
|
4399
|
-
connectionError ? /* @__PURE__ */
|
|
4488
|
+
connectionError ? /* @__PURE__ */ jsx26("p", { className: "text-sm text-ph-danger", role: "alert", children: connectionError }) : null,
|
|
4489
|
+
/* @__PURE__ */ jsxs21(
|
|
4490
|
+
"label",
|
|
4491
|
+
{
|
|
4492
|
+
className: "inline-flex w-fit cursor-pointer items-center gap-2 text-sm text-ph-ink",
|
|
4493
|
+
"data-test": `${dataTest}-bridge-only`,
|
|
4494
|
+
children: [
|
|
4495
|
+
/* @__PURE__ */ jsx26(
|
|
4496
|
+
"input",
|
|
4497
|
+
{
|
|
4498
|
+
type: "checkbox",
|
|
4499
|
+
role: "switch",
|
|
4500
|
+
className: "ph-toggle",
|
|
4501
|
+
checked: bridgeOnly,
|
|
4502
|
+
onChange: (event) => setBridgeOnly(event.target.checked),
|
|
4503
|
+
"aria-label": "Shelly Bridge only"
|
|
4504
|
+
}
|
|
4505
|
+
),
|
|
4506
|
+
/* @__PURE__ */ jsx26(
|
|
4507
|
+
Bridge3d,
|
|
4508
|
+
{
|
|
4509
|
+
className: "h-4 w-4 shrink-0 text-ph-subtle",
|
|
4510
|
+
"aria-hidden": true
|
|
4511
|
+
}
|
|
4512
|
+
),
|
|
4513
|
+
/* @__PURE__ */ jsx26("span", { children: "Shelly Bridge only" })
|
|
4514
|
+
]
|
|
4515
|
+
}
|
|
4516
|
+
),
|
|
4400
4517
|
/* @__PURE__ */ jsxs21("div", { className: "grid gap-4 md:grid-cols-2", children: [
|
|
4401
4518
|
/* @__PURE__ */ jsxs21("div", { className: "relative", children: [
|
|
4402
|
-
/* @__PURE__ */
|
|
4519
|
+
/* @__PURE__ */ jsx26(
|
|
4403
4520
|
Search,
|
|
4404
4521
|
{
|
|
4405
4522
|
className: "pointer-events-none absolute left-3 top-1/2 z-10 h-4 w-4 -translate-y-1/2 text-ph-subtle",
|
|
4406
4523
|
"aria-hidden": true
|
|
4407
4524
|
}
|
|
4408
4525
|
),
|
|
4409
|
-
/* @__PURE__ */
|
|
4526
|
+
/* @__PURE__ */ jsx26(
|
|
4410
4527
|
Input,
|
|
4411
4528
|
{
|
|
4412
4529
|
value: activeSearch,
|
|
@@ -4439,16 +4556,16 @@ function SuiteIntegrationPicker({
|
|
|
4439
4556
|
onKeyDown: handleCategoryTriggerKeyDown,
|
|
4440
4557
|
children: [
|
|
4441
4558
|
/* @__PURE__ */ jsxs21("span", { className: "flex items-center gap-2", children: [
|
|
4442
|
-
/* @__PURE__ */
|
|
4559
|
+
/* @__PURE__ */ jsx26(
|
|
4443
4560
|
Filter,
|
|
4444
4561
|
{
|
|
4445
4562
|
className: "h-4 w-4 shrink-0 text-ph-subtle",
|
|
4446
4563
|
"aria-hidden": true
|
|
4447
4564
|
}
|
|
4448
4565
|
),
|
|
4449
|
-
/* @__PURE__ */
|
|
4566
|
+
/* @__PURE__ */ jsx26("span", { children: activeCategory === "all" ? "All apps" : categoryLabel(activeCategory) })
|
|
4450
4567
|
] }),
|
|
4451
|
-
/* @__PURE__ */
|
|
4568
|
+
/* @__PURE__ */ jsx26(
|
|
4452
4569
|
NavArrowDown2,
|
|
4453
4570
|
{
|
|
4454
4571
|
className: `h-4 w-4 transition-transform ${categoryMenuOpen ? "rotate-180" : ""}`,
|
|
@@ -4463,7 +4580,7 @@ function SuiteIntegrationPicker({
|
|
|
4463
4580
|
{
|
|
4464
4581
|
className: "absolute z-20 mt-2 max-h-[min(22rem,calc(100dvh-12rem))] w-full max-w-full overflow-hidden rounded-lg border border-ph-border bg-ph-surface p-2 shadow-lg",
|
|
4465
4582
|
children: [
|
|
4466
|
-
/* @__PURE__ */
|
|
4583
|
+
/* @__PURE__ */ jsx26(
|
|
4467
4584
|
Input,
|
|
4468
4585
|
{
|
|
4469
4586
|
ref: categorySearchRef,
|
|
@@ -4483,7 +4600,7 @@ function SuiteIntegrationPicker({
|
|
|
4483
4600
|
}
|
|
4484
4601
|
}
|
|
4485
4602
|
),
|
|
4486
|
-
/* @__PURE__ */
|
|
4603
|
+
/* @__PURE__ */ jsx26(
|
|
4487
4604
|
"div",
|
|
4488
4605
|
{
|
|
4489
4606
|
id: `${dataTest}-category-options`,
|
|
@@ -4491,7 +4608,7 @@ function SuiteIntegrationPicker({
|
|
|
4491
4608
|
"aria-label": "Integration categories",
|
|
4492
4609
|
className: "mt-2 max-h-52 overflow-y-auto",
|
|
4493
4610
|
"data-test": "integration-category-options",
|
|
4494
|
-
children: categoryValues.map((value) => /* @__PURE__ */
|
|
4611
|
+
children: categoryValues.map((value) => /* @__PURE__ */ jsx26(
|
|
4495
4612
|
"button",
|
|
4496
4613
|
{
|
|
4497
4614
|
type: "button",
|
|
@@ -4529,25 +4646,27 @@ function SuiteIntegrationPicker({
|
|
|
4529
4646
|
ref: scrollViewportRef,
|
|
4530
4647
|
className: "min-h-0 max-h-[min(60vh,32rem)] w-full overflow-y-auto pr-1",
|
|
4531
4648
|
children: [
|
|
4532
|
-
loading || catalogLoading ? /* @__PURE__ */
|
|
4649
|
+
loading || catalogLoading ? /* @__PURE__ */ jsx26(
|
|
4533
4650
|
"div",
|
|
4534
4651
|
{
|
|
4535
4652
|
className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3",
|
|
4536
4653
|
"aria-label": "Loading apps",
|
|
4537
|
-
children: Array.from({ length: SKELETON_COUNT }, (_, index) => /* @__PURE__ */
|
|
4654
|
+
children: Array.from({ length: SKELETON_COUNT }, (_, index) => /* @__PURE__ */ jsx26(IntegrationSkeletonCard, {}, index))
|
|
4538
4655
|
}
|
|
4539
4656
|
) : /* @__PURE__ */ jsxs21("div", { className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3", children: [
|
|
4540
4657
|
filtered.map((item) => {
|
|
4541
4658
|
var _a2, _b;
|
|
4542
4659
|
const isExpanded = expanded === item.id;
|
|
4543
4660
|
const longDescription = item.description.length > DESCRIPTION_LIMIT;
|
|
4661
|
+
const bridgeApps = suiteAppsForIntegration(item);
|
|
4662
|
+
const schemes = authSchemesFor(item);
|
|
4544
4663
|
const text = isExpanded || !longDescription ? item.description : `${item.description.slice(0, DESCRIPTION_LIMIT).trimEnd()}...`;
|
|
4545
4664
|
return /* @__PURE__ */ jsxs21(
|
|
4546
4665
|
"div",
|
|
4547
4666
|
{
|
|
4548
4667
|
className: "flex min-h-36 min-w-0 flex-col justify-between rounded-xl border border-ph-border bg-ph-surface p-4",
|
|
4549
4668
|
children: [
|
|
4550
|
-
/* @__PURE__ */
|
|
4669
|
+
/* @__PURE__ */ jsx26(
|
|
4551
4670
|
"button",
|
|
4552
4671
|
{
|
|
4553
4672
|
type: "button",
|
|
@@ -4555,50 +4674,47 @@ function SuiteIntegrationPicker({
|
|
|
4555
4674
|
onClick: () => longDescription && setExpanded(isExpanded ? null : item.id),
|
|
4556
4675
|
"aria-expanded": isExpanded,
|
|
4557
4676
|
children: /* @__PURE__ */ jsxs21("span", { className: "flex items-start gap-3", children: [
|
|
4558
|
-
/* @__PURE__ */
|
|
4677
|
+
/* @__PURE__ */ jsx26("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-ph-muted text-ph-ink", children: (_a2 = item.icon) != null ? _a2 : /* @__PURE__ */ jsx26(Plug, { className: "h-4 w-4", "aria-hidden": true }) }),
|
|
4559
4678
|
/* @__PURE__ */ jsxs21("span", { className: "min-w-0", children: [
|
|
4560
|
-
/* @__PURE__ */
|
|
4561
|
-
/* @__PURE__ */
|
|
4679
|
+
/* @__PURE__ */ jsx26("span", { className: "block truncate font-medium text-ph-ink", children: item.label }),
|
|
4680
|
+
/* @__PURE__ */ jsx26("span", { className: "mt-1 block text-xs text-ph-subtle", children: text }),
|
|
4562
4681
|
longDescription ? /* @__PURE__ */ jsxs21("span", { className: "mt-1 block text-xs font-medium text-ph-brand", children: [
|
|
4563
4682
|
isExpanded ? "See less" : "See more",
|
|
4564
4683
|
" ",
|
|
4565
|
-
isExpanded ? /* @__PURE__ */
|
|
4684
|
+
isExpanded ? /* @__PURE__ */ jsx26(NavArrowUp, { className: "inline h-3 w-3" }) : /* @__PURE__ */ jsx26(NavArrowDown2, { className: "inline h-3 w-3" })
|
|
4566
4685
|
] }) : null
|
|
4567
4686
|
] })
|
|
4568
4687
|
] })
|
|
4569
4688
|
}
|
|
4570
4689
|
),
|
|
4571
|
-
|
|
4690
|
+
bridgeApps.length > 0 ? /* @__PURE__ */ jsx26(
|
|
4572
4691
|
"div",
|
|
4573
4692
|
{
|
|
4574
4693
|
className: "mt-3 flex flex-wrap items-center gap-1.5",
|
|
4575
|
-
"aria-label": "
|
|
4576
|
-
children:
|
|
4577
|
-
|
|
4578
|
-
|
|
4694
|
+
"aria-label": "Bridges into ShellStack apps",
|
|
4695
|
+
children: bridgeApps.map((app) => {
|
|
4696
|
+
const mark = BRIDGE_MARK[app];
|
|
4697
|
+
if (!mark) return null;
|
|
4698
|
+
return /* @__PURE__ */ jsx26(
|
|
4699
|
+
"img",
|
|
4579
4700
|
{
|
|
4580
|
-
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
size: 16,
|
|
4586
|
-
label: `Works with ${SUITE_APP_MAP[app].name}`,
|
|
4587
|
-
className: "rounded-[4px]"
|
|
4588
|
-
}
|
|
4589
|
-
)
|
|
4701
|
+
src: mark.src,
|
|
4702
|
+
alt: "",
|
|
4703
|
+
title: `Bridge in ${mark.name}`,
|
|
4704
|
+
className: "h-5 w-5",
|
|
4705
|
+
"data-test": `${dataTest}-${item.id}-app-${app}`
|
|
4590
4706
|
},
|
|
4591
4707
|
app
|
|
4592
|
-
)
|
|
4593
|
-
)
|
|
4708
|
+
);
|
|
4709
|
+
})
|
|
4594
4710
|
}
|
|
4595
4711
|
) : null,
|
|
4596
|
-
|
|
4712
|
+
schemes.length > 0 ? /* @__PURE__ */ jsx26(
|
|
4597
4713
|
"div",
|
|
4598
4714
|
{
|
|
4599
4715
|
className: "mt-3 flex flex-wrap gap-1.5",
|
|
4600
4716
|
"aria-label": "Connection methods",
|
|
4601
|
-
children:
|
|
4717
|
+
children: schemes.map((scheme) => /* @__PURE__ */ jsx26(
|
|
4602
4718
|
"span",
|
|
4603
4719
|
{
|
|
4604
4720
|
className: "rounded-full border border-ph-border bg-ph-muted px-2 py-1 text-[0.6875rem] font-medium text-ph-subtle",
|
|
@@ -4609,7 +4725,7 @@ function SuiteIntegrationPicker({
|
|
|
4609
4725
|
))
|
|
4610
4726
|
}
|
|
4611
4727
|
) : null,
|
|
4612
|
-
/* @__PURE__ */
|
|
4728
|
+
/* @__PURE__ */ jsx26(
|
|
4613
4729
|
Button,
|
|
4614
4730
|
{
|
|
4615
4731
|
type: "button",
|
|
@@ -4618,7 +4734,7 @@ function SuiteIntegrationPicker({
|
|
|
4618
4734
|
disabled: Boolean(item.unavailableReason) || item.connecting,
|
|
4619
4735
|
onClick: () => connectItem(item),
|
|
4620
4736
|
children: /* @__PURE__ */ jsxs21("span", { className: "flex items-center gap-1.5", children: [
|
|
4621
|
-
/* @__PURE__ */
|
|
4737
|
+
/* @__PURE__ */ jsx26(Plug, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
4622
4738
|
item.connecting ? "Connecting..." : (_b = item.unavailableReason) != null ? _b : "Connect"
|
|
4623
4739
|
] })
|
|
4624
4740
|
}
|
|
@@ -4628,14 +4744,14 @@ function SuiteIntegrationPicker({
|
|
|
4628
4744
|
item.id
|
|
4629
4745
|
);
|
|
4630
4746
|
}),
|
|
4631
|
-
loadingMore ? Array.from({ length: 3 }, (_, index) => /* @__PURE__ */
|
|
4747
|
+
loadingMore ? Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ jsx26(IntegrationSkeletonCard, {}, `loading-${index}`)) : null
|
|
4632
4748
|
] }),
|
|
4633
|
-
/* @__PURE__ */
|
|
4749
|
+
/* @__PURE__ */ jsx26("div", { ref: loadMoreSentinelRef, className: "h-1", "aria-hidden": "true" })
|
|
4634
4750
|
]
|
|
4635
4751
|
}
|
|
4636
4752
|
),
|
|
4637
4753
|
connectedItems.length > 0 && onDisconnect ? /* @__PURE__ */ jsxs21("div", { className: "space-y-2 border-t border-ph-border pt-4", children: [
|
|
4638
|
-
/* @__PURE__ */
|
|
4754
|
+
/* @__PURE__ */ jsx26("h3", { className: "font-medium text-ph-ink", children: "Connected apps" }),
|
|
4639
4755
|
connectedItems.map((item) => /* @__PURE__ */ jsxs21(
|
|
4640
4756
|
"div",
|
|
4641
4757
|
{
|
|
@@ -4643,16 +4759,16 @@ function SuiteIntegrationPicker({
|
|
|
4643
4759
|
children: [
|
|
4644
4760
|
/* @__PURE__ */ jsxs21("span", { className: "flex min-w-0 items-center gap-2 text-sm text-ph-ink", children: [
|
|
4645
4761
|
item.icon,
|
|
4646
|
-
/* @__PURE__ */
|
|
4762
|
+
/* @__PURE__ */ jsx26("span", { className: "truncate", children: item.label })
|
|
4647
4763
|
] }),
|
|
4648
|
-
/* @__PURE__ */
|
|
4764
|
+
/* @__PURE__ */ jsx26(
|
|
4649
4765
|
Button,
|
|
4650
4766
|
{
|
|
4651
4767
|
type: "button",
|
|
4652
4768
|
variant: "danger",
|
|
4653
4769
|
onClick: () => requestDisconnect(item),
|
|
4654
4770
|
children: /* @__PURE__ */ jsxs21("span", { className: "flex items-center gap-1.5", children: [
|
|
4655
|
-
/* @__PURE__ */
|
|
4771
|
+
/* @__PURE__ */ jsx26(Xmark, { className: "h-4 w-4", "aria-hidden": true }),
|
|
4656
4772
|
"Disconnect"
|
|
4657
4773
|
] })
|
|
4658
4774
|
}
|
|
@@ -4678,7 +4794,7 @@ function SuiteIntegrationPicker({
|
|
|
4678
4794
|
zIndex: 220,
|
|
4679
4795
|
dataTest: `${dataTest}-disconnect-confirmation`,
|
|
4680
4796
|
footer: /* @__PURE__ */ jsxs21("div", { className: "flex justify-end gap-2", children: [
|
|
4681
|
-
/* @__PURE__ */
|
|
4797
|
+
/* @__PURE__ */ jsx26(
|
|
4682
4798
|
Button,
|
|
4683
4799
|
{
|
|
4684
4800
|
type: "button",
|
|
@@ -4688,7 +4804,7 @@ function SuiteIntegrationPicker({
|
|
|
4688
4804
|
children: "Cancel"
|
|
4689
4805
|
}
|
|
4690
4806
|
),
|
|
4691
|
-
/* @__PURE__ */
|
|
4807
|
+
/* @__PURE__ */ jsx26(
|
|
4692
4808
|
Button,
|
|
4693
4809
|
{
|
|
4694
4810
|
type: "button",
|
|
@@ -4701,7 +4817,7 @@ function SuiteIntegrationPicker({
|
|
|
4701
4817
|
)
|
|
4702
4818
|
] }),
|
|
4703
4819
|
children: [
|
|
4704
|
-
disconnectError ? /* @__PURE__ */
|
|
4820
|
+
disconnectError ? /* @__PURE__ */ jsx26("p", { className: "text-sm text-ph-danger", role: "alert", children: disconnectError }) : null,
|
|
4705
4821
|
/* @__PURE__ */ jsxs21("p", { className: "text-sm text-ph-ink", children: [
|
|
4706
4822
|
"Disconnect ",
|
|
4707
4823
|
itemToDisconnect == null ? void 0 : itemToDisconnect.label,
|
|
@@ -4710,7 +4826,7 @@ function SuiteIntegrationPicker({
|
|
|
4710
4826
|
]
|
|
4711
4827
|
}
|
|
4712
4828
|
),
|
|
4713
|
-
/* @__PURE__ */
|
|
4829
|
+
/* @__PURE__ */ jsx26(
|
|
4714
4830
|
Modal,
|
|
4715
4831
|
{
|
|
4716
4832
|
open: Boolean(methodItem),
|
|
@@ -4720,7 +4836,7 @@ function SuiteIntegrationPicker({
|
|
|
4720
4836
|
size: "sm",
|
|
4721
4837
|
zIndex: 200,
|
|
4722
4838
|
dataTest: `${dataTest}-auth-method`,
|
|
4723
|
-
children: methodItem ? /* @__PURE__ */
|
|
4839
|
+
children: methodItem ? /* @__PURE__ */ jsx26("div", { className: "space-y-2", children: authSchemesFor(methodItem).map((scheme) => /* @__PURE__ */ jsxs21(
|
|
4724
4840
|
"button",
|
|
4725
4841
|
{
|
|
4726
4842
|
type: "button",
|
|
@@ -4728,15 +4844,15 @@ function SuiteIntegrationPicker({
|
|
|
4728
4844
|
onClick: () => void prepareConnection(methodItem, scheme),
|
|
4729
4845
|
"data-test": `${dataTest}-choose-${scheme.toLowerCase()}`,
|
|
4730
4846
|
children: [
|
|
4731
|
-
/* @__PURE__ */
|
|
4732
|
-
/* @__PURE__ */
|
|
4847
|
+
/* @__PURE__ */ jsx26("span", { className: "font-medium", children: authSchemeLabel(scheme) }),
|
|
4848
|
+
/* @__PURE__ */ jsx26("span", { className: "text-xs text-ph-subtle", children: "Select" })
|
|
4733
4849
|
]
|
|
4734
4850
|
},
|
|
4735
4851
|
scheme
|
|
4736
4852
|
)) }) : null
|
|
4737
4853
|
}
|
|
4738
4854
|
),
|
|
4739
|
-
/* @__PURE__ */
|
|
4855
|
+
/* @__PURE__ */ jsx26(
|
|
4740
4856
|
Modal,
|
|
4741
4857
|
{
|
|
4742
4858
|
open: Boolean(authItem),
|
|
@@ -4746,14 +4862,14 @@ function SuiteIntegrationPicker({
|
|
|
4746
4862
|
size: "md",
|
|
4747
4863
|
zIndex: 210,
|
|
4748
4864
|
dataTest: `${dataTest}-auth-form`,
|
|
4749
|
-
children: authLoading ? /* @__PURE__ */
|
|
4865
|
+
children: authLoading ? /* @__PURE__ */ jsx26("p", { className: "text-sm text-ph-subtle", children: "Loading authentication fields..." }) : authItem ? /* @__PURE__ */ jsxs21(
|
|
4750
4866
|
"form",
|
|
4751
4867
|
{
|
|
4752
4868
|
className: "space-y-4",
|
|
4753
4869
|
onSubmit: (event) => void submitAuthForm(event),
|
|
4754
4870
|
children: [
|
|
4755
|
-
authError ? /* @__PURE__ */
|
|
4756
|
-
authItem.fields.length === 0 && authError ? /* @__PURE__ */
|
|
4871
|
+
authError ? /* @__PURE__ */ jsx26("p", { className: "text-sm text-ph-danger", role: "alert", children: authError }) : null,
|
|
4872
|
+
authItem.fields.length === 0 && authError ? /* @__PURE__ */ jsx26(
|
|
4757
4873
|
Button,
|
|
4758
4874
|
{
|
|
4759
4875
|
type: "button",
|
|
@@ -4764,7 +4880,7 @@ function SuiteIntegrationPicker({
|
|
|
4764
4880
|
) : null,
|
|
4765
4881
|
authItem.fields.map((field) => {
|
|
4766
4882
|
var _a2, _b;
|
|
4767
|
-
return /* @__PURE__ */
|
|
4883
|
+
return /* @__PURE__ */ jsx26(
|
|
4768
4884
|
Input,
|
|
4769
4885
|
{
|
|
4770
4886
|
label: field.label,
|
|
@@ -4781,7 +4897,7 @@ function SuiteIntegrationPicker({
|
|
|
4781
4897
|
);
|
|
4782
4898
|
}),
|
|
4783
4899
|
/* @__PURE__ */ jsxs21("div", { className: "flex justify-end gap-2 border-t border-ph-border pt-4", children: [
|
|
4784
|
-
/* @__PURE__ */
|
|
4900
|
+
/* @__PURE__ */ jsx26(
|
|
4785
4901
|
Button,
|
|
4786
4902
|
{
|
|
4787
4903
|
type: "button",
|
|
@@ -4791,7 +4907,7 @@ function SuiteIntegrationPicker({
|
|
|
4791
4907
|
children: "Cancel"
|
|
4792
4908
|
}
|
|
4793
4909
|
),
|
|
4794
|
-
/* @__PURE__ */
|
|
4910
|
+
/* @__PURE__ */ jsx26(Button, { type: "submit", variant: "primary", disabled: authSubmitting, children: authSubmitting ? "Connecting..." : "Connect" })
|
|
4795
4911
|
] })
|
|
4796
4912
|
]
|
|
4797
4913
|
}
|
|
@@ -4804,7 +4920,7 @@ function SuiteIntegrationPicker({
|
|
|
4804
4920
|
// src/suite/components/suite-integration-rules.tsx
|
|
4805
4921
|
import { useState as useState12 } from "react";
|
|
4806
4922
|
import { Plus, Xmark as Xmark2 } from "iconoir-react";
|
|
4807
|
-
import { jsx as
|
|
4923
|
+
import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4808
4924
|
var ACTION_LABELS = {
|
|
4809
4925
|
create_tides_task: "Create a Tides task",
|
|
4810
4926
|
draft_time_entry: "Draft a time entry",
|
|
@@ -4920,10 +5036,10 @@ function SuiteIntegrationRules({
|
|
|
4920
5036
|
children: [
|
|
4921
5037
|
/* @__PURE__ */ jsxs22("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
4922
5038
|
/* @__PURE__ */ jsxs22("div", { children: [
|
|
4923
|
-
/* @__PURE__ */
|
|
4924
|
-
/* @__PURE__ */
|
|
5039
|
+
/* @__PURE__ */ jsx27("h3", { className: "font-medium text-ph-ink", children: "Automation rules" }),
|
|
5040
|
+
/* @__PURE__ */ jsx27("p", { className: "mt-1 text-sm text-ph-subtle", children: "Turn incoming integration events into tasks, time entries, or notifications for this workspace." })
|
|
4925
5041
|
] }),
|
|
4926
|
-
canManage && onCreate ? /* @__PURE__ */
|
|
5042
|
+
canManage && onCreate ? /* @__PURE__ */ jsx27(
|
|
4927
5043
|
Button,
|
|
4928
5044
|
{
|
|
4929
5045
|
type: "button",
|
|
@@ -4932,13 +5048,13 @@ function SuiteIntegrationRules({
|
|
|
4932
5048
|
onClick: () => setFormOpen((open) => !open),
|
|
4933
5049
|
"data-test": `${dataTest}-new`,
|
|
4934
5050
|
children: /* @__PURE__ */ jsxs22("span", { className: "flex items-center gap-1.5", children: [
|
|
4935
|
-
/* @__PURE__ */
|
|
5051
|
+
/* @__PURE__ */ jsx27(Plus, { className: "h-4 w-4", "aria-hidden": true }),
|
|
4936
5052
|
"New rule"
|
|
4937
5053
|
] })
|
|
4938
5054
|
}
|
|
4939
5055
|
) : null
|
|
4940
5056
|
] }),
|
|
4941
|
-
error ? /* @__PURE__ */
|
|
5057
|
+
error ? /* @__PURE__ */ jsx27(
|
|
4942
5058
|
Alert,
|
|
4943
5059
|
{
|
|
4944
5060
|
status: "danger",
|
|
@@ -4946,7 +5062,7 @@ function SuiteIntegrationRules({
|
|
|
4946
5062
|
description: error
|
|
4947
5063
|
}
|
|
4948
5064
|
) : null,
|
|
4949
|
-
loading ? /* @__PURE__ */
|
|
5065
|
+
loading ? /* @__PURE__ */ jsx27("p", { className: "mt-4 text-sm text-ph-subtle", children: "Loading rules..." }) : rules.length === 0 ? /* @__PURE__ */ jsx27(
|
|
4950
5066
|
"div",
|
|
4951
5067
|
{
|
|
4952
5068
|
className: "mt-4 rounded-lg border border-dashed border-ph-border px-4 py-6 text-center",
|
|
@@ -4956,14 +5072,14 @@ function SuiteIntegrationRules({
|
|
|
4956
5072
|
canManage ? " Create one to get started." : ""
|
|
4957
5073
|
] })
|
|
4958
5074
|
}
|
|
4959
|
-
) : /* @__PURE__ */
|
|
5075
|
+
) : /* @__PURE__ */ jsx27("ul", { className: "mt-4 space-y-2", "data-test": `${dataTest}-list`, children: rules.map((rule) => /* @__PURE__ */ jsxs22(
|
|
4960
5076
|
"li",
|
|
4961
5077
|
{
|
|
4962
5078
|
className: "flex items-center justify-between gap-3 rounded-lg border border-ph-border bg-ph-muted px-3 py-3",
|
|
4963
5079
|
"data-test": `${dataTest}-rule-${rule.id}`,
|
|
4964
5080
|
children: [
|
|
4965
5081
|
/* @__PURE__ */ jsxs22("div", { className: "min-w-0", children: [
|
|
4966
|
-
/* @__PURE__ */
|
|
5082
|
+
/* @__PURE__ */ jsx27("p", { className: "truncate text-sm font-medium text-ph-ink", children: rule.name }),
|
|
4967
5083
|
/* @__PURE__ */ jsxs22("p", { className: "mt-0.5 truncate text-xs text-ph-subtle", children: [
|
|
4968
5084
|
rule.trigger_event_type,
|
|
4969
5085
|
" \u2192 ",
|
|
@@ -4975,7 +5091,7 @@ function SuiteIntegrationRules({
|
|
|
4975
5091
|
] })
|
|
4976
5092
|
] }),
|
|
4977
5093
|
canManage ? /* @__PURE__ */ jsxs22("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
4978
|
-
/* @__PURE__ */
|
|
5094
|
+
/* @__PURE__ */ jsx27(
|
|
4979
5095
|
Toggle,
|
|
4980
5096
|
{
|
|
4981
5097
|
checked: rule.enabled,
|
|
@@ -4984,7 +5100,7 @@ function SuiteIntegrationRules({
|
|
|
4984
5100
|
"aria-label": `Enable ${rule.name}`
|
|
4985
5101
|
}
|
|
4986
5102
|
),
|
|
4987
|
-
/* @__PURE__ */
|
|
5103
|
+
/* @__PURE__ */ jsx27(
|
|
4988
5104
|
Button,
|
|
4989
5105
|
{
|
|
4990
5106
|
type: "button",
|
|
@@ -4993,10 +5109,10 @@ function SuiteIntegrationRules({
|
|
|
4993
5109
|
disabled: busyId === rule.id,
|
|
4994
5110
|
onClick: () => requestDelete(rule),
|
|
4995
5111
|
"aria-label": `Delete ${rule.name}`,
|
|
4996
|
-
children: /* @__PURE__ */
|
|
5112
|
+
children: /* @__PURE__ */ jsx27(Xmark2, { className: "h-4 w-4", "aria-hidden": true })
|
|
4997
5113
|
}
|
|
4998
5114
|
)
|
|
4999
|
-
] }) : /* @__PURE__ */
|
|
5115
|
+
] }) : /* @__PURE__ */ jsx27(
|
|
5000
5116
|
Badge,
|
|
5001
5117
|
{
|
|
5002
5118
|
variant: rule.enabled ? "success" : "neutral",
|
|
@@ -5015,8 +5131,8 @@ function SuiteIntegrationRules({
|
|
|
5015
5131
|
onSubmit: (event) => void submitForm(event),
|
|
5016
5132
|
"data-test": `${dataTest}-form`,
|
|
5017
5133
|
children: [
|
|
5018
|
-
formError ? /* @__PURE__ */
|
|
5019
|
-
/* @__PURE__ */
|
|
5134
|
+
formError ? /* @__PURE__ */ jsx27("p", { className: "text-sm text-ph-danger", role: "alert", children: formError }) : null,
|
|
5135
|
+
/* @__PURE__ */ jsx27(
|
|
5020
5136
|
Input,
|
|
5021
5137
|
{
|
|
5022
5138
|
label: "Rule name",
|
|
@@ -5027,7 +5143,7 @@ function SuiteIntegrationRules({
|
|
|
5027
5143
|
"data-test": `${dataTest}-name`
|
|
5028
5144
|
}
|
|
5029
5145
|
),
|
|
5030
|
-
/* @__PURE__ */
|
|
5146
|
+
/* @__PURE__ */ jsx27(
|
|
5031
5147
|
Input,
|
|
5032
5148
|
{
|
|
5033
5149
|
label: "Trigger event type",
|
|
@@ -5039,7 +5155,7 @@ function SuiteIntegrationRules({
|
|
|
5039
5155
|
"data-test": `${dataTest}-trigger`
|
|
5040
5156
|
}
|
|
5041
5157
|
),
|
|
5042
|
-
/* @__PURE__ */
|
|
5158
|
+
/* @__PURE__ */ jsx27(
|
|
5043
5159
|
Select,
|
|
5044
5160
|
{
|
|
5045
5161
|
label: "Action",
|
|
@@ -5048,7 +5164,7 @@ function SuiteIntegrationRules({
|
|
|
5048
5164
|
event.target.value
|
|
5049
5165
|
),
|
|
5050
5166
|
"data-test": `${dataTest}-action`,
|
|
5051
|
-
children: Object.entries(ACTION_LABELS).map(([value, label]) => /* @__PURE__ */
|
|
5167
|
+
children: Object.entries(ACTION_LABELS).map(([value, label]) => /* @__PURE__ */ jsx27("option", { value, children: label }, value))
|
|
5052
5168
|
}
|
|
5053
5169
|
),
|
|
5054
5170
|
needsProject ? /* @__PURE__ */ jsxs22(
|
|
@@ -5059,12 +5175,12 @@ function SuiteIntegrationRules({
|
|
|
5059
5175
|
onChange: (event) => setProjectId(event.target.value),
|
|
5060
5176
|
"data-test": `${dataTest}-project`,
|
|
5061
5177
|
children: [
|
|
5062
|
-
/* @__PURE__ */
|
|
5063
|
-
projects.map((project) => /* @__PURE__ */
|
|
5178
|
+
/* @__PURE__ */ jsx27("option", { value: "", children: "Choose a project..." }),
|
|
5179
|
+
projects.map((project) => /* @__PURE__ */ jsx27("option", { value: project.id, children: project.name }, project.id))
|
|
5064
5180
|
]
|
|
5065
5181
|
}
|
|
5066
5182
|
) : null,
|
|
5067
|
-
actionType === "draft_time_entry" ? /* @__PURE__ */
|
|
5183
|
+
actionType === "draft_time_entry" ? /* @__PURE__ */ jsx27(
|
|
5068
5184
|
Input,
|
|
5069
5185
|
{
|
|
5070
5186
|
label: "Minutes (optional)",
|
|
@@ -5083,15 +5199,15 @@ function SuiteIntegrationRules({
|
|
|
5083
5199
|
onChange: (event) => setPriority(event.target.value),
|
|
5084
5200
|
"data-test": `${dataTest}-priority`,
|
|
5085
5201
|
children: [
|
|
5086
|
-
/* @__PURE__ */
|
|
5087
|
-
/* @__PURE__ */
|
|
5088
|
-
/* @__PURE__ */
|
|
5089
|
-
/* @__PURE__ */
|
|
5202
|
+
/* @__PURE__ */ jsx27("option", { value: "low", children: "Low" }),
|
|
5203
|
+
/* @__PURE__ */ jsx27("option", { value: "medium", children: "Medium" }),
|
|
5204
|
+
/* @__PURE__ */ jsx27("option", { value: "high", children: "High" }),
|
|
5205
|
+
/* @__PURE__ */ jsx27("option", { value: "urgent", children: "Urgent" })
|
|
5090
5206
|
]
|
|
5091
5207
|
}
|
|
5092
5208
|
) : null,
|
|
5093
5209
|
/* @__PURE__ */ jsxs22("div", { className: "flex justify-end gap-2 border-t border-ph-border pt-3", children: [
|
|
5094
|
-
/* @__PURE__ */
|
|
5210
|
+
/* @__PURE__ */ jsx27(
|
|
5095
5211
|
Button,
|
|
5096
5212
|
{
|
|
5097
5213
|
type: "button",
|
|
@@ -5101,7 +5217,7 @@ function SuiteIntegrationRules({
|
|
|
5101
5217
|
children: "Cancel"
|
|
5102
5218
|
}
|
|
5103
5219
|
),
|
|
5104
|
-
/* @__PURE__ */
|
|
5220
|
+
/* @__PURE__ */ jsx27(Button, { type: "submit", variant: "primary", disabled: submitting, children: submitting ? "Creating..." : "Create rule" })
|
|
5105
5221
|
] })
|
|
5106
5222
|
]
|
|
5107
5223
|
}
|
|
@@ -5120,7 +5236,7 @@ function SuiteIntegrationRules({
|
|
|
5120
5236
|
description: "This action cannot be undone.",
|
|
5121
5237
|
dataTest: `${dataTest}-delete-confirmation`,
|
|
5122
5238
|
footer: /* @__PURE__ */ jsxs22("div", { className: "flex justify-end gap-2", children: [
|
|
5123
|
-
/* @__PURE__ */
|
|
5239
|
+
/* @__PURE__ */ jsx27(
|
|
5124
5240
|
Button,
|
|
5125
5241
|
{
|
|
5126
5242
|
type: "button",
|
|
@@ -5130,7 +5246,7 @@ function SuiteIntegrationRules({
|
|
|
5130
5246
|
children: "Cancel"
|
|
5131
5247
|
}
|
|
5132
5248
|
),
|
|
5133
|
-
/* @__PURE__ */
|
|
5249
|
+
/* @__PURE__ */ jsx27(
|
|
5134
5250
|
Button,
|
|
5135
5251
|
{
|
|
5136
5252
|
type: "button",
|
|
@@ -5143,7 +5259,7 @@ function SuiteIntegrationRules({
|
|
|
5143
5259
|
)
|
|
5144
5260
|
] }),
|
|
5145
5261
|
children: [
|
|
5146
|
-
deleteError ? /* @__PURE__ */
|
|
5262
|
+
deleteError ? /* @__PURE__ */ jsx27("p", { className: "text-sm text-ph-danger", role: "alert", children: deleteError }) : null,
|
|
5147
5263
|
/* @__PURE__ */ jsxs22("p", { className: "text-sm text-ph-ink", children: [
|
|
5148
5264
|
"Delete ",
|
|
5149
5265
|
ruleToDelete == null ? void 0 : ruleToDelete.name,
|
|
@@ -5159,16 +5275,16 @@ function SuiteIntegrationRules({
|
|
|
5159
5275
|
bodyClassName: "p-5",
|
|
5160
5276
|
"data-test": `${dataTest}-events-card`,
|
|
5161
5277
|
children: [
|
|
5162
|
-
/* @__PURE__ */
|
|
5163
|
-
/* @__PURE__ */
|
|
5164
|
-
events.length === 0 ? /* @__PURE__ */
|
|
5278
|
+
/* @__PURE__ */ jsx27("h3", { className: "font-medium text-ph-ink", children: "Recent events" }),
|
|
5279
|
+
/* @__PURE__ */ jsx27("p", { className: "mt-1 text-sm text-ph-subtle", children: "The latest events received from your connected apps." }),
|
|
5280
|
+
events.length === 0 ? /* @__PURE__ */ jsx27(
|
|
5165
5281
|
"p",
|
|
5166
5282
|
{
|
|
5167
5283
|
className: "mt-4 rounded-lg border border-dashed border-ph-border px-4 py-6 text-center text-sm text-ph-subtle",
|
|
5168
5284
|
"data-test": `${dataTest}-events-empty`,
|
|
5169
5285
|
children: "No integration events yet."
|
|
5170
5286
|
}
|
|
5171
|
-
) : /* @__PURE__ */
|
|
5287
|
+
) : /* @__PURE__ */ jsx27("ul", { className: "mt-4 space-y-2", "data-test": `${dataTest}-events-list`, children: events.map((event) => /* @__PURE__ */ jsxs22(
|
|
5172
5288
|
"li",
|
|
5173
5289
|
{
|
|
5174
5290
|
className: "flex items-center justify-between gap-3 rounded-lg border border-ph-border bg-ph-muted px-3 py-2",
|
|
@@ -5179,9 +5295,9 @@ function SuiteIntegrationRules({
|
|
|
5179
5295
|
" \xB7 ",
|
|
5180
5296
|
event.event_type
|
|
5181
5297
|
] }),
|
|
5182
|
-
/* @__PURE__ */
|
|
5298
|
+
/* @__PURE__ */ jsx27("p", { className: "mt-0.5 text-xs text-ph-subtle", children: formatDateTime(event.created_at) })
|
|
5183
5299
|
] }),
|
|
5184
|
-
/* @__PURE__ */
|
|
5300
|
+
/* @__PURE__ */ jsx27(
|
|
5185
5301
|
Badge,
|
|
5186
5302
|
{
|
|
5187
5303
|
variant: event.processed_at ? "success" : "warning",
|
|
@@ -5202,7 +5318,7 @@ function SuiteIntegrationRules({
|
|
|
5202
5318
|
// src/suite/components/suite-clients-projects-directory.tsx
|
|
5203
5319
|
import {
|
|
5204
5320
|
useEffect as useEffect11,
|
|
5205
|
-
useMemo as
|
|
5321
|
+
useMemo as useMemo5,
|
|
5206
5322
|
useRef as useRef6,
|
|
5207
5323
|
useState as useState14
|
|
5208
5324
|
} from "react";
|
|
@@ -5268,7 +5384,7 @@ function paletteIconSrc(imageUrl, color) {
|
|
|
5268
5384
|
}
|
|
5269
5385
|
|
|
5270
5386
|
// src/suite/components/suite-entity-icon.tsx
|
|
5271
|
-
import { jsx as
|
|
5387
|
+
import { jsx as jsx28 } from "react/jsx-runtime";
|
|
5272
5388
|
function SuiteEntityIcon({
|
|
5273
5389
|
imageUrl,
|
|
5274
5390
|
label,
|
|
@@ -5283,7 +5399,7 @@ function SuiteEntityIcon({
|
|
|
5283
5399
|
const neutralBackground = "var(--ph-muted, rgba(127,127,127,0.08))";
|
|
5284
5400
|
if (imageUrl) {
|
|
5285
5401
|
const src = tinted && tint ? paletteIconSrc(imageUrl, tint) : imageUrl;
|
|
5286
|
-
return /* @__PURE__ */
|
|
5402
|
+
return /* @__PURE__ */ jsx28(
|
|
5287
5403
|
"span",
|
|
5288
5404
|
{
|
|
5289
5405
|
className: cn(
|
|
@@ -5294,12 +5410,12 @@ function SuiteEntityIcon({
|
|
|
5294
5410
|
style: __spreadValues({
|
|
5295
5411
|
backgroundColor: tint ? `${tint}18` : neutralBackground
|
|
5296
5412
|
}, style),
|
|
5297
|
-
children: /* @__PURE__ */
|
|
5413
|
+
children: /* @__PURE__ */ jsx28("img", { src: src != null ? src : void 0, alt: "", className: "h-full w-full object-cover" })
|
|
5298
5414
|
}
|
|
5299
5415
|
);
|
|
5300
5416
|
}
|
|
5301
5417
|
const initial = label == null ? void 0 : label.trim().charAt(0).toUpperCase();
|
|
5302
|
-
return /* @__PURE__ */
|
|
5418
|
+
return /* @__PURE__ */ jsx28(
|
|
5303
5419
|
"span",
|
|
5304
5420
|
{
|
|
5305
5421
|
className: cn(
|
|
@@ -5312,7 +5428,7 @@ function SuiteEntityIcon({
|
|
|
5312
5428
|
backgroundColor: tint ? `${tint}18` : neutralBackground
|
|
5313
5429
|
}, style),
|
|
5314
5430
|
"aria-hidden": "true",
|
|
5315
|
-
children: initial ? /* @__PURE__ */
|
|
5431
|
+
children: initial ? /* @__PURE__ */ jsx28("span", { className: "text-[0.7em]", children: initial }) : /* @__PURE__ */ jsx28("span", { className: "block h-1.5 w-1.5 rounded-full bg-current opacity-40" })
|
|
5316
5432
|
}
|
|
5317
5433
|
);
|
|
5318
5434
|
}
|
|
@@ -5321,12 +5437,12 @@ function SuiteEntityIcon({
|
|
|
5321
5437
|
import {
|
|
5322
5438
|
useCallback as useCallback6,
|
|
5323
5439
|
useEffect as useEffect10,
|
|
5324
|
-
useMemo as
|
|
5440
|
+
useMemo as useMemo4,
|
|
5325
5441
|
useRef as useRef5,
|
|
5326
5442
|
useState as useState13
|
|
5327
5443
|
} from "react";
|
|
5328
5444
|
import { Filter as Filter2, FilterList, NavArrowDown as NavArrowDown3, Search as Search2 } from "iconoir-react";
|
|
5329
|
-
import { Fragment as Fragment9, jsx as
|
|
5445
|
+
import { Fragment as Fragment9, jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
5330
5446
|
var PAGE_SIZE = 60;
|
|
5331
5447
|
var DISCOVER_LIMIT = 120;
|
|
5332
5448
|
var ICON_TYPES = [
|
|
@@ -5345,14 +5461,14 @@ function FilterSelect({
|
|
|
5345
5461
|
children
|
|
5346
5462
|
}) {
|
|
5347
5463
|
return /* @__PURE__ */ jsxs23("div", { className: "relative", children: [
|
|
5348
|
-
/* @__PURE__ */
|
|
5464
|
+
/* @__PURE__ */ jsx29(
|
|
5349
5465
|
Icon,
|
|
5350
5466
|
{
|
|
5351
5467
|
className: "pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-ph-mutedtext",
|
|
5352
5468
|
"aria-hidden": true
|
|
5353
5469
|
}
|
|
5354
5470
|
),
|
|
5355
|
-
/* @__PURE__ */
|
|
5471
|
+
/* @__PURE__ */ jsx29(
|
|
5356
5472
|
"select",
|
|
5357
5473
|
{
|
|
5358
5474
|
"aria-label": label,
|
|
@@ -5362,7 +5478,7 @@ function FilterSelect({
|
|
|
5362
5478
|
children
|
|
5363
5479
|
}
|
|
5364
5480
|
),
|
|
5365
|
-
/* @__PURE__ */
|
|
5481
|
+
/* @__PURE__ */ jsx29(
|
|
5366
5482
|
NavArrowDown3,
|
|
5367
5483
|
{
|
|
5368
5484
|
className: "pointer-events-none absolute right-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-ph-mutedtext",
|
|
@@ -5389,7 +5505,7 @@ function SuitePaletteLibrary({
|
|
|
5389
5505
|
const [loadingMore, setLoadingMore] = useState13(false);
|
|
5390
5506
|
const [error, setError] = useState13(null);
|
|
5391
5507
|
const requestId = useRef5(0);
|
|
5392
|
-
const libraryOptions =
|
|
5508
|
+
const libraryOptions = useMemo4(() => {
|
|
5393
5509
|
const list = collections.filter(
|
|
5394
5510
|
(item) => typeFilter === "all" || item.style === typeFilter
|
|
5395
5511
|
);
|
|
@@ -5397,7 +5513,7 @@ function SuitePaletteLibrary({
|
|
|
5397
5513
|
(a, b) => Number(b.featured) - Number(a.featured) || a.name.localeCompare(b.name)
|
|
5398
5514
|
);
|
|
5399
5515
|
}, [collections, typeFilter]);
|
|
5400
|
-
const discoverIcons =
|
|
5516
|
+
const discoverIcons = useMemo4(() => {
|
|
5401
5517
|
const seen = /* @__PURE__ */ new Set();
|
|
5402
5518
|
const out = [];
|
|
5403
5519
|
for (const collection of libraryOptions) {
|
|
@@ -5510,7 +5626,7 @@ function SuitePaletteLibrary({
|
|
|
5510
5626
|
}, [query, collectionFilter, typeFilter]);
|
|
5511
5627
|
const searching = Boolean(query.trim());
|
|
5512
5628
|
const activeLibrary = (_a2 = collections.find((c) => c.slug === collectionFilter)) != null ? _a2 : null;
|
|
5513
|
-
const filteredLibraries =
|
|
5629
|
+
const filteredLibraries = useMemo4(() => {
|
|
5514
5630
|
const term = libraryQuery.trim().toLowerCase();
|
|
5515
5631
|
if (!term) return libraryOptions;
|
|
5516
5632
|
return libraryOptions.filter((c) => c.name.toLowerCase().includes(term));
|
|
@@ -5528,14 +5644,14 @@ function SuitePaletteLibrary({
|
|
|
5528
5644
|
/* @__PURE__ */ jsxs23("div", { ref: libraryRef, className: "space-y-2", children: [
|
|
5529
5645
|
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-2 sm:flex-row", children: [
|
|
5530
5646
|
/* @__PURE__ */ jsxs23("div", { className: "relative flex-1", children: [
|
|
5531
|
-
/* @__PURE__ */
|
|
5647
|
+
/* @__PURE__ */ jsx29(
|
|
5532
5648
|
Search2,
|
|
5533
5649
|
{
|
|
5534
5650
|
className: "pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-ph-mutedtext",
|
|
5535
5651
|
"aria-hidden": true
|
|
5536
5652
|
}
|
|
5537
5653
|
),
|
|
5538
|
-
/* @__PURE__ */
|
|
5654
|
+
/* @__PURE__ */ jsx29(
|
|
5539
5655
|
"input",
|
|
5540
5656
|
{
|
|
5541
5657
|
type: "search",
|
|
@@ -5556,9 +5672,9 @@ function SuitePaletteLibrary({
|
|
|
5556
5672
|
onClick: () => setLibraryOpen((open) => !open),
|
|
5557
5673
|
className: "flex items-center gap-2 rounded-lg border border-ph-border bg-ph-surface px-2.5 py-2 text-sm text-ph-ink hover:border-ph-brand focus:outline-none focus-visible:ring-2 focus-visible:ring-ph-brand",
|
|
5558
5674
|
children: [
|
|
5559
|
-
/* @__PURE__ */
|
|
5560
|
-
/* @__PURE__ */
|
|
5561
|
-
/* @__PURE__ */
|
|
5675
|
+
/* @__PURE__ */ jsx29(FilterList, { className: "h-4 w-4 shrink-0 text-ph-mutedtext", "aria-hidden": true }),
|
|
5676
|
+
/* @__PURE__ */ jsx29("span", { className: "max-w-[10rem] truncate", children: (_b = activeLibrary == null ? void 0 : activeLibrary.name) != null ? _b : "All libraries" }),
|
|
5677
|
+
/* @__PURE__ */ jsx29(
|
|
5562
5678
|
NavArrowDown3,
|
|
5563
5679
|
{
|
|
5564
5680
|
className: cn(
|
|
@@ -5571,27 +5687,27 @@ function SuitePaletteLibrary({
|
|
|
5571
5687
|
]
|
|
5572
5688
|
}
|
|
5573
5689
|
),
|
|
5574
|
-
/* @__PURE__ */
|
|
5690
|
+
/* @__PURE__ */ jsx29(
|
|
5575
5691
|
FilterSelect,
|
|
5576
5692
|
{
|
|
5577
5693
|
icon: Filter2,
|
|
5578
5694
|
label: "Filter by icon type",
|
|
5579
5695
|
value: typeFilter,
|
|
5580
5696
|
onChange: setTypeFilter,
|
|
5581
|
-
children: ICON_TYPES.map((type) => /* @__PURE__ */
|
|
5697
|
+
children: ICON_TYPES.map((type) => /* @__PURE__ */ jsx29("option", { value: type.value, children: type.label }, type.value))
|
|
5582
5698
|
}
|
|
5583
5699
|
)
|
|
5584
5700
|
] }),
|
|
5585
5701
|
libraryOpen ? /* @__PURE__ */ jsxs23("div", { className: "rounded-lg border border-ph-border bg-ph-surface p-2", children: [
|
|
5586
5702
|
/* @__PURE__ */ jsxs23("div", { className: "relative mb-2", children: [
|
|
5587
|
-
/* @__PURE__ */
|
|
5703
|
+
/* @__PURE__ */ jsx29(
|
|
5588
5704
|
Search2,
|
|
5589
5705
|
{
|
|
5590
5706
|
className: "pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-ph-mutedtext",
|
|
5591
5707
|
"aria-hidden": true
|
|
5592
5708
|
}
|
|
5593
5709
|
),
|
|
5594
|
-
/* @__PURE__ */
|
|
5710
|
+
/* @__PURE__ */ jsx29(
|
|
5595
5711
|
"input",
|
|
5596
5712
|
{
|
|
5597
5713
|
type: "search",
|
|
@@ -5611,7 +5727,7 @@ function SuitePaletteLibrary({
|
|
|
5611
5727
|
"aria-label": "Libraries",
|
|
5612
5728
|
className: "max-h-56 overflow-y-auto",
|
|
5613
5729
|
children: [
|
|
5614
|
-
/* @__PURE__ */
|
|
5730
|
+
/* @__PURE__ */ jsx29("li", { children: /* @__PURE__ */ jsx29(
|
|
5615
5731
|
"button",
|
|
5616
5732
|
{
|
|
5617
5733
|
type: "button",
|
|
@@ -5628,7 +5744,7 @@ function SuitePaletteLibrary({
|
|
|
5628
5744
|
children: "All libraries"
|
|
5629
5745
|
}
|
|
5630
5746
|
) }),
|
|
5631
|
-
filteredLibraries.map((collection) => /* @__PURE__ */
|
|
5747
|
+
filteredLibraries.map((collection) => /* @__PURE__ */ jsx29("li", { children: /* @__PURE__ */ jsxs23(
|
|
5632
5748
|
"button",
|
|
5633
5749
|
{
|
|
5634
5750
|
type: "button",
|
|
@@ -5643,19 +5759,19 @@ function SuitePaletteLibrary({
|
|
|
5643
5759
|
collectionFilter === collection.slug ? "bg-ph-muted text-ph-ink" : "text-ph-ink hover:bg-ph-muted"
|
|
5644
5760
|
),
|
|
5645
5761
|
children: [
|
|
5646
|
-
/* @__PURE__ */
|
|
5647
|
-
/* @__PURE__ */
|
|
5762
|
+
/* @__PURE__ */ jsx29("span", { className: "truncate", children: collection.name }),
|
|
5763
|
+
/* @__PURE__ */ jsx29("span", { className: "shrink-0 text-xs text-ph-mutedtext", children: collection.count })
|
|
5648
5764
|
]
|
|
5649
5765
|
}
|
|
5650
5766
|
) }, collection.slug)),
|
|
5651
|
-
filteredLibraries.length === 0 ? /* @__PURE__ */
|
|
5767
|
+
filteredLibraries.length === 0 ? /* @__PURE__ */ jsx29("li", { className: "px-2 py-4 text-center text-sm text-ph-mutedtext", children: "No libraries match." }) : null
|
|
5652
5768
|
]
|
|
5653
5769
|
}
|
|
5654
5770
|
)
|
|
5655
5771
|
] }) : null
|
|
5656
5772
|
] }),
|
|
5657
|
-
error ? /* @__PURE__ */
|
|
5658
|
-
/* @__PURE__ */
|
|
5773
|
+
error ? /* @__PURE__ */ jsx29("p", { className: "text-sm text-ph-danger", children: error }) : loading ? /* @__PURE__ */ jsx29("p", { className: "py-8 text-center text-sm text-ph-mutedtext", children: "Loading icons\u2026" }) : icons.length === 0 ? /* @__PURE__ */ jsx29("p", { className: "py-8 text-center text-sm text-ph-mutedtext", children: "No icons matched. Try another word or filter." }) : /* @__PURE__ */ jsxs23(Fragment9, { children: [
|
|
5774
|
+
/* @__PURE__ */ jsx29("div", { className: "max-h-[320px] overflow-y-auto rounded-lg border border-ph-border p-2", children: /* @__PURE__ */ jsx29("div", { className: "grid grid-cols-6 gap-1.5 sm:grid-cols-8", children: icons.map((icon) => /* @__PURE__ */ jsx29(
|
|
5659
5775
|
"button",
|
|
5660
5776
|
{
|
|
5661
5777
|
type: "button",
|
|
@@ -5663,7 +5779,7 @@ function SuitePaletteLibrary({
|
|
|
5663
5779
|
title: icon.name,
|
|
5664
5780
|
"aria-label": `Use ${icon.name}`,
|
|
5665
5781
|
className: "flex h-10 items-center justify-center rounded-md border border-transparent p-1.5 hover:border-ph-brand hover:bg-ph-muted",
|
|
5666
|
-
children: /* @__PURE__ */
|
|
5782
|
+
children: /* @__PURE__ */ jsx29(
|
|
5667
5783
|
"img",
|
|
5668
5784
|
{
|
|
5669
5785
|
src: icon.url,
|
|
@@ -5683,7 +5799,7 @@ function SuitePaletteLibrary({
|
|
|
5683
5799
|
total,
|
|
5684
5800
|
searching ? " matching" : activeLibrary ? ` in ${activeLibrary.name}` : " across all libraries"
|
|
5685
5801
|
] }),
|
|
5686
|
-
!searching && activeLibrary && icons.length < total ? /* @__PURE__ */
|
|
5802
|
+
!searching && activeLibrary && icons.length < total ? /* @__PURE__ */ jsx29(
|
|
5687
5803
|
"button",
|
|
5688
5804
|
{
|
|
5689
5805
|
type: "button",
|
|
@@ -5702,7 +5818,7 @@ function SuitePaletteLibrary({
|
|
|
5702
5818
|
}
|
|
5703
5819
|
|
|
5704
5820
|
// src/suite/components/suite-clients-projects-directory.tsx
|
|
5705
|
-
import { Fragment as Fragment10, jsx as
|
|
5821
|
+
import { Fragment as Fragment10, jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
5706
5822
|
var DEFAULT_ICON = "";
|
|
5707
5823
|
var DEFAULT_COLOR = "";
|
|
5708
5824
|
function DirectoryIconPicker({
|
|
@@ -5714,10 +5830,10 @@ function DirectoryIconPicker({
|
|
|
5714
5830
|
onBrowse
|
|
5715
5831
|
}) {
|
|
5716
5832
|
return /* @__PURE__ */ jsxs24("div", { className: "space-y-2", children: [
|
|
5717
|
-
/* @__PURE__ */
|
|
5833
|
+
/* @__PURE__ */ jsx30("span", { className: "mb-1.5 block text-sm font-medium text-ph-ink", children: "Icon" }),
|
|
5718
5834
|
/* @__PURE__ */ jsxs24("div", { className: "rounded-lg border border-ph-border bg-ph-muted p-3", children: [
|
|
5719
5835
|
/* @__PURE__ */ jsxs24("div", { className: "flex items-center gap-3", children: [
|
|
5720
|
-
/* @__PURE__ */
|
|
5836
|
+
/* @__PURE__ */ jsx30(
|
|
5721
5837
|
SuiteEntityIcon,
|
|
5722
5838
|
{
|
|
5723
5839
|
imageUrl: preview,
|
|
@@ -5728,10 +5844,10 @@ function DirectoryIconPicker({
|
|
|
5728
5844
|
}
|
|
5729
5845
|
),
|
|
5730
5846
|
/* @__PURE__ */ jsxs24("div", { className: "min-w-0 flex-1", children: [
|
|
5731
|
-
/* @__PURE__ */
|
|
5732
|
-
/* @__PURE__ */
|
|
5847
|
+
/* @__PURE__ */ jsx30("p", { className: "text-sm font-medium text-ph-ink", children: preview ? "Custom image" : "No icon yet" }),
|
|
5848
|
+
/* @__PURE__ */ jsx30("p", { className: "text-xs text-ph-mutedtext", children: preview ? "Shown on cards and lists." : "Browse the library or upload your own." })
|
|
5733
5849
|
] }),
|
|
5734
|
-
onBrowse ? /* @__PURE__ */
|
|
5850
|
+
onBrowse ? /* @__PURE__ */ jsx30(
|
|
5735
5851
|
"button",
|
|
5736
5852
|
{
|
|
5737
5853
|
type: "button",
|
|
@@ -5741,7 +5857,7 @@ function DirectoryIconPicker({
|
|
|
5741
5857
|
}
|
|
5742
5858
|
) : null
|
|
5743
5859
|
] }),
|
|
5744
|
-
/* @__PURE__ */
|
|
5860
|
+
/* @__PURE__ */ jsx30("div", { className: "mt-3", children: /* @__PURE__ */ jsx30(
|
|
5745
5861
|
FileUpload,
|
|
5746
5862
|
{
|
|
5747
5863
|
accept: "image/png,image/jpeg,image/gif,image/webp,image/svg+xml,.svg",
|
|
@@ -5758,7 +5874,7 @@ function DirectoryIconPicker({
|
|
|
5758
5874
|
className: "mt-2 inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs text-ph-mutedtext hover:bg-ph-surface hover:text-ph-ink",
|
|
5759
5875
|
onClick: onClear,
|
|
5760
5876
|
children: [
|
|
5761
|
-
/* @__PURE__ */
|
|
5877
|
+
/* @__PURE__ */ jsx30(Trash, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
5762
5878
|
" Remove image"
|
|
5763
5879
|
]
|
|
5764
5880
|
}
|
|
@@ -5769,7 +5885,7 @@ function DirectoryIconPicker({
|
|
|
5769
5885
|
function DirectoryIcon({
|
|
5770
5886
|
item
|
|
5771
5887
|
}) {
|
|
5772
|
-
return /* @__PURE__ */
|
|
5888
|
+
return /* @__PURE__ */ jsx30(
|
|
5773
5889
|
SuiteEntityIcon,
|
|
5774
5890
|
{
|
|
5775
5891
|
imageUrl: item.icon_image,
|
|
@@ -5831,7 +5947,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
5831
5947
|
else if (selectedClientId)
|
|
5832
5948
|
(_b = clientButtonRefs.current[selectedClientId]) == null ? void 0 : _b.focus();
|
|
5833
5949
|
}, [mobileDetail, selectedClientId]);
|
|
5834
|
-
const filteredClients =
|
|
5950
|
+
const filteredClients = useMemo5(() => {
|
|
5835
5951
|
const value = query.trim().toLowerCase();
|
|
5836
5952
|
return [...clients].sort((a, b) => a.name.localeCompare(b.name)).filter((client) => !value || client.name.toLowerCase().includes(value));
|
|
5837
5953
|
}, [clients, query]);
|
|
@@ -6000,8 +6116,8 @@ function SuiteClientsProjectsDirectory({
|
|
|
6000
6116
|
}
|
|
6001
6117
|
}
|
|
6002
6118
|
return /* @__PURE__ */ jsxs24("div", { "data-test": dataTest, className: "space-y-3", children: [
|
|
6003
|
-
error || mutationError ? /* @__PURE__ */
|
|
6004
|
-
loading ? /* @__PURE__ */
|
|
6119
|
+
error || mutationError ? /* @__PURE__ */ jsx30(Alert, { status: "danger", live: "assertive", children: error || mutationError }) : null,
|
|
6120
|
+
loading ? /* @__PURE__ */ jsx30("p", { className: "text-sm text-ph-mutedtext", children: "Loading directory..." }) : /* @__PURE__ */ jsxs24("div", { className: "overflow-hidden rounded-xl border border-ph-border bg-ph-surface lg:grid lg:min-h-[22rem] lg:grid-cols-[minmax(14rem,18rem)_1fr]", children: [
|
|
6005
6121
|
/* @__PURE__ */ jsxs24(
|
|
6006
6122
|
"section",
|
|
6007
6123
|
{
|
|
@@ -6012,14 +6128,14 @@ function SuiteClientsProjectsDirectory({
|
|
|
6012
6128
|
children: [
|
|
6013
6129
|
/* @__PURE__ */ jsxs24("div", { className: "flex h-14 items-center gap-2 border-b border-ph-border px-3", children: [
|
|
6014
6130
|
/* @__PURE__ */ jsxs24("div", { className: "relative min-w-0 flex-1", children: [
|
|
6015
|
-
/* @__PURE__ */
|
|
6131
|
+
/* @__PURE__ */ jsx30(
|
|
6016
6132
|
Search3,
|
|
6017
6133
|
{
|
|
6018
6134
|
className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-ph-mutedtext",
|
|
6019
6135
|
"aria-hidden": true
|
|
6020
6136
|
}
|
|
6021
6137
|
),
|
|
6022
|
-
/* @__PURE__ */
|
|
6138
|
+
/* @__PURE__ */ jsx30(
|
|
6023
6139
|
Input,
|
|
6024
6140
|
{
|
|
6025
6141
|
hideLabel: true,
|
|
@@ -6031,18 +6147,18 @@ function SuiteClientsProjectsDirectory({
|
|
|
6031
6147
|
}
|
|
6032
6148
|
)
|
|
6033
6149
|
] }),
|
|
6034
|
-
canEdit && onCreateClient ? /* @__PURE__ */
|
|
6150
|
+
canEdit && onCreateClient ? /* @__PURE__ */ jsx30(
|
|
6035
6151
|
Button,
|
|
6036
6152
|
{
|
|
6037
6153
|
size: "sm",
|
|
6038
6154
|
variant: "primary",
|
|
6039
|
-
icon: /* @__PURE__ */
|
|
6155
|
+
icon: /* @__PURE__ */ jsx30(Plus2, { className: "h-4 w-4" }),
|
|
6040
6156
|
onClick: () => openNew("client"),
|
|
6041
6157
|
children: "New client"
|
|
6042
6158
|
}
|
|
6043
6159
|
) : null
|
|
6044
6160
|
] }),
|
|
6045
|
-
/* @__PURE__ */
|
|
6161
|
+
/* @__PURE__ */ jsx30(
|
|
6046
6162
|
"ul",
|
|
6047
6163
|
{
|
|
6048
6164
|
role: "listbox",
|
|
@@ -6053,7 +6169,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6053
6169
|
const count = projects.filter(
|
|
6054
6170
|
(project) => project.clientId === client.id
|
|
6055
6171
|
).length;
|
|
6056
|
-
return /* @__PURE__ */
|
|
6172
|
+
return /* @__PURE__ */ jsx30("li", { role: "none", children: /* @__PURE__ */ jsxs24(
|
|
6057
6173
|
"button",
|
|
6058
6174
|
{
|
|
6059
6175
|
type: "button",
|
|
@@ -6070,9 +6186,9 @@ function SuiteClientsProjectsDirectory({
|
|
|
6070
6186
|
selected ? "bg-ph-muted" : "hover:bg-ph-canvas"
|
|
6071
6187
|
),
|
|
6072
6188
|
children: [
|
|
6073
|
-
/* @__PURE__ */
|
|
6189
|
+
/* @__PURE__ */ jsx30(DirectoryIcon, { item: client }),
|
|
6074
6190
|
/* @__PURE__ */ jsxs24("span", { className: "min-w-0 flex-1", children: [
|
|
6075
|
-
/* @__PURE__ */
|
|
6191
|
+
/* @__PURE__ */ jsx30("span", { className: "block truncate text-sm font-medium text-ph-ink", children: client.name }),
|
|
6076
6192
|
/* @__PURE__ */ jsxs24("span", { className: "text-xs text-ph-mutedtext", children: [
|
|
6077
6193
|
count,
|
|
6078
6194
|
" project",
|
|
@@ -6082,7 +6198,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6082
6198
|
]
|
|
6083
6199
|
}
|
|
6084
6200
|
) }, client.id);
|
|
6085
|
-
}) : /* @__PURE__ */
|
|
6201
|
+
}) : /* @__PURE__ */ jsx30("li", { className: "px-3 py-8 text-center text-sm text-ph-mutedtext", children: clients.length ? "No matches." : "Add a client to get started." })
|
|
6086
6202
|
}
|
|
6087
6203
|
)
|
|
6088
6204
|
]
|
|
@@ -6096,8 +6212,8 @@ function SuiteClientsProjectsDirectory({
|
|
|
6096
6212
|
mobileDetail ? "flex" : "hidden lg:flex"
|
|
6097
6213
|
),
|
|
6098
6214
|
children: [
|
|
6099
|
-
/* @__PURE__ */
|
|
6100
|
-
/* @__PURE__ */
|
|
6215
|
+
/* @__PURE__ */ jsx30("div", { className: "flex min-h-14 items-center gap-2 border-b border-ph-border px-3 py-2", children: selectedClient ? /* @__PURE__ */ jsxs24(Fragment10, { children: [
|
|
6216
|
+
/* @__PURE__ */ jsx30(
|
|
6101
6217
|
"button",
|
|
6102
6218
|
{
|
|
6103
6219
|
type: "button",
|
|
@@ -6108,36 +6224,36 @@ function SuiteClientsProjectsDirectory({
|
|
|
6108
6224
|
setMobileDetail(false);
|
|
6109
6225
|
},
|
|
6110
6226
|
"aria-label": "Back to clients",
|
|
6111
|
-
children: /* @__PURE__ */
|
|
6227
|
+
children: /* @__PURE__ */ jsx30(ArrowLeft, { className: "h-4 w-4" })
|
|
6112
6228
|
}
|
|
6113
6229
|
),
|
|
6114
|
-
/* @__PURE__ */
|
|
6230
|
+
/* @__PURE__ */ jsx30(DirectoryIcon, { item: selectedClient }),
|
|
6115
6231
|
/* @__PURE__ */ jsxs24("div", { className: "min-w-0 flex-1", children: [
|
|
6116
|
-
/* @__PURE__ */
|
|
6232
|
+
/* @__PURE__ */ jsx30("h3", { className: "truncate text-sm font-semibold text-ph-ink", children: selectedClient.name }),
|
|
6117
6233
|
/* @__PURE__ */ jsxs24("p", { className: "text-xs text-ph-mutedtext", children: [
|
|
6118
6234
|
selectedProjects.length,
|
|
6119
6235
|
" project",
|
|
6120
6236
|
selectedProjects.length === 1 ? "" : "s"
|
|
6121
6237
|
] })
|
|
6122
6238
|
] }),
|
|
6123
|
-
canEdit && (onUpdateClient || onDeleteClient) ? /* @__PURE__ */
|
|
6239
|
+
canEdit && (onUpdateClient || onDeleteClient) ? /* @__PURE__ */ jsx30("div", { onClick: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx30(
|
|
6124
6240
|
DropdownMenu,
|
|
6125
6241
|
{
|
|
6126
6242
|
"aria-label": `Actions for ${selectedClient.name}`,
|
|
6127
6243
|
align: "end",
|
|
6128
6244
|
trigger: /* @__PURE__ */ jsxs24("span", { className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-ph-mutedtext hover:bg-ph-muted hover:text-ph-ink", children: [
|
|
6129
|
-
/* @__PURE__ */
|
|
6130
|
-
/* @__PURE__ */
|
|
6245
|
+
/* @__PURE__ */ jsx30(MoreHorizontal, { className: "h-4 w-4", "aria-hidden": true }),
|
|
6246
|
+
/* @__PURE__ */ jsx30("span", { className: "sr-only", children: "Client actions" })
|
|
6131
6247
|
] }),
|
|
6132
6248
|
children: /* @__PURE__ */ jsxs24("div", { className: "p-1", children: [
|
|
6133
|
-
onUpdateClient ? /* @__PURE__ */
|
|
6249
|
+
onUpdateClient ? /* @__PURE__ */ jsx30(
|
|
6134
6250
|
DropdownItem,
|
|
6135
6251
|
{
|
|
6136
6252
|
onClick: () => openEdit(selectedClient, "client"),
|
|
6137
6253
|
children: "Edit client"
|
|
6138
6254
|
}
|
|
6139
6255
|
) : null,
|
|
6140
|
-
onDeleteClient ? /* @__PURE__ */
|
|
6256
|
+
onDeleteClient ? /* @__PURE__ */ jsx30(
|
|
6141
6257
|
DropdownItem,
|
|
6142
6258
|
{
|
|
6143
6259
|
className: "text-red-600",
|
|
@@ -6148,17 +6264,17 @@ function SuiteClientsProjectsDirectory({
|
|
|
6148
6264
|
] })
|
|
6149
6265
|
}
|
|
6150
6266
|
) }) : null
|
|
6151
|
-
] }) : /* @__PURE__ */
|
|
6152
|
-
canEdit && onCreateProject ? /* @__PURE__ */
|
|
6267
|
+
] }) : /* @__PURE__ */ jsx30("p", { className: "text-sm text-ph-mutedtext", children: "Select a client" }) }),
|
|
6268
|
+
canEdit && onCreateProject ? /* @__PURE__ */ jsx30("div", { className: "border-b border-ph-border p-3", children: /* @__PURE__ */ jsx30(
|
|
6153
6269
|
Button,
|
|
6154
6270
|
{
|
|
6155
6271
|
variant: "primary",
|
|
6156
|
-
icon: /* @__PURE__ */
|
|
6272
|
+
icon: /* @__PURE__ */ jsx30(Plus2, { className: "h-4 w-4" }),
|
|
6157
6273
|
onClick: () => openNew("project"),
|
|
6158
6274
|
children: "Add project"
|
|
6159
6275
|
}
|
|
6160
6276
|
) }) : null,
|
|
6161
|
-
/* @__PURE__ */
|
|
6277
|
+
/* @__PURE__ */ jsx30("ul", { className: "flex-1 p-2", children: selectedClient && selectedProjects.length ? selectedProjects.map((project) => /* @__PURE__ */ jsx30("li", { children: /* @__PURE__ */ jsxs24(
|
|
6162
6278
|
"div",
|
|
6163
6279
|
{
|
|
6164
6280
|
className: "flex items-center gap-3 rounded-lg px-2 py-1 hover:bg-ph-canvas",
|
|
@@ -6171,9 +6287,9 @@ function SuiteClientsProjectsDirectory({
|
|
|
6171
6287
|
className: "flex min-w-0 flex-1 items-center gap-3 rounded-lg py-1 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-brand",
|
|
6172
6288
|
onClick: () => openEdit(project, "project"),
|
|
6173
6289
|
children: [
|
|
6174
|
-
/* @__PURE__ */
|
|
6290
|
+
/* @__PURE__ */ jsx30(DirectoryIcon, { item: project }),
|
|
6175
6291
|
/* @__PURE__ */ jsxs24("span", { className: "min-w-0 flex-1", children: [
|
|
6176
|
-
/* @__PURE__ */
|
|
6292
|
+
/* @__PURE__ */ jsx30(
|
|
6177
6293
|
"span",
|
|
6178
6294
|
{
|
|
6179
6295
|
className: cn(
|
|
@@ -6183,36 +6299,36 @@ function SuiteClientsProjectsDirectory({
|
|
|
6183
6299
|
children: project.name
|
|
6184
6300
|
}
|
|
6185
6301
|
),
|
|
6186
|
-
/* @__PURE__ */
|
|
6302
|
+
/* @__PURE__ */ jsx30("span", { className: "text-xs text-ph-mutedtext", children: project.isArchived ? "Archived" : "Active" })
|
|
6187
6303
|
] })
|
|
6188
6304
|
]
|
|
6189
6305
|
}
|
|
6190
6306
|
),
|
|
6191
|
-
canEdit && (onUpdateProject || onDeleteProject) ? /* @__PURE__ */
|
|
6307
|
+
canEdit && (onUpdateProject || onDeleteProject) ? /* @__PURE__ */ jsx30("div", { onClick: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx30(
|
|
6192
6308
|
DropdownMenu,
|
|
6193
6309
|
{
|
|
6194
6310
|
"aria-label": `Actions for ${project.name}`,
|
|
6195
6311
|
align: "end",
|
|
6196
6312
|
trigger: /* @__PURE__ */ jsxs24("span", { className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-ph-mutedtext hover:bg-ph-muted hover:text-ph-ink", children: [
|
|
6197
|
-
/* @__PURE__ */
|
|
6313
|
+
/* @__PURE__ */ jsx30(
|
|
6198
6314
|
MoreHorizontal,
|
|
6199
6315
|
{
|
|
6200
6316
|
className: "h-4 w-4",
|
|
6201
6317
|
"aria-hidden": true
|
|
6202
6318
|
}
|
|
6203
6319
|
),
|
|
6204
|
-
/* @__PURE__ */
|
|
6320
|
+
/* @__PURE__ */ jsx30("span", { className: "sr-only", children: "Project actions" })
|
|
6205
6321
|
] }),
|
|
6206
6322
|
children: /* @__PURE__ */ jsxs24("div", { className: "p-1", children: [
|
|
6207
6323
|
onUpdateProject ? /* @__PURE__ */ jsxs24(Fragment10, { children: [
|
|
6208
|
-
/* @__PURE__ */
|
|
6324
|
+
/* @__PURE__ */ jsx30(
|
|
6209
6325
|
DropdownItem,
|
|
6210
6326
|
{
|
|
6211
6327
|
onClick: () => openEdit(project, "project"),
|
|
6212
6328
|
children: "Edit project"
|
|
6213
6329
|
}
|
|
6214
6330
|
),
|
|
6215
|
-
/* @__PURE__ */
|
|
6331
|
+
/* @__PURE__ */ jsx30(
|
|
6216
6332
|
DropdownItem,
|
|
6217
6333
|
{
|
|
6218
6334
|
onClick: () => void toggleArchive(project),
|
|
@@ -6220,7 +6336,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6220
6336
|
}
|
|
6221
6337
|
)
|
|
6222
6338
|
] }) : null,
|
|
6223
|
-
onDeleteProject ? /* @__PURE__ */
|
|
6339
|
+
onDeleteProject ? /* @__PURE__ */ jsx30(
|
|
6224
6340
|
DropdownItem,
|
|
6225
6341
|
{
|
|
6226
6342
|
className: "text-red-600",
|
|
@@ -6233,20 +6349,20 @@ function SuiteClientsProjectsDirectory({
|
|
|
6233
6349
|
) }) : null
|
|
6234
6350
|
]
|
|
6235
6351
|
}
|
|
6236
|
-
) }, project.id)) : /* @__PURE__ */
|
|
6352
|
+
) }, project.id)) : /* @__PURE__ */ jsx30("li", { className: "px-3 py-8 text-center text-sm text-ph-mutedtext", children: selectedClient ? "No projects yet." : "Select a client to see its projects." }) })
|
|
6237
6353
|
]
|
|
6238
6354
|
}
|
|
6239
6355
|
)
|
|
6240
6356
|
] }),
|
|
6241
|
-
/* @__PURE__ */
|
|
6357
|
+
/* @__PURE__ */ jsx30(
|
|
6242
6358
|
Modal,
|
|
6243
6359
|
{
|
|
6244
6360
|
open: editing !== null,
|
|
6245
6361
|
onClose: closeEditor,
|
|
6246
6362
|
title: (editing == null ? void 0 : editing.kind.includes("project")) ? editing.kind === "new-project" ? "New project" : "Edit project" : (editing == null ? void 0 : editing.kind) === "new-client" ? "New client" : "Edit client",
|
|
6247
6363
|
footer: /* @__PURE__ */ jsxs24("div", { className: "flex justify-end gap-2", children: [
|
|
6248
|
-
/* @__PURE__ */
|
|
6249
|
-
/* @__PURE__ */
|
|
6364
|
+
/* @__PURE__ */ jsx30(Button, { variant: "tertiary", onClick: closeEditor, disabled: saving, children: "Cancel" }),
|
|
6365
|
+
/* @__PURE__ */ jsx30(
|
|
6250
6366
|
Button,
|
|
6251
6367
|
{
|
|
6252
6368
|
variant: "primary",
|
|
@@ -6257,7 +6373,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6257
6373
|
)
|
|
6258
6374
|
] }),
|
|
6259
6375
|
children: /* @__PURE__ */ jsxs24("div", { className: "space-y-3", children: [
|
|
6260
|
-
/* @__PURE__ */
|
|
6376
|
+
/* @__PURE__ */ jsx30(
|
|
6261
6377
|
Input,
|
|
6262
6378
|
{
|
|
6263
6379
|
label: "Name",
|
|
@@ -6266,7 +6382,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6266
6382
|
onChange: (event) => setDraft(__spreadProps(__spreadValues({}, draft), { name: event.target.value }))
|
|
6267
6383
|
}
|
|
6268
6384
|
),
|
|
6269
|
-
/* @__PURE__ */
|
|
6385
|
+
/* @__PURE__ */ jsx30(
|
|
6270
6386
|
DirectoryIconPicker,
|
|
6271
6387
|
{
|
|
6272
6388
|
preview,
|
|
@@ -6278,9 +6394,9 @@ function SuiteClientsProjectsDirectory({
|
|
|
6278
6394
|
}
|
|
6279
6395
|
),
|
|
6280
6396
|
/* @__PURE__ */ jsxs24("div", { children: [
|
|
6281
|
-
/* @__PURE__ */
|
|
6397
|
+
/* @__PURE__ */ jsx30("span", { className: "mb-1.5 block text-sm font-medium text-ph-ink", children: "Colour" }),
|
|
6282
6398
|
/* @__PURE__ */ jsxs24("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
6283
|
-
/* @__PURE__ */
|
|
6399
|
+
/* @__PURE__ */ jsx30(
|
|
6284
6400
|
"button",
|
|
6285
6401
|
{
|
|
6286
6402
|
type: "button",
|
|
@@ -6292,7 +6408,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6292
6408
|
"flex h-8 w-8 items-center justify-center rounded-full border border-ph-border bg-ph-surface text-ph-mutedtext ring-offset-2",
|
|
6293
6409
|
!draft.color && "ring-2 ring-ph-brand"
|
|
6294
6410
|
),
|
|
6295
|
-
children: /* @__PURE__ */
|
|
6411
|
+
children: /* @__PURE__ */ jsx30(Prohibition, { className: "h-4 w-4", "aria-hidden": true })
|
|
6296
6412
|
}
|
|
6297
6413
|
),
|
|
6298
6414
|
[
|
|
@@ -6303,7 +6419,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6303
6419
|
"#ef4444",
|
|
6304
6420
|
"#a855f7",
|
|
6305
6421
|
"#64748b"
|
|
6306
|
-
].map((color) => /* @__PURE__ */
|
|
6422
|
+
].map((color) => /* @__PURE__ */ jsx30(
|
|
6307
6423
|
"button",
|
|
6308
6424
|
{
|
|
6309
6425
|
type: "button",
|
|
@@ -6338,7 +6454,7 @@ function SuiteClientsProjectsDirectory({
|
|
|
6338
6454
|
},
|
|
6339
6455
|
title: "Custom colour",
|
|
6340
6456
|
children: [
|
|
6341
|
-
/* @__PURE__ */
|
|
6457
|
+
/* @__PURE__ */ jsx30("span", { className: "flex h-4 w-4 items-center justify-center rounded-full bg-ph-surface", children: [
|
|
6342
6458
|
"#6366f1",
|
|
6343
6459
|
"#0ea5e9",
|
|
6344
6460
|
"#10b981",
|
|
@@ -6346,14 +6462,14 @@ function SuiteClientsProjectsDirectory({
|
|
|
6346
6462
|
"#ef4444",
|
|
6347
6463
|
"#a855f7",
|
|
6348
6464
|
"#64748b"
|
|
6349
|
-
].includes(draft.color) ? /* @__PURE__ */
|
|
6465
|
+
].includes(draft.color) ? /* @__PURE__ */ jsx30(Plus2, { className: "h-3 w-3 text-ph-ink", "aria-hidden": true }) : /* @__PURE__ */ jsx30(
|
|
6350
6466
|
"span",
|
|
6351
6467
|
{
|
|
6352
6468
|
className: "h-2.5 w-2.5 rounded-full",
|
|
6353
6469
|
style: { backgroundColor: draft.color }
|
|
6354
6470
|
}
|
|
6355
6471
|
) }),
|
|
6356
|
-
/* @__PURE__ */
|
|
6472
|
+
/* @__PURE__ */ jsx30(
|
|
6357
6473
|
"input",
|
|
6358
6474
|
{
|
|
6359
6475
|
type: "color",
|
|
@@ -6375,13 +6491,13 @@ function SuiteClientsProjectsDirectory({
|
|
|
6375
6491
|
value: draftClientId != null ? draftClientId : "",
|
|
6376
6492
|
onChange: (event) => setDraftClientId(event.target.value || null),
|
|
6377
6493
|
children: [
|
|
6378
|
-
/* @__PURE__ */
|
|
6379
|
-
clients.map((client) => /* @__PURE__ */
|
|
6494
|
+
/* @__PURE__ */ jsx30("option", { value: "", children: "No client" }),
|
|
6495
|
+
clients.map((client) => /* @__PURE__ */ jsx30("option", { value: client.id, children: client.name }, client.id))
|
|
6380
6496
|
]
|
|
6381
6497
|
}
|
|
6382
6498
|
) : null,
|
|
6383
6499
|
(editing == null ? void 0 : editing.kind.includes("project")) ? /* @__PURE__ */ jsxs24("label", { className: "flex items-center gap-2 text-sm text-ph-ink", children: [
|
|
6384
|
-
/* @__PURE__ */
|
|
6500
|
+
/* @__PURE__ */ jsx30(
|
|
6385
6501
|
"input",
|
|
6386
6502
|
{
|
|
6387
6503
|
type: "checkbox",
|
|
@@ -6394,24 +6510,24 @@ function SuiteClientsProjectsDirectory({
|
|
|
6394
6510
|
] })
|
|
6395
6511
|
}
|
|
6396
6512
|
),
|
|
6397
|
-
libraryOpen ? /* @__PURE__ */
|
|
6513
|
+
libraryOpen ? /* @__PURE__ */ jsx30(
|
|
6398
6514
|
Modal,
|
|
6399
6515
|
{
|
|
6400
6516
|
open: true,
|
|
6401
6517
|
onClose: () => setLibraryOpen(false),
|
|
6402
6518
|
title: "Icon library",
|
|
6403
|
-
children: renderIconLibrary ? renderIconLibrary({ onPick: pickFromLibrary }) : /* @__PURE__ */
|
|
6519
|
+
children: renderIconLibrary ? renderIconLibrary({ onPick: pickFromLibrary }) : /* @__PURE__ */ jsx30(SuitePaletteLibrary, { onPick: pickFromLibrary })
|
|
6404
6520
|
}
|
|
6405
6521
|
) : null,
|
|
6406
|
-
/* @__PURE__ */
|
|
6522
|
+
/* @__PURE__ */ jsx30(
|
|
6407
6523
|
Modal,
|
|
6408
6524
|
{
|
|
6409
6525
|
open: confirming !== null,
|
|
6410
6526
|
onClose: () => setConfirming(null),
|
|
6411
6527
|
title: "Confirm deletion",
|
|
6412
6528
|
footer: /* @__PURE__ */ jsxs24("div", { className: "flex justify-end gap-2", children: [
|
|
6413
|
-
/* @__PURE__ */
|
|
6414
|
-
/* @__PURE__ */
|
|
6529
|
+
/* @__PURE__ */ jsx30(Button, { variant: "tertiary", onClick: () => setConfirming(null), children: "Cancel" }),
|
|
6530
|
+
/* @__PURE__ */ jsx30(Button, { variant: "primary", onClick: () => void confirmRemove(), children: "Delete" })
|
|
6415
6531
|
] }),
|
|
6416
6532
|
children: /* @__PURE__ */ jsxs24("p", { className: "text-sm text-ph-ink", children: [
|
|
6417
6533
|
"Delete ",
|
|
@@ -6444,6 +6560,7 @@ export {
|
|
|
6444
6560
|
SUITE_GLYPHS,
|
|
6445
6561
|
SUITE_ICON_NAMES,
|
|
6446
6562
|
SUITE_MUTATED_EVENT,
|
|
6563
|
+
SUITE_NOTIFICATIONS_POLL_MS,
|
|
6447
6564
|
SUITE_OPEN_ASK_AI_EVENT,
|
|
6448
6565
|
SUITE_SIDEBAR_WIDTH_COOKIE,
|
|
6449
6566
|
SUITE_SIDEBAR_WIDTH_KEY,
|
|
@@ -6466,6 +6583,7 @@ export {
|
|
|
6466
6583
|
SuiteMobileHeader,
|
|
6467
6584
|
SuiteMotionProvider,
|
|
6468
6585
|
SuiteNotificationBell,
|
|
6586
|
+
SuiteNotificationsProvider,
|
|
6469
6587
|
SuitePage,
|
|
6470
6588
|
SuitePageHeader,
|
|
6471
6589
|
SuitePaletteLibrary,
|
|
@@ -6521,5 +6639,6 @@ export {
|
|
|
6521
6639
|
suiteThemeBootScript,
|
|
6522
6640
|
useIdleMount,
|
|
6523
6641
|
useSidebarWidth,
|
|
6642
|
+
useSuiteNotifications,
|
|
6524
6643
|
useSuiteTheme
|
|
6525
6644
|
};
|