@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.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/components/suite-notification-bell.tsx
1137
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1138
- var POLL_MS = 6e4;
1139
- function timeAgo(iso) {
1140
- const then = new Date(iso).getTime();
1141
- if (Number.isNaN(then)) return "";
1142
- const secs = Math.max(0, Math.round((Date.now() - then) / 1e3));
1143
- if (secs < 60) return "just now";
1144
- const mins = Math.round(secs / 60);
1145
- if (mins < 60) return `${mins}m ago`;
1146
- const hrs = Math.round(mins / 60);
1147
- if (hrs < 24) return `${hrs}h ago`;
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 SuiteNotificationBell({
1158
+ function SuiteNotificationsProvider({
1151
1159
  fetchNotifications,
1152
1160
  markRead,
1153
- markAllRead,
1154
- dropdownMenu: DropdownMenu2,
1161
+ markAllRead: markAllReadRequest,
1162
+ pollMs = SUITE_NOTIFICATIONS_POLL_MS,
1155
1163
  cacheKey = "suite-notifications-cache",
1156
- dataTest = "suite-notifications",
1157
- triggerId,
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
- setItems(data.notifications);
1168
- setUnread(data.unread_count);
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
- const cached = JSON.parse(raw);
1192
- if (Array.isArray(cached.notifications)) {
1193
- setItems(cached.notifications);
1194
- setUnread((_a2 = cached.unread_count) != null ? _a2 : 0);
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
- const kick = window.setTimeout(() => void load(), 0);
1202
- const id = window.setInterval(() => void load(), POLL_MS);
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
- window.clearTimeout(kick);
1205
- window.clearInterval(id);
1227
+ stop();
1228
+ document.removeEventListener("visibilitychange", onVisibilityChange);
1206
1229
  };
1207
- }, [load, cacheKey]);
1208
- const onOpenChange = useCallback(
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 openItem = useCallback(
1216
- async (n) => {
1238
+ const select = useCallback(
1239
+ (notification) => {
1217
1240
  setOpen(false);
1218
- if (!n.read_at) {
1219
- setItems(
1241
+ if (!notification.read_at) {
1242
+ setNotifications(
1220
1243
  (prev) => prev.map(
1221
- (i) => i.id === n.id ? __spreadProps(__spreadValues({}, i), { read_at: (/* @__PURE__ */ new Date()).toISOString() }) : i
1244
+ (item) => item.id === notification.id ? __spreadProps(__spreadValues({}, item), { read_at: (/* @__PURE__ */ new Date()).toISOString() }) : item
1222
1245
  )
1223
1246
  );
1224
- setUnread((u) => Math.max(0, u - 1));
1225
- try {
1226
- await markRead(n.id);
1227
- } catch (e) {
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(n.href, n.source_app);
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(n.source_app);
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 markAll = useCallback(async () => {
1263
- setItems(
1264
- (prev) => prev.map((i) => {
1292
+ const markAllRead = useCallback(() => {
1293
+ setNotifications(
1294
+ (prev) => prev.map((item) => {
1265
1295
  var _a2;
1266
- return __spreadProps(__spreadValues({}, i), {
1267
- read_at: (_a2 = i.read_at) != null ? _a2 : (/* @__PURE__ */ new Date()).toISOString()
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
- setUnread(0);
1272
- try {
1273
- await markAllRead();
1274
- } catch (e) {
1275
- }
1276
- }, [markAllRead]);
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__ */ jsx6("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: [
1288
- /* @__PURE__ */ jsx6(Bell, { className: "h-5 w-5", strokeWidth: 1.75, "aria-hidden": true }),
1289
- unread > 0 ? /* @__PURE__ */ jsx6("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
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__ */ jsx6("span", { className: "text-sm font-semibold text-ph-ink", children: "Notifications" }),
1294
- unread > 0 ? /* @__PURE__ */ jsx6(
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: markAll,
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__ */ jsx6("div", { className: "max-h-80 overflow-y-auto py-1", children: items.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "px-3 py-6 text-center text-sm text-ph-mutedtext", children: "You're all caught up." }) : items.map((n) => /* @__PURE__ */ jsxs6(
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: () => void openItem(n),
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__ */ jsx6(
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__ */ jsx6("span", { className: "truncate text-sm font-medium text-ph-ink", children: n.title })
1404
+ /* @__PURE__ */ jsx7("span", { className: "truncate text-sm font-medium text-ph-ink", children: n.title })
1323
1405
  ] }),
1324
- n.body ? /* @__PURE__ */ jsx6("span", { className: "line-clamp-2 text-xs text-ph-mutedtext", children: n.body }) : null,
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 jsx7 } from "react/jsx-runtime";
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__ */ jsx7(
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 jsx8 } from "react/jsx-runtime";
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__ */ jsx8(Fragment3, { children });
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 jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
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__ */ jsx9(Dialog.Root, { open, onOpenChange: (nextOpen) => !nextOpen && onClose(), children: /* @__PURE__ */ jsxs7(Dialog.Portal, { forceMount: true, children: [
1458
- /* @__PURE__ */ jsx9(
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__ */ jsx9(Dialog.Content, { forceMount: true, asChild: true, children: /* @__PURE__ */ jsxs7(
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__ */ jsx9(Dialog.Title, { className: "sr-only", children: dialogLabel }),
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__ */ jsx9("span", { className: "truncate text-sm font-semibold text-ph-ink", children: title }) : null,
1496
- /* @__PURE__ */ jsx9(Dialog.Close, { asChild: true, children: /* @__PURE__ */ jsx9(
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__ */ jsx9(X, { className: "h-4 w-4", "aria-hidden": true })
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__ */ jsx9(
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 jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
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__ */ jsx10(
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__ */ jsx10(MenuIcon, { className: "h-5 w-5", "aria-hidden": true })
1638
+ children: /* @__PURE__ */ jsx11(MenuIcon, { className: "h-5 w-5", "aria-hidden": true })
1557
1639
  }
1558
1640
  ) : null,
1559
- /* @__PURE__ */ jsx10(
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__ */ jsx10("div", { className: "flex shrink-0 items-center gap-1", children: actions }) : null
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 jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
1663
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1582
1664
  function SuiteBreadcrumbs({ items, className }) {
1583
- return /* @__PURE__ */ jsx11("nav", { "aria-label": "Breadcrumb", className, children: /* @__PURE__ */ jsx11("ol", { className: "flex min-w-0 items-center gap-1.5", children: items.map((item, index) => {
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__ */ jsx11("span", { className: "select-none text-ph-border", "aria-hidden": "true", children: "/" }) : null,
1587
- item.href && !isLast ? /* @__PURE__ */ jsx11(
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__ */ jsx11(
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__ */ jsx11(
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__ */ jsx11(
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__ */ jsx11("div", { className: "mb-0.5 flex min-w-0 items-center gap-1.5 text-xs text-ph-subtle", children: eyebrow }) : null,
1711
- breadcrumb ? /* @__PURE__ */ jsx11("div", { className: "mb-0.5 flex min-w-0 items-center gap-1.5 text-xs text-ph-subtle", children: breadcrumb }) : null,
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__ */ jsx11(
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__ */ jsx11(
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__ */ jsx11("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
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__ */ jsx11(
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__ */ jsx11("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
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__ */ jsx11(
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__ */ jsx11(
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__ */ jsx11("h2", { className: "font-display text-balance text-lg font-semibold tracking-tight text-ph-ink sm:text-xl", children: title }),
1803
- description ? /* @__PURE__ */ jsx11("div", { className: "mt-1 max-w-2xl text-pretty text-sm leading-5 text-ph-subtle", children: description }) : null
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__ */ jsx11("div", { className: "flex min-h-[44px] shrink-0 items-center", children: action }) : null
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 jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
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__ */ jsx12(
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__ */ jsx12("div", { className: "sticky top-0 z-20 mb-2 shrink-0 bg-ph-canvas/95 backdrop-blur lg:hidden", children: mobileNav }) : null,
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__ */ jsx12(
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__ */ jsx12(
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 jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
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__ */ jsx13("span", { className: "inline-flex h-10 w-10 items-center justify-center", children: /* @__PURE__ */ jsx13("span", { className: "inline-flex h-8 w-8 items-center justify-center overflow-hidden rounded-full border border-ph-border", children: image ? /* @__PURE__ */ jsx13(
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__ */ jsx13(
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__ */ jsx13("span", { className: "truncate text-sm font-medium text-ph-ink", children: name || email || "Account" }),
1935
- subtitle ? /* @__PURE__ */ jsx13("span", { className: "truncate text-xs text-ph-mutedtext", children: subtitle }) : null
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__ */ jsx13("p", { className: "truncate text-sm font-medium text-ph-ink", children: name || email || "Account" }),
1959
- email ? /* @__PURE__ */ jsx13("p", { className: "truncate text-xs text-ph-mutedtext", children: email }) : null
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__ */ jsx13("div", { className: "my-1 border-t border-ph-border" }),
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__ */ jsx13(Settings, { className: "h-4 w-4 text-ph-mutedtext", "aria-hidden": true }),
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__ */ jsx13(LogOut, { className: "h-4 w-4 text-ph-mutedtext", "aria-hidden": true }),
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__ */ jsx13("div", { className: "shrink-0", children: accountMenu }),
1992
- /* @__PURE__ */ jsx13(
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__ */ jsx13(LogOut, { className: "h-4 w-4", "aria-hidden": true })
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 jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
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__ */ jsx14(
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__ */ jsx14("span", { "aria-hidden": true, className: "suite-bottom-nav__indicator" }) : null,
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__ */ jsx14(
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__ */ jsx14(
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__ */ jsx14("span", { className: "relative z-10 max-w-full truncate", children: item.label })
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 jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
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__ */ jsx15(
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__ */ jsx15("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__ */ jsx15(Sun, { className: "h-8 w-8", strokeWidth: 2, "aria-hidden": true }) }),
2123
- /* @__PURE__ */ jsx15("h2", { className: "relative text-base font-semibold tracking-tight text-ph-ink sm:text-lg md:text-xl", children: "Calibrating your day" }),
2124
- /* @__PURE__ */ jsx15("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" }),
2125
- /* @__PURE__ */ jsx15("div", { className: "relative mt-5 flex justify-center", children: /* @__PURE__ */ jsx15(Spinner, { size: "sm", className: "opacity-70", label: "Loading today" }) }),
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__ */ jsx15(Spinner, { size: "sm", className: retrySpinnerClassName }) : /* @__PURE__ */ jsx15(RefreshCw2, { className: "h-4 w-4", "aria-hidden": true }),
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 jsx16 } from "react/jsx-runtime";
2203
- var SuiteThemeContext = createContext(null);
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 = useMemo(
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__ */ jsx16(SuiteThemeContext.Provider, { value, children });
2453
+ return /* @__PURE__ */ jsx17(SuiteThemeContext.Provider, { value, children });
2372
2454
  }
2373
2455
  function useSuiteTheme() {
2374
- const ctx = useContext(SuiteThemeContext);
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 jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
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__ */ jsx17("h2", { className: "sr-only", children: title }),
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__ */ jsx17(Erase, { className: "h-3.5 w-3.5" }),
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__ */ jsx17(Spinner, { className: "h-4 w-4 animate-spin" }),
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__ */ jsx17("span", { className: "flex h-10 w-10 items-center justify-center rounded-2xl bg-ph-brand/10 text-ph-brand", children: /* @__PURE__ */ jsx17(Icon, { className: "h-5 w-5" }) }),
2812
- /* @__PURE__ */ jsx17("p", { className: "mt-3 font-display text-base font-semibold text-ph-ink", children: "How can I help?" }),
2813
- /* @__PURE__ */ jsx17("p", { className: "mt-1 text-sm leading-relaxed text-ph-subtle", children: emptyState }),
2814
- presets.length > 0 ? /* @__PURE__ */ jsx17("div", { className: "mt-4 flex w-full flex-col gap-2", children: presets.map((preset) => /* @__PURE__ */ jsxs14(
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__ */ jsx17(Sparks, { className: "h-4 w-4 shrink-0 text-ph-brand" }),
2823
- /* @__PURE__ */ jsx17("span", { className: "min-w-0 flex-1 truncate", children: preset.label }),
2824
- /* @__PURE__ */ jsx17(ArrowUp, { className: "h-3.5 w-3.5 shrink-0 rotate-45 text-ph-mutedtext transition-transform group-hover:translate-x-0.5" })
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(Check, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx17(Copy, { className: "h-3.5 w-3.5" })
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__ */ jsx17(
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__ */ jsx17(EditPencil, { className: "h-3.5 w-3.5" })
3003
+ children: /* @__PURE__ */ jsx18(EditPencil, { className: "h-3.5 w-3.5" })
2922
3004
  }
2923
3005
  )
2924
3006
  ] }) : null,
2925
- /* @__PURE__ */ jsx17("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 })
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__ */ jsx17(
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__ */ jsx17(Icon, { className: "h-3.5 w-3.5" })
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__ */ jsx17("div", { className: "rounded-2xl rounded-bl-md bg-ph-muted px-3 py-2 text-sm leading-relaxed text-ph-ink", children: /* @__PURE__ */ jsx17(
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__ */ jsx17("span", { className: "sr-only", role: "status", children: "Rendering response\u2026" })
3035
+ /* @__PURE__ */ jsx18("span", { className: "sr-only", role: "status", children: "Rendering response\u2026" })
2954
3036
  ),
2955
- children: /* @__PURE__ */ jsx17(
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__ */ jsx17("p", { className: "font-medium", children: action.summary }),
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17("p", { className: "mt-1 text-xs text-ph-subtle", children: "Cancelled" }) : null,
3011
- action.status === "failed" ? /* @__PURE__ */ jsx17("p", { className: "mt-1 text-xs text-ph-danger", children: action.error || "Could not apply that." }) : null
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__ */ jsx17("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__ */ jsx17(Icon, { className: "h-3.5 w-3.5" }) }),
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__ */ jsx17("span", { className: "suite-think-dot h-1.5 w-1.5 rounded-full bg-ph-mutedtext" }),
3026
- /* @__PURE__ */ jsx17("span", { className: "suite-think-dot suite-think-dot--2 h-1.5 w-1.5 rounded-full bg-ph-mutedtext" }),
3027
- /* @__PURE__ */ jsx17("span", { className: "suite-think-dot suite-think-dot--3 h-1.5 w-1.5 rounded-full bg-ph-mutedtext" })
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__ */ jsx17("span", { className: "sr-only", "aria-live": "polite", children: "Assistant is responding\u2026" }) : null,
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__ */ jsx17(WarningTriangle, { className: "mt-0.5 h-4 w-4 shrink-0 text-ph-danger" }),
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__ */ jsx17("p", { className: "font-medium text-ph-danger", children: "Something went wrong" }),
3040
- /* @__PURE__ */ jsx17("p", { className: "mt-0.5 text-ph-subtle", children: error }),
3041
- /* @__PURE__ */ jsx17(
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__ */ jsx17("div", { className: "absolute bottom-3 left-1/2 -translate-x-1/2", children: /* @__PURE__ */ jsx17(Tooltip, { content: "Scroll to latest", children: /* @__PURE__ */ jsx17(
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__ */ jsx17(ArrowDown, { className: "h-4 w-4" })
3147
+ children: /* @__PURE__ */ jsx18(ArrowDown, { className: "h-4 w-4" })
3066
3148
  }
3067
3149
  ) }) }) : null
3068
3150
  ] }),
3069
- /* @__PURE__ */ jsx17("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: [
3070
- /* @__PURE__ */ jsx17("label", { htmlFor: inputId, className: "sr-only", children: "Ask a question" }),
3071
- /* @__PURE__ */ jsx17(
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__ */ jsx17(Tooltip, { content: "Stop generating", children: /* @__PURE__ */ jsx17(
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__ */ jsx17(Square, { className: "h-3.5 w-3.5 fill-current" })
3180
+ children: /* @__PURE__ */ jsx18(Square, { className: "h-3.5 w-3.5 fill-current" })
3099
3181
  }
3100
- ) }) : /* @__PURE__ */ jsx17(Tooltip, { content: "Send message", children: /* @__PURE__ */ jsx17(
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__ */ jsx17(ArrowUp, { className: "h-4 w-4" })
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 jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
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__ */ jsx18(
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__ */ jsx18(Building, { className: "h-4 w-4 shrink-0 text-ph-ink", "aria-hidden": true }),
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__ */ jsx18("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-ph-ink", children: name }),
3163
- /* @__PURE__ */ jsx18(
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__ */ jsx18("p", { className: "px-3 py-2 text-sm text-ph-mutedtext", children: emptyLabel }) : sections.map((section) => /* @__PURE__ */ jsxs15("div", { children: [
3185
- /* @__PURE__ */ jsx18("p", { className: "px-3 py-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-ph-mutedtext", children: section.label }),
3186
- section.workspaces.map((workspace) => /* @__PURE__ */ jsx18(
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__ */ jsx18("span", { className: "block truncate text-sm font-medium text-ph-ink", children: workspace.name }),
3202
- workspace.description ? /* @__PURE__ */ jsx18("span", { className: "block truncate text-xs text-ph-mutedtext", children: workspace.description }) : null
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__ */ jsx18(
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__ */ jsx18("div", { className: "mt-1 border-t border-ph-border pt-1", children: footer }) : null
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 jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
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__ */ jsx19("style", { children: TODAY_SUN_STYLE }) : null,
3269
- /* @__PURE__ */ jsx19(
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 jsx20 } from "react/jsx-runtime";
3536
+ import { jsx as jsx21 } from "react/jsx-runtime";
3455
3537
  function SuiteMotionProvider({ children }) {
3456
- return /* @__PURE__ */ jsx20(LazyMotion, { features: domAnimation, strict: true, children });
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 jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
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__ */ jsx21(
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__ */ jsx21(
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__ */ jsx21(
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__ */ jsx21("div", { className: "ph-skeleton h-10 w-10 rounded-xl" }),
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__ */ jsx21("div", { className: "ph-skeleton h-4 w-1/3" }),
3527
- /* @__PURE__ */ jsx21("div", { className: "ph-skeleton h-3 w-1/2" })
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__ */ jsx21("div", { className: "space-y-3", children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsx21(
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__ */ jsx21(
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__ */ jsx21("div", { className: cn2("space-y-3", className), "aria-hidden": true, children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsx21(
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__ */ jsx21("div", { className: "ph-skeleton h-10 w-10 rounded-lg" }),
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__ */ jsx21("div", { className: "ph-skeleton h-3.5 w-3/4" }),
3564
- /* @__PURE__ */ jsx21("div", { className: "ph-skeleton h-3 w-1/2" })
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__ */ jsx21("div", { className: "absolute -left-10 -top-10 h-40 w-40 rounded-full bg-ph-brand/10 blur-3xl" }),
3590
- /* @__PURE__ */ jsx21("div", { className: "absolute -bottom-10 -right-10 h-40 w-40 rounded-full bg-ph-accent/10 blur-3xl" })
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__ */ jsx21("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,
3594
- /* @__PURE__ */ jsx21(
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__ */ jsx21("p", { className: "mx-auto mt-2 max-w-sm text-sm leading-relaxed text-ph-subtle", children: description }) : null,
3605
- action ? /* @__PURE__ */ jsx21("div", { className: "mt-5 flex flex-wrap items-center justify-center gap-2", children: action }) : null
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 jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
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__ */ jsx22(
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__ */ jsx22("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) => {
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__ */ jsx22(
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__ */ jsx22("span", { className: "whitespace-nowrap", children: item.label }),
3658
- active ? /* @__PURE__ */ jsx22("span", { className: "absolute inset-x-0 -bottom-3 h-0.5 rounded-full bg-ph-ink lg:hidden" }) : null
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 jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
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__ */ jsx23(
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__ */ jsx23(Sparks2, { className: "h-4 w-4", "aria-hidden": true })
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__ */ jsx23(
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__ */ jsx23(NavArrowLeft, { className: "h-4 w-4", "aria-hidden": true })
3851
+ children: /* @__PURE__ */ jsx24(NavArrowLeft, { className: "h-4 w-4", "aria-hidden": true })
3770
3852
  }
3771
3853
  ),
3772
- /* @__PURE__ */ jsx23("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-ph-ink", children: "Shelly AI" })
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__ */ jsx23("div", { className: "min-h-0 flex-1", children: askAi })
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__ */ jsx23("div", { className: cn2("min-w-0", collapsed ? "shrink-0" : "flex-1"), children: renderNode(appSwitcher, collapsed) }),
3800
- collapsed ? null : /* @__PURE__ */ jsx23("div", { className: "shrink-0", children: renderNode(notificationBell, collapsed) })
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__ */ jsx23(
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__ */ jsx23(NavArrowLeft, { className: "h-4 w-4", "aria-hidden": true }),
3916
+ /* @__PURE__ */ jsx24(NavArrowLeft, { className: "h-4 w-4", "aria-hidden": true }),
3835
3917
  "Nav"
3836
3918
  ]
3837
3919
  }
3838
3920
  ),
3839
- /* @__PURE__ */ jsx23("span", { className: "truncate text-sm font-semibold text-ph-ink", children: "Shelly AI" })
3921
+ /* @__PURE__ */ jsx24("span", { className: "truncate text-sm font-semibold text-ph-ink", children: "Shelly AI" })
3840
3922
  ] }),
3841
- /* @__PURE__ */ jsx23("div", { className: "min-h-0 flex-1", children: askAi })
3923
+ /* @__PURE__ */ jsx24("div", { className: "min-h-0 flex-1", children: askAi })
3842
3924
  ] }) : /* @__PURE__ */ jsxs19(Fragment7, { children: [
3843
- /* @__PURE__ */ jsx23("nav", { "aria-label": "Pages", className: "shrink-0 space-y-1", children: /* @__PURE__ */ jsx23("div", { className: "space-y-1", children: navItems.map((item) => {
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__ */ jsx23(
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__ */ jsx23(
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__ */ jsx23(
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__ */ jsx23("span", { className: "relative ml-auto shrink-0", children: item.badge }) : null
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__ */ jsx23(Tooltip, { content: item.label, side: "right", children: link }, item.label) : link;
3976
+ return collapsed ? /* @__PURE__ */ jsx24(Tooltip, { content: item.label, side: "right", children: link }, item.label) : link;
3895
3977
  }) }) }),
3896
- secondaryNav ? /* @__PURE__ */ jsx23(
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__ */ jsx23(
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__ */ jsx23("div", { className: cn2("shrink-0", collapsed ? "mt-2" : "ml-auto"), children: /* @__PURE__ */ jsx23(Tooltip, { content: "Shelly AI", side: collapsed ? "right" : "top", children: askAiButton }) }) : footerExtras ? /* @__PURE__ */ jsx23("div", { className: cn2("shrink-0", collapsed ? "mt-2" : "ml-auto"), children: renderNode(footerExtras, collapsed) }) : null,
3926
- showAskAi && footerExtras ? /* @__PURE__ */ jsx23("div", { className: cn2("shrink-0", collapsed && "mt-2"), children: renderNode(footerExtras, collapsed) }) : null
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 jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
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__ */ jsx24("div", { className: "relative z-0 h-full min-h-0 isolate", children: sidebar }),
3970
- onStartResize ? /* @__PURE__ */ jsx24(
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__ */ jsx24("div", { className: "shrink-0 lg:hidden", children: mobileHeader }) : null,
4004
- /* @__PURE__ */ jsx24(
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__ */ jsx24("div", { className: "shrink-0 lg:hidden", children: bottomNav }) : null
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 useMemo2,
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 jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
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__ */ jsx25("div", { className: "h-10 w-10 shrink-0 rounded-lg bg-ph-muted" }),
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__ */ jsx25("div", { className: "h-4 w-3/5 rounded bg-ph-muted" }),
4053
- /* @__PURE__ */ jsx25("div", { className: "h-3 w-full rounded bg-ph-muted" }),
4054
- /* @__PURE__ */ jsx25("div", { className: "h-3 w-4/5 rounded bg-ph-muted" })
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__ */ jsx25("div", { className: "mt-3 h-9 w-20 rounded bg-ph-muted" })
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 CATEGORY_APP_AFFINITY = {
4083
- calendar: ["turtletime", "tides"],
4084
- email: ["turtletime", "tides"],
4085
- code: ["tides", "kraken"],
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
- var DEFAULT_APP_AFFINITY = ["tides", "kraken"];
4100
- function suiteAppsForIntegration(categories) {
4101
- var _a2;
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
- return apps.size > 0 ? SUITE_APPS2.filter((app) => apps.has(app.slug)).map((app) => app.slug) : [...DEFAULT_APP_AFFINITY];
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 = useMemo2(
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 filtered = onSearchChange || onCategoryChange ? items : items.filter((item) => {
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 || !hasMore || !onEndReached || loading || catalogLoading || loadingMore) {
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 || loadMoreInFlightRef.current) return;
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 80px", threshold: 0 }
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__ */ jsx25(
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__ */ jsx25("p", { className: "text-sm text-ph-danger", role: "alert", children: connectionError }) : null,
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25("span", { children: activeCategory === "all" ? "All apps" : categoryLabel(activeCategory) })
4566
+ /* @__PURE__ */ jsx26("span", { children: activeCategory === "all" ? "All apps" : categoryLabel(activeCategory) })
4450
4567
  ] }),
4451
- /* @__PURE__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(IntegrationSkeletonCard, {}, index))
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__ */ jsx25(
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__ */ jsx25("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-ph-muted text-ph-ink", children: (_a2 = item.icon) != null ? _a2 : /* @__PURE__ */ jsx25(Plug, { className: "h-5 w-5", "aria-hidden": true }) }),
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__ */ jsx25("span", { className: "block truncate font-medium text-ph-ink", children: item.label }),
4561
- /* @__PURE__ */ jsx25("span", { className: "mt-1 block text-xs text-ph-subtle", children: text }),
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__ */ jsx25(NavArrowUp, { className: "inline h-3 w-3" }) : /* @__PURE__ */ jsx25(NavArrowDown2, { className: "inline h-3 w-3" })
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
- suiteAppsForIntegration(item.categories).length > 0 ? /* @__PURE__ */ jsx25(
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": "Works with ShellStack apps",
4576
- children: suiteAppsForIntegration(item.categories).map(
4577
- (app) => /* @__PURE__ */ jsx25(
4578
- "span",
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
- "data-test": `${dataTest}-${item.id}-app-${app}`,
4581
- children: /* @__PURE__ */ jsx25(
4582
- SuiteAppIcon,
4583
- {
4584
- app,
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
- authSchemesFor(item).length > 0 ? /* @__PURE__ */ jsx25(
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: authSchemesFor(item).map((scheme) => /* @__PURE__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(Plug, { className: "h-3.5 w-3.5", "aria-hidden": true }),
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__ */ jsx25(IntegrationSkeletonCard, {}, `loading-${index}`)) : null
4747
+ loadingMore ? Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ jsx26(IntegrationSkeletonCard, {}, `loading-${index}`)) : null
4632
4748
  ] }),
4633
- /* @__PURE__ */ jsx25("div", { ref: loadMoreSentinelRef, className: "h-1", "aria-hidden": "true" })
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__ */ jsx25("h3", { className: "font-medium text-ph-ink", children: "Connected apps" }),
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__ */ jsx25("span", { className: "truncate", children: item.label })
4762
+ /* @__PURE__ */ jsx26("span", { className: "truncate", children: item.label })
4647
4763
  ] }),
4648
- /* @__PURE__ */ jsx25(
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__ */ jsx25(Xmark, { className: "h-4 w-4", "aria-hidden": true }),
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25("p", { className: "text-sm text-ph-danger", role: "alert", children: disconnectError }) : null,
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__ */ jsx25(
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__ */ jsx25("div", { className: "space-y-2", children: authSchemesFor(methodItem).map((scheme) => /* @__PURE__ */ jsxs21(
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__ */ jsx25("span", { className: "font-medium", children: authSchemeLabel(scheme) }),
4732
- /* @__PURE__ */ jsx25("span", { className: "text-xs text-ph-subtle", children: "Select" })
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__ */ jsx25(
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__ */ jsx25("p", { className: "text-sm text-ph-subtle", children: "Loading authentication fields..." }) : authItem ? /* @__PURE__ */ jsxs21(
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__ */ jsx25("p", { className: "text-sm text-ph-danger", role: "alert", children: authError }) : null,
4756
- authItem.fields.length === 0 && authError ? /* @__PURE__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(
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__ */ jsx25(Button, { type: "submit", variant: "primary", disabled: authSubmitting, children: authSubmitting ? "Connecting..." : "Connect" })
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 jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
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__ */ jsx26("h3", { className: "font-medium text-ph-ink", children: "Automation rules" }),
4924
- /* @__PURE__ */ jsx26("p", { className: "mt-1 text-sm text-ph-subtle", children: "Turn incoming integration events into tasks, time entries, or notifications for this workspace." })
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__ */ jsx26(
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__ */ jsx26(Plus, { className: "h-4 w-4", "aria-hidden": true }),
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__ */ jsx26(
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__ */ jsx26("p", { className: "mt-4 text-sm text-ph-subtle", children: "Loading rules..." }) : rules.length === 0 ? /* @__PURE__ */ jsx26(
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__ */ jsx26("ul", { className: "mt-4 space-y-2", "data-test": `${dataTest}-list`, children: rules.map((rule) => /* @__PURE__ */ jsxs22(
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__ */ jsx26("p", { className: "truncate text-sm font-medium text-ph-ink", children: rule.name }),
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__ */ jsx26(
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__ */ jsx26(
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__ */ jsx26(Xmark2, { className: "h-4 w-4", "aria-hidden": true })
5112
+ children: /* @__PURE__ */ jsx27(Xmark2, { className: "h-4 w-4", "aria-hidden": true })
4997
5113
  }
4998
5114
  )
4999
- ] }) : /* @__PURE__ */ jsx26(
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__ */ jsx26("p", { className: "text-sm text-ph-danger", role: "alert", children: formError }) : null,
5019
- /* @__PURE__ */ jsx26(
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__ */ jsx26(
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__ */ jsx26(
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__ */ jsx26("option", { value, children: label }, value))
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__ */ jsx26("option", { value: "", children: "Choose a project..." }),
5063
- projects.map((project) => /* @__PURE__ */ jsx26("option", { value: project.id, children: project.name }, project.id))
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__ */ jsx26(
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__ */ jsx26("option", { value: "low", children: "Low" }),
5087
- /* @__PURE__ */ jsx26("option", { value: "medium", children: "Medium" }),
5088
- /* @__PURE__ */ jsx26("option", { value: "high", children: "High" }),
5089
- /* @__PURE__ */ jsx26("option", { value: "urgent", children: "Urgent" })
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__ */ jsx26(
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__ */ jsx26(Button, { type: "submit", variant: "primary", disabled: submitting, children: submitting ? "Creating..." : "Create rule" })
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__ */ jsx26(
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__ */ jsx26(
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__ */ jsx26("p", { className: "text-sm text-ph-danger", role: "alert", children: deleteError }) : null,
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__ */ jsx26("h3", { className: "font-medium text-ph-ink", children: "Recent events" }),
5163
- /* @__PURE__ */ jsx26("p", { className: "mt-1 text-sm text-ph-subtle", children: "The latest events received from your connected apps." }),
5164
- events.length === 0 ? /* @__PURE__ */ jsx26(
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__ */ jsx26("ul", { className: "mt-4 space-y-2", "data-test": `${dataTest}-events-list`, children: events.map((event) => /* @__PURE__ */ jsxs22(
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__ */ jsx26("p", { className: "mt-0.5 text-xs text-ph-subtle", children: formatDateTime(event.created_at) })
5298
+ /* @__PURE__ */ jsx27("p", { className: "mt-0.5 text-xs text-ph-subtle", children: formatDateTime(event.created_at) })
5183
5299
  ] }),
5184
- /* @__PURE__ */ jsx26(
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 useMemo4,
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 jsx27 } from "react/jsx-runtime";
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__ */ jsx27(
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__ */ jsx27("img", { src: src != null ? src : void 0, alt: "", className: "h-full w-full object-cover" })
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__ */ jsx27(
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__ */ jsx27("span", { className: "text-[0.7em]", children: initial }) : /* @__PURE__ */ jsx27("span", { className: "block h-1.5 w-1.5 rounded-full bg-current opacity-40" })
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 useMemo3,
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 jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
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__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28(
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 = useMemo3(() => {
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 = useMemo3(() => {
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 = useMemo3(() => {
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__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28(FilterList, { className: "h-4 w-4 shrink-0 text-ph-mutedtext", "aria-hidden": true }),
5560
- /* @__PURE__ */ jsx28("span", { className: "max-w-[10rem] truncate", children: (_b = activeLibrary == null ? void 0 : activeLibrary.name) != null ? _b : "All libraries" }),
5561
- /* @__PURE__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28("option", { value: type.value, children: type.label }, type.value))
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__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28("li", { children: /* @__PURE__ */ jsx28(
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__ */ jsx28("li", { children: /* @__PURE__ */ jsxs23(
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__ */ jsx28("span", { className: "truncate", children: collection.name }),
5647
- /* @__PURE__ */ jsx28("span", { className: "shrink-0 text-xs text-ph-mutedtext", children: collection.count })
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__ */ jsx28("li", { className: "px-2 py-4 text-center text-sm text-ph-mutedtext", children: "No libraries match." }) : null
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__ */ jsx28("p", { className: "text-sm text-ph-danger", children: error }) : loading ? /* @__PURE__ */ jsx28("p", { className: "py-8 text-center text-sm text-ph-mutedtext", children: "Loading icons\u2026" }) : icons.length === 0 ? /* @__PURE__ */ jsx28("p", { className: "py-8 text-center text-sm text-ph-mutedtext", children: "No icons matched. Try another word or filter." }) : /* @__PURE__ */ jsxs23(Fragment9, { children: [
5658
- /* @__PURE__ */ jsx28("div", { className: "max-h-[320px] overflow-y-auto rounded-lg border border-ph-border p-2", children: /* @__PURE__ */ jsx28("div", { className: "grid grid-cols-6 gap-1.5 sm:grid-cols-8", children: icons.map((icon) => /* @__PURE__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28(
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 jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
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__ */ jsx29("span", { className: "mb-1.5 block text-sm font-medium text-ph-ink", children: "Icon" }),
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__ */ jsx29(
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__ */ jsx29("p", { className: "text-sm font-medium text-ph-ink", children: preview ? "Custom image" : "No icon yet" }),
5732
- /* @__PURE__ */ jsx29("p", { className: "text-xs text-ph-mutedtext", children: preview ? "Shown on cards and lists." : "Browse the library or upload your own." })
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__ */ jsx29(
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__ */ jsx29("div", { className: "mt-3", children: /* @__PURE__ */ jsx29(
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__ */ jsx29(Trash, { className: "h-3.5 w-3.5", "aria-hidden": true }),
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__ */ jsx29(
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 = useMemo4(() => {
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__ */ jsx29(Alert, { status: "danger", live: "assertive", children: error || mutationError }) : null,
6004
- loading ? /* @__PURE__ */ jsx29("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: [
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__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29(
6150
+ canEdit && onCreateClient ? /* @__PURE__ */ jsx30(
6035
6151
  Button,
6036
6152
  {
6037
6153
  size: "sm",
6038
6154
  variant: "primary",
6039
- icon: /* @__PURE__ */ jsx29(Plus2, { className: "h-4 w-4" }),
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__ */ jsx29(
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__ */ jsx29("li", { role: "none", children: /* @__PURE__ */ jsxs24(
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__ */ jsx29(DirectoryIcon, { item: client }),
6189
+ /* @__PURE__ */ jsx30(DirectoryIcon, { item: client }),
6074
6190
  /* @__PURE__ */ jsxs24("span", { className: "min-w-0 flex-1", children: [
6075
- /* @__PURE__ */ jsx29("span", { className: "block truncate text-sm font-medium text-ph-ink", children: client.name }),
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__ */ jsx29("li", { className: "px-3 py-8 text-center text-sm text-ph-mutedtext", children: clients.length ? "No matches." : "Add a client to get started." })
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__ */ jsx29("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: [
6100
- /* @__PURE__ */ jsx29(
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__ */ jsx29(ArrowLeft, { className: "h-4 w-4" })
6227
+ children: /* @__PURE__ */ jsx30(ArrowLeft, { className: "h-4 w-4" })
6112
6228
  }
6113
6229
  ),
6114
- /* @__PURE__ */ jsx29(DirectoryIcon, { item: selectedClient }),
6230
+ /* @__PURE__ */ jsx30(DirectoryIcon, { item: selectedClient }),
6115
6231
  /* @__PURE__ */ jsxs24("div", { className: "min-w-0 flex-1", children: [
6116
- /* @__PURE__ */ jsx29("h3", { className: "truncate text-sm font-semibold text-ph-ink", children: selectedClient.name }),
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__ */ jsx29("div", { onClick: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx29(
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__ */ jsx29(MoreHorizontal, { className: "h-4 w-4", "aria-hidden": true }),
6130
- /* @__PURE__ */ jsx29("span", { className: "sr-only", children: "Client actions" })
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__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29("p", { className: "text-sm text-ph-mutedtext", children: "Select a client" }) }),
6152
- canEdit && onCreateProject ? /* @__PURE__ */ jsx29("div", { className: "border-b border-ph-border p-3", children: /* @__PURE__ */ jsx29(
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__ */ jsx29(Plus2, { className: "h-4 w-4" }),
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__ */ jsx29("ul", { className: "flex-1 p-2", children: selectedClient && selectedProjects.length ? selectedProjects.map((project) => /* @__PURE__ */ jsx29("li", { children: /* @__PURE__ */ jsxs24(
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__ */ jsx29(DirectoryIcon, { item: project }),
6290
+ /* @__PURE__ */ jsx30(DirectoryIcon, { item: project }),
6175
6291
  /* @__PURE__ */ jsxs24("span", { className: "min-w-0 flex-1", children: [
6176
- /* @__PURE__ */ jsx29(
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__ */ jsx29("span", { className: "text-xs text-ph-mutedtext", children: project.isArchived ? "Archived" : "Active" })
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__ */ jsx29("div", { onClick: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29("span", { className: "sr-only", children: "Project actions" })
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__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29("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." }) })
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__ */ jsx29(
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__ */ jsx29(Button, { variant: "tertiary", onClick: closeEditor, disabled: saving, children: "Cancel" }),
6249
- /* @__PURE__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29("span", { className: "mb-1.5 block text-sm font-medium text-ph-ink", children: "Colour" }),
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__ */ jsx29(
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__ */ jsx29(Prohibition, { className: "h-4 w-4", "aria-hidden": true })
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__ */ jsx29(
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__ */ jsx29("span", { className: "flex h-4 w-4 items-center justify-center rounded-full bg-ph-surface", children: [
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__ */ jsx29(Plus2, { className: "h-3 w-3 text-ph-ink", "aria-hidden": true }) : /* @__PURE__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29("option", { value: "", children: "No client" }),
6379
- clients.map((client) => /* @__PURE__ */ jsx29("option", { value: client.id, children: client.name }, client.id))
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__ */ jsx29(
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__ */ jsx29(
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__ */ jsx29(SuitePaletteLibrary, { onPick: pickFromLibrary })
6519
+ children: renderIconLibrary ? renderIconLibrary({ onPick: pickFromLibrary }) : /* @__PURE__ */ jsx30(SuitePaletteLibrary, { onPick: pickFromLibrary })
6404
6520
  }
6405
6521
  ) : null,
6406
- /* @__PURE__ */ jsx29(
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__ */ jsx29(Button, { variant: "tertiary", onClick: () => setConfirming(null), children: "Cancel" }),
6414
- /* @__PURE__ */ jsx29(Button, { variant: "primary", onClick: () => void confirmRemove(), children: "Delete" })
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
  };