@iloveagents/foundry-web-ui 0.3.0 → 0.4.0
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/README.md +14 -5
- package/dist/components/ag-ui-runtime-provider.d.ts +64 -0
- package/dist/components/ag-ui-runtime-provider.js +71 -0
- package/dist/components/app-brand.d.ts +6 -0
- package/dist/components/app-brand.js +13 -0
- package/dist/components/assistant-chat.d.ts +26 -0
- package/dist/components/assistant-chat.js +93 -0
- package/dist/components/chat-attachments.d.ts +25 -0
- package/dist/components/chat-attachments.js +20 -0
- package/dist/components/chat-bubble.d.ts +1 -0
- package/dist/components/chat-bubble.js +103 -0
- package/dist/components/chat-header.d.ts +2 -0
- package/dist/components/chat-header.js +16 -0
- package/dist/components/client-tool-executor.d.ts +12 -0
- package/dist/components/client-tool-executor.js +108 -0
- package/dist/components/collection-empty-state.d.ts +9 -0
- package/dist/components/collection-empty-state.js +6 -0
- package/dist/components/collection-filter-bar.d.ts +19 -0
- package/dist/components/collection-filter-bar.js +28 -0
- package/dist/components/collection-search-input.d.ts +6 -0
- package/dist/components/collection-search-input.js +8 -0
- package/dist/components/collection-skeleton.d.ts +6 -0
- package/dist/components/collection-skeleton.js +10 -0
- package/dist/components/collection-sort-menu.d.ts +10 -0
- package/dist/components/collection-sort-menu.js +9 -0
- package/dist/components/collection-surface.d.ts +8 -0
- package/dist/components/collection-surface.js +5 -0
- package/dist/components/collection-toolbar.d.ts +9 -0
- package/dist/components/collection-toolbar.js +5 -0
- package/dist/components/collection-view-toggle.d.ts +7 -0
- package/dist/components/collection-view-toggle.js +17 -0
- package/dist/components/composer-submit-bridge.d.ts +1 -0
- package/dist/components/composer-submit-bridge.js +15 -0
- package/dist/components/confirm-dialog.d.ts +11 -0
- package/dist/components/confirm-dialog.js +6 -0
- package/dist/components/confirmation-card.d.ts +14 -0
- package/dist/components/confirmation-card.js +12 -0
- package/dist/components/context-badges.d.ts +16 -0
- package/dist/components/context-badges.js +56 -0
- package/dist/components/context-bar.d.ts +41 -0
- package/dist/components/context-bar.js +123 -0
- package/dist/components/form-dialog.d.ts +12 -0
- package/dist/components/form-dialog.js +13 -0
- package/dist/components/global-selection-popover.d.ts +7 -0
- package/dist/components/global-selection-popover.js +167 -0
- package/dist/components/infinite-scroll-sentinel.d.ts +6 -0
- package/dist/components/infinite-scroll-sentinel.js +25 -0
- package/dist/components/json-viewer.d.ts +10 -0
- package/dist/components/json-viewer.js +80 -0
- package/dist/components/loading-indicator.d.ts +4 -0
- package/dist/components/loading-indicator.js +22 -0
- package/dist/components/markdown-text.d.ts +13 -0
- package/dist/components/markdown-text.js +221 -0
- package/dist/components/name-dialog.d.ts +16 -0
- package/dist/components/name-dialog.js +23 -0
- package/dist/components/selection-popover.d.ts +12 -0
- package/dist/components/selection-popover.js +111 -0
- package/dist/components/show-document-tool-ui.d.ts +1 -0
- package/dist/components/show-document-tool-ui.js +53 -0
- package/dist/components/sidebar.d.ts +4 -0
- package/dist/components/sidebar.js +904 -0
- package/dist/components/surface-card.d.ts +9 -0
- package/dist/components/surface-card.js +33 -0
- package/dist/components/theme-runtime-provider.d.ts +15 -0
- package/dist/components/theme-runtime-provider.js +48 -0
- package/dist/components/theme-toggle.d.ts +2 -0
- package/dist/components/theme-toggle.js +19 -0
- package/dist/components/tool-call-card.d.ts +27 -0
- package/dist/components/tool-call-card.js +13 -0
- package/dist/components/tool-fallback.d.ts +26 -0
- package/dist/components/tool-fallback.js +129 -0
- package/dist/components/tool-panel-layout.d.ts +10 -0
- package/dist/components/tool-panel-layout.js +12 -0
- package/dist/components/tool-panel.d.ts +1 -0
- package/dist/components/tool-panel.js +89 -0
- package/dist/components/tooltip-icon-button.d.ts +7 -0
- package/dist/components/tooltip-icon-button.js +9 -0
- package/dist/components/user-menu.d.ts +2 -0
- package/dist/components/user-menu.js +14 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.js +83 -0
- package/dist/lib/ag-ui-adapter.d.ts +29 -0
- package/dist/lib/ag-ui-adapter.js +373 -0
- package/dist/lib/app-store.d.ts +115 -0
- package/dist/lib/app-store.js +199 -0
- package/dist/lib/attachment-adapter.d.ts +20 -0
- package/dist/lib/attachment-adapter.js +99 -0
- package/dist/lib/auth-provider.d.ts +16 -0
- package/dist/lib/auth-provider.js +88 -0
- package/dist/lib/chat-bubble-store.d.ts +30 -0
- package/dist/lib/chat-bubble-store.js +23 -0
- package/dist/lib/chat-lifecycle-store.d.ts +10 -0
- package/{src/lib/chat-lifecycle-store.ts → dist/lib/chat-lifecycle-store.js} +3 -13
- package/dist/lib/client-tools.d.ts +11 -0
- package/dist/lib/client-tools.js +274 -0
- package/dist/lib/composer-submit-store.d.ts +12 -0
- package/dist/lib/composer-submit-store.js +17 -0
- package/dist/lib/dev-store.d.ts +38 -0
- package/dist/lib/dev-store.js +32 -0
- package/dist/lib/nav-config.d.ts +159 -0
- package/dist/lib/nav-config.js +162 -0
- package/dist/lib/nav-dnd.d.ts +8 -0
- package/dist/lib/nav-dnd.js +9 -0
- package/dist/lib/nav-store.d.ts +45 -0
- package/dist/lib/nav-store.js +49 -0
- package/dist/lib/selection-context.d.ts +21 -0
- package/dist/lib/selection-context.js +34 -0
- package/dist/lib/sidebar-store.d.ts +23 -0
- package/dist/lib/sidebar-store.js +98 -0
- package/dist/lib/theme-runtime.d.ts +130 -0
- package/dist/lib/theme-runtime.js +479 -0
- package/dist/lib/theme-store.d.ts +15 -0
- package/dist/lib/theme-store.js +53 -0
- package/dist/lib/tool-panel-store.d.ts +48 -0
- package/dist/lib/tool-panel-store.js +69 -0
- package/dist/lib/use-new-conversation.d.ts +8 -0
- package/dist/lib/use-new-conversation.js +62 -0
- package/dist/lib/use-page-tools.d.ts +27 -0
- package/{src/lib/use-page-tools.ts → dist/lib/use-page-tools.js} +11 -13
- package/dist/styles.css +142 -0
- package/dist/ui/collapsible.d.ts +5 -0
- package/{src/ui/collapsible.tsx → dist/ui/collapsible.js} +0 -2
- package/dist/ui/dialog.d.ts +15 -0
- package/dist/ui/dialog.js +25 -0
- package/dist/ui/dropdown-menu.d.ts +7 -0
- package/dist/ui/dropdown-menu.js +19 -0
- package/dist/ui/popover.d.ts +7 -0
- package/dist/ui/popover.js +10 -0
- package/dist/ui/select.d.ts +4 -0
- package/dist/ui/select.js +9 -0
- package/dist/ui/tooltip.d.ts +7 -0
- package/dist/ui/tooltip.js +10 -0
- package/package.json +31 -12
- package/AGENTS.md +0 -59
- package/CHANGELOG.md +0 -203
- package/CLAUDE.md +0 -1
- package/src/__tests__/no-spaces-imports.test.ts +0 -59
- package/src/__tests__/open-core-guards.test.ts +0 -307
- package/src/__tests__/theme-runtime.test.ts +0 -81
- package/src/__tests__/tool-fallback.test.tsx +0 -109
- package/src/components/__tests__/context-bar.test.ts +0 -112
- package/src/components/ag-ui-runtime-provider.tsx +0 -170
- package/src/components/app-brand.tsx +0 -38
- package/src/components/assistant-chat.tsx +0 -461
- package/src/components/chat-attachments.tsx +0 -68
- package/src/components/chat-bubble.tsx +0 -373
- package/src/components/chat-header.tsx +0 -44
- package/src/components/client-tool-executor.tsx +0 -230
- package/src/components/collection-empty-state.tsx +0 -37
- package/src/components/collection-filter-bar.tsx +0 -168
- package/src/components/collection-search-input.tsx +0 -41
- package/src/components/collection-skeleton.tsx +0 -55
- package/src/components/collection-sort-menu.tsx +0 -62
- package/src/components/collection-surface.tsx +0 -46
- package/src/components/collection-toolbar.tsx +0 -33
- package/src/components/collection-view-toggle.tsx +0 -61
- package/src/components/composer-submit-bridge.tsx +0 -19
- package/src/components/confirm-dialog.tsx +0 -49
- package/src/components/confirmation-card.tsx +0 -32
- package/src/components/context-badges.tsx +0 -136
- package/src/components/context-bar.tsx +0 -238
- package/src/components/form-dialog.tsx +0 -56
- package/src/components/global-selection-popover.tsx +0 -266
- package/src/components/infinite-scroll-sentinel.tsx +0 -48
- package/src/components/json-viewer.tsx +0 -232
- package/src/components/loading-indicator.tsx +0 -40
- package/src/components/markdown-text-citations.test.tsx +0 -108
- package/src/components/markdown-text.tsx +0 -508
- package/src/components/name-dialog.tsx +0 -87
- package/src/components/selection-popover.tsx +0 -156
- package/src/components/show-document-tool-ui.tsx +0 -90
- package/src/components/sidebar.test.tsx +0 -611
- package/src/components/sidebar.tsx +0 -1689
- package/src/components/surface-card.tsx +0 -45
- package/src/components/theme-runtime-provider.tsx +0 -93
- package/src/components/theme-toggle.tsx +0 -27
- package/src/components/tool-call-card.tsx +0 -126
- package/src/components/tool-fallback.tsx +0 -169
- package/src/components/tool-panel-layout.tsx +0 -36
- package/src/components/tool-panel.tsx +0 -233
- package/src/components/tooltip-icon-button.tsx +0 -28
- package/src/components/user-menu.tsx +0 -60
- package/src/index.ts +0 -185
- package/src/lib/__tests__/ag-ui-adapter.test.ts +0 -273
- package/src/lib/__tests__/app-store.test.ts +0 -405
- package/src/lib/__tests__/attachment-adapter.test.ts +0 -48
- package/src/lib/__tests__/chat-bubble-store.test.ts +0 -67
- package/src/lib/__tests__/client-tools.test.ts +0 -124
- package/src/lib/__tests__/dev-store.test.ts +0 -78
- package/src/lib/__tests__/nav-config.test.ts +0 -135
- package/src/lib/__tests__/nav-dnd.test.ts +0 -24
- package/src/lib/__tests__/nav-store.test.ts +0 -59
- package/src/lib/__tests__/selection-context.test.ts +0 -114
- package/src/lib/__tests__/sidebar-store.test.ts +0 -144
- package/src/lib/__tests__/theme-store.test.ts +0 -83
- package/src/lib/__tests__/tool-panel-store.test.ts +0 -61
- package/src/lib/__tests__/use-page-context.test.ts +0 -58
- package/src/lib/ag-ui-adapter.ts +0 -412
- package/src/lib/app-store.ts +0 -361
- package/src/lib/attachment-adapter.ts +0 -92
- package/src/lib/auth-provider.tsx +0 -144
- package/src/lib/chat-bubble-store.ts +0 -46
- package/src/lib/client-tools.ts +0 -293
- package/src/lib/composer-submit-store.ts +0 -32
- package/src/lib/dev-store.ts +0 -69
- package/src/lib/nav-config.ts +0 -329
- package/src/lib/nav-dnd.ts +0 -14
- package/src/lib/nav-store.ts +0 -89
- package/src/lib/selection-context.ts +0 -65
- package/src/lib/sidebar-store.ts +0 -113
- package/src/lib/theme-runtime.ts +0 -660
- package/src/lib/theme-store.ts +0 -67
- package/src/lib/tool-panel-store.ts +0 -121
- package/src/lib/use-new-conversation.test.tsx +0 -168
- package/src/lib/use-new-conversation.ts +0 -64
- package/src/ui/dialog.tsx +0 -109
- package/src/ui/dropdown-menu.tsx +0 -75
- package/src/ui/popover.tsx +0 -34
- package/src/ui/select.tsx +0 -15
- package/src/ui/tooltip.tsx +0 -30
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -8
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
SIDEBAR_MAX_WIDTH,
|
|
4
|
-
SIDEBAR_MIN_WIDTH,
|
|
5
|
-
SIDEBAR_WIDTH,
|
|
6
|
-
useSidebarStore,
|
|
7
|
-
} from "../sidebar-store";
|
|
8
|
-
|
|
9
|
-
const SIDEBAR_WIDTH_VERSION = "2026-03-27-narrow";
|
|
10
|
-
|
|
11
|
-
const reset = () =>
|
|
12
|
-
useSidebarStore.setState({
|
|
13
|
-
isOpen: true,
|
|
14
|
-
isMobileOpen: false,
|
|
15
|
-
width: SIDEBAR_WIDTH,
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
const store = () => useSidebarStore.getState();
|
|
19
|
-
|
|
20
|
-
async function importFreshSidebarStore(
|
|
21
|
-
storageValue: string | null,
|
|
22
|
-
storageVersion: string | null = SIDEBAR_WIDTH_VERSION,
|
|
23
|
-
) {
|
|
24
|
-
vi.resetModules();
|
|
25
|
-
vi.stubGlobal("localStorage", {
|
|
26
|
-
getItem: vi.fn().mockImplementation((key: string) => {
|
|
27
|
-
if (key === "sidebar-width") return storageValue;
|
|
28
|
-
if (key === "sidebar-width-version") return storageVersion;
|
|
29
|
-
return null;
|
|
30
|
-
}),
|
|
31
|
-
setItem: vi.fn(),
|
|
32
|
-
});
|
|
33
|
-
return import("../sidebar-store");
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
describe("sidebar-store", () => {
|
|
37
|
-
beforeEach(() => {
|
|
38
|
-
reset();
|
|
39
|
-
vi.useFakeTimers();
|
|
40
|
-
vi.stubGlobal("localStorage", {
|
|
41
|
-
getItem: vi.fn(),
|
|
42
|
-
setItem: vi.fn(),
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
describe("toggle", () => {
|
|
47
|
-
it("flips isOpen from true to false", () => {
|
|
48
|
-
store().toggle();
|
|
49
|
-
expect(store().isOpen).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("flips isOpen from false to true", () => {
|
|
53
|
-
useSidebarStore.setState({ isOpen: false });
|
|
54
|
-
store().toggle();
|
|
55
|
-
expect(store().isOpen).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("persists state to localStorage", () => {
|
|
59
|
-
store().toggle();
|
|
60
|
-
expect(localStorage.setItem).toHaveBeenCalledWith("sidebar", "false");
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe("open / close", () => {
|
|
65
|
-
it("open sets isOpen to true", () => {
|
|
66
|
-
useSidebarStore.setState({ isOpen: false });
|
|
67
|
-
store().open();
|
|
68
|
-
expect(store().isOpen).toBe(true);
|
|
69
|
-
expect(localStorage.setItem).toHaveBeenCalledWith("sidebar", "true");
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("close sets isOpen to false", () => {
|
|
73
|
-
store().close();
|
|
74
|
-
expect(store().isOpen).toBe(false);
|
|
75
|
-
expect(localStorage.setItem).toHaveBeenCalledWith("sidebar", "false");
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe("mobile drawer", () => {
|
|
80
|
-
it("toggleMobile flips isMobileOpen", () => {
|
|
81
|
-
store().toggleMobile();
|
|
82
|
-
expect(store().isMobileOpen).toBe(true);
|
|
83
|
-
store().toggleMobile();
|
|
84
|
-
expect(store().isMobileOpen).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it("closeMobile sets isMobileOpen to false", () => {
|
|
88
|
-
useSidebarStore.setState({ isMobileOpen: true });
|
|
89
|
-
store().closeMobile();
|
|
90
|
-
expect(store().isMobileOpen).toBe(false);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
describe("setWidth", () => {
|
|
95
|
-
it("persists sidebar width to localStorage", () => {
|
|
96
|
-
store().setWidth(360);
|
|
97
|
-
vi.runAllTimers();
|
|
98
|
-
expect(store().width).toBe(360);
|
|
99
|
-
expect(localStorage.setItem).toHaveBeenCalledWith("sidebar-width", "360");
|
|
100
|
-
expect(localStorage.setItem).toHaveBeenCalledWith(
|
|
101
|
-
"sidebar-width-version",
|
|
102
|
-
SIDEBAR_WIDTH_VERSION,
|
|
103
|
-
);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it("clamps width to the supported range", () => {
|
|
107
|
-
store().setWidth(999);
|
|
108
|
-
expect(store().width).toBe(SIDEBAR_MAX_WIDTH);
|
|
109
|
-
|
|
110
|
-
store().setWidth(100);
|
|
111
|
-
expect(store().width).toBe(SIDEBAR_MIN_WIDTH);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
describe("initial width from localStorage", () => {
|
|
116
|
-
it("falls back to default width when sidebar-width is missing", async () => {
|
|
117
|
-
const { useSidebarStore: freshStore } = await importFreshSidebarStore(null);
|
|
118
|
-
expect(freshStore.getState().width).toBe(SIDEBAR_WIDTH);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("falls back to default width when sidebar-width is invalid", async () => {
|
|
122
|
-
const { useSidebarStore: freshStore } = await importFreshSidebarStore("not-a-number");
|
|
123
|
-
expect(freshStore.getState().width).toBe(SIDEBAR_WIDTH);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it("uses stored width when within the supported range", async () => {
|
|
127
|
-
const { useSidebarStore: freshStore } = await importFreshSidebarStore("360");
|
|
128
|
-
expect(freshStore.getState().width).toBe(360);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it("clamps stored width to the supported range", async () => {
|
|
132
|
-
const { useSidebarStore: largeStore } = await importFreshSidebarStore("999");
|
|
133
|
-
expect(largeStore.getState().width).toBe(SIDEBAR_MAX_WIDTH);
|
|
134
|
-
|
|
135
|
-
const { useSidebarStore: smallStore } = await importFreshSidebarStore("100");
|
|
136
|
-
expect(smallStore.getState().width).toBe(SIDEBAR_MIN_WIDTH);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("resets legacy stored widths when the version changes", async () => {
|
|
140
|
-
const { useSidebarStore: freshStore } = await importFreshSidebarStore("394", null);
|
|
141
|
-
expect(freshStore.getState().width).toBe(SIDEBAR_WIDTH);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
});
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
-
|
|
4
|
-
// Mock matchMedia before importing the store (jsdom doesn't implement it)
|
|
5
|
-
const matchMediaMock = vi.fn().mockReturnValue({
|
|
6
|
-
matches: false,
|
|
7
|
-
addEventListener: vi.fn(),
|
|
8
|
-
removeEventListener: vi.fn(),
|
|
9
|
-
});
|
|
10
|
-
Object.defineProperty(window, "matchMedia", { value: matchMediaMock, writable: true });
|
|
11
|
-
|
|
12
|
-
// Import after mock is in place (store initializes on import)
|
|
13
|
-
const { useThemeStore } = await import("../theme-store");
|
|
14
|
-
|
|
15
|
-
const store = () => useThemeStore.getState();
|
|
16
|
-
|
|
17
|
-
describe("theme-store", () => {
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
localStorage.clear();
|
|
20
|
-
document.documentElement.classList.remove("dark");
|
|
21
|
-
matchMediaMock.mockReturnValue({
|
|
22
|
-
matches: false,
|
|
23
|
-
addEventListener: vi.fn(),
|
|
24
|
-
removeEventListener: vi.fn(),
|
|
25
|
-
});
|
|
26
|
-
useThemeStore.setState({ mode: "system" });
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe("setMode", () => {
|
|
30
|
-
it("applies dark class for dark mode", () => {
|
|
31
|
-
store().setMode("dark");
|
|
32
|
-
expect(store().mode).toBe("dark");
|
|
33
|
-
expect(document.documentElement.classList.contains("dark")).toBe(true);
|
|
34
|
-
expect(localStorage.getItem("theme")).toBe("dark");
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("removes dark class for light mode", () => {
|
|
38
|
-
store().setMode("dark");
|
|
39
|
-
store().setMode("light");
|
|
40
|
-
expect(document.documentElement.classList.contains("dark")).toBe(false);
|
|
41
|
-
expect(localStorage.getItem("theme")).toBe("light");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("persists to localStorage", () => {
|
|
45
|
-
store().setMode("dark");
|
|
46
|
-
expect(localStorage.getItem("theme")).toBe("dark");
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
describe("cycle", () => {
|
|
51
|
-
it("cycles light -> dark -> system -> light", () => {
|
|
52
|
-
store().setMode("light");
|
|
53
|
-
store().cycle();
|
|
54
|
-
expect(store().mode).toBe("dark");
|
|
55
|
-
store().cycle();
|
|
56
|
-
expect(store().mode).toBe("system");
|
|
57
|
-
store().cycle();
|
|
58
|
-
expect(store().mode).toBe("light");
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
describe("system mode", () => {
|
|
63
|
-
it("respects OS dark preference", () => {
|
|
64
|
-
matchMediaMock.mockReturnValue({
|
|
65
|
-
matches: true,
|
|
66
|
-
addEventListener: vi.fn(),
|
|
67
|
-
removeEventListener: vi.fn(),
|
|
68
|
-
});
|
|
69
|
-
store().setMode("system");
|
|
70
|
-
expect(document.documentElement.classList.contains("dark")).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("respects OS light preference", () => {
|
|
74
|
-
matchMediaMock.mockReturnValue({
|
|
75
|
-
matches: false,
|
|
76
|
-
addEventListener: vi.fn(),
|
|
77
|
-
removeEventListener: vi.fn(),
|
|
78
|
-
});
|
|
79
|
-
store().setMode("system");
|
|
80
|
-
expect(document.documentElement.classList.contains("dark")).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
});
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { useToolPanelStore } from "../tool-panel-store";
|
|
3
|
-
|
|
4
|
-
const reset = () =>
|
|
5
|
-
useToolPanelStore.setState({
|
|
6
|
-
isOpen: false,
|
|
7
|
-
content: null,
|
|
8
|
-
isFullscreen: false,
|
|
9
|
-
// Node env fallbacks
|
|
10
|
-
panelWidth: 800,
|
|
11
|
-
useOverlay: true,
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
const store = () => useToolPanelStore.getState();
|
|
15
|
-
|
|
16
|
-
const content = { title: "Test", content: "body", type: "markdown" as const };
|
|
17
|
-
|
|
18
|
-
describe("tool-panel-store", () => {
|
|
19
|
-
beforeEach(reset);
|
|
20
|
-
|
|
21
|
-
describe("toggleFullscreen", () => {
|
|
22
|
-
it("entering fullscreen sets overlay and expands width", () => {
|
|
23
|
-
store().toggleFullscreen();
|
|
24
|
-
expect(store().isFullscreen).toBe(true);
|
|
25
|
-
expect(store().useOverlay).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("exiting fullscreen restores layout defaults", () => {
|
|
29
|
-
store().toggleFullscreen(); // on
|
|
30
|
-
store().toggleFullscreen(); // off
|
|
31
|
-
expect(store().isFullscreen).toBe(false);
|
|
32
|
-
// jsdom: innerWidth=1024 < 1280, so overlay=true, panelWidth=1024
|
|
33
|
-
expect(store().useOverlay).toBe(true);
|
|
34
|
-
expect(store().panelWidth).toBeLessThanOrEqual(1280);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe("updateLayout", () => {
|
|
39
|
-
it("is a no-op when fullscreen", () => {
|
|
40
|
-
store().openPanel(content);
|
|
41
|
-
store().toggleFullscreen();
|
|
42
|
-
const widthBefore = store().panelWidth;
|
|
43
|
-
store().updateLayout();
|
|
44
|
-
expect(store().panelWidth).toBe(widthBefore);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("recalculates when not fullscreen", () => {
|
|
48
|
-
store().updateLayout();
|
|
49
|
-
// jsdom: innerWidth=1024 < 1280, so overlay=true
|
|
50
|
-
expect(store().useOverlay).toBe(true);
|
|
51
|
-
expect(store().panelWidth).toBeLessThanOrEqual(1280);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe("SSR / Node fallbacks", () => {
|
|
56
|
-
it("defaults to panelWidth=800 and useOverlay=true without window", () => {
|
|
57
|
-
expect(store().panelWidth).toBe(800);
|
|
58
|
-
expect(store().useOverlay).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
});
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for usePageContext — tests the underlying store operations
|
|
3
|
-
* since the hook is a thin mount/unmount wrapper over addContextItem/removeContextItem.
|
|
4
|
-
*/
|
|
5
|
-
import { beforeEach, describe, expect, it } from "vitest";
|
|
6
|
-
import { useAppStore } from "../app-store";
|
|
7
|
-
|
|
8
|
-
const reset = () =>
|
|
9
|
-
useAppStore.setState({
|
|
10
|
-
contextItems: [],
|
|
11
|
-
sentContext: {},
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
const store = () => useAppStore.getState();
|
|
15
|
-
|
|
16
|
-
const noteItem = () => ({
|
|
17
|
-
type: "note" as const,
|
|
18
|
-
label: "Dashboard metrics",
|
|
19
|
-
payload: { kind: "text" as const, text: "Q1 revenue data" },
|
|
20
|
-
sourcePage: "/dashboard",
|
|
21
|
-
persistence: "ephemeral" as const,
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
describe("usePageContext (store operations)", () => {
|
|
25
|
-
beforeEach(reset);
|
|
26
|
-
|
|
27
|
-
it("addContextItem adds note items", () => {
|
|
28
|
-
store().addContextItem(noteItem());
|
|
29
|
-
expect(store().contextItems).toHaveLength(1);
|
|
30
|
-
expect(store().contextItems[0].label).toBe("Dashboard metrics");
|
|
31
|
-
expect(store().contextItems[0].type).toBe("note");
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("removeContextItem removes by id (simulates unmount cleanup)", () => {
|
|
35
|
-
store().addContextItem(noteItem());
|
|
36
|
-
const id = store().contextItems[0].id;
|
|
37
|
-
|
|
38
|
-
store().removeContextItem(id);
|
|
39
|
-
expect(store().contextItems).toHaveLength(0);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it("re-adding after removal works (simulates remount)", () => {
|
|
43
|
-
store().addContextItem(noteItem());
|
|
44
|
-
const id = store().contextItems[0].id;
|
|
45
|
-
store().removeContextItem(id);
|
|
46
|
-
|
|
47
|
-
store().addContextItem(noteItem());
|
|
48
|
-
expect(store().contextItems).toHaveLength(1);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("ephemeral note items are cleared on navigation", () => {
|
|
52
|
-
store().addContextItem(noteItem());
|
|
53
|
-
expect(store().contextItems).toHaveLength(1);
|
|
54
|
-
|
|
55
|
-
store().setCurrentPage("/other-page");
|
|
56
|
-
expect(store().contextItems).toHaveLength(0);
|
|
57
|
-
});
|
|
58
|
-
});
|