agim-cli 1.2.1 → 1.2.17

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 (199) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +18 -5
  3. package/README.zh-CN.md +20 -7
  4. package/dist/cli-ui/entry-menu.d.ts +2 -0
  5. package/dist/cli-ui/entry-menu.d.ts.map +1 -1
  6. package/dist/cli-ui/entry-menu.js +1 -0
  7. package/dist/cli-ui/entry-menu.js.map +1 -1
  8. package/dist/cli-ui/i18n.d.ts +5 -0
  9. package/dist/cli-ui/i18n.d.ts.map +1 -1
  10. package/dist/cli-ui/i18n.js +10 -0
  11. package/dist/cli-ui/i18n.js.map +1 -1
  12. package/dist/cli.js +117 -0
  13. package/dist/cli.js.map +1 -1
  14. package/dist/core/admin-bootstrap.d.ts +14 -0
  15. package/dist/core/admin-bootstrap.d.ts.map +1 -1
  16. package/dist/core/admin-bootstrap.js +21 -0
  17. package/dist/core/admin-bootstrap.js.map +1 -1
  18. package/dist/core/commands/builtin.d.ts.map +1 -1
  19. package/dist/core/commands/builtin.js +2 -0
  20. package/dist/core/commands/builtin.js.map +1 -1
  21. package/dist/core/commands/router.js +1 -1
  22. package/dist/core/commands/router.js.map +1 -1
  23. package/dist/core/commands/web.d.ts +3 -0
  24. package/dist/core/commands/web.d.ts.map +1 -0
  25. package/dist/core/commands/web.js +28 -0
  26. package/dist/core/commands/web.js.map +1 -0
  27. package/dist/core/intent.d.ts +11 -2
  28. package/dist/core/intent.d.ts.map +1 -1
  29. package/dist/core/intent.js +26 -4
  30. package/dist/core/intent.js.map +1 -1
  31. package/dist/core/memory.js.map +1 -1
  32. package/dist/core/render-router.d.ts.map +1 -1
  33. package/dist/core/render-router.js +3 -2
  34. package/dist/core/render-router.js.map +1 -1
  35. package/dist/core/router.d.ts.map +1 -1
  36. package/dist/core/router.js +8 -1
  37. package/dist/core/router.js.map +1 -1
  38. package/dist/core/types.d.ts +3 -0
  39. package/dist/core/types.d.ts.map +1 -1
  40. package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -1
  41. package/dist/plugins/agents/acp/acp-client.js +7 -0
  42. package/dist/plugins/agents/acp/acp-client.js.map +1 -1
  43. package/dist/plugins/agents/acp/discovery.d.ts.map +1 -1
  44. package/dist/plugins/agents/acp/discovery.js +4 -0
  45. package/dist/plugins/agents/acp/discovery.js.map +1 -1
  46. package/dist/plugins/agents/acp/url-guard.d.ts +44 -0
  47. package/dist/plugins/agents/acp/url-guard.d.ts.map +1 -0
  48. package/dist/plugins/agents/acp/url-guard.js +109 -0
  49. package/dist/plugins/agents/acp/url-guard.js.map +1 -0
  50. package/dist/web/env-mask.d.ts +21 -0
  51. package/dist/web/env-mask.d.ts.map +1 -0
  52. package/dist/web/env-mask.js +44 -0
  53. package/dist/web/env-mask.js.map +1 -0
  54. package/dist/web/public/assets/a2a-Dk2fSs33.js +7 -0
  55. package/dist/web/public/assets/a2a-Dk2fSs33.js.map +1 -0
  56. package/dist/web/public/assets/activity-eiIPshcV.js +7 -0
  57. package/dist/web/public/assets/activity-eiIPshcV.js.map +1 -0
  58. package/dist/web/public/assets/admins-DlbQYdW_.js +12 -0
  59. package/dist/web/public/assets/admins-DlbQYdW_.js.map +1 -0
  60. package/dist/web/public/assets/agents-BMI1WbZj.js +12 -0
  61. package/dist/web/public/assets/agents-BMI1WbZj.js.map +1 -0
  62. package/dist/web/public/assets/approvals-DlXS_sKD.js +10 -0
  63. package/dist/web/public/assets/approvals-DlXS_sKD.js.map +1 -0
  64. package/dist/web/public/assets/audit-C8I8xC_6.js +2 -0
  65. package/dist/web/public/assets/audit-C8I8xC_6.js.map +1 -0
  66. package/dist/web/public/assets/bgjobs-PFYinH7D.js +7 -0
  67. package/dist/web/public/assets/bgjobs-PFYinH7D.js.map +1 -0
  68. package/dist/web/public/assets/brain-DEEJttEL.js +7 -0
  69. package/dist/web/public/assets/brain-DEEJttEL.js.map +1 -0
  70. package/dist/web/public/assets/briefcase-BlMy8gI6.js +7 -0
  71. package/dist/web/public/assets/briefcase-BlMy8gI6.js.map +1 -0
  72. package/dist/web/public/assets/browser-ponyfill-BOcGq8h9.js +3 -0
  73. package/dist/web/public/assets/browser-ponyfill-BOcGq8h9.js.map +1 -0
  74. package/dist/web/public/assets/chevron-right-DmABPvoA.js +7 -0
  75. package/dist/web/public/assets/chevron-right-DmABPvoA.js.map +1 -0
  76. package/dist/web/public/assets/circle-check-C0Qpg1vL.js +7 -0
  77. package/dist/web/public/assets/circle-check-C0Qpg1vL.js.map +1 -0
  78. package/dist/web/public/assets/circle-check-big-C8LG3beV.js +7 -0
  79. package/dist/web/public/assets/circle-check-big-C8LG3beV.js.map +1 -0
  80. package/dist/web/public/assets/circle-x-D_cRHcHK.js +7 -0
  81. package/dist/web/public/assets/circle-x-D_cRHcHK.js.map +1 -0
  82. package/dist/web/public/assets/confirm-dialog-Baz_xFle.js +2 -0
  83. package/dist/web/public/assets/confirm-dialog-Baz_xFle.js.map +1 -0
  84. package/dist/web/public/assets/data-table--I_ktDF4.js +17 -0
  85. package/dist/web/public/assets/data-table--I_ktDF4.js.map +1 -0
  86. package/dist/web/public/assets/dialog-DZpoEskO.js +6 -0
  87. package/dist/web/public/assets/dialog-DZpoEskO.js.map +1 -0
  88. package/dist/web/public/assets/download-DbFGHwZ5.js +7 -0
  89. package/dist/web/public/assets/download-DbFGHwZ5.js.map +1 -0
  90. package/dist/web/public/assets/email-BB1Hq8eE.js +7 -0
  91. package/dist/web/public/assets/email-BB1Hq8eE.js.map +1 -0
  92. package/dist/web/public/assets/empty-state-DXNa90pP.js +2 -0
  93. package/dist/web/public/assets/empty-state-DXNa90pP.js.map +1 -0
  94. package/dist/web/public/assets/env-Bqrb9XkC.js +2 -0
  95. package/dist/web/public/assets/env-Bqrb9XkC.js.map +1 -0
  96. package/dist/web/public/assets/external-link-nhnJN0qg.js +7 -0
  97. package/dist/web/public/assets/external-link-nhnJN0qg.js.map +1 -0
  98. package/dist/web/public/assets/eye-IKkn_oUo.js +12 -0
  99. package/dist/web/public/assets/eye-IKkn_oUo.js.map +1 -0
  100. package/dist/web/public/assets/facts-C7Qy9vTw.js +2 -0
  101. package/dist/web/public/assets/facts-C7Qy9vTw.js.map +1 -0
  102. package/dist/web/public/assets/health-CMRdeNEW.js +2 -0
  103. package/dist/web/public/assets/health-CMRdeNEW.js.map +1 -0
  104. package/dist/web/public/assets/hot-Bh5Nrc7i.js +17 -0
  105. package/dist/web/public/assets/hot-Bh5Nrc7i.js.map +1 -0
  106. package/dist/web/public/assets/index-CpGWCLE5.js +166 -0
  107. package/dist/web/public/assets/index-CpGWCLE5.js.map +1 -0
  108. package/dist/web/public/assets/index-GpceOxum.css +1 -0
  109. package/dist/web/public/assets/installed-FYLkPij2.js +7 -0
  110. package/dist/web/public/assets/installed-FYLkPij2.js.map +1 -0
  111. package/dist/web/public/assets/jobs-BmqLUzHp.js +2 -0
  112. package/dist/web/public/assets/jobs-BmqLUzHp.js.map +1 -0
  113. package/dist/web/public/assets/layout-9Gp_myEd.js +2 -0
  114. package/dist/web/public/assets/layout-9Gp_myEd.js.map +1 -0
  115. package/dist/web/public/assets/layout-BZaHqf69.js +2 -0
  116. package/dist/web/public/assets/layout-BZaHqf69.js.map +1 -0
  117. package/dist/web/public/assets/layout-CXsUyEpG.js +2 -0
  118. package/dist/web/public/assets/layout-CXsUyEpG.js.map +1 -0
  119. package/dist/web/public/assets/layout-DFxtpNut.js +2 -0
  120. package/dist/web/public/assets/layout-DFxtpNut.js.map +1 -0
  121. package/dist/web/public/assets/layout-d8qxPKQk.js +2 -0
  122. package/dist/web/public/assets/layout-d8qxPKQk.js.map +1 -0
  123. package/dist/web/public/assets/loader-circle-JaKY-xMt.js +7 -0
  124. package/dist/web/public/assets/loader-circle-JaKY-xMt.js.map +1 -0
  125. package/dist/web/public/assets/map-pin-hFFSWZ3B.js +7 -0
  126. package/dist/web/public/assets/map-pin-hFFSWZ3B.js.map +1 -0
  127. package/dist/web/public/assets/memos-EhjMUvVZ.js +12 -0
  128. package/dist/web/public/assets/memos-EhjMUvVZ.js.map +1 -0
  129. package/dist/web/public/assets/messengers-BRV1IVGX.js +7 -0
  130. package/dist/web/public/assets/messengers-BRV1IVGX.js.map +1 -0
  131. package/dist/web/public/assets/network-DtCI2ZUU.js +7 -0
  132. package/dist/web/public/assets/network-DtCI2ZUU.js.map +1 -0
  133. package/dist/web/public/assets/outbox-CxUbMp6o.js +7 -0
  134. package/dist/web/public/assets/outbox-CxUbMp6o.js.map +1 -0
  135. package/dist/web/public/assets/pagination-CkZY8YNa.js +17 -0
  136. package/dist/web/public/assets/pagination-CkZY8YNa.js.map +1 -0
  137. package/dist/web/public/assets/persona-B6TFMSnI.js +2 -0
  138. package/dist/web/public/assets/persona-B6TFMSnI.js.map +1 -0
  139. package/dist/web/public/assets/play-BxRcWaH5.js +7 -0
  140. package/dist/web/public/assets/play-BxRcWaH5.js.map +1 -0
  141. package/dist/web/public/assets/policy-ndE1Y8zD.js +2 -0
  142. package/dist/web/public/assets/policy-ndE1Y8zD.js.map +1 -0
  143. package/dist/web/public/assets/react-C9F3QeMB.js +33 -0
  144. package/dist/web/public/assets/react-C9F3QeMB.js.map +1 -0
  145. package/dist/web/public/assets/refresh-ccw-Bx817_KW.js +7 -0
  146. package/dist/web/public/assets/refresh-ccw-Bx817_KW.js.map +1 -0
  147. package/dist/web/public/assets/reminders-XynkGQc5.js +17 -0
  148. package/dist/web/public/assets/reminders-XynkGQc5.js.map +1 -0
  149. package/dist/web/public/assets/save-CqMcATrh.js +7 -0
  150. package/dist/web/public/assets/save-CqMcATrh.js.map +1 -0
  151. package/dist/web/public/assets/schedules-VM02w_Om.js +7 -0
  152. package/dist/web/public/assets/schedules-VM02w_Om.js.map +1 -0
  153. package/dist/web/public/assets/search-Ba-e1t1P.js +7 -0
  154. package/dist/web/public/assets/search-Ba-e1t1P.js.map +1 -0
  155. package/dist/web/public/assets/service-C-wnwJ-b.js +7 -0
  156. package/dist/web/public/assets/service-C-wnwJ-b.js.map +1 -0
  157. package/dist/web/public/assets/status-badge-CsdJ6k8Q.js +2 -0
  158. package/dist/web/public/assets/status-badge-CsdJ6k8Q.js.map +1 -0
  159. package/dist/web/public/assets/subtasks-mGRKpF0G.js +7 -0
  160. package/dist/web/public/assets/subtasks-mGRKpF0G.js.map +1 -0
  161. package/dist/web/public/assets/table-vmLMgj6_.js +2 -0
  162. package/dist/web/public/assets/table-vmLMgj6_.js.map +1 -0
  163. package/dist/web/public/assets/topn-nu66Fotx.js +7 -0
  164. package/dist/web/public/assets/topn-nu66Fotx.js.map +1 -0
  165. package/dist/web/public/assets/trash-2-ZIitN_U3.js +7 -0
  166. package/dist/web/public/assets/trash-2-ZIitN_U3.js.map +1 -0
  167. package/dist/web/public/assets/use-event-stream-BGeFcayX.js +2 -0
  168. package/dist/web/public/assets/use-event-stream-BGeFcayX.js.map +1 -0
  169. package/dist/web/public/assets/use-memory-DgEqHEca.js +2 -0
  170. package/dist/web/public/assets/use-memory-DgEqHEca.js.map +1 -0
  171. package/dist/web/public/assets/use-observability-CQev_A8e.js +2 -0
  172. package/dist/web/public/assets/use-observability-CQev_A8e.js.map +1 -0
  173. package/dist/web/public/assets/use-settings-CU-UcrVD.js +2 -0
  174. package/dist/web/public/assets/use-settings-CU-UcrVD.js.map +1 -0
  175. package/dist/web/public/assets/use-skills-Dr77CXLA.js +2 -0
  176. package/dist/web/public/assets/use-skills-Dr77CXLA.js.map +1 -0
  177. package/dist/web/public/assets/use-workspace-PNv9Z4de.js +2 -0
  178. package/dist/web/public/assets/use-workspace-PNv9Z4de.js.map +1 -0
  179. package/dist/web/public/assets/useQuery-BTyugXYV.js +2 -0
  180. package/dist/web/public/assets/useQuery-BTyugXYV.js.map +1 -0
  181. package/dist/web/public/assets/vector-w-Ea3pg6.js +2 -0
  182. package/dist/web/public/assets/vector-w-Ea3pg6.js.map +1 -0
  183. package/dist/web/public/assets/viewer-DKA7QP9U.js +12 -0
  184. package/dist/web/public/assets/viewer-DKA7QP9U.js.map +1 -0
  185. package/dist/web/public/assets/workspace-DVLZca7t.js +17 -0
  186. package/dist/web/public/assets/workspace-DVLZca7t.js.map +1 -0
  187. package/dist/web/public/assets/workspaces-DYZsMmY-.js +7 -0
  188. package/dist/web/public/assets/workspaces-DYZsMmY-.js.map +1 -0
  189. package/dist/web/public/assets/x-Ru3rHT82.js +7 -0
  190. package/dist/web/public/assets/x-Ru3rHT82.js.map +1 -0
  191. package/dist/web/public/favicon.svg +4 -0
  192. package/dist/web/public/index.html +37 -928
  193. package/dist/web/public/manifest.webmanifest +19 -0
  194. package/dist/web/public/tasks.html +362 -6
  195. package/dist/web/public/vendor/chart.umd.min.js +20 -0
  196. package/dist/web/server.d.ts.map +1 -1
  197. package/dist/web/server.js +694 -60
  198. package/dist/web/server.js.map +1 -1
  199. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memos-EhjMUvVZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle.js","../../node_modules/lucide-react/dist/esm/icons/notebook-text.js","../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot/dist/index.mjs","../../node_modules/@radix-ui/react-menu/dist/index.mjs","../../node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs","../../src/components/ui/dropdown-menu.tsx","../../src/hooks/use-memos.ts","../../src/routes/memos.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Circle = createLucideIcon(\"Circle\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst NotebookText = createLucideIcon(\"NotebookText\", [\n [\"path\", { d: \"M2 6h4\", key: \"aawbzj\" }],\n [\"path\", { d: \"M2 10h4\", key: \"l0bgd4\" }],\n [\"path\", { d: \"M2 14h4\", key: \"1gsvsf\" }],\n [\"path\", { d: \"M2 18h4\", key: \"1bu2t1\" }],\n [\"rect\", { width: \"16\", height: \"20\", x: \"4\", y: \"2\", rx: \"2\", key: \"1nb95v\" }],\n [\"path\", { d: \"M9.5 8h5\", key: \"11mslq\" }],\n [\"path\", { d: \"M9.5 12H16\", key: \"ktog6x\" }],\n [\"path\", { d: \"M9.5 16H14\", key: \"p1seyn\" }]\n]);\n\nexport { NotebookText as default };\n//# sourceMappingURL=notebook-text.js.map\n","\"use client\";\n\n// src/roving-focus-group.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId ?? null,\n onChange: onCurrentTabStopIdChange,\n caller: GROUP_NAME\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n children,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove, currentTabStopId } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n }),\n children: typeof children === \"function\" ? children({ isCurrentTabStop, hasTabStop: currentTabStopId != null }) : children\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","// src/slot.tsx\nimport * as React from \"react\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { Fragment as Fragment2, jsx } from \"react/jsx-runtime\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n if (slottable) {\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement) ? newElement.props.children : null;\n } else {\n return child;\n }\n });\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });\n }\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlotClone(ownerName) {\n const SlotClone = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props2 = mergeProps(slotProps, children.props);\n if (children.type !== React.Fragment) {\n props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props2);\n }\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\nvar SLOTTABLE_IDENTIFIER = Symbol(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = ({ children }) => {\n return /* @__PURE__ */ jsx(Fragment2, { children });\n };\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/menu.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs, composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar SELECTION_KEYS = [\"Enter\", \" \"];\nvar FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nvar LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nvar FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];\nvar SUB_OPEN_KEYS = {\n ltr: [...SELECTION_KEYS, \"ArrowRight\"],\n rtl: [...SELECTION_KEYS, \"ArrowLeft\"]\n};\nvar SUB_CLOSE_KEYS = {\n ltr: [\"ArrowLeft\"],\n rtl: [\"ArrowRight\"]\n};\nvar MENU_NAME = \"Menu\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);\nvar [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [\n createCollectionScope,\n createPopperScope,\n createRovingFocusGroupScope\n]);\nvar usePopperScope = createPopperScope();\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);\nvar [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);\nvar Menu = (props) => {\n const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;\n const popperScope = usePopperScope(__scopeMenu);\n const [content, setContent] = React.useState(null);\n const isUsingKeyboardRef = React.useRef(false);\n const handleOpenChange = useCallbackRef(onOpenChange);\n const direction = useDirection(dir);\n React.useEffect(() => {\n const handleKeyDown = () => {\n isUsingKeyboardRef.current = true;\n document.addEventListener(\"pointerdown\", handlePointer, { capture: true, once: true });\n document.addEventListener(\"pointermove\", handlePointer, { capture: true, once: true });\n };\n const handlePointer = () => isUsingKeyboardRef.current = false;\n document.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n document.removeEventListener(\"pointerdown\", handlePointer, { capture: true });\n document.removeEventListener(\"pointermove\", handlePointer, { capture: true });\n };\n }, []);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n MenuProvider,\n {\n scope: __scopeMenu,\n open,\n onOpenChange: handleOpenChange,\n content,\n onContentChange: setContent,\n children: /* @__PURE__ */ jsx(\n MenuRootProvider,\n {\n scope: __scopeMenu,\n onClose: React.useCallback(() => handleOpenChange(false), [handleOpenChange]),\n isUsingKeyboardRef,\n dir: direction,\n modal,\n children\n }\n )\n }\n ) });\n};\nMenu.displayName = MENU_NAME;\nvar ANCHOR_NAME = \"MenuAnchor\";\nvar MenuAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...anchorProps } = props;\n const popperScope = usePopperScope(__scopeMenu);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nMenuAnchor.displayName = ANCHOR_NAME;\nvar PORTAL_NAME = \"MenuPortal\";\nvar [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar MenuPortal = (props) => {\n const { __scopeMenu, forceMount, children, container } = props;\n const context = useMenuContext(PORTAL_NAME, __scopeMenu);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nMenuPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"MenuContent\";\nvar [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);\nvar MenuContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });\n }\n);\nvar MenuRootContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n React.useEffect(() => {\n const content = ref.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: context.open,\n disableOutsideScroll: true,\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n ),\n onDismiss: () => context.onOpenChange(false)\n }\n );\n }\n);\nvar MenuRootContentNonModal = React.forwardRef((props, forwardedRef) => {\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n return /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n disableOutsideScroll: false,\n onDismiss: () => context.onOpenChange(false)\n }\n );\n});\nvar Slot = createSlot(\"MenuContent.ScrollLock\");\nvar MenuContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeMenu,\n loop = false,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEntryFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n disableOutsideScroll,\n ...contentProps\n } = props;\n const context = useMenuContext(CONTENT_NAME, __scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);\n const popperScope = usePopperScope(__scopeMenu);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);\n const getItems = useCollection(__scopeMenu);\n const [currentItemId, setCurrentItemId] = React.useState(null);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);\n const timerRef = React.useRef(0);\n const searchRef = React.useRef(\"\");\n const pointerGraceTimerRef = React.useRef(0);\n const pointerGraceIntentRef = React.useRef(null);\n const pointerDirRef = React.useRef(\"right\");\n const lastPointerXRef = React.useRef(0);\n const ScrollLockWrapper = disableOutsideScroll ? RemoveScroll : React.Fragment;\n const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;\n const handleTypeaheadSearch = (key) => {\n const search = searchRef.current + key;\n const items = getItems().filter((item) => !item.disabled);\n const currentItem = document.activeElement;\n const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;\n const values = items.map((item) => item.textValue);\n const nextMatch = getNextMatch(values, search, currentMatch);\n const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;\n (function updateSearch(value) {\n searchRef.current = value;\n window.clearTimeout(timerRef.current);\n if (value !== \"\") timerRef.current = window.setTimeout(() => updateSearch(\"\"), 1e3);\n })(search);\n if (newItem) {\n setTimeout(() => newItem.focus());\n }\n };\n React.useEffect(() => {\n return () => window.clearTimeout(timerRef.current);\n }, []);\n useFocusGuards();\n const isPointerMovingToSubmenu = React.useCallback((event) => {\n const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;\n return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);\n }, []);\n return /* @__PURE__ */ jsx(\n MenuContentProvider,\n {\n scope: __scopeMenu,\n searchRef,\n onItemEnter: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) event.preventDefault();\n },\n [isPointerMovingToSubmenu]\n ),\n onItemLeave: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) return;\n contentRef.current?.focus();\n setCurrentItemId(null);\n },\n [isPointerMovingToSubmenu]\n ),\n onTriggerLeave: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) event.preventDefault();\n },\n [isPointerMovingToSubmenu]\n ),\n pointerGraceTimerRef,\n onPointerGraceIntentChange: React.useCallback((intent) => {\n pointerGraceIntentRef.current = intent;\n }, []),\n children: /* @__PURE__ */ jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n trapped: trapFocus,\n onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {\n event.preventDefault();\n contentRef.current?.focus({ preventScroll: true });\n }),\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n children: /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n dir: rootContext.dir,\n orientation: \"vertical\",\n loop,\n currentTabStopId: currentItemId,\n onCurrentTabStopIdChange: setCurrentItemId,\n onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {\n if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();\n }),\n preventScrollOnEntryFocus: true,\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n role: \"menu\",\n \"aria-orientation\": \"vertical\",\n \"data-state\": getOpenState(context.open),\n \"data-radix-menu-content\": \"\",\n dir: rootContext.dir,\n ...popperScope,\n ...contentProps,\n ref: composedRefs,\n style: { outline: \"none\", ...contentProps.style },\n onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {\n const target = event.target;\n const isKeyDownInside = target.closest(\"[data-radix-menu-content]\") === event.currentTarget;\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n const isCharacterKey = event.key.length === 1;\n if (isKeyDownInside) {\n if (event.key === \"Tab\") event.preventDefault();\n if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);\n }\n const content = contentRef.current;\n if (event.target !== content) return;\n if (!FIRST_LAST_KEYS.includes(event.key)) return;\n event.preventDefault();\n const items = getItems().filter((item) => !item.disabled);\n const candidateNodes = items.map((item) => item.ref.current);\n if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();\n focusFirst(candidateNodes);\n }),\n onBlur: composeEventHandlers(props.onBlur, (event) => {\n if (!event.currentTarget.contains(event.target)) {\n window.clearTimeout(timerRef.current);\n searchRef.current = \"\";\n }\n }),\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n const target = event.target;\n const pointerXHasChanged = lastPointerXRef.current !== event.clientX;\n if (event.currentTarget.contains(target) && pointerXHasChanged) {\n const newDir = event.clientX > lastPointerXRef.current ? \"right\" : \"left\";\n pointerDirRef.current = newDir;\n lastPointerXRef.current = event.clientX;\n }\n })\n )\n }\n )\n }\n )\n }\n )\n }\n ) })\n }\n );\n }\n);\nMenuContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"MenuGroup\";\nvar MenuGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...groupProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { role: \"group\", ...groupProps, ref: forwardedRef });\n }\n);\nMenuGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"MenuLabel\";\nvar MenuLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...labelProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { ...labelProps, ref: forwardedRef });\n }\n);\nMenuLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"MenuItem\";\nvar ITEM_SELECT = \"menu.itemSelect\";\nvar MenuItem = React.forwardRef(\n (props, forwardedRef) => {\n const { disabled = false, onSelect, ...itemProps } = props;\n const ref = React.useRef(null);\n const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);\n const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const isPointerDownRef = React.useRef(false);\n const handleSelect = () => {\n const menuItem = ref.current;\n if (!disabled && menuItem) {\n const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });\n menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });\n dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);\n if (itemSelectEvent.defaultPrevented) {\n isPointerDownRef.current = false;\n } else {\n rootContext.onClose();\n }\n }\n };\n return /* @__PURE__ */ jsx(\n MenuItemImpl,\n {\n ...itemProps,\n ref: composedRefs,\n disabled,\n onClick: composeEventHandlers(props.onClick, handleSelect),\n onPointerDown: (event) => {\n props.onPointerDown?.(event);\n isPointerDownRef.current = true;\n },\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n if (!isPointerDownRef.current) event.currentTarget?.click();\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef.current !== \"\";\n if (disabled || isTypingAhead && event.key === \" \") return;\n if (SELECTION_KEYS.includes(event.key)) {\n event.currentTarget.click();\n event.preventDefault();\n }\n })\n }\n );\n }\n);\nMenuItem.displayName = ITEM_NAME;\nvar MenuItemImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;\n const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [isFocused, setIsFocused] = React.useState(false);\n const [textContent, setTextContent] = React.useState(\"\");\n React.useEffect(() => {\n const menuItem = ref.current;\n if (menuItem) {\n setTextContent((menuItem.textContent ?? \"\").trim());\n }\n }, [itemProps.children]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeMenu,\n disabled,\n textValue: textValue ?? textContent,\n children: /* @__PURE__ */ jsx(RovingFocusGroup.Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"menuitem\",\n \"data-highlighted\": isFocused ? \"\" : void 0,\n \"aria-disabled\": disabled || void 0,\n \"data-disabled\": disabled ? \"\" : void 0,\n ...itemProps,\n ref: composedRefs,\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n if (disabled) {\n contentContext.onItemLeave(event);\n } else {\n contentContext.onItemEnter(event);\n if (!event.defaultPrevented) {\n const item = event.currentTarget;\n item.focus({ preventScroll: true });\n }\n }\n })\n ),\n onPointerLeave: composeEventHandlers(\n props.onPointerLeave,\n whenMouse((event) => contentContext.onItemLeave(event))\n ),\n onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),\n onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))\n }\n ) })\n }\n );\n }\n);\nvar CHECKBOX_ITEM_NAME = \"MenuCheckboxItem\";\nvar MenuCheckboxItem = React.forwardRef(\n (props, forwardedRef) => {\n const { checked = false, onCheckedChange, ...checkboxItemProps } = props;\n return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(\n MenuItem,\n {\n role: \"menuitemcheckbox\",\n \"aria-checked\": isIndeterminate(checked) ? \"mixed\" : checked,\n ...checkboxItemProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(checked),\n onSelect: composeEventHandlers(\n checkboxItemProps.onSelect,\n () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"MenuRadioGroup\";\nvar [RadioGroupProvider, useRadioGroupContext] = createMenuContext(\n RADIO_GROUP_NAME,\n { value: void 0, onValueChange: () => {\n } }\n);\nvar MenuRadioGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { value, onValueChange, ...groupProps } = props;\n const handleValueChange = useCallbackRef(onValueChange);\n return /* @__PURE__ */ jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });\n }\n);\nMenuRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"MenuRadioItem\";\nvar MenuRadioItem = React.forwardRef(\n (props, forwardedRef) => {\n const { value, ...radioItemProps } = props;\n const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);\n const checked = value === context.value;\n return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(\n MenuItem,\n {\n role: \"menuitemradio\",\n \"aria-checked\": checked,\n ...radioItemProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(checked),\n onSelect: composeEventHandlers(\n radioItemProps.onSelect,\n () => context.onValueChange?.(value),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nMenuRadioItem.displayName = RADIO_ITEM_NAME;\nvar ITEM_INDICATOR_NAME = \"MenuItemIndicator\";\nvar [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(\n ITEM_INDICATOR_NAME,\n { checked: false }\n);\nvar MenuItemIndicator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;\n const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);\n return /* @__PURE__ */ jsx(\n Presence,\n {\n present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...itemIndicatorProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(indicatorContext.checked)\n }\n )\n }\n );\n }\n);\nMenuItemIndicator.displayName = ITEM_INDICATOR_NAME;\nvar SEPARATOR_NAME = \"MenuSeparator\";\nvar MenuSeparator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...separatorProps } = props;\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"separator\",\n \"aria-orientation\": \"horizontal\",\n ...separatorProps,\n ref: forwardedRef\n }\n );\n }\n);\nMenuSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"MenuArrow\";\nvar MenuArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeMenu);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nMenuArrow.displayName = ARROW_NAME;\nvar SUB_NAME = \"MenuSub\";\nvar [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);\nvar MenuSub = (props) => {\n const { __scopeMenu, children, open = false, onOpenChange } = props;\n const parentMenuContext = useMenuContext(SUB_NAME, __scopeMenu);\n const popperScope = usePopperScope(__scopeMenu);\n const [trigger, setTrigger] = React.useState(null);\n const [content, setContent] = React.useState(null);\n const handleOpenChange = useCallbackRef(onOpenChange);\n React.useEffect(() => {\n if (parentMenuContext.open === false) handleOpenChange(false);\n return () => handleOpenChange(false);\n }, [parentMenuContext.open, handleOpenChange]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n MenuProvider,\n {\n scope: __scopeMenu,\n open,\n onOpenChange: handleOpenChange,\n content,\n onContentChange: setContent,\n children: /* @__PURE__ */ jsx(\n MenuSubProvider,\n {\n scope: __scopeMenu,\n contentId: useId(),\n triggerId: useId(),\n trigger,\n onTriggerChange: setTrigger,\n children\n }\n )\n }\n ) });\n};\nMenuSub.displayName = SUB_NAME;\nvar SUB_TRIGGER_NAME = \"MenuSubTrigger\";\nvar MenuSubTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const openTimerRef = React.useRef(null);\n const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;\n const scope = { __scopeMenu: props.__scopeMenu };\n const clearOpenTimer = React.useCallback(() => {\n if (openTimerRef.current) window.clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }, []);\n React.useEffect(() => clearOpenTimer, [clearOpenTimer]);\n React.useEffect(() => {\n const pointerGraceTimer = pointerGraceTimerRef.current;\n return () => {\n window.clearTimeout(pointerGraceTimer);\n onPointerGraceIntentChange(null);\n };\n }, [pointerGraceTimerRef, onPointerGraceIntentChange]);\n return /* @__PURE__ */ jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsx(\n MenuItemImpl,\n {\n id: subContext.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": context.open,\n \"aria-controls\": subContext.contentId,\n \"data-state\": getOpenState(context.open),\n ...props,\n ref: composeRefs(forwardedRef, subContext.onTriggerChange),\n onClick: (event) => {\n props.onClick?.(event);\n if (props.disabled || event.defaultPrevented) return;\n event.currentTarget.focus();\n if (!context.open) context.onOpenChange(true);\n },\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n contentContext.onItemEnter(event);\n if (event.defaultPrevented) return;\n if (!props.disabled && !context.open && !openTimerRef.current) {\n contentContext.onPointerGraceIntentChange(null);\n openTimerRef.current = window.setTimeout(() => {\n context.onOpenChange(true);\n clearOpenTimer();\n }, 100);\n }\n })\n ),\n onPointerLeave: composeEventHandlers(\n props.onPointerLeave,\n whenMouse((event) => {\n clearOpenTimer();\n const contentRect = context.content?.getBoundingClientRect();\n if (contentRect) {\n const side = context.content?.dataset.side;\n const rightSide = side === \"right\";\n const bleed = rightSide ? -5 : 5;\n const contentNearEdge = contentRect[rightSide ? \"left\" : \"right\"];\n const contentFarEdge = contentRect[rightSide ? \"right\" : \"left\"];\n contentContext.onPointerGraceIntentChange({\n area: [\n // Apply a bleed on clientX to ensure that our exit point is\n // consistently within polygon bounds\n { x: event.clientX + bleed, y: event.clientY },\n { x: contentNearEdge, y: contentRect.top },\n { x: contentFarEdge, y: contentRect.top },\n { x: contentFarEdge, y: contentRect.bottom },\n { x: contentNearEdge, y: contentRect.bottom }\n ],\n side\n });\n window.clearTimeout(pointerGraceTimerRef.current);\n pointerGraceTimerRef.current = window.setTimeout(\n () => contentContext.onPointerGraceIntentChange(null),\n 300\n );\n } else {\n contentContext.onTriggerLeave(event);\n if (event.defaultPrevented) return;\n contentContext.onPointerGraceIntentChange(null);\n }\n })\n ),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef.current !== \"\";\n if (props.disabled || isTypingAhead && event.key === \" \") return;\n if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {\n context.onOpenChange(true);\n context.content?.focus();\n event.preventDefault();\n }\n })\n }\n ) });\n }\n);\nMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"MenuSubContent\";\nvar MenuSubContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);\n const { forceMount = portalContext.forceMount, ...subContentProps } = props;\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);\n const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n id: subContext.contentId,\n \"aria-labelledby\": subContext.triggerId,\n ...subContentProps,\n ref: composedRefs,\n align: \"start\",\n side: rootContext.dir === \"rtl\" ? \"left\" : \"right\",\n disableOutsidePointerEvents: false,\n disableOutsideScroll: false,\n trapFocus: false,\n onOpenAutoFocus: (event) => {\n if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();\n event.preventDefault();\n },\n onCloseAutoFocus: (event) => event.preventDefault(),\n onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {\n if (event.target !== subContext.trigger) context.onOpenChange(false);\n }),\n onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {\n rootContext.onClose();\n event.preventDefault();\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isKeyDownInside = event.currentTarget.contains(event.target);\n const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);\n if (isKeyDownInside && isCloseKey) {\n context.onOpenChange(false);\n subContext.trigger?.focus();\n event.preventDefault();\n }\n })\n }\n ) }) }) });\n }\n);\nMenuSubContent.displayName = SUB_CONTENT_NAME;\nfunction getOpenState(open) {\n return open ? \"open\" : \"closed\";\n}\nfunction isIndeterminate(checked) {\n return checked === \"indeterminate\";\n}\nfunction getCheckedState(checked) {\n return isIndeterminate(checked) ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\";\n}\nfunction focusFirst(candidates) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus();\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nfunction getNextMatch(values, search, currentMatch) {\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);\n const normalizedSearch = isRepeated ? search[0] : search;\n const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;\n let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));\n const excludeCurrentMatch = normalizedSearch.length === 1;\n if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);\n const nextMatch = wrappedValues.find(\n (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())\n );\n return nextMatch !== currentMatch ? nextMatch : void 0;\n}\nfunction isPointInPolygon(point, polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i];\n const jj = polygon[j];\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\nfunction isPointerInGraceArea(event, area) {\n if (!area) return false;\n const cursorPos = { x: event.clientX, y: event.clientY };\n return isPointInPolygon(cursorPos, area);\n}\nfunction whenMouse(handler) {\n return (event) => event.pointerType === \"mouse\" ? handler(event) : void 0;\n}\nvar Root3 = Menu;\nvar Anchor2 = MenuAnchor;\nvar Portal = MenuPortal;\nvar Content2 = MenuContent;\nvar Group = MenuGroup;\nvar Label = MenuLabel;\nvar Item2 = MenuItem;\nvar CheckboxItem = MenuCheckboxItem;\nvar RadioGroup = MenuRadioGroup;\nvar RadioItem = MenuRadioItem;\nvar ItemIndicator = MenuItemIndicator;\nvar Separator = MenuSeparator;\nvar Arrow2 = MenuArrow;\nvar Sub = MenuSub;\nvar SubTrigger = MenuSubTrigger;\nvar SubContent = MenuSubContent;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n CheckboxItem,\n Content2 as Content,\n Group,\n Item2 as Item,\n ItemIndicator,\n Label,\n Menu,\n MenuAnchor,\n MenuArrow,\n MenuCheckboxItem,\n MenuContent,\n MenuGroup,\n MenuItem,\n MenuItemIndicator,\n MenuLabel,\n MenuPortal,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuSub,\n MenuSubContent,\n MenuSubTrigger,\n Portal,\n RadioGroup,\n RadioItem,\n Root3 as Root,\n Separator,\n Sub,\n SubContent,\n SubTrigger,\n createMenuScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/dropdown-menu.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as MenuPrimitive from \"@radix-ui/react-menu\";\nimport { createMenuScope } from \"@radix-ui/react-menu\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar DROPDOWN_MENU_NAME = \"DropdownMenu\";\nvar [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(\n DROPDOWN_MENU_NAME,\n [createMenuScope]\n);\nvar useMenuScope = createMenuScope();\nvar [DropdownMenuProvider, useDropdownMenuContext] = createDropdownMenuContext(DROPDOWN_MENU_NAME);\nvar DropdownMenu = (props) => {\n const {\n __scopeDropdownMenu,\n children,\n dir,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const triggerRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DROPDOWN_MENU_NAME\n });\n return /* @__PURE__ */ jsx(\n DropdownMenuProvider,\n {\n scope: __scopeDropdownMenu,\n triggerId: useId(),\n triggerRef,\n contentId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children: /* @__PURE__ */ jsx(MenuPrimitive.Root, { ...menuScope, open, onOpenChange: setOpen, dir, modal, children })\n }\n );\n};\nDropdownMenu.displayName = DROPDOWN_MENU_NAME;\nvar TRIGGER_NAME = \"DropdownMenuTrigger\";\nvar DropdownMenuTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;\n const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Anchor, { asChild: true, ...menuScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n id: context.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.open ? context.contentId : void 0,\n \"data-state\": context.open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n ...triggerProps,\n ref: composeRefs(forwardedRef, context.triggerRef),\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onOpenToggle();\n if (!context.open) event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled) return;\n if ([\"Enter\", \" \"].includes(event.key)) context.onOpenToggle();\n if (event.key === \"ArrowDown\") context.onOpenChange(true);\n if ([\"Enter\", \" \", \"ArrowDown\"].includes(event.key)) event.preventDefault();\n })\n }\n ) });\n }\n);\nDropdownMenuTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DropdownMenuPortal\";\nvar DropdownMenuPortal = (props) => {\n const { __scopeDropdownMenu, ...portalProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Portal, { ...menuScope, ...portalProps });\n};\nDropdownMenuPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"DropdownMenuContent\";\nvar DropdownMenuContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...contentProps } = props;\n const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const hasInteractedOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.Content,\n {\n id: context.contentId,\n \"aria-labelledby\": context.triggerId,\n ...menuScope,\n ...contentProps,\n ref: forwardedRef,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n hasInteractedOutsideRef.current = false;\n event.preventDefault();\n }),\n onInteractOutside: composeEventHandlers(props.onInteractOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;\n }),\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-dropdown-menu-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-dropdown-menu-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-dropdown-menu-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-dropdown-menu-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-dropdown-menu-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n }\n);\nDropdownMenuContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"DropdownMenuGroup\";\nvar DropdownMenuGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...groupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Group, { ...menuScope, ...groupProps, ref: forwardedRef });\n }\n);\nDropdownMenuGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"DropdownMenuLabel\";\nvar DropdownMenuLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...labelProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Label, { ...menuScope, ...labelProps, ref: forwardedRef });\n }\n);\nDropdownMenuLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"DropdownMenuItem\";\nvar DropdownMenuItem = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Item, { ...menuScope, ...itemProps, ref: forwardedRef });\n }\n);\nDropdownMenuItem.displayName = ITEM_NAME;\nvar CHECKBOX_ITEM_NAME = \"DropdownMenuCheckboxItem\";\nvar DropdownMenuCheckboxItem = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...checkboxItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.CheckboxItem, { ...menuScope, ...checkboxItemProps, ref: forwardedRef });\n});\nDropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"DropdownMenuRadioGroup\";\nvar DropdownMenuRadioGroup = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioGroupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioGroup, { ...menuScope, ...radioGroupProps, ref: forwardedRef });\n});\nDropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"DropdownMenuRadioItem\";\nvar DropdownMenuRadioItem = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioItem, { ...menuScope, ...radioItemProps, ref: forwardedRef });\n});\nDropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;\nvar INDICATOR_NAME = \"DropdownMenuItemIndicator\";\nvar DropdownMenuItemIndicator = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemIndicatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.ItemIndicator, { ...menuScope, ...itemIndicatorProps, ref: forwardedRef });\n});\nDropdownMenuItemIndicator.displayName = INDICATOR_NAME;\nvar SEPARATOR_NAME = \"DropdownMenuSeparator\";\nvar DropdownMenuSeparator = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...separatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Separator, { ...menuScope, ...separatorProps, ref: forwardedRef });\n});\nDropdownMenuSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"DropdownMenuArrow\";\nvar DropdownMenuArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...arrowProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Arrow, { ...menuScope, ...arrowProps, ref: forwardedRef });\n }\n);\nDropdownMenuArrow.displayName = ARROW_NAME;\nvar DropdownMenuSub = (props) => {\n const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: \"DropdownMenuSub\"\n });\n return /* @__PURE__ */ jsx(MenuPrimitive.Sub, { ...menuScope, open, onOpenChange: setOpen, children });\n};\nvar SUB_TRIGGER_NAME = \"DropdownMenuSubTrigger\";\nvar DropdownMenuSubTrigger = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...subTriggerProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.SubTrigger, { ...menuScope, ...subTriggerProps, ref: forwardedRef });\n});\nDropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"DropdownMenuSubContent\";\nvar DropdownMenuSubContent = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...subContentProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.SubContent,\n {\n ...menuScope,\n ...subContentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-dropdown-menu-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-dropdown-menu-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-dropdown-menu-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-dropdown-menu-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-dropdown-menu-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n});\nDropdownMenuSubContent.displayName = SUB_CONTENT_NAME;\nvar Root2 = DropdownMenu;\nvar Trigger = DropdownMenuTrigger;\nvar Portal2 = DropdownMenuPortal;\nvar Content2 = DropdownMenuContent;\nvar Group2 = DropdownMenuGroup;\nvar Label2 = DropdownMenuLabel;\nvar Item2 = DropdownMenuItem;\nvar CheckboxItem2 = DropdownMenuCheckboxItem;\nvar RadioGroup2 = DropdownMenuRadioGroup;\nvar RadioItem2 = DropdownMenuRadioItem;\nvar ItemIndicator2 = DropdownMenuItemIndicator;\nvar Separator2 = DropdownMenuSeparator;\nvar Arrow2 = DropdownMenuArrow;\nvar Sub2 = DropdownMenuSub;\nvar SubTrigger2 = DropdownMenuSubTrigger;\nvar SubContent2 = DropdownMenuSubContent;\nexport {\n Arrow2 as Arrow,\n CheckboxItem2 as CheckboxItem,\n Content2 as Content,\n DropdownMenu,\n DropdownMenuArrow,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuItemIndicator,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Group2 as Group,\n Item2 as Item,\n ItemIndicator2 as ItemIndicator,\n Label2 as Label,\n Portal2 as Portal,\n RadioGroup2 as RadioGroup,\n RadioItem2 as RadioItem,\n Root2 as Root,\n Separator2 as Separator,\n Sub2 as Sub,\n SubContent2 as SubContent,\n SubTrigger2 as SubTrigger,\n Trigger,\n createDropdownMenuScope\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * DropdownMenu — Radix-backed menu for row actions, agent picker, etc.\n * The check / radio item variants ship below; we don't import every\n * Radix sub-primitive eagerly to keep the bundle small if a page\n * doesn't need them.\n */\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center gap-2 rounded px-2 py-1.5 text-sm outline-none',\n 'focus:bg-surface-hover data-[state=open]:bg-surface-hover',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-surface p-1 shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-surface p-1 shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded px-2 py-1.5 text-sm outline-none',\n 'focus:bg-surface-hover focus:text-text',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none',\n 'focus:bg-surface-hover',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none',\n 'focus:bg-surface-hover',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-xs font-semibold uppercase tracking-wide text-text-muted',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>): JSX.Element => (\n <span\n className={cn('ml-auto text-xs tracking-widest text-text-muted', className)}\n {...props}\n />\n)\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","/**\n * useMemos — react-query wrappers for memos search + delete.\n *\n * useMemos(query) — search/list\n * useDeleteMemo() — DELETE /api/memos/:id\n *\n * No SSE channel for memos (they're operator-created from chat, not\n * from autonomous agent activity), and no background poll: the page\n * shows search results which are inherently user-triggered.\n * Mutation onSuccess invalidates so a delete removes the row\n * immediately without a manual refresh.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type {\n DeleteMemoResponse,\n ListMemosQuery,\n ListMemosResponse,\n} from '@/types/api'\n\nexport const memosKeys = {\n all: ['memos'] as const,\n list: (q: ListMemosQuery) => ['memos', 'list', q] as const,\n}\n\nexport function useMemos(query: ListMemosQuery) {\n return useQuery<ListMemosResponse>({\n queryKey: memosKeys.list(query),\n queryFn: () => api.listMemos(query),\n })\n}\n\nexport function useInvalidateMemos() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: memosKeys.all })\n}\n\nexport function useDeleteMemo() {\n const qc = useQueryClient()\n return useMutation<DeleteMemoResponse, Error, number>({\n mutationFn: (id) => api.deleteMemo(id),\n onSuccess: () => qc.invalidateQueries({ queryKey: memosKeys.all }),\n })\n}\n","/**\n * /memos — searchable memo list. Free-form text + who/what filters +\n * has-location toggle. Delete is the one mutation.\n *\n * Memos with location surface a small \"Open map\" dropdown that\n * routes to the provider URLs the backend prepared in `mapUrls`\n * (Baidu / Apple / Google / OSM).\n *\n * Searches are user-triggered (input + debounce) rather than poll-\n * driven — the query is read straight from URL params so deep-link\n * sharing works (\"memos about taxes between Jan and April\").\n *\n * Debounce: 300ms between the last keystroke and URL/query commit\n * — keeps the backend's FTS5 from running on every keypress.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { MapPin, NotebookText, RefreshCcw, Search, Trash2 } from 'lucide-react'\n\nimport { Topbar } from '@/components/shell/topbar'\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { useMemos, useDeleteMemo } from '@/hooks/use-memos'\nimport { describeError } from '@/lib/api/errors'\nimport type { Memo, ListMemosQuery } from '@/types/api'\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nexport default function MemosRoute(): JSX.Element {\n const { t } = useTranslation(['memos', 'common'])\n const [params, setParams] = useSearchParams()\n\n // URL-driven filter state (read once per render).\n const q = params.get('q') ?? ''\n const who = params.get('who') ?? ''\n const what = params.get('what') ?? ''\n const hasLoc = params.get('has_location') === '1'\n const incExpired = params.get('include_expired') === '1'\n\n // Local-only echo of the text input. Effects below sync the URL\n // after the debounce so each keypress doesn't kick a fetch.\n const [qDraft, setQDraft] = useState(q)\n\n useEffect(() => {\n if (qDraft === q) return\n const timer = window.setTimeout(() => {\n patchParams({ q: qDraft || null })\n }, SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [qDraft])\n\n const query: ListMemosQuery = useMemo(\n () => ({\n ...(q ? { query: q } : {}),\n ...(who ? { who } : {}),\n ...(what ? { what } : {}),\n ...(hasLoc ? { has_location: true } : {}),\n ...(incExpired ? { include_expired: true } : {}),\n limit: 200,\n }),\n [q, who, what, hasLoc, incExpired],\n )\n\n const { data, isLoading, isFetching, refetch } = useMemos(query)\n const memos = data?.memos ?? []\n\n const del = useDeleteMemo()\n const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null)\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null || v === '') next.delete(k)\n else next.set(k, v)\n }\n setParams(next, { replace: true })\n }\n\n async function onConfirmDelete(): Promise<void> {\n if (confirmDeleteId == null) return\n try {\n await del.mutateAsync(confirmDeleteId)\n toast.success(t('toast.deleted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n const columns: DataTableColumn<Memo>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'what',\n header: t('col.what'),\n cell: (r) => (\n <span className=\"line-clamp-2\">\n {r.memo ? <span className=\"text-text\">{r.memo}</span> : <span className=\"font-medium text-text\">{r.what}</span>}\n </span>\n ),\n asCardTitle: true,\n },\n {\n id: 'who',\n header: t('col.who'),\n cell: (r) =>\n r.who ? (\n <Badge variant=\"secondary\">{r.who}</Badge>\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n headClassName: 'w-32',\n },\n {\n id: 'when',\n header: t('col.when'),\n cell: (r) => (\n <span className=\"text-text-dim\">\n {r.whenText || (r.whenAt ? formatTime(r.whenAt) : '—')}\n </span>\n ),\n headClassName: 'w-36',\n },\n {\n id: 'where',\n header: t('col.where'),\n cell: (r) =>\n r.where_label || (r.where_lat != null && r.where_lng != null) ? (\n <MapCell memo={r} />\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n headClassName: 'w-44',\n },\n {\n id: 'platform',\n header: t('col.platform'),\n cell: (r) => <span className=\"text-text-dim\">{r.platform}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'createdAt',\n header: t('col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.createdAt)}</span>,\n headClassName: 'w-36',\n hideOnMobile: true,\n },\n {\n id: 'actions',\n header: '',\n cell: (r) => (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n setConfirmDeleteId(r.id)\n }}\n disabled={del.isPending}\n aria-label={t('action.delete')}\n >\n <Trash2 className=\"h-3 w-3\" />\n <span className=\"sr-only sm:not-sr-only sm:ml-1\">{t('action.delete')}</span>\n </Button>\n </div>\n ),\n headClassName: 'w-24',\n },\n ],\n [t, del.isPending],\n )\n\n return (\n <div className=\"flex min-h-dvh flex-col bg-bg\">\n <Topbar />\n\n <main className=\"mx-auto flex w-full max-w-7xl flex-1 flex-col gap-4 px-3 py-4 sm:px-4 pb-safe\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('pageTitle')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n <RefreshCcw className={`h-4 w-4 ${isFetching ? 'animate-spin' : ''}`} />\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('subtitle')}</p>\n </header>\n\n {/* Search bar */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-end\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-text-muted\" />\n <Input\n value={qDraft}\n onChange={(e) => setQDraft(e.target.value)}\n placeholder={t('search.placeholder')}\n className=\"pl-7\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:flex sm:items-end\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"who-filter\" className=\"text-xs text-text-dim\">\n {t('search.who')}\n </Label>\n <Input\n id=\"who-filter\"\n value={who}\n onChange={(e) => patchParams({ who: e.target.value || null })}\n className=\"w-36\"\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"what-filter\" className=\"text-xs text-text-dim\">\n {t('search.what')}\n </Label>\n <Input\n id=\"what-filter\"\n value={what}\n onChange={(e) => patchParams({ what: e.target.value || null })}\n className=\"w-36\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <label className=\"inline-flex items-center gap-1 text-sm text-text-dim\">\n <input\n type=\"checkbox\"\n checked={hasLoc}\n onChange={(e) => patchParams({ has_location: e.target.checked ? '1' : null })}\n className=\"h-4 w-4 accent-accent\"\n />\n {t('search.hasLocation')}\n </label>\n <label className=\"inline-flex items-center gap-1 text-sm text-text-dim\">\n <input\n type=\"checkbox\"\n checked={incExpired}\n onChange={(e) => patchParams({ include_expired: e.target.checked ? '1' : null })}\n className=\"h-4 w-4 accent-accent\"\n />\n {t('search.includeExpired')}\n </label>\n </div>\n </div>\n\n <DataTable\n columns={columns}\n rows={memos}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<NotebookText />}\n title={t('empty.title')}\n description={t('empty.description')}\n />\n }\n />\n\n <ConfirmDialog\n open={confirmDeleteId != null}\n onOpenChange={(open) => {\n if (!open) setConfirmDeleteId(null)\n }}\n title={t('action.confirmDelete')}\n description={t('action.confirmDeleteDesc')}\n intent=\"danger\"\n confirmLabel={t('action.delete')}\n onConfirm={onConfirmDelete}\n />\n </main>\n </div>\n )\n}\n\ninterface MapCellProps {\n memo: Memo\n}\n\nconst PROVIDER_LABEL_KEY: Record<string, string> = {\n baidu: 'openMap.baidu',\n apple: 'openMap.apple',\n google: 'openMap.google',\n osm: 'openMap.osm',\n}\n\nfunction MapCell({ memo }: MapCellProps): JSX.Element {\n const { t } = useTranslation('memos')\n const label = memo.where_label || `${memo.where_lat}, ${memo.where_lng}`\n const entries = Object.entries(memo.mapUrls ?? {})\n if (entries.length === 0) {\n return <span className=\"text-text-dim\">{label}</span>\n }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 text-sm text-text-dim hover:text-accent\"\n onClick={(e) => e.stopPropagation()}\n >\n <MapPin className=\"h-3 w-3\" />\n <span className=\"line-clamp-1 underline-offset-2 hover:underline\">{label}</span>\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {entries.map(([provider, url]) => (\n <DropdownMenuItem key={provider} asChild>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t(PROVIDER_LABEL_KEY[provider] ?? 'openMap.label', { defaultValue: provider })}\n </a>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["Circle","createLucideIcon","NotebookText","ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","createContextScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","props","forwardedRef","jsx","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","children","itemProps","autoId","useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","Root","Item","createSlot","ownerName","SlotClone","createSlotClone","Slot2","slotProps","childrenArray","React.Children","slottable","isSlottable","newElement","newChildren","child","React.isValidElement","React.cloneElement","childrenRef","getElementRef","props2","mergeProps","React.Fragment","composeRefs","SLOTTABLE_IDENTIFIER","childProps","overrideProps","propName","slotPropValue","childPropValue","args","result","element","getter","mayWarn","SELECTION_KEYS","FIRST_KEYS","LAST_KEYS","FIRST_LAST_KEYS","SUB_OPEN_KEYS","SUB_CLOSE_KEYS","MENU_NAME","createMenuContext","createMenuScope","createPopperScope","usePopperScope","useRovingFocusGroupScope","MenuProvider","useMenuContext","MenuRootProvider","useMenuRootContext","Menu","__scopeMenu","open","onOpenChange","modal","popperScope","content","setContent","isUsingKeyboardRef","handleOpenChange","handleKeyDown","handlePointer","PopperPrimitive.Root","ANCHOR_NAME","MenuAnchor","anchorProps","PopperPrimitive.Anchor","PORTAL_NAME","PortalProvider","usePortalContext","MenuPortal","forceMount","container","Presence","PortalPrimitive","CONTENT_NAME","MenuContentProvider","useMenuContentContext","MenuContent","portalContext","contentProps","rootContext","MenuRootContentModal","MenuRootContentNonModal","hideOthers","MenuContentImpl","Slot","trapFocus","onOpenAutoFocus","onCloseAutoFocus","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","onDismiss","disableOutsideScroll","rovingFocusGroupScope","currentItemId","setCurrentItemId","contentRef","timerRef","searchRef","pointerGraceTimerRef","pointerGraceIntentRef","pointerDirRef","lastPointerXRef","ScrollLockWrapper","RemoveScroll","scrollLockWrapperProps","handleTypeaheadSearch","search","currentMatch","values","nextMatch","getNextMatch","newItem","updateSearch","value","useFocusGuards","isPointerMovingToSubmenu","isPointerInGraceArea","intent","FocusScope","DismissableLayer","RovingFocusGroup.Root","PopperPrimitive.Content","getOpenState","isKeyDownInside","isModifierKey","isCharacterKey","whenMouse","target","pointerXHasChanged","newDir","MenuGroup","LABEL_NAME","MenuLabel","labelProps","ITEM_SELECT","MenuItem","disabled","onSelect","contentContext","isPointerDownRef","handleSelect","menuItem","itemSelectEvent","dispatchDiscreteCustomEvent","MenuItemImpl","isTypingAhead","textValue","isFocused","setIsFocused","textContent","setTextContent","RovingFocusGroup.Item","CHECKBOX_ITEM_NAME","MenuCheckboxItem","checked","onCheckedChange","checkboxItemProps","ItemIndicatorProvider","isIndeterminate","getCheckedState","RADIO_GROUP_NAME","RadioGroupProvider","useRadioGroupContext","MenuRadioGroup","onValueChange","handleValueChange","RADIO_ITEM_NAME","MenuRadioItem","radioItemProps","ITEM_INDICATOR_NAME","useItemIndicatorContext","MenuItemIndicator","itemIndicatorProps","indicatorContext","SEPARATOR_NAME","MenuSeparator","separatorProps","ARROW_NAME","MenuArrow","arrowProps","PopperPrimitive.Arrow","SUB_NAME","MenuSubProvider","useMenuSubContext","SUB_TRIGGER_NAME","MenuSubTrigger","subContext","openTimerRef","onPointerGraceIntentChange","scope","clearOpenTimer","pointerGraceTimer","contentRect","side","rightSide","bleed","contentNearEdge","contentFarEdge","SUB_CONTENT_NAME","MenuSubContent","subContentProps","isCloseKey","normalizedSearch","char","currentMatchIndex","wrappedValues","v","isPointInPolygon","point","polygon","x","y","inside","i","j","ii","jj","xi","yi","xj","yj","area","cursorPos","handler","Root3","Anchor2","Portal","Content2","Group","Label","Item2","CheckboxItem","RadioGroup","RadioItem","ItemIndicator","Separator","Arrow2","SubTrigger","SubContent","DROPDOWN_MENU_NAME","createDropdownMenuContext","useMenuScope","DropdownMenuProvider","useDropdownMenuContext","DropdownMenu","__scopeDropdownMenu","openProp","defaultOpen","menuScope","triggerRef","setOpen","prevOpen","MenuPrimitive.Root","TRIGGER_NAME","DropdownMenuTrigger","triggerProps","MenuPrimitive.Anchor","DropdownMenuPortal","portalProps","MenuPrimitive.Portal","DropdownMenuContent","hasInteractedOutsideRef","MenuPrimitive.Content","originalEvent","ctrlLeftClick","isRightClick","DropdownMenuGroup","MenuPrimitive.Group","DropdownMenuLabel","MenuPrimitive.Label","DropdownMenuItem","MenuPrimitive.Item","DropdownMenuCheckboxItem","MenuPrimitive.CheckboxItem","DropdownMenuRadioGroup","radioGroupProps","MenuPrimitive.RadioGroup","DropdownMenuRadioItem","MenuPrimitive.RadioItem","INDICATOR_NAME","DropdownMenuItemIndicator","MenuPrimitive.ItemIndicator","DropdownMenuSeparator","MenuPrimitive.Separator","DropdownMenuArrow","MenuPrimitive.Arrow","DropdownMenuSubTrigger","subTriggerProps","MenuPrimitive.SubTrigger","DropdownMenuSubContent","MenuPrimitive.SubContent","Root2","Trigger","Portal2","Label2","CheckboxItem2","RadioItem2","ItemIndicator2","Separator2","SubTrigger2","SubContent2","DropdownMenuPrimitive.Root","DropdownMenuPrimitive.Trigger","className","inset","jsxs","DropdownMenuPrimitive.SubTrigger","cn","ChevronRight","DropdownMenuPrimitive.SubContent","sideOffset","DropdownMenuPrimitive.Portal","DropdownMenuPrimitive.Content","DropdownMenuPrimitive.Item","DropdownMenuPrimitive.CheckboxItem","DropdownMenuPrimitive.ItemIndicator","Check","DropdownMenuPrimitive.RadioItem","DropdownMenuPrimitive.Label","DropdownMenuPrimitive.Separator","memosKeys","q","useMemos","query","useQuery","api","useDeleteMemo","qc","useQueryClient","useMutation","SEARCH_DEBOUNCE_MS","MemosRoute","t","useTranslation","params","setParams","useSearchParams","who","what","hasLoc","incExpired","qDraft","setQDraft","useState","useEffect","timer","patchParams","useMemo","data","isLoading","isFetching","refetch","memos","del","confirmDeleteId","setConfirmDeleteId","patch","next","k","onConfirmDelete","toast","err","message","describeError","columns","r","Badge","formatTime","MapCell","Button","e","Trash2","Topbar","RefreshCcw","Search","Input","DataTable","EmptyState","ConfirmDialog","PROVIDER_LABEL_KEY","memo","label","entries","MapPin","provider","url","iso","d"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
@@ -0,0 +1,7 @@
1
+ import{x as I,ac as N,Q as e,c as b,B as C,a2 as v,z as T,L as q,I as D}from"./index-CpGWCLE5.js";import{e as o}from"./react-C9F3QeMB.js";import{D as Q,a as M,d as E,e as F,b as z}from"./dialog-DZpoEskO.js";import{b as O,m as P,i as L,q as R}from"./use-settings-CU-UcrVD.js";import{L as y}from"./loader-circle-JaKY-xMt.js";import{R as A}from"./refresh-ccw-Bx817_KW.js";import{X as B}from"./x-Ru3rHT82.js";import{S as H}from"./save-CqMcATrh.js";import"./useQuery-BTyugXYV.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const W=I("QrCode",[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]]);function k(s){const n=new Set(s?.messengers??[]);return{"wechat-ilink":{enabled:n.has("wechat-ilink")},telegram:{enabled:n.has("telegram"),telegram:{...s?.telegram??{}}},feishu:{enabled:n.has("feishu"),feishu:{...s?.feishu??{}}},dingtalk:{enabled:n.has("dingtalk"),dingtalk:{...s?.dingtalk??{}}},discord:{enabled:n.has("discord"),discord:{...s?.discord??{}}}}}function J(s,n){const i=[];for(const t of Object.keys(s))s[t].enabled&&i.push(t);return{messengers:i,telegram:s.telegram.telegram,feishu:s.feishu.feishu,dingtalk:s.dingtalk.dingtalk,discord:s.discord.discord,...Object.fromEntries(Object.entries(n).filter(([t])=>!["messengers","telegram","feishu","dingtalk","discord"].includes(t)))}}function se(){const{t:s}=N(["settings","common"]),n=O(),i=P(),[t,d]=o.useState(()=>k(n.data)),[m,g]=o.useState(!1);o.useEffect(()=>{m||n.data&&(d(k(n.data)),g(!0))},[n.data,m]);const r=n.data,p=o.useMemo(()=>r?JSON.stringify(k(r))!==JSON.stringify(t):!1,[r,t]),[j,x]=o.useState(!1);function l(a,S){d(w=>({...w,[a]:{...w[a],...S}}))}async function h(){if(r)try{await i.mutateAsync(J(t,r)),v.success(s("messengers.savedToast")),g(!1)}catch(a){v.error(T(a,s).message)}}function u(){r&&d(k(r))}return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("messengers.title")}),e.jsxs(b,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>n.refetch(),disabled:n.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[n.isFetching?e.jsx(y,{className:"h-4 w-4 animate-spin"}):e.jsx(A,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("messengers.subtitle")})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:p?e.jsxs(e.Fragment,{children:[e.jsx(C,{variant:"info",children:s("messengers.dirtyHint")}),e.jsxs(b,{type:"button",variant:"secondary",size:"sm",onClick:u,disabled:i.isPending,children:[e.jsx(B,{className:"h-4 w-4"}),s("messengers.discardAll")]}),e.jsxs(b,{type:"button",size:"sm",onClick:()=>void h(),disabled:i.isPending,children:[i.isPending?e.jsx(y,{className:"h-4 w-4 animate-spin"}):e.jsx(H,{className:"h-4 w-4"}),i.isPending?s("messengers.saving"):s("messengers.saveAll")]})]}):e.jsx("span",{className:"text-xs text-text-muted",children:s("env.noChanges")})}),n.isLoading?e.jsx("div",{className:"h-96 rounded-md bg-surface-2 animate-pulse"}):r?e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(f,{slot:"wechat-ilink",label:s("messengers.platform.wechat"),hint:s("messengers.hint.wechat"),enabled:t["wechat-ilink"].enabled,onToggle:a=>l("wechat-ilink",{enabled:a}),children:e.jsxs(b,{type:"button",variant:"secondary",size:"sm",onClick:()=>x(!0),children:[e.jsx(W,{className:"h-4 w-4"}),s("messengers.scanQr")]})}),e.jsxs(f,{slot:"telegram",label:s("messengers.platform.telegram"),hint:s("messengers.hint.telegram"),enabled:t.telegram.enabled,onToggle:a=>l("telegram",{enabled:a}),children:[e.jsx(c,{id:"tg-token",label:s("messengers.fields.botToken"),value:t.telegram.telegram?.botToken??"",type:"password",onChange:a=>l("telegram",{telegram:{...t.telegram.telegram,botToken:a}})}),e.jsx(c,{id:"tg-channel",label:s("messengers.fields.channelId"),value:t.telegram.telegram?.channelId??"",onChange:a=>l("telegram",{telegram:{...t.telegram.telegram,channelId:a}})})]}),e.jsxs(f,{slot:"feishu",label:s("messengers.platform.feishu"),hint:s("messengers.hint.feishu"),enabled:t.feishu.enabled,onToggle:a=>l("feishu",{enabled:a}),children:[e.jsx(c,{id:"fs-appid",label:s("messengers.fields.appId"),value:t.feishu.feishu?.appId??"",onChange:a=>l("feishu",{feishu:{...t.feishu.feishu,appId:a}})}),e.jsx(c,{id:"fs-secret",label:s("messengers.fields.appSecret"),value:t.feishu.feishu?.appSecret??"",type:"password",onChange:a=>l("feishu",{feishu:{...t.feishu.feishu,appSecret:a}})}),e.jsx(c,{id:"fs-channel",label:s("messengers.fields.channelId"),value:t.feishu.feishu?.channelId??"",onChange:a=>l("feishu",{feishu:{...t.feishu.feishu,channelId:a}})})]}),e.jsxs(f,{slot:"dingtalk",label:s("messengers.platform.dingtalk"),hint:s("messengers.hint.dingtalk"),enabled:t.dingtalk.enabled,onToggle:a=>l("dingtalk",{enabled:a}),children:[e.jsx(c,{id:"dt-cid",label:s("messengers.fields.clientId"),value:t.dingtalk.dingtalk?.clientId??"",onChange:a=>l("dingtalk",{dingtalk:{...t.dingtalk.dingtalk,clientId:a}})}),e.jsx(c,{id:"dt-secret",label:s("messengers.fields.clientSecret"),value:t.dingtalk.dingtalk?.clientSecret??"",type:"password",onChange:a=>l("dingtalk",{dingtalk:{...t.dingtalk.dingtalk,clientSecret:a}})}),e.jsx(c,{id:"dt-channel",label:s("messengers.fields.channelId"),value:t.dingtalk.dingtalk?.channelId??"",onChange:a=>l("dingtalk",{dingtalk:{...t.dingtalk.dingtalk,channelId:a}})})]}),e.jsxs(f,{slot:"discord",label:s("messengers.platform.discord"),hint:s("messengers.hint.discord"),enabled:t.discord.enabled,onToggle:a=>l("discord",{enabled:a}),children:[e.jsx(c,{id:"dc-token",label:s("messengers.fields.botToken"),value:t.discord.discord?.botToken??"",type:"password",onChange:a=>l("discord",{discord:{...t.discord.discord,botToken:a}})}),e.jsx(c,{id:"dc-channel",label:s("messengers.fields.channelId"),value:t.discord.discord?.channelId??"",onChange:a=>l("discord",{discord:{...t.discord.discord,channelId:a}})})]})]}):null,e.jsx(U,{open:j,onOpenChange:x,onConfirmed:()=>{n.refetch(),g(!1)}})]})}function f({label:s,hint:n,enabled:i,onToggle:t,children:d}){const{t:m}=N("settings");return e.jsxs("div",{className:"rounded-md border border-border bg-surface p-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:s}),e.jsx(C,{variant:i?"success":"outline",children:m(i?"messengers.enabled":"messengers.disabled")})]}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:n})]}),e.jsx("label",{className:"inline-flex items-center gap-2 text-sm",children:e.jsx("input",{type:"checkbox",checked:i,onChange:g=>t(g.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"})})]}),i&&d&&e.jsx("div",{className:"mt-3 flex flex-col gap-2",children:d})]})}function c({id:s,label:n,value:i,onChange:t,type:d="text"}){return e.jsxs("div",{className:"grid grid-cols-1 gap-1 sm:grid-cols-[180px_1fr] sm:items-center sm:gap-2",children:[e.jsx(q,{htmlFor:s,className:"text-xs text-text-dim",children:n}),e.jsx(D,{id:s,type:d,value:i,onChange:m=>t(m.target.value),autoComplete:"off",className:"font-mono text-xs"})]})}function U({open:s,onOpenChange:n,onConfirmed:i}){const{t}=N(["settings","common"]),d=L(),[m,g]=o.useState(null),[r,p]=o.useState(null),[j,x]=o.useState(null);o.useEffect(()=>{if(!s){g(null),p(null),x(null);return}let u=!0;return d.mutateAsync().then(a=>{u&&(p(a.qrImage),g(a.qrToken))}).catch(a=>{u&&x(a instanceof Error?a.message:String(a))}),()=>{u=!1}},[s]);const h=R(s?m:null).data?.status;return o.useEffect(()=>{h==="confirmed"&&(v.success(t("messengers.qr.confirmed")),i(),n(!1)),h==="expired"&&v.error(t("messengers.qr.expired"))},[h]),e.jsx(Q,{open:s,onOpenChange:n,children:e.jsxs(M,{children:[e.jsxs(E,{children:[e.jsx(F,{children:t("messengers.qr.title")}),e.jsx(z,{children:t("messengers.qr.description")})]}),e.jsx("div",{className:"flex flex-col items-center gap-3",children:d.isPending&&!r?e.jsxs(e.Fragment,{children:[e.jsx(y,{className:"h-8 w-8 animate-spin text-text-dim"}),e.jsx("p",{className:"text-sm text-text-dim",children:t("messengers.qr.starting")})]}):j?e.jsxs("p",{className:"text-sm text-danger",children:[t("messengers.qr.loadFailed"),": ",j]}):r?e.jsxs(e.Fragment,{children:[e.jsx("img",{src:r,alt:t("messengers.qr.title"),className:"rounded-md border border-border"}),h==="expired"?e.jsx("p",{className:"text-xs text-danger",children:t("messengers.qr.expired")}):e.jsx("p",{className:"text-xs text-text-dim",children:h?`· ${h} ·`:""})]}):null})]})})}export{se as default};
7
+ //# sourceMappingURL=messengers-BRV1IVGX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messengers-BRV1IVGX.js","sources":["../../node_modules/lucide-react/dist/esm/icons/qr-code.js","../../src/routes/settings/messengers.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst QrCode = createLucideIcon(\"QrCode\", [\n [\"rect\", { width: \"5\", height: \"5\", x: \"3\", y: \"3\", rx: \"1\", key: \"1tu5fj\" }],\n [\"rect\", { width: \"5\", height: \"5\", x: \"16\", y: \"3\", rx: \"1\", key: \"1v8r4q\" }],\n [\"rect\", { width: \"5\", height: \"5\", x: \"3\", y: \"16\", rx: \"1\", key: \"1x03jg\" }],\n [\"path\", { d: \"M21 16h-3a2 2 0 0 0-2 2v3\", key: \"177gqh\" }],\n [\"path\", { d: \"M21 21v.01\", key: \"ents32\" }],\n [\"path\", { d: \"M12 7v3a2 2 0 0 1-2 2H7\", key: \"8crl2c\" }],\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M12 3h.01\", key: \"n36tog\" }],\n [\"path\", { d: \"M12 16v.01\", key: \"133mhm\" }],\n [\"path\", { d: \"M16 12h1\", key: \"1slzba\" }],\n [\"path\", { d: \"M21 12v.01\", key: \"1lwtk9\" }],\n [\"path\", { d: \"M12 21v-1\", key: \"1880an\" }]\n]);\n\nexport { QrCode as default };\n//# sourceMappingURL=qr-code.js.map\n","/**\n * /settings/messengers — per-IM-platform connection config.\n *\n * Layout: one card per platform (WeChat / Telegram / Feishu /\n * DingTalk / Discord). Each card has:\n * * Title + hint\n * * Enable / disable toggle (reads / writes config.messengers[])\n * * When enabled, the platform's config fields (texted)\n * * For WeChat: a \"Scan QR\" button → modal with QR + 2s polling\n *\n * Save All button at the top batches every dirty platform into one\n * PUT /api/config. The discard button reverts the local draft to\n * server-side values.\n *\n * The WeChat QR flow is special: enabling WeChat requires scanning\n * a QR code (the slot in config.messengers gets added by the\n * backend on `confirmed`, so we just open the modal and re-fetch\n * config after a successful scan).\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, QrCode, RefreshCcw, Save, X } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog'\nimport {\n useConfig,\n useUpdateConfig,\n useStartWechatQr,\n useWechatQrStatus,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { AppConfig } from '@/types/api'\n\n/** Slot names match what `config.messengers[]` contains.\n * WeChat uses 'wechat-ilink' (the iLink adapter ID). */\ntype Slot = 'wechat-ilink' | 'telegram' | 'feishu' | 'dingtalk' | 'discord'\n\ninterface PlatformDraft {\n enabled: boolean\n telegram?: { botToken?: string; channelId?: string }\n feishu?: { appId?: string; appSecret?: string; channelId?: string }\n dingtalk?: { clientId?: string; clientSecret?: string; channelId?: string }\n discord?: { botToken?: string; channelId?: string }\n}\n\ntype Draft = Record<Slot, PlatformDraft>\n\nfunction buildDraft(cfg: AppConfig | undefined): Draft {\n const m = new Set(cfg?.messengers ?? [])\n return {\n 'wechat-ilink': { enabled: m.has('wechat-ilink') },\n telegram: { enabled: m.has('telegram'), telegram: { ...(cfg?.telegram ?? {}) } },\n feishu: { enabled: m.has('feishu'), feishu: { ...(cfg?.feishu ?? {}) } },\n dingtalk: { enabled: m.has('dingtalk'), dingtalk: { ...(cfg?.dingtalk ?? {}) } },\n discord: { enabled: m.has('discord'), discord: { ...(cfg?.discord ?? {}) } },\n }\n}\n\nfunction buildPatch(draft: Draft, cfg: AppConfig): Partial<AppConfig> {\n const messengers: string[] = []\n for (const k of Object.keys(draft) as Slot[]) if (draft[k].enabled) messengers.push(k)\n return {\n messengers,\n telegram: draft.telegram.telegram,\n feishu: draft.feishu.feishu,\n dingtalk: draft.dingtalk.dingtalk,\n discord: draft.discord.discord,\n // Preserve unknown extra fields the AppConfig type permits.\n ...Object.fromEntries(\n Object.entries(cfg).filter(([k]) => ![\n 'messengers', 'telegram', 'feishu', 'dingtalk', 'discord',\n ].includes(k)),\n ),\n }\n}\n\nexport default function SettingsMessengersRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const cfgQuery = useConfig()\n const updateCfg = useUpdateConfig()\n\n const [draft, setDraft] = useState<Draft>(() => buildDraft(cfgQuery.data))\n // Sync the draft once cfg lands. We don't re-sync on every cfg\n // refetch — that would discard unsaved edits.\n const [synced, setSynced] = useState(false)\n useEffect(() => {\n if (synced) return\n if (!cfgQuery.data) return\n setDraft(buildDraft(cfgQuery.data))\n setSynced(true)\n }, [cfgQuery.data, synced])\n\n const cfg = cfgQuery.data\n const isDirty = useMemo(() => {\n if (!cfg) return false\n return JSON.stringify(buildDraft(cfg)) !== JSON.stringify(draft)\n }, [cfg, draft])\n\n // WeChat QR modal state\n const [qrOpen, setQrOpen] = useState(false)\n\n function patchSlot(slot: Slot, partial: Partial<PlatformDraft>): void {\n setDraft((prev) => ({ ...prev, [slot]: { ...prev[slot], ...partial } }))\n }\n\n async function onSave(): Promise<void> {\n if (!cfg) return\n try {\n await updateCfg.mutateAsync(buildPatch(draft, cfg))\n toast.success(t('messengers.savedToast'))\n setSynced(false) // rebuild draft from refreshed cfg on next paint\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onDiscard(): void {\n if (cfg) setDraft(buildDraft(cfg))\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('messengers.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => cfgQuery.refetch()}\n disabled={cfgQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {cfgQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('messengers.subtitle')}</p>\n </header>\n\n {/* Save bar */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {isDirty ? (\n <>\n <Badge variant=\"info\">{t('messengers.dirtyHint')}</Badge>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={updateCfg.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('messengers.discardAll')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateCfg.isPending}\n >\n {updateCfg.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {updateCfg.isPending ? t('messengers.saving') : t('messengers.saveAll')}\n </Button>\n </>\n ) : (\n <span className=\"text-xs text-text-muted\">{t('env.noChanges')}</span>\n )}\n </div>\n\n {cfgQuery.isLoading ? (\n <div className=\"h-96 rounded-md bg-surface-2 animate-pulse\" />\n ) : !cfg ? null : (\n <div className=\"flex flex-col gap-3\">\n <PlatformCard\n slot=\"wechat-ilink\"\n label={t('messengers.platform.wechat')}\n hint={t('messengers.hint.wechat')}\n enabled={draft['wechat-ilink'].enabled}\n onToggle={(v) => patchSlot('wechat-ilink', { enabled: v })}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setQrOpen(true)}\n >\n <QrCode className=\"h-4 w-4\" />\n {t('messengers.scanQr')}\n </Button>\n </PlatformCard>\n\n <PlatformCard\n slot=\"telegram\"\n label={t('messengers.platform.telegram')}\n hint={t('messengers.hint.telegram')}\n enabled={draft.telegram.enabled}\n onToggle={(v) => patchSlot('telegram', { enabled: v })}\n >\n <FieldRow\n id=\"tg-token\" label={t('messengers.fields.botToken')}\n value={draft.telegram.telegram?.botToken ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('telegram', { telegram: { ...draft.telegram.telegram, botToken: v } })}\n />\n <FieldRow\n id=\"tg-channel\" label={t('messengers.fields.channelId')}\n value={draft.telegram.telegram?.channelId ?? ''}\n onChange={(v) => patchSlot('telegram', { telegram: { ...draft.telegram.telegram, channelId: v } })}\n />\n </PlatformCard>\n\n <PlatformCard\n slot=\"feishu\"\n label={t('messengers.platform.feishu')}\n hint={t('messengers.hint.feishu')}\n enabled={draft.feishu.enabled}\n onToggle={(v) => patchSlot('feishu', { enabled: v })}\n >\n <FieldRow\n id=\"fs-appid\" label={t('messengers.fields.appId')}\n value={draft.feishu.feishu?.appId ?? ''}\n onChange={(v) => patchSlot('feishu', { feishu: { ...draft.feishu.feishu, appId: v } })}\n />\n <FieldRow\n id=\"fs-secret\" label={t('messengers.fields.appSecret')}\n value={draft.feishu.feishu?.appSecret ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('feishu', { feishu: { ...draft.feishu.feishu, appSecret: v } })}\n />\n <FieldRow\n id=\"fs-channel\" label={t('messengers.fields.channelId')}\n value={draft.feishu.feishu?.channelId ?? ''}\n onChange={(v) => patchSlot('feishu', { feishu: { ...draft.feishu.feishu, channelId: v } })}\n />\n </PlatformCard>\n\n <PlatformCard\n slot=\"dingtalk\"\n label={t('messengers.platform.dingtalk')}\n hint={t('messengers.hint.dingtalk')}\n enabled={draft.dingtalk.enabled}\n onToggle={(v) => patchSlot('dingtalk', { enabled: v })}\n >\n <FieldRow\n id=\"dt-cid\" label={t('messengers.fields.clientId')}\n value={draft.dingtalk.dingtalk?.clientId ?? ''}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, clientId: v } })}\n />\n <FieldRow\n id=\"dt-secret\" label={t('messengers.fields.clientSecret')}\n value={draft.dingtalk.dingtalk?.clientSecret ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, clientSecret: v } })}\n />\n <FieldRow\n id=\"dt-channel\" label={t('messengers.fields.channelId')}\n value={draft.dingtalk.dingtalk?.channelId ?? ''}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, channelId: v } })}\n />\n </PlatformCard>\n\n <PlatformCard\n slot=\"discord\"\n label={t('messengers.platform.discord')}\n hint={t('messengers.hint.discord')}\n enabled={draft.discord.enabled}\n onToggle={(v) => patchSlot('discord', { enabled: v })}\n >\n <FieldRow\n id=\"dc-token\" label={t('messengers.fields.botToken')}\n value={draft.discord.discord?.botToken ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('discord', { discord: { ...draft.discord.discord, botToken: v } })}\n />\n <FieldRow\n id=\"dc-channel\" label={t('messengers.fields.channelId')}\n value={draft.discord.discord?.channelId ?? ''}\n onChange={(v) => patchSlot('discord', { discord: { ...draft.discord.discord, channelId: v } })}\n />\n </PlatformCard>\n </div>\n )}\n\n <WechatQrDialog\n open={qrOpen}\n onOpenChange={setQrOpen}\n onConfirmed={() => { void cfgQuery.refetch(); setSynced(false) }}\n />\n </div>\n )\n}\n\ninterface PlatformCardProps {\n slot: Slot\n label: string\n hint: string\n enabled: boolean\n onToggle: (v: boolean) => void\n children?: React.ReactNode\n}\n\nfunction PlatformCard({ label, hint, enabled, onToggle, children }: PlatformCardProps): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <div className=\"rounded-md border border-border bg-surface p-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-text\">{label}</span>\n <Badge variant={enabled ? 'success' : 'outline'}>\n {enabled ? t('messengers.enabled') : t('messengers.disabled')}\n </Badge>\n </div>\n <p className=\"mt-1 text-xs text-text-dim\">{hint}</p>\n </div>\n <label className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n </label>\n </div>\n {enabled && children && (\n <div className=\"mt-3 flex flex-col gap-2\">\n {children}\n </div>\n )}\n </div>\n )\n}\n\ninterface FieldRowProps {\n id: string\n label: string\n value: string\n onChange: (v: string) => void\n type?: 'text' | 'password'\n}\n\nfunction FieldRow({ id, label, value, onChange, type = 'text' }: FieldRowProps): JSX.Element {\n return (\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[180px_1fr] sm:items-center sm:gap-2\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n autoComplete=\"off\"\n className=\"font-mono text-xs\"\n />\n </div>\n )\n}\n\ninterface WechatQrDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onConfirmed: () => void\n}\n\nfunction WechatQrDialog({ open, onOpenChange, onConfirmed }: WechatQrDialogProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const start = useStartWechatQr()\n const [token, setToken] = useState<string | null>(null)\n const [qrImage, setQrImage] = useState<string | null>(null)\n const [startError, setStartError] = useState<string | null>(null)\n\n // Kick off the start mutation each time the dialog opens; reset on close.\n useEffect(() => {\n if (!open) {\n setToken(null)\n setQrImage(null)\n setStartError(null)\n return\n }\n let active = true\n start.mutateAsync().then((r) => {\n if (!active) return\n setQrImage(r.qrImage)\n setToken(r.qrToken)\n }).catch((err) => {\n if (!active) return\n setStartError(err instanceof Error ? err.message : String(err))\n })\n return () => { active = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n const statusQuery = useWechatQrStatus(open ? token : null)\n const status = statusQuery.data?.status\n\n useEffect(() => {\n if (status === 'confirmed') {\n toast.success(t('messengers.qr.confirmed'))\n onConfirmed()\n onOpenChange(false)\n }\n if (status === 'expired') {\n toast.error(t('messengers.qr.expired'))\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [status])\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t('messengers.qr.title')}</DialogTitle>\n <DialogDescription>{t('messengers.qr.description')}</DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col items-center gap-3\">\n {start.isPending && !qrImage ? (\n <>\n <Loader2 className=\"h-8 w-8 animate-spin text-text-dim\" />\n <p className=\"text-sm text-text-dim\">{t('messengers.qr.starting')}</p>\n </>\n ) : startError ? (\n <p className=\"text-sm text-danger\">{t('messengers.qr.loadFailed')}: {startError}</p>\n ) : qrImage ? (\n <>\n <img\n src={qrImage}\n alt={t('messengers.qr.title')}\n className=\"rounded-md border border-border\"\n />\n {status === 'expired'\n ? <p className=\"text-xs text-danger\">{t('messengers.qr.expired')}</p>\n : <p className=\"text-xs text-text-dim\">{status ? `· ${status} ·` : ''}</p>}\n </>\n ) : null}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"],"names":["QrCode","createLucideIcon","buildDraft","cfg","m","buildPatch","draft","messengers","k","SettingsMessengersRoute","t","useTranslation","cfgQuery","useConfig","updateCfg","useUpdateConfig","setDraft","useState","synced","setSynced","useEffect","isDirty","useMemo","qrOpen","setQrOpen","patchSlot","slot","partial","prev","onSave","toast","err","describeError","onDiscard","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","Badge","X","Save","PlatformCard","v","FieldRow","WechatQrDialog","label","hint","enabled","onToggle","children","e","id","value","onChange","type","Label","Input","open","onOpenChange","onConfirmed","start","useStartWechatQr","token","setToken","qrImage","setQrImage","startError","setStartError","active","r","status","useWechatQrStatus","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as e}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const h=e("Network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);export{h as N};
7
+ //# sourceMappingURL=network-DtCI2ZUU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-DtCI2ZUU.js","sources":["../../node_modules/lucide-react/dist/esm/icons/network.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Network = createLucideIcon(\"Network\", [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n]);\n\nexport { Network as default };\n//# sourceMappingURL=network.js.map\n"],"names":["Network","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAUC,EAAiB,UAAW,CAC1C,CAAC,OAAQ,CAAE,EAAG,KAAM,EAAG,KAAM,MAAO,IAAK,OAAQ,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC9E,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,KAAM,MAAO,IAAK,OAAQ,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC7E,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,IAAK,OAAQ,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC5E,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAQ,CAAE,EAC1E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as L,aa as E,a9 as P,q as m,ac as A,ab as D,Q as t,c as j,i as M,L as N,S as q,l as F,m as Q,j as z,k as y,I as B,a2 as v,z as K,r as V}from"./index-CpGWCLE5.js";import{e as w}from"./react-C9F3QeMB.js";import{D as J}from"./data-table--I_ktDF4.js";import{E as U}from"./empty-state-DXNa90pP.js";import{S as $}from"./status-badge-CsdJ6k8Q.js";import{C as H}from"./confirm-dialog-Baz_xFle.js";import{u as C}from"./useQuery-BTyugXYV.js";import{L as Y}from"./loader-circle-JaKY-xMt.js";import{R as G}from"./refresh-ccw-Bx817_KW.js";import"./table-vmLMgj6_.js";import"./dialog-DZpoEskO.js";import"./x-Ru3rHT82.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const W=L("Inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]),h={all:["outbox"],list:e=>["outbox","list",e],stats:["outbox","stats"]};function X(e){return C({queryKey:h.list(e),queryFn:()=>m.listOutbox(e),refetchInterval:5e3,refetchIntervalInBackground:!1})}function Z(){return C({queryKey:h.stats,queryFn:()=>m.getOutboxStats(),refetchInterval:1e4,refetchIntervalInBackground:!1})}function ee(){const e=E();return P({mutationFn:a=>m.retryOutbox(a),onSuccess:()=>e.invalidateQueries({queryKey:h.all})})}const te=["pending","delivered","giving_up"];function be(){const{t:e}=A(["tasks","common"]),[a,r]=D(),l=a.get("status")??null,i=a.get("thread")??"",{data:_,isLoading:O,isFetching:f,refetch:k}=X({...l?{status:l}:{},...i?{thread:i}:{},limit:200}),I=_?.rows??[],o=Z().data,c=ee(),[d,p]=w.useState(null);function b(s){const n=new URLSearchParams(a);for(const[g,u]of Object.entries(s))u==null||u===""?n.delete(g):n.set(g,u);r(n,{replace:!0})}async function R(){if(d!=null)try{await c.mutateAsync(d),v.success(e("states.saved",{ns:"common"}))}catch(s){const{message:n}=K(s,e);throw v.error(n),s}}const T=w.useMemo(()=>[{id:"id",header:e("outbox.col.id"),cell:s=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",s.id]}),headClassName:"w-20"},{id:"status",header:e("outbox.col.status"),cell:s=>t.jsx($,{status:s.status,children:e(`outbox.status.${s.status}`,{defaultValue:s.status})}),headClassName:"w-28"},{id:"platform",header:e("outbox.col.platform"),cell:s=>t.jsx("span",{className:"font-medium",children:s.platform}),headClassName:"w-28"},{id:"preview",header:e("outbox.col.preview"),cell:s=>t.jsx("span",{className:"line-clamp-2 text-text",title:s.payload,children:ae(s.payload,s.kind)}),asCardTitle:!0},{id:"thread",header:e("outbox.col.thread"),cell:s=>t.jsx("span",{className:"font-mono text-xs text-text-dim line-clamp-1",title:s.thread_key,children:s.thread_key}),headClassName:"w-44",hideOnMobile:!0},{id:"kind",header:e("outbox.col.kind"),cell:s=>t.jsx("span",{className:"text-text-dim",children:s.kind}),headClassName:"w-20",hideOnMobile:!0},{id:"attempts",header:e("outbox.col.attempts"),cell:s=>t.jsx("span",{className:"tabular-nums",children:s.attempts}),headClassName:"w-20"},{id:"createdAt",header:e("outbox.col.createdAt"),cell:s=>t.jsx("span",{className:"text-text-dim",children:S(s.created_at)}),headClassName:"w-32",hideOnMobile:!0},{id:"lastError",header:e("outbox.col.lastError"),cell:s=>s.last_error?t.jsx("span",{className:"line-clamp-1 text-danger text-xs",title:s.last_error,children:s.last_error}):t.jsx("span",{className:"text-text-muted",children:"—"}),hideOnMobile:!1},{id:"actions",header:"",cell:s=>s.status==="giving_up"?t.jsxs(j,{variant:"outline",size:"sm",onClick:n=>{n.stopPropagation(),p(s.id)},disabled:c.isPending,children:[t.jsx(M,{className:"h-3 w-3"}),e("outbox.action.retry")]}):null,headClassName:"w-28"}],[e,c.isPending]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("outbox.title")}),t.jsxs(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>k(),disabled:f,"aria-label":e("actions.refresh",{ns:"common"}),children:[f?t.jsx(Y,{className:"h-4 w-4 animate-spin"}):t.jsx(G,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("outbox.subtitle")})]}),o&&t.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[t.jsx(x,{label:e("outbox.stats.pending"),value:o.pending,tone:"info"}),t.jsx(x,{label:e("outbox.stats.giving_up"),value:o.giving_up,tone:"danger"}),t.jsx(x,{label:e("outbox.stats.delivered"),value:o.delivered,tone:"success"}),t.jsxs("div",{className:"rounded-md border border-border bg-surface px-3 py-2",children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e("outbox.stats.lastDelivered")}),t.jsx("div",{className:"text-sm font-medium tabular-nums",children:o.lastDeliveredAt?S(o.lastDeliveredAt):"—"})]})]}),t.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx(N,{htmlFor:"status-filter",className:"text-xs text-text-dim",children:e("outbox.filter.status")}),t.jsxs(q,{value:l??"__any__",onValueChange:s=>b({status:s==="__any__"?null:s}),children:[t.jsx(F,{id:"status-filter",className:"w-[160px]",children:t.jsx(Q,{})}),t.jsxs(z,{children:[t.jsx(y,{value:"__any__",children:e("outbox.filter.statusAny")}),te.map(s=>t.jsx(y,{value:s,children:e(`outbox.status.${s}`,{defaultValue:s})},s))]})]})]}),t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx(N,{htmlFor:"thread-filter",className:"text-xs text-text-dim",children:e("outbox.filter.thread")}),t.jsx(B,{id:"thread-filter",value:i,onChange:s=>b({thread:s.target.value}),placeholder:"wechat:room:...",className:"w-72 font-mono text-xs"})]})]}),t.jsx(J,{columns:T,rows:I,getRowId:s=>String(s.id),loading:O,emptyState:t.jsx(U,{icon:t.jsx(W,{}),title:e("outbox.empty.title"),description:e("outbox.empty.description")})}),t.jsx(H,{open:d!=null,onOpenChange:s=>{s||p(null)},title:e("outbox.action.confirmRetry"),description:e("outbox.action.confirmRetryDesc"),confirmLabel:e("outbox.action.retry"),onConfirm:R})]})}const se={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function x({label:e,value:a,tone:r}){return t.jsxs("div",{className:V("rounded-md border bg-surface px-3 py-2",se[r]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:a})]})}function ae(e,a){if(!e)return"—";if(a==="text")return e;try{const r=JSON.parse(e),l=r.text??r.message??r.title??r.body??null;return typeof l=="string"&&l.length>0?l:JSON.stringify(r)}catch{return e}}function S(e){if(e==null)return"—";try{const a=new Date(e);return Number.isNaN(a.getTime())?e:a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{be as default};
7
+ //# sourceMappingURL=outbox-CxUbMp6o.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-CxUbMp6o.js","sources":["../../node_modules/lucide-react/dist/esm/icons/inbox.js","../../src/hooks/use-outbox.ts","../../src/routes/tasks/outbox.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Inbox = createLucideIcon(\"Inbox\", [\n [\"polyline\", { points: \"22 12 16 12 14 15 10 15 8 12 2 12\", key: \"o97t9d\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ]\n]);\n\nexport { Inbox as default };\n//# sourceMappingURL=inbox.js.map\n","/**\n * useOutbox — react-query wrappers for the delivery queue.\n *\n * useOutbox(query) — list rows (status / thread / limit)\n * useOutboxStats() — small summary for KPI cards\n * useRetryOutbox() — retry a giving_up row by id\n *\n * The outbox isn't on the SSE bus. Routes use the react-query\n * polling fallback (5s) plus the existing SSE `job` event, which\n * effectively covers any newly-enqueued row (a job that runs to\n * completion enqueues one or more outbox rows).\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListOutboxQuery, ListOutboxResponse, OutboxStats } from '@/types/api'\n\nexport const outboxKeys = {\n all: ['outbox'] as const,\n list: (q: ListOutboxQuery) => ['outbox', 'list', q] as const,\n stats: ['outbox', 'stats'] as const,\n}\n\nexport function useOutbox(query: ListOutboxQuery) {\n return useQuery<ListOutboxResponse>({\n queryKey: outboxKeys.list(query),\n queryFn: () => api.listOutbox(query),\n refetchInterval: 5000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useOutboxStats() {\n return useQuery<OutboxStats>({\n queryKey: outboxKeys.stats,\n queryFn: () => api.getOutboxStats(),\n refetchInterval: 10000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useInvalidateOutbox() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: outboxKeys.all })\n}\n\nexport function useRetryOutbox() {\n const qc = useQueryClient()\n return useMutation({\n mutationFn: (id: number) => api.retryOutbox(id),\n onSuccess: () => qc.invalidateQueries({ queryKey: outboxKeys.all }),\n })\n}\n","/**\n * /tasks/outbox — IM-platform delivery queue. Read-mostly; the one\n * mutation is \"retry\" on rows stuck in `giving_up`. Per-row action\n * routes through ConfirmDialog so an accidental click doesn't re-\n * fire a possibly-flaky delivery against the user's IM channel.\n */\n\nimport { useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Inbox, Loader2, RefreshCcw, RotateCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport {\n useOutbox,\n useOutboxStats,\n useRetryOutbox,\n} from '@/hooks/use-outbox'\nimport type { OutboxRow, OutboxStatus } from '@/types/api'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\nconst STATUS_OPTIONS: OutboxStatus[] = ['pending', 'delivered', 'giving_up']\n\nexport default function OutboxRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const status = (params.get('status') as OutboxStatus | null) ?? null\n const thread = params.get('thread') ?? ''\n\n const { data, isLoading, isFetching, refetch } = useOutbox({\n ...(status ? { status } : {}),\n ...(thread ? { thread } : {}),\n limit: 200,\n })\n const rows = data?.rows ?? []\n const statsQuery = useOutboxStats()\n const stats = statsQuery.data\n\n const retryMut = useRetryOutbox()\n const [confirmRetryId, setConfirmRetryId] = useState<number | null>(null)\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null || v === '') next.delete(k)\n else next.set(k, v)\n }\n setParams(next, { replace: true })\n }\n\n async function onConfirmRetry(): Promise<void> {\n if (confirmRetryId == null) return\n try {\n await retryMut.mutateAsync(confirmRetryId)\n toast.success(t('states.saved', { ns: 'common' }))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n const columns: DataTableColumn<OutboxRow>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('outbox.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-20',\n },\n {\n id: 'status',\n header: t('outbox.col.status'),\n cell: (r) => (\n <StatusBadge status={r.status}>\n {t(`outbox.status.${r.status}`, { defaultValue: r.status })}\n </StatusBadge>\n ),\n headClassName: 'w-28',\n },\n {\n id: 'platform',\n header: t('outbox.col.platform'),\n cell: (r) => <span className=\"font-medium\">{r.platform}</span>,\n headClassName: 'w-28',\n },\n {\n id: 'preview',\n header: t('outbox.col.preview'),\n cell: (r) => (\n <span\n className=\"line-clamp-2 text-text\"\n title={r.payload}\n >\n {previewPayload(r.payload, r.kind)}\n </span>\n ),\n asCardTitle: true,\n },\n {\n id: 'thread',\n header: t('outbox.col.thread'),\n cell: (r) => (\n <span\n className=\"font-mono text-xs text-text-dim line-clamp-1\"\n title={r.thread_key}\n >\n {r.thread_key}\n </span>\n ),\n headClassName: 'w-44',\n hideOnMobile: true,\n },\n {\n id: 'kind',\n header: t('outbox.col.kind'),\n cell: (r) => <span className=\"text-text-dim\">{r.kind}</span>,\n headClassName: 'w-20',\n hideOnMobile: true,\n },\n {\n id: 'attempts',\n header: t('outbox.col.attempts'),\n cell: (r) => <span className=\"tabular-nums\">{r.attempts}</span>,\n headClassName: 'w-20',\n },\n {\n id: 'createdAt',\n header: t('outbox.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.created_at)}</span>,\n headClassName: 'w-32',\n hideOnMobile: true,\n },\n {\n id: 'lastError',\n header: t('outbox.col.lastError'),\n cell: (r) =>\n r.last_error ? (\n <span className=\"line-clamp-1 text-danger text-xs\" title={r.last_error}>\n {r.last_error}\n </span>\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n hideOnMobile: false,\n },\n {\n id: 'actions',\n header: '',\n cell: (r) =>\n r.status === 'giving_up' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n setConfirmRetryId(r.id)\n }}\n disabled={retryMut.isPending}\n >\n <RotateCcw className=\"h-3 w-3\" />\n {t('outbox.action.retry')}\n </Button>\n ) : null,\n headClassName: 'w-28',\n },\n ],\n [t, retryMut.isPending],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('outbox.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('outbox.subtitle')}</p>\n </header>\n\n {/* Stats strip */}\n {stats && (\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n <StatCard label={t('outbox.stats.pending')} value={stats.pending} tone=\"info\" />\n <StatCard label={t('outbox.stats.giving_up')} value={stats.giving_up} tone=\"danger\" />\n <StatCard label={t('outbox.stats.delivered')} value={stats.delivered} tone=\"success\" />\n <div className=\"rounded-md border border-border bg-surface px-3 py-2\">\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">\n {t('outbox.stats.lastDelivered')}\n </div>\n <div className=\"text-sm font-medium tabular-nums\">\n {stats.lastDeliveredAt ? formatTime(stats.lastDeliveredAt) : '—'}\n </div>\n </div>\n </div>\n )}\n\n {/* Filter row */}\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"status-filter\" className=\"text-xs text-text-dim\">\n {t('outbox.filter.status')}\n </Label>\n <Select\n value={status ?? '__any__'}\n onValueChange={(v) => patchParams({ status: v === '__any__' ? null : v })}\n >\n <SelectTrigger id=\"status-filter\" className=\"w-[160px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__any__\">{t('outbox.filter.statusAny')}</SelectItem>\n {STATUS_OPTIONS.map((s) => (\n <SelectItem key={s} value={s}>\n {t(`outbox.status.${s}`, { defaultValue: s })}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"thread-filter\" className=\"text-xs text-text-dim\">\n {t('outbox.filter.thread')}\n </Label>\n <Input\n id=\"thread-filter\"\n value={thread}\n onChange={(e) => patchParams({ thread: e.target.value })}\n placeholder=\"wechat:room:...\"\n className=\"w-72 font-mono text-xs\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Inbox />}\n title={t('outbox.empty.title')}\n description={t('outbox.empty.description')}\n />\n }\n />\n\n <ConfirmDialog\n open={confirmRetryId != null}\n onOpenChange={(open) => {\n if (!open) setConfirmRetryId(null)\n }}\n title={t('outbox.action.confirmRetry')}\n description={t('outbox.action.confirmRetryDesc')}\n confirmLabel={t('outbox.action.retry')}\n onConfirm={onConfirmRetry}\n />\n </div>\n )\n}\n\ninterface StatCardProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatCardProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatCard({ label, value, tone }: StatCardProps): JSX.Element {\n return (\n <div\n className={cn(\n 'rounded-md border bg-surface px-3 py-2',\n TONE_STYLES[tone],\n )}\n >\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-2xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\n/** Render a one-line preview of an outbox row's payload.\n *\n * Card payloads are JSON encoded by the agent. We pluck the most\n * likely \"message\" field if we can parse it; otherwise we fall back\n * to the raw string. Text payloads are returned as-is, truncated\n * by the surrounding `line-clamp-2`. */\nfunction previewPayload(payload: string, kind: string): string {\n if (!payload) return '—'\n if (kind === 'text') return payload\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>\n const text = (parsed.text ?? parsed.message ?? parsed.title ?? parsed.body ?? null) as string | null\n if (typeof text === 'string' && text.length > 0) return text\n // Fallback: serialise the object compactly so the operator still\n // sees something useful.\n return JSON.stringify(parsed)\n } catch {\n return payload\n }\n}\n\nfunction formatTime(iso: string | null): string {\n if (iso == null) return '—'\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["Inbox","createLucideIcon","outboxKeys","q","useOutbox","query","useQuery","api","useOutboxStats","useRetryOutbox","qc","useQueryClient","useMutation","id","STATUS_OPTIONS","OutboxRoute","t","useTranslation","params","setParams","useSearchParams","status","thread","data","isLoading","isFetching","refetch","rows","stats","retryMut","confirmRetryId","setConfirmRetryId","useState","patchParams","patch","next","k","v","onConfirmRetry","toast","err","message","describeError","columns","useMemo","r","jsxs","StatusBadge","jsx","previewPayload","formatTime","Button","e","RotateCcw","Loader2","RefreshCcw","StatCard","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","DataTable","EmptyState","ConfirmDialog","open","TONE_STYLES","label","value","tone","cn","payload","kind","parsed","text","iso","d"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,17 @@
1
+ import{x as d,ac as f,Q as i,S as b,l as g,m as N,j as k,k as C,c as r,r as y}from"./index-CpGWCLE5.js";import{C as S}from"./chevron-right-DmABPvoA.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const z=d("ChevronFirst",[["path",{d:"m17 18-6-6 6-6",key:"1yerx2"}],["path",{d:"M7 6v12",key:"1p53r6"}]]);/**
7
+ * @license lucide-react v0.469.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const L=d("ChevronLast",[["path",{d:"m7 18 6-6-6-6",key:"lwmzdw"}],["path",{d:"M17 6v12",key:"1o0aio"}]]);/**
12
+ * @license lucide-react v0.469.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const M=d("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);function T({page:a,totalPages:c,totalRows:s,perPage:n,perPageOptions:o,onPageChange:l,onPerPageChange:x,className:p}){const{t:e}=f("common"),m=a>1,h=a<c,u=n!==void 0&&o&&o.length>0&&x,v=n?(a-1)*n+1:null,j=n&&s!==void 0?Math.min(a*n,s):null;return i.jsxs("div",{className:y("flex flex-wrap items-center justify-between gap-3 py-2",p),role:"navigation","aria-label":e("pagination.label"),children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm text-text-dim",children:[u&&i.jsxs("div",{className:"hidden sm:flex items-center gap-2",children:[i.jsx("span",{children:e("pagination.perPage")}),i.jsxs(b,{value:String(n),onValueChange:t=>x?.(Number(t)),children:[i.jsx(g,{className:"h-8 w-[80px]",children:i.jsx(N,{})}),i.jsx(k,{children:o.map(t=>i.jsx(C,{value:String(t),children:t},t))})]})]}),s!==void 0&&v!==null&&j!==null&&i.jsx("span",{"aria-live":"polite",children:e("pagination.range",{from:s===0?0:v,to:j,total:s})})]}),i.jsxs("div",{className:"flex items-center gap-1",children:[i.jsx(r,{variant:"ghost",size:"icon","aria-label":e("pagination.firstPage"),disabled:!m,onClick:()=>l(1),className:"hidden sm:inline-flex",children:i.jsx(z,{})}),i.jsx(r,{variant:"ghost",size:"icon","aria-label":e("actions.previous"),disabled:!m,onClick:()=>l(a-1),children:i.jsx(M,{})}),i.jsx("span",{className:"px-2 text-sm tabular-nums","aria-live":"polite",children:e("pagination.pageOfTotal",{page:a,totalPages:Math.max(1,c)})}),i.jsx(r,{variant:"ghost",size:"icon","aria-label":e("actions.next"),disabled:!h,onClick:()=>l(a+1),children:i.jsx(S,{})}),i.jsx(r,{variant:"ghost",size:"icon","aria-label":e("pagination.lastPage"),disabled:!h,onClick:()=>l(c),className:"hidden sm:inline-flex",children:i.jsx(L,{})})]})]})}T.displayName="Pagination";export{T as P};
17
+ //# sourceMappingURL=pagination-CkZY8YNa.js.map