@flanksource/clicky-ui 0.3.5 → 0.3.7

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 (277) hide show
  1. package/README.md +42 -0
  2. package/dist/ai.cjs +15 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +15 -0
  5. package/dist/ai.js.map +1 -1
  6. package/dist/components/DateField.d.ts +1 -1
  7. package/dist/components/DatePicker.d.ts +1 -1
  8. package/dist/components/DateTimePicker.d.ts +1 -1
  9. package/dist/components/FormLookupProvider.cjs +12 -0
  10. package/dist/components/FormLookupProvider.cjs.map +1 -0
  11. package/dist/components/FormLookupProvider.d.ts +7 -0
  12. package/dist/components/FormLookupProvider.d.ts.map +1 -0
  13. package/dist/components/FormLookupProvider.js +12 -0
  14. package/dist/components/FormLookupProvider.js.map +1 -0
  15. package/dist/components/JsonSchemaForm.cjs +2 -2
  16. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  17. package/dist/components/JsonSchemaForm.js +1 -1
  18. package/dist/components/JsonSchemaForm.js.map +1 -1
  19. package/dist/components/ListMenu.cjs +145 -0
  20. package/dist/components/ListMenu.cjs.map +1 -0
  21. package/dist/components/ListMenu.d.ts +54 -0
  22. package/dist/components/ListMenu.d.ts.map +1 -0
  23. package/dist/components/ListMenu.js +145 -0
  24. package/dist/components/ListMenu.js.map +1 -0
  25. package/dist/components/MdxEditorField.cjs +128 -0
  26. package/dist/components/MdxEditorField.cjs.map +1 -0
  27. package/dist/components/MdxEditorField.d.ts +4 -0
  28. package/dist/components/MdxEditorField.d.ts.map +1 -0
  29. package/dist/components/MdxEditorField.js +106 -0
  30. package/dist/components/MdxEditorField.js.map +1 -0
  31. package/dist/components/MdxEditorToolbar.cjs +76 -0
  32. package/dist/components/MdxEditorToolbar.cjs.map +1 -0
  33. package/dist/components/MdxEditorToolbar.d.ts +8 -0
  34. package/dist/components/MdxEditorToolbar.d.ts.map +1 -0
  35. package/dist/components/MdxEditorToolbar.js +76 -0
  36. package/dist/components/MdxEditorToolbar.js.map +1 -0
  37. package/dist/components/button-variants.d.ts +1 -1
  38. package/dist/components/button.d.ts +1 -1
  39. package/dist/components/form-lookup-context.cjs +1 -8
  40. package/dist/components/form-lookup-context.cjs.map +1 -1
  41. package/dist/components/form-lookup-context.d.ts +1 -5
  42. package/dist/components/form-lookup-context.d.ts.map +1 -1
  43. package/dist/components/form-lookup-context.js +1 -8
  44. package/dist/components/form-lookup-context.js.map +1 -1
  45. package/dist/components/jotai-bindings-core.cjs +197 -0
  46. package/dist/components/jotai-bindings-core.cjs.map +1 -0
  47. package/dist/components/jotai-bindings-core.d.ts +45 -0
  48. package/dist/components/jotai-bindings-core.d.ts.map +1 -0
  49. package/dist/components/jotai-bindings-core.js +197 -0
  50. package/dist/components/jotai-bindings-core.js.map +1 -0
  51. package/dist/components/jotai-bindings.cjs +17 -0
  52. package/dist/components/jotai-bindings.cjs.map +1 -0
  53. package/dist/components/jotai-bindings.d.ts +4 -0
  54. package/dist/components/jotai-bindings.d.ts.map +1 -0
  55. package/dist/components/jotai-bindings.js +17 -0
  56. package/dist/components/jotai-bindings.js.map +1 -0
  57. package/dist/components/json-schema-form-fields.cjs +37 -0
  58. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  59. package/dist/components/json-schema-form-fields.d.ts +6 -0
  60. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  61. package/dist/components/json-schema-form-fields.js +38 -1
  62. package/dist/components/json-schema-form-fields.js.map +1 -1
  63. package/dist/components/json-schema-form-render.cjs +3 -1
  64. package/dist/components/json-schema-form-render.cjs.map +1 -1
  65. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  66. package/dist/components/json-schema-form-render.js +4 -2
  67. package/dist/components/json-schema-form-render.js.map +1 -1
  68. package/dist/components/json-schema-form-resolve.cjs +9 -0
  69. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  70. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  71. package/dist/components/json-schema-form-resolve.js +9 -0
  72. package/dist/components/json-schema-form-resolve.js.map +1 -1
  73. package/dist/components/json-schema-form-types.d.ts +4 -1
  74. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  75. package/dist/components/mdx-editor-field-plugins.cjs +124 -0
  76. package/dist/components/mdx-editor-field-plugins.cjs.map +1 -0
  77. package/dist/components/mdx-editor-field-plugins.d.ts +6 -0
  78. package/dist/components/mdx-editor-field-plugins.d.ts.map +1 -0
  79. package/dist/components/mdx-editor-field-plugins.js +124 -0
  80. package/dist/components/mdx-editor-field-plugins.js.map +1 -0
  81. package/dist/components/mdx-editor-options.d.ts +77 -0
  82. package/dist/components/mdx-editor-options.d.ts.map +1 -0
  83. package/dist/components/use-list-menu-selection.cjs +77 -0
  84. package/dist/components/use-list-menu-selection.cjs.map +1 -0
  85. package/dist/components/use-list-menu-selection.d.ts +40 -0
  86. package/dist/components/use-list-menu-selection.d.ts.map +1 -0
  87. package/dist/components/use-list-menu-selection.js +77 -0
  88. package/dist/components/use-list-menu-selection.js.map +1 -0
  89. package/dist/components.cjs +10 -1
  90. package/dist/components.cjs.map +1 -1
  91. package/dist/components.d.ts +4 -1
  92. package/dist/components.d.ts.map +1 -1
  93. package/dist/components.js +10 -1
  94. package/dist/components.js.map +1 -1
  95. package/dist/data/MarkdownEditor.model.d.ts +1 -1
  96. package/dist/data/ProgressBars.cjs +194 -0
  97. package/dist/data/ProgressBars.cjs.map +1 -0
  98. package/dist/data/ProgressBars.d.ts +85 -0
  99. package/dist/data/ProgressBars.d.ts.map +1 -0
  100. package/dist/data/ProgressBars.js +194 -0
  101. package/dist/data/ProgressBars.js.map +1 -0
  102. package/dist/data/ProgressBars.model.cjs +27 -0
  103. package/dist/data/ProgressBars.model.cjs.map +1 -0
  104. package/dist/data/ProgressBars.model.d.ts +20 -0
  105. package/dist/data/ProgressBars.model.d.ts.map +1 -0
  106. package/dist/data/ProgressBars.model.js +27 -0
  107. package/dist/data/ProgressBars.model.js.map +1 -0
  108. package/dist/data/PromptBanner.cjs +199 -0
  109. package/dist/data/PromptBanner.cjs.map +1 -0
  110. package/dist/data/PromptBanner.d.ts +17 -0
  111. package/dist/data/PromptBanner.d.ts.map +1 -0
  112. package/dist/data/PromptBanner.js +199 -0
  113. package/dist/data/PromptBanner.js.map +1 -0
  114. package/dist/data/PromptBanner.model.cjs +132 -0
  115. package/dist/data/PromptBanner.model.cjs.map +1 -0
  116. package/dist/data/PromptBanner.model.d.ts +23 -0
  117. package/dist/data/PromptBanner.model.d.ts.map +1 -0
  118. package/dist/data/PromptBanner.model.js +132 -0
  119. package/dist/data/PromptBanner.model.js.map +1 -0
  120. package/dist/data/PromptDialog.cjs +43 -0
  121. package/dist/data/PromptDialog.cjs.map +1 -0
  122. package/dist/data/PromptDialog.d.ts +14 -0
  123. package/dist/data/PromptDialog.d.ts.map +1 -0
  124. package/dist/data/PromptDialog.js +43 -0
  125. package/dist/data/PromptDialog.js.map +1 -0
  126. package/dist/data/TaskManager.cjs +8 -1
  127. package/dist/data/TaskManager.cjs.map +1 -1
  128. package/dist/data/TaskManager.d.ts.map +1 -1
  129. package/dist/data/TaskManager.js +8 -1
  130. package/dist/data/TaskManager.js.map +1 -1
  131. package/dist/data/TaskProgress.cjs +15 -2
  132. package/dist/data/TaskProgress.cjs.map +1 -1
  133. package/dist/data/TaskProgress.d.ts +0 -10
  134. package/dist/data/TaskProgress.d.ts.map +1 -1
  135. package/dist/data/TaskProgress.js +15 -2
  136. package/dist/data/TaskProgress.js.map +1 -1
  137. package/dist/data/TimeseriesCoreBars.cjs +19 -173
  138. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  139. package/dist/data/TimeseriesCoreBars.d.ts +9 -26
  140. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  141. package/dist/data/TimeseriesCoreBars.js +20 -174
  142. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  143. package/dist/data/WorkloadCard.model.cjs.map +1 -1
  144. package/dist/data/WorkloadCard.model.d.ts +2 -2
  145. package/dist/data/WorkloadCard.model.d.ts.map +1 -1
  146. package/dist/data/WorkloadCard.model.js.map +1 -1
  147. package/dist/data/ai/ChatWindow.cjs +53 -9
  148. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  149. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  150. package/dist/data/ai/ChatWindow.js +53 -9
  151. package/dist/data/ai/ChatWindow.js.map +1 -1
  152. package/dist/data/ai/SessionViewer.cjs +275 -0
  153. package/dist/data/ai/SessionViewer.cjs.map +1 -0
  154. package/dist/data/ai/SessionViewer.d.ts +33 -0
  155. package/dist/data/ai/SessionViewer.d.ts.map +1 -0
  156. package/dist/data/ai/SessionViewer.fixtures.d.ts +4 -0
  157. package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -0
  158. package/dist/data/ai/SessionViewer.js +275 -0
  159. package/dist/data/ai/SessionViewer.js.map +1 -0
  160. package/dist/data/ai/SessionViewer.model.cjs +275 -0
  161. package/dist/data/ai/SessionViewer.model.cjs.map +1 -0
  162. package/dist/data/ai/SessionViewer.model.d.ts +87 -0
  163. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -0
  164. package/dist/data/ai/SessionViewer.model.js +275 -0
  165. package/dist/data/ai/SessionViewer.model.js.map +1 -0
  166. package/dist/data/ai/SessionViewerMenu.cjs +190 -0
  167. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -0
  168. package/dist/data/ai/SessionViewerMenu.d.ts +24 -0
  169. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -0
  170. package/dist/data/ai/SessionViewerMenu.js +190 -0
  171. package/dist/data/ai/SessionViewerMenu.js.map +1 -0
  172. package/dist/data/ai/ToolPreferences.cjs +232 -39
  173. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  174. package/dist/data/ai/ToolPreferences.d.ts +4 -7
  175. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  176. package/dist/data/ai/ToolPreferences.js +234 -41
  177. package/dist/data/ai/ToolPreferences.js.map +1 -1
  178. package/dist/data/ai/index.d.ts +3 -0
  179. package/dist/data/ai/index.d.ts.map +1 -1
  180. package/dist/data/ai/session-categories.cjs +219 -0
  181. package/dist/data/ai/session-categories.cjs.map +1 -0
  182. package/dist/data/ai/session-categories.d.ts +36 -0
  183. package/dist/data/ai/session-categories.d.ts.map +1 -0
  184. package/dist/data/ai/session-categories.js +219 -0
  185. package/dist/data/ai/session-categories.js.map +1 -0
  186. package/dist/data/chat/clickyOperationsToTools.cjs +89 -3
  187. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  188. package/dist/data/chat/clickyOperationsToTools.d.ts +1 -1
  189. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  190. package/dist/data/chat/clickyOperationsToTools.js +89 -3
  191. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  192. package/dist/data/chat/types.cjs.map +1 -1
  193. package/dist/data/chat/types.d.ts +7 -1
  194. package/dist/data/chat/types.d.ts.map +1 -1
  195. package/dist/data/chat/types.js.map +1 -1
  196. package/dist/data/task-status.cjs +19 -12
  197. package/dist/data/task-status.cjs.map +1 -1
  198. package/dist/data/task-status.d.ts +2 -1
  199. package/dist/data/task-status.d.ts.map +1 -1
  200. package/dist/data/task-status.js +19 -12
  201. package/dist/data/task-status.js.map +1 -1
  202. package/dist/data/test-runner/TestRunner.fixtures.d.ts +11 -4
  203. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  204. package/dist/data/version-info.cjs +3 -3
  205. package/dist/data/version-info.cjs.map +1 -1
  206. package/dist/data/version-info.js +3 -3
  207. package/dist/data/version-info.js.map +1 -1
  208. package/dist/data.cjs +11 -2
  209. package/dist/data.cjs.map +1 -1
  210. package/dist/data.d.ts +6 -2
  211. package/dist/data.d.ts.map +1 -1
  212. package/dist/data.js +11 -2
  213. package/dist/data.js.map +1 -1
  214. package/dist/hooks/use-prompts.cjs +83 -0
  215. package/dist/hooks/use-prompts.cjs.map +1 -0
  216. package/dist/hooks/use-prompts.d.ts +43 -0
  217. package/dist/hooks/use-prompts.d.ts.map +1 -0
  218. package/dist/hooks/use-prompts.js +83 -0
  219. package/dist/hooks/use-prompts.js.map +1 -0
  220. package/dist/hooks.cjs +3 -0
  221. package/dist/hooks.cjs.map +1 -1
  222. package/dist/hooks.d.ts +1 -0
  223. package/dist/hooks.d.ts.map +1 -1
  224. package/dist/hooks.js +3 -0
  225. package/dist/hooks.js.map +1 -1
  226. package/dist/index.cjs +21 -3
  227. package/dist/index.cjs.map +1 -1
  228. package/dist/index.js +21 -3
  229. package/dist/index.js.map +1 -1
  230. package/dist/jotai.cjs +9 -0
  231. package/dist/jotai.cjs.map +1 -0
  232. package/dist/jotai.d.ts +4 -0
  233. package/dist/jotai.d.ts.map +1 -0
  234. package/dist/jotai.js +9 -0
  235. package/dist/jotai.js.map +1 -0
  236. package/dist/lib/utils.cjs +18 -1
  237. package/dist/lib/utils.cjs.map +1 -1
  238. package/dist/lib/utils.d.ts.map +1 -1
  239. package/dist/lib/utils.js +18 -1
  240. package/dist/lib/utils.js.map +1 -1
  241. package/dist/mdx-editor.cjs +5 -0
  242. package/dist/mdx-editor.cjs.map +1 -0
  243. package/dist/mdx-editor.css +2 -0
  244. package/dist/mdx-editor.d.ts +2 -0
  245. package/dist/mdx-editor.d.ts.map +1 -0
  246. package/dist/mdx-editor.js +5 -0
  247. package/dist/mdx-editor.js.map +1 -0
  248. package/dist/rpc/apiClient.cjs +1 -1
  249. package/dist/rpc/apiClient.cjs.map +1 -1
  250. package/dist/rpc/apiClient.js +1 -1
  251. package/dist/rpc/apiClient.js.map +1 -1
  252. package/dist/rpc/surfaceIconMap.cjs +12 -1
  253. package/dist/rpc/surfaceIconMap.cjs.map +1 -1
  254. package/dist/rpc/surfaceIconMap.d.ts.map +1 -1
  255. package/dist/rpc/surfaceIconMap.js +12 -1
  256. package/dist/rpc/surfaceIconMap.js.map +1 -1
  257. package/dist/rpc/types.cjs.map +1 -1
  258. package/dist/rpc/types.d.ts +1 -0
  259. package/dist/rpc/types.d.ts.map +1 -1
  260. package/dist/rpc/types.js.map +1 -1
  261. package/dist/styles.css +1 -1
  262. package/oxlint-plugins/README.md +148 -0
  263. package/oxlint-plugins/clicky-ui-no-adhoc-overlay.js +88 -0
  264. package/oxlint-plugins/clicky-ui-prefer-components.js +46 -0
  265. package/oxlint-plugins/clicky-ui-prefer-icons.js +121 -0
  266. package/oxlint-plugins/clicky-ui-prefer-tailwind.js +98 -0
  267. package/oxlint-plugins/clicky-ui-prefer-theme.js +134 -0
  268. package/oxlint-plugins/clicky-ui-shared.js +132 -0
  269. package/oxlint-plugins/clicky-ui.js +34 -0
  270. package/oxlint-plugins/no-iconify-names.js +37 -0
  271. package/package.json +21 -1
  272. package/dist/data/TimeseriesCoreBars.model.cjs +0 -27
  273. package/dist/data/TimeseriesCoreBars.model.cjs.map +0 -1
  274. package/dist/data/TimeseriesCoreBars.model.d.ts +0 -20
  275. package/dist/data/TimeseriesCoreBars.model.d.ts.map +0 -1
  276. package/dist/data/TimeseriesCoreBars.model.js +0 -27
  277. package/dist/data/TimeseriesCoreBars.model.js.map +0 -1
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const utils = require("../../lib/utils.cjs");
5
+ const DropdownMenu = require("../../overlay/DropdownMenu.cjs");
6
+ const Icon = require("../Icon.cjs");
7
+ const sessionCategories = require("./session-categories.cjs");
8
+ const UiDotsVertical = require("../../icons/components/UiDotsVertical.cjs");
9
+ const UiResizeVertical = require("../../icons/components/UiResizeVertical.cjs");
10
+ const UiRows = require("../../icons/components/UiRows.cjs");
11
+ const UiListFlat = require("../../icons/components/UiListFlat.cjs");
12
+ const UiListDashes = require("../../icons/components/UiListDashes.cjs");
13
+ const UiDesktop = require("../../icons/components/UiDesktop.cjs");
14
+ const UiSun = require("../../icons/components/UiSun.cjs");
15
+ const UiMoon = require("../../icons/components/UiMoon.cjs");
16
+ const UiCheck = require("../../icons/components/UiCheck.cjs");
17
+ const DENSITY_OPTIONS = [
18
+ { value: "compact", icon: UiRows.UiRows, label: "Compact" },
19
+ { value: "comfortable", icon: UiListFlat.UiListFlat, label: "Comfortable" },
20
+ { value: "spacious", icon: UiListDashes.UiListDashes, label: "Spacious" }
21
+ ];
22
+ const THEME_OPTIONS = [
23
+ { value: "light", icon: UiSun.UiSun, label: "Light" },
24
+ { value: "dark", icon: UiMoon.UiMoon, label: "Dark" }
25
+ ];
26
+ function SessionViewerMenu({
27
+ density,
28
+ onDensityChange,
29
+ theme,
30
+ onThemeChange,
31
+ filters,
32
+ hiddenCategories,
33
+ hiddenTools,
34
+ hiddenSources,
35
+ onToggleCategory,
36
+ onToggleTool,
37
+ onToggleSource,
38
+ showThinking,
39
+ onToggleThinking,
40
+ hasThinking
41
+ }) {
42
+ return /* @__PURE__ */ jsxRuntime.jsx(
43
+ DropdownMenu.DropdownMenu,
44
+ {
45
+ icon: UiDotsVertical.UiDotsVertical,
46
+ hideChevron: true,
47
+ variant: "ghost",
48
+ size: "icon",
49
+ align: "right",
50
+ title: "Session options",
51
+ menuLabel: "Session options",
52
+ menuClassName: "min-w-[14rem] max-h-[70vh] overflow-auto px-1",
53
+ children: () => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-popover-foreground", children: [
54
+ /* @__PURE__ */ jsxRuntime.jsx(MenuHeading, { children: "Density" }),
55
+ /* @__PURE__ */ jsxRuntime.jsx(
56
+ RadioRow,
57
+ {
58
+ icon: UiResizeVertical.UiResizeVertical,
59
+ label: "Use page density",
60
+ active: density === void 0,
61
+ onSelect: () => onDensityChange(void 0)
62
+ }
63
+ ),
64
+ DENSITY_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
65
+ RadioRow,
66
+ {
67
+ icon: option.icon,
68
+ label: option.label,
69
+ active: density === option.value,
70
+ onSelect: () => onDensityChange(option.value)
71
+ },
72
+ option.value
73
+ )),
74
+ /* @__PURE__ */ jsxRuntime.jsxs(Section, { heading: "Theme", children: [
75
+ /* @__PURE__ */ jsxRuntime.jsx(
76
+ RadioRow,
77
+ {
78
+ icon: UiDesktop.UiDesktop,
79
+ label: "Use page theme",
80
+ active: theme === void 0,
81
+ onSelect: () => onThemeChange(void 0)
82
+ }
83
+ ),
84
+ THEME_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
85
+ RadioRow,
86
+ {
87
+ icon: option.icon,
88
+ label: option.label,
89
+ active: theme === option.value,
90
+ onSelect: () => onThemeChange(option.value)
91
+ },
92
+ option.value
93
+ ))
94
+ ] }),
95
+ filters.categories.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Section, { heading: "Categories", children: filters.categories.map((category) => /* @__PURE__ */ jsxRuntime.jsx(
96
+ CheckRow,
97
+ {
98
+ label: sessionCategories.CATEGORY_LABELS[category],
99
+ checked: !hiddenCategories.has(category),
100
+ onToggle: () => onToggleCategory(category)
101
+ },
102
+ category
103
+ )) }),
104
+ filters.tools.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Section, { heading: "Tools", children: filters.tools.map((tool) => /* @__PURE__ */ jsxRuntime.jsx(
105
+ CheckRow,
106
+ {
107
+ label: tool.label,
108
+ checked: !hiddenTools.has(tool.key),
109
+ onToggle: () => onToggleTool(tool.key)
110
+ },
111
+ tool.key
112
+ )) }),
113
+ filters.sources.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(Section, { heading: "Source", children: filters.sources.map((source) => /* @__PURE__ */ jsxRuntime.jsx(
114
+ CheckRow,
115
+ {
116
+ label: source,
117
+ checked: !hiddenSources.has(source),
118
+ onToggle: () => onToggleSource(source)
119
+ },
120
+ source
121
+ )) }),
122
+ hasThinking && /* @__PURE__ */ jsxRuntime.jsx(Section, { heading: "Other", children: /* @__PURE__ */ jsxRuntime.jsx(CheckRow, { label: "Reasoning", checked: showThinking, onToggle: onToggleThinking }) })
123
+ ] })
124
+ }
125
+ );
126
+ }
127
+ function MenuHeading({ children }) {
128
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1.5 text-xs font-medium text-muted-foreground", children });
129
+ }
130
+ function Section({ heading, children }) {
131
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1 border-t border-border pt-1", children: [
132
+ /* @__PURE__ */ jsxRuntime.jsx(MenuHeading, { children: heading }),
133
+ children
134
+ ] });
135
+ }
136
+ const ROW_CLASS = "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none";
137
+ function RadioRow({
138
+ icon,
139
+ label,
140
+ active,
141
+ onSelect
142
+ }) {
143
+ return /* @__PURE__ */ jsxRuntime.jsxs(
144
+ "button",
145
+ {
146
+ type: "button",
147
+ role: "menuitemradio",
148
+ "aria-checked": active,
149
+ className: utils.cn(ROW_CLASS, active && "text-foreground"),
150
+ onClick: onSelect,
151
+ children: [
152
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon, className: "text-sm text-muted-foreground" }),
153
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: label }),
154
+ active ? /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck, className: "text-sm text-foreground" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block h-4 w-4", "aria-hidden": true })
155
+ ]
156
+ }
157
+ );
158
+ }
159
+ function CheckRow({
160
+ label,
161
+ checked,
162
+ onToggle
163
+ }) {
164
+ return /* @__PURE__ */ jsxRuntime.jsxs(
165
+ "button",
166
+ {
167
+ type: "button",
168
+ role: "menuitemcheckbox",
169
+ "aria-checked": checked,
170
+ className: utils.cn(ROW_CLASS, !checked && "text-muted-foreground"),
171
+ onClick: onToggle,
172
+ children: [
173
+ /* @__PURE__ */ jsxRuntime.jsx(
174
+ "span",
175
+ {
176
+ "aria-hidden": true,
177
+ className: utils.cn(
178
+ "flex h-4 w-4 shrink-0 items-center justify-center rounded border",
179
+ checked ? "border-primary bg-primary text-primary-foreground" : "border-input"
180
+ ),
181
+ children: checked && /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck, className: "text-[0.7rem]" })
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: label })
185
+ ]
186
+ }
187
+ );
188
+ }
189
+ exports.SessionViewerMenu = SessionViewerMenu;
190
+ //# sourceMappingURL=SessionViewerMenu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionViewerMenu.cjs","sources":["../../../src/data/ai/SessionViewerMenu.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiCheck,\n UiDesktop,\n UiDotsVertical,\n UiListDashes,\n UiListFlat,\n UiMoon,\n UiResizeVertical,\n UiRows,\n UiSun,\n} from \"../../icons\";\nimport { type Density } from \"../../hooks/use-density\";\nimport { CATEGORY_LABELS, type SessionCategory, type SessionFilters } from \"./session-categories\";\n\nexport type SessionThemeOverride = \"light\" | \"dark\";\n\nconst DENSITY_OPTIONS: Array<{ value: Density; icon: StaticIconComponent; label: string }> = [\n { value: \"compact\", icon: UiRows, label: \"Compact\" },\n { value: \"comfortable\", icon: UiListFlat, label: \"Comfortable\" },\n { value: \"spacious\", icon: UiListDashes, label: \"Spacious\" },\n];\n\nconst THEME_OPTIONS: Array<{ value: SessionThemeOverride; icon: StaticIconComponent; label: string }> = [\n { value: \"light\", icon: UiSun, label: \"Light\" },\n { value: \"dark\", icon: UiMoon, label: \"Dark\" },\n];\n\nexport interface SessionViewerMenuProps {\n density: Density | undefined;\n onDensityChange: (density: Density | undefined) => void;\n theme: SessionThemeOverride | undefined;\n onThemeChange: (theme: SessionThemeOverride | undefined) => void;\n filters: SessionFilters;\n hiddenCategories: ReadonlySet<SessionCategory>;\n hiddenTools: ReadonlySet<string>;\n hiddenSources: ReadonlySet<string>;\n onToggleCategory: (category: SessionCategory) => void;\n onToggleTool: (tool: string) => void;\n onToggleSource: (source: string) => void;\n showThinking: boolean;\n onToggleThinking: () => void;\n hasThinking: boolean;\n}\n\n/** The SessionViewer's \"3-dot\" menu: a density override (matching DataTable's\n * pattern) plus visibility toggles for the captain category / tool / source\n * facets present in the session. */\nexport function SessionViewerMenu({\n density,\n onDensityChange,\n theme,\n onThemeChange,\n filters,\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n onToggleCategory,\n onToggleTool,\n onToggleSource,\n showThinking,\n onToggleThinking,\n hasThinking,\n}: SessionViewerMenuProps) {\n return (\n <DropdownMenu\n icon={UiDotsVertical}\n hideChevron\n variant=\"ghost\"\n size=\"icon\"\n align=\"right\"\n title=\"Session options\"\n menuLabel=\"Session options\"\n menuClassName=\"min-w-[14rem] max-h-[70vh] overflow-auto px-1\"\n >\n {() => (\n <div className=\"text-popover-foreground\">\n <MenuHeading>Density</MenuHeading>\n <RadioRow\n icon={UiResizeVertical}\n label=\"Use page density\"\n active={density === undefined}\n onSelect={() => onDensityChange(undefined)}\n />\n {DENSITY_OPTIONS.map((option) => (\n <RadioRow\n key={option.value}\n icon={option.icon}\n label={option.label}\n active={density === option.value}\n onSelect={() => onDensityChange(option.value)}\n />\n ))}\n\n <Section heading=\"Theme\">\n <RadioRow\n icon={UiDesktop}\n label=\"Use page theme\"\n active={theme === undefined}\n onSelect={() => onThemeChange(undefined)}\n />\n {THEME_OPTIONS.map((option) => (\n <RadioRow\n key={option.value}\n icon={option.icon}\n label={option.label}\n active={theme === option.value}\n onSelect={() => onThemeChange(option.value)}\n />\n ))}\n </Section>\n\n {filters.categories.length > 0 && (\n <Section heading=\"Categories\">\n {filters.categories.map((category) => (\n <CheckRow\n key={category}\n label={CATEGORY_LABELS[category]}\n checked={!hiddenCategories.has(category)}\n onToggle={() => onToggleCategory(category)}\n />\n ))}\n </Section>\n )}\n\n {filters.tools.length > 0 && (\n <Section heading=\"Tools\">\n {filters.tools.map((tool) => (\n <CheckRow\n key={tool.key}\n label={tool.label}\n checked={!hiddenTools.has(tool.key)}\n onToggle={() => onToggleTool(tool.key)}\n />\n ))}\n </Section>\n )}\n\n {filters.sources.length > 1 && (\n <Section heading=\"Source\">\n {filters.sources.map((source) => (\n <CheckRow\n key={source}\n label={source}\n checked={!hiddenSources.has(source)}\n onToggle={() => onToggleSource(source)}\n />\n ))}\n </Section>\n )}\n\n {hasThinking && (\n <Section heading=\"Other\">\n <CheckRow label=\"Reasoning\" checked={showThinking} onToggle={onToggleThinking} />\n </Section>\n )}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction MenuHeading({ children }: { children: ReactNode }) {\n return <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">{children}</div>;\n}\n\nfunction Section({ heading, children }: { heading: string; children: ReactNode }) {\n return (\n <div className=\"mt-1 border-t border-border pt-1\">\n <MenuHeading>{heading}</MenuHeading>\n {children}\n </div>\n );\n}\n\nconst ROW_CLASS =\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\";\n\nfunction RadioRow({\n icon,\n label,\n active,\n onSelect,\n}: {\n icon: StaticIconComponent;\n label: string;\n active: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(ROW_CLASS, active && \"text-foreground\")}\n onClick={onSelect}\n >\n <Icon icon={icon} className=\"text-sm text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n}\n\nfunction CheckRow({\n label,\n checked,\n onToggle,\n}: {\n label: string;\n checked: boolean;\n onToggle: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n className={cn(ROW_CLASS, !checked && \"text-muted-foreground\")}\n onClick={onToggle}\n >\n <span\n aria-hidden\n className={cn(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n checked ? \"border-primary bg-primary text-primary-foreground\" : \"border-input\",\n )}\n >\n {checked && <Icon icon={UiCheck} className=\"text-[0.7rem]\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n"],"names":["UiRows","UiListFlat","UiListDashes","UiSun","UiMoon","jsx","DropdownMenu","UiDotsVertical","jsxs","UiResizeVertical","UiDesktop","CATEGORY_LABELS","cn","Icon","UiCheck"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Density } from '../../hooks/use-density';
2
+ import { SessionCategory, SessionFilters } from './session-categories';
3
+ export type SessionThemeOverride = "light" | "dark";
4
+ export interface SessionViewerMenuProps {
5
+ density: Density | undefined;
6
+ onDensityChange: (density: Density | undefined) => void;
7
+ theme: SessionThemeOverride | undefined;
8
+ onThemeChange: (theme: SessionThemeOverride | undefined) => void;
9
+ filters: SessionFilters;
10
+ hiddenCategories: ReadonlySet<SessionCategory>;
11
+ hiddenTools: ReadonlySet<string>;
12
+ hiddenSources: ReadonlySet<string>;
13
+ onToggleCategory: (category: SessionCategory) => void;
14
+ onToggleTool: (tool: string) => void;
15
+ onToggleSource: (source: string) => void;
16
+ showThinking: boolean;
17
+ onToggleThinking: () => void;
18
+ hasThinking: boolean;
19
+ }
20
+ /** The SessionViewer's "3-dot" menu: a density override (matching DataTable's
21
+ * pattern) plus visibility toggles for the captain category / tool / source
22
+ * facets present in the session. */
23
+ export declare function SessionViewerMenu({ density, onDensityChange, theme, onThemeChange, filters, hiddenCategories, hiddenTools, hiddenSources, onToggleCategory, onToggleTool, onToggleSource, showThinking, onToggleThinking, hasThinking, }: SessionViewerMenuProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=SessionViewerMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionViewerMenu.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewerMenu.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAElG,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,CAAC;AAapD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IACxD,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACxC,aAAa,EAAE,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,KAAK,IAAI,CAAC;IACjE,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;IAC/C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;qCAEqC;AACrC,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,eAAe,EACf,KAAK,EACL,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,WAAW,GACZ,EAAE,sBAAsB,2CAiGxB"}
@@ -0,0 +1,190 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { DropdownMenu } from "../../overlay/DropdownMenu.js";
4
+ import { Icon } from "../Icon.js";
5
+ import { CATEGORY_LABELS } from "./session-categories.js";
6
+ import { UiDotsVertical } from "../../icons/components/UiDotsVertical.js";
7
+ import { UiResizeVertical } from "../../icons/components/UiResizeVertical.js";
8
+ import { UiRows } from "../../icons/components/UiRows.js";
9
+ import { UiListFlat } from "../../icons/components/UiListFlat.js";
10
+ import { UiListDashes } from "../../icons/components/UiListDashes.js";
11
+ import { UiDesktop } from "../../icons/components/UiDesktop.js";
12
+ import { UiSun } from "../../icons/components/UiSun.js";
13
+ import { UiMoon } from "../../icons/components/UiMoon.js";
14
+ import { UiCheck } from "../../icons/components/UiCheck.js";
15
+ const DENSITY_OPTIONS = [
16
+ { value: "compact", icon: UiRows, label: "Compact" },
17
+ { value: "comfortable", icon: UiListFlat, label: "Comfortable" },
18
+ { value: "spacious", icon: UiListDashes, label: "Spacious" }
19
+ ];
20
+ const THEME_OPTIONS = [
21
+ { value: "light", icon: UiSun, label: "Light" },
22
+ { value: "dark", icon: UiMoon, label: "Dark" }
23
+ ];
24
+ function SessionViewerMenu({
25
+ density,
26
+ onDensityChange,
27
+ theme,
28
+ onThemeChange,
29
+ filters,
30
+ hiddenCategories,
31
+ hiddenTools,
32
+ hiddenSources,
33
+ onToggleCategory,
34
+ onToggleTool,
35
+ onToggleSource,
36
+ showThinking,
37
+ onToggleThinking,
38
+ hasThinking
39
+ }) {
40
+ return /* @__PURE__ */ jsx(
41
+ DropdownMenu,
42
+ {
43
+ icon: UiDotsVertical,
44
+ hideChevron: true,
45
+ variant: "ghost",
46
+ size: "icon",
47
+ align: "right",
48
+ title: "Session options",
49
+ menuLabel: "Session options",
50
+ menuClassName: "min-w-[14rem] max-h-[70vh] overflow-auto px-1",
51
+ children: () => /* @__PURE__ */ jsxs("div", { className: "text-popover-foreground", children: [
52
+ /* @__PURE__ */ jsx(MenuHeading, { children: "Density" }),
53
+ /* @__PURE__ */ jsx(
54
+ RadioRow,
55
+ {
56
+ icon: UiResizeVertical,
57
+ label: "Use page density",
58
+ active: density === void 0,
59
+ onSelect: () => onDensityChange(void 0)
60
+ }
61
+ ),
62
+ DENSITY_OPTIONS.map((option) => /* @__PURE__ */ jsx(
63
+ RadioRow,
64
+ {
65
+ icon: option.icon,
66
+ label: option.label,
67
+ active: density === option.value,
68
+ onSelect: () => onDensityChange(option.value)
69
+ },
70
+ option.value
71
+ )),
72
+ /* @__PURE__ */ jsxs(Section, { heading: "Theme", children: [
73
+ /* @__PURE__ */ jsx(
74
+ RadioRow,
75
+ {
76
+ icon: UiDesktop,
77
+ label: "Use page theme",
78
+ active: theme === void 0,
79
+ onSelect: () => onThemeChange(void 0)
80
+ }
81
+ ),
82
+ THEME_OPTIONS.map((option) => /* @__PURE__ */ jsx(
83
+ RadioRow,
84
+ {
85
+ icon: option.icon,
86
+ label: option.label,
87
+ active: theme === option.value,
88
+ onSelect: () => onThemeChange(option.value)
89
+ },
90
+ option.value
91
+ ))
92
+ ] }),
93
+ filters.categories.length > 0 && /* @__PURE__ */ jsx(Section, { heading: "Categories", children: filters.categories.map((category) => /* @__PURE__ */ jsx(
94
+ CheckRow,
95
+ {
96
+ label: CATEGORY_LABELS[category],
97
+ checked: !hiddenCategories.has(category),
98
+ onToggle: () => onToggleCategory(category)
99
+ },
100
+ category
101
+ )) }),
102
+ filters.tools.length > 0 && /* @__PURE__ */ jsx(Section, { heading: "Tools", children: filters.tools.map((tool) => /* @__PURE__ */ jsx(
103
+ CheckRow,
104
+ {
105
+ label: tool.label,
106
+ checked: !hiddenTools.has(tool.key),
107
+ onToggle: () => onToggleTool(tool.key)
108
+ },
109
+ tool.key
110
+ )) }),
111
+ filters.sources.length > 1 && /* @__PURE__ */ jsx(Section, { heading: "Source", children: filters.sources.map((source) => /* @__PURE__ */ jsx(
112
+ CheckRow,
113
+ {
114
+ label: source,
115
+ checked: !hiddenSources.has(source),
116
+ onToggle: () => onToggleSource(source)
117
+ },
118
+ source
119
+ )) }),
120
+ hasThinking && /* @__PURE__ */ jsx(Section, { heading: "Other", children: /* @__PURE__ */ jsx(CheckRow, { label: "Reasoning", checked: showThinking, onToggle: onToggleThinking }) })
121
+ ] })
122
+ }
123
+ );
124
+ }
125
+ function MenuHeading({ children }) {
126
+ return /* @__PURE__ */ jsx("div", { className: "px-2 py-1.5 text-xs font-medium text-muted-foreground", children });
127
+ }
128
+ function Section({ heading, children }) {
129
+ return /* @__PURE__ */ jsxs("div", { className: "mt-1 border-t border-border pt-1", children: [
130
+ /* @__PURE__ */ jsx(MenuHeading, { children: heading }),
131
+ children
132
+ ] });
133
+ }
134
+ const ROW_CLASS = "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none";
135
+ function RadioRow({
136
+ icon,
137
+ label,
138
+ active,
139
+ onSelect
140
+ }) {
141
+ return /* @__PURE__ */ jsxs(
142
+ "button",
143
+ {
144
+ type: "button",
145
+ role: "menuitemradio",
146
+ "aria-checked": active,
147
+ className: cn(ROW_CLASS, active && "text-foreground"),
148
+ onClick: onSelect,
149
+ children: [
150
+ /* @__PURE__ */ jsx(Icon, { icon, className: "text-sm text-muted-foreground" }),
151
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: label }),
152
+ active ? /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "text-sm text-foreground" }) : /* @__PURE__ */ jsx("span", { className: "inline-block h-4 w-4", "aria-hidden": true })
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ function CheckRow({
158
+ label,
159
+ checked,
160
+ onToggle
161
+ }) {
162
+ return /* @__PURE__ */ jsxs(
163
+ "button",
164
+ {
165
+ type: "button",
166
+ role: "menuitemcheckbox",
167
+ "aria-checked": checked,
168
+ className: cn(ROW_CLASS, !checked && "text-muted-foreground"),
169
+ onClick: onToggle,
170
+ children: [
171
+ /* @__PURE__ */ jsx(
172
+ "span",
173
+ {
174
+ "aria-hidden": true,
175
+ className: cn(
176
+ "flex h-4 w-4 shrink-0 items-center justify-center rounded border",
177
+ checked ? "border-primary bg-primary text-primary-foreground" : "border-input"
178
+ ),
179
+ children: checked && /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "text-[0.7rem]" })
180
+ }
181
+ ),
182
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: label })
183
+ ]
184
+ }
185
+ );
186
+ }
187
+ export {
188
+ SessionViewerMenu
189
+ };
190
+ //# sourceMappingURL=SessionViewerMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionViewerMenu.js","sources":["../../../src/data/ai/SessionViewerMenu.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiCheck,\n UiDesktop,\n UiDotsVertical,\n UiListDashes,\n UiListFlat,\n UiMoon,\n UiResizeVertical,\n UiRows,\n UiSun,\n} from \"../../icons\";\nimport { type Density } from \"../../hooks/use-density\";\nimport { CATEGORY_LABELS, type SessionCategory, type SessionFilters } from \"./session-categories\";\n\nexport type SessionThemeOverride = \"light\" | \"dark\";\n\nconst DENSITY_OPTIONS: Array<{ value: Density; icon: StaticIconComponent; label: string }> = [\n { value: \"compact\", icon: UiRows, label: \"Compact\" },\n { value: \"comfortable\", icon: UiListFlat, label: \"Comfortable\" },\n { value: \"spacious\", icon: UiListDashes, label: \"Spacious\" },\n];\n\nconst THEME_OPTIONS: Array<{ value: SessionThemeOverride; icon: StaticIconComponent; label: string }> = [\n { value: \"light\", icon: UiSun, label: \"Light\" },\n { value: \"dark\", icon: UiMoon, label: \"Dark\" },\n];\n\nexport interface SessionViewerMenuProps {\n density: Density | undefined;\n onDensityChange: (density: Density | undefined) => void;\n theme: SessionThemeOverride | undefined;\n onThemeChange: (theme: SessionThemeOverride | undefined) => void;\n filters: SessionFilters;\n hiddenCategories: ReadonlySet<SessionCategory>;\n hiddenTools: ReadonlySet<string>;\n hiddenSources: ReadonlySet<string>;\n onToggleCategory: (category: SessionCategory) => void;\n onToggleTool: (tool: string) => void;\n onToggleSource: (source: string) => void;\n showThinking: boolean;\n onToggleThinking: () => void;\n hasThinking: boolean;\n}\n\n/** The SessionViewer's \"3-dot\" menu: a density override (matching DataTable's\n * pattern) plus visibility toggles for the captain category / tool / source\n * facets present in the session. */\nexport function SessionViewerMenu({\n density,\n onDensityChange,\n theme,\n onThemeChange,\n filters,\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n onToggleCategory,\n onToggleTool,\n onToggleSource,\n showThinking,\n onToggleThinking,\n hasThinking,\n}: SessionViewerMenuProps) {\n return (\n <DropdownMenu\n icon={UiDotsVertical}\n hideChevron\n variant=\"ghost\"\n size=\"icon\"\n align=\"right\"\n title=\"Session options\"\n menuLabel=\"Session options\"\n menuClassName=\"min-w-[14rem] max-h-[70vh] overflow-auto px-1\"\n >\n {() => (\n <div className=\"text-popover-foreground\">\n <MenuHeading>Density</MenuHeading>\n <RadioRow\n icon={UiResizeVertical}\n label=\"Use page density\"\n active={density === undefined}\n onSelect={() => onDensityChange(undefined)}\n />\n {DENSITY_OPTIONS.map((option) => (\n <RadioRow\n key={option.value}\n icon={option.icon}\n label={option.label}\n active={density === option.value}\n onSelect={() => onDensityChange(option.value)}\n />\n ))}\n\n <Section heading=\"Theme\">\n <RadioRow\n icon={UiDesktop}\n label=\"Use page theme\"\n active={theme === undefined}\n onSelect={() => onThemeChange(undefined)}\n />\n {THEME_OPTIONS.map((option) => (\n <RadioRow\n key={option.value}\n icon={option.icon}\n label={option.label}\n active={theme === option.value}\n onSelect={() => onThemeChange(option.value)}\n />\n ))}\n </Section>\n\n {filters.categories.length > 0 && (\n <Section heading=\"Categories\">\n {filters.categories.map((category) => (\n <CheckRow\n key={category}\n label={CATEGORY_LABELS[category]}\n checked={!hiddenCategories.has(category)}\n onToggle={() => onToggleCategory(category)}\n />\n ))}\n </Section>\n )}\n\n {filters.tools.length > 0 && (\n <Section heading=\"Tools\">\n {filters.tools.map((tool) => (\n <CheckRow\n key={tool.key}\n label={tool.label}\n checked={!hiddenTools.has(tool.key)}\n onToggle={() => onToggleTool(tool.key)}\n />\n ))}\n </Section>\n )}\n\n {filters.sources.length > 1 && (\n <Section heading=\"Source\">\n {filters.sources.map((source) => (\n <CheckRow\n key={source}\n label={source}\n checked={!hiddenSources.has(source)}\n onToggle={() => onToggleSource(source)}\n />\n ))}\n </Section>\n )}\n\n {hasThinking && (\n <Section heading=\"Other\">\n <CheckRow label=\"Reasoning\" checked={showThinking} onToggle={onToggleThinking} />\n </Section>\n )}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction MenuHeading({ children }: { children: ReactNode }) {\n return <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">{children}</div>;\n}\n\nfunction Section({ heading, children }: { heading: string; children: ReactNode }) {\n return (\n <div className=\"mt-1 border-t border-border pt-1\">\n <MenuHeading>{heading}</MenuHeading>\n {children}\n </div>\n );\n}\n\nconst ROW_CLASS =\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\";\n\nfunction RadioRow({\n icon,\n label,\n active,\n onSelect,\n}: {\n icon: StaticIconComponent;\n label: string;\n active: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(ROW_CLASS, active && \"text-foreground\")}\n onClick={onSelect}\n >\n <Icon icon={icon} className=\"text-sm text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n}\n\nfunction CheckRow({\n label,\n checked,\n onToggle,\n}: {\n label: string;\n checked: boolean;\n onToggle: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n className={cn(ROW_CLASS, !checked && \"text-muted-foreground\")}\n onClick={onToggle}\n >\n <span\n aria-hidden\n className={cn(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n checked ? \"border-primary bg-primary text-primary-foreground\" : \"border-input\",\n )}\n >\n {checked && <Icon icon={UiCheck} className=\"text-[0.7rem]\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n"],"names":[],"mappings":"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"}