@burdenoff/fe-libs 2026.1018.1 → 2026.1019.2
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/chrome/AccountSwitcher.js +90 -89
- package/dist/chrome/Breadcrumbs.js +1 -1
- package/dist/chrome/CommandPalette.js +91 -90
- package/dist/chrome/Footer.js +31 -8
- package/dist/chrome/GlobalSearch.js +78 -77
- package/dist/chrome/HeaderBar.js +1 -1
- package/dist/chrome/HeaderThemeSwitcher.js +48 -47
- package/dist/chrome/LanguagePickerSheet.js +23 -22
- package/dist/chrome/NavCustomizeDialog.d.ts +0 -14
- package/dist/chrome/NavCustomizeDialog.js +114 -122
- package/dist/chrome/PanelTabs.js +45 -41
- package/dist/chrome/PersonaSurfaceControls.d.ts +0 -17
- package/dist/chrome/PersonaSurfaceControls.js +115 -118
- package/dist/chrome/PluginSettingsPage.js +29 -28
- package/dist/chrome/PluginWidgetGrid.js +19 -18
- package/dist/chrome/ProductPickerSheet.js +44 -47
- package/dist/chrome/ProductSwitcher.js +2 -6
- package/dist/chrome/ProfileSwitcher.js +6 -10
- package/dist/chrome/ShortcutHelpDialog.js +60 -65
- package/dist/chrome/SideNavigation.js +2 -2
- package/dist/chrome/Sidebar.js +44 -43
- package/dist/chrome/ThemePreferences.js +289 -267
- package/dist/chrome/contextSwitcher/EmptyState.js +31 -27
- package/dist/chrome/contextSwitcher/OrganizationList.js +40 -30
- package/dist/chrome/contextSwitcher/ProjectList.js +48 -44
- package/dist/chrome/contextSwitcher/SearchInput.js +44 -40
- package/dist/chrome/contextSwitcher/TriggerButton.js +2 -2
- package/dist/chrome/contextSwitcher/WorkspaceList.js +36 -32
- package/dist/chrome/globalSearch/AdvancedFiltersPanel.js +128 -126
- package/dist/chrome/globalSearch/ResultsList.js +25 -27
- package/dist/chrome/globalSearch/SearchInput.js +16 -14
- package/dist/chrome/notificationCenter/NotificationCardItem.js +58 -47
- package/dist/chrome/notificationCenter/NotificationFilters.js +76 -62
- package/dist/chrome/notificationCenter/NotificationFooter.js +21 -21
- package/dist/chrome/notificationCenter/NotificationHeader.js +67 -63
- package/dist/chrome/notificationCenter/NotificationList.js +75 -71
- package/dist/chrome/notificationCenter/NotificationPanel.js +37 -33
- package/dist/chrome/notificationCenter/PushOptInToggle.js +33 -32
- package/dist/chrome/notificationCenter/constants.d.ts +6 -1
- package/dist/chrome/notificationCenter/constants.js +12 -11
- package/dist/chrome/useThemeOptionLabels.d.ts +33 -0
- package/dist/chrome/useThemeOptionLabels.js +39 -0
- package/dist/shared/assistant/conversation.d.ts +8 -0
- package/dist/shared/assistant/history/historyMapping.js +1 -1
- package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +6 -6
- package/dist/shared/assistant/ui/AssistantMarkdownRenderer.js +86 -85
- package/dist/shared/assistant/ui/AssistantMessageItem.js +101 -96
- package/dist/shared/assistant/ui/AssistantWriteProposalCard.d.ts +2 -0
- package/dist/shared/assistant/ui/AssistantWriteProposalCard.js +93 -89
- package/dist/shared/assistant/ui/WorkflowAssistantPanel.js +152 -140
- package/dist/shared/assistant/ui/useWriteProposals.js +122 -85
- package/dist/shared/assistant/writeProposalDiscovery.d.ts +3 -1
- package/dist/shared/assistant/writeProposalDiscovery.js +2 -2
- package/dist/shared/events/sinks/RybbitSink.js +2 -2
- package/dist/shared/providers/shell/interpolateShellLabel.d.ts +3 -0
- package/dist/shared/providers/shell/interpolateShellLabel.js +11 -0
- package/dist/shared/providers/shell/useAssistantShellLabels.d.ts +45 -0
- package/dist/shared/providers/shell/useAssistantShellLabels.js +54 -0
- package/dist/shared/tours/TourPlayer.js +33 -32
- package/dist/shared/tours/TourTooltip.js +108 -109
- package/dist/shared/tours/tourTrigger/MobileTourSheet.js +98 -85
- package/dist/shared/tours/tourTrigger/TourListItemDesktop.js +20 -18
- package/dist/shared/tours/tourTrigger/TourListItemMobile.js +23 -25
- package/dist/shared-assistant.js +188 -188
- package/package.json +2 -2
|
@@ -1,75 +1,79 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useShellLabel as e } from "../../shared/providers/shell/useShellLabel.js";
|
|
2
|
+
import { NotificationCardItem as t } from "./NotificationCardItem.js";
|
|
3
|
+
import { SkeletonCard as n } from "./SkeletonCard.js";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
5
|
//#region src/chrome/notificationCenter/NotificationList.tsx
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
className: "
|
|
9
|
-
children:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
6
|
+
var a = ({ loading: a, error: o, notifications: s, filterTab: c, typeFilter: l, appFilter: u, onRetry: d, onMarkAsRead: f, onDelete: p, onRedirect: m }) => {
|
|
7
|
+
let h = e();
|
|
8
|
+
return /* @__PURE__ */ r("div", {
|
|
9
|
+
className: "flex-1 overflow-y-auto",
|
|
10
|
+
children: a ? /* @__PURE__ */ i("div", {
|
|
11
|
+
className: "p-3 space-y-2",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ r(n, {}),
|
|
14
|
+
/* @__PURE__ */ r(n, {}),
|
|
15
|
+
/* @__PURE__ */ r(n, {})
|
|
16
|
+
]
|
|
17
|
+
}) : o ? /* @__PURE__ */ i("div", {
|
|
18
|
+
className: "flex flex-col items-center justify-center p-8 text-center",
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ r("svg", {
|
|
21
|
+
className: "size-10 text-status-error-text mb-3",
|
|
22
|
+
fill: "none",
|
|
23
|
+
stroke: "currentColor",
|
|
24
|
+
viewBox: "0 0 24 24",
|
|
25
|
+
children: /* @__PURE__ */ r("path", {
|
|
26
|
+
strokeLinecap: "round",
|
|
27
|
+
strokeLinejoin: "round",
|
|
28
|
+
strokeWidth: 2,
|
|
29
|
+
d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"
|
|
30
|
+
})
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ r("p", {
|
|
33
|
+
className: "text-sm text-text-secondary mb-2",
|
|
34
|
+
children: h("notifications.failedToLoadNotifications", "Failed to load notifications")
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ r("button", {
|
|
37
|
+
type: "button",
|
|
38
|
+
onClick: () => d(),
|
|
39
|
+
className: "text-xs text-action-primary-bg hover:underline font-medium",
|
|
40
|
+
children: h("notifications.tryAgain", "Try again")
|
|
27
41
|
})
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
strokeWidth: 1.5,
|
|
52
|
-
d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"
|
|
42
|
+
]
|
|
43
|
+
}) : s.length === 0 ? /* @__PURE__ */ i("div", {
|
|
44
|
+
className: "flex flex-col items-center justify-center p-8 text-center",
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ r("svg", {
|
|
47
|
+
className: "size-12 text-text-muted mb-3",
|
|
48
|
+
fill: "none",
|
|
49
|
+
stroke: "currentColor",
|
|
50
|
+
viewBox: "0 0 24 24",
|
|
51
|
+
children: /* @__PURE__ */ r("path", {
|
|
52
|
+
strokeLinecap: "round",
|
|
53
|
+
strokeLinejoin: "round",
|
|
54
|
+
strokeWidth: 1.5,
|
|
55
|
+
d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"
|
|
56
|
+
})
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ r("p", {
|
|
59
|
+
className: "text-sm font-medium text-text-primary",
|
|
60
|
+
children: h("notifCommon.allCaughtUp", "You're all caught up!")
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ r("p", {
|
|
63
|
+
className: "text-xs text-text-muted mt-1",
|
|
64
|
+
children: c !== "all" || l !== "ALL" || u !== "ALL" ? h("notifications.emptyFiltered", "No notifications match your filters") : h("notifications.empty", "No notifications yet")
|
|
53
65
|
})
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
children: o.map((t) => /* @__PURE__ */ n(e, {
|
|
67
|
-
notification: t,
|
|
68
|
-
onMarkAsRead: d,
|
|
69
|
-
onDelete: f,
|
|
70
|
-
onRedirect: p
|
|
71
|
-
}, t.id))
|
|
72
|
-
})
|
|
73
|
-
});
|
|
66
|
+
]
|
|
67
|
+
}) : /* @__PURE__ */ r("div", {
|
|
68
|
+
className: "p-2 space-y-1.5",
|
|
69
|
+
children: s.map((e) => /* @__PURE__ */ r(t, {
|
|
70
|
+
notification: e,
|
|
71
|
+
onMarkAsRead: f,
|
|
72
|
+
onDelete: p,
|
|
73
|
+
onRedirect: m
|
|
74
|
+
}, e.id))
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
};
|
|
74
78
|
//#endregion
|
|
75
|
-
export {
|
|
79
|
+
export { a as NotificationList };
|
|
@@ -1,35 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { useShellLabel as e } from "../../shared/providers/shell/useShellLabel.js";
|
|
2
|
+
import { EscapeLayer as t } from "../../shared/components/EscapeLayer.js";
|
|
3
|
+
import { SHELL_OVERLAY_LAYER_CLASS as n } from "../shellOverlayLayer.js";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { createPortal as a } from "react-dom";
|
|
5
6
|
//#region src/chrome/notificationCenter/NotificationPanel.tsx
|
|
6
|
-
var
|
|
7
|
-
top:
|
|
8
|
-
maxHeight: `calc(100dvh - ${
|
|
9
|
-
},
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
7
|
+
var o = "calc(max(var(--safe-top, 0px), env(safe-area-inset-top, 0px)) + var(--native-topbar-height, 0px))", s = {
|
|
8
|
+
top: o,
|
|
9
|
+
maxHeight: `calc(100dvh - ${o} - max(var(--mobile-tabbar-height, 0px), var(--safe-bottom, 0px), env(safe-area-inset-bottom, 0px)))`
|
|
10
|
+
}, c = ({ isMobile: o, onClose: c, children: l }) => {
|
|
11
|
+
let u = e();
|
|
12
|
+
return o ? typeof document > "u" ? null : a(/* @__PURE__ */ r(t, {
|
|
13
|
+
onDismiss: c,
|
|
14
|
+
children: /* @__PURE__ */ i("div", {
|
|
15
|
+
className: `fixed inset-0 ${n}`,
|
|
16
|
+
role: "dialog",
|
|
17
|
+
"aria-label": u("notifications.notificationsPanel", "Notifications panel"),
|
|
18
|
+
children: [/* @__PURE__ */ r("div", {
|
|
19
|
+
className: "absolute inset-0 bg-bg-overlay backdrop-blur-sm",
|
|
20
|
+
onClick: c,
|
|
21
|
+
"aria-hidden": "true"
|
|
22
|
+
}), /* @__PURE__ */ r("div", {
|
|
23
|
+
className: "absolute inset-x-0 flex flex-col overflow-hidden bg-bg-elevated rounded-b-2xl shadow-[var(--shadow-elevation-4)]",
|
|
24
|
+
style: s,
|
|
25
|
+
children: l
|
|
26
|
+
})]
|
|
27
|
+
})
|
|
28
|
+
}), document.body) : /* @__PURE__ */ r(t, {
|
|
29
|
+
onDismiss: c,
|
|
30
|
+
children: /* @__PURE__ */ r("div", {
|
|
31
|
+
className: "absolute right-0 top-full mt-2 w-[calc(100vw-1.5rem)] sm:w-[420px] max-h-[600px] bg-bg-elevated border border-border-subtle rounded-card shadow-[var(--shadow-elevation-4)] z-50 overflow-hidden flex flex-col",
|
|
32
|
+
role: "dialog",
|
|
33
|
+
"aria-label": u("notifications.notificationsPanel", "Notifications panel"),
|
|
34
|
+
children: l
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
};
|
|
34
38
|
//#endregion
|
|
35
|
-
export {
|
|
39
|
+
export { c as NotificationPanel };
|
|
@@ -1,56 +1,57 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useShellLabel as e } from "../../shared/providers/shell/useShellLabel.js";
|
|
2
|
+
import { getPushOptInController as t } from "../../shared/native/push-optin.js";
|
|
3
|
+
import { useCallback as n, useEffect as r, useState as i } from "react";
|
|
4
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
5
|
//#region src/chrome/notificationCenter/PushOptInToggle.tsx
|
|
5
|
-
var
|
|
6
|
-
let
|
|
7
|
-
|
|
8
|
-
if (
|
|
9
|
-
}, [
|
|
10
|
-
let
|
|
11
|
-
if (!(!
|
|
12
|
-
|
|
6
|
+
var s = () => {
|
|
7
|
+
let s = e(), c = t(), [l, u] = i(() => c?.getState() ?? "unsupported"), [d, f] = i(!1);
|
|
8
|
+
r(() => {
|
|
9
|
+
if (c) return u(c.getState()), c.subscribe(u);
|
|
10
|
+
}, [c]);
|
|
11
|
+
let p = n(async () => {
|
|
12
|
+
if (!(!c || d)) {
|
|
13
|
+
f(!0);
|
|
13
14
|
try {
|
|
14
|
-
|
|
15
|
+
u(l === "enabled" ? await c.disable() : await c.enable());
|
|
15
16
|
} finally {
|
|
16
|
-
|
|
17
|
+
f(!1);
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
}, [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
c,
|
|
22
|
+
d,
|
|
23
|
+
l
|
|
23
24
|
]);
|
|
24
|
-
if (!
|
|
25
|
-
if (
|
|
25
|
+
if (!c || l === "unsupported") return null;
|
|
26
|
+
if (l === "denied") return /* @__PURE__ */ a("div", {
|
|
26
27
|
className: "px-3 pb-3 pt-1",
|
|
27
|
-
children: /* @__PURE__ */
|
|
28
|
+
children: /* @__PURE__ */ a("p", {
|
|
28
29
|
className: "text-[11px] text-text-muted",
|
|
29
|
-
children: "Push notifications are blocked. Re-enable them in your browser or device settings."
|
|
30
|
+
children: s("notifications.pushBlocked", "Push notifications are blocked. Re-enable them in your browser or device settings.")
|
|
30
31
|
})
|
|
31
32
|
});
|
|
32
|
-
let
|
|
33
|
-
return /* @__PURE__ */
|
|
33
|
+
let m = l === "enabled";
|
|
34
|
+
return /* @__PURE__ */ o("div", {
|
|
34
35
|
className: "flex items-center justify-between gap-3 px-3 pb-3 pt-1",
|
|
35
|
-
children: [/* @__PURE__ */
|
|
36
|
+
children: [/* @__PURE__ */ a("span", {
|
|
36
37
|
className: "text-[11px] text-text-muted",
|
|
37
|
-
children:
|
|
38
|
-
}), /* @__PURE__ */
|
|
38
|
+
children: m ? s("notifications.pushEnabled", "Push notifications are on") : s("notifications.pushOffer", "Get notified when this tab is closed")
|
|
39
|
+
}), /* @__PURE__ */ a("button", {
|
|
39
40
|
type: "button",
|
|
40
41
|
role: "switch",
|
|
41
|
-
"aria-checked":
|
|
42
|
-
"aria-label": "Push notifications",
|
|
43
|
-
disabled:
|
|
44
|
-
onClick: () => void
|
|
42
|
+
"aria-checked": m,
|
|
43
|
+
"aria-label": s("notifications.pushNotifications", "Push notifications"),
|
|
44
|
+
disabled: d,
|
|
45
|
+
onClick: () => void p(),
|
|
45
46
|
className: [
|
|
46
47
|
"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full",
|
|
47
48
|
"transition-colors disabled:opacity-50",
|
|
48
49
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
|
|
49
|
-
|
|
50
|
+
m ? "bg-action-primary-bg" : "bg-bg-sunken"
|
|
50
51
|
].join(" "),
|
|
51
|
-
children: /* @__PURE__ */
|
|
52
|
+
children: /* @__PURE__ */ a("span", { className: ["inline-block size-4 rounded-full bg-bg-surface transition-transform", m ? "translate-x-[18px]" : "translate-x-0.5"].join(" ") })
|
|
52
53
|
})]
|
|
53
54
|
});
|
|
54
55
|
};
|
|
55
56
|
//#endregion
|
|
56
|
-
export {
|
|
57
|
+
export { s as PushOptInToggle };
|
|
@@ -17,5 +17,10 @@ export declare const TYPE_FILTERS: {
|
|
|
17
17
|
value: TypeFilter;
|
|
18
18
|
label: string;
|
|
19
19
|
}[];
|
|
20
|
-
export declare function formatRelativeTime(dateStr: string
|
|
20
|
+
export declare function formatRelativeTime(dateStr: string, labels?: {
|
|
21
|
+
now: string;
|
|
22
|
+
minutes: string;
|
|
23
|
+
hours: string;
|
|
24
|
+
days: string;
|
|
25
|
+
}): string;
|
|
21
26
|
export declare function sortNotifications(items: NotificationItem[], by: SortBy): NotificationItem[];
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { interpolate as e } from "../../shared/providers/shell/interpolate.js";
|
|
1
2
|
//#region src/chrome/notificationCenter/constants.ts
|
|
2
|
-
var
|
|
3
|
+
var t = {
|
|
3
4
|
URGENT: {
|
|
4
5
|
color: "text-status-error-text",
|
|
5
6
|
bgColor: "bg-status-error-bg-subtle",
|
|
@@ -24,7 +25,7 @@ var e = {
|
|
|
24
25
|
label: "Low",
|
|
25
26
|
order: 3
|
|
26
27
|
}
|
|
27
|
-
},
|
|
28
|
+
}, n = {
|
|
28
29
|
SYSTEM: {
|
|
29
30
|
icon: "⚙️",
|
|
30
31
|
label: "System"
|
|
@@ -41,7 +42,7 @@ var e = {
|
|
|
41
42
|
icon: "📣",
|
|
42
43
|
label: "Marketing"
|
|
43
44
|
}
|
|
44
|
-
},
|
|
45
|
+
}, r = [
|
|
45
46
|
{
|
|
46
47
|
value: "all",
|
|
47
48
|
label: "All"
|
|
@@ -54,7 +55,7 @@ var e = {
|
|
|
54
55
|
value: "read",
|
|
55
56
|
label: "Read"
|
|
56
57
|
}
|
|
57
|
-
],
|
|
58
|
+
], i = [
|
|
58
59
|
{
|
|
59
60
|
value: "ALL",
|
|
60
61
|
label: "All"
|
|
@@ -76,18 +77,18 @@ var e = {
|
|
|
76
77
|
label: "Marketing"
|
|
77
78
|
}
|
|
78
79
|
];
|
|
79
|
-
function i(e) {
|
|
80
|
-
let t = Date.now() - new Date(e).getTime(), n = Math.floor(t / 1e3), r = Math.floor(n / 60), i = Math.floor(r / 60), a = Math.floor(i / 24);
|
|
81
|
-
return n < 60 ? "Just now" : r < 60 ? `${r}m ago` : i < 24 ? `${i}h ago` : a < 7 ? `${a}d ago` : new Date(e).toLocaleDateString();
|
|
82
|
-
}
|
|
83
80
|
function a(t, n) {
|
|
84
|
-
let r =
|
|
81
|
+
let r = Date.now() - new Date(t).getTime(), i = Math.floor(r / 1e3), a = Math.floor(i / 60), o = Math.floor(a / 60), s = Math.floor(o / 24);
|
|
82
|
+
return i < 60 ? n?.now ?? "Just now" : a < 60 ? n ? e(n.minutes, { count: a }) : `${a}m ago` : o < 24 ? n ? e(n.hours, { count: o }) : `${o}h ago` : s < 7 ? n ? e(n.days, { count: s }) : `${s}d ago` : new Date(t).toLocaleDateString();
|
|
83
|
+
}
|
|
84
|
+
function o(e, n) {
|
|
85
|
+
let r = [...e];
|
|
85
86
|
switch (n) {
|
|
86
87
|
case "newest": return r.sort((e, t) => new Date(t.createdAt).getTime() - new Date(e.createdAt).getTime());
|
|
87
88
|
case "oldest": return r.sort((e, t) => new Date(e.createdAt).getTime() - new Date(t.createdAt).getTime());
|
|
88
|
-
case "priority": return r.sort((
|
|
89
|
+
case "priority": return r.sort((e, n) => (t[e.priority]?.order ?? 99) - (t[n.priority]?.order ?? 99));
|
|
89
90
|
default: return r;
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
//#endregion
|
|
93
|
-
export {
|
|
94
|
+
export { r as FILTER_TABS, t as PRIORITY_CONFIG, n as TYPE_CONFIG, i as TYPE_FILTERS, a as formatRelativeTime, o as sortNotifications };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Localize built-in choices; saved user theme names remain user content. */
|
|
2
|
+
export declare function useThemeOptionLabels(): {
|
|
3
|
+
themes: {
|
|
4
|
+
light: string;
|
|
5
|
+
dark: string;
|
|
6
|
+
forest: string;
|
|
7
|
+
ocean: string;
|
|
8
|
+
sunset: string;
|
|
9
|
+
'high-contrast': string;
|
|
10
|
+
};
|
|
11
|
+
highContrastMenu: string;
|
|
12
|
+
accents: {
|
|
13
|
+
Blue: string;
|
|
14
|
+
Purple: string;
|
|
15
|
+
Teal: string;
|
|
16
|
+
Indigo: string;
|
|
17
|
+
};
|
|
18
|
+
density: {
|
|
19
|
+
compact: string;
|
|
20
|
+
comfortable: string;
|
|
21
|
+
spacious: string;
|
|
22
|
+
};
|
|
23
|
+
typography: {
|
|
24
|
+
small: string;
|
|
25
|
+
default: string;
|
|
26
|
+
large: string;
|
|
27
|
+
};
|
|
28
|
+
glass: {
|
|
29
|
+
off: string;
|
|
30
|
+
subtle: string;
|
|
31
|
+
full: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useShellLabel as e } from "../shared/providers/shell/useShellLabel.js";
|
|
2
|
+
//#region src/chrome/useThemeOptionLabels.ts
|
|
3
|
+
function t() {
|
|
4
|
+
let t = e();
|
|
5
|
+
return {
|
|
6
|
+
themes: {
|
|
7
|
+
light: t("themeSwitcher.light", "Light"),
|
|
8
|
+
dark: t("themeSwitcher.dark", "Dark"),
|
|
9
|
+
forest: t("themeSwitcher.forest", "Forest"),
|
|
10
|
+
ocean: t("themeSwitcher.ocean", "Ocean"),
|
|
11
|
+
sunset: t("themeSwitcher.sunset", "Sunset"),
|
|
12
|
+
"high-contrast": t("themeSwitcher.highContrast", "High Contrast")
|
|
13
|
+
},
|
|
14
|
+
highContrastMenu: t("themeSwitcher.highContrastMenu", "High contrast"),
|
|
15
|
+
accents: {
|
|
16
|
+
Blue: t("themeSwitcher.blue", "Blue"),
|
|
17
|
+
Purple: t("themeSwitcher.purple", "Purple"),
|
|
18
|
+
Teal: t("themeSwitcher.teal", "Teal"),
|
|
19
|
+
Indigo: t("themeSwitcher.indigo", "Indigo")
|
|
20
|
+
},
|
|
21
|
+
density: {
|
|
22
|
+
compact: t("themeSwitcher.compact", "Compact"),
|
|
23
|
+
comfortable: t("themeSwitcher.comfortable", "Comfortable"),
|
|
24
|
+
spacious: t("themeSwitcher.spacious", "Spacious")
|
|
25
|
+
},
|
|
26
|
+
typography: {
|
|
27
|
+
small: t("themeSwitcher.small", "Small"),
|
|
28
|
+
default: t("themeSwitcher.default", "Default"),
|
|
29
|
+
large: t("themeSwitcher.large", "Large")
|
|
30
|
+
},
|
|
31
|
+
glass: {
|
|
32
|
+
off: t("themeSwitcher.off", "Off"),
|
|
33
|
+
subtle: t("themeSwitcher.subtle", "Subtle"),
|
|
34
|
+
full: t("themeSwitcher.full", "Full")
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { t as useThemeOptionLabels };
|
|
@@ -179,6 +179,14 @@ export interface AssistantMessageMetadata {
|
|
|
179
179
|
* inert card, or nothing.
|
|
180
180
|
*/
|
|
181
181
|
writeProposalRefs?: readonly WriteProposalMessageRef[];
|
|
182
|
+
/**
|
|
183
|
+
* Device-only correlation for an uncertain approve answer. It survives a
|
|
184
|
+
* reload so the issuing record can replace this note when it settles. Never
|
|
185
|
+
* contains a payload or approval capability, and never leaves for history.
|
|
186
|
+
*/
|
|
187
|
+
writeProposalTransportNote?: WriteProposalMessageRef & {
|
|
188
|
+
status: "uncertain" | "succeeded" | "failed" | "declined" | "superseded" | "expired";
|
|
189
|
+
};
|
|
182
190
|
/**
|
|
183
191
|
* ★ BOFF-7802: this reply is a UI command the panel carried out ITSELF — a
|
|
184
192
|
* theme set, a page opened — with no model turn and no sandbox. A record of
|
|
@@ -18,7 +18,7 @@ var s = /^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$/, c = 131072, l = 98304, u = 16384,
|
|
|
18
18
|
"failed",
|
|
19
19
|
"expired",
|
|
20
20
|
"cancelled"
|
|
21
|
-
], ie = /^(?:pending[-_]?write|write[-_]?proposal[-_]?refs?)$/i, y = "\n\n[…truncated in saved history]";
|
|
21
|
+
], ie = /^(?:pending[-_]?write|write[-_]?proposal[-_]?refs?|write[-_]?proposal[-_]?transport[-_]?note)$/i, y = "\n\n[…truncated in saved history]";
|
|
22
22
|
function b(e) {
|
|
23
23
|
return typeof e == "string" && s.test(e);
|
|
24
24
|
}
|
|
@@ -14,19 +14,19 @@ export type { AssistantLinkKind };
|
|
|
14
14
|
export type AssistantNavigateResult =
|
|
15
15
|
/** Handed to the SPA router; the landing is then checked. */
|
|
16
16
|
{
|
|
17
|
-
kind:
|
|
17
|
+
kind: 'routed';
|
|
18
18
|
}
|
|
19
19
|
/** A shell-less target: opened in a new tab, which cannot be verified. */
|
|
20
20
|
| {
|
|
21
|
-
kind:
|
|
21
|
+
kind: 'new-tab';
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* ★ BOFF-8060 (N4): not routed. `unsaved-changes` names what is unsaved, for
|
|
25
25
|
* the "You have unsaved changes in {label}" reply.
|
|
26
26
|
*/
|
|
27
27
|
| {
|
|
28
|
-
kind:
|
|
29
|
-
reason:
|
|
28
|
+
kind: 'refused';
|
|
29
|
+
reason: 'unsaved-changes' | 'not-routable';
|
|
30
30
|
unsaved?: readonly UnsavedChange[];
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
@@ -35,7 +35,7 @@ export type AssistantNavigateResult =
|
|
|
35
35
|
* draft is untouched.
|
|
36
36
|
*/
|
|
37
37
|
| {
|
|
38
|
-
kind:
|
|
38
|
+
kind: 'kept';
|
|
39
39
|
};
|
|
40
40
|
/**
|
|
41
41
|
* ★ BOFF-8060 (N4): who started this navigation. The assistant's (a typed or
|
|
@@ -47,7 +47,7 @@ export type AssistantNavigateResult =
|
|
|
47
47
|
*/
|
|
48
48
|
export type AssistantNavigateInitiator = NavigationInitiator;
|
|
49
49
|
/** Which assistant surface the person tapped; only ever used for counting. */
|
|
50
|
-
export type AssistantNavigateSurface =
|
|
50
|
+
export type AssistantNavigateSurface = 'offer' | 'reply-link' | 'connect-source';
|
|
51
51
|
export interface AssistantNavigateContext {
|
|
52
52
|
surface?: AssistantNavigateSurface;
|
|
53
53
|
}
|