@iloveagents/foundry-web-ui 0.3.1 → 0.5.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.
Files changed (227) hide show
  1. package/README.md +13 -4
  2. package/dist/components/ag-ui-runtime-provider.d.ts +64 -0
  3. package/dist/components/ag-ui-runtime-provider.js +71 -0
  4. package/dist/components/app-brand.d.ts +6 -0
  5. package/dist/components/app-brand.js +13 -0
  6. package/dist/components/assistant-chat.d.ts +26 -0
  7. package/dist/components/assistant-chat.js +94 -0
  8. package/dist/components/chat-attachments.d.ts +25 -0
  9. package/dist/components/chat-attachments.js +20 -0
  10. package/dist/components/chat-bubble.d.ts +1 -0
  11. package/dist/components/chat-bubble.js +105 -0
  12. package/dist/components/chat-header.d.ts +2 -0
  13. package/dist/components/chat-header.js +16 -0
  14. package/dist/components/client-tool-executor.d.ts +12 -0
  15. package/dist/components/client-tool-executor.js +108 -0
  16. package/dist/components/collection-empty-state.d.ts +9 -0
  17. package/dist/components/collection-empty-state.js +6 -0
  18. package/dist/components/collection-filter-bar.d.ts +19 -0
  19. package/dist/components/collection-filter-bar.js +28 -0
  20. package/dist/components/collection-search-input.d.ts +6 -0
  21. package/dist/components/collection-search-input.js +8 -0
  22. package/dist/components/collection-skeleton.d.ts +6 -0
  23. package/dist/components/collection-skeleton.js +10 -0
  24. package/dist/components/collection-sort-menu.d.ts +10 -0
  25. package/dist/components/collection-sort-menu.js +9 -0
  26. package/dist/components/collection-surface.d.ts +8 -0
  27. package/dist/components/collection-surface.js +5 -0
  28. package/dist/components/collection-toolbar.d.ts +9 -0
  29. package/dist/components/collection-toolbar.js +5 -0
  30. package/dist/components/collection-view-toggle.d.ts +7 -0
  31. package/dist/components/collection-view-toggle.js +17 -0
  32. package/dist/components/composer-submit-bridge.d.ts +1 -0
  33. package/dist/components/composer-submit-bridge.js +15 -0
  34. package/dist/components/confirm-dialog.d.ts +11 -0
  35. package/dist/components/confirm-dialog.js +6 -0
  36. package/dist/components/confirmation-card.d.ts +14 -0
  37. package/dist/components/confirmation-card.js +12 -0
  38. package/dist/components/context-badges.d.ts +16 -0
  39. package/dist/components/context-badges.js +56 -0
  40. package/dist/components/context-bar.d.ts +41 -0
  41. package/dist/components/context-bar.js +123 -0
  42. package/dist/components/form-dialog.d.ts +12 -0
  43. package/dist/components/form-dialog.js +13 -0
  44. package/dist/components/global-selection-popover.d.ts +7 -0
  45. package/dist/components/global-selection-popover.js +167 -0
  46. package/dist/components/infinite-scroll-sentinel.d.ts +6 -0
  47. package/dist/components/infinite-scroll-sentinel.js +25 -0
  48. package/dist/components/json-viewer.d.ts +10 -0
  49. package/dist/components/json-viewer.js +80 -0
  50. package/dist/components/loading-indicator.d.ts +13 -0
  51. package/dist/components/loading-indicator.js +35 -0
  52. package/dist/components/markdown-text.d.ts +13 -0
  53. package/dist/components/markdown-text.js +221 -0
  54. package/dist/components/message-error.d.ts +10 -0
  55. package/dist/components/message-error.js +10 -0
  56. package/dist/components/message-timestamp.d.ts +10 -0
  57. package/dist/components/message-timestamp.js +18 -0
  58. package/dist/components/name-dialog.d.ts +16 -0
  59. package/dist/components/name-dialog.js +23 -0
  60. package/dist/components/selection-popover.d.ts +12 -0
  61. package/dist/components/selection-popover.js +111 -0
  62. package/dist/components/show-document-tool-ui.d.ts +1 -0
  63. package/dist/components/show-document-tool-ui.js +53 -0
  64. package/dist/components/sidebar.d.ts +4 -0
  65. package/dist/components/sidebar.js +904 -0
  66. package/dist/components/surface-card.d.ts +9 -0
  67. package/dist/components/surface-card.js +33 -0
  68. package/dist/components/theme-runtime-provider.d.ts +15 -0
  69. package/dist/components/theme-runtime-provider.js +48 -0
  70. package/dist/components/theme-toggle.d.ts +2 -0
  71. package/dist/components/theme-toggle.js +19 -0
  72. package/dist/components/tool-call-card.d.ts +27 -0
  73. package/dist/components/tool-call-card.js +13 -0
  74. package/dist/components/tool-fallback.d.ts +26 -0
  75. package/dist/components/tool-fallback.js +129 -0
  76. package/dist/components/tool-panel-layout.d.ts +10 -0
  77. package/dist/components/tool-panel-layout.js +12 -0
  78. package/dist/components/tool-panel.d.ts +1 -0
  79. package/dist/components/tool-panel.js +89 -0
  80. package/dist/components/tooltip-icon-button.d.ts +7 -0
  81. package/dist/components/tooltip-icon-button.js +9 -0
  82. package/dist/components/user-menu.d.ts +2 -0
  83. package/dist/components/user-menu.js +14 -0
  84. package/dist/index.d.ts +68 -0
  85. package/dist/index.js +83 -0
  86. package/dist/lib/ag-ui-adapter.d.ts +29 -0
  87. package/dist/lib/ag-ui-adapter.js +382 -0
  88. package/dist/lib/app-store.d.ts +115 -0
  89. package/dist/lib/app-store.js +199 -0
  90. package/dist/lib/attachment-adapter.d.ts +20 -0
  91. package/dist/lib/attachment-adapter.js +99 -0
  92. package/dist/lib/auth-provider.d.ts +16 -0
  93. package/dist/lib/auth-provider.js +88 -0
  94. package/dist/lib/chat-bubble-store.d.ts +30 -0
  95. package/dist/lib/chat-bubble-store.js +23 -0
  96. package/dist/lib/chat-lifecycle-store.d.ts +10 -0
  97. package/{src/lib/chat-lifecycle-store.ts → dist/lib/chat-lifecycle-store.js} +3 -13
  98. package/dist/lib/client-tools.d.ts +11 -0
  99. package/dist/lib/client-tools.js +274 -0
  100. package/dist/lib/composer-submit-store.d.ts +12 -0
  101. package/dist/lib/composer-submit-store.js +17 -0
  102. package/dist/lib/dev-store.d.ts +38 -0
  103. package/dist/lib/dev-store.js +32 -0
  104. package/dist/lib/nav-config.d.ts +159 -0
  105. package/dist/lib/nav-config.js +162 -0
  106. package/dist/lib/nav-dnd.d.ts +8 -0
  107. package/dist/lib/nav-dnd.js +9 -0
  108. package/dist/lib/nav-store.d.ts +45 -0
  109. package/dist/lib/nav-store.js +49 -0
  110. package/dist/lib/selection-context.d.ts +21 -0
  111. package/dist/lib/selection-context.js +34 -0
  112. package/dist/lib/sidebar-store.d.ts +23 -0
  113. package/dist/lib/sidebar-store.js +98 -0
  114. package/dist/lib/theme-runtime.d.ts +130 -0
  115. package/dist/lib/theme-runtime.js +479 -0
  116. package/dist/lib/theme-store.d.ts +15 -0
  117. package/dist/lib/theme-store.js +53 -0
  118. package/dist/lib/tool-panel-store.d.ts +48 -0
  119. package/dist/lib/tool-panel-store.js +69 -0
  120. package/dist/lib/use-new-conversation.d.ts +8 -0
  121. package/dist/lib/use-new-conversation.js +62 -0
  122. package/dist/lib/use-page-tools.d.ts +27 -0
  123. package/{src/lib/use-page-tools.ts → dist/lib/use-page-tools.js} +11 -13
  124. package/dist/styles.css +142 -0
  125. package/dist/ui/collapsible.d.ts +5 -0
  126. package/{src/ui/collapsible.tsx → dist/ui/collapsible.js} +0 -2
  127. package/dist/ui/dialog.d.ts +15 -0
  128. package/dist/ui/dialog.js +25 -0
  129. package/dist/ui/dropdown-menu.d.ts +7 -0
  130. package/dist/ui/dropdown-menu.js +19 -0
  131. package/dist/ui/popover.d.ts +7 -0
  132. package/dist/ui/popover.js +10 -0
  133. package/dist/ui/select.d.ts +4 -0
  134. package/dist/ui/select.js +9 -0
  135. package/dist/ui/tooltip.d.ts +7 -0
  136. package/dist/ui/tooltip.js +10 -0
  137. package/package.json +31 -12
  138. package/AGENTS.md +0 -59
  139. package/CHANGELOG.md +0 -211
  140. package/CLAUDE.md +0 -1
  141. package/src/__tests__/no-spaces-imports.test.ts +0 -59
  142. package/src/__tests__/open-core-guards.test.ts +0 -307
  143. package/src/__tests__/theme-runtime.test.ts +0 -81
  144. package/src/__tests__/tool-fallback.test.tsx +0 -109
  145. package/src/components/__tests__/context-bar.test.ts +0 -112
  146. package/src/components/ag-ui-runtime-provider.tsx +0 -170
  147. package/src/components/app-brand.tsx +0 -38
  148. package/src/components/assistant-chat.tsx +0 -461
  149. package/src/components/chat-attachments.tsx +0 -68
  150. package/src/components/chat-bubble.tsx +0 -373
  151. package/src/components/chat-header.tsx +0 -44
  152. package/src/components/client-tool-executor.tsx +0 -230
  153. package/src/components/collection-empty-state.tsx +0 -37
  154. package/src/components/collection-filter-bar.tsx +0 -168
  155. package/src/components/collection-search-input.tsx +0 -41
  156. package/src/components/collection-skeleton.tsx +0 -55
  157. package/src/components/collection-sort-menu.tsx +0 -62
  158. package/src/components/collection-surface.tsx +0 -46
  159. package/src/components/collection-toolbar.tsx +0 -33
  160. package/src/components/collection-view-toggle.tsx +0 -61
  161. package/src/components/composer-submit-bridge.tsx +0 -19
  162. package/src/components/confirm-dialog.tsx +0 -49
  163. package/src/components/confirmation-card.tsx +0 -32
  164. package/src/components/context-badges.tsx +0 -136
  165. package/src/components/context-bar.tsx +0 -238
  166. package/src/components/form-dialog.tsx +0 -56
  167. package/src/components/global-selection-popover.tsx +0 -266
  168. package/src/components/infinite-scroll-sentinel.tsx +0 -48
  169. package/src/components/json-viewer.tsx +0 -232
  170. package/src/components/loading-indicator.tsx +0 -40
  171. package/src/components/markdown-text-citations.test.tsx +0 -108
  172. package/src/components/markdown-text.tsx +0 -508
  173. package/src/components/name-dialog.tsx +0 -87
  174. package/src/components/selection-popover.tsx +0 -156
  175. package/src/components/show-document-tool-ui.tsx +0 -90
  176. package/src/components/sidebar.test.tsx +0 -611
  177. package/src/components/sidebar.tsx +0 -1689
  178. package/src/components/surface-card.tsx +0 -45
  179. package/src/components/theme-runtime-provider.tsx +0 -93
  180. package/src/components/theme-toggle.tsx +0 -27
  181. package/src/components/tool-call-card.tsx +0 -126
  182. package/src/components/tool-fallback.tsx +0 -169
  183. package/src/components/tool-panel-layout.tsx +0 -36
  184. package/src/components/tool-panel.tsx +0 -233
  185. package/src/components/tooltip-icon-button.tsx +0 -28
  186. package/src/components/user-menu.tsx +0 -60
  187. package/src/index.ts +0 -185
  188. package/src/lib/__tests__/ag-ui-adapter.test.ts +0 -279
  189. package/src/lib/__tests__/app-store.test.ts +0 -405
  190. package/src/lib/__tests__/attachment-adapter.test.ts +0 -48
  191. package/src/lib/__tests__/chat-bubble-store.test.ts +0 -67
  192. package/src/lib/__tests__/client-tools.test.ts +0 -124
  193. package/src/lib/__tests__/dev-store.test.ts +0 -78
  194. package/src/lib/__tests__/nav-config.test.ts +0 -135
  195. package/src/lib/__tests__/nav-dnd.test.ts +0 -24
  196. package/src/lib/__tests__/nav-store.test.ts +0 -59
  197. package/src/lib/__tests__/selection-context.test.ts +0 -114
  198. package/src/lib/__tests__/sidebar-store.test.ts +0 -144
  199. package/src/lib/__tests__/theme-store.test.ts +0 -83
  200. package/src/lib/__tests__/tool-panel-store.test.ts +0 -61
  201. package/src/lib/__tests__/use-page-context.test.ts +0 -58
  202. package/src/lib/ag-ui-adapter.ts +0 -426
  203. package/src/lib/app-store.ts +0 -361
  204. package/src/lib/attachment-adapter.ts +0 -92
  205. package/src/lib/auth-provider.tsx +0 -144
  206. package/src/lib/chat-bubble-store.ts +0 -46
  207. package/src/lib/client-tools.ts +0 -293
  208. package/src/lib/composer-submit-store.ts +0 -32
  209. package/src/lib/dev-store.ts +0 -69
  210. package/src/lib/nav-config.ts +0 -329
  211. package/src/lib/nav-dnd.ts +0 -14
  212. package/src/lib/nav-store.ts +0 -89
  213. package/src/lib/selection-context.ts +0 -65
  214. package/src/lib/sidebar-store.ts +0 -113
  215. package/src/lib/theme-runtime.ts +0 -660
  216. package/src/lib/theme-store.ts +0 -67
  217. package/src/lib/tool-panel-store.ts +0 -121
  218. package/src/lib/use-new-conversation.test.tsx +0 -168
  219. package/src/lib/use-new-conversation.ts +0 -64
  220. package/src/ui/dialog.tsx +0 -109
  221. package/src/ui/dropdown-menu.tsx +0 -75
  222. package/src/ui/popover.tsx +0 -34
  223. package/src/ui/select.tsx +0 -15
  224. package/src/ui/tooltip.tsx +0 -30
  225. package/src/vite-env.d.ts +0 -1
  226. package/tsconfig.json +0 -16
  227. 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
- });