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