@notis_ai/cli 0.2.17 → 0.2.19

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 (395) hide show
  1. package/README.md +542 -146
  2. package/bin/check-runtime.js +15 -0
  3. package/bin/notis.js +2 -0
  4. package/config/notis_app_design_rules.json +320 -0
  5. package/config/portal-route-roots.json +45 -0
  6. package/dist/agent-hooks/notis-agent-hook.mjs +42323 -18258
  7. package/dist/base-skills/notis-cli/.notis-base-skill.json +1 -0
  8. package/dist/base-skills/notis-cli/SKILL.md +51 -280
  9. package/dist/base-skills/notis-cli/references/app-delivery.md +17 -0
  10. package/dist/base-skills/notis-cli/references/intelligence.md +94 -0
  11. package/dist/base-skills/notis-cli/references/native-databases.md +21 -0
  12. package/dist/base-skills/notis-cli/references/tool-examples.md +56 -0
  13. package/dist/base-skills/notis-cli/references/troubleshooting.md +67 -0
  14. package/dist/base-skills/notis-query/.notis-base-skill.json +1 -0
  15. package/dist/base-skills/notis-query/SKILL.md +35 -699
  16. package/dist/base-skills/notis-query/references/database-discovery.md +59 -0
  17. package/dist/base-skills/notis-query/references/documents.md +74 -0
  18. package/dist/base-skills/notis-query/references/query.md +76 -0
  19. package/dist/base-skills/notis-spaces/.notis-base-skill.json +1 -0
  20. package/dist/base-skills/notis-spaces/SKILL.md +218 -0
  21. package/dist/base-skills/notis-spaces/references/architecture.md +116 -0
  22. package/dist/base-skills/notis-spaces/references/context.md +81 -0
  23. package/dist/base-skills/notis-spaces/references/design.md +141 -0
  24. package/dist/base-skills/notis-spaces/references/fixtures.md +29 -0
  25. package/dist/base-skills/notis-spaces/references/memory.md +58 -0
  26. package/dist/base-skills/notis-spaces/references/reading.md +73 -0
  27. package/dist/base-skills/notis-spaces/references/release.md +120 -0
  28. package/dist/base-skills/notis-spaces/references/reports.md +77 -0
  29. package/dist/base-skills/notis-spaces/references/sdk.md +273 -0
  30. package/dist/base-skills/notis-spaces/references/store.md +118 -0
  31. package/dist/base-skills/notis-spaces/references/troubleshooting.md +28 -0
  32. package/dist/base-skills/notis-spaces/references/views.md +229 -0
  33. package/{template/packages → dist}/sdk/package.json +9 -10
  34. package/dist/sdk/src/agentContext.ts +36 -0
  35. package/dist/sdk/src/bundleModule.ts +175 -0
  36. package/dist/sdk/src/components/Dialog.tsx +103 -0
  37. package/dist/sdk/src/components/DocumentEditor.tsx +113 -0
  38. package/dist/sdk/src/components/DocumentPage.tsx +184 -0
  39. package/{template/packages → dist}/sdk/src/components/Markdown.tsx +9 -3
  40. package/{template/packages → dist}/sdk/src/components/MarkdownEditor.tsx +26 -5
  41. package/{template/packages → dist}/sdk/src/components/MultiSelectActionBar.tsx +95 -12
  42. package/{template/packages → dist}/sdk/src/components/MultiSelectCheckbox.tsx +4 -2
  43. package/dist/sdk/src/components/NotisCommentBoundary.tsx +172 -0
  44. package/{template/packages → dist}/sdk/src/components/NotisSelectionBoundary.tsx +9 -5
  45. package/dist/sdk/src/components/RecordComponents.tsx +111 -0
  46. package/dist/sdk/src/components/Skeleton.tsx +38 -0
  47. package/dist/sdk/src/config.ts +31 -0
  48. package/{template/packages → dist}/sdk/src/documents.ts +21 -6
  49. package/dist/sdk/src/hooks/useAction.ts +28 -0
  50. package/dist/sdk/src/hooks/useAgentContext.ts +23 -0
  51. package/{template/packages → dist}/sdk/src/hooks/useBackend.ts +3 -2
  52. package/dist/sdk/src/hooks/useCloudComputer.ts +94 -0
  53. package/dist/sdk/src/hooks/useCloudComputerShell.ts +114 -0
  54. package/{template/packages → dist}/sdk/src/hooks/useCollectionInteractions.ts +157 -147
  55. package/dist/sdk/src/hooks/useDatabaseSchema.ts +50 -0
  56. package/{template/packages → dist}/sdk/src/hooks/useDatabaseSubscription.ts +2 -2
  57. package/dist/sdk/src/hooks/useDocument.ts +51 -0
  58. package/{template/packages → dist}/sdk/src/hooks/useDocuments.ts +25 -59
  59. package/{template/packages → dist}/sdk/src/hooks/useHandover.ts +7 -7
  60. package/dist/sdk/src/hooks/useLongPressSelection.ts +79 -0
  61. package/dist/sdk/src/hooks/useMarqueeSelection.ts +194 -0
  62. package/{template/packages → dist}/sdk/src/hooks/useMultiSelect.ts +2 -8
  63. package/dist/sdk/src/hooks/useNativeDocumentBody.ts +50 -0
  64. package/dist/sdk/src/hooks/useNativeDocuments.ts +143 -0
  65. package/{template/packages → dist}/sdk/src/hooks/useNotis.ts +6 -1
  66. package/dist/sdk/src/hooks/useNotisNavigation.ts +70 -0
  67. package/dist/sdk/src/hooks/useQuery.ts +81 -0
  68. package/dist/sdk/src/hooks/useToolQuery.ts +12 -0
  69. package/dist/sdk/src/hooks/useTopBarSearch.ts +102 -0
  70. package/dist/sdk/src/hooks/useTopBarTitleLeaf.ts +75 -0
  71. package/{template/packages → dist}/sdk/src/hooks/useUpsertDocument.ts +1 -1
  72. package/dist/sdk/src/hooks/useViewParams.ts +195 -0
  73. package/dist/sdk/src/hooks/useViewerReads.ts +129 -0
  74. package/{template/packages → dist}/sdk/src/index.ts +64 -1
  75. package/{template/packages → dist}/sdk/src/interactions/actions.ts +14 -1
  76. package/{template/packages → dist}/sdk/src/interactions/shortcuts.tsx +129 -23
  77. package/dist/sdk/src/interactions/visibility.ts +13 -0
  78. package/{template/packages → dist}/sdk/src/interactions.ts +5 -1
  79. package/dist/sdk/src/nativeData.ts +39 -0
  80. package/{template/packages → dist}/sdk/src/provider.tsx +9 -4
  81. package/dist/sdk/src/queryCache.ts +292 -0
  82. package/dist/sdk/src/queryErrors.ts +51 -0
  83. package/dist/sdk/src/runtime.ts +675 -0
  84. package/dist/sdk/src/runtimeModules.ts +33 -0
  85. package/dist/sdk/src/space.ts +442 -0
  86. package/dist/sdk/src/standardViewParams.ts +36 -0
  87. package/{template/packages → dist}/sdk/src/styles.css +81 -16
  88. package/dist/sdk/src/tailwind.ts +66 -0
  89. package/dist/sdk/src/ui/charts/RenderChartData.tsx +25 -0
  90. package/dist/sdk/src/ui/engine/core.ts +392 -0
  91. package/dist/sdk/src/ui/engine/dom.ts +183 -0
  92. package/dist/sdk/src/ui/engine/hooks.ts +195 -0
  93. package/dist/sdk/src/ui/engine/instance.ts +63 -0
  94. package/dist/sdk/src/ui/engine/keycapContext.ts +2 -0
  95. package/dist/sdk/src/ui/engine/registry.ts +262 -0
  96. package/dist/sdk/src/ui/engine/types.ts +62 -0
  97. package/dist/sdk/src/ui/icons.tsx +91 -0
  98. package/dist/sdk/src/ui/util.ts +83 -0
  99. package/dist/sdk/src/viewPeriod.ts +26 -0
  100. package/dist/sdk/src/vite.ts +92 -0
  101. package/dist/sdk/src/words/actions.ts +295 -0
  102. package/dist/sdk/src/words/clashes.ts +158 -0
  103. package/dist/sdk/src/words/format.ts +136 -0
  104. package/dist/sdk/src/words/index.ts +13 -0
  105. package/dist/sdk/src/words/keymap.ts +72 -0
  106. package/dist/sdk/src/words/keys.ts +297 -0
  107. package/dist/sdk/src/words/shell.ts +46 -0
  108. package/dist/sdk/src/words/types.ts +65 -0
  109. package/dist/skill-sync/index.js +832 -151
  110. package/dist/skill-sync/index.js.map +4 -4
  111. package/dist/skill-sync-worker.mjs +3941 -0
  112. package/dist/space-harness/host.js +1460 -0
  113. package/dist/space-sdk/dist/chunk-ZSN57ATH.js +5 -0
  114. package/dist/space-sdk/dist/index.js +15 -0
  115. package/dist/space-sdk/dist/ui.js +18 -0
  116. package/dist/space-sdk/package.json +33 -0
  117. package/dist/space-sdk/src/agentContext.d.ts +36 -0
  118. package/dist/space-sdk/src/components/Dialog.d.ts +20 -0
  119. package/dist/space-sdk/src/components/DocumentEditor.d.ts +46 -0
  120. package/dist/space-sdk/src/components/DocumentPage.d.ts +53 -0
  121. package/dist/space-sdk/src/components/Markdown.d.ts +18 -0
  122. package/dist/space-sdk/src/components/MarkdownEditor.d.ts +11 -0
  123. package/dist/space-sdk/src/components/MultiSelectActionBar.d.ts +31 -0
  124. package/dist/space-sdk/src/components/MultiSelectCheckbox.d.ts +14 -0
  125. package/dist/space-sdk/src/components/MultiSelectDragOverlay.d.ts +8 -0
  126. package/dist/space-sdk/src/components/NotisCommentBoundary.d.ts +36 -0
  127. package/dist/space-sdk/src/components/NotisSelectionBoundary.d.ts +16 -0
  128. package/dist/space-sdk/src/components/RecordComponents.d.ts +64 -0
  129. package/dist/space-sdk/src/components/ShortcutHints.d.ts +12 -0
  130. package/dist/space-sdk/src/components/Skeleton.d.ts +23 -0
  131. package/dist/space-sdk/src/config.ts +31 -0
  132. package/dist/space-sdk/src/documents.d.ts +59 -0
  133. package/dist/space-sdk/src/hooks/useAction.d.ts +8 -0
  134. package/dist/space-sdk/src/hooks/useActiveResource.d.ts +3 -0
  135. package/dist/space-sdk/src/hooks/useAgentContext.d.ts +7 -0
  136. package/dist/space-sdk/src/hooks/useBackend.d.ts +23 -0
  137. package/dist/space-sdk/src/hooks/useCloudComputer.d.ts +45 -0
  138. package/dist/space-sdk/src/hooks/useCloudComputerShell.d.ts +49 -0
  139. package/dist/space-sdk/src/hooks/useCollectionInteractions.d.ts +118 -0
  140. package/dist/space-sdk/src/hooks/useDatabaseSchema.d.ts +14 -0
  141. package/dist/space-sdk/src/hooks/useDatabaseSubscription.d.ts +26 -0
  142. package/dist/space-sdk/src/hooks/useDocument.d.ts +22 -0
  143. package/dist/space-sdk/src/hooks/useDocuments.d.ts +31 -0
  144. package/dist/space-sdk/src/hooks/useHandover.d.ts +43 -0
  145. package/dist/space-sdk/src/hooks/useLongPressSelection.d.ts +9 -0
  146. package/dist/space-sdk/src/hooks/useMarqueeSelection.d.ts +57 -0
  147. package/dist/space-sdk/src/hooks/useMultiSelect.d.ts +51 -0
  148. package/dist/space-sdk/src/hooks/useNativeDocumentBody.d.ts +24 -0
  149. package/dist/space-sdk/src/hooks/useNativeDocuments.d.ts +55 -0
  150. package/dist/space-sdk/src/hooks/useNotis.d.ts +25 -0
  151. package/dist/space-sdk/src/hooks/useNotisNavigation.d.ts +33 -0
  152. package/dist/space-sdk/src/hooks/useQuery.d.ts +22 -0
  153. package/dist/space-sdk/src/hooks/useTool.d.ts +20 -0
  154. package/dist/space-sdk/src/hooks/useToolQuery.d.ts +3 -0
  155. package/dist/space-sdk/src/hooks/useTools.d.ts +15 -0
  156. package/dist/space-sdk/src/hooks/useTopBarSearch.d.ts +48 -0
  157. package/dist/space-sdk/src/hooks/useTopBarTitleLeaf.d.ts +24 -0
  158. package/dist/space-sdk/src/hooks/useUpsertDocument.d.ts +27 -0
  159. package/dist/space-sdk/src/hooks/useViewParams.d.ts +76 -0
  160. package/dist/space-sdk/src/hooks/useViewerReads.d.ts +38 -0
  161. package/dist/space-sdk/src/index.d.ts +98 -0
  162. package/dist/space-sdk/src/interactions/actions.d.ts +33 -0
  163. package/dist/space-sdk/src/interactions/shortcuts.d.ts +42 -0
  164. package/dist/space-sdk/src/interactions/visibility.d.ts +2 -0
  165. package/dist/space-sdk/src/nativeData.d.ts +66 -0
  166. package/dist/space-sdk/src/provider.d.ts +17 -0
  167. package/dist/space-sdk/src/queryCache.d.ts +45 -0
  168. package/dist/space-sdk/src/queryErrors.ts +51 -0
  169. package/dist/space-sdk/src/runtime.d.ts +615 -0
  170. package/dist/space-sdk/src/runtimeModules.ts +33 -0
  171. package/dist/space-sdk/src/space.ts +442 -0
  172. package/dist/space-sdk/src/standardViewParams.d.ts +15 -0
  173. package/dist/space-sdk/src/tailwind-candidates.d.ts +3418 -0
  174. package/dist/space-sdk/src/tailwind.ts +66 -0
  175. package/dist/space-sdk/src/ui/actions/ActionToast.d.ts +15 -0
  176. package/dist/space-sdk/src/ui/actions/actionWords.d.ts +16 -0
  177. package/dist/space-sdk/src/ui/actions/index.d.ts +7 -0
  178. package/dist/space-sdk/src/ui/actions/useActions.d.ts +69 -0
  179. package/dist/space-sdk/src/ui/actions/useToast.d.ts +41 -0
  180. package/dist/space-sdk/src/ui/blocks/Tabs.d.ts +139 -0
  181. package/dist/space-sdk/src/ui/blocks/blocks.d.ts +217 -0
  182. package/dist/space-sdk/src/ui/blocks/index.d.ts +4 -0
  183. package/dist/space-sdk/src/ui/board/BoardView.d.ts +36 -0
  184. package/dist/space-sdk/src/ui/board/boardModel.d.ts +46 -0
  185. package/dist/space-sdk/src/ui/board/boardWords.d.ts +9 -0
  186. package/dist/space-sdk/src/ui/board/index.d.ts +5 -0
  187. package/dist/space-sdk/src/ui/calendar/CalendarView.d.ts +49 -0
  188. package/dist/space-sdk/src/ui/calendar/DayPicker.d.ts +23 -0
  189. package/dist/space-sdk/src/ui/calendar/calendarMath.d.ts +81 -0
  190. package/dist/space-sdk/src/ui/charts/Chart.d.ts +203 -0
  191. package/dist/space-sdk/src/ui/charts/ChartTable.d.ts +37 -0
  192. package/dist/space-sdk/src/ui/charts/RenderChartData.d.ts +16 -0
  193. package/dist/space-sdk/src/ui/charts/StatRow.d.ts +59 -0
  194. package/dist/space-sdk/src/ui/charts/chartData.d.ts +84 -0
  195. package/dist/space-sdk/src/ui/comments/CommentPane.d.ts +58 -0
  196. package/dist/space-sdk/src/ui/comments/commentModel.d.ts +157 -0
  197. package/dist/space-sdk/src/ui/comments/commentWords.d.ts +60 -0
  198. package/dist/space-sdk/src/ui/comments/index.d.ts +4 -0
  199. package/dist/space-sdk/src/ui/comments/useComments.d.ts +146 -0
  200. package/dist/space-sdk/src/ui/engine/HelpSheet.d.ts +12 -0
  201. package/dist/space-sdk/src/ui/engine/KeyboardEngine.d.ts +27 -0
  202. package/dist/space-sdk/src/ui/engine/core.d.ts +73 -0
  203. package/dist/space-sdk/src/ui/engine/hooks.d.ts +64 -0
  204. package/dist/space-sdk/src/ui/engine/index.d.ts +14 -0
  205. package/dist/space-sdk/src/ui/engine/instance.d.ts +21 -0
  206. package/dist/space-sdk/src/ui/engine/keycapContext.d.ts +2 -0
  207. package/dist/space-sdk/src/ui/engine/registry.d.ts +77 -0
  208. package/dist/space-sdk/src/ui/engine/step.d.ts +11 -0
  209. package/dist/space-sdk/src/ui/engine/types.d.ts +54 -0
  210. package/dist/space-sdk/src/ui/fields/fieldWords.d.ts +56 -0
  211. package/dist/space-sdk/src/ui/fields/fields.d.ts +162 -0
  212. package/dist/space-sdk/src/ui/fields/index.d.ts +5 -0
  213. package/dist/space-sdk/src/ui/fields/useFieldDraft.d.ts +22 -0
  214. package/dist/space-sdk/src/ui/gallery/AttachmentGallery.d.ts +53 -0
  215. package/dist/space-sdk/src/ui/gallery/ImageViewer.d.ts +27 -0
  216. package/dist/space-sdk/src/ui/gallery/galleryWords.d.ts +95 -0
  217. package/dist/space-sdk/src/ui/gallery/index.d.ts +5 -0
  218. package/dist/space-sdk/src/ui/icons.d.ts +13 -0
  219. package/dist/space-sdk/src/ui/index.d.ts +54 -0
  220. package/dist/space-sdk/src/ui/keycap/Keycap.d.ts +22 -0
  221. package/dist/space-sdk/src/ui/keycap/index.d.ts +2 -0
  222. package/dist/space-sdk/src/ui/layout/Panels.d.ts +50 -0
  223. package/dist/space-sdk/src/ui/layout/chatPanelEdge.d.ts +77 -0
  224. package/dist/space-sdk/src/ui/layout/index.d.ts +5 -0
  225. package/dist/space-sdk/src/ui/layout/panelMath.d.ts +91 -0
  226. package/dist/space-sdk/src/ui/list/ListReader.d.ts +380 -0
  227. package/dist/space-sdk/src/ui/list/Row.d.ts +145 -0
  228. package/dist/space-sdk/src/ui/list/SelectionBar.d.ts +65 -0
  229. package/dist/space-sdk/src/ui/list/index.d.ts +14 -0
  230. package/dist/space-sdk/src/ui/list/rowState.d.ts +22 -0
  231. package/dist/space-sdk/src/ui/list/useListKeys.d.ts +89 -0
  232. package/dist/space-sdk/src/ui/list/useReorder.d.ts +86 -0
  233. package/dist/space-sdk/src/ui/list/useSelection.d.ts +90 -0
  234. package/dist/space-sdk/src/ui/open/OpenAsMenu.d.ts +15 -0
  235. package/dist/space-sdk/src/ui/open/index.d.ts +6 -0
  236. package/dist/space-sdk/src/ui/open/openModeStore.d.ts +39 -0
  237. package/dist/space-sdk/src/ui/open/useOpenMode.d.ts +17 -0
  238. package/dist/space-sdk/src/ui/overlay/Menu.d.ts +88 -0
  239. package/dist/space-sdk/src/ui/overlay/Popover.d.ts +28 -0
  240. package/dist/space-sdk/src/ui/overlay/Tooltip.d.ts +19 -0
  241. package/dist/space-sdk/src/ui/overlay/index.d.ts +9 -0
  242. package/dist/space-sdk/src/ui/overlay/layerRoot.d.ts +24 -0
  243. package/dist/space-sdk/src/ui/overlay/position.d.ts +31 -0
  244. package/dist/space-sdk/src/ui/period/PeriodPicker.d.ts +30 -0
  245. package/dist/space-sdk/src/ui/period/dateFormat.d.ts +50 -0
  246. package/dist/space-sdk/src/ui/period/dateWords.d.ts +88 -0
  247. package/dist/space-sdk/src/ui/period/periods.d.ts +70 -0
  248. package/dist/space-sdk/src/ui/period/usePeriod.d.ts +23 -0
  249. package/dist/space-sdk/src/ui/present/index.d.ts +3 -0
  250. package/dist/space-sdk/src/ui/present/presentWords.d.ts +27 -0
  251. package/dist/space-sdk/src/ui/present/screens.d.ts +36 -0
  252. package/dist/space-sdk/src/ui/present/useAudienceScreen.d.ts +38 -0
  253. package/dist/space-sdk/src/ui/styles.d.ts +21 -0
  254. package/dist/space-sdk/src/ui/timeline/TimelineView.d.ts +44 -0
  255. package/dist/space-sdk/src/ui/timeline/timelineMath.d.ts +123 -0
  256. package/dist/space-sdk/src/viewPeriod.d.ts +8 -0
  257. package/dist/space-sdk/src/vite.ts +92 -0
  258. package/dist/space-sdk/src/words/actions.ts +295 -0
  259. package/dist/space-sdk/src/words/clashes.ts +158 -0
  260. package/dist/space-sdk/src/words/format.ts +136 -0
  261. package/dist/space-sdk/src/words/index.ts +13 -0
  262. package/dist/space-sdk/src/words/keymap.ts +72 -0
  263. package/dist/space-sdk/src/words/keys.ts +297 -0
  264. package/dist/space-sdk/src/words/shell.ts +46 -0
  265. package/dist/space-sdk/src/words/types.ts +65 -0
  266. package/dist/view-renderer/dist/host.css +1 -0
  267. package/dist/view-renderer/dist/host.js +2374 -0
  268. package/dist/view-renderer/dist/theme.css +73 -0
  269. package/dist/view-renderer/src/dom.js +212 -0
  270. package/dist/view-renderer/src/errors.js +8 -0
  271. package/dist/view-renderer/src/host.tsx +250 -0
  272. package/dist/view-renderer/src/index.js +4 -0
  273. package/dist/view-renderer/src/png.js +213 -0
  274. package/dist/view-renderer/src/pool.js +110 -0
  275. package/dist/view-renderer/src/remote-broker.js +59 -0
  276. package/dist/view-renderer/src/renderer.js +271 -0
  277. package/package.json +21 -11
  278. package/skills/notis-cli/AGENT_INSTRUCTIONS.md +63 -12
  279. package/skills/notis-onboarding/BRIEF.md +14 -9
  280. package/skills/notis-query/cli.md +1 -1
  281. package/skills/notis-spaces/cli.md +540 -0
  282. package/src/cli.js +8 -8
  283. package/src/command-specs/agents.js +121 -8
  284. package/src/command-specs/auth.js +3 -3
  285. package/src/command-specs/diagnostics.js +97 -20
  286. package/src/command-specs/documents.js +158 -0
  287. package/src/command-specs/files.js +29 -0
  288. package/src/command-specs/handover.js +331 -79
  289. package/src/command-specs/helpers.js +50 -40
  290. package/src/command-specs/index.js +14 -5
  291. package/src/command-specs/meta.js +38 -9
  292. package/src/command-specs/onboarding.js +1 -1
  293. package/src/command-specs/profile.js +42 -1
  294. package/src/command-specs/skills.js +314 -9
  295. package/src/command-specs/smoke.js +16 -4
  296. package/src/command-specs/spaces.js +783 -0
  297. package/src/command-specs/tools.js +118 -21
  298. package/src/command-specs/version-history.js +20 -0
  299. package/src/command-specs/views.js +69 -0
  300. package/src/runtime/agent-browser.js +178 -267
  301. package/src/runtime/agent-setup.js +172 -13
  302. package/src/runtime/app-boundary-validator.js +338 -2
  303. package/src/runtime/app-data-literals.js +82 -0
  304. package/src/runtime/app-platform.js +750 -1568
  305. package/src/runtime/auth-recovery.js +17 -0
  306. package/src/runtime/base-skills.d.ts +11 -0
  307. package/src/runtime/base-skills.js +100 -3
  308. package/src/runtime/computer-identity.d.ts +30 -0
  309. package/src/runtime/computer-identity.js +151 -0
  310. package/src/runtime/config-lock.js +135 -0
  311. package/src/runtime/confined-space-build.js +74 -0
  312. package/src/runtime/confined-space-verify.js +49 -0
  313. package/src/runtime/delegated-context.js +5 -21
  314. package/src/runtime/native-record-files.js +47 -0
  315. package/src/runtime/oauth.js +342 -31
  316. package/src/runtime/profiles.js +19 -112
  317. package/src/runtime/retired-sdk-files.js +24 -0
  318. package/src/runtime/retry.js +150 -0
  319. package/src/runtime/skill-sync/cloud-client.ts +33 -8
  320. package/src/runtime/skill-sync/index.ts +443 -106
  321. package/src/runtime/skill-sync/local-scanner.ts +248 -32
  322. package/src/runtime/skill-sync/native-identity.ts +102 -0
  323. package/src/runtime/skill-sync/native-plan.ts +70 -0
  324. package/src/runtime/skill-sync/symlink-manager.ts +66 -16
  325. package/src/runtime/skill-sync/sync-plan.ts +34 -2
  326. package/src/runtime/skill-sync/types.ts +54 -0
  327. package/src/runtime/skill-sync/write-cloud-skill.ts +4 -4
  328. package/src/runtime/skill-sync-service.js +109 -0
  329. package/src/runtime/source-root.js +32 -0
  330. package/src/runtime/space-collection-scaffold.js +107 -0
  331. package/src/runtime/space-database-structures.js +229 -0
  332. package/src/runtime/space-fixture-broker.js +68 -0
  333. package/src/runtime/space-lock.js +337 -0
  334. package/src/runtime/space-platform.js +133 -0
  335. package/src/runtime/space-source.js +290 -0
  336. package/src/runtime/space-test-server.js +354 -0
  337. package/src/runtime/space-verification.js +94 -0
  338. package/src/runtime/space-verify-browser-worker.js +51 -0
  339. package/src/runtime/space-view-manifest.js +368 -0
  340. package/src/runtime/sync-skills.d.ts +5 -1
  341. package/src/runtime/sync-skills.js +11 -2
  342. package/src/runtime/tool-confirmation.js +138 -0
  343. package/src/runtime/transport.js +118 -24
  344. package/src/runtime/upsell.js +219 -0
  345. package/src/runtime/view-render.js +49 -0
  346. package/src/skill-sync-worker-entry.js +2 -0
  347. package/src/skill-sync-worker.js +114 -0
  348. package/src/space-harness-host.ts +122 -0
  349. package/template/.harness/index.html.tmpl +9 -352
  350. package/template/app/globals.css +29 -3
  351. package/template/app/layout.tsx +2 -6
  352. package/template/components/ui/badge.tsx +7 -4
  353. package/template/components/ui/button.tsx +1 -1
  354. package/template/components/ui/native-select.tsx +24 -0
  355. package/template/notis.config.ts +4 -36
  356. package/template/package-lock.json +1800 -1867
  357. package/template/package.json +16 -14
  358. package/template/postcss.config.mjs +1 -1
  359. package/template/tailwind.config.ts +1 -6
  360. package/template/tsconfig.json +1 -0
  361. package/template/vite.config.ts +2 -2
  362. package/dist/base-skills/notis-apps/SKILL.md +0 -613
  363. package/skills/notis-apps/cli.md +0 -285
  364. package/src/command-specs/apps.js +0 -3000
  365. package/src/runtime/app-changelog.js +0 -79
  366. package/src/runtime/app-dev-consumers.js +0 -154
  367. package/src/runtime/app-dev-host-lock.js +0 -80
  368. package/src/runtime/app-dev-process-identity.js +0 -111
  369. package/src/runtime/app-dev-roots.js +0 -284
  370. package/src/runtime/app-dev-server.js +0 -1140
  371. package/src/runtime/app-dev-sessions.js +0 -185
  372. package/src/runtime/app-registry-scaffolds.js +0 -367
  373. package/src/runtime/assets/store-screenshot-dark.png +0 -0
  374. package/src/runtime/cli-mode.generated.js +0 -5
  375. package/src/runtime/cli-mode.js +0 -34
  376. package/src/runtime/store-screenshot.js +0 -143
  377. package/template/CHANGELOG.md +0 -5
  378. package/template/app/page.tsx +0 -60
  379. package/template/components/ui/card.tsx +0 -56
  380. package/template/packages/sdk/src/components/DocumentEditor.tsx +0 -103
  381. package/template/packages/sdk/src/config.ts +0 -259
  382. package/template/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  383. package/template/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  384. package/template/packages/sdk/src/hooks/useDocument.ts +0 -78
  385. package/template/packages/sdk/src/hooks/useNotisNavigation.ts +0 -52
  386. package/template/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  387. package/template/packages/sdk/src/runtime.ts +0 -439
  388. package/template/packages/sdk/src/vite.ts +0 -56
  389. package/template/packages/sdk/tsconfig.json +0 -15
  390. /package/{template/packages → dist}/sdk/src/components/MultiSelectDragOverlay.tsx +0 -0
  391. /package/{template/packages → dist}/sdk/src/components/ShortcutHints.tsx +0 -0
  392. /package/{template/packages → dist}/sdk/src/hooks/useActiveResource.ts +0 -0
  393. /package/{template/packages → dist}/sdk/src/hooks/useTool.ts +0 -0
  394. /package/{template/packages → dist}/sdk/src/hooks/useTools.ts +0 -0
  395. /package/{template/packages → dist}/sdk/src/ui.ts +0 -0
@@ -0,0 +1,18 @@
1
+ // Generated by packages/cli/scripts/build-space-sdk.js for Node tests only. A Space view always uses the Notis host SDK.
2
+ import{DEFAULT_KEYMAP,Dialog,ESCAPE_PRIORITY,HELP_WORDS,Icon,KEY_JOIN_WORDS,KeyboardEngineCore,MultiSelectDragOverlay,NNBSP,NotisKeyClash,ROOT_OWNER,RenderChartData,SEQUENCE_TIMEOUT_MS,SHELL_WORDS,STANDARD_ACTIONS,ShortcutRegistry,__export,actionErrorReason,canonicalKey,closestComposed,containsComposed,cx,deepActiveElement,detectLocale,detectPlatform,eventTarget,eventWithin,fillWords,flag,formatKey,formatKeyParts,formatKeySpoken,getSharedInstance,hasIcon,isSequenceSpec,isStandardActionId,isValidKeySpec,isVisibleComposed,isWords,keyFingerprints,keyList,keysOff,matchChord,matchKey,modalLayerOf,openModalLayers,pick,renderIcon,resolveActionRef,revealInline,safeWhen,selectedCount,selfClashes,toAriaKeyShortcuts,toWords,useEngineCore,useEscapeBlocker,useEscapeLayer,useHelpSheet,useIsoLayoutEffect,useLabelValue,useLatest,useMarqueeSelection,useNativeMutation,useNotisRuntime,useRegistryVersion,useShortcut,useShortcutOwner,useShortcutScope,useShortcuts2 as useShortcuts,useShown,useStableId,useT,useToolkitLocale,useToolkitPlatform,useToolkitSettings,useTopBarSearch,useTopBarTitleLeaf,w,writeViewParams}from"./chunk-ZSN57ATH.js";import{createContext as createContext2,useCallback,useContext as useContext3,useEffect as useEffect3,useId,useLayoutEffect as useLayoutEffect2,useMemo,useRef as useRef2,useState}from"react";import{useEffect,useLayoutEffect}from"react";import{Fragment,jsx}from"react/jsx-runtime";var useIsoLayoutEffect2=typeof window>"u"?useEffect:useLayoutEffect;function KeyboardEngine(props){let shared=getSharedInstance(),core=props.engine??shared.core,{host,locale,platform,strict,onClash}=props;core.configure({host,locale,platform,strict,onClash},{silent:!0}),useIsoLayoutEffect2(()=>{core.registry.notify()},[core,host,locale,platform,strict]),useIsoLayoutEffect2(()=>(core.mounted+=1,core.registry.notify(),()=>{core.mounted-=1,core.registry.notify()}),[core]);let doc=props.document??(typeof document<"u"?document:void 0);useEffect(()=>doc?core.attach(doc):void 0,[core,doc]);let content=props.children??null;return props.engine?jsx(shared.EngineContext.Provider,{value:props.engine,children:content}):jsx(Fragment,{children:content})}function ShortcutScope({owner,available,kind,children}){let{OwnerContext}=getSharedInstance();return useShortcutScope(owner,{available,kind}),jsx(OwnerContext.Provider,{value:owner,children})}import{useEffect as useEffect2,useRef}from"react";import{createPortal}from"react-dom";import{Fragment as Fragment2,useContext}from"react";import{jsx as jsx2,jsxs}from"react/jsx-runtime";function Keycap({keys,on,className}){let locale=useToolkitLocale(),platform=useToolkitPlatform(),inherited=useContext(getSharedInstance().KeycapContext),surface=on??inherited??"surface",options={platform,locale},alternatives=formatKeyParts(keys,options);if(!alternatives.length)return null;let then=KEY_JOIN_WORDS.then[locale],or=KEY_JOIN_WORDS.or[locale];return jsxs("span",{className:className?`nui-kbd-group ${className}`:"nui-kbd-group","data-on":surface,children:[jsx2("span",{className:"nui-kbd-caps","aria-hidden":"true",children:alternatives.map((caps,i)=>jsxs(Fragment2,{children:[i>0&&jsx2("span",{className:"nui-kbd-sep",children:or}),caps.map((cap,j)=>jsxs(Fragment2,{children:[j>0&&jsx2("span",{className:"nui-kbd-sep",children:then}),jsx2("kbd",{className:"nui-kbd",children:cap})]},j))]},i))}),jsx2("span",{className:"nui-sr-only",children:formatKeySpoken(keys,options)})]})}function KeycapSurface({on,children}){let{KeycapContext}=getSharedInstance();return jsx2(KeycapContext.Provider,{value:on,children})}function useKeyLabel(keys){let locale=useToolkitLocale(),platform=useToolkitPlatform();return formatKey(keys,{platform,locale})}import{createContext,useContext as useContext2}from"react";import{jsx as jsx3}from"react/jsx-runtime";var LAYER_ROOT_ATTRIBUTE="data-notis-layer-root",LayerRootContext=createContext(null);function LayerRootProvider({root,children}){return jsx3(LayerRootContext.Provider,{value:root,children})}function findLayerRoot(from){if(typeof document>"u")return null;let dialog=(from?.nodeType===1?from:from?.parentElement)?.closest("dialog[open]");if(dialog){let existing=Array.from(dialog.children).find(child=>child.hasAttribute(LAYER_ROOT_ATTRIBUTE));if(existing)return existing;let created=dialog.ownerDocument.createElement("div");return created.setAttribute(LAYER_ROOT_ATTRIBUTE,""),created.className="nui-layer",dialog.appendChild(created),created}let root=from&&typeof from.getRootNode=="function"?from.getRootNode():document;if(typeof ShadowRoot<"u"&&root instanceof ShadowRoot){let existing=Array.from(root.querySelectorAll(`[${LAYER_ROOT_ATTRIBUTE}]`)).find(layer=>!layer.closest("dialog"));if(existing)return existing;let created=root.ownerDocument.createElement("div");return created.setAttribute(LAYER_ROOT_ATTRIBUTE,""),created.className="nui-layer",(root.querySelector("[data-notis-app-root]")??root).appendChild(created),created}return(root instanceof Document?root:document).body}function useLayerRoot(anchor){let pinned=useContext2(LayerRootContext);return pinned||(anchor?findLayerRoot(anchor):typeof document>"u"?null:document.body)}function usePinnedLayerRoot(){return useContext2(LayerRootContext)}import{jsx as jsx4,jsxs as jsxs2}from"react/jsx-runtime";var FOCUSABLE='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function deepActiveElement2(doc){let active=doc.activeElement;for(;active?.shadowRoot?.activeElement;)active=active.shadowRoot.activeElement;return active}function HelpSheet({container}){let{isOpen}=useHelpSheet(),core=useEngineCore(),pinned=usePinnedLayerRoot();if(!isOpen)return null;let target=container??pinned??core.attachedDocument()?.body??null;return target?createPortal(jsx4(HelpSheetPanel,{}),target):null}function HelpSheetPanel(){let core=useEngineCore(),locale=useToolkitLocale(),{close}=useHelpSheet();useRegistryVersion();let panelRef=useRef(null);useEscapeLayer("help-sheet",()=>(close(),!0),{priority:ESCAPE_PRIORITY.help}),useEffect2(()=>core.register({id:"help.close",keys:"?",scope:"modal",label:HELP_WORDS.close,hidden:!0,run:()=>{core.closeHelp()}},ROOT_OWNER)??void 0,[core]),useEffect2(()=>{let panel=panelRef.current;if(!panel)return;let previous=deepActiveElement2(panel.ownerDocument);return panel.focus(),()=>{previous?.isConnected&&previous.focus()}},[]);let trapTab=event=>{if(event.key!=="Tab")return;let panel=panelRef.current;if(!panel)return;let items2=[...panel.querySelectorAll(FOCUSABLE)];if(!items2.length){event.preventDefault(),panel.focus();return}let first=items2[0],last=items2[items2.length-1],active=deepActiveElement2(panel.ownerDocument);event.shiftKey&&(active===first||active===panel)?(event.preventDefault(),last.focus()):!event.shiftKey&&active===last&&(event.preventDefault(),first.focus())},entries=core.registry.helpEntries(),groups=[{group:"space",title:HELP_WORDS.groupSpace[locale]},{group:"notis",title:HELP_WORDS.groupNotis[locale]}],titleId="nui-help-title";return jsxs2("div",{className:"nui-root nui-help","data-notis-escape-owned":"",lang:locale,children:[jsx4("div",{className:"nui-help-backdrop","aria-hidden":"true"}),jsxs2("div",{ref:panelRef,className:"nui-help-panel",role:"dialog","aria-modal":"true","aria-labelledby":titleId,tabIndex:-1,onKeyDown:trapTab,children:[jsxs2("div",{className:"nui-help-head",children:[jsx4("h2",{id:titleId,className:"nui-help-title",children:HELP_WORDS.title[locale]}),jsx4("button",{type:"button",className:"nui-icon-btn","aria-label":HELP_WORDS.close[locale],onClick:close,children:jsx4("svg",{className:"nui-icon",viewBox:"0 0 16 16","aria-hidden":"true",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",children:jsx4("path",{d:"M4 4l8 8M12 4l-8 8"})})})]}),jsx4("div",{className:"nui-help-body",children:jsxs2(KeycapSurface,{on:"discreet",children:[entries.length===0&&jsx4("p",{className:"nui-help-empty",children:HELP_WORDS.empty[locale]}),groups.map(({group,title})=>{let rows=entries.filter(entry=>entry.group===group);return rows.length?jsxs2("section",{className:"nui-help-group","aria-label":title,children:[jsx4("h3",{className:"nui-help-group-title",children:title}),jsx4("ul",{className:"nui-help-list",children:rows.map(row=>jsxs2("li",{className:"nui-help-row","data-shortcut-id":row.id,children:[jsx4("span",{className:"nui-help-label",children:row.label[locale]}),jsx4(Keycap,{keys:row.keys})]},row.id))})]},group):null})]})})]})]})}function stepCursor(ids,cursor,delta,options={}){if(!ids.length)return null;let{wrap=!0,repeat=!1}=options,index=cursor==null?-1:ids.indexOf(cursor);if(index===-1)return delta>=0?ids[0]:ids[ids.length-1];let next=index+delta;return(next<0||next>=ids.length)&&(wrap&&!repeat?next=(next%ids.length+ids.length)%ids.length:next=Math.max(0,Math.min(ids.length-1,next))),ids[next]}var panelMath_exports={};__export(panelMath_exports,{CHAT_NARROWED_ATTRIBUTE:()=>CHAT_NARROWED_ATTRIBUTE,CHAT_PANEL_DEFAULT_WIDTH_PX:()=>CHAT_PANEL_DEFAULT_WIDTH_PX,CHAT_PANEL_DESKTOP_MEDIA_QUERY:()=>CHAT_PANEL_DESKTOP_MEDIA_QUERY,CHAT_PANEL_KEYBOARD_STEP_PX:()=>CHAT_PANEL_KEYBOARD_STEP_PX,CHAT_PANEL_MIN_CONTENT_WIDTH_PX:()=>CHAT_PANEL_MIN_CONTENT_WIDTH_PX,CHAT_PANEL_MIN_WIDTH_PX:()=>CHAT_PANEL_MIN_WIDTH_PX,CHAT_PANEL_OVERLAP_PROPERTY:()=>CHAT_PANEL_OVERLAP_PROPERTY,CHAT_PANEL_PAGE_HOVER_DELAY_MS:()=>CHAT_PANEL_PAGE_HOVER_DELAY_MS,CHAT_PANEL_PAGE_PEEK_PX:()=>CHAT_PANEL_PAGE_PEEK_PX,CHAT_PANEL_WIDTH_PROPERTY:()=>CHAT_PANEL_WIDTH_PROPERTY,CHAT_PANEL_WIDTH_STORAGE_KEY:()=>CHAT_PANEL_WIDTH_STORAGE_KEY,MANAGER_PHONE_LAYOUT_BELOW_PX:()=>MANAGER_PHONE_LAYOUT_BELOW_PX,PANELS_HOVER_DELAY_MS:()=>PANELS_HOVER_DELAY_MS,PANELS_KEYBOARD_STEP_PX:()=>PANELS_KEYBOARD_STEP_PX,PANELS_LIST_MIN_PX:()=>PANELS_LIST_MIN_PX,PANELS_READER_MIN_PX:()=>PANELS_READER_MIN_PX,PANELS_READER_PEEK_PX:()=>PANELS_READER_PEEK_PX,PANELS_READER_WANT_PX:()=>PANELS_READER_WANT_PX,PANELS_READER_WANT_WIDE_PX:()=>PANELS_READER_WANT_WIDE_PX,PANELS_READER_WIDE_FROM_PX:()=>PANELS_READER_WIDE_FROM_PX,chatPanelMaxWidth:()=>chatPanelMaxWidth,chatPanelOverlap:()=>chatPanelOverlap,chatPanelPageWidth:()=>chatPanelPageWidth,chatPanelPushLimit:()=>chatPanelPushLimit,clampChatPanelWidth:()=>clampChatPanelWidth,clampReaderWidth:()=>clampReaderWidth,overlap:()=>overlap,parseStoredChatPanelWidth:()=>parseStoredChatPanelWidth,parseStoredWidth:()=>parseStoredWidth,pushLimit:()=>pushLimit,readerMaxWidth:()=>readerMaxWidth,readerWantWidth:()=>readerWantWidth,splitBreakpoint:()=>splitBreakpoint,splitFits:()=>splitFits});var CHAT_PANEL_WIDTH_PROPERTY="--notis-chat-panel-width",CHAT_PANEL_OVERLAP_PROPERTY="--notis-chat-panel-overlap",CHAT_PANEL_WIDTH_STORAGE_KEY="notis:chat-panel-width",CHAT_PANEL_DEFAULT_WIDTH_PX=420,CHAT_PANEL_DESKTOP_MEDIA_QUERY="(min-width: 64rem)",MANAGER_PHONE_LAYOUT_BELOW_PX=576,CHAT_NARROWED_ATTRIBUTE="data-chat-narrowed",CHAT_PANEL_MIN_WIDTH_PX=360,CHAT_PANEL_MIN_CONTENT_WIDTH_PX=320,CHAT_PANEL_PAGE_PEEK_PX=80,CHAT_PANEL_KEYBOARD_STEP_PX=24,CHAT_PANEL_PAGE_HOVER_DELAY_MS=200,PANELS_LIST_MIN_PX=320,PANELS_READER_MIN_PX=360,PANELS_READER_PEEK_PX=80,PANELS_KEYBOARD_STEP_PX=24,PANELS_HOVER_DELAY_MS=200,PANELS_READER_WANT_PX=420,PANELS_READER_WANT_WIDE_PX=480,PANELS_READER_WIDE_FROM_PX=1280;function readerWantWidth(windowWidth2){return windowWidth2>=1280?480:420}function readerMaxWidth(container,keep=320,readerMin=360){return container===null?Number.POSITIVE_INFINITY:Math.max(readerMin,Math.round(container-keep))}function pushLimit(container,listMin=320,readerMin=360){return readerMaxWidth(container,listMin,readerMin)}function overlap(width,container,listMin=320){return container===null?0:Math.max(0,Math.round(width-(container-listMin)))}function splitFits(container,listMin=320,readerMin=360){return container===null?!0:container>=listMin+readerMin}function splitBreakpoint(listMin=320,readerMin=360){return listMin+readerMin}function clampReaderWidth(want,container,listMin=320,readerMin=360,peek=80){if(container===null)return Math.round(Math.max(readerMin,want));let pushed=Math.min(want,container-listMin);return Math.round(Math.max(0,Math.min(Math.max(pushed,readerMin),container-peek)))}function parseStoredWidth(raw){if(!raw)return null;let width=Number(raw);return Number.isFinite(width)&&width>0?width:null}function chatPanelMaxWidth(sharedWidth){return readerMaxWidth(sharedWidth,80,360)}function chatPanelPushLimit(sharedWidth){return pushLimit(sharedWidth,320,360)}function clampChatPanelWidth(width,sharedWidth){return Math.round(Math.min(chatPanelMaxWidth(sharedWidth),Math.max(360,width)))}function chatPanelPageWidth(chosenWidth,sharedWidth){let width=clampChatPanelWidth(chosenWidth,sharedWidth);return sharedWidth-width+chatPanelOverlap(width,sharedWidth)}function chatPanelOverlap(width,sharedWidth){return overlap(width,sharedWidth,320)}function parseStoredChatPanelWidth(raw){return parseStoredWidth(raw)}import{jsx as jsx5,jsxs as jsxs3}from"react/jsx-runtime";var PANELS_WORDS=Object.freeze({resizeReader:{en:"Resize the open item",fr:"Redimensionner l\u2019\xE9l\xE9ment ouvert"},resizeReaderHint:{en:"Drag to resize, double-click to reset",fr:"Fais glisser pour redimensionner, double-clique pour r\xE9initialiser"}}),STORAGE_PREFIX="notis:panels:",PanelsContext=createContext2(null);function usePanels(){return useContext3(PanelsContext)??OUTSIDE_PANELS}var OUTSIDE_PANELS=Object.freeze({mode:"split",readerWidth:readerWantWidth(0),setReaderWidth:()=>{},readerOpen:!1,settled:!0});function readStored(storageKey){if(!storageKey)return null;try{return parseStoredWidth(window.localStorage.getItem(STORAGE_PREFIX+storageKey))}catch{return null}}function writeStored(storageKey,width){if(storageKey)try{width===null?window.localStorage.removeItem(STORAGE_PREFIX+storageKey):window.localStorage.setItem(STORAGE_PREFIX+storageKey,String(width))}catch{}}function windowWidth(){return typeof window>"u"?0:window.innerWidth}function useWindowWidth(){let[width,setWidth]=useState(windowWidth);return useEffect3(()=>{let update=()=>setWidth(windowWidth());return update(),window.addEventListener("resize",update),()=>window.removeEventListener("resize",update)},[]),width}function afterFrame(fn){if(typeof requestAnimationFrame=="function"){let frame=requestAnimationFrame(fn);return()=>cancelAnimationFrame(frame)}let timer=setTimeout(fn,16);return()=>clearTimeout(timer)}function measure(element){let width=element?.getBoundingClientRect().width??0;return width>0?width:null}function splitRules(name,id,breakpoint){let self=`.nui-panels[data-panels-id="${id}"]`;return`@container ${name} (min-width: ${breakpoint}px) {${self} > .nui-panels-reader { position: relative; inset: auto; z-index: auto; flex: 0 0 auto; transform: none; transition: none; width: clamp(var(--nui-panels-reader-min), var(--nui-panels-reader-w), calc(100cqw - var(--nui-panels-list-min))); }${self} > .nui-panels-reader > .nui-panels-handle { display: block; }${self} > .nui-panels-reader > .nui-panels-backbar { display: none; }}`}function Panels({list,reader,listMin=320,readerMin=360,defaultReaderWidth,resizable=!1,storageKey,onBack,className}){let rootRef=useRef2(null),reactId=useId(),id=useMemo(()=>reactId.replace(/[^a-zA-Z0-9_-]/g,""),[reactId]),customBreakpoint=listMin!==320||readerMin!==360,containerName=customBreakpoint?`nui-panels nui-panels-${id}`:"nui-panels",[container,setContainer]=useState(null),[settled,setSettled]=useState(!1),[preferred,setPreferred]=useState(null),readerOpen=reader!=null;useLayoutEffect2(()=>{setPreferred(readStored(storageKey))},[storageKey]),useLayoutEffect2(()=>{let root=rootRef.current,update=()=>{let width=measure(root);width!==null&&(setContainer(current=>current===width?current:width),setSettled(!0))};update();let stopFrame=afterFrame(()=>setSettled(!0));if(!root||typeof ResizeObserver>"u")return stopFrame;let observer=new ResizeObserver(update);return observer.observe(root),()=>{stopFrame(),observer.disconnect()}},[]);let mode=splitFits(container,listMin,readerMin)?"split":"stacked",want=readerWantWidth(useWindowWidth()),chosen=preferred??defaultReaderWidth??want,readerWidth=clampReaderWidth(chosen,container,listMin,readerMin),setReaderWidth=useCallback(px2=>{let width=clampReaderWidth(px2,measure(rootRef.current)??container,listMin,readerMin);setPreferred(width),writeStored(storageKey,width)},[container,listMin,readerMin,storageKey]),resetReaderWidth=useCallback(()=>{setPreferred(null),writeStored(storageKey,null)},[storageKey]),state=useMemo(()=>({mode,readerWidth,setReaderWidth,readerOpen,settled}),[mode,readerOpen,readerWidth,setReaderWidth,settled]),covered=mode==="stacked"&&readerOpen,style={containerName,"--nui-panels-reader-w":`${chosen}px`,"--nui-panels-reader-min":`${readerMin}px`,"--nui-panels-list-min":`${listMin}px`};return jsx5(PanelsContext.Provider,{value:state,children:jsxs3("div",{ref:rootRef,className:className?`nui-panels ${className}`:"nui-panels",style,"data-panels-id":id,"data-custom-split":customBreakpoint?"":void 0,"data-mode":mode,"data-reader-open":readerOpen?"":void 0,children:[customBreakpoint?jsx5("style",{children:splitRules(`nui-panels-${id}`,id,splitBreakpoint(listMin,readerMin))}):null,jsx5("div",{className:"nui-panels-list",inert:covered||void 0,"aria-hidden":covered||void 0,children:list}),readerOpen?jsxs3("div",{className:"nui-panels-reader",children:[resizable?jsx5(PanelsHandle,{width:readerWidth,listMin,readerMin,max:container===null?void 0:readerMaxWidth(container,listMin,readerMin),onWidth:setReaderWidth,onReset:resetReaderWidth,rootRef}):null,onBack?jsx5(PanelsBackBar,{onBack}):null,reader]}):null]})})}function PanelsBackBar({onBack}){let locale=useToolkitLocale(),onBackRef=useRef2(onBack);useLayoutEffect2(()=>{onBackRef.current=onBack});let onEscape=useCallback(()=>(onBackRef.current(),!0),[]);return useEscapeLayer(`panels-back${useId()}`,onEscape,{priority:ESCAPE_PRIORITY.detail}),jsx5("div",{className:"nui-panels-backbar",children:jsxs3("button",{type:"button",className:"nui-panels-back",onClick:onBack,children:[jsx5("svg",{className:"nui-icon",viewBox:"0 0 16 16","aria-hidden":"true",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:jsx5("path",{d:"M10 3.5 5.5 8l4.5 4.5"})}),pick(SHELL_WORDS.back,locale)]})})}function PanelsHandle({width,listMin,readerMin,max,onWidth,onReset,rootRef}){let locale=useToolkitLocale(),dragRef=useRef2(null),[dragWidth,setDragWidth]=useState(null),end=useCallback(()=>{let drag=dragRef.current;drag&&(dragRef.current=null,setDragWidth(null),drag.width!==null&&onWidth(drag.width))},[onWidth]);useEffect3(()=>end,[end]);let onPointerDown=event=>{event.button===0&&(event.preventDefault(),event.currentTarget.setPointerCapture?.(event.pointerId),dragRef.current={pointerId:event.pointerId,startX:event.clientX,startWidth:width,container:measure(rootRef.current),width:null},setDragWidth(width))},onPointerMove=event=>{let drag=dragRef.current;if(!drag||event.pointerId!==drag.pointerId)return;let next=clampReaderWidth(drag.startWidth+drag.startX-event.clientX,drag.container,listMin,readerMin);next!==drag.width&&(drag.width=next,rootRef.current?.style.setProperty("--nui-panels-reader-w",`${next}px`),setDragWidth(next))},onKeyDown=event=>{let direction=event.key==="ArrowLeft"?1:event.key==="ArrowRight"?-1:0;direction!==0&&(event.preventDefault(),event.stopPropagation(),onWidth(width+direction*24))};return jsx5("div",{className:"nui-panels-handle",role:"separator","aria-orientation":"vertical","aria-label":pick(PANELS_WORDS.resizeReader,locale),"aria-valuemin":readerMin,"aria-valuemax":max,"aria-valuenow":Math.round(dragWidth??width),title:pick(PANELS_WORDS.resizeReaderHint,locale),tabIndex:0,"data-resizing":dragWidth===null?void 0:"",onPointerDown,onPointerMove,onPointerUp:end,onPointerCancel:end,onLostPointerCapture:end,onDoubleClick:onReset,onKeyDown})}var PAGE_VIEWPORT_ATTRIBUTE="data-notis-view-viewport";function pageViewport(panel){return panel.parentElement?.querySelector(`:scope > [${PAGE_VIEWPORT_ATTRIBUTE}]`)??null}function measureSharedWidth(panel){let viewport=pageViewport(panel);return viewport?panel.getBoundingClientRect().right-viewport.getBoundingClientRect().left:null}function defaultPanelWidth(){return 420}function setPixels(panel,property2,value){let next=value===null?"":`${value}px`;panel.style.getPropertyValue(property2)!==next&&(next?panel.style.setProperty(property2,next):panel.style.removeProperty(property2))}function readStoredWidth(){try{return parseStoredChatPanelWidth(window.localStorage.getItem(CHAT_PANEL_WIDTH_STORAGE_KEY))}catch{return null}}function storeWidth(width){try{width===null?window.localStorage.removeItem(CHAT_PANEL_WIDTH_STORAGE_KEY):window.localStorage.setItem(CHAT_PANEL_WIDTH_STORAGE_KEY,String(width))}catch{}}function isHoverPointer(event){return event.pointerType==="mouse"||event.pointerType==="pen"}function focusedElement(event){return(typeof event.composedPath=="function"?event.composedPath():[])[0]??event.target}function isFocusVisible(target){let element=target;if(!element||typeof element.matches!="function")return!1;try{return element.matches(":focus-visible")}catch{return!1}}function createChatPanelEdge(adapters,initial){let preferred=null,drag=null,pageExtended=!1,pageHoverTimer=null,hidden=initial.hidden,desktop=initial.desktop,keyboardInput=!1,keyboardResized=!1,panelNode=()=>adapters.handle()?.parentElement??null;function sidebarInsetValue(){let property2=adapters.sidebarInsetProperty;return property2?document.documentElement.style.getPropertyValue(property2).trim():""}function restingSharedWidth(){let raw=sidebarInsetValue(),value=Number.parseFloat(raw),inset=Number.isFinite(value)?raw.endsWith("rem")?value*(Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize)||16):value:0;return window.innerWidth-inset}function applyWidth(width,sharedWidth){let panel=panelNode();if(!panel)return;let overlap2=chatPanelOverlap(width??defaultPanelWidth(),sharedWidth);setPixels(panel,CHAT_PANEL_WIDTH_PROPERTY,width),setPixels(panel,CHAT_PANEL_OVERLAP_PROPERTY,overlap2>0?overlap2:null),panel.toggleAttribute("data-overlay",overlap2>0)}function chosenWidth(sharedWidth){return preferred!==null?clampChatPanelWidth(preferred,sharedWidth):defaultPanelWidth()}function displayedWidth(sharedWidth){let width=chosenWidth(sharedWidth);return pageExtended?Math.min(width,chatPanelPushLimit(sharedWidth)):width}let lastAria=null;function describe(width,sharedWidth){let max=chatPanelMaxWidth(sharedWidth),next={now:Math.round(width),max:Number.isFinite(max)?max:void 0};lastAria?.now===next.now&&lastAria?.max===next.max||(lastAria=next,adapters.onDescribe(next))}function narrowsPage(chosen,resting=restingSharedWidth()){if(chosen===null||hidden||!desktop)return!1;let limit=Math.min(576,chatPanelPageWidth(defaultPanelWidth(),resting));return chatPanelPageWidth(chosen,resting)<limit}function syncPageNarrowed(chosen,resting){let panel=panelNode();(panel?pageViewport(panel):null)?.toggleAttribute(CHAT_NARROWED_ATTRIBUTE,narrowsPage(chosen,resting))}function fit(){let panel=panelNode();if(!panel||drag)return;let sharedWidth=measureSharedWidth(panel);applyWidth(preferred===null&&!pageExtended?null:displayedWidth(sharedWidth),sharedWidth),describe(displayedWidth(sharedWidth),sharedWidth),syncPageNarrowed(preferred)}function cancelPageHover(){pageHoverTimer!==null&&clearTimeout(pageHoverTimer),pageHoverTimer=null}function setPageExtended(extended){return cancelPageHover(),pageExtended===extended?!1:(pageExtended=extended,fit(),!0)}function reportResize(method,width,sharedWidth){let overlap2=chatPanelOverlap(width??defaultPanelWidth(),sharedWidth);adapters.analytics().resized({method,width,coversPage:overlap2>0,page:adapters.page(),managerPhoneLayout:narrowsPage(width)})}function setWidth(width,sharedWidth){cancelPageHover(),pageExtended=!1,preferred=width,storeWidth(width),applyWidth(width,sharedWidth),syncPageNarrowed(width)}function endDrag(){let current=drag;if(!current)return;drag=null,panelNode()?.removeAttribute("data-resizing"),document.body.style.cursor=current.bodyCursor,document.body.style.userSelect=current.bodyUserSelect;let handle=adapters.handle();!current.focusedAtStart&&handle&&document.activeElement===handle&&handle.blur(),current.width!==null&&(setWidth(current.width,current.sharedWidth),reportResize("drag",current.width,current.sharedWidth))}function flushKeyboardResize(){let panel=panelNode();if(!panel||!keyboardResized)return;keyboardResized=!1;let sharedWidth=measureSharedWidth(panel);reportResize("keyboard",chosenWidth(sharedWidth),sharedWidth)}return{mount(){preferred=readStoredWidth(),fit()},setHidden(next){next&&(endDrag(),flushKeyboardResize()),hidden=next,setPageExtended(!1),syncPageNarrowed(preferred)},setDesktop(next){desktop=next,next||setPageExtended(!1),syncPageNarrowed(preferred)},reportAvailable(){!hidden&&desktop&&adapters.analytics().available(adapters.page())},trackInput(){let onKey=event=>{!event.metaKey&&!event.ctrlKey&&!event.altKey&&(keyboardInput=!0)},onPointer=()=>{keyboardInput=!1};return document.addEventListener("keydown",onKey,!0),document.addEventListener("pointerdown",onPointer,!0),()=>{document.removeEventListener("keydown",onKey,!0),document.removeEventListener("pointerdown",onPointer,!0)}},attach(){let panel=panelNode(),viewport=panel?pageViewport(panel):null;if(!panel||!viewport)return()=>{};let observer=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>fit());observer?.observe(viewport);let inset=sidebarInsetValue(),insetObserver=adapters.sidebarInsetProperty&&window.MutationObserver?new window.MutationObserver(()=>{let next=sidebarInsetValue();next!==inset&&(inset=next,drag||syncPageNarrowed(preferred))}):null;insetObserver?.observe(document.documentElement,{attributes:!0,attributeFilter:["style"]});let covering=()=>!hidden&&desktop&&panel.hasAttribute("data-overlay"),onPagePointer=event=>{!isHoverPointer(event)||drag||!covering()||pageExtended||pageHoverTimer!==null||(pageHoverTimer=setTimeout(()=>{setPageExtended(!0)&&adapters.analytics().pageExtended("hover",adapters.page())},200))},onPageLeave=event=>{isHoverPointer(event)&&cancelPageHover()},onPanelPointer=event=>{!isHoverPointer(event)||adapters.handle()?.contains(event.target)||setPageExtended(!1)},onPageFocus=event=>{!covering()||!keyboardInput||!isFocusVisible(focusedElement(event))||setPageExtended(!0)&&adapters.analytics().pageExtended("keyboard",adapters.page())};return viewport.addEventListener("pointerenter",onPagePointer),viewport.addEventListener("pointermove",onPagePointer),viewport.addEventListener("pointerleave",onPageLeave),viewport.addEventListener("focusin",onPageFocus),panel.addEventListener("pointerover",onPanelPointer),()=>{observer?.disconnect(),insetObserver?.disconnect(),cancelPageHover(),viewport.removeAttribute(CHAT_NARROWED_ATTRIBUTE),viewport.removeEventListener("pointerenter",onPagePointer),viewport.removeEventListener("pointermove",onPagePointer),viewport.removeEventListener("pointerleave",onPageLeave),viewport.removeEventListener("focusin",onPageFocus),panel.removeEventListener("pointerover",onPanelPointer)}},pointerDown(event){let panel=panelNode();if(!panel||event.button!==0)return;event.preventDefault();let target=event.currentTarget;target?.setPointerCapture?.(event.pointerId);let startWidth=panel.getBoundingClientRect().width,sharedWidth=measureSharedWidth(panel);drag={pointerId:event.pointerId,startX:event.clientX,startWidth,sharedWidth,restingSharedWidth:restingSharedWidth(),width:null,focusedAtStart:document.activeElement===target,bodyCursor:document.body.style.cursor,bodyUserSelect:document.body.style.userSelect},panel.setAttribute("data-resizing",""),document.body.style.cursor="col-resize",document.body.style.userSelect="none",describe(startWidth,sharedWidth)},pointerMove(event){let current=drag;if(!current||event.pointerId!==current.pointerId)return;let width=clampChatPanelWidth(current.startWidth+current.startX-event.clientX,current.sharedWidth);width!==current.width&&(current.width=width,applyWidth(width,current.sharedWidth),syncPageNarrowed(width,current.restingSharedWidth),describe(width,current.sharedWidth))},endDrag,keyDown(event){let panel=panelNode(),direction=event.key==="ArrowLeft"?1:event.key==="ArrowRight"?-1:0;if(!panel||direction===0)return;event.preventDefault(),event.stopPropagation();let sharedWidth=measureSharedWidth(panel),width=clampChatPanelWidth(displayedWidth(sharedWidth)+direction*24,sharedWidth);setWidth(width,sharedWidth),keyboardResized=!0,describe(width,sharedWidth)},doubleClick(){let panel=panelNode();if(!panel)return;let sharedWidth=measureSharedWidth(panel);setWidth(null,sharedWidth),reportResize("reset",null,sharedWidth),describe(chosenWidth(sharedWidth),sharedWidth)},focus(){let panel=panelNode();if(!panel)return;let sharedWidth=measureSharedWidth(panel);describe(displayedWidth(sharedWidth),sharedWidth)},blur:flushKeyboardResize}}import React2,{createContext as createContext3,useCallback as useCallback2,useContext as useContext4,useEffect as useEffect5,useMemo as useMemo2,useRef as useRef3,useState as useState3}from"react";import{createPortal as createPortal2}from"react-dom";import{useEffect as useEffect4,useState as useState2}from"react";function place(anchor,size,options){let{align="start",offset=4,margin=8,viewport}=options,side=options.side??"bottom";if(side==="bottom"||side==="top"){let below=viewport.height-anchor.bottom-offset-margin,above=anchor.top-offset-margin;side==="bottom"&&size.height>below&&above>below?side="top":side==="top"&&size.height>above&&below>above&&(side="bottom")}else{let right=viewport.width-anchor.right-offset-margin,left2=anchor.left-offset-margin;side==="right"&&size.width>right&&left2>right?side="left":side==="left"&&size.width>left2&&right>left2&&(side="right")}let top,left;side==="bottom"||side==="top"?(top=side==="bottom"?anchor.bottom+offset:anchor.top-offset-size.height,left=align==="start"?anchor.left:align==="end"?anchor.right-size.width:anchor.left+anchor.width/2-size.width/2):(left=side==="right"?anchor.right+offset:anchor.left-offset-size.width,top=align==="start"?anchor.top:align==="end"?anchor.bottom-size.height:anchor.top+anchor.height/2-size.height/2);let maxLeft=Math.max(margin,viewport.width-margin-size.width),maxTop=Math.max(margin,viewport.height-margin-size.height);return{top:Math.round(clamp(top,margin,maxTop)),left:Math.round(clamp(left,margin,maxLeft)),side}}function clamp(value,min,max){return Math.min(max,Math.max(min,value))}function useFloatingStyle(open,anchor,panel,{side="bottom",align="start",offset=4}){let[state,setState]=useState2({top:0,left:0,side,measured:!1});return useIsoLayoutEffect(()=>{if(!open){setState(current=>current.measured?{...current,measured:!1}:current);return}let update=()=>{let anchorEl=anchor.current,panelEl=panel.current;if(!anchorEl||!panelEl)return;let rect=anchorEl.getBoundingClientRect(),viewport={width:window.innerWidth||document.documentElement.clientWidth||1024,height:window.innerHeight||document.documentElement.clientHeight||768},size={width:panelEl.offsetWidth,height:panelEl.offsetHeight},next=place(rect,size,{side,align,offset,viewport});setState(current=>current.top===next.top&&current.left===next.left&&current.side===next.side&&current.measured?current:{...next,measured:!0})};update(),window.addEventListener("resize",update),window.addEventListener("scroll",update,!0);let observer=typeof ResizeObserver<"u"?new ResizeObserver(update):null;return observer&&panel.current&&observer.observe(panel.current),()=>{window.removeEventListener("resize",update),window.removeEventListener("scroll",update,!0),observer?.disconnect()}},[open,side,align,offset]),{style:{top:state.top,left:state.left,visibility:state.measured?void 0:"hidden"},side:state.side}}function useOutsidePress(open,inside2,onDismiss){let latest=useLatest({inside:inside2,onDismiss});useEffect4(()=>{if(!open||typeof document>"u")return;let onPointerDown=event=>{eventWithin(event,latest.current.inside())||latest.current.onDismiss()};return document.addEventListener("pointerdown",onPointerDown,!0),document.addEventListener("mousedown",onPointerDown,!0),()=>{document.removeEventListener("pointerdown",onPointerDown,!0),document.removeEventListener("mousedown",onPointerDown,!0)}},[open,latest])}import{cloneElement}from"react";function setRef(ref,value){ref&&(typeof ref=="function"?ref(value):ref.current=value)}function ownRef(element){return element.props?.ref??element.ref??void 0}function cloneTrigger(element,extra){let own=element.props??{},merged={...extra};for(let[name,handler]of Object.entries(extra)){if(!/^on[A-Z]/.test(name)||typeof handler!="function")continue;let original=own[name];typeof original=="function"&&(merged[name]=event=>{original(event),event.defaultPrevented||handler(event)})}let elementRef=ownRef(element),extraRef=extra.ref;return merged.ref=node=>{setRef(elementRef,node),setRef(extraRef,node)},cloneElement(element,merged)}import{Fragment as Fragment3,jsx as jsx6,jsxs as jsxs4}from"react/jsx-runtime";var ITEM_SELECTOR="[data-nui-menu-item]",TreeContext=createContext3(null),PanelContext=createContext3(null);function useMenu(){let tree=useContext4(TreeContext);return useMemo2(()=>({close:()=>tree?.close({focusTrigger:!0}),isOpen:!!tree?.isOpen}),[tree])}function items(panel){return panel?Array.from(panel.querySelectorAll(ITEM_SELECTOR)).filter(item=>item.closest(".nui-menu")===panel&&item.getAttribute("aria-disabled")!=="true"):[]}function focusItem(panel,which){let list=items(panel);if(list.length===0)return;let active=deepActiveElement(panel?.getRootNode()),index=active?list.indexOf(active):-1,next;which==="first"?next=list[0]:which==="last"?next=list[list.length-1]:which==="next"?next=list[index===-1?0:(index+1)%list.length]:next=list[index===-1?list.length-1:(index-1+list.length)%list.length],next?.focus({preventScroll:!1})}function MenuPanel({open,anchor,side,align,label,className,tree,onKeyDownExtra,children,layerRoot,id}){let t=useT(),platform=useToolkitPlatform(),panelRef=useRef3(null),[openSub,setOpenSub]=useState3(null),{style,side:placedSide}=useFloatingStyle(open&&!!layerRoot,anchor,panelRef,{side,align,offset:side==="right"||side==="left"?2:4}),typeahead=useRef3({text:"",at:0});useEffect5(()=>{let panel=panelRef.current;if(!(!open||!panel))return tree.panels.add(panel),()=>{tree.panels.delete(panel)}},[open,tree,layerRoot]),useEffect5(()=>{open||setOpenSub(null)},[open]);let panelContext=useMemo2(()=>({tree,openSub,setOpenSub,panel:()=>panelRef.current}),[tree,openSub]);if(!open||!layerRoot)return null;let onKeyDown=event=>{if(event.nativeEvent.isComposing)return;let panel=panelRef.current;if(!onKeyDownExtra?.(event)&&event.target.closest?.(".nui-menu")===panel){switch(event.key){case"ArrowDown":event.preventDefault(),focusItem(panel,"next");return;case"ArrowUp":event.preventDefault(),focusItem(panel,"prev");return;case"Home":event.preventDefault(),focusItem(panel,"first");return;case"End":event.preventDefault(),focusItem(panel,"last");return;case"Tab":tree.close();return;case"Enter":case" ":{let target=event.target;target.matches(ITEM_SELECTOR)&&(event.preventDefault(),target.click());return}default:break}if(event.key==="ArrowRight"){let target=event.target;target.getAttribute("aria-haspopup")==="menu"&&(event.preventDefault(),target.click());return}for(let item of items(panel)){let keys=item.getAttribute("data-nui-keys");if(keys&&keys.split(`
3
+ `).some(spec=>matchKey(event.nativeEvent,spec,platform))){event.preventDefault(),event.stopPropagation(),item.click();return}}if(event.key.length===1&&/\S/.test(event.key)&&!event.metaKey&&!event.ctrlKey&&!event.altKey){let now=Date.now(),text=(now-typeahead.current.at<700?typeahead.current.text:"")+event.key.toLowerCase();typeahead.current={text,at:now};let list=items(panel),active=deepActiveElement(panel?.getRootNode()),start=active?list.indexOf(active):-1,ordered=[...list.slice(start+1),...list.slice(0,start+1)],match=ordered.find(item=>(item.textContent||"").trim().toLowerCase().startsWith(text))??(text.length>1?void 0:ordered.find(item=>(item.textContent||"").trim().toLowerCase().startsWith(event.key.toLowerCase())));match&&(event.preventDefault(),match.focus())}}};return createPortal2(jsx6(PanelContext.Provider,{value:panelContext,children:jsx6(KeycapSurface,{on:"discreet",children:jsx6("div",{ref:panelRef,id,role:"menu","aria-label":label?t(label):void 0,"aria-orientation":"vertical",tabIndex:-1,"data-notis-escape-owned":"","data-notis-floating":"","data-state":"open","data-side":placedSide,className:cx("nui-menu",className),style,onKeyDown,onContextMenu:event=>event.preventDefault(),children})})}),layerRoot)}function resolveAnchor(anchor){return anchor?typeof anchor.getBoundingClientRect=="function"?anchor:anchor.current??null:null}var ACCELERATOR_ID="notis.menu-key:",OWNER_SALT=Math.random().toString(36).slice(2,8);function textOf(node){return node==null||typeof node=="boolean"?"":typeof node=="string"||typeof node=="number"?String(node):Array.isArray(node)?node.map(textOf).join(""):React2.isValidElement(node)?textOf(node.props.children):""}function keyedItems(children,out=[]){return React2.Children.forEach(children,child=>{if(!React2.isValidElement(child))return;if(child.type===React2.Fragment){keyedItems(child.props.children,out);return}if(child.type===MenuSub){let sub=child.props;sub.disabled||keyedItems(sub.children,out);return}if(child.type!==MenuItem)return;let props=child.props,specs=keyList(props.keys).filter(spec=>isValidKeySpec(spec)&&!isSequenceSpec(spec));specs.length&&out.push({specs,disabled:!!props.disabled,label:textOf(props.children).trim(),onSelect:props.onSelect})}),out}function groupSpecs(lists){let groups=[];for(let specs of lists){if(!specs.length)continue;let next={specs:new Set(specs),prints:new Set(keyFingerprints(specs).keys())},rest=[];for(let group of groups)if([...group.prints].some(print=>next.prints.has(print))){for(let spec of group.specs)next.specs.add(spec);for(let print of group.prints)next.prints.add(print)}else rest.push(group);groups=[...rest,next]}return groups.map(group=>[...group.specs])}function pageKeyComesFirst(core,def,event){let{platform}=core.settings,ours=core.registry.all().find(entry=>entry.def===def);if(!ours)return!1;for(let entry of core.registry.active({modalOnly:def.scope==="modal"})){if(entry.def.id.startsWith(ACCELERATOR_ID))continue;let asksLater=entry.rank<ours.rank||entry.rank===ours.rank&&entry.seq<ours.seq;if(entry.chords.some(chords=>matchChord(event,chords[0],platform)&&(chords.length>1||asksLater))&&(!entry.def.when||safeWhen(entry.def.when)))return!0}return!1}function keyFromLayer(element,event){let layer=modalLayerOf(element);if(!layer)return!1;let target=eventTarget(event),doc=element.ownerDocument;return!target||target===doc.body||target===doc.documentElement||containsComposed(layer,target)}function useMenuAccelerators({id,enabled,children,open,target}){let core=useEngineCore(),parent=useShortcutOwner(),items2=enabled?keyedItems(children):[],live=useLatest({items:items2,open,target}),itemKey=JSON.stringify(items2.map(item=>item.specs));useEffect5(()=>{let lists=live.current.items.map(item=>item.specs);if(!lists.length)return;let kind=parent===ROOT_OWNER?"host":core.registry.ownerKind(parent),allowed=new Set(lists.flat().filter(spec=>!selfClashes({id,keys:spec,scope:"route",owner:parent,ownerKind:kind}).some(clash=>clash.severity==="error"))),groups=groupSpecs(lists.map(specs=>specs.filter(spec=>allowed.has(spec))));if(!groups.length)return;let owner=`${id}:${OWNER_SALT}:keys`,release=core.defineOwner(owner,{parent,kind}),gate=scope=>{if(live.current.open)return!1;let element=live.current.target();if(!element||!isVisibleComposed(element)||keysOff(element)||element.matches(':disabled, [aria-disabled="true"]'))return!1;let layer=modalLayerOf(element);return scope==="route"?!layer:!!layer&&!openModalLayers(element.ownerDocument).some(el=>el.matches('[role="menu"], [role="listbox"]'))},unregisters=[];return groups.forEach((specs,index)=>{let label=live.current.items.find(item=>item.specs.some(spec=>specs.includes(spec)))?.label||specs[0];for(let scope of["route","modal"]){let def={id:`${ACCELERATOR_ID}${id}:${scope}:${index}`,keys:specs,scope,owner,hidden:!0,label:{en:label,fr:label},when:()=>gate(scope),run:event=>{if(!gate(scope))return!1;let{platform}=core.settings,item=live.current.items.find(entry=>!entry.disabled&&entry.specs.some(spec=>allowed.has(spec)&&matchKey(event,spec,platform)));return!item||scope==="modal"&&!keyFromLayer(live.current.target(),event)||pageKeyComesFirst(core,def,event)?!1:(item.onSelect?.(),!0)}};unregisters.push(core.register(def,owner))}}),()=>{for(let unregister of unregisters)unregister?.();release()}},[core,parent,id,itemKey])}function MenuRoot({trigger,anchor,children,align="start",side="bottom",label,open:controlledOpen,onOpenChange,className,accelerators=!0}){let[uncontrolled,setUncontrolled]=useState3(!1),open=controlledOpen??uncontrolled,triggerRef=useRef3(null),pinned=usePinnedLayerRoot(),[layerRoot,setLayerRoot]=useState3(null),focusFirst=useRef3(!1),id=useStableId("nui-menu"),latest=useLatest({onOpenChange,controlled:controlledOpen!==void 0}),panels=useRef3(new Set).current;trigger||(triggerRef.current=resolveAnchor(anchor)),useMenuAccelerators({id,enabled:accelerators,children,open,target:()=>trigger?triggerRef.current:resolveAnchor(anchor)});let setOpen=useCallback2(next=>{latest.current.controlled||setUncontrolled(next),latest.current.onOpenChange?.(next)},[latest]),tree=useMemo2(()=>({isOpen:open,panels,close:({focusTrigger=!1}={})=>{let panelList=Array.from(panels),active=deepActiveElement(triggerRef.current?.getRootNode()),focusInside2=!!active&&panelList.some(panel=>panel.contains(active));setOpen(!1),(focusTrigger||focusInside2)&&triggerRef.current&&triggerRef.current.focus({preventScroll:!0})}}),[open,panels,setOpen]);useEffect5(()=>{open&&setLayerRoot(pinned??findLayerRoot(triggerRef.current))},[open,pinned]),useEffect5(()=>{if(!open||!layerRoot)return;let frame=requestAnimationFrame(()=>{let panel=Array.from(panels).find(p=>p.id===id)??null;panel&&(focusFirst.current||!trigger?focusItem(panel,"first"):panel.focus({preventScroll:!0}),focusFirst.current=!1)});return()=>cancelAnimationFrame(frame)},[open,layerRoot,id,panels,trigger]),useOutsidePress(open,()=>[triggerRef.current,...Array.from(panels)],()=>setOpen(!1)),useEscapeLayer(`menu:${id}`,()=>open?(tree.close({focusTrigger:!0}),!0):!1,{priority:ESCAPE_PRIORITY.overlay});let triggerNode=trigger?cloneTrigger(trigger,{ref:node=>{triggerRef.current=node},"aria-haspopup":"menu","aria-expanded":open,"aria-controls":open?id:void 0,onClick:event=>{event.stopPropagation(),focusFirst.current=event.detail===0,setOpen(!open)},onKeyDown:event=>{(event.key==="ArrowDown"||event.key==="ArrowUp")&&(event.preventDefault(),focusFirst.current=!0,setOpen(!0))}}):null;return jsxs4(TreeContext.Provider,{value:tree,children:[triggerNode,jsx6(MenuPanel,{open,anchor:triggerRef,side,align,label,className,tree,layerRoot,id,children})]})}function MenuItem({children,icon,keys,tone="default",onSelect,checked,disabled,closeOnSelect=!0,className}){let tree=useContext4(TreeContext),panel=useContext4(PanelContext),platform=useToolkitPlatform(),specs=keyList(keys);return jsxs4("button",{type:"button",role:checked===void 0?"menuitem":"menuitemcheckbox","aria-checked":checked===void 0?void 0:checked,"aria-disabled":disabled||void 0,"aria-keyshortcuts":specs.length?toAriaKeyShortcuts(specs,platform):void 0,tabIndex:-1,"data-nui-menu-item":"","data-nui-keys":specs.length?specs.join(`
4
+ `):void 0,"data-tone":tone==="danger"?"danger":void 0,className:cx("nui-menu-item",className),onPointerMove:event=>{disabled||(event.currentTarget!==deepActiveElement(event.currentTarget.getRootNode())&&event.currentTarget.focus({preventScroll:!0}),panel?.openSub&&panel.setOpenSub(null))},onClick:event=>{disabled||(onSelect?.(event),!event.defaultPrevented&&closeOnSelect&&tree?.close({focusTrigger:!0}))},children:[renderIcon(icon),jsx6("span",{className:"nui-menu-label",children}),specs.length?jsx6("span",{className:"nui-menu-keys",children:jsx6(Keycap,{keys:specs})}):null,checked!==void 0?jsx6(Icon,{name:"check",className:"nui-menu-check"}):null]})}function MenuSeparator(){return jsx6("div",{role:"separator",className:"nui-menu-sep"})}function MenuSub({label,icon,disabled,children,menuLabel}){let tree=useContext4(TreeContext),parent=useContext4(PanelContext),id=useStableId("nui-sub"),itemRef=useRef3(null),open=!!parent&&parent.openSub===id,hoverTimer=useRef3(null),layerRoot=itemRef.current?findLayerRoot(itemRef.current):null,panelId=`${id}-menu`;return useEffect5(()=>()=>{hoverTimer.current&&clearTimeout(hoverTimer.current)},[]),useEffect5(()=>{if(!open)return;let frame=requestAnimationFrame(()=>{let panel=tree?Array.from(tree.panels).find(p=>p.id===panelId)??null:null;focusItem(panel,"first")});return()=>cancelAnimationFrame(frame)},[open,panelId,tree]),!tree||!parent?null:jsxs4(Fragment3,{children:[jsxs4("button",{ref:itemRef,type:"button",role:"menuitem","aria-haspopup":"menu","aria-expanded":open,"aria-controls":open?panelId:void 0,"aria-disabled":disabled||void 0,tabIndex:-1,"data-nui-menu-item":"","data-active":flag(open),className:"nui-menu-item",onPointerMove:event=>{disabled||(event.currentTarget.focus({preventScroll:!0}),hoverTimer.current&&clearTimeout(hoverTimer.current),hoverTimer.current=setTimeout(()=>parent.setOpenSub(id),120))},onPointerLeave:()=>{hoverTimer.current&&clearTimeout(hoverTimer.current)},onClick:()=>{disabled||parent.setOpenSub(open?null:id)},children:[renderIcon(icon),jsx6("span",{className:"nui-menu-label",children:label}),jsx6(Icon,{name:"caret-right",className:"nui-menu-caret"})]}),jsx6(MenuPanel,{open,anchor:itemRef,side:"right",align:"start",label:menuLabel??(typeof label=="string"?label:void 0),tree,layerRoot,id:panelId,onKeyDownExtra:event=>event.key!=="ArrowLeft"||event.target.closest?.(".nui-menu")?.id!==panelId?!1:(event.preventDefault(),parent.setOpenSub(null),itemRef.current?.focus(),!0),children})]})}var Menu=MenuRoot;Menu.Item=MenuItem;Menu.Separator=MenuSeparator;Menu.Sub=MenuSub;import{useCallback as useCallback3,useEffect as useEffect6,useMemo as useMemo3,useRef as useRef4,useState as useState4}from"react";import{createPortal as createPortal3}from"react-dom";import{Fragment as Fragment4,jsx as jsx7,jsxs as jsxs5}from"react/jsx-runtime";var FOCUSABLE2='button:not([disabled]), [href], input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"]), [contenteditable="true"]';function focusables(panel){return Array.from(panel.querySelectorAll(FOCUSABLE2)).filter(el=>!el.closest("[inert]"))}function Popover({trigger,content,side="bottom",align="start",modal=!1,open:controlledOpen,onOpenChange,label,className,autoFocus=!0}){let t=useT(),[uncontrolled,setUncontrolled]=useState4(!1),open=controlledOpen??uncontrolled,triggerRef=useRef4(null),panelRef=useRef4(null),pinned=usePinnedLayerRoot(),[layerRoot,setLayerRoot]=useState4(null),id=useStableId("nui-popover"),latest=useLatest({onOpenChange,controlled:controlledOpen!==void 0}),setOpen=useCallback3(next=>{latest.current.controlled||setUncontrolled(next),latest.current.onOpenChange?.(next)},[latest]),close=useCallback3((focusTrigger=!1)=>{let panel=panelRef.current,active=deepActiveElement(triggerRef.current?.getRootNode()),focusInside2=!!panel&&!!active&&panel.contains(active);setOpen(!1),(focusTrigger||focusInside2)&&triggerRef.current&&triggerRef.current.focus({preventScroll:!0})},[setOpen]),controller=useMemo3(()=>({close:()=>close(!0)}),[close]),{style,side:placedSide}=useFloatingStyle(open&&!!layerRoot,triggerRef,panelRef,{side,align,offset:6});useEffect6(()=>{open&&setLayerRoot(pinned??findLayerRoot(triggerRef.current))},[open,pinned]),useEffect6(()=>{if(!open||!layerRoot)return;let frame=requestAnimationFrame(()=>{let panel=panelRef.current;if(!panel)return;((autoFocus?focusables(panel)[0]:void 0)??panel).focus({preventScroll:!0})});return()=>cancelAnimationFrame(frame)},[open,layerRoot,autoFocus]),useOutsidePress(open,()=>[triggerRef.current,panelRef.current],()=>setOpen(!1)),useEscapeLayer(`popover:${id}`,()=>open?(close(!0),!0):!1,{priority:ESCAPE_PRIORITY.overlay});let onKeyDown=event=>{if(!modal||event.key!=="Tab")return;let panel=panelRef.current;if(!panel)return;let list=focusables(panel);if(!list.length){event.preventDefault();return}let active=deepActiveElement(panel.getRootNode()),first=list[0],last=list[list.length-1];event.shiftKey&&(active===first||active===panel)?(event.preventDefault(),last.focus()):!event.shiftKey&&active===last&&(event.preventDefault(),first.focus())},triggerNode=cloneTrigger(trigger,{ref:node=>{triggerRef.current=node},"aria-haspopup":"dialog","aria-expanded":open,"aria-controls":open?id:void 0,onClick:event=>{event.stopPropagation(),setOpen(!open)}});return jsxs5(Fragment4,{children:[triggerNode,open&&layerRoot?createPortal3(jsx7("div",{ref:panelRef,id,role:"dialog","aria-modal":modal?"true":void 0,"aria-label":label?t(label):void 0,tabIndex:-1,"data-notis-escape-owned":"","data-notis-floating":"","data-notis-nonmodal":modal?void 0:"","data-side":placedSide,className:cx("nui-popover",className),style,onKeyDown,children:typeof content=="function"?content(controller):content}),layerRoot):null]})}import{useEffect as useEffect7,useRef as useRef5,useState as useState5}from"react";import{createPortal as createPortal4}from"react-dom";import{Fragment as Fragment5,jsx as jsx8,jsxs as jsxs6}from"react/jsx-runtime";function Tooltip({label,keys,side="top",align="center",delay=500,children,disabled}){let t=useT(),[open,setOpen]=useState5(!1),anchorRef=useRef5(null),tipRef=useRef5(null),timer=useRef5(null),pinned=usePinnedLayerRoot(),id=useStableId("nui-tip"),{style}=useFloatingStyle(open,anchorRef,tipRef,{side,align,offset:6}),clear=()=>{timer.current&&(clearTimeout(timer.current),timer.current=null)},show=now=>{disabled||(clear(),now?setOpen(!0):timer.current=setTimeout(()=>setOpen(!0),delay))},hide=()=>{clear(),setOpen(!1)};useEffect7(()=>()=>clear(),[]),useEffect7(()=>{disabled&&hide()},[disabled]),useEffect7(()=>{if(!open||typeof document>"u")return;let onKey=()=>hide();return document.addEventListener("keydown",onKey,!0),document.addEventListener("pointerdown",onKey,!0),()=>{document.removeEventListener("keydown",onKey,!0),document.removeEventListener("pointerdown",onKey,!0)}},[open]);let layerRoot=open?pinned??findLayerRoot(anchorRef.current):null,trigger=cloneTrigger(children,{ref:node=>{anchorRef.current=node},"aria-describedby":open?id:void 0,onPointerEnter:event=>{event.pointerType!=="touch"&&show(!1)},onPointerLeave:hide,onFocus:event=>{let target=event.target,visible=!0;try{visible=target.matches(":focus-visible")}catch{visible=!0}visible&&show(!0)},onBlur:hide});return jsxs6(Fragment5,{children:[trigger,open&&layerRoot?createPortal4(jsx8(KeycapSurface,{on:"tooltip",children:jsxs6("div",{ref:tipRef,id,role:"tooltip",className:"nui-tip",style,children:[jsx8("span",{children:t(label)}),keys?jsx8(Keycap,{keys}):null]})}),layerRoot):null]})}import{useCallback as useCallback13,useEffect as useEffect16,useImperativeHandle,useMemo as useMemo11,useRef as useRef15,useState as useState13}from"react";var ACTION_TOAST_MS=6e3,ACTION_WORDS=Object.freeze({failed:w("That did not work. Try again.","\xC7a n\u2019a pas march\xE9. R\xE9essaie."),resultUnknown:w("We could not confirm the result. Check before trying again.","Impossible de confirmer le r\xE9sultat. V\xE9rifie avant de r\xE9essayer."),undone:w("Undone.","Annul\xE9."),undoing:w("Undoing\u2026","Annulation\u2026"),undoFailed:w("Could not undo that.","Impossible d\u2019annuler."),dismiss:w("Dismiss","Fermer"),failedOne:w("1 item could not be changed. It stays selected.","1 \xE9l\xE9ment n\u2019a pas pu \xEAtre modifi\xE9. Il reste s\xE9lectionn\xE9."),failedMany:w("{n} items could not be changed. They stay selected.","{n} \xE9l\xE9ments n\u2019ont pas pu \xEAtre modifi\xE9s. Ils restent s\xE9lectionn\xE9s.")});function failedItemsWords(n){return n===1?ACTION_WORDS.failedOne:fillWords(ACTION_WORDS.failedMany,{n})}import{jsx as jsx9,jsxs as jsxs7}from"react/jsx-runtime";function ActionToast({toast,onUndo,onDismiss,owner}){let t=useT(),entry=DEFAULT_KEYMAP.undo,canUndo=!!toast?.undo,undoing=!!toast?.undoing;return useShortcuts(canUndo?[{id:entry.id,keys:[...entry.keys],scope:entry.scope,label:entry.label,...owner?{owner}:{},when:()=>canUndo,run:()=>canUndo?(undoing||onUndo(),!0):!1}]:[]),toast?jsx9("div",{className:"nui-toast-wrap",children:jsxs7("div",{className:"nui-toast",role:"status","aria-live":"polite","data-tone":toast.tone==="danger"?"danger":void 0,children:[jsxs7("span",{className:"nui-toast-text",children:[jsx9("span",{className:"nui-toast-words",children:t(toast.words)}),toast.reason&&jsx9("span",{className:"nui-toast-reason",children:t(toast.reason)})]}),toast.undo&&jsxs7("button",{type:"button",className:"nui-toast-btn","aria-disabled":undoing||void 0,"aria-busy":undoing||void 0,onClick:()=>{undoing||onUndo()},children:[t(undoing?ACTION_WORDS.undoing:SHELL_WORDS.undo),!undoing&&jsx9(Keycap,{keys:"z",on:"discreet"})]}),onDismiss&&!undoing&&jsx9("button",{type:"button",className:"nui-toast-x","aria-label":t(ACTION_WORDS.dismiss),onClick:onDismiss,children:jsx9(Icon,{name:"x"})})]})}):null}import{useCallback as useCallback5,useMemo as useMemo5,useRef as useRef7,useState as useState7}from"react";import{useCallback as useCallback4,useEffect as useEffect8,useMemo as useMemo4,useRef as useRef6,useState as useState6}from"react";function useToast(options={}){let[toast,setToast]=useState6(null),current=useRef6(null),timer=useRef6(null),seq=useRef6(0),optionsRef=useRef6(options);optionsRef.current=options;let clearTimer=()=>{timer.current&&clearTimeout(timer.current),timer.current=null},set=next=>{current.current=next,setToast(next)};useEffect8(()=>clearTimer,[]);let show=useCallback4(next=>{clearTimer();let state={...next,undoing:!1,id:++seq.current};set(state),timer.current=setTimeout(()=>{timer.current=null,current.current?.id===state.id&&!current.current.undoing&&set(null)},ACTION_TOAST_MS)},[]),notify=useCallback4((words,notifyOptions={})=>{show({words:toWords(words),reason:notifyOptions.reason?toWords(notifyOptions.reason):null,tone:notifyOptions.tone??"default",undo:notifyOptions.undo??null})},[show]),dismiss=useCallback4(()=>{current.current?.undoing||(clearTimer(),set(null))},[]),undo=useCallback4(async()=>{let shown=current.current;if(!(!shown?.undo||shown.undoing)){clearTimer(),set({...shown,undoing:!0});try{await shown.undo(),(!current.current||current.current.id===shown.id)&&show({words:ACTION_WORDS.undone,reason:null,tone:"default",undo:null})}catch(error){let reason=actionErrorReason(error);show({words:ACTION_WORDS.undoFailed,reason:reason?toWords(reason):null,tone:"danger",undo:null}),optionsRef.current.onError?.(error)}}},[show]);return useMemo4(()=>({toast,notify,undo,dismiss}),[toast,notify,undo,dismiss])}var DELETE_ACTION_TIMEOUT_MS=12e4,DeleteActionTimeout=class extends Error{code="notis_action_result_unknown";constructor(){super(ACTION_WORDS.resultUnknown.en),this.name="DeleteActionTimeout"}};function withDeleteDeadline(run){let timer;return Promise.race([Promise.resolve().then(run),new Promise((_,reject)=>{timer=setTimeout(()=>reject(new DeleteActionTimeout),DELETE_ACTION_TIMEOUT_MS)})]).finally(()=>clearTimeout(timer))}function resolveActions(refs,handlers={}){let out=[],seen=new Set;for(let ref of refs){let def=resolveActionRef(ref);if(seen.has(def.id))continue;let standard=isStandardActionId(def.id)?STANDARD_ACTIONS[def.id]:null;if(standard?.managerOnly)continue;let run=def.run??(standard?handlers[standard.id]:void 0);if(!run||!def.label)continue;seen.add(def.id);let options=def.options;out.push({id:def.id,label:toWords(def.label),icon:def.icon,key:def.key,tone:def.tone??"default",bulk:def.bulk??!0,appliesTo:def.appliesTo,run,toast:def.toast?def.toast:def.toast===void 0?void 0:null,toggle:def.toggle??standard?.toggle,picker:!!standard?.picker||!!options,options:options?items2=>typeof options=="function"?options(items2):options:void 0,value:def.value})}return out}function availableActions(actions,items2){if(!items2.length)return[];let result=[],fitsAll=action=>!action.appliesTo||items2.every(action.appliesTo),fitsSome=action=>!action.appliesTo||items2.some(action.appliesTo),handled=new Set;for(let action of actions){if(handled.has(action.id))continue;let partner=action.toggle?actions.find(other=>other.id===action.toggle):void 0;if(partner){handled.add(action.id),handled.add(partner.id);let pair=actions.indexOf(partner)<actions.indexOf(action)?[partner,action]:[action,partner],picked=pair.find(fitsAll)??pair.find(fitsSome);picked&&result.push(picked);continue}fitsSome(action)&&result.push(action)}return result}function isActionResult(value){return!!value&&typeof value=="object"&&!Array.isArray(value)}function iconSignature(icon){return icon===void 0?"":typeof icon=="string"?icon:"node"}function wordsSignature(words){return`${words.en}${words.fr}`}function useActions(refs,handlers={},options={}){let[busy,setBusy]=useState7(()=>new Set),busyRef=useRef7(new Set),optionsRef=useRef7(options);optionsRef.current=options;let toaster=useToast({onError:error=>optionsRef.current.onError?.(error,{id:"undo"})}),{notify}=toaster,refsRef=useRef7(refs);refsRef.current=refs;let handlersRef=useRef7(handlers);handlersRef.current=handlers;let runtime=useNotisRuntime(),resolved=resolveActions(refs,handlers),signature=resolved.map(action=>[action.id,wordsSignature(action.label),iconSignature(action.icon),keySignature(action.key),action.tone,action.bulk?1:0,action.toggle??"",action.picker?1:0,action.appliesTo?1:0,action.options?1:0,action.value?1:0,action.toast===null?0:1].join("")).join(""),actions=useMemo5(()=>resolved.map(action=>{let live=()=>resolveActions(refsRef.current,handlersRef.current).find(item=>item.id===action.id)??action;return{...action,run:((items2,choice)=>live().run(items2,choice)),appliesTo:action.appliesTo?item=>(live().appliesTo??action.appliesTo)(item):void 0,toast:action.toast===null?null:n=>{let current=live().toast;return current?current(n):null},options:action.options?items2=>(live().options??action.options)(items2):void 0,value:action.value?items2=>(live().value??action.value)(items2):void 0}}),[signature]),markBusy=useCallback5((id,on)=>{on?busyRef.current.add(id):busyRef.current.delete(id),setBusy(new Set(busyRef.current))},[]),run=useCallback5(async(actionOrId,items2,choice)=>{let action=typeof actionOrId=="string"?actions.find(item=>item.id===actionOrId):actionOrId;if(!action)return{status:"cancelled",done:[],failed:[]};if(busyRef.current.has(action.id))return{status:"busy",done:[],failed:[]};let targets=action.appliesTo?items2.filter(action.appliesTo):[...items2];if(!targets.length)return{status:"cancelled",done:[],failed:[]};markBusy(action.id,!0);let keys=action.id==="delete"?targets.map(recordKeyOf):[],hidden=keys.some(Boolean)?runtime?.queryClient?.hideRecords?.(keys.filter(key=>!!key)):void 0,settled=!1;try{let result=action.id==="delete"?await withDeleteDeadline(()=>action.run(targets,choice)):await action.run(targets,choice),ranUndo=typeof result=="function"?result:isActionResult(result)&&typeof result.undo=="function"?result.undo:null,detail=isActionResult(result)&&typeof result!="function"?result:null;if(detail?.cancelled)return{status:"cancelled",done:[],failed:[]};let failedSet=new Set(detail?.failed??[]),failed=targets.filter(item=>failedSet.has(item)),done=targets.filter(item=>!failedSet.has(item));hidden&&(hidden.commit(done.map(recordKeyOf).filter(key=>!!key)),hidden.restore(failed.map(recordKeyOf).filter(key=>!!key)),settled=!0);let undo=ranUndo&&hidden?async()=>{hidden.restore(),await ranUndo()}:ranUndo,reason=detail?.reason?toWords(detail.reason):null;if(failed.length&&!done.length)return notify(ACTION_WORDS.failed,{tone:"danger",reason}),{status:"failed",done,failed};if(failed.length)return notify(failedItemsWords(failed.length),{tone:"danger",undo,reason}),{status:"done",done,failed};let words;if(detail&&Object.prototype.hasOwnProperty.call(detail,"toast"))words=detail.toast?toWords(detail.toast):null;else{let custom=action.toast?action.toast(done.length):null;words=custom?toWords(custom):undo&&action.toast!==null?action.label:null}return words?notify(words,{undo,reason}):reason&&notify(reason,{undo}),{status:"done",done,failed}}catch(error){return notify(error instanceof DeleteActionTimeout?ACTION_WORDS.resultUnknown:ACTION_WORDS.failed,{tone:"danger",reason:actionErrorReason(error)}),optionsRef.current.onError?.(error,{id:action.id}),{status:"failed",done:[],failed:targets}}finally{hidden&&!settled&&hidden.restore(),markBusy(action.id,!1)}},[actions,notify,markBusy,runtime]),available=useCallback5(items2=>availableActions(actions,items2),[actions]),isBusy=useCallback5(id=>busyRef.current.has(id),[]);return{actions,available,run,busy,isBusy,toast:toaster.toast,notify,undo:toaster.undo,dismiss:toaster.dismiss}}function recordKeyOf(item){if(!item||typeof item!="object")return null;let value=item.record_key??item.recordKey;return typeof value=="string"&&value?value:null}function keySignature(key){return key===void 0?"":Array.isArray(key)?key.join(","):String(key)}import{forwardRef,useEffect as useEffect9,useRef as useRef8}from"react";import{jsx as jsx10,jsxs as jsxs8}from"react/jsx-runtime";var BLOCK_WORDS=Object.freeze({previousPage:{en:"Previous page",fr:"Page pr\xE9c\xE9dente"},nextPage:{en:"Next page",fr:"Page suivante"},pageOf:{en:"Page {page} of {count}",fr:"Page {page} sur {count}"},rangeOf:{en:"{from} to {to} of {total}",fr:"{from} \xE0 {to} sur {total}"},pagination:{en:"Pages",fr:"Pages"},emptyTitle:{en:"Nothing here yet",fr:"Rien ici pour l\u2019instant"},emptyBody:{en:"Items show up here as soon as there are some.",fr:"Les \xE9l\xE9ments s\u2019affichent ici d\xE8s qu\u2019il y en a."}});function Section({kind="data",title,count,meta,tabs,actions,children,className}){let t=useT(),hasMeta=meta!=null&&meta!==!1,head=title!==void 0||typeof count=="number"||hasMeta||!!tabs||!!actions;return jsxs8("section",{className:cx("nui-section",className),"data-kind":kind,children:[head&&jsxs8("div",{className:"nui-section-head",children:[title!==void 0&&jsx10("h2",{className:"nui-section-title",children:t(title)}),typeof count=="number"&&jsx10("span",{className:"nui-section-count",children:count}),hasMeta&&jsx10("span",{className:"nui-section-meta",children:textOrNode(meta,t)}),tabs&&jsx10("div",{className:"nui-section-tabs",children:tabs}),actions&&jsx10("div",{className:"nui-section-actions",children:actions})]}),children]})}function textOrNode(value,t){return typeof value=="string"||isWords2(value)?t(value):value}function Badge({tone="default",icon,children,className}){let t=useT();return jsxs8("span",{className:cx("nui-badge",className),"data-tone":tone==="default"?void 0:tone,children:[icon!==void 0&&renderIcon(icon),textOrNode(children,t)]})}function isWords2(value){return!!value&&typeof value=="object"&&typeof value.en=="string"&&typeof value.fr=="string"}var Button=forwardRef(function({variant="default",size="md",icon,pressed,children,className,type="button",...rest},ref){let t=useT();return jsxs8("button",{ref,type,className:cx("nui-btn",className),"aria-pressed":pressed,"data-variant":variant==="default"?void 0:variant,"data-size":size==="md"?void 0:size,...rest,children:[icon!==void 0&&renderIcon(icon),isWords2(children)?t(children):children]})});function ToggleGroup({options,value,onChange,label,size="sm",className}){let t=useT(),on=new Set(value);return jsx10("div",{role:"group",className:cx("nui-toggles",className),"aria-label":label!==void 0?t(label):void 0,children:options.map(option=>{let pressed=on.has(option.value);return jsxs8(Button,{size,pressed,disabled:option.disabled,icon:option.icon,onClick:()=>onChange(options.filter(other=>other.value===option.value?!pressed:on.has(other.value)).map(other=>other.value)),children:[t(option.label),typeof option.count=="number"&&jsx10("span",{className:"nui-btn-count",children:option.count})]},option.value)})})}function SegmentedControl({options,value,onChange,label,className}){let t=useT(),groupRef=useRef8(null);return useEffect9(()=>{revealInline(groupRef.current?.querySelector('[aria-pressed="true"]'))},[value]),jsx10("div",{ref:groupRef,role:"group",className:cx("nui-seg",className),"aria-label":label!==void 0?t(label):void 0,children:options.map(option=>jsxs8("button",{type:"button","aria-pressed":option.value===value,disabled:option.disabled,onClick:()=>{option.value!==value&&onChange(option.value)},children:[option.icon!==void 0&&renderIcon(option.icon),t(option.label),typeof option.count=="number"&&jsx10("span",{className:"nui-seg-count",children:option.count})]},option.value))})}function Switch({checked,onChange,label,hideLabel=!1,disabled=!1,busy=!1,size="sm",className}){let name=useT()(label);return jsxs8("button",{type:"button",role:"switch","aria-checked":checked,"aria-label":hideLabel?name:void 0,"aria-busy":busy||void 0,disabled,"data-size":size==="md"?"md":void 0,className:cx("nui-switch",className),onClick:event=>{event.stopPropagation(),!(disabled||busy)&&onChange(!checked)},children:[jsx10("span",{className:"nui-switch-track","aria-hidden":"true",children:jsx10("span",{className:"nui-switch-thumb"})}),!hideLabel&&jsx10("span",{className:"nui-switch-label",children:name})]})}function Pagination({page,pageCount,total:total2,pageSize,onChange,busy=!1,className}){let t=useT(),count=Math.max(1,pageCount??(total2!==void 0&&pageSize?Math.ceil(total2/pageSize):1)),current=Math.min(Math.max(1,Math.floor(page)),count),label=total2!==void 0&&pageSize?fillWords(BLOCK_WORDS.rangeOf,{from:total2===0?0:(current-1)*pageSize+1,to:Math.min(total2,current*pageSize),total:total2}):fillWords(BLOCK_WORDS.pageOf,{page:current,count});return jsxs8("nav",{className:cx("nui-pagination",className),"aria-label":t(BLOCK_WORDS.pagination),children:[jsx10("span",{className:"nui-pagination-label","aria-live":"polite",children:t(label)}),jsx10("button",{type:"button",className:"nui-icon-btn","aria-label":t(BLOCK_WORDS.previousPage),disabled:busy||current<=1,onClick:()=>onChange(current-1),children:jsx10(Icon,{name:"caret-left"})}),jsx10("button",{type:"button",className:"nui-icon-btn","aria-label":t(BLOCK_WORDS.nextPage),disabled:busy||current>=count,onClick:()=>onChange(current+1),children:jsx10(Icon,{name:"caret-right"})})]})}function NativeSelect({options,value,onChange,label,className,...rest}){let t=useT();return jsx10("select",{className:cx("nui-select",className),value,"aria-label":label!==void 0?t(label):void 0,onChange:event=>onChange(event.target.value),...rest,children:options.map(option=>jsx10("option",{value:option.value,disabled:option.disabled,children:t(option.label)},option.value))})}function EmptyState({title=BLOCK_WORDS.emptyTitle,body,action,icon,className}){let t=useT();return jsxs8("div",{className:cx("nui-empty",className),children:[icon!==void 0&&renderIcon(icon),jsx10("p",{className:"nui-empty-title",children:t(title)}),body!==void 0&&jsx10("p",{className:"nui-empty-body",children:t(body)}),action&&jsx10("div",{className:"nui-empty-action",children:action})]})}function Notice({tone="default",children,onRetry,action,urgent=!1,className}){let t=useT();return jsxs8("div",{className:cx("nui-notice",className),"data-tone":tone==="default"?void 0:tone,role:urgent?"alert":"status",children:[jsx10("div",{className:"nui-notice-text",children:isWords2(children)?t(children):children}),action,onRetry&&jsx10(Button,{size:"sm",onClick:onRetry,children:t(SHELL_WORDS.tryAgain)})]})}function Metric({label,value,delta,trend,invert=!1,hint,className}){let t=useT(),shown=trend==="flat"||trend===void 0?void 0:trend==="up"!==invert?"up":"down";return jsxs8("div",{className:cx("nui-metric",className),children:[jsx10("span",{className:"nui-metric-label",children:t(label)}),jsx10("span",{className:"nui-metric-value",children:value}),delta!=null&&jsx10("span",{className:"nui-metric-delta","data-trend":shown,children:delta}),hint!==void 0&&jsx10("span",{className:"nui-metric-hint",children:t(hint)})]})}import{useCallback as useCallback7,useEffect as useEffect11,useId as useId2,useMemo as useMemo6,useRef as useRef10,useState as useState9}from"react";import*as React5 from"react";function cssEscape(value){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(value):value.replace(/["\\]/g,"\\$&")}function useElementWidth(ref){let[width,setWidth]=React5.useState(1200);return React5.useEffect(()=>{let el=ref.current;if(!el)return;let measure2=()=>{el.clientWidth&&setWidth(el.clientWidth)};if(measure2(),typeof ResizeObserver>"u")return;let observer=new ResizeObserver(measure2);return observer.observe(el),()=>observer.disconnect()},[ref]),width}function useCursorFocus(rootRef,cursor){let pending=React5.useRef(null),focusNow=React5.useCallback(id=>{let root=rootRef.current,el=root?.querySelector(`[data-nav-id="${cssEscape(id)}"]`);if(!root||!el)return;let active=deepActiveElement(root.getRootNode());(!active||active===root.ownerDocument.body||root.contains(active))&&el.focus({preventScroll:!0}),el.scrollIntoView?.({block:"nearest",inline:"nearest"})},[rootRef]);return React5.useEffect(()=>{let id=pending.current;id===null||id!==cursor||(pending.current=null,focusNow(id))},[cursor,focusNow]),React5.useCallback((id,current)=>{id!==null&&(pending.current=id,id===current&&focusNow(id))},[focusNow])}function focusFreeFor(root){if(!root)return!1;let active=deepActiveElement(root.getRootNode());return!active||active===root.ownerDocument.body||root.contains(active)}function focusInside(root){if(!root)return!1;let active=deepActiveElement(root.getRootNode());return!!active&&active!==root.ownerDocument.body&&root.contains(active)}function useKeepFocusInside(rootRef){let armed=React5.useRef(!1);return React5.useEffect(()=>{if(!armed.current)return;armed.current=!1;let root=rootRef.current;root&&!focusInside(root)&&root.focus({preventScroll:!0})}),React5.useCallback(()=>{focusInside(rootRef.current)&&(armed.current=!0,setTimeout(()=>{armed.current=!1},0))},[rootRef])}function keymapDef(id,label,when,run){let entry=DEFAULT_KEYMAP[id];return{id:entry.id,keys:[...entry.keys],scope:entry.scope,label,when,run,...entry.repeat?{repeat:!0}:{}}}import{Fragment as Fragment6,jsx as jsx11,jsxs as jsxs9}from"react/jsx-runtime";var TABS_WORDS=Object.freeze({views:{en:"Views",fr:"Vues"},previousView:{en:"Previous view",fr:"Vue pr\xE9c\xE9dente"},nextView:{en:"Next view",fr:"Vue suivante"}}),TABROW_WORDS=Object.freeze({filters:{en:"Filters",fr:"Filtres"},more:{en:"More",fr:"Plus"},showMore:{en:"Show more",fr:"Afficher plus"}}),MORE_GUESS=72;function tabIds(prefix,value){let safe=value.replace(/[^A-Za-z0-9_-]/g,"_");return{tab:`${prefix}-tab-${safe}`,panel:`${prefix}-panel-${safe}`}}function tabPanelProps(prefix,value){let ids=tabIds(prefix,value);return{id:ids.panel,role:"tabpanel","aria-labelledby":ids.tab,tabIndex:0}}function stepIn(list,keyOf,from,direction){let count=list.length,found=list.findIndex(item=>keyOf(item)===from),start=found!==-1?found:direction===1?-1:count;for(let step=1;step<=count;step+=1){let item=list[((start+direction*step)%count+count)%count];if(!item.disabled&&keyOf(item)!==from)return item}return null}function edgeIn(list,end){return(end==="first"?list:[...list].reverse()).find(item=>!item.disabled)??null}var tabValue=tab=>tab.value,rowItemId=item=>item.id;function stepTab(tabs,from,direction){return stepIn(tabs,tabValue,from,direction)?.value??null}function Tabs({tabs,value,onChange,label,keys=!0,activation="auto",children,id,className,panelClassName}){let t=useT(),generated=useId2(),prefix=id??`nui-tabs${generated.replace(/[^A-Za-z0-9_-]/g,"")}`,stripRef=useRef10(null),latest=useRef10({tabs,value,onChange});latest.current={tabs,value,onChange};let tabElement=useCallback7(tabValue2=>stripRef.current?.querySelector(`[data-tab-value="${cssEscape(tabValue2)}"]`)??null,[]);useEffect11(()=>{revealInline(tabElement(value))},[value,tabElement]);let show=useCallback7((next,focus)=>{let{value:current,onChange:change}=latest.current;next!==current&&change(next),focus&&tabElement(next)?.focus()},[tabElement]),focusInStrip=()=>{let strip=stripRef.current,active=strip?.ownerDocument.activeElement??null;return!!strip&&!!active&&strip.contains(active)},defs=useMemo6(()=>{if(!keys)return[];let live=()=>isVisibleComposed(stripRef.current)&&latest.current.tabs.filter(tab=>!tab.disabled).length>1,step=direction=>()=>{let{tabs:list,value:current}=latest.current,next=stepTab(list,current,direction);if(next===null)return!1;show(next,focusInStrip())},def=(entry,label2,run)=>({id:entry.id,keys:[...entry.keys],scope:entry.scope,label:label2,when:live,run});return[def(DEFAULT_KEYMAP["view.prev"],TABS_WORDS.previousView,step(-1)),def(DEFAULT_KEYMAP["view.next"],TABS_WORDS.nextView,step(1))]},[keys,show]);useShortcuts(defs,[defs]);let onKeyDown=event=>{if(event.metaKey||event.ctrlKey||event.altKey)return;let from=event.target.closest('[role="tab"]')?.dataset.tabValue??value,next=null;if(event.key==="ArrowRight")next=stepTab(tabs,from,1);else if(event.key==="ArrowLeft")next=stepTab(tabs,from,-1);else if(event.key==="Home")next=edgeIn(tabs,"first")?.value??null;else if(event.key==="End")next=edgeIn(tabs,"last")?.value??null;else return;event.preventDefault(),event.stopPropagation(),!(next===null||next===from)&&(activation==="auto"?show(next,!0):tabElement(next)?.focus())},activeIds=tabIds(prefix,value);return jsxs9(Fragment6,{children:[jsx11("div",{ref:stripRef,role:"tablist","aria-orientation":"horizontal",className:cx("nui-tabs",className),"aria-label":t(label??TABS_WORDS.views),onKeyDown,children:tabs.map(tab=>{let selected=tab.value===value,ids=tabIds(prefix,tab.value);return jsxs9("button",{type:"button",role:"tab",id:ids.tab,"data-tab-value":tab.value,"aria-selected":selected,"aria-controls":ids.panel,tabIndex:selected?0:-1,disabled:tab.disabled,className:"nui-tab",onClick:()=>show(tab.value,!1),children:[tab.icon!==void 0&&renderIcon(tab.icon),jsx11("span",{className:"nui-tab-label",children:t(tab.label)}),typeof tab.count=="number"&&jsx11("span",{className:"nui-tab-count",children:tab.count})]},tab.value)})}),children!==void 0&&jsx11("div",{id:activeIds.panel,role:"tabpanel","aria-labelledby":activeIds.tab,tabIndex:0,className:cx("nui-tabpanel",panelClassName),children})]})}function splitItems(items2,value,maxVisible){if(maxVisible===void 0||items2.length<=maxVisible)return{shown:items2,hidden:[]};let cap=Math.max(1,Math.floor(maxVisible)),active=items2.findIndex(item=>item.id===value),shown=active>=cap?[...items2.slice(0,cap-1),items2[active]]:items2.slice(0,cap),ids=new Set(shown.map(item=>item.id));return{shown,hidden:items2.filter(item=>!ids.has(item.id))}}function px(...values){return values.reduce((total2,value)=>total2+(parseFloat(value??"")||0),0)}function TabRow({role,items:items2,value,onChange,label,maxVisible,lead,end,inset="list",keys=!1,id,className}){let t=useT(),generated=useId2(),prefix=id??`nui-tabrow${generated.replace(/[^A-Za-z0-9_-]/g,"")}`,isTabs=role==="tabs",stripRef=useRef10(null),focusNext=useRef10(null),widths=useRef10(new Map),moreWidth=useRef10(MORE_GUESS),[fit,setFit]=useState9(void 0),sizeKey=items2.map(item=>[item.id,t(item.label),item.count??"",typeof item.icon=="string"?item.icon:item.icon===void 0?"":"*"].join("")).join(""),[measuredKey,setMeasuredKey]=useState9(null),measuring=measuredKey!==sizeKey,limit=measuring?void 0:fit??maxVisible,{shown,hidden}=useMemo6(()=>splitItems(items2,value,limit),[items2,value,limit]),latest=useRef10({items:items2,value,onChange,maxVisible});latest.current={items:items2,value,onChange,maxVisible};let pill=useCallback7(itemId=>stripRef.current?.querySelector(`[data-item-id="${cssEscape(itemId)}"]`)??null,[]),refit=useCallback7(()=>{let strip=stripRef.current,tabs=strip?.parentElement,row=tabs?.parentElement,view=row?.ownerDocument.defaultView;if(!strip||!tabs||!row||!view)return;let{items:list,value:current,maxVisible:cap}=latest.current,rowStyle=view.getComputedStyle(row),stripStyle=view.getComputedStyle(strip),gap=px(rowStyle.columnGap),more=row.querySelector(":scope > .nui-tabrow-more");more&&more.offsetWidth>0&&(moreWidth.current=more.offsetWidth);let room=row.clientWidth-px(rowStyle.paddingLeft,rowStyle.paddingRight);for(let kid of Array.from(row.children))kid!==tabs&&kid!==more&&(room-=kid.offsetWidth+gap);if(row.clientWidth<=0)return;if(list.some(item=>!widths.current.has(item.id))){setMeasuredKey(null);return}let pillGap=px(stripStyle.columnGap),span=pills=>pills.reduce((total2,item,index)=>total2+(widths.current.get(item.id)??0)+(index>0?pillGap:0),px(stripStyle.paddingLeft,stripStyle.paddingRight)),all=splitItems(list,current,cap),next;if(all.hidden.length===0&&span(all.shown)<=room)next=void 0;else{let left=room-gap-moreWidth.current;next=1;for(let count=Math.min(cap??list.length,list.length);count>1;count-=1)if(span(splitItems(list,current,count).shown)<=left){next=count;break}cap!==void 0&&next>=cap&&(next=void 0)}setFit(prev=>prev===next?prev:next)},[]);useIsoLayoutEffect(()=>{let strip=stripRef.current,laidOut=!!strip?.parentElement?.parentElement&&strip.parentElement.parentElement.clientWidth>0;if(measuring&&widths.current.clear(),strip&&laidOut)for(let kid of Array.from(strip.children)){if(kid.dataset.itemId===void 0)continue;let label2=kid.querySelector(":scope > .nui-pill-label"),cut=label2?Math.max(0,label2.scrollWidth-label2.clientWidth):0;widths.current.set(kid.dataset.itemId,kid.offsetWidth+cut)}if(measuring){setMeasuredKey(sizeKey);return}refit()}),useEffect11(()=>{let row=stripRef.current?.closest(".nui-tabrow");if(!row)return;let observer=typeof ResizeObserver<"u"?new ResizeObserver(()=>refit()):null;observer?.observe(row);let alive=!0;return row.ownerDocument.fonts?.ready.then(()=>{alive&&setMeasuredKey(null)}),()=>{alive=!1,observer?.disconnect()}},[refit]);let shownKey=shown.map(item=>item.id).join(`
5
+ `);useEffect11(()=>{let wanted=focusNext.current;focusNext.current=null,wanted!==null&&wanted===value&&pill(value)?.focus()},[value,shownKey,pill]);let select=useCallback7((next,focus)=>{let{value:current,onChange:change}=latest.current;if(next!==current&&change(next),!focus)return;let target=pill(next);target?target.focus():focusNext.current=next},[pill]),focusInRow=()=>{let strip=stripRef.current,row=strip?.closest(".nui-tabrow")??null,active=strip?deepActiveElement(strip.getRootNode()):null;return!!row&&!!active&&row.contains(active)},defs=useMemo6(()=>{if(!keys)return[];let live=()=>isVisibleComposed(stripRef.current)&&latest.current.items.filter(item=>!item.disabled).length>1,step=direction=>()=>{let{items:list,value:current}=latest.current,next=stepIn(list,rowItemId,current,direction);if(next===null)return!1;select(next.id,focusInRow())},def=(entry,label2,run)=>({id:entry.id,keys:[...entry.keys],scope:entry.scope,label:label2,when:live,run});return[def(DEFAULT_KEYMAP["view.prev"],TABS_WORDS.previousView,step(-1)),def(DEFAULT_KEYMAP["view.next"],TABS_WORDS.nextView,step(1))]},[keys,select]);useShortcuts(defs,[defs]);let onKeyDown=event=>{if(event.metaKey||event.ctrlKey||event.altKey)return;let from=event.target.closest("[data-item-id]")?.dataset.itemId??value,forward=event.key==="ArrowRight"||!isTabs&&event.key==="ArrowDown",back=event.key==="ArrowLeft"||!isTabs&&event.key==="ArrowUp",next=null;if(forward)next=stepIn(shown,rowItemId,from,1);else if(back)next=stepIn(shown,rowItemId,from,-1);else if(event.key==="Home")next=edgeIn(shown,"first");else if(event.key==="End")next=edgeIn(shown,"last");else return;event.preventDefault(),event.stopPropagation(),!(next===null||next.id===from)&&select(next.id,!0)},tabStop=shown.some(item=>item.id===value&&!item.disabled)?value:edgeIn(shown,"first")?.id;return jsxs9("div",{className:cx("nui-tabrow",className),"data-inset":inset==="page"?"page":void 0,"data-fold":!measuring&&limit===1&&hidden.length>0?"least":void 0,children:[lead,jsx11("div",{className:"nui-tabrow-tabs",children:jsx11("div",{ref:stripRef,role:isTabs?"tablist":"radiogroup","aria-orientation":isTabs?"horizontal":void 0,"aria-label":t(label??(isTabs?TABS_WORDS.views:TABROW_WORDS.filters)),className:"nui-tabrow-strip",onKeyDown,children:shown.map(item=>{let on=item.id===value,ids=tabIds(prefix,item.id);return jsxs9("button",{type:"button",className:"nui-pill","data-item-id":item.id,"data-on":on?"":void 0,role:isTabs?"tab":"radio",id:isTabs?ids.tab:void 0,"aria-selected":isTabs?on:void 0,"aria-checked":isTabs?void 0:on,"aria-controls":isTabs&&id!==void 0?ids.panel:void 0,tabIndex:item.id===tabStop?0:-1,disabled:item.disabled,onClick:()=>select(item.id,!1),children:[item.icon!==void 0&&renderIcon(item.icon),jsx11("span",{className:"nui-pill-label",children:t(item.label)}),typeof item.count=="number"&&jsx11("span",{className:"nui-pill-count",children:item.count})]},item.id)})})}),hidden.length>0&&jsx11(Menu,{label:TABROW_WORDS.showMore,trigger:jsxs9("button",{type:"button",className:"nui-pill nui-tabrow-more",children:[jsx11("span",{className:"nui-pill-label",children:t(TABROW_WORDS.more)}),jsx11(Icon,{name:"caret-down",className:"nui-tabrow-caret"})]}),children:hidden.map(item=>jsxs9(Menu.Item,{icon:item.icon,disabled:item.disabled,onSelect:()=>select(item.id,!0),children:[t(item.label),typeof item.count=="number"&&jsx11("span",{className:"nui-tabrow-menu-count",children:item.count})]},item.id))}),end!==void 0&&jsx11("div",{className:"nui-tabrow-end",children:end})]})}import{useCallback as useCallback8,useEffect as useEffect12,useState as useState10}from"react";import{createContext as createContext4,createElement,useContext as useContext5}from"react";var OPEN_MODES=Object.freeze(["side","center","full"]);function isOpenMode(value){return value==="side"||value==="center"||value==="full"}var OPEN_MODE_CACHE_PREFIX="notis:open-mode:";function storage(){try{return typeof window<"u"?window.localStorage:null}catch{return null}}function readOpenModeCache(key){try{let value=storage()?.getItem(OPEN_MODE_CACHE_PREFIX+key);return isOpenMode(value)?value:null}catch{return null}}function writeOpenModeCache(key,mode){try{storage()?.setItem(OPEN_MODE_CACHE_PREFIX+key,mode)}catch{}}var localStorageOpenModeStore=Object.freeze({read:key=>readOpenModeCache(key),write:(key,mode)=>writeOpenModeCache(key,mode),subscribe:(key,onChange)=>{if(typeof window>"u")return()=>{};let listener=event=>{event.key===OPEN_MODE_CACHE_PREFIX+key&&onChange(isOpenMode(event.newValue)?event.newValue:null)};return window.addEventListener("storage",listener),()=>window.removeEventListener("storage",listener)}});function userSettingsOpenModeStore(settings){return{read:async key=>{let value=await settings.get(`openMode:${key}`);return isOpenMode(value)?value:null},write:(key,mode)=>settings.set(`openMode:${key}`,mode)}}var globalStore=localStorageOpenModeStore;function setOpenModeStore(store){let previous=globalStore;return globalStore=store??localStorageOpenModeStore,previous}function getOpenModeStore(){return globalStore}var OpenModeStoreContext=createContext4(null);function OpenModeStoreProvider({store,children}){return createElement(OpenModeStoreContext.Provider,{value:store},children)}function useOpenModeStore(){return useContext5(OpenModeStoreContext)??globalStore}function normalizeAllowed(allowed){let list=allowed===void 0?OPEN_MODES:typeof allowed=="string"?[allowed]:allowed,out=[];for(let mode of list)isOpenMode(mode)&&!out.includes(mode)&&out.push(mode);return out.length?out:["side"]}function useOpenModeKey(storageKey,listId="list"){let runtime=useNotisRuntime();if(storageKey)return storageKey;let spaceId=runtime?.resource?.kind==="space"?runtime.resource.id:runtime?.space?.id;return spaceId?`${spaceId}:${listId}`:null}function useOpenMode(options={}){let allowed=normalizeAllowed(options.allowed),allowedKey=allowed.join(","),key=useOpenModeKey(options.storageKey,options.listId),store=useOpenModeStore(),fit=useCallback8(mode2=>mode2&&allowed.includes(mode2)?mode2:allowed[0],[allowedKey]),[mode,setModeState]=useState10(()=>fit(key?readOpenModeCache(key):null));useEffect12(()=>{if(!key){setModeState(current=>fit(current));return}let alive=!0;setModeState(fit(readOpenModeCache(key)));let apply=value=>{!alive||!value||(writeOpenModeCache(key,value),setModeState(fit(value)))};try{let answer=store.read(key);answer&&typeof answer.then=="function"?answer.then(apply,()=>{}):apply(answer)}catch{}let unsubscribe=store.subscribe?.(key,apply);return()=>{alive=!1,unsubscribe?.()}},[key,store,fit]);let setMode=useCallback8(next=>{let value=fit(next);if(setModeState(value),!!key){writeOpenModeCache(key,value);try{Promise.resolve(store.write(key,value)).catch(()=>{})}catch{}}},[key,store,fit]);return[mode,setMode]}import{jsx as jsx12,jsxs as jsxs10}from"react/jsx-runtime";var OPEN_MODE_WORDS=Object.freeze({side:SHELL_WORDS.sidePeek,center:SHELL_WORDS.centerPeek,full:SHELL_WORDS.fullPage}),OPEN_MODE_ICONS=Object.freeze({side:"sidebar-simple",center:"square-center",full:"corners-out"});function OpenAsMenu({allowed,mode,onChange,className}){let t=useT(),modes=normalizeAllowed(allowed);if(modes.length<2)return null;let name=`${t(SHELL_WORDS.openAs)} ${t(OPEN_MODE_WORDS[mode]).toLowerCase()}`;return jsx12(Menu,{label:SHELL_WORDS.openAs,align:"start",trigger:jsxs10("button",{type:"button",className:className?`nui-om-btn ${className}`:"nui-om-btn","aria-label":name,"data-mode":mode,"data-part":"mode",children:[jsx12(Icon,{name:OPEN_MODE_ICONS[mode]}),jsx12(Icon,{name:"caret-down",className:"nui-om-caret"})]}),children:modes.map(option=>jsx12(Menu.Item,{icon:OPEN_MODE_ICONS[option],checked:option===mode,onSelect:()=>onChange(option),children:t(OPEN_MODE_WORDS[option])},option))})}function boardOrder(items2,columns,getColumn){let lanes=new Map(columns.map(column=>[column.id,[]]));for(let item of items2)lanes.get(getColumn(item))?.push(item);return columns.flatMap(column=>lanes.get(column.id))}function neighbourColumn(columns,columnId,delta){let index=columns.findIndex(column=>column.id===columnId);return index===-1?null:columns[index+delta]?.id??null}function dropIndex(tiles,pointerY){let index=tiles.findIndex(tile=>tile.top+tile.height/2>pointerY);return index===-1?{index:tiles.length,before:null}:{index,before:tiles[index].id}}var BOARD_WORDS=Object.freeze({board:w("Board","Tableau"),moveLeft:w("Move to the column on the left","D\xE9placer vers la colonne de gauche"),moveRight:w("Move to the column on the right","D\xE9placer vers la colonne de droite"),emptyColumn:w("No items","Aucun \xE9l\xE9ment"),moved:w("Moved to {column}.","D\xE9plac\xE9 vers {column}.")});import{useContext as useContext7}from"react";import{createContext as createContext5,useContext as useContext6}from"react";var IDLE_ROW_STATE=Object.freeze({cursor:!1,open:!1,selected:!1,anySelected:!1,index:-1}),RowStateContext=createContext5(null),RowIdContext=createContext5(null);function useRowState(id){let source=useContext6(RowStateContext),contextId=useContext6(RowIdContext),rowId=id??contextId;return!source||rowId===null?IDLE_ROW_STATE:source.stateOf(rowId)}import{Fragment as Fragment7,jsx as jsx13,jsxs as jsxs11}from"react/jsx-runtime";var STATUS_ALIASES=Object.freeze({backlog:"backlog",icebox:"backlog",someday:"backlog",todo:"todo",to_do:"todo",open:"todo",new:"todo",planned:"todo",triage:"todo",queued:"todo",active:"active",in_progress:"active",doing:"active",started:"active",running:"active",live:"active",beta:"active",in_beta:"active",review:"review",in_review:"review",ready_for_review:"review",needs_review:"review",to_review:"review",for_review:"review",awaiting_review:"review",pending_review:"review",under_review:"review",waiting:"waiting",blocked:"waiting",paused:"waiting",on_hold:"waiting",pending:"waiting",done:"done",completed:"done",complete:"done",closed:"done",resolved:"done",shipped:"done",merged:"done",cancelled:"cancelled",canceled:"cancelled",wont_do:"cancelled",duplicate:"cancelled",skipped:"cancelled",failed:"failed",error:"failed",errored:"failed",rejected:"failed",up:"up",operational:"up",online:"up",available:"up",down:"down",offline:"down",outage:"down",unavailable:"down",unreachable:"down"}),STATUS_ICONS=Object.freeze({backlog:"circle-dashed",todo:"circle",active:"circle-half",review:"circle-three-quarter",waiting:"clock-countdown",done:"check-circle-fill",cancelled:"minus-circle",failed:"x-circle-fill",up:"check-circle-fill",down:"x-circle-fill"}),STATUS_WORDS=Object.freeze({backlog:{en:"Backlog",fr:"En r\xE9serve"},todo:{en:"To do",fr:"\xC0 faire"},active:{en:"In progress",fr:"En cours"},review:{en:"Ready for review",fr:"\xC0 relire"},waiting:{en:"Waiting",fr:"En attente"},done:{en:"Done",fr:"Termin\xE9"},cancelled:{en:"Cancelled",fr:"Annul\xE9"},failed:{en:"Failed",fr:"\xC9chec"},up:{en:"Up",fr:"Disponible"},down:{en:"Down",fr:"Indisponible"}});function statusGroup(status){let key=status.trim().toLowerCase().replace(/[\s-]+/g,"_");return STATUS_ALIASES[key]??"todo"}function StatusIcon({status,label,decorative=!1}){let t=useT(),group=statusGroup(status);return jsx13("span",{className:"nui-st","data-st":group==="todo"?void 0:group,...decorative?{"aria-hidden":!0}:{role:"img","aria-label":t(label??STATUS_WORDS[group])},children:jsx13(Icon,{name:STATUS_ICONS[group]})})}var STAR_WORDS=Object.freeze({starred:{en:"Starred",fr:"Favori"}});function StarMark({decorative=!1}){let t=useT();return jsx13("span",{className:"nui-star",...decorative?{"aria-hidden":!0}:{role:"img","aria-label":t(STAR_WORDS.starred)},children:jsx13(Icon,{name:"star-fill"})})}function RowMore(){let source=useContext7(RowStateContext),id=useContext7(RowIdContext);return!source?.more||id===null?null:jsx13(Fragment7,{children:source.more(id)})}var ROW_TIME_WORDS=Object.freeze({today:{en:"Today",fr:"Aujourd\u2019hui"},ago:{en:"{t} ago",fr:"il y a {t}"}}),NB="\u202F",MINUTE=6e4,RELATIVE_DAYS=30,DATE_ONLY=/^(\d{4})-(\d{2})-(\d{2})$/;function parseRowDate(value,dateOnly=!1){if(typeof value=="string"){let match=DATE_ONLY.exec(value.trim());if(match)return{date:new Date(Number(match[1]),Number(match[2])-1,Number(match[3]),12),dateOnly:!0}}let date=value instanceof Date?new Date(value.getTime()):new Date(value);return dateOnly&&typeof value=="string"&&/^\d{4}-\d{2}-\d{2}T00:00(:00(\.0+)?)?(Z|[+-]00:?00)?$/.test(value.trim())?{date:new Date(date.getUTCFullYear(),date.getUTCMonth(),date.getUTCDate(),12),dateOnly:!0}:(dateOnly&&!Number.isNaN(date.getTime())&&date.setHours(12,0,0,0),{date,dateOnly})}function formatRowAgo(value,locale,now=new Date){let{date}=parseRowDate(value),ms=now.getTime()-date.getTime();if(Number.isNaN(ms)||ms<0)return null;let fr2=locale==="fr",minutes=Math.max(1,Math.floor(ms/MINUTE));if(minutes<60)return fr2?`${minutes}${NB}min`:`${minutes}m`;let hours=Math.round(minutes/60);if(hours<24)return fr2?`${hours}${NB}h`:`${hours}h`;let days=Math.round(hours/24);return fr2?`${days}${NB}j`:`${days}d`}function formatReaderAgo(value,locale,now=new Date){let ago=formatRowAgo(value,locale,now);return ago===null?"":pick(ROW_TIME_WORDS.ago,locale).replace("{t}",ago)}function formatRowTime(value,locale,now=new Date,timeOptions={}){let{date,dateOnly}=parseRowDate(value,timeOptions.dateOnly);if(Number.isNaN(date.getTime()))return"";let tag=locale==="fr"?"fr-FR":"en-US";if(date.getFullYear()===now.getFullYear()&&date.getMonth()===now.getMonth()&&date.getDate()===now.getDate()&&dateOnly)return pick(ROW_TIME_WORDS.today,locale);if(!dateOnly&&now.getTime()-date.getTime()<RELATIVE_DAYS*24*60*MINUTE){let ago=formatRowAgo(date,locale,now);if(ago!==null)return ago}let options={month:"short",day:"numeric"};return date.getFullYear()!==now.getFullYear()&&(options.year="numeric"),new Intl.DateTimeFormat(tag,options).format(date)}function initials(name){let parts=name.trim().split(/\s+/).filter(Boolean);if(!parts.length)return"";let first=parts[0][0]??"",last=parts.length>1?parts[parts.length-1][0]??"":"";return(first+last).toUpperCase()}function Check(){return jsx13("svg",{viewBox:"0 0 12 12","aria-hidden":"true",focusable:"false",children:jsx13("path",{d:"M2.5 6.2l2.3 2.3 4.7-4.9",fill:"none",stroke:"currentColor",strokeWidth:1.75,strokeLinecap:"round",strokeLinejoin:"round"})})}function TagX(){return jsx13("svg",{viewBox:"0 0 12 12",width:"10",height:"10","aria-hidden":"true",children:jsx13("path",{d:"M3 3l6 6M9 3l-6 6",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}function isUrgentLabel(entry){return typeof entry!="string"&&(entry.tone==="warning"||entry.tone==="danger")}function isStatusIcon(icon){return!!icon&&typeof icon=="object"&&!Array.isArray(icon)&&typeof icon.status=="string"&&!("$$typeof"in icon)}function Row({icon,title,meta,snippet,labels,tags,owner,time,dateOnly,now,trailing,more,state,wrap,className}){let locale=useToolkitLocale(),source=useContext7(RowStateContext),contextId=useContext7(RowIdContext),contextState=useRowState(),inList=!!source&&contextId!==null,rowState=state??(inList?contextState:IDLE_ROW_STATE),lead=icon==null||icon===!1?null:isStatusIcon(icon)?jsx13(StatusIcon,{status:icon.status}):renderIcon(icon),toggle=inList?source.toggle:null,showMore=(more??!0)&&inList&&!!source.more,hasMeta=meta!=null&&meta!==!1,ordered=labels?.length?[...labels.filter(isUrgentLabel),...labels.filter(entry=>!isUrgentLabel(entry))]:[],hasTime=time!=null&&time!=="",content=jsxs11(Fragment7,{children:[(lead||toggle)&&jsxs11("span",{className:"nui-row-lead",children:[lead&&jsx13("span",{className:"nui-row-icon",children:lead}),toggle&&jsx13("button",{type:"button",className:"nui-row-check",tabIndex:-1,role:"checkbox","aria-checked":rowState.selected,"aria-label":pick(SHELL_WORDS.select,locale),onClick:event=>{event.stopPropagation(),toggle(contextId)},children:jsx13(Check,{})})]}),jsxs11("span",{className:"nui-row-main","data-wrap":wrap===2?2:void 0,children:[jsx13("span",{className:"nui-row-title","data-lines":wrap===2?2:void 0,children:title}),(hasMeta||ordered.length>0)&&jsxs11("span",{className:"nui-row-meta",children:[hasMeta&&jsx13("span",{className:"nui-row-meta-start",children:meta}),hasMeta&&ordered.length>0&&jsx13("span",{className:"nui-row-dot","aria-hidden":"true",children:"\xB7"}),ordered.length>0&&jsx13("span",{className:"nui-row-labels",children:ordered.map((entry,index)=>{let label=typeof entry=="string"?entry:entry.label,tone=typeof entry=="string"?void 0:entry.tone;return jsxs11("span",{className:"nui-row-label","data-tone":tone&&tone!=="default"?tone:void 0,children:[index>0?", ":"",pick(label,locale)]},index)})})]}),snippet!=null&&snippet!==!1&&jsx13("span",{className:"nui-row-snippet",children:snippet})]}),tags?.length?jsx13("span",{className:"nui-row-tags",children:tags.map(tag=>jsxs11("span",{className:"nui-row-tag","data-removable":tag.onRemove||tag.pending?"":void 0,title:tag.label,children:[tag.icon&&jsx13("span",{className:"nui-row-tag-icon","aria-hidden":"true",children:renderIcon(tag.icon)}),jsx13("span",{className:"nui-row-tag-label",children:tag.label}),tag.pending?jsx13("span",{className:"nui-row-tag-spin",role:"status","aria-label":pick(fillWords(SHELL_WORDS.savingNamed,{name:tag.label}),locale)}):tag.onRemove&&jsx13("button",{type:"button",className:"nui-row-tag-x",tabIndex:-1,disabled:tag.busy,"aria-label":tag.removeLabel??pick(fillWords(SHELL_WORDS.removeNamed,{name:tag.label}),locale),onClick:event=>{event.stopPropagation(),tag.onRemove()},children:jsx13(TagX,{})})]},tag.id))}):null,(owner||hasTime||trailing||showMore)&&jsxs11("span",{className:"nui-row-trail",children:[trailing,hasTime&&jsx13("time",{className:"nui-row-time",dateTime:toIso(time,dateOnly),children:formatRowTime(time,locale,now??new Date,{dateOnly})}),owner&&jsx13("span",{className:"nui-avatar",title:owner.name,role:"img","aria-label":owner.name,children:owner.avatarUrl?jsx13("img",{src:owner.avatarUrl,alt:""}):initials(owner.name)}),showMore&&source.more(contextId)]})]});return inList?content:jsx13("div",{className:cx("nui-row",className),"data-cursor":flag(rowState.cursor),"data-open":flag(rowState.open),"data-selected":flag(rowState.selected),"data-wrap":wrap===2?2:void 0,children:content})}function toIso(value,dateOnly){let parsed=parseRowDate(value,dateOnly);if(Number.isNaN(parsed.date.getTime()))return;if(!parsed.dateOnly)return parsed.date.toISOString();let d=parsed.date;return`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,"0")}-${String(d.getDate()).padStart(2,"0")}`}import{useCallback as useCallback9,useMemo as useMemo7,useRef as useRef11,useState as useState11}from"react";import{jsx as jsx14,jsxs as jsxs12}from"react/jsx-runtime";var SELECTION_BAR_MAX_INLINE=5,SELECTION_BAR_BOOST=25,BAR_WORDS=Object.freeze({label:{en:"Selection actions",fr:"Actions de la s\xE9lection"}});function chooseFit(measure2,room){for(let fit of["","nokeys","icons"])if(measure2(fit)<=room)return fit;return"icons"}function SelectionBar({actions,count,onClear,onRun,busy,anchor="list",className}){let t=useT(),locale=useToolkitLocale(),barRef=useRef11(null),[fit,setFit]=useState11(""),inline=actions.slice(0,SELECTION_BAR_MAX_INLINE),overflow=actions.slice(SELECTION_BAR_MAX_INLINE),label=t(selectedCount(count)),signature=`${actions.map(action=>action.id).join(",")}|${count}|${locale}`,refit=useCallback9(()=>{let bar=barRef.current,slot=bar?.parentElement;if(!bar||!slot)return;let room=slot.clientWidth-24;if(room<=0)return;bar.style.maxWidth="none";let next=chooseFit(candidate=>(candidate?bar.dataset.fit=candidate:delete bar.dataset.fit,bar.offsetWidth),room);bar.style.maxWidth="",next?bar.dataset.fit=next:delete bar.dataset.fit,setFit(next)},[]);useIsoLayoutEffect(()=>{refit()},[refit,signature]),useIsoLayoutEffect(()=>{let slot=barRef.current?.parentElement;if(!slot||typeof ResizeObserver>"u")return;let observer=new ResizeObserver(()=>refit());return observer.observe(slot),()=>observer.disconnect()},[refit]);let tipped=(key,node,name,keys)=>jsx14(Tooltip,{label:name,keys,disabled:fit==="",children:node},key);return jsx14("div",{className:"nui-selbar-slot","data-anchor":anchor==="page"?"page":void 0,children:jsx14(KeycapSurface,{on:"pill",children:jsxs12("div",{ref:barRef,className:cx("nui-selbar",className),role:"toolbar","aria-label":t(BAR_WORDS.label),"data-fit":fit||void 0,children:[jsx14("span",{className:"nui-sb-count","aria-live":"polite",children:label}),inline.map(action=>{let keys=keyList(action.key),name=t(action.label),running=!!busy?.has(action.id);return tipped(action.id,jsxs12("button",{type:"button",className:"nui-sb-btn","aria-label":name,"data-action":action.id,"aria-busy":running||void 0,disabled:running,"aria-haspopup":action.options?"menu":void 0,"data-tone":action.tone==="danger"?"danger":void 0,onClick:event=>onRun(action,event.currentTarget),children:[jsx14("span",{className:"nui-sb-icon",children:renderIcon(action.icon)}),jsx14("span",{className:"nui-sb-label",children:name}),keys.length>0&&jsx14(Keycap,{keys,className:"nui-sb-keys"})]}),action.label,keys.length?keys:void 0)}),overflow.length>0&&jsx14(Menu,{side:"top",align:"end",label:SHELL_WORDS.more,accelerators:!1,trigger:jsxs12("button",{type:"button",className:"nui-sb-btn","aria-label":t(SHELL_WORDS.more),children:[jsx14("span",{className:"nui-sb-icon",children:jsx14(Icon,{name:"dots-three"})}),jsx14("span",{className:"nui-sb-label",children:t(SHELL_WORDS.more)})]}),children:overflow.map(action=>jsx14(Menu.Item,{icon:action.icon,tone:action.tone,disabled:!!busy?.has(action.id),keys:action.key?keyList(action.key):void 0,onSelect:()=>onRun(action,null),children:t(action.label)},action.id))}),tipped("clear",jsx14("button",{type:"button",className:"nui-sb-btn","aria-label":t(SHELL_WORDS.clearSelection),"data-action":"clear",onClick:onClear,children:jsx14(Icon,{name:"x",className:"nui-sb-x"})}),SHELL_WORDS.clearSelection,["escape"])]})})})}function useSelectionBar(options){let{controller,selection,getItem}=options,platform=useToolkitPlatform(),latest=useLatest(options),selectedItems=useMemo7(()=>{let out=[];for(let id of selection.selected){let item=getItem(id);item!==void 0&&out.push(item)}return out},[selection.selected,getItem]),bulk=useMemo7(()=>controller.actions.filter(action=>action.bulk),[controller.actions]),available=useMemo7(()=>controller.available(selectedItems).filter(action=>action.bulk),[controller,selectedItems]),targets=useCallback9(()=>{let{selection:sel,getItem:lookup,fallback}=latest.current;if(sel.count>0){let out=[];for(let id of sel.selected){let item=lookup(id);item!==void 0&&out.push(item)}return out}return fallback?.()??[]},[latest]),runAction=useCallback9(async(action,anchor=null)=>{let items2=targets();if(!items2.length)return null;let live=latest.current;if(action.options&&live.onPick)return live.onPick(action,items2,anchor),null;let outcome=await live.controller.run(action,items2);return outcome.status!=="busy"&&latest.current.onRan?.(action,items2,outcome),outcome},[latest,targets]),groups=useMemo7(()=>{let byKey=new Map;for(let action of bulk)for(let spec of keyList(action.key)){let canonical=canonicalKey(spec,platform),group=byKey.get(canonical)??{spec,actions:[]};group.actions.push(action),byKey.set(canonical,group)}return[...byKey.entries()]},[bulk,platform]),defs=useMemo7(()=>groups.map(([canonical,group])=>({id:`selection.${group.actions.map(action=>action.id).join("|")}.${canonical}`,keys:[group.spec],scope:"collection",boost:SELECTION_BAR_BOOST,label:group.actions[0].label,...latest.current.owner?{owner:latest.current.owner}:{},when:()=>(latest.current.when?.()??!0)&&targets().length>0,run:()=>{let items2=targets(),fits=latest.current.controller.available(items2),action=group.actions.find(candidate=>fits.some(fit=>fit.id===candidate.id));return action?(runAction(action),!0):!1}})),[groups,latest,runAction,targets]);useShortcuts(defs);let barProps={actions:available,count:selection.count,onClear:selection.clear,onRun:(action,anchor)=>{runAction(action,anchor??null)},busy:controller.busy};return{visible:selection.count>0&&bulk.length>0,selectedItems,barProps,runAction}}import{useCallback as useCallback10,useEffect as useEffect13,useMemo as useMemo8,useRef as useRef12}from"react";var ROW_INTERACTIVE_SELECTOR='button, a, input, textarea, select, [role="button"], [contenteditable]:not([contenteditable="false"])',ROW_ID_ATTRIBUTE="data-nui-item",LONG_PRESS_MS=500,LONG_PRESS_TOLERANCE_PX=10;function cssEscape2(value){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(value):value.replace(/["\\]/g,"\\$&")}function findRow(container,id){return container?.querySelector(`[${ROW_ID_ATTRIBUTE}="${cssEscape2(id)}"]`)??null}var GRID_WORDS=Object.freeze({left:{en:"Tile to the left",fr:"Tuile \xE0 gauche"},right:{en:"Tile to the right",fr:"Tuile \xE0 droite"},up:{en:"Tile above",fr:"Tuile au-dessus"},down:{en:"Tile below",fr:"Tuile en dessous"}});function boardStep(lanes,current,dir){let lane=current===null?-1:lanes.findIndex(ids=>ids.includes(current));if(lane===-1)return lanes.find(ids=>ids.length>0)?.[0]??null;let index=lanes[lane].indexOf(current);if(dir==="up"||dir==="down")return lanes[lane][index+(dir==="up"?-1:1)]??null;let delta=dir==="left"?-1:1;for(let next=lane+delta;next>=0&&next<lanes.length;next+=delta){let ids=lanes[next];if(ids.length>0)return ids[Math.min(index,ids.length-1)]}return null}function gridColumns(container,ids){let rows=ids.map(id=>findRow(container,id)).filter(row=>!!row);if(rows.length<2)return 1;let top=Math.round(rows[0].getBoundingClientRect().top),count=0;for(let row of rows){if(Math.round(row.getBoundingClientRect().top)!==top)break;count+=1}return Math.max(1,count)}function focusStaysOnMove(active,container){if(!active||active===active.ownerDocument.body||containsComposed(container,active))return!1;let holder=closestComposed(active,"[data-notis-escape-owned]");return holder!==null&&!containsComposed(holder,container)}function isInteractiveTarget(event){let target=event.target;if(!target||target===event.currentTarget||typeof target.closest!="function")return!1;let hit=target.closest(ROW_INTERACTIVE_SELECTOR);return!!hit&&hit!==event.currentTarget&&event.currentTarget?.contains(hit)===!0}function useListKeys(options){let{ids,cursor,containerRef,selection=null,openId=null,wrap=!0,scope="collection",enabled=!0,owner}=options,platform=useToolkitPlatform(),latest=useLatest(options),pendingFocus=useRef12(null),suppressClick=useRef12(!1),longPressed=useRef12(!1),press=useRef12(null),cancelPress=useCallback10(()=>{press.current&&clearTimeout(press.current.timer),press.current=null},[]);useEffect13(()=>cancelPress,[cancelPress]);let visibleIds=useCallback10(()=>{let container=containerRef.current;return latest.current.ids.filter(id=>{let row=findRow(container,id);return!row||isVisibleComposed(row)})},[containerRef,latest]),focusRow=useCallback10(id=>{let container=containerRef.current,row=findRow(container,id);if(!row)return;let active=deepActiveElement(row.getRootNode());focusStaysOnMove(active,container)||row.focus({preventScroll:!0}),row.scrollIntoView?.({block:"nearest"})},[containerRef]);useEffect13(()=>{let id=pendingFocus.current;id===null||id!==cursor||(pendingFocus.current=null,focusRow(id))},[cursor,focusRow]);let moveTo=useCallback10((next,open)=>{if(next===null)return!1;let{setCursor,onOpen}=latest.current;return pendingFocus.current=next,setCursor(next),next===latest.current.cursor&&focusRow(next),open&&onOpen(next),!0},[focusRow,latest]),live=()=>enabled&&latest.current.enabled!==!1&&isVisibleComposed(containerRef.current)&&latest.current.ids.length>0,defs=useMemo8(()=>{let k=DEFAULT_KEYMAP,step=delta=>event=>{let{cursor:current,wrap:wrapping=!0,openId:open=null,selection:sel=null}=latest.current,visible=visibleIds(),next=stepCursor(visible,current,delta,{wrap:wrapping,repeat:event.repeat});return next===null?!1:next===current&&delta>0&&latest.current.onReachEnd&&visible[visible.length-1]===current?(latest.current.onReachEnd(),!0):(sel?.navigate(next),moveTo(next,open!==null&&next!==open))},extend=delta=>event=>{let{cursor:current,selection:sel}=latest.current;if(!sel)return!1;let next=stepCursor(visibleIds(),current,delta,{wrap:!1,repeat:event.repeat});return next===null?!1:(sel.extendStep(next),moveTo(next,!1))},base=entry=>({id:entry.id,keys:[...entry.keys],scope,label:entry.label,when:live,...owner?{owner}:{}}),gridOn=!!latest.current.grid||!!latest.current.board,noArrows=def=>gridOn?{...def,keys:[def.keys].flat().filter(spec=>!/^arrow(up|down)$/i.test(spec))}:def,list=[{...noArrows(base(k["list.next"])),repeat:!0,run:step(1)},{...noArrows(base(k["list.prev"])),repeat:!0,run:step(-1)},{...base(k["list.open"]),run:()=>{let{cursor:current,onOpen}=latest.current;return current===null||!latest.current.ids.includes(current)?!1:(onOpen(current),!0)}}];if(selection&&list.push({...base(k["list.extendDown"]),repeat:!0,run:extend(1)},{...base(k["list.extendUp"]),repeat:!0,run:extend(-1)},{...base(k["list.toggleSelect"]),run:()=>{let{cursor:current,selection:sel}=latest.current;return!sel||current===null?!1:(sel.toggle(current),!0)}},{...base(k["list.selectAll"]),run:()=>{let sel=latest.current.selection;return sel?(sel.selectAll(),!0):!1}}),gridOn){let gridStep=dir=>()=>{let{cursor:current,openId:open=null,selection:sel=null}=latest.current,visible=visibleIds(),index=current===null?-1:visible.indexOf(current);if(index===-1)return moveTo(visible[0]??null,!1);let board=latest.current.board;if(board){let shown=new Set(visible),next2=boardStep(board.map(ids2=>ids2.filter(id=>shown.has(id))),current,dir);return next2===null||next2===current?!0:(sel?.navigate(next2),moveTo(next2,open!==null&&next2!==open))}let columns=gridColumns(containerRef.current,visible),delta=dir==="left"?-1:dir==="right"?1:dir==="up"?-columns:columns,target=index+delta;if(target<0||target>=visible.length)return!0;let next=visible[target];return sel?.navigate(next),moveTo(next,open!==null&&next!==open)};for(let dir of["left","right","up","down"])list.push({id:`list.grid.${dir}`,keys:[`arrow${dir}`],scope,label:GRID_WORDS[dir],when:live,repeat:!0,...owner?{owner}:{},run:gridStep(dir)})}return list},[scope,owner,!!selection,enabled,!!options.grid||!!options.board]);useShortcuts(enabled?defs:[],[enabled]);let isMod=event=>platform==="mac"?event.metaKey:event.ctrlKey,roving=(cursor!==null&&ids.includes(cursor)?cursor:null)??(openId!==null&&ids.includes(openId)?openId:null)??ids[0]??null;return{getRowProps:id=>{let selected=selection?.isSelected(id)??!1;return{role:"option","aria-selected":selected,tabIndex:id===roving?0:-1,[ROW_ID_ATTRIBUTE]:id,"data-cursor":flag(id===cursor),"data-open":flag(id===openId),"data-selected":flag(selected),onMouseDown:event=>{if(event.button!==0||!isMod(event)||isInteractiveTarget(event))return;let sel=latest.current.selection;sel&&(event.preventDefault(),suppressClick.current=!0,sel.toggle(id),latest.current.setCursor(id),event.currentTarget.focus({preventScroll:!0}))},onClickCapture:event=>{longPressed.current&&(longPressed.current=!1,event.preventDefault(),event.stopPropagation())},onClick:event=>{if(suppressClick.current){suppressClick.current=!1;return}if(event.defaultPrevented||isInteractiveTarget(event))return;let{selection:sel,setCursor,onOpen}=latest.current;if(event.shiftKey&&sel){event.preventDefault(),sel.extendTo(id),setCursor(id);return}isMod(event)||(sel&&(sel.clear(),sel.activate(id)),setCursor(id),onOpen(id))},onKeyDown:event=>{if(event.target!==event.currentTarget||event.key!==" ")return;let sel=latest.current.selection;sel&&(event.preventDefault(),sel.toggle(id),latest.current.setCursor(id))},onFocus:event=>{event.target===event.currentTarget&&latest.current.cursor!==id&&latest.current.setCursor(id)},onPointerDown:event=>{!latest.current.selection||event.pointerType!=="touch"||event.button!==0||isInteractiveTarget(event)||(cancelPress(),press.current={id,x:event.clientX,y:event.clientY,timer:setTimeout(()=>{press.current=null;let{selection:sel,setCursor}=latest.current;sel&&(suppressClick.current=!0,longPressed.current=!0,sel.toggle(id),setCursor(id))},LONG_PRESS_MS)})},onPointerMove:event=>{let start=press.current;start&&(Math.abs(event.clientX-start.x)>LONG_PRESS_TOLERANCE_PX||Math.abs(event.clientY-start.y)>LONG_PRESS_TOLERANCE_PX)&&cancelPress()},onPointerUp:()=>cancelPress(),onPointerCancel:()=>cancelPress()}},visibleIds}}import{createElement as createElement2,useCallback as useCallback11,useEffect as useEffect14,useMemo as useMemo9,useRef as useRef13,useState as useState12}from"react";var REORDER_DRAG_TYPE="application/x-notis-reorder",REORDER_WORDS=Object.freeze({hint:w("Drag to reorder. Alt and an arrow key also move it.","Glisse pour r\xE9ordonner. Alt et une fl\xE8che le d\xE9placent aussi."),moved:w("Moved to position {n} of {total}.","D\xE9plac\xE9 en position {n} sur {total}."),failed:w("Could not save the new order. Try again.","Impossible d\u2019enregistrer le nouvel ordre. R\xE9essaie.")}),sameOrder=(a,b)=>a.length===b.length&&a.every((id,i)=>id===b[i]);function mergeOrder(order,natural){let present=new Set(natural),out=order.filter(id=>present.has(id)),kept=new Set(out);for(let id of natural)kept.has(id)||out.push(id);return out}function dropIndex2(from,over,side){let place2=side==="before"?over:over+1;return place2>from?place2-1:place2}var KEY_STEPS={vertical:{ArrowUp:-1,ArrowDown:1},horizontal:{ArrowLeft:-1,ArrowRight:1},both:{ArrowUp:-1,ArrowDown:1,ArrowLeft:-1,ArrowRight:1}};function useReorder(options){let{items:natural,getId,enabled=!0,orientation="vertical"}=options,t=useT(),latest=useLatest(options),hintId=useStableId("nui-reorder-hint"),naturalIds=useMemo9(()=>natural.map(getId),[natural,getId]),naturalKey=naturalIds.join("\0"),[override,setOverride]=useState12(null);useEffect14(()=>{override&&(sameOrder(mergeOrder(override.ids,naturalIds),naturalIds)||override.settled&&naturalKey!==override.base)&&setOverride(null)},[naturalIds,naturalKey,override]);let ids=useMemo9(()=>override?mergeOrder(override.ids,naturalIds):naturalIds,[naturalIds,override]),items2=useMemo9(()=>{if(!override)return natural.slice();let byId=new Map;return natural.forEach((item,index)=>byId.set(naturalIds[index],item)),ids.map(id=>byId.get(id)).filter(item=>item!==void 0)},[ids,natural,naturalIds,override]),current=useLatest({ids,items:items2,naturalKey}),[message,setMessage]=useState12(""),flip=useRef13(!1),say=useCallback11(text=>{flip.current=!flip.current,setMessage(flip.current?text:`${text}\xA0`)},[]),seq=useRef13(0),[pendingCount,setPendingCount]=useState12(0),move=useCallback11((id,target2)=>{let{ids:order,items:shown,naturalKey:base}=current.current,from=order.indexOf(id);if(from<0)return;let to=Math.max(0,Math.min(order.length-1,Math.round(target2)));if(to===from)return;let next=order.slice();next.splice(from,1),next.splice(to,0,id);let item=shown[from],mine=++seq.current;setOverride({ids:next,base,seq:mine,settled:!1}),say(t(REORDER_WORDS.moved).replace("{n}",String(to+1)).replace("{total}",String(next.length)));let settle=()=>setOverride(prev=>prev&&prev.seq===mine?{...prev,settled:!0}:prev),fail=error=>{setOverride(null);let onError=latest.current.onError;onError?onError(error):say(t(REORDER_WORDS.failed))},result;try{result=latest.current.onReorder({item,id,from,to,ids:next})}catch(error){fail(error);return}result&&typeof result.then=="function"?(setPendingCount(count=>count+1),result.then(settle,fail).finally(()=>setPendingCount(count=>count-1))):settle()},[current,latest,say,t]),dragging=useRef13(null),[dragState,setDragState]=useState12(null),endDrag=useCallback11(()=>{dragging.current=null,setDragState(null)},[]),target=(overId,event)=>{let from=current.current.ids.indexOf(dragging.current??""),over=current.current.ids.indexOf(overId);if(from<0||over<0)return null;let rect=event.currentTarget.getBoundingClientRect(),side=((latest.current.orientation==="horizontal"||latest.current.orientation==="both")&&rect.width>0?event.clientX<rect.left+rect.width/2:rect.height>0?event.clientY<rect.top+rect.height/2:over<from)?"before":"after",to=dropIndex2(from,over,side);return to===from?null:{side,to}},nodes=useRef13(new Map),refs=useRef13(new Map),refFor=id=>{let ref=refs.current.get(id);return ref||(ref=element=>{element?nodes.current.set(id,element):nodes.current.delete(id)},refs.current.set(id,ref)),ref},refocus=useRef13(null);useIsoLayoutEffect(()=>{let id=refocus.current;if(id===null)return;refocus.current=null;let node=nodes.current.get(id);node&&node.ownerDocument.activeElement!==node&&node.focus()});let movableItem=id=>{let index=current.current.ids.indexOf(id),item=current.current.items[index],can=latest.current.canReorder;return item!==void 0&&(!can||can(item))},getItemProps=(id,itemOptions)=>{if(!enabled)return{};let movable=itemOptions?.movable??movableItem(id),drop=dragState&&dragState.over===id?dragState.side:void 0,props={ref:refFor(id),"data-reorder":"","data-drop":drop,onDragOver:event=>{if(dragging.current===null)return;event.preventDefault(),event.dataTransfer&&(event.dataTransfer.dropEffect="move");let found=target(id,event),over=found?id:null,side=found?.side??"before";setDragState(prev=>prev&&prev.over===over&&prev.side===side?prev:{id:dragging.current,over,side})},onDragLeave:event=>{if(dragging.current===null)return;let next=event.relatedTarget;next&&event.currentTarget.contains(next)||setDragState(prev=>prev&&prev.over===id?{...prev,over:null}:prev)},onDrop:event=>{if(dragging.current===null)return;event.preventDefault();let moved=dragging.current,found=target(id,event);endDrag(),found&&move(moved,found.to)}};return movable?{...props,draggable:!0,"aria-describedby":hintId,"data-dragging":flag(dragState?.id===id),onDragStart:event=>{if(event.target!==event.currentTarget)return;dragging.current=id,setDragState({id,over:null,side:"before"});let data=event.dataTransfer;if(data)try{data.setData(REORDER_DRAG_TYPE,id),(data.effectAllowed==="none"||data.effectAllowed==="uninitialized")&&(data.effectAllowed="move")}catch{}},onDragEnd:endDrag,onKeyDown:event=>{if(event.target!==event.currentTarget||event.defaultPrevented||!event.altKey||event.metaKey||event.ctrlKey||event.shiftKey)return;let order=current.current.ids,from=order.indexOf(id);if(from<0)return;let to=null;if(event.key==="Home")to=0;else if(event.key==="End")to=order.length-1;else{let step=KEY_STEPS[latest.current.orientation??"vertical"][event.key];step!==void 0&&(to=from+step)}to!==null&&(event.preventDefault(),event.stopPropagation(),!(to<0||to>=order.length||to===from)&&(refocus.current=id,move(id,to)))}}:props},announcer=createElement2("span",{className:"nui-reorder-live"},createElement2("span",{id:hintId,className:"nui-sr-only"},enabled?t(REORDER_WORDS.hint):""),createElement2("span",{className:"nui-sr-only",role:"status","aria-live":"polite","aria-atomic":!0},message));return{items:items2,ids,getItemProps,announcer,move,pending:pendingCount>0}}function chainReorderProps(own,reorder){let out={...own,...reorder},mine=own;for(let key of["onDragStart","onDragOver","onDragLeave","onDrop","onDragEnd","onKeyDown"]){let a=mine[key],b=reorder[key];a&&b&&(out[key]=event=>{a(event),b(event)})}let ownRef2=mine.ref;if(ownRef2&&reorder.ref){let theirs=reorder.ref;out.ref=element=>{ownRef2(element),theirs(element)}}return out}import{useCallback as useCallback12,useEffect as useEffect15,useMemo as useMemo10,useReducer,useRef as useRef14}from"react";var EMPTY_SELECTION=Object.freeze({selected:new Set,anchor:null,base:null});function rangeBetween(ids,a,b){let from=ids.indexOf(a),to=ids.indexOf(b);if(from===-1||to===-1)return[b];let[lo,hi]=from<=to?[from,to]:[to,from];return ids.slice(lo,hi+1)}function without(set,drop){let next=new Set(set);for(let id of drop)next.delete(id);return next}function union(a,b){let next=new Set(a);for(let id of b)next.add(id);return next}function sameSet(a,b){if(a.size!==b.size)return!1;for(let id of a)if(!b.has(id))return!1;return!0}function selectionReducer(state,action){switch(action.type){case"toggle":{let selected=new Set(state.selected);return selected.has(action.id)?selected.delete(action.id):selected.add(action.id),{selected,anchor:action.id,base:null}}case"set":return{selected:new Set(action.ids),anchor:action.ids[action.ids.length-1]??null,base:null};case"clear":return!state.selected.size&&state.anchor===null&&state.base===null?state:{selected:new Set,anchor:null,base:null};case"selectAll":return{selected:new Set(action.ids),anchor:action.ids[action.ids.length-1]??null,base:null};case"activate":return{...state,anchor:action.id,base:null};case"navigate":return{...state,anchor:action.id,base:new Set};case"extendStep":{let stableAnchor=state.anchor??action.cursor??action.next,base=state.base??without(state.selected,[stableAnchor]);return{selected:union(base,rangeBetween(action.ids,stableAnchor,action.next)),anchor:stableAnchor,base}}case"range":{let rangeAnchor=state.anchor??action.cursor??action.id,range=rangeBetween(action.ids,rangeAnchor,action.id),base=state.base??without(state.selected,range);return{selected:union(base,range),anchor:rangeAnchor,base}}case"prune":{let keep=new Set(action.ids),selected=new Set([...state.selected].filter(id=>keep.has(id))),base=state.base?new Set([...state.base].filter(id=>keep.has(id))):null,anchor=state.anchor!==null&&keep.has(state.anchor)?state.anchor:null;return sameSet(selected,state.selected)&&anchor===state.anchor&&(base===null?state.base===null:state.base!==null&&sameSet(base,state.base))?state:{selected,anchor,base}}default:return state}}function useSelection({ids,cursor,selected:controlledSelected,onChange}){let controlled=controlledSelected!==void 0,[,rerender]=useReducer(n=>n+1,0),store=useRef14(EMPTY_SELECTION),idsRef=useRef14(ids);idsRef.current=ids;let onChangeRef=useRef14(onChange);onChangeRef.current=onChange;let idsKey=ids.join("\0");if(controlled){let given=controlledSelected instanceof Set?controlledSelected:new Set(controlledSelected);sameSet(given,store.current.selected)||(store.current={...store.current,selected:given,base:null})}let dispatch=useCallback12(action=>{let before=store.current,next=selectionReducer(before,action);if(next!==before){if(store.current=next,onChangeRef.current&&!sameSet(next.selected,before.selected)){let inList=idsRef.current.filter(id=>next.selected.has(id)),rest=[...next.selected].filter(id=>!inList.includes(id));onChangeRef.current([...inList,...rest])}rerender()}},[]);useEffect15(()=>{dispatch({type:"prune",ids})},[idsKey]);let toggle=useCallback12(id=>dispatch({type:"toggle",id}),[dispatch]),clear=useCallback12(()=>dispatch({type:"clear"}),[dispatch]),set=useCallback12(next=>dispatch({type:"set",ids:next}),[dispatch]),navigate=useCallback12(id=>dispatch({type:"navigate",id}),[dispatch]),activate=useCallback12(id=>dispatch({type:"activate",id}),[dispatch]),selectAll=useCallback12(()=>dispatch({type:"selectAll",ids:idsRef.current}),[dispatch]),extendTo=useCallback12(id=>dispatch({type:"range",ids:idsRef.current,cursor,id}),[dispatch,cursor]),extendStep=useCallback12(next=>dispatch({type:"extendStep",ids:idsRef.current,cursor,next}),[dispatch,cursor]),{selected,anchor}=store.current;return useMemo10(()=>({selected,isSelected:id=>selected.has(id),toggle,extendTo,selectAll,clear,set,extendStep,navigate,activate,count:selected.size,anchor}),[selected,anchor,toggle,extendTo,selectAll,clear,set,extendStep,navigate,activate])}import{Fragment as Fragment8,jsx as jsx15,jsxs as jsxs13}from"react/jsx-runtime";var LIST_READER_WORDS=Object.freeze({list:w("Items","\xC9l\xE9ments"),open:w("Open","Ouvrir"),openFull:w("Open as full page","Ouvrir en pleine page"),viewOptions:w("View options","Options de la vue"),sort:w("Sort","Trier"),group:w("Group","Grouper"),layout:w("Layout","Disposition"),pickOne:w("Pick something from the list to read it.","Choisis un \xE9l\xE9ment de la liste pour le lire."),pickKeys:w("{a} to move, {b} to open.","{a} pour te d\xE9placer, {b} pour ouvrir."),rowActions:w("Actions","Actions"),loadMore:w("Load more","Charger plus"),loading:w("Loading\u2026","Chargement\u2026"),expandGroup:w("Show group","Afficher le groupe"),collapseGroup:w("Hide group","Masquer le groupe"),keptOpen:w("Save or cancel your changes first.","Enregistre ou annule tes modifications d\u2019abord."),notMoved:w("The page did not change. Try again.","La page n\u2019a pas chang\xE9. R\xE9essaie."),notFound:w("Item not found","\xC9l\xE9ment introuvable"),notFoundBody:w("It may have been deleted, or a search or filter hides it.","Il a peut-\xEAtre \xE9t\xE9 supprim\xE9, ou une recherche ou un filtre le masque.")});function refusalOf(verdict){return verdict===!1?LIST_READER_WORDS.keptOpen:typeof verdict=="string"?verdict.trim()?toWords(verdict):LIST_READER_WORDS.keptOpen:isWords(verdict)?verdict.en.trim()||verdict.fr.trim()?verdict:LIST_READER_WORDS.keptOpen:null}var LIST_DRAG_TYPE="application/x-notis-items",SKELETON_ROWS=8;function textOf2(item){let record=item;return typeof record?.title=="string"&&record.title?record.title:typeof record?.name=="string"&&record.name?record.name:null}function defaultCrumbLabel(item){return textOf2(item)}function defaultMatch(item,query){return(textOf2(item)??"").toLocaleLowerCase().includes(query.toLocaleLowerCase())}var STATUS_ACTION_IDS=new Set(["progress","pause","resume"]);function rankActions(actions){let eIndex=actions.findIndex(action=>keyList(action.key).some(key=>key.toLowerCase()==="e")),rank=(action,index)=>index===eIndex?0:action.tone==="danger"?3:STATUS_ACTION_IDS.has(action.id)?1:2;return actions.map((action,index)=>({action,index,rank:rank(action,index)})).sort((a,b)=>a.rank-b.rank||a.index-b.index).map(entry=>entry.action)}var READER_ACTIONS_MAX=3;function defaultGetId(item){let id=item?.id;return typeof id=="string"?id:String(id)}function successorOf(previous,now,gone){let present=new Set(now),index=previous.indexOf(gone);if(index===-1)return null;for(let i=index+1;i<previous.length;i+=1)if(present.has(previous[i]))return previous[i];for(let i=index-1;i>=0;i-=1)if(present.has(previous[i]))return previous[i];return null}function sameColumns(a,b){let label=value=>typeof value=="string"?value:`${value.en}${value.fr}`;return a===b||a.length===b.length&&a.every((column,index)=>column.id===b[index].id&&column.tone===b[index].tone&&label(column.label)===label(b[index].label))}function cancelledOutcome(){return{status:"cancelled",done:[],failed:[]}}function focusOf(root){return root?{active:deepActiveElement(root.getRootNode())??deepActiveElement(root.ownerDocument),body:root.ownerDocument.body}:{active:null,body:null}}function urlWithParam(param,id){if(typeof window>"u")return null;try{let url=new URL(window.location.href);return url.searchParams.set(param,id),`${url.pathname}${url.search}`}catch{return null}}var ITEM_HREF_ATTRIBUTE="data-notis-href";function readUrlParam(param){if(typeof window>"u")return null;try{return new URL(window.location.href).searchParams.get(param)||null}catch{return null}}function writeUrlParam(param,id,push){if(!(typeof window>"u"||!window.history))try{let url=new URL(window.location.href);if(id===null?url.searchParams.delete(param):url.searchParams.set(param,id),url.href===window.location.href)return;push?window.history.pushState(window.history.state,"",url.href):window.history.replaceState(window.history.state,"",url.href)}catch{}}function useOpenId(param,controlled,onChange,useUrl,refuse){let runtime=useNotisRuntime(),raw=runtime?.context?.params??null,inSpace=runtime?.resource?.kind==="space"&&typeof runtime.navigate=="function",pageUrl=!inSpace&&useUrl&&controlled===void 0,urlValue=inSpace&&raw?.[param]||null,[local,setLocal]=useState13(()=>pageUrl?readUrlParam(param):urlValue),latest=useLatest({runtime,inSpace,onChange,controlled,pageUrl,local,refuse,urlValue}),written=useRef15([]),allows=useCallback13((id,reason)=>{let words=refusalOf(latest.current.onChange?.(id,reason));return words===null?!0:(reason!=="auto"&&latest.current.refuse(words),!1)},[latest]),writeSpace=useCallback13((id,replace,follow=!1)=>{let entry={id};written.current.push(entry),writeViewParams(latest.current.runtime,{[param]:id},{replace}).catch(()=>{if(written.current=written.current.filter(pending=>pending!==entry),!follow||written.current.length)return;let{urlValue:kept,local:current,refuse:say}=latest.current;kept!==current&&(setLocal(kept),say(LIST_READER_WORDS.notMoved))})},[latest,param]);useEffect16(()=>{if(!inSpace)return;let{controlled:isControlled,local:current}=latest.current;if(isControlled!==void 0){setLocal(urlValue);return}let echo=written.current.findIndex(entry=>entry.id===urlValue);if(echo!==-1){written.current.splice(0,echo+1),written.current.length||setLocal(urlValue);return}if(urlValue!==current){if(written.current=[],!allows(urlValue,"url")){writeSpace(current,!0);return}setLocal(urlValue)}},[allows,inSpace,latest,urlValue,writeSpace]),useEffect16(()=>{if(!pageUrl||typeof window>"u")return;let sync=()=>{let next=readUrlParam(param),{local:current}=latest.current;if(next!==current){if(!allows(next,"url")){writeUrlParam(param,current,!1);return}setLocal(next)}};return sync(),window.addEventListener("popstate",sync),()=>window.removeEventListener("popstate",sync)},[allows,latest,pageUrl,param]);let set=useCallback13((id,quiet=!1,noStep=!1)=>{let{inSpace:space,controlled:isControlled,pageUrl:page,local:current}=latest.current;if(!allows(id,quiet?"auto":"user"))return!1;if(isControlled!==void 0)return!0;setLocal(id);let replace=noStep||id!==null&&current!==null;return page?writeUrlParam(param,id,!replace):space&&writeSpace(id,replace,!quiet),!0},[allows,latest,param,writeSpace]);return[controlled!==void 0?controlled:local,set]}function guardSelection(selection,blocked,selectable){return{...selection,toggle:id=>{blocked(id)||selection.toggle(id)},extendTo:id=>{blocked(id)||selection.extendTo(id)},extendStep:id=>{blocked(id)||selection.extendStep(id)},set:ids=>selection.set(ids.filter(id=>!blocked(id))),selectAll:()=>selection.set(selectable)}}function ListSkeleton({grouped=!1,rows=SKELETON_ROWS}){let t=useT();return jsxs13("div",{className:"nui-lr-scroll",role:"status","aria-busy":"true","aria-label":t(LIST_READER_WORDS.loading),children:[grouped&&jsx15("div",{className:"nui-group-head","aria-hidden":"true",children:jsx15("span",{className:"nui-skel nui-skel-head"})}),Array.from({length:rows},(_,index)=>jsxs13("div",{className:"nui-row nui-row-skel","aria-hidden":"true",children:[jsx15("span",{className:"nui-skel nui-skel-dot"}),jsxs13("span",{className:"nui-row-main",children:[jsx15("span",{className:"nui-skel nui-skel-line",style:{width:`${44-index*13%22}%`}}),jsx15("span",{className:"nui-skel nui-skel-meta",style:{width:`${22+index*7%12}%`}})]})]},index))]})}function ListReader(props){let parent=useShortcutOwner(),autoId=useStableId("list"),owner=props.scope??`${parent}/${props.listId??autoId}`;return jsx15(ShortcutScope,{owner,available:!0,children:jsx15(ListReaderInner,{...props})})}function ListReaderInner({getId=defaultGetId,row,reader,actions=[],handlers,openAs,density="comfortable",layout="list",columns,groupBy,selectable,dragSelect=!0,wrap=!0,empty,title,tabs,toolbarActions,create,viewMenu,infoLine,search,footer,readerLabel,readerActions,crumbLabel=defaultCrumbLabel,autoOpen:autoOpenProp=!1,renderTile,tileVariant,look="plain",openParam="open",onOpen,itemHref,open:controlledOpen,onOpenChange,listId="list",label,className,openInUrl=!0,selected:controlledSelected,onSelectedChange,afterAction="clear",draggable,onDragStart,loading=!1,hasMore=!1,onLoadMore,loadingMore=!1,isPending,isDisabled,collapsible=!1,collapsed:controlledCollapsed,onCollapsedChange,groupCounts=!0,apiRef,items:naturalItems,reorder,board}){let t=useT(),labelled=useLabelValue(),rootRef=useRef15(null),listRef=useRef15(null),scrollRef=useRef15(null),readerRef=useRef15(null),[localQuery,setLocalQuery]=useState13(""),query=!!search&&!search.onChange?localQuery.trim():"",match=search?.match??defaultMatch,notifyRef=useRef15(null),reorderer=useReorder({items:naturalItems,getId,enabled:!!reorder&&!query&&!groupBy&&layout!=="board",orientation:layout==="tiles"?"both":"vertical",canReorder:reorder?.canReorder,onReorder:change=>reorder?.onReorder(change),onError:error=>notifyRef.current?.(REORDER_WORDS.failed,{tone:"danger",reason:actionErrorReason(error)})}),allItems=reorderer.items,filtered=useMemo11(()=>query?allItems.filter(item=>match(item,query)):allItems,[allItems,match,query]),boardOn=layout==="board"&&!!board,autoOpen=autoOpenProp&&!boardOn,boardItems=useRef15([]),boardColumns=useRef15([]),items2=filtered;if(boardOn){let ordered=boardOrder(filtered,board.columns,board.getColumn),previous=boardItems.current;(ordered.length!==previous.length||ordered.some((item,index)=>item!==previous[index]))&&(boardItems.current=ordered),items2=boardItems.current}let columnKey=boardOn?items2.map(item=>board.getColumn(item)).join(""):"",itemColumns=useMemo11(()=>columnKey.split(""),[columnKey]);boardOn&&!sameColumns(board.columns,boardColumns.current)&&(boardColumns.current=board.columns);let boardCols=boardColumns.current,ids=useMemo11(()=>items2.map(getId),[items2,getId]),byId=useMemo11(()=>{let map=new Map;return items2.forEach((item,index)=>map.set(ids[index],item)),map},[items2,ids]),blockedIds=useMemo11(()=>{let out=new Set;return!isPending&&!isDisabled||items2.forEach((item,index)=>{(isPending?.(item)||isDisabled?.(item))&&out.add(ids[index])}),out},[ids,isDisabled,isPending,items2]),disabledIds=useMemo11(()=>{let out=new Set;return isDisabled&&items2.forEach((item,index)=>{isDisabled(item)&&out.add(ids[index])}),out},[ids,isDisabled,items2]),isBlocked=useCallback13(id=>blockedIds.has(id),[blockedIds]),getItem=useCallback13(id=>blockedIds.has(id)?void 0:byId.get(id),[blockedIds,byId]),groups=useMemo11(()=>{let out=[];return items2.forEach((item,index)=>{let group=groupBy?groupBy(item):null,last=out[out.length-1];last&&(last.group?.id??null)===(group?.id??null)?last.entries.push({item,id:ids[index]}):out.push({group,entries:[{item,id:ids[index]}]})}),out},[groupBy,ids,items2]),[collapsedLocal,setCollapsedLocal]=useState13([]),collapsedList=controlledCollapsed??collapsedLocal,collapsedSet=useMemo11(()=>new Set(collapsible&&!boardOn?collapsedList:[]),[boardOn,collapsible,collapsedList]),toggleGroup=useCallback13(id=>{let next=collapsedList.includes(id)?collapsedList.filter(entry=>entry!==id):[...collapsedList,id];controlledCollapsed===void 0&&setCollapsedLocal(next),onCollapsedChange?.(next)},[collapsedList,controlledCollapsed,onCollapsedChange]),navIds=useMemo11(()=>collapsedSet.size?groups.flatMap(({group,entries})=>group&&collapsedSet.has(group.id)?[]:entries.map(e=>e.id)):ids,[collapsedSet,groups,ids]),selectableIds=useMemo11(()=>blockedIds.size?ids.filter(id=>!blockedIds.has(id)):ids,[blockedIds,ids]),lanes=useMemo11(()=>{if(!boardOn)return[];let map=new Map(boardCols.map(column=>[column.id,[]]));return items2.forEach((item,index)=>map.get(itemColumns[index])?.push({item,id:ids[index]})),boardCols.map(column=>({column,entries:map.get(column.id)}))},[boardOn,boardCols,itemColumns,ids,items2]),laneIds=useMemo11(()=>lanes.map(lane=>lane.entries.map(entry=>entry.id)),[lanes]),pendingIndex=useRef15(void 0),landing=useRef15(null),moveRun=useRef15(()=>{}),boardMove=boardOn&&!!board.onMove,boardRef=useLatest(board),listActions=useMemo11(()=>{if(!boardMove)return actions;let def={id:"move",bulk:!0,options:()=>boardRef.current.columns.map(column=>({value:column.id,label:column.label})),value:targets=>{let first=targets[0]?boardRef.current.getColumn(targets[0]):null;return first!==null&&targets.every(item=>boardRef.current.getColumn(item)===first)?first:null},run:(targets,choice)=>moveRun.current(targets,choice)},at=actions.findIndex(ref=>(typeof ref=="string"?ref:ref.id)==="move");if(at===-1)return[def,...actions];let listed2=actions[at],merged=typeof listed2=="string"?def:{...listed2,...def};return actions.map((ref,index)=>index===at?merged:ref)},[actions,boardMove,boardRef,moveRun]),actionsController=useActions(listActions,handlers),[openId,setOpenId]=useOpenId(openParam,controlledOpen,onOpenChange,openInUrl,actionsController.notify),runtime=useNotisRuntime(),lastShown=useRef15(null),listed=openId!==null&&byId.has(openId);openId===null||!listed&&lastShown.current?.id!==openId?lastShown.current=null:listed&&(lastShown.current={id:openId,item:byId.get(openId)});let known=openId!==null&&lastShown.current?.id===openId,openItem=reader&&known?lastShown.current.item:null,missing=!!reader&&openId!==null&&!known&&!loading&&!hasMore&&items2.length>0,readerOpen=openItem!==null||missing,[cursor,setCursor]=useState13(openId),allowed=normalizeAllowed(openAs),storeKey=useOpenModeKey(void 0,listId),[mode,setMode]=useOpenMode({allowed,listId}),latest=useLatest({ids,navIds,byId,onOpen,openId,cursor,reader,disabledIds,hasMore,onLoadMore,loadingMore});useEffect16(()=>{openId!==null&&setCursor(openId)},[openId]);let announced=useRef15(null),shownId=openItem!==null?openId:null;useEffect16(()=>{if(!reader||openId!==null&&openItem===null&&!missing||announced.current===shownId)return;announced.current=shownId;let{onOpen:notify2,byId:map}=latest.current;notify2?.(shownId===null?null:map.get(shownId)??lastShown.current?.item??null)},[latest,missing,openId,openItem,reader,shownId]);let open=useCallback13((id,options={})=>{let{byId:map,onOpen:notify2,disabledIds:disabled}=latest.current;if(id!==null&&setCursor(id),id!==null&&disabled.has(id))return!1;if(!latest.current.reader)return id!==null&&notify2?.(map.get(id)??null),!0;let kept=latest.current.openId;return id===kept||setOpenId(id,!!options.quiet,!!options.noStep)?!0:(kept!==null&&latest.current.ids.includes(kept)&&setCursor(kept),!1)},[latest,setOpenId]),close=useCallback13(()=>open(null),[open]);useTopBarTitleLeaf(openItem!==null?crumbLabel(openItem):null,close);let follow=useRef15(null),noteFollow=useCallback13(id=>{let{active,body:body2}=focusOf(rootRef.current);id===null?follow.current=null:active&&active!==body2&&containsComposed(readerRef.current,active)?follow.current={id,where:"reader"}:!active||active===body2||containsComposed(listRef.current,active)?follow.current={id,where:"list"}:follow.current=null},[]);useEffect16(()=>{let target=follow.current;if(!target||(follow.current=null,target.id!==cursor))return;let{active,body:body2}=focusOf(rootRef.current),dropped=!active||active===body2;if(target.where==="reader"){dropped&&readerRef.current?.focus({preventScroll:!0});return}if(!dropped&&!containsComposed(listRef.current,active))return;let rowEl=findRow(scrollRef.current,target.id);rowEl&&(rowEl.focus({preventScroll:!0}),rowEl.scrollIntoView?.({block:"nearest"}))},[cursor]);let[section,setSection]=useState13(null),sectionSeq=useRef15(0),sectionOpenId=useRef15(openId);useEffect16(()=>{sectionOpenId.current!==openId&&(sectionOpenId.current=openId,section&&section.id!==openId&&setSection(null))},[openId,section]);let notify=actionsController.notify;notifyRef.current=notify,useImperativeHandle(apiRef,()=>({open:(id,options)=>{let opened=open(id);return opened&&setSection(options?.section?{id,name:options.section,seq:++sectionSeq.current}:null),opened},close:()=>open(null),focus:id=>{latest.current.ids.includes(id)&&setCursor(id)},notify}),[latest,notify,open]);let activeSection=section&&section.id===openId?section:null,rawSelection=useSelection({ids:selectableIds,cursor,selected:controlledSelected,onChange:onSelectedChange}),selection=useMemo11(()=>blockedIds.size?guardSelection(rawSelection,isBlocked,selectableIds):rawSelection,[blockedIds.size,isBlocked,rawSelection,selectableIds]),selectionRef=useLatest(selection),runStarts=useRef15(new Map),controller={...actionsController,run:(action,items3,choice)=>{let id=typeof action=="string"?action:action.id;if(!actionsController.isBusy(id)){let sel=selectionRef.current;runStarts.current.set(id,{onSelection:sel.count>0&&items3.some(item=>sel.isSelected(getId(item))),selected:[...sel.selected]})}return actionsController.run(action,items3,choice)}},canSelect=selectable??controller.actions.some(action=>action.bulk),listSelection=canSelect?selection:null,onRan=useCallback13((action,items3,outcome)=>{let start=runStarts.current.get(action.id);if(runStarts.current.delete(action.id),outcome.status==="cancelled"||outcome.status==="busy")return;let sel=selectionRef.current,{ids:present,disabledIds:disabled}=latest.current,failedIds=outcome.failed.map(item=>getId(item)),ranOnSelection=!!start?.onSelection||sel.count>0&&items3.some(item=>sel.isSelected(getId(item))),moveOn=keyList(action.key).some(key=>key.toLowerCase()==="e"),keep=afterAction==="keep"||boardMove&&action.id==="move",restore=next2=>{let wanted=new Set(next2),kept=present.filter(id=>wanted.has(id)&&!disabled.has(id));(kept.length!==sel.count||kept.some(id=>!sel.isSelected(id)))&&rawSelection.set(kept)};if((ranOnSelection||moveOn)&&(!keep||moveOn?failedIds.length?restore(failedIds):sel.clear():restore([...start?.selected??[],...sel.selected,...failedIds])),!moveOn||outcome.status!=="done")return;let{ids:list,cursor:current,openId:opened}=latest.current,doneIds=outcome.done.map(item=>getId(item)),last=Math.max(-1,...doneIds.map(id=>list.indexOf(id))),next=list.slice(last+1).find(id=>!doneIds.includes(id))??null;!next||!doneIds.includes(current??opened)||(noteFollow(next),setCursor(next),opened!==null&&doneIds.includes(opened)&&open(next,{quiet:!0}))},[afterAction,boardMove,getId,latest,noteFollow,open,rawSelection,selectionRef]),[picker,setPicker]=useState13(null),pickerSettle=useRef15(null),settlePicker=useCallback13(outcome=>{let settle=pickerSettle.current;pickerSettle.current=null,settle&&settle(outcome??cancelledOutcome())},[]),pickerAnchor=useCallback13(action=>{let root=rootRef.current;if(!root)return null;let escapeId=action.id.replace(/["\\]/g,"\\$&"),button=root.querySelector(`.nui-selbar [data-action="${escapeId}"]`);if(button)return button;let{cursor:current,openId:opened}=latest.current;if(opened!==null&&!!readerRef.current)return readerRef.current.querySelector('[data-part="actions"]')??readerRef.current;let rowId=current??opened,rowEl=rowId!==null?findRow(scrollRef.current,rowId):null;return rowEl?.querySelector(".nui-row-more")??rowEl??scrollRef.current??root},[latest]),openPicker=useCallback13((action,targets,anchor,settle)=>{settlePicker(null),pickerSettle.current=settle??null,setPicker({action,items:targets,anchor:anchor??pickerAnchor(action)})},[pickerAnchor,settlePicker]),choose=useCallback13((action,targets,option)=>(setPicker(null),controller.run(action,targets,option).then(outcome=>(outcome.status!=="busy"&&onRan(action,targets,outcome),outcome))),[controller,onRan]),listVisible=useCallback13(()=>{let element=listRef.current;return!element||!element.isConnected||element.hasAttribute("inert")?!1:typeof window>"u"||window.getComputedStyle(element).display!=="none"},[]),selectionKeys=useCallback13(()=>selectionRef.current.count>0&&listVisible(),[listVisible,selectionRef]),bar=useSelectionBar({controller,selection,getItem,fallback:()=>{let{openId:opened,cursor:current}=latest.current,id=current??opened,item=id!==null?getItem(id):void 0;return item!==void 0?[item]:[]},when:listVisible,onRan,onPick:openPicker}),previousIds=useRef15(ids);useIsoLayoutEffect(()=>{let previous=previousIds.current;if(previousIds.current=ids,previous===ids)return;let present=new Set(ids),{cursor:current,openId:opened}=latest.current;if(current!==null&&!present.has(current)&&previous.includes(current)){let next=successorOf(previous,ids,current);noteFollow(next),setCursor(next)}opened!==null&&!present.has(opened)&&previous.includes(opened)&&open(successorOf(previous,ids,opened),{quiet:!0})},[ids]);let centerOpen=readerOpen&&mode==="center",fullOpen=readerOpen&&mode==="full",[paneLayout,setPaneLayout]=useState13(NO_PANE),listCovered=fullOpen||centerOpen||mode==="side"&&readerOpen&&paneLayout.covers,besideList=!!reader&&mode==="side"&&paneLayout.split,autoOpened=useRef15(!1);useEffect16(()=>{if(!(!autoOpen||autoOpened.current||!besideList)){if(openId!==null){autoOpened.current=!0;return}loading||!navIds.length||(autoOpened.current=!0,open(navIds[0],{quiet:!0,noStep:!0}))}},[autoOpen,besideList,loading,navIds,open,openId]);let loadMore=useCallback13(()=>{let{hasMore:more,onLoadMore:load,loadingMore:busy}=latest.current;!more||!load||busy||Promise.resolve(load()).catch(()=>{})},[latest]),wraps=wrap&&!hasMore,{getRowProps}=useListKeys({ids:navIds,cursor,setCursor,onOpen:open,wrap:wraps,containerRef:scrollRef,selection:listSelection,openId:readerOpen?openId:null,enabled:!centerOpen&&!fullOpen,onReachEnd:hasMore&&onLoadMore?loadMore:void 0,grid:layout==="tiles",board:boardOn?laneIds:void 0}),marquee=useMarqueeSelection({enabled:canSelect&&dragSelect&&!centerOpen&&!fullOpen,itemAttribute:ROW_ID_ATTRIBUTE,interactiveSelector:ROW_INTERACTIVE_SELECTOR,startSelector:".nui-row-lead",isSelectable:id=>!blockedIds.has(id)&&byId.has(id),onSelect:next=>selectionRef.current.set(next),onClear:()=>{selectionRef.current.count>0&&selectionRef.current.clear()}}),step=useCallback13((delta,repeat=!1)=>{let{navIds:list,openId:opened,cursor:current}=latest.current,from=opened??current,next=stepCursor(list,from,delta,{wrap:wraps,repeat});return next===null?!1:next===from?delta>0&&latest.current.hasMore&&list[list.length-1]===from?(loadMore(),!0):!1:(open(next),!0)},[latest,loadMore,open,wraps]),centerDefs=useMemo11(()=>{if(!centerOpen)return[];let onlyThisDialog=()=>{let dialog=readerRef.current;return dialog?openModalLayers(dialog.ownerDocument).every(layer=>layer===dialog):!1},k=DEFAULT_KEYMAP;return[{id:`${k["list.next"].id}.center`,keys:[...k["list.next"].keys],scope:"modal",label:k["list.next"].label,repeat:!0,when:onlyThisDialog,run:event=>step(1,event.repeat)},{id:`${k["list.prev"].id}.center`,keys:[...k["list.prev"].keys],scope:"modal",label:k["list.prev"].label,repeat:!0,when:onlyThisDialog,run:event=>step(-1,event.repeat)}]},[centerOpen,step]);useShortcuts(centerDefs);let coverDefs=useMemo11(()=>{if(!readerOpen||centerOpen)return[];let covering=()=>{let pane=readerRef.current;return!pane||!isVisibleComposed(pane)?!1:fullOpen||!isVisibleComposed(listRef.current)},k=DEFAULT_KEYMAP;return[{id:`${k["list.next"].id}.reader`,keys:[...k["list.next"].keys],scope:"detail",label:k["list.next"].label,repeat:!0,when:covering,run:event=>step(1,event.repeat)},{id:`${k["list.prev"].id}.reader`,keys:[...k["list.prev"].keys],scope:"detail",label:k["list.prev"].label,repeat:!0,when:covering,run:event=>step(-1,event.repeat)}]},[centerOpen,fullOpen,readerOpen,step]);useShortcuts(coverDefs);let laneIdsRef=useLatest(laneIds),controllerRef=useLatest(controller);moveRun.current=(targets,choice)=>{let index=pendingIndex.current;pendingIndex.current=void 0;let current=boardRef.current;if(!choice||!current?.onMove||!targets.length)return{cancelled:!0};let to=choice.value,targetIds=targets.map(getId),at=current.columns.findIndex(column=>column.id===to);if(at===-1)return{cancelled:!0};if(index===void 0){if(targets.every(item=>current.getColumn(item)===to))return{cancelled:!0}}else{let lane=laneIdsRef.current[at]??[],rest=lane.filter(id=>!targetIds.includes(id)),next=[...rest.slice(0,index),...targetIds,...rest.slice(index)];if(next.length===lane.length&&next.every((id,position)=>id===lane[position]))return{cancelled:!0}}let{cursor:currentCursor}=latest.current,lead=currentCursor!==null&&targetIds.includes(currentCursor)?currentCursor:targetIds[0],{active,body:body2}=focusOf(rootRef.current);landing.current={id:lead,column:to,focus:!active||active===body2||containsComposed(listRef.current,active)},setCursor(lead);let words=toWords(current.columns[at].label),moved={en:BOARD_WORDS.moved.en.replace("{column}",words.en),fr:BOARD_WORDS.moved.fr.replace("{column}",words.fr)},settle=result2=>{if(typeof result2=="function")return{undo:result2,toast:moved};if(result2&&typeof result2=="object"){let detail=result2;if((detail.cancelled||detail.failed?.length)&&(landing.current=null),typeof detail.undo=="function"&&!("toast"in detail))return{...detail,toast:moved}}return result2},result;try{result=current.onMove(targetIds,to,index)}catch(error){throw landing.current=null,error}return!result||typeof result.then!="function"?settle(result):result.then(settle,error=>{throw landing.current=null,error})};let moveBy=useCallback13(delta=>{let current=boardRef.current;if(!current?.onMove)return!1;let sel=selectionRef.current,{ids:list,cursor:currentCursor,openId:opened}=latest.current,targets=[];if(sel.count>0&&(targets=list.filter(id=>sel.isSelected(id)).map(id=>getItem(id)).filter(item=>item!==void 0)),!targets.length){let id=currentCursor??opened,item=id!==null?getItem(id):void 0;item!==void 0&&(targets=[item])}if(!targets.length)return!1;let lead=targets.find(item=>getId(item)===currentCursor)??targets[0],to=neighbourColumn(current.columns,current.getColumn(lead),delta);if(to===null)return!0;let column=current.columns.find(entry=>entry.id===to);return controllerRef.current.run("move",targets,{value:to,label:column.label}).finally(()=>{runStarts.current.delete("move")}),!0},[boardRef,controllerRef,getId,getItem,latest,selectionRef]),boardDefs=useMemo11(()=>{if(!boardMove||centerOpen||fullOpen)return[];let live=()=>{let scroll=scrollRef.current;return listVisible()&&!!scroll&&isVisibleComposed(scroll)&&!scroll.closest("[inert]")};return[{id:"list.board.moveLeft",keys:["shift+arrowleft"],scope:"collection",label:BOARD_WORDS.moveLeft,repeat:!0,when:live,run:()=>moveBy(-1)},{id:"list.board.moveRight",keys:["shift+arrowright"],scope:"collection",label:BOARD_WORDS.moveRight,repeat:!0,when:live,run:()=>moveBy(1)}]},[boardMove,centerOpen,fullOpen,listVisible,moveBy]);useShortcuts(boardDefs),useIsoLayoutEffect(()=>{let target=landing.current;if(!target||!boardOn)return;let item=byId.get(target.id);if(!item){landing.current=null;return}if(board.getColumn(item)!==target.column)return;landing.current=null,setCursor(target.id);let rowEl=findRow(scrollRef.current,target.id);if(!rowEl)return;let{active,body:body2}=focusOf(rootRef.current);target.focus&&(!active||active===body2||containsComposed(listRef.current,active))&&rowEl.focus({preventScroll:!0}),rowEl.scrollIntoView?.({block:"nearest",inline:"nearest"})},[items2,columnKey]);let[drop,setDrop]=useState13(null),dragIds=useRef15([]),dropAt=useCallback13((columnId,event)=>{let lane=laneIdsRef.current[boardRef.current?.columns.findIndex(column=>column.id===columnId)??-1]??[],container=event.currentTarget,tiles=lane.filter(id=>!dragIds.current.includes(id)).flatMap(id=>{let el=findRow(container,id);if(!el)return[];let rect=el.getBoundingClientRect();return[{id,top:rect.top,height:rect.height}]});return{column:columnId,...dropIndex(tiles,event.clientY)}},[boardRef,laneIdsRef]),isListDrag=event=>Array.from(event.dataTransfer?.types??[]).includes(LIST_DRAG_TYPE),onColumnDragOver=columnId=>event=>{if(!boardMove||!isListDrag(event))return;event.preventDefault(),event.dataTransfer.dropEffect="move";let next=dropAt(columnId,event);setDrop(previous=>previous&&previous.column===next.column&&previous.before===next.before&&previous.index===next.index?previous:next)},onColumnDragLeave=event=>{let related=event.relatedTarget;related&&event.currentTarget.contains(related)||setDrop(null)},onColumnDrop=columnId=>event=>{if(!boardMove||!isListDrag(event))return;event.preventDefault();let place2=dropAt(columnId,event);setDrop(null);let dropped=[];try{let parsed=JSON.parse(event.dataTransfer.getData(LIST_DRAG_TYPE)||"[]");Array.isArray(parsed)&&(dropped=parsed.filter(id=>typeof id=="string"))}catch{}dropped.length||(dropped=dragIds.current),dragIds.current=[];let targets=dropped.map(id=>getItem(id)).filter(item=>item!==void 0),column=boardRef.current?.columns.find(entry=>entry.id===columnId),action=controllerRef.current.actions.find(entry=>entry.id==="move");!targets.length||!column||!action||(pendingIndex.current=place2.index,choose(action,targets,{value:columnId,label:column.label}),pendingIndex.current=void 0)},onTileDragEnd=()=>{dragIds.current=[],setDrop(null)},visible=()=>{let root=rootRef.current;return!!root&&root.isConnected&&(typeof window>"u"||window.getComputedStyle(root).display!=="none")};useEscapeLayer(`${listId}.detail`,()=>!latest.current.openId||!visible()?!1:(close(),!0),{priority:ESCAPE_PRIORITY.detail,enabled:readerOpen}),useEscapeLayer(`${listId}.selection`,()=>latest.current.openId&&readerOpen||selection.count===0||!visible()?!1:(selection.clear(),!0),{priority:ESCAPE_PRIORITY.selection,enabled:selection.count>0});let wasCenter=useRef15(!1);useIsoLayoutEffect(()=>{let list=listRef.current;if(list&&(centerOpen?list.setAttribute("inert",""):list.removeAttribute("inert")),centerOpen&&!wasCenter.current&&readerRef.current?.focus({preventScroll:!0}),!centerOpen&&wasCenter.current){let id=latest.current.cursor;id!==null&&findRow(scrollRef.current,id)?.focus({preventScroll:!0})}wasCenter.current=centerOpen},[centerOpen]);let itemMenu=useCallback13((item,where,extra=[],listActions2=!0)=>{let list=listActions2?rankActions(controller.available([item])):[],canOpen=where==="row"&&!!(latest.current.reader||latest.current.onOpen);if(!list.length&&!extra.length&&!canOpen)return null;let id=getId(item),firstDanger=list.findIndex(action=>action.tone==="danger");return jsxs13(Menu,{align:"end",label:LIST_READER_WORDS.rowActions,accelerators:where==="reader",trigger:jsx15("button",{type:"button",className:where==="row"?"nui-row-more":"nui-om-btn","aria-label":t(SHELL_WORDS.more),"data-part":where==="reader"?"more":void 0,children:jsx15(Icon,{name:"dots-three"})}),children:[canOpen&&jsx15(Menu.Item,{icon:"arrow-square-out",keys:"enter",onSelect:()=>{open(id)},children:t(LIST_READER_WORDS.open)}),extra.map(action=>jsx15(Menu.Item,{icon:action.icon,keys:action.key,disabled:action.disabled,onSelect:()=>{action.disabled||Promise.resolve(action.run()).catch(()=>{})},children:t(action.label)},`reader:${action.id}`)),list.map((action,index)=>{let line=index===firstDanger&&index>0?jsx15(Menu.Separator,{},`sep:${action.id}`):null,options=action.options?.([item]);if(options){let value=action.value?.([item]);return[line,jsx15(Menu.Sub,{icon:action.icon,disabled:controller.busy.has(action.id),menuLabel:action.label,label:action.key?jsxs13("span",{className:"nui-lr-sub-label",children:[jsx15("span",{children:t(action.label)}),jsx15("span",{className:"nui-menu-keys",children:jsx15(Keycap,{keys:keyList(action.key)})})]}):t(action.label),children:options.map(option=>jsx15(Menu.Item,{icon:option.icon,checked:action.value?value===option.value:void 0,onSelect:()=>{choose(action,[item],option)},children:t(option.label)},option.value))},action.id)]}return[line,jsx15(Menu.Item,{icon:action.icon,tone:action.tone,disabled:controller.busy.has(action.id),keys:action.key?keyList(action.key):void 0,onSelect:()=>{controller.run(action,[item]).then(outcome=>{outcome.status!=="busy"&&onRan(action,[item],outcome)})},children:t(action.label)},action.id)]})]})},[choose,controller,getId,latest,onRan,open,t]),rowMore=useCallback13(id=>{let item=getItem(id),slot=jsx15("span",{className:"nui-row-more","data-slot":"","aria-hidden":"true"});return item===void 0?slot:itemMenu(item,"row")??slot},[getItem,itemMenu]),anySelected=selection.count>0,stateOf=useCallback13(id=>({cursor:cursor===id,open:readerOpen&&openId===id,selected:canSelect&&selection.isSelected(id),anySelected:canSelect&&anySelected,index:ids.indexOf(id)}),[anySelected,canSelect,cursor,ids,openId,readerOpen,selection]),source=useMemo11(()=>({stateOf,toggle:canSelect?selection.toggle:null,more:controller.actions.length?rowMore:null}),[canSelect,controller.actions.length,rowMore,selection.toggle,stateOf]),dragOn=draggable??boardMove,canDrag=(item,id)=>!!dragOn&&!blockedIds.has(id)&&(typeof dragOn=="function"?dragOn(item):!0),dragStart=(id,event)=>{let sel=selectionRef.current,carried=canSelect&&sel.isSelected(id)?ids.filter(entry=>sel.isSelected(entry)&&!blockedIds.has(entry)):[id];dragIds.current=carried;let dragged=carried.map(entry=>byId.get(entry)).filter(entry=>entry!==void 0),data=event.dataTransfer;if(data)try{data.setData(LIST_DRAG_TYPE,JSON.stringify(carried)),data.setData("text/plain",carried.join(`
6
+ `)),data.effectAllowed="copyMove"}catch{}onDragStart?.(dragged,event)},urlOpens=controlledOpen===void 0&&(openInUrl||runtime?.resource?.kind==="space")&&!!(reader||onOpen),hrefOf=(item,id)=>itemHref?itemHref(item):urlOpens?urlWithParam(openParam,id):null,renderRow=(item,id)=>{let props=getRowProps(id),pending=!!isPending?.(item),disabled=disabledIds.has(id),href=disabled?null:hrefOf(item,id),own={...props,...href?{[ITEM_HREF_ATTRIBUTE]:href}:{},...pending?{"data-pending":"","aria-busy":!0}:{},...disabled?{"data-disabled":"","aria-disabled":!0}:{},...canDrag(item,id)?{draggable:!0,onDragStart:event=>dragStart(id,event),...boardOn?{onDragEnd:onTileDragEnd}:{}}:{},...boardOn&&drop?.before===id?{"data-drop-before":""}:{}},movable=!blockedIds.has(id)&&(!reorder?.canReorder||reorder.canReorder(item)),rowProps=reorder?chainReorderProps(own,reorderer.getItemProps(id,{movable})):own,drawn=(layout==="tiles"||boardOn)&&renderTile?jsx15(TileContent,{parts:renderTile(item)}):row(item,stateOf(id)),content=jsx15(RowIdContext.Provider,{value:id,children:drawn});return layout==="table"?jsx15("tr",{className:"nui-row",...rowProps,children:content},id):layout==="tiles"||boardOn?jsx15("div",{className:"nui-tile","data-variant":tileVariant==="manager"?"manager":void 0,...rowProps,children:content},id):jsx15("div",{className:"nui-row",...rowProps,children:content},id)},groupHead=(group,count)=>{let folded=collapsedSet.has(group.id),inner=jsxs13(Fragment8,{children:[collapsible&&jsx15(Icon,{name:folded?"caret-right":"caret-down",className:"nui-group-caret"}),jsx15("span",{className:"nui-group-label",children:t(group.label)}),groupCounts&&jsx15("span",{className:"nui-group-count",children:count})]});return collapsible?jsx15("button",{type:"button",className:"nui-group-toggle","aria-expanded":!folded,"aria-label":labelled(t(folded?LIST_READER_WORDS.expandGroup:LIST_READER_WORDS.collapseGroup),t(group.label)),onClick:()=>toggleGroup(group.id),children:inner}):inner},body;boardOn?body=lanes.map(({column,entries})=>{let tone=column.tone&&column.tone!=="default"?column.tone:void 0,dropHere=drop?.column===column.id;return jsxs13("section",{className:"nui-board-col",role:"group","aria-label":t(column.label),"data-column":column.id,"data-drop":flag(dropHere),children:[jsxs13("div",{className:"nui-group-head nui-board-head",role:"presentation",children:[tone&&jsx15("span",{className:"nui-board-dot","data-tone":tone,"aria-hidden":"true"}),jsx15("span",{className:"nui-group-label",children:t(column.label)}),groupCounts&&jsx15("span",{className:"nui-group-count",children:entries.length})]}),jsx15("div",{className:"nui-board-body",role:"presentation","data-drop":dropHere&&drop.before===null?"end":void 0,onDragOver:onColumnDragOver(column.id),onDragLeave:onColumnDragLeave,onDrop:onColumnDrop(column.id),children:entries.length?entries.map(({item,id})=>renderRow(item,id)):jsx15("div",{className:"nui-board-empty",children:t(board.emptyColumn??BOARD_WORDS.emptyColumn)})})]},column.id)}):layout==="table"?body=jsxs13("table",{className:"nui-table",role:"presentation",children:[columns&&jsx15("thead",{role:"presentation",children:jsx15("tr",{role:"presentation",children:columns})}),jsx15("tbody",{role:"presentation",children:groups.flatMap(({group,entries})=>[...group?[jsx15("tr",{role:"presentation",children:jsx15("td",{className:"nui-group-head",colSpan:999,children:groupHead(group,entries.length)})},`g:${group.id}`)]:[],...group&&collapsedSet.has(group.id)?[]:entries.map(({item,id})=>renderRow(item,id))])})]}):body=groups.map(({group,entries},index)=>{let folded=!!group&&collapsedSet.has(group.id),rows=folded?null:entries.map(({item,id})=>renderRow(item,id));return jsxs13("div",{role:"presentation","data-collapsed":flag(folded),children:[group&&jsx15("div",{className:"nui-group-head",role:"presentation",children:groupHead(group,entries.length)}),rows&&(layout==="tiles"?jsx15("div",{className:"nui-tiles",role:"presentation",children:rows}):rows)]},group?`g:${group.id}`:`n:${index}`)});let sentinelRef=useRef15(null);useEffect16(()=>{let sentinel=sentinelRef.current;if(!hasMore||!onLoadMore||!sentinel||typeof IntersectionObserver>"u")return;let observer=new IntersectionObserver(entries=>{entries.some(entry=>entry.isIntersecting)&&loadMore()},{root:scrollRef.current,rootMargin:"0px 0px 240px 0px"});return observer.observe(sentinel),()=>observer.disconnect()},[hasMore,onLoadMore,loadMore,items2.length]);let barShown=bar.visible,toastNode=jsx15(ActionToast,{toast:controller.toast,onUndo:()=>{controller.undo()},onDismiss:controller.dismiss}),showSkeleton=loading&&items2.length===0,titleNode=title?jsxs13("h2",{className:"nui-lr-title",children:[jsx15("span",{className:"nui-lr-title-text",children:t(title.text)}),title.count!==void 0&&jsx15("span",{className:"nui-lr-title-count",children:title.count})]}):null,tools=toolbarActions||create||viewMenu?jsxs13("span",{className:"nui-lr-tools",children:[toolbarActions,create&&jsx15(CreateButton,{create}),viewMenu&&jsx15(ViewMenu,{menu:viewMenu})]}):null,toolbarNode=null;tabs?toolbarNode=jsx15(TabRow,{...tabs,lead:tabs.lead??titleNode,end:tools}):(titleNode||tools)&&(toolbarNode=jsxs13("div",{className:"nui-lr-toolbar",children:[titleNode,jsx15("span",{className:"nui-lr-toolbar-spacer"}),tools]}));let listNode=jsxs13("div",{ref:listRef,className:"nui-lr-list","data-footer":footer?"":void 0,children:[toolbarNode,infoLine!=null&&jsx15("div",{className:"nui-lr-info",children:infoLine}),showSkeleton?jsx15(ListSkeleton,{grouped:!!groupBy}):items2.length===0&&!boardOn?jsx15("div",{className:"nui-lr-empty",children:empty??jsx15(EmptyState,{})}):jsxs13("div",{ref:scrollRef,className:cx("nui-lr-scroll",boardOn&&"nui-board"),role:"listbox","aria-label":t(label??LIST_READER_WORDS.list),"aria-multiselectable":canSelect||void 0,"aria-busy":loading||loadingMore||void 0,"data-notis-engine-list":"","data-marquee":flag(marquee.rect!==null),onMouseDown:marquee.onMouseDown,onClickCapture:marquee.onClickCapture,children:[jsx15(RowStateContext.Provider,{value:source,children:body}),hasMore&&jsxs13("div",{className:"nui-lr-more",role:"presentation",children:[jsx15("div",{ref:sentinelRef,className:"nui-lr-sentinel","aria-hidden":"true"}),jsx15(Button,{variant:"ghost",size:"sm",disabled:loadingMore||!onLoadMore,onClick:loadMore,"aria-busy":loadingMore||void 0,children:t(loadingMore?LIST_READER_WORDS.loading:LIST_READER_WORDS.loadMore)})]})]}),marquee.rect&&jsx15(MultiSelectDragOverlay,{rect:marquee.rect,className:"nui-marquee"}),footer?jsx15("div",{className:"nui-lr-footer",children:footer}):null,barShown&&jsx15(SelectionBar,{...bar.barProps}),mode==="side"&&jsx15(PaneProbe,{onChange:setPaneLayout}),!listCovered&&toastNode]}),openIndex=openId!==null?navIds.indexOf(openId):-1,runOn=item=>(ref,option)=>{let action=typeof ref=="string"?controller.actions.find(candidate=>candidate.id===ref):ref;return action?action.options&&option===void 0?controller.isBusy(action.id)?Promise.resolve({status:"busy",done:[],failed:[]}):action.appliesTo&&!action.appliesTo(item)?Promise.resolve(cancelledOutcome()):new Promise(settle=>{let pane=readerRef.current,slot=pane?.querySelector('[data-part="actions"]')??null,{active}=focusOf(rootRef.current),anchor=slot&&active&&active!==slot&&containsComposed(slot,active)?active:slot;openPicker(action,[item],anchor??pane,settle)}):controller.run(action,[item],option).then(outcome=>(outcome.status!=="busy"&&onRan(action,[item],outcome),outcome)):Promise.resolve(cancelledOutcome())},ctx={close,next:()=>{step(1)},prev:()=>{step(-1)},hasNext:openIndex>-1&&(openIndex<navIds.length-1||hasMore||wraps&&navIds.length>1),hasPrev:openIndex>-1&&(openIndex>0||wraps&&navIds.length>1),mode,setMode,section:activeSection?.name??null,notify,actions:openItem!==null?controller.available([openItem]):[],busy:controller.busy,run:openItem!==null?runOn(openItem):()=>Promise.resolve(cancelledOutcome()),actionsMenu:openItem!==null&&!isBlocked(openId)?itemMenu(openItem,"reader"):null},readerNode=null;if(reader&&openItem!==null){let blockedOpen=isBlocked(openId),barActions=(readerActions?.(openItem,ctx)??[]).map(action=>blockedOpen&&!action.disabled?{...action,disabled:!0}:action);readerNode=jsx15(ReaderPane,{paneRef:readerRef,ctx,allowed,itemId:openId,sectionSeq:activeSection?.seq??0,label:readerLabel?.(openItem),actions:barActions.slice(0,READER_ACTIONS_MAX),keysYield:selectionKeys,keysHidden:anySelected&&!listCovered,more:itemMenu(openItem,"reader",barActions.slice(READER_ACTIONS_MAX),!isBlocked(openId)),center:centerOpen,full:fullOpen,children:reader(openItem,ctx)})}else missing?readerNode=jsx15(ReaderPane,{paneRef:readerRef,ctx,allowed,itemId:openId,sectionSeq:0,center:centerOpen,full:fullOpen,children:jsx15(EmptyState,{title:LIST_READER_WORDS.notFound,body:LIST_READER_WORDS.notFoundBody})}):autoOpen&&besideList&&items2.length>0&&(readerNode=jsx15(PickOne,{}));let pickerOptions=picker?.action.options?.(picker.items)??[],pickerValue=picker?.action.value?.(picker.items),pickerNode=picker?jsx15(Menu,{anchor:picker.anchor,open:!0,align:"start",side:"bottom",label:picker.action.label,onOpenChange:next=>{next||(setPicker(null),settlePicker(null))},children:pickerOptions.map(option=>jsxs13(Menu.Item,{icon:option.icon,checked:picker.action.value?pickerValue===option.value:void 0,onSelect:()=>{let settle=pickerSettle.current;pickerSettle.current=null,choose(picker.action,picker.items,option).then(outcome=>settle?.(outcome))},children:[t(option.label),option.hint!==void 0&&jsx15("span",{className:"nui-menu-hint",children:t(option.hint)})]},option.value))}):null;return jsxs13("div",{ref:rootRef,className:cx("nui-lr",className),"data-mode":mode,"data-density":density,"data-look":look,"data-reader-open":flag(readerOpen),"data-bar":flag(barShown),"data-has-selection":flag(canSelect&&anySelected),"data-loading":flag(loading&&items2.length>0),children:[search&&jsx15(ListSearch,{search,query:localQuery,setQuery:setLocalQuery}),jsx15("div",{className:"nui-lr-body",children:mode==="side"?jsx15(Panels,{list:listNode,reader:readerNode,resizable:!0,storageKey:storeKey?`lr:${storeKey}`:void 0}):jsxs13(Fragment8,{children:[listNode,centerOpen&&jsx15("div",{className:"nui-lr-scrim",onClick:close,"aria-hidden":"true"}),centerOpen&&jsx15("div",{className:"nui-lr-center",children:readerNode}),fullOpen&&readerNode]})}),listCovered&&toastNode,pickerNode,reorder&&reorderer.announcer]})}var NO_PANE=Object.freeze({covers:!1,split:!1});function PaneProbe({onChange}){let panels=usePanels(),covers=panels.mode==="stacked"&&panels.readerOpen,split=panels.mode==="split"&&panels.settled;return useIsoLayoutEffect(()=>{onChange(covers===NO_PANE.covers&&split===NO_PANE.split?NO_PANE:{covers,split})},[covers,split,onChange]),null}function TileContent({parts}){let bottom=parts.figure!==void 0||parts.trailing!==void 0;return jsxs13(Fragment8,{children:[jsxs13("span",{className:"nui-tile-top",children:[parts.mark!==void 0&&jsx15("span",{className:"nui-tile-mark",children:parts.mark}),jsxs13("span",{className:"nui-tile-head",children:[jsx15("span",{className:"nui-tile-title",children:parts.title}),parts.subtitle!==void 0&&jsx15("span",{className:"nui-tile-subtitle",children:parts.subtitle})]})]}),parts.body!==void 0&&jsx15("span",{className:"nui-tile-body",children:parts.body}),bottom&&jsxs13("span",{className:"nui-tile-bottom",children:[parts.figure!==void 0&&jsx15("span",{className:"nui-tile-figure",children:parts.figure}),jsx15("span",{className:"nui-tile-spacer"}),parts.trailing]}),jsx15(RowMore,{})]})}function CreateButton({create}){let t=useT(),latest=useLatest(create),defs=useMemo11(()=>create.key?[{id:"list.create",keys:keyList(create.key),scope:"collection",label:toWords(latest.current.label),run:()=>{latest.current.onCreate()}}]:[],[create.key,latest]);return useShortcuts(defs),jsx15(Tooltip,{label:create.label,keys:create.key,children:jsx15("button",{type:"button",className:"nui-om-btn","data-part":"create","aria-label":t(create.label),onClick:()=>create.onCreate(),children:jsx15(Icon,{name:"plus"})})})}function ViewMenu({menu}){let t=useT(),choices=items2=>items2.map(item=>jsx15(Menu.Item,{icon:item.icon,checked:item.checked,onSelect:()=>item.onSelect(),children:t(item.label)},item.id));return jsxs13(Menu,{align:"end",label:LIST_READER_WORDS.viewOptions,accelerators:!1,trigger:jsx15("button",{type:"button",className:"nui-om-btn","data-part":"view-menu","aria-label":t(LIST_READER_WORDS.viewOptions),children:jsx15(Icon,{name:"dots-three"})}),children:[menu.sort?.length?jsx15(Menu.Sub,{label:t(LIST_READER_WORDS.sort),menuLabel:LIST_READER_WORDS.sort,children:choices(menu.sort)}):null,menu.group?.length?jsx15(Menu.Sub,{label:t(LIST_READER_WORDS.group),menuLabel:LIST_READER_WORDS.group,children:choices(menu.group)}):null,menu.layout?jsx15(Menu.Sub,{label:t(LIST_READER_WORDS.layout),menuLabel:LIST_READER_WORDS.layout,children:menu.layout.options.map(option=>jsx15(Menu.Item,{icon:option.icon,checked:menu.layout.value===option.value,onSelect:()=>menu.layout.onChange(option.value),children:t(option.label)},option.value))}):null,menu.actions?.length?jsxs13(Fragment8,{children:[menu.sort?.length||menu.group?.length||menu.layout?jsx15(Menu.Separator,{}):null,menu.actions.map(item=>jsx15(Menu.Item,{icon:item.icon,onSelect:()=>item.onSelect(),children:t(item.label)},item.id))]}):null,menu.description!==void 0&&jsx15("p",{className:"nui-lr-view-note",children:t(menu.description)})]})}function ListSearch({search,query,setQuery}){let t=useT();return useTopBarSearch({value:search.onChange?search.value??"":query,onChange:search.onChange??setQuery,placeholder:search.placeholder!==void 0?t(search.placeholder):void 0,onSubmit:search.onSubmit}),null}function PickOne(){let t=useT(),[before,rest=""]=t(LIST_READER_WORDS.pickKeys).split("{a}"),[middle,after=""]=rest.split("{b}");return jsxs13("div",{className:"nui-lr-pick",children:[jsx15("p",{children:t(LIST_READER_WORDS.pickOne)}),jsxs13("p",{className:"nui-lr-pick-keys",children:[before,jsx15(Keycap,{keys:"j"}),jsx15(Keycap,{keys:"k"}),middle,jsx15(Keycap,{keys:"enter"}),after]})]})}var NO_READER_ACTIONS=Object.freeze([]);function ReaderPane({paneRef,ctx,allowed,itemId,sectionSeq,label,actions=NO_READER_ACTIONS,more,keysYield,keysHidden=!1,center,full,children}){let t=useT(),panels=usePanels(),bodyRef=useRef15(null),[running,setRunning]=useState13(()=>new Set),runningNow=useRef15(new Set);useIsoLayoutEffect(()=>{bodyRef.current&&(bodyRef.current.scrollTop=0)},[itemId]),useEffect16(()=>{let name=ctx.section,body=bodyRef.current;if(!name||!body)return;let escaped=name.replace(/["\\]/g,"\\$&"),reveal=()=>{let target=body.querySelector(`[data-section="${escaped}"]`);return target?.scrollIntoView?.({block:"start"}),!!target};if(reveal()||typeof requestAnimationFrame>"u")return;let frame=requestAnimationFrame(()=>{reveal()});return()=>cancelAnimationFrame(frame)},[itemId,sectionSeq]);let runAction=useCallback13(action=>{action.disabled||runningNow.current.has(action.id)||(runningNow.current.add(action.id),setRunning(now=>new Set(now).add(action.id)),Promise.resolve().then(()=>action.run()).catch(()=>{}).finally(()=>{runningNow.current.delete(action.id),setRunning(now=>{let next=new Set(now);return next.delete(action.id),next})}))},[]),latestActions=useLatest(actions),latestYield=useLatest(keysYield),keySig=actions.map(action=>`${action.id}:${keyList(action.key).join(",")}`).join("|"),actionDefs=useMemo11(()=>latestActions.current.filter(action=>action.key).map(action=>({id:`list.reader.${action.id}`,keys:keyList(action.key),scope:center?"modal":"detail",label:toWords(action.label),when:()=>!!paneRef.current&&isVisibleComposed(paneRef.current)&&!latestYield.current?.()&&!latestActions.current.find(entry=>entry.id===action.id)?.disabled,run:()=>{let current=latestActions.current.find(entry=>entry.id===action.id);current&&runAction(current)}})),[keySig,center,runAction]);useShortcuts(actionDefs);let slide=!center&&!full&&panels.mode==="stacked",back=full||slide,k=DEFAULT_KEYMAP,closeButton=jsx15(Tooltip,{label:SHELL_WORDS.close,keys:["escape"],children:jsx15("button",{type:"button",className:"nui-om-btn","data-part":"close","aria-label":t(SHELL_WORDS.close),onClick:ctx.close,children:jsx15(Icon,{name:"x"})})});return jsxs13("div",{ref:paneRef,className:"nui-lr-reader",tabIndex:-1,"data-notis-escape-owned":"",...center?{role:"dialog","aria-modal":!0,"aria-label":t(SHELL_WORDS.centerPeek)}:{},children:[jsxs13("div",{className:"nui-lr-bar",children:[back?jsx15(Tooltip,{label:SHELL_WORDS.back,keys:["escape"],children:jsxs13("button",{type:"button",className:"nui-lr-back","data-part":"back","data-compact":slide?"":void 0,"aria-label":t(SHELL_WORDS.back),onClick:ctx.close,children:[jsx15(Icon,{name:"arrow-left"}),jsx15("span",{className:"nui-lr-back-label",children:t(SHELL_WORDS.back)})]})}):closeButton,jsx15(OpenAsMenu,{allowed,mode:ctx.mode,onChange:ctx.setMode}),jsx15(Tooltip,{label:SHELL_WORDS.previous,keys:[...k["list.prev"].keys].slice(0,1),children:jsx15("button",{type:"button",className:"nui-om-btn","data-part":"prev","aria-label":t(SHELL_WORDS.previous),"aria-disabled":!ctx.hasPrev||void 0,onClick:()=>{ctx.hasPrev&&ctx.prev()},children:jsx15(Icon,{name:"caret-up"})})}),jsx15(Tooltip,{label:SHELL_WORDS.next,keys:[...k["list.next"].keys].slice(0,1),children:jsx15("button",{type:"button",className:"nui-om-btn","data-part":"next","aria-label":t(SHELL_WORDS.next),"aria-disabled":!ctx.hasNext||void 0,onClick:()=>{ctx.hasNext&&ctx.next()},children:jsx15(Icon,{name:"caret-down"})})}),jsx15("span",{className:"nui-lr-label","data-part":"label",children:label}),jsx15("span",{className:"nui-lr-actions","data-part":"actions",children:actions.map(action=>{let busy=running.has(action.id);return action.labelled??!!action.key?jsx15(Tooltip,{label:action.label,keys:keysHidden?void 0:action.key,children:jsxs13("button",{type:"button",className:"nui-lr-act","data-action":action.id,"aria-label":t(action.label),"aria-busy":busy||void 0,"aria-disabled":action.disabled||void 0,onClick:()=>runAction(action),children:[jsx15(Icon,{name:action.icon}),jsx15("span",{className:"nui-lr-act-label",children:t(action.label)}),action.key!==void 0&&!keysHidden&&jsx15(Keycap,{keys:keyList(action.key)})]})},action.id):jsx15(Tooltip,{label:action.label,keys:keysHidden?void 0:action.key,children:jsx15("button",{type:"button",className:"nui-om-btn","data-action":action.id,"aria-label":t(action.label),"aria-busy":busy||void 0,"aria-disabled":action.disabled||void 0,onClick:()=>runAction(action),children:jsx15(Icon,{name:action.icon})})},action.id)})}),more,center&&allowed.includes("full")&&jsx15(Tooltip,{label:LIST_READER_WORDS.openFull,children:jsx15("button",{type:"button",className:"nui-om-btn","data-part":"expand","aria-label":t(LIST_READER_WORDS.openFull),onClick:()=>ctx.setMode("full"),children:jsx15(Icon,{name:"arrows-out"})})}),slide&&closeButton]}),jsx15("div",{ref:bodyRef,className:"nui-lr-reader-body",children:jsx15("div",{className:"nui-lr-reader-inner",children})})]})}import{jsx as jsx16}from"react/jsx-runtime";var noRow=()=>null;function BoardView({columns,getColumn,renderTile,onMove,emptyColumn,...rest}){return jsx16(ListReader,{...rest,layout:"board",row:noRow,renderTile,board:{columns,getColumn,onMove,emptyColumn}})}import{useEffect as useEffect18,useMemo as useMemo12,useRef as useRef17,useState as useState15}from"react";var GALLERY_WORDS=Object.freeze({attachments:{en:"Attachments",fr:"Pi\xE8ces jointes"},open:{en:"Open {name}",fr:"Ouvrir {name}"},scrollBack:{en:"Show earlier files",fr:"Voir les fichiers pr\xE9c\xE9dents"},scrollForward:{en:"Show more files",fr:"Voir plus de fichiers"},viewer:{en:"Image viewer",fr:"Visionneuse d\u2019images"},previous:{en:"Previous image",fr:"Image pr\xE9c\xE9dente"},previousHint:{en:"Previous image (Left arrow)",fr:"Image pr\xE9c\xE9dente (fl\xE8che gauche)"},next:{en:"Next image",fr:"Image suivante"},nextHint:{en:"Next image (Right arrow)",fr:"Image suivante (fl\xE8che droite)"},counter:{en:"{index} / {count}",fr:"{index} / {count}"},zoomIn:{en:"Zoom in",fr:"Zoom avant"},zoomInHint:{en:"Zoom in (+)",fr:"Zoom avant (+)"},zoomOut:{en:"Zoom out",fr:"Zoom arri\xE8re"},zoomOutHint:{en:"Zoom out (-)",fr:"Zoom arri\xE8re (-)"},resetZoom:{en:"Reset zoom to fit (0)",fr:"Ajuster \xE0 l\u2019\xE9cran (0)"},fit:{en:"Fit",fr:"Ajuster"},download:{en:"Download",fr:"T\xE9l\xE9charger"},copyLink:{en:"Copy link",fr:"Copier le lien"},linkCopied:{en:"Link copied",fr:"Lien copi\xE9"},copyFailed:{en:"Failed to copy link",fr:"Impossible de copier le lien"},downloadFailed:{en:"Failed to download image",fr:"Impossible de t\xE9l\xE9charger l\u2019image"},close:{en:"Close",fr:"Fermer"},closeHint:{en:"Close (Esc)",fr:"Fermer (\xC9chap)"}});import{useCallback as useCallback14,useEffect as useEffect17,useRef as useRef16,useState as useState14}from"react";import{createPortal as createPortal5}from"react-dom";import{Fragment as Fragment9,jsx as jsx17,jsxs as jsxs14}from"react/jsx-runtime";var IMAGE_VIEWER_ZOOM_LEVELS=Object.freeze([.25,.5,.75,1,1.25,1.5,2,3]),DEFAULT_ZOOM_INDEX=3,DRAG_GATE_PX=3,COPIED_MS=1500,FOCUSABLE3='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function clampIndex(index,length){return length<=0?0:Math.min(Math.max(index,0),length-1)}function ImageViewer({container,...props}){let pinned=usePinnedLayerRoot(),anchorRef=useRef16(null),[target,setTarget]=useState14(container??pinned??null),hasImages=props.images.length>0;return useEffect17(()=>{if(container||pinned){setTarget(container??pinned);return}if(!hasImages){setTarget(null);return}setTarget(findLayerRoot(anchorRef.current)??(typeof document>"u"?null:document.body))},[container,pinned,hasImages]),hasImages?target?createPortal5(jsx17(ImageViewerPanel,{...props}),target):jsx17("span",{ref:anchorRef,hidden:!0}):null}function ImageViewerPanel({images,initialIndex=0,onClose,actions,onNotice,className}){let t=useT(),locale=useToolkitLocale(),panelRef=useRef16(null),[index,setIndex]=useState14(()=>clampIndex(initialIndex,images.length)),[zoomIndex,setZoomIndex]=useState14(DEFAULT_ZOOM_INDEX),[translate,setTranslate]=useState14({x:0,y:0}),[dragging,setDragging]=useState14(!1),[copied,setCopied]=useState14(!1),dragStart=useRef16({x:0,y:0,tx:0,ty:0}),dragged=useRef16(!1),closeRef=useLatest(onClose),current=images[clampIndex(index,images.length)],zoom=IMAGE_VIEWER_ZOOM_LEVELS[zoomIndex]??1,many=images.length>1,zoomIn=useCallback14(()=>setZoomIndex(i=>Math.min(i+1,IMAGE_VIEWER_ZOOM_LEVELS.length-1)),[]),zoomOut=useCallback14(()=>setZoomIndex(i=>Math.max(i-1,0)),[]),resetZoom=useCallback14(()=>{setZoomIndex(DEFAULT_ZOOM_INDEX),setTranslate({x:0,y:0})},[]),previous=useCallback14(()=>setIndex(i=>clampIndex(i-1,images.length)),[images.length]),next=useCallback14(()=>setIndex(i=>clampIndex(i+1,images.length)),[images.length]);useEffect17(()=>{setIndex(i=>clampIndex(i,images.length))},[images.length]),useEffect17(()=>{resetZoom(),setCopied(!1)},[index,resetZoom]),useEffect17(()=>{if(!copied)return;let timer=setTimeout(()=>setCopied(!1),COPIED_MS);return()=>clearTimeout(timer)},[copied]),useEscapeLayer("image-viewer",()=>(closeRef.current(),!0),{priority:ESCAPE_PRIORITY.overlay}),useEffect17(()=>{let onKeyDown=event=>{if(!(event.isComposing||event.metaKey||event.ctrlKey||event.altKey))if(event.key==="Escape"){if(event.defaultPrevented||event.repeat)return;event.preventDefault(),closeRef.current()}else event.key==="+"||event.key==="="?zoomIn():event.key==="-"?zoomOut():event.key==="0"?resetZoom():many&&event.key==="ArrowLeft"?(event.preventDefault(),previous()):many&&event.key==="ArrowRight"&&(event.preventDefault(),next())};return window.addEventListener("keydown",onKeyDown),()=>window.removeEventListener("keydown",onKeyDown)},[closeRef,many,next,previous,resetZoom,zoomIn,zoomOut]),useEffect17(()=>{let panel=panelRef.current;if(!panel)return;let previousFocus=deepActiveElement(panel.ownerDocument);return panel.focus(),()=>{previousFocus?.isConnected&&previousFocus.focus()}},[]);let trapTab=event=>{if(event.key!=="Tab")return;let panel=panelRef.current;if(!panel)return;let items2=[...panel.querySelectorAll(FOCUSABLE3)];if(!items2.length){event.preventDefault(),panel.focus();return}let first=items2[0],last=items2[items2.length-1],active=deepActiveElement(panel.getRootNode());event.shiftKey&&(active===first||active===panel)?(event.preventDefault(),last.focus()):!event.shiftKey&&active===last&&(event.preventDefault(),first.focus())},download=async()=>{if(current)try{let response=await fetch(current.src);if(!response.ok)throw new Error(String(response.status));let url=URL.createObjectURL(await response.blob()),link=document.createElement("a");link.href=url,link.download=current.alt||"image",link.click(),URL.revokeObjectURL(url)}catch{onNotice?.("error",t(GALLERY_WORDS.downloadFailed)),window.open(current.src,"_blank","noopener")}},copyLink=async()=>{if(current)try{await navigator.clipboard.writeText(current.src),setCopied(!0),onNotice?.("success",t(GALLERY_WORDS.linkCopied))}catch{onNotice?.("error",t(GALLERY_WORDS.copyFailed))}},onMouseDown=event=>{event.button===0&&(dragged.current=!1,setDragging(!0),dragStart.current={x:event.clientX,y:event.clientY,tx:translate.x,ty:translate.y})},onMouseMove=event=>{if(!dragging)return;let dx=event.clientX-dragStart.current.x,dy=event.clientY-dragStart.current.y;(Math.abs(dx)>DRAG_GATE_PX||Math.abs(dy)>DRAG_GATE_PX)&&(dragged.current=!0),setTranslate({x:dragStart.current.tx+dx,y:dragStart.current.ty+dy})},stopDrag=()=>setDragging(!1),onWheel=event=>{event.deltaY<0?zoomIn():event.deltaY>0&&zoomOut()};if(!current)return null;let position=clampIndex(index,images.length);return jsxs14("div",{ref:panelRef,className:cx("nui-root nui-viewer",className),role:"dialog","aria-modal":"true","aria-label":t(GALLERY_WORDS.viewer),tabIndex:-1,lang:locale,"data-notis-escape-owned":"",onKeyDown:trapTab,onMouseUp:stopDrag,onMouseLeave:stopDrag,children:[jsxs14("div",{className:cx("nui-viewer-stage",dragging&&"nui-viewer-dragging"),onMouseDown,onMouseMove,onWheel,onClick:event=>{event.target===event.currentTarget&&!dragged.current&&onClose()},children:[many&&jsxs14(Fragment9,{children:[jsx17("button",{type:"button",className:"nui-viewer-nav nui-viewer-prev",onMouseDown:e=>e.stopPropagation(),onClick:previous,disabled:position===0,title:t(GALLERY_WORDS.previousHint),"aria-label":t(GALLERY_WORDS.previous),children:jsx17(Icon,{name:"caret-left"})}),jsx17("button",{type:"button",className:"nui-viewer-nav nui-viewer-next",onMouseDown:e=>e.stopPropagation(),onClick:next,disabled:position===images.length-1,title:t(GALLERY_WORDS.nextHint),"aria-label":t(GALLERY_WORDS.next),children:jsx17(Icon,{name:"caret-right"})})]}),jsx17("img",{className:"nui-viewer-image",src:current.src,alt:current.alt||"",draggable:!1,style:{transform:`translate(${translate.x}px, ${translate.y}px) scale(${zoom})`,transition:dragging?"none":void 0}})]}),jsxs14("div",{className:"nui-viewer-bar",children:[actions?.(current,position),jsx17("button",{type:"button",className:"nui-viewer-btn",onClick:zoomOut,disabled:zoomIndex===0,title:t(GALLERY_WORDS.zoomOutHint),"aria-label":t(GALLERY_WORDS.zoomOut),children:jsx17(Icon,{name:"magnifying-glass-minus"})}),jsx17("button",{type:"button",className:"nui-viewer-btn nui-viewer-zoom",onClick:resetZoom,title:t(GALLERY_WORDS.resetZoom),children:zoomIndex===DEFAULT_ZOOM_INDEX?t(GALLERY_WORDS.fit):`${Math.round(zoom*100)}%`}),many&&jsx17("span",{className:"nui-viewer-count","aria-live":"polite",children:t(fillWords(GALLERY_WORDS.counter,{index:position+1,count:images.length}))}),jsx17("button",{type:"button",className:"nui-viewer-btn",onClick:zoomIn,disabled:zoomIndex===IMAGE_VIEWER_ZOOM_LEVELS.length-1,title:t(GALLERY_WORDS.zoomInHint),"aria-label":t(GALLERY_WORDS.zoomIn),children:jsx17(Icon,{name:"magnifying-glass-plus"})}),jsx17("span",{className:"nui-viewer-sep","aria-hidden":"true"}),jsx17("button",{type:"button",className:"nui-viewer-btn",onClick:()=>{download()},title:t(GALLERY_WORDS.download),"aria-label":t(GALLERY_WORDS.download),children:jsx17(Icon,{name:"download-simple"})}),jsx17("button",{type:"button",className:"nui-viewer-btn",onClick:()=>{copyLink()},title:t(copied?GALLERY_WORDS.linkCopied:GALLERY_WORDS.copyLink),"aria-label":t(copied?GALLERY_WORDS.linkCopied:GALLERY_WORDS.copyLink),children:jsx17(Icon,{name:copied?"check":"link"})}),jsx17("span",{className:"nui-viewer-sep","aria-hidden":"true"}),jsx17("button",{type:"button",className:"nui-viewer-btn",onClick:onClose,title:t(GALLERY_WORDS.closeHint),"aria-label":t(GALLERY_WORDS.close),children:jsx17(Icon,{name:"x"})})]})]})}import{Fragment as Fragment10,jsx as jsx18,jsxs as jsxs15}from"react/jsx-runtime";var AUDIO_EXTENSIONS=["webm","ogg","mp3","wav","m4a","aac","flac","opus"],IMAGE_EXTENSIONS=["jpg","jpeg","png","gif","webp","svg","avif"],VIDEO_EXTENSIONS=["mp4","mov","avi","mkv","mpeg"];function extensionOf(item){if(item.extension)return item.extension.replace(/^\./,"").toLowerCase();let name=item.name??"",dot=name.lastIndexOf(".");return dot>0?name.slice(dot+1).toLowerCase():""}function galleryItemKind(item){if(item.kind)return item.kind;let type=(item.type??"").toLowerCase(),ext=extensionOf(item);return type.startsWith("audio/")||AUDIO_EXTENSIONS.includes(ext)?ext==="webm"&&type.startsWith("video/")?"video":"audio":type.startsWith("image/")||IMAGE_EXTENSIONS.includes(ext)?"image":type.startsWith("video/")||VIDEO_EXTENSIONS.includes(ext)?"video":type.includes("pdf")||ext==="pdf"?"pdf":"file"}function galleryItemName(item){return item.name||`file.${extensionOf(item)||"bin"}`}var KIND_ICON={image:"file-image",video:"file-video",audio:"file-audio",pdf:"file-text",file:"file"};function AttachmentGallery({items:items2,label,className,onOpen,renderOpener,itemAction,viewerActions,onNotice}){let t=useT(),scrollRef=useRef17(null),[fades,setFades]=useState15({start:!1,end:!1}),[viewerIndex,setViewerIndex]=useState15(null),images=useMemo12(()=>items2.reduce((list,item,itemIndex)=>(galleryItemKind(item)==="image"&&item.url&&list.push({src:item.url,alt:galleryItemName(item),itemIndex}),list),[]),[items2]),imageIndexOf=useMemo12(()=>new Map(images.map((image,i)=>[image.itemIndex,i])),[images]),viewerImages=useMemo12(()=>images.map(({src,alt})=>({src,alt})),[images]);if(useEffect18(()=>{let el=scrollRef.current;if(!el)return;let update=()=>{let start=el.scrollLeft>4,end=el.scrollLeft<el.scrollWidth-el.clientWidth-4;setFades(current=>current.start===start&&current.end===end?current:{start,end})};update(),el.addEventListener("scroll",update,{passive:!0});let observer=typeof ResizeObserver>"u"?null:new ResizeObserver(update);return observer?.observe(el),()=>{el.removeEventListener("scroll",update),observer?.disconnect()}},[items2.length]),!items2.length)return null;let open=(item,index)=>{let imageIndex=imageIndexOf.get(index);if(imageIndex!==void 0){setViewerIndex(imageIndex);return}if(onOpen){onOpen(item,index);return}item.url&&window.open(item.url,"_blank","noopener")};return jsxs15("div",{className:cx("nui-root nui-gallery",className),children:[jsx18("div",{ref:scrollRef,className:"nui-gallery-row",role:"list","aria-label":t(label??GALLERY_WORDS.attachments),children:items2.map((item,index)=>{let kind=galleryItemKind(item),name=galleryItemName(item),ext=extensionOf(item).toUpperCase(),picture=kind==="image"?item.thumbnailUrl||item.url:null,content=jsxs15(Fragment10,{children:[picture?jsx18("span",{className:"nui-gallery-thumb",children:jsx18("img",{src:picture,alt:name,loading:"lazy"})}):jsx18("span",{className:"nui-gallery-glyph",children:renderIcon(item.icon??KIND_ICON[kind])}),jsx18("span",{className:"nui-gallery-name",title:name,children:name}),ext&&jsx18("span",{className:"nui-gallery-ext",children:ext})]}),custom=kind==="image"?void 0:renderOpener?.(item,{className:"nui-gallery-card",children:content,index}),action=itemAction?.(item,index);return jsxs15("div",{className:"nui-gallery-item",role:"listitem",children:[custom??jsx18("button",{type:"button",className:"nui-gallery-card",disabled:!item.url,"aria-label":t(fillWords(GALLERY_WORDS.open,{name})),onClick:()=>open(item,index),children:content}),action&&jsx18("span",{className:"nui-gallery-action",children:action})]},item.url||index)})}),fades.start&&jsx18("span",{className:"nui-gallery-fade nui-gallery-fade-start","aria-hidden":"true"}),fades.end&&jsx18("span",{className:"nui-gallery-fade nui-gallery-fade-end","aria-hidden":"true"}),viewerIndex!==null&&viewerImages.length>0&&jsx18(ImageViewer,{images:viewerImages,initialIndex:viewerIndex,onClose:()=>setViewerIndex(null),actions:viewerActions,onNotice})]})}var STYLE_ATTRIBUTE="data-notis-toolkit-styles",registeredText=null,constructed=null;function canConstruct(){try{return typeof CSSStyleSheet<"u"&&typeof new CSSStyleSheet().replaceSync=="function"}catch{return!1}}function registerToolkitStyles(source){if(typeof source=="string"){registeredText=source,constructed=null,canConstruct()&&(constructed=new CSSStyleSheet,constructed.replaceSync(source));return}constructed=source,registeredText=sheetText(source)}function sheetText(sheet){try{return Array.from(sheet.cssRules,rule=>rule.cssText).join(`
7
+ `)}catch{return null}}function getToolkitStyleText(){return registeredText}function getToolkitStyleSheet(){return constructed}function adoptToolkitStyles(root){let sheet=getToolkitStyleSheet();if(sheet&&"adoptedStyleSheets"in root){let current=root.adoptedStyleSheets;return current.includes(sheet)||(root.adoptedStyleSheets=[...current,sheet]),!0}let text=getToolkitStyleText();if(!text)return!1;let host=root instanceof Document?root.head:root;if(host.querySelector(`style[${STYLE_ATTRIBUTE}]`))return!0;let style=(root instanceof Document?root:root.ownerDocument).createElement("style");return style.setAttribute(STYLE_ATTRIBUTE,""),style.textContent=text,host.appendChild(style),!0}import{addDays,differenceInCalendarDays,endOfDay,endOfMonth,format as formatDate,isValid,parseISO,startOfDay,startOfMonth,startOfYear,subMonths,subYears}from"date-fns";var PRESETS=Object.freeze(["today","yesterday","last7","last30","last90","thisMonth","lastMonth","thisQuarter","thisYear","custom"]),COMPARES=Object.freeze(["prev","year","none"]),DEFAULT_PRESET="last30",DEFAULT_COMPARE="prev";function isPresetId(value){return typeof value=="string"&&PRESETS.includes(value)}function isCompareId(value){return typeof value=="string"&&COMPARES.includes(value)}var ISO_DAY=/^\d{4}-\d{2}-\d{2}$/;function toIsoDay(date){return formatDate(date,"yyyy-MM-dd")}function fromIsoDay(value){if(!value||!ISO_DAY.test(value))return null;let date=parseISO(value);return isValid(date)&&toIsoDay(date)===value?startOfDay(date):null}function wholeDays(from,to){return{from:startOfDay(from),to:endOfDay(to)}}function dayCount(range){return differenceInCalendarDays(range.to,range.from)+1}function presetRange(preset,now=new Date,custom){let today=startOfDay(now);switch(preset){case"today":return wholeDays(today,today);case"yesterday":{let day=addDays(today,-1);return wholeDays(day,day)}case"last7":return wholeDays(addDays(today,-6),today);case"last30":return wholeDays(addDays(today,-29),today);case"last90":return wholeDays(addDays(today,-89),today);case"thisMonth":return wholeDays(startOfMonth(today),today);case"lastMonth":{let last=subMonths(startOfMonth(today),1);return wholeDays(last,endOfMonth(last))}case"thisQuarter":{let month=today.getMonth();return wholeDays(new Date(today.getFullYear(),month-month%3,1),today)}case"thisYear":return wholeDays(startOfYear(today),today);case"custom":{let from=fromIsoDay(custom?.from),to=fromIsoDay(custom?.to);return from&&to&&from<=to&&to<=today?wholeDays(from,to):wholeDays(addDays(today,-29),today)}default:return wholeDays(addDays(today,-29),today)}}function compareRange(range,compare){if(compare==="none")return null;if(compare==="year")return wholeDays(subYears(startOfDay(range.from),1),subYears(startOfDay(range.to),1));let n=dayCount(range),from=startOfDay(range.from);return wholeDays(addDays(from,-n),addDays(from,-1))}function periodRanges(period,now=new Date){let range=presetRange(period.preset,now,period);return{range,compareRange:compareRange(range,period.compare)}}function normalizePeriod(period){return period.preset!=="custom"?{preset:period.preset,compare:period.compare}:{preset:"custom",compare:period.compare,from:period.from,to:period.to}}function customPeriod(a,b,compare){let[lo,hi]=a<=b?[a,b]:[b,a];return{preset:"custom",compare,from:toIsoDay(lo),to:toIsoDay(hi)}}function formatPeriodParam(period,defaultCompare=DEFAULT_COMPARE){let head=period.preset==="custom"&&period.from&&period.to?`${period.from}..${period.to}`:period.preset;return period.compare===defaultCompare?head:`${head}~${period.compare}`}function parsePeriodParam(value,defaults={}){let fallbackPreset=defaults.preset??DEFAULT_PRESET,fallbackCompare=defaults.compare??DEFAULT_COMPARE,fallback=fallbackPreset==="custom"?{preset:DEFAULT_PRESET,compare:fallbackCompare}:{preset:fallbackPreset,compare:fallbackCompare};if(!value)return fallback;let[head="",cmp]=value.trim().split("~"),compare=isCompareId(cmp)?cmp:fallbackCompare;if(head.includes("..")){let[from,to]=head.split(".."),a=fromIsoDay(from),b=fromIsoDay(to);return!a||!b?{...fallback,compare}:customPeriod(a,b,compare)}return isPresetId(head)&&head!=="custom"?{preset:head,compare}:{...fallback,compare}}function samePeriod(a,b){return formatPeriodParam(a)===formatPeriodParam(b)}function intlLocale(locale){return locale==="fr"?"fr-FR":"en-US"}var cache=new Map;function dateFormat(locale,options){let key=`${locale}|${JSON.stringify(options)}`,fmt=cache.get(key);return fmt||(fmt=new Intl.DateTimeFormat(intlLocale(locale),options),cache.set(key,fmt)),fmt}function upFirst(text){return text&&text.charAt(0).toLocaleUpperCase()+text.slice(1)}function sameDay(a,b){return a.getFullYear()===b.getFullYear()&&a.getMonth()===b.getMonth()&&a.getDate()===b.getDate()}function joinFrenchParts(parts){return parts.map(part=>part.type==="day"&&part.value==="1"?"1er":part.value).join("")}function formatDay(fmt,date,locale){return locale==="fr"?joinFrenchParts(fmt.formatToParts(date)):fmt.format(date)}var RANGE_OPTIONS={day:"numeric",month:"short",year:"numeric"},RANGE_JOIN={en:" to ",fr:" au "};function formatDateRange(range,locale,options=RANGE_OPTIONS){let fmt=dateFormat(locale,options);if(sameDay(range.from,range.to))return formatDay(fmt,range.from,locale);let join=RANGE_JOIN[locale],text=parts=>locale==="fr"?joinFrenchParts(parts):parts.map(p=>p.value).join("");try{let parts=fmt.formatRangeToParts(range.from,range.to),lastStart=parts.map(p=>p.source).lastIndexOf("startRange"),firstEnd=parts.findIndex(p=>p.source==="endRange");if(lastStart>=0&&firstEnd>lastStart)return`${text(parts.slice(0,lastStart+1))}${join}${text(parts.slice(firstEnd))}`}catch{}return`${formatDay(fmt,range.from,locale)}${join}${formatDay(fmt,range.to,locale)}`}function formatLongDay(date,locale){return upFirst(formatDay(dateFormat(locale,{weekday:"long",day:"numeric",month:"long",year:"numeric"}),date,locale))}function formatDayHeading(date,locale,thisYear=new Date().getFullYear()){let options={weekday:"long",day:"numeric",month:"long"};return date.getFullYear()!==thisYear&&(options.year="numeric"),upFirst(formatDay(dateFormat(locale,options),date,locale))}function formatShortDay(date,locale){return formatDay(dateFormat(locale,{day:"numeric",month:"short"}),date,locale)}function formatMonthYear(date,locale){return upFirst(dateFormat(locale,{month:"long",year:"numeric"}).format(date))}function weekdayNames(locale,width="short"){let fmt=dateFormat(locale,{weekday:width});return Array.from({length:7},(_,i)=>{let name=fmt.format(new Date(2026,0,5+i));return upFirst(width==="short"?name.replace(/\.$/,""):name)})}function dayNumberLabel(date,locale,short=!1){return date.getDate()!==1||short?String(date.getDate()):locale==="fr"?`1er ${dateFormat(locale,{month:"short"}).format(date)}`:dateFormat(locale,{month:"short",day:"numeric"}).format(date)}function formatNumber(value,locale,options={}){return new Intl.NumberFormat(intlLocale(locale),options).format(value)}function formatValue(value,locale){let rounded=Math.abs(value)<10?Math.round(value*10)/10:Math.round(value);return formatNumber(rounded,locale,{maximumFractionDigits:Math.abs(value)<10&&rounded%1?1:0})}function formatDelta(current,previous,locale,higherIsBetter=!0){if(previous==null||previous===0||!Number.isFinite(previous)||!Number.isFinite(current))return null;let percent=(current-previous)/Math.abs(previous)*100,abs=Math.abs(percent),num=formatNumber(abs,locale,{maximumFractionDigits:abs<10?1:0}),up=percent>=0;return{text:`${up?"+":"\u2212"}${num}${locale==="fr"?`${NNBSP}%`:"%"}`,tone:up===higherIsBetter?"good":"destructive",up,percent}}var PRESET_WORDS=Object.freeze({today:w("Today","Aujourd\u2019hui"),yesterday:w("Yesterday","Hier"),last7:w("Last 7 days","7 derniers jours"),last30:w("Last 30 days","30 derniers jours"),last90:w("Last 90 days","90 derniers jours"),thisMonth:w("This month","Ce mois-ci"),lastMonth:w("Last month","Le mois dernier"),thisQuarter:w("This quarter","Ce trimestre"),thisYear:w("This year","Cette ann\xE9e"),custom:w("Custom range","P\xE9riode personnalis\xE9e")}),COMPARE_WORDS=Object.freeze({prev:w("Previous period","P\xE9riode pr\xE9c\xE9dente"),year:w("Same period last year","M\xEAme p\xE9riode l\u2019an dernier"),none:w("No comparison","Aucune comparaison")}),VS_WORDS=Object.freeze({prev:w("vs previous period","vs p\xE9riode pr\xE9c\xE9dente"),year:w("vs last year","vs l\u2019an dernier")}),PERIOD_WORDS=Object.freeze({range:w("Date range","P\xE9riode"),compare:w("Compare to","Comparer \xE0"),apply:w("Apply","Appliquer"),cancel:w("Cancel","Annuler"),pickStart:w("Pick the first day","Choisis le premier jour"),pickEnd:w("Pick the last day","Choisis le dernier jour"),prevMonth:w("Previous month","Mois pr\xE9c\xE9dent"),nextMonth:w("Next month","Mois suivant"),thisPeriod:w("This period","Cette p\xE9riode"),value:w("Value","Valeur"),previous:w("Previous","Avant")}),CHART_WORDS=Object.freeze({tip:w("{v} on {d}","{v} le {d}"),tipCompare:w("{v} on {d}, {c} before","{v} le {d}, {c} avant"),label:w("{m}, {r}.","{m}, {r}."),date:w("Date","Date"),metric:w("Metric","Indicateur"),trend:w("Trend","Tendance"),change:w("Change","\xC9volution"),stats:w("Key figures","Chiffres cl\xE9s"),noValue:w("No data","Aucune donn\xE9e")}),CALENDAR_WORDS=Object.freeze({month:w("Month","Mois"),week:w("Week","Semaine"),agenda:w("Agenda","Agenda"),view:w("Calendar range","P\xE9riode du calendrier"),items:w("Items by date","\xC9l\xE9ments par date"),today:w("Today","Aujourd\u2019hui"),tomorrow:w("Tomorrow","Demain"),yesterday:w("Yesterday","Hier"),prevMonth:w("Previous month","Mois pr\xE9c\xE9dent"),nextMonth:w("Next month","Mois suivant"),prevWeek:w("Previous week","Semaine pr\xE9c\xE9dente"),nextWeek:w("Next week","Semaine suivante"),prevAgenda:w("Previous three weeks","Trois semaines pr\xE9c\xE9dentes"),nextAgenda:w("Next three weeks","Trois semaines suivantes"),agendaEmpty:w("Nothing planned in these three weeks.","Rien de pr\xE9vu sur ces trois semaines."),agendaToday:w("Nothing planned today","Rien de pr\xE9vu aujourd\u2019hui"),more:w("+{n} more","+{n} autres"),less:w("Show less","Afficher moins"),moreShort:w("+{n}","+{n}"),lessShort:w("Less","Moins"),noDate:w("No date","Sans date"),trayShow:w("Show items with no date","Afficher les \xE9l\xE9ments sans date"),trayHide:w("Hide items with no date","Masquer les \xE9l\xE9ments sans date"),keyToday:w("Go to today","Aller \xE0 aujourd\u2019hui"),keyPrev:w("Previous month or week","Mois ou semaine d\u2019avant"),keyNext:w("Next month or week","Mois ou semaine d\u2019apr\xE8s"),keyNextItem:w("Next item","\xC9l\xE9ment suivant"),keyPrevItem:w("Previous item","\xC9l\xE9ment pr\xE9c\xE9dent"),keyNextDay:w("Next day with items","Jour suivant avec des \xE9l\xE9ments"),keyPrevDay:w("Previous day with items","Jour pr\xE9c\xE9dent avec des \xE9l\xE9ments"),keyOpen:w("Open","Ouvrir")}),TIMELINE_WORDS=Object.freeze({zoom:w("Zoom","Zoom"),week:w("Week","Semaine"),month:w("Month","Mois"),quarter:w("Quarter","Trimestre"),today:w("Today","Aujourd\u2019hui"),items:w("Timeline","Frise"),empty:w("Nothing in this period.","Rien sur cette p\xE9riode."),earlier:w("Earlier","Plus t\xF4t"),later:w("Later","Plus tard"),bar:w("{t}, {s}, {a} to {b}","{t}, {s}, du {a} au {b}"),barPlain:w("{t}, {a} to {b}","{t}, du {a} au {b}"),keyToday:w("Go to today","Aller \xE0 aujourd\u2019hui"),keyPrev:w("Earlier","Plus t\xF4t"),keyNext:w("Later","Plus tard"),keyNextItem:w("Next item","\xC9l\xE9ment suivant"),keyPrevItem:w("Previous item","\xC9l\xE9ment pr\xE9c\xE9dent"),keyOpen:w("Open","Ouvrir")});import{useCallback as useCallback15,useEffect as useEffect19,useMemo as useMemo13,useState as useState16}from"react";function readWindowParam(param){if(typeof window>"u")return null;try{return new URLSearchParams(window.location.search).get(param)}catch{return null}}function writeWindowParam(param,value){if(!(typeof window>"u"))try{let url=new URL(window.location.href);value==null?url.searchParams.delete(param):url.searchParams.set(param,value),window.history.replaceState(window.history.state,"",url.toString())}catch{}}function usePeriod(options={}){let param=options.param??"period",defaults=useMemo13(()=>({preset:options.default??"last30",compare:options.compare??"prev"}),[options.default,options.compare]),runtime=useNotisRuntime(),inSpace=runtime?.resource?.kind==="space"&&typeof runtime.navigate=="function",raw=runtime?.context?.params??null,urlValue=inSpace?raw?.[param]??null:null,[local,setLocal]=useState16(()=>inSpace?null:readWindowParam(param)),value=inSpace?urlValue:local,period=useMemo13(()=>parsePeriodParam(value,defaults),[value,defaults]),day=new Date().toDateString(),ranges=useMemo13(()=>periodRanges(period),[period,day]);useEffect19(()=>{if(inSpace||typeof window>"u")return;let onPop=()=>setLocal(readWindowParam(param));return window.addEventListener("popstate",onPop),()=>window.removeEventListener("popstate",onPop)},[inSpace,param]);let set=useCallback15(next=>{let encoded=formatPeriodParam(next,defaults.compare),isDefault=next.preset===defaults.preset&&next.compare===defaults.compare;if(inSpace){writeViewParams(runtime,{[param]:isDefault?null:encoded},{replace:!0}).catch(()=>{});return}setLocal(isDefault?null:encoded),writeWindowParam(param,isDefault?null:encoded)},[defaults,inSpace,param,runtime]);return{period,range:ranges.range,compareRange:ranges.compareRange,set}}import*as React7 from"react";import{addMonths,startOfDay as startOfDay2,startOfMonth as startOfMonth2}from"date-fns";import*as React6 from"react";import{DayPicker as ReactDayPicker}from"react-day-picker";import{enUS}from"react-day-picker/locale/en-US";import{fr}from"react-day-picker/locale/fr";function useDateLocale(override){let runtime=useNotisRuntime(),toolkit=useToolkitLocale();if(override==="en"||override==="fr")return override;let fromRuntime=runtime?.context?.locale;return fromRuntime==="en"||fromRuntime==="fr"?fromRuntime:toolkit}import{jsx as jsx19}from"react/jsx-runtime";var CLASS_NAMES={root:"nui-dp",months:"nui-dp-months",month:"nui-dp-month",month_caption:"nui-dp-caption",caption_label:"nui-dp-caption-label",dropdowns:"nui-dp-dropdowns",dropdown_root:"nui-dp-dropdown-root",dropdown:"nui-dp-dropdown",months_dropdown:"nui-dp-months-dropdown",years_dropdown:"nui-dp-years-dropdown",nav:"nui-dp-nav",button_previous:"nui-dp-nav-btn",button_next:"nui-dp-nav-btn",chevron:"nui-dp-chevron",month_grid:"nui-dp-grid",weekdays:"nui-dp-weekdays",weekday:"nui-dp-weekday",week:"nui-dp-week",day:"nui-dp-day",day_button:"nui-dp-day-btn",selected:"nui-dp-selected",range_start:"nui-dp-range-start",range_middle:"nui-dp-range-middle",range_end:"nui-dp-range-end",today:"nui-dp-today",outside:"nui-dp-outside",disabled:"nui-dp-disabled",hidden:"nui-dp-hidden",focused:"nui-dp-focused",footer:"nui-dp-footer"};function Chevron({orientation="left",className}){return jsx19("svg",{className,viewBox:"0 0 16 16",width:"16",height:"16","aria-hidden":"true",focusable:"false",children:jsx19("path",{d:orientation==="left"?"M10 3.5 5.5 8l4.5 4.5":orientation==="right"?"M6 3.5 10.5 8 6 12.5":orientation==="up"?"M3.5 10 8 5.5l4.5 4.5":"M3.5 6 8 10.5 12.5 6",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function joinClass(...parts){return parts.filter(Boolean).join(" ")}function DayPicker({className,classNames,components,formatters,showOutsideDays=!0,locale,...props}){let toolkitLocale=useDateLocale(typeof locale=="string"?locale:void 0),rdpLocale=typeof locale=="object"&&locale?locale:toolkitLocale==="fr"?fr:enUS,narrow=React6.useMemo(()=>weekdayNames(toolkitLocale,"narrow"),[toolkitLocale]),ownLocale=!(typeof locale=="object"&&locale),merged={...CLASS_NAMES};if(classNames)for(let[key,value]of Object.entries(classNames))merged[key]=joinClass(CLASS_NAMES[key],value);return jsx19(ReactDayPicker,{"data-notis-ui":"",weekStartsOn:1,showOutsideDays,...props,locale:rdpLocale,className:joinClass("nui-dp-root",className),classNames:merged,formatters:ownLocale?{formatWeekdayName:day=>narrow[(day.getDay()+6)%7],...formatters}:formatters,components:{Chevron,...components}})}DayPicker.displayName="DayPicker";import{jsx as jsx20,jsxs as jsxs16}from"react/jsx-runtime";var STROKE={fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"};function Glyph({className,children}){return jsx20("svg",{className:className?`nui-icon ${className}`:"nui-icon",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children})}function CaretLeftGlyph({className}){return jsx20(Glyph,{className,children:jsx20("path",{...STROKE,d:"M10 4L6 8l4 4"})})}function CaretRightGlyph({className}){return jsx20(Glyph,{className,children:jsx20("path",{...STROKE,d:"M6 4l4 4-4 4"})})}function CaretDownGlyph({className}){return jsx20(Glyph,{className,children:jsx20("path",{...STROKE,d:"M4 6l4 4 4-4"})})}function CheckGlyph({className}){return jsx20(Glyph,{className,children:jsx20("path",{...STROKE,d:"M3 8.5l3 3 7-7"})})}function CalendarGlyph({className}){return jsx20(Glyph,{className,children:jsxs16("g",{...STROKE,children:[jsx20("rect",{x:"2.5",y:"3.5",width:"11",height:"10",rx:"1.25"}),jsx20("path",{d:"M2.5 6.5h11M5.5 2v2.5M10.5 2v2.5"})]})})}function TrayGlyph({className}){return jsx20(Glyph,{className,children:jsxs16("g",{...STROKE,children:[jsx20("rect",{x:"2.5",y:"2.5",width:"11",height:"11",rx:"1.25"}),jsx20("path",{d:"M2.5 9.5h3l1 1.5h3l1-1.5h3"})]})})}import{jsx as jsx21,jsxs as jsxs17}from"react/jsx-runtime";var PERIOD_PICKER_TWO_MONTHS_MIN=700;function onListKeyDown(event){if(!["ArrowDown","ArrowUp","Home","End"].includes(event.key))return;let options=Array.from(event.currentTarget.querySelectorAll('[role="option"]'));if(!options.length)return;let index=options.findIndex(el=>el===event.target||el.contains(event.target)),next=event.key==="Home"?0:event.key==="End"?options.length-1:event.key==="ArrowDown"?(index+1)%options.length:(index-1+options.length)%options.length;event.preventDefault(),options[next]?.focus()}function focusSoon(panel,selector){requestAnimationFrame(()=>panel()?.querySelector(selector)?.focus({preventScroll:!0}))}function pageWidth(from){return typeof document>"u"?1200:(from?.closest("[data-notis-app-root]")??document.documentElement).clientWidth||(typeof window<"u"?window.innerWidth:1200)}function PeriodPicker({value,onChange,compare=!0,presets=PRESETS,locale:localeProp,className}){let locale=useDateLocale(localeProp),t=words=>pick(words,locale),barRef=React7.useRef(null),rangePanel=React7.useRef(null),cmpPanel=React7.useRef(null),[pop,setPop]=React7.useState(null),[draft,setDraft]=React7.useState(null),[two,setTwo]=React7.useState(!0),[month,setMonth]=React7.useState(()=>startOfMonth2(new Date)),today=startOfDay2(new Date),custom=presets.includes("custom"),{range,compareRange:cmpRange}=periodRanges(value),months=two?2:1,openRange=open=>{if(setDraft(null),open){let wide=pageWidth(barRef.current)>=PERIOD_PICKER_TWO_MONTHS_MIN;setTwo(wide),setMonth(startOfMonth2(addMonths(range.to,wide?-1:0))),focusSoon(()=>rangePanel.current,'[role="option"][aria-selected="true"]')}setPop(open?"range":null)},pickPreset=(preset,close)=>{if(preset==="custom"){setDraft(null),focusSoon(()=>rangePanel.current,".nui-dp-range-end .nui-dp-day-btn, .nui-dp-selected .nui-dp-day-btn, .nui-dp-day-btn");return}onChange({preset,compare:value.compare}),close()},onDayClick=day=>{let d=startOfDay2(day);setDraft(current=>!current||current.b?{a:d,b:null}:d<current.a?{a:d,b:current.a}:{a:current.a,b:d})},apply=close=>{draft?.b&&(onChange(customPeriod(draft.a,draft.b,value.compare)),close())},selected=draft?{from:draft.a,to:draft.b??void 0}:{from:range.from,to:range.to},hint=draft?draft.b?formatDateRange({from:draft.a,to:draft.b},locale):t(PERIOD_WORDS.pickEnd):t(PERIOD_WORDS.pickStart),rangeTrigger=jsxs17("button",{type:"button",className:"nui-pp-trigger","data-pp-open":"range",children:[jsx21(CalendarGlyph,{className:"nui-pp-glyph"}),jsx21("span",{className:"nui-pp-name",children:t(PRESET_WORDS[value.preset])}),jsx21("span",{className:"nui-pp-dates",children:formatDateRange(range,locale)}),jsx21(CaretDownGlyph,{className:"nui-pp-caret"})]}),cmpTrigger=jsxs17("button",{type:"button",className:"nui-pp-trigger","data-pp-open":"cmp",children:[jsx21("span",{className:"nui-pp-muted",children:t(PERIOD_WORDS.compare)}),jsx21("span",{className:"nui-pp-name",children:t(COMPARE_WORDS[value.compare])}),jsx21(CaretDownGlyph,{className:"nui-pp-caret"})]});return jsxs17("div",{ref:barRef,className:cx("nui-pp",className),"data-notis-ui":"",children:[jsx21(Popover,{trigger:rangeTrigger,open:pop==="range",onOpenChange:openRange,label:PERIOD_WORDS.range,className:"nui-pp-pop",autoFocus:!1,content:({close})=>jsxs17("div",{ref:rangePanel,className:"nui-pp-panel","data-one":custom&&!two?"":void 0,children:[jsx21("div",{className:"nui-pp-presets",role:"listbox","aria-label":t(PERIOD_WORDS.range),onKeyDown:onListKeyDown,children:presets.map(preset=>{let on=preset===value.preset;return jsxs17("button",{type:"button",role:"option",className:"nui-pp-opt","data-pp-preset":preset,"aria-selected":on,tabIndex:on?0:-1,onClick:()=>pickPreset(preset,close),children:[jsx21("span",{className:"nui-pp-opt-text",children:t(PRESET_WORDS[preset])}),on&&jsx21(CheckGlyph,{className:"nui-pp-check"})]},preset)})}),custom&&jsxs17("div",{className:"nui-pp-cal",children:[jsx21(DayPicker,{mode:"range",locale,numberOfMonths:months,month,onMonthChange:setMonth,endMonth:startOfMonth2(today),disabled:{after:today},selected,onSelect:()=>{},onDayClick,labels:{labelPrevious:()=>t(PERIOD_WORDS.prevMonth),labelNext:()=>t(PERIOD_WORDS.nextMonth)}}),jsxs17("div",{className:"nui-pp-foot",children:[jsx21("span",{className:"nui-pp-hint","aria-live":"polite",children:hint}),jsx21("span",{className:"nui-pp-grow"}),jsx21("button",{type:"button",className:"nui-pp-btn",onClick:close,children:t(PERIOD_WORDS.cancel)}),jsx21("button",{type:"button",className:"nui-pp-btn nui-pp-primary",disabled:!draft?.b,onClick:()=>apply(close),children:t(PERIOD_WORDS.apply)})]})]})]})}),compare&&jsx21(Popover,{trigger:cmpTrigger,open:pop==="cmp",onOpenChange:open=>{setPop(open?"cmp":null),open&&focusSoon(()=>cmpPanel.current,'[aria-selected="true"]')},label:PERIOD_WORDS.compare,className:"nui-pp-pop nui-pp-pop-cmp",autoFocus:!1,content:({close})=>jsx21("div",{ref:cmpPanel,className:"nui-pp-presets",role:"listbox","aria-label":t(PERIOD_WORDS.compare),onKeyDown:onListKeyDown,children:COMPARES.map(id=>{let on=id===value.compare,r=id==="none"?null:id===value.compare?cmpRange:compareRange(range,id);return jsxs17("button",{type:"button",role:"option",className:"nui-pp-opt nui-pp-opt-2","data-pp-cmp":id,"aria-selected":on,tabIndex:on?0:-1,onClick:()=>{onChange({...value,compare:id}),close()},children:[jsxs17("span",{className:"nui-pp-opt-text",children:[jsx21("span",{className:"nui-pp-opt-name",children:t(COMPARE_WORDS[id])}),r&&jsx21("span",{className:"nui-pp-opt-dates",children:formatDateRange(r,locale)})]}),on&&jsx21(CheckGlyph,{className:"nui-pp-check"})]},id)})})})]})}PeriodPicker.displayName="PeriodPicker";import*as React8 from"react";import{startOfDay as startOfDay4}from"date-fns";import{addDays as addDays2,addMonths as addMonths2,differenceInCalendarDays as differenceInCalendarDays2,getDaysInMonth,isValid as isValid2,startOfDay as startOfDay3,startOfMonth as startOfMonth3}from"date-fns";var CALENDAR_VIEWS=Object.freeze(["month","week","agenda"]),AGENDA_DAYS=21,MONTH_CHIPS=3,MAX_SPAN_DAYS=62;function toDay(value){if(value==null||value==="")return null;if(typeof value=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(value)){let[y,m,d]=value.split("-").map(Number),day=new Date(y,m-1,d);return day.getMonth()===m-1?day:null}let date=value instanceof Date?value:new Date(value);return isValid2(date)?startOfDay3(date):null}var dayKey=toIsoDay;function weekStart(date){let day=startOfDay3(date);return addDays2(day,-((day.getDay()+6)%7))}function isWeekend(date){let d=date.getDay();return d===0||d===6}function viewStart(view,offset,today){return view==="month"?startOfMonth3(addMonths2(startOfDay3(today),offset)):addDays2(weekStart(today),7*offset)}function offsetStep(view){return view==="agenda"?3:1}function monthGrid(monthDate){let month=startOfMonth3(monthDate),lead=(month.getDay()+6)%7,rows=Math.ceil((lead+getDaysInMonth(month))/7),start=addDays2(month,-lead);return{month,rows,days:Array.from({length:rows*7},(_,i)=>addDays2(start,i))}}function weekDays(start){let first=weekStart(start);return Array.from({length:7},(_,i)=>addDays2(first,i))}function visibleDays(view,offset,today){let start=viewStart(view,offset,today);return view==="month"?monthGrid(start).days:view==="week"?weekDays(start):Array.from({length:AGENDA_DAYS},(_,i)=>addDays2(start,i))}function bucketByDay(items2,getDate,getEnd){let byDay=new Map,none=[],push=(key,item)=>{let list=byDay.get(key);list?list.push(item):byDay.set(key,[item])};for(let item of items2){let start=toDay(getDate(item));if(!start){none.push(item);continue}let end=getEnd?toDay(getEnd(item)):null,span=end?Math.min(MAX_SPAN_DAYS,Math.max(1,differenceInCalendarDays2(end,start)+1)):1;for(let i=0;i<span;i++)push(dayKey(addDays2(start,i)),item)}return{byDay,none}}function shownChips(items2,expanded,limit=MONTH_CHIPS){let shown=items2.length>limit&&!expanded?items2.slice(0,limit-1):items2.slice();return{shown,more:items2.length-shown.length}}function agendaDays(days,byDay,today){let todayKey=dayKey(today);return days.filter(d=>(byDay.get(dayKey(d))?.length??0)>0||dayKey(d)===todayKey)}function navOrder(options){let{view,byDay,getId}=options,days=view==="agenda"?agendaDays(options.days,byDay,options.today):options.days,seen=new Set,out=[];for(let d of days){let key=dayKey(d),items2=byDay.get(key)??[],shown=view==="month"?shownChips(items2,options.expandedDay===key).shown:items2;for(let item of shown){let id=getId(item);seen.has(id)||(seen.add(id),out.push({id,day:key}))}}for(let item of options.none??[]){let id=getId(item);seen.has(id)||(seen.add(id),out.push({id,day:null}))}return out}function stepDay(order,cursor,delta){let dated=order.filter(e=>e.day!=null);if(!dated.length)return null;let days=[];for(let e of dated)days[days.length-1]!==e.day&&days.push(e.day);let current=cursor==null?void 0:order.find(e=>e.id===cursor),at=current?.day==null?-1:days.indexOf(current.day),target=at===-1?delta>0?days[0]:days[days.length-1]:days[Math.max(0,Math.min(days.length-1,at+delta))];return dated.find(e=>e.day===target)?.id??null}function todayCursor(order,today){let key=dayKey(today),dated=order.filter(e=>e.day!=null);return dated.find(e=>e.day>=key)?.id??dated[dated.length-1]?.id??null}function settleCursor(order,cursor){return cursor!=null&&order.some(e=>e.id===cursor)?cursor:order[0]?.id??null}import{jsx as jsx22,jsxs as jsxs18}from"react/jsx-runtime";var CALENDAR_NARROW_MAX=640,CALENDAR_TRAY_SIDE_MIN=900;function defaultId(item){let id=item?.id;return id==null?"":String(id)}function defaultTitle(item){let record=item;return String(record?.title??record?.name??"")}function CalendarView(props){let{items:items2,getDate,getEnd,getId=defaultId,getTitle=defaultTitle,row,views=CALENDAR_VIEWS,onOpen,openId=null,tray=!0,label,className}=props,locale=useDateLocale(props.locale),t=words=>pick(words,locale),rootRef=React8.useRef(null),width=useElementWidth(rootRef),narrow=width<CALENDAR_NARROW_MAX,trayBelow=width<CALENDAR_TRAY_SIDE_MIN,[innerView,setInnerView]=React8.useState(props.defaultView??views[0]??"month"),view=props.view??innerView,setView=next=>{props.view===void 0&&setInnerView(next),props.onViewChange?.(next)},[offset,setOffset]=React8.useState(0),[cursor,setCursor]=React8.useState(null),[expandedDay,setExpandedDay]=React8.useState(null),[trayOpen,setTrayOpen]=React8.useState(!0),today=startOfDay4(props.today??new Date),todayKey=dayKey(today),{byDay,none}=React8.useMemo(()=>bucketByDay(items2,getDate,getEnd),[items2,getDate,getEnd]),byId=React8.useMemo(()=>new Map(items2.map(item=>[getId(item),item])),[items2,getId]),trayShown=tray&&none.length>0&&trayOpen,orderFor=(at,expanded)=>navOrder({view,days:visibleDays(view,at,today),byDay,none:trayShown?none:[],getId,expandedDay:expanded,today}),order=orderFor(offset,expandedDay),orderIds=order.map(e=>e.id),orderKey=orderIds.join(`
8
+ `);React8.useEffect(()=>{if(cursor===null)return;let next=settleCursor(order,cursor);next!==cursor&&setCursor(next)},[orderKey]);let focusTo=useCursorFocus(rootRef,cursor),keepFocus=useKeepFocusInside(rootRef),latest=useLatest({cursor,offset,view,expandedDay,order,onOpen,byId}),move=id=>id===null?!1:(focusTo(id,latest.current.cursor),setCursor(id),!0),live=()=>isVisibleComposed(rootRef.current),stepLive=()=>live()&&focusInside(rootRef.current),hasItems=()=>live()&&latest.current.order.length>0,step=delta=>()=>{keepFocus();let{offset:at,view:v,cursor:current}=latest.current,next=at+delta*offsetStep(v);setOffset(next),setExpandedDay(null);let settled=current===null?null:settleCursor(orderFor(next,null),current);return settled!==null?move(settled):setCursor(null),!0},defs=[keymapDef("period.prev",CALENDAR_WORDS.keyPrev,stepLive,step(-1)),keymapDef("period.next",CALENDAR_WORDS.keyNext,stepLive,step(1)),keymapDef("period.today",CALENDAR_WORDS.keyToday,live,()=>{keepFocus(),setOffset(0),setExpandedDay(null);let target=todayCursor(orderFor(0,null),today);return target===null?setCursor(null):move(target),!0}),keymapDef("list.next",CALENDAR_WORDS.keyNextItem,hasItems,event=>move(stepCursor(latest.current.order.map(e=>e.id),latest.current.cursor,1,{repeat:event.repeat}))),keymapDef("list.prev",CALENDAR_WORDS.keyPrevItem,hasItems,event=>move(stepCursor(latest.current.order.map(e=>e.id),latest.current.cursor,-1,{repeat:event.repeat}))),{id:"calendar.nextDay",keys:["arrowright"],scope:"collection",label:CALENDAR_WORDS.keyNextDay,repeat:!0,when:()=>hasItems()&&focusFreeFor(rootRef.current),run:()=>move(stepDay(latest.current.order,latest.current.cursor,1))},{id:"calendar.prevDay",keys:["arrowleft"],scope:"collection",label:CALENDAR_WORDS.keyPrevDay,repeat:!0,when:()=>hasItems()&&focusFreeFor(rootRef.current),run:()=>move(stepDay(latest.current.order,latest.current.cursor,-1))},keymapDef("list.open",CALENDAR_WORDS.keyOpen,hasItems,()=>{let{cursor:current,byId:map,onOpen:open}=latest.current,item=current===null?void 0:map.get(current);return!item||!open?!1:(open(item),!0)})];useShortcuts(defs,[locale]);let roving=cursor!==null&&orderIds.includes(cursor)?cursor:orderIds[0]??null,tabbed=new Set,chip=(item,variant)=>{let id=getId(item),first=!tabbed.has(id);tabbed.add(id);let title2=getTitle(item);return jsx22("div",{role:"option",className:"nui-cal-chip","data-variant":variant,"data-nav-id":id,"aria-selected":id===openId,"aria-label":variant==="dot"?title2:void 0,tabIndex:first&&id===roving?0:-1,"data-cursor":flag(id===cursor),"data-open":flag(id===openId),onFocus:()=>setCursor(id),onClick:()=>{setCursor(id),onOpen?.(item)},children:variant==="dot"?jsx22("span",{className:"nui-cal-dot","aria-hidden":"true"}):row?row(item,variant):jsx22("span",{className:"nui-cal-chip-text",children:title2})},id)},dayLabel=d=>dayKey(d)===todayKey?`${formatLongDay(d,locale)}, ${t(CALENDAR_WORDS.today)}`:formatLongDay(d,locale),start=viewStart(view,offset,today),days=visibleDays(view,offset,today),title=view==="month"?formatMonthYear(start,locale):formatDateRange({from:days[0],to:days[days.length-1]},locale),prevWords=view==="month"?CALENDAR_WORDS.prevMonth:view==="week"?CALENDAR_WORDS.prevWeek:CALENDAR_WORDS.prevAgenda,nextWords=view==="month"?CALENDAR_WORDS.nextMonth:view==="week"?CALENDAR_WORDS.nextWeek:CALENDAR_WORDS.nextAgenda,weekdays=weekdayNames(locale,narrow?"narrow":"short"),grid;if(view==="month"){let{month,rows}=monthGrid(start),expandedRow=expandedDay===null?-1:Math.floor(days.findIndex(d=>dayKey(d)===expandedDay)/7),rowSizes=Array.from({length:rows},(_,r)=>r===expandedRow?"minmax(min-content, 1fr)":"minmax(100px, 1fr)");grid=jsxs18("div",{className:"nui-cal-grid","data-view":"month",style:{gridTemplateRows:`30px ${rowSizes.join(" ")}`},children:[weekdays.map((name,i)=>jsx22("div",{className:"nui-cal-wd","aria-hidden":"true",children:name},i)),days.map(d=>{let key=dayKey(d),list=byDay.get(key)??[],expanded=expandedDay===key,{shown,more}=shownChips(list,expanded);return jsxs18("div",{role:"group",className:"nui-cal-day","aria-label":dayLabel(d),"data-outside":flag(d.getMonth()!==month.getMonth()),"data-today":flag(key===todayKey),"data-weekend":flag(isWeekend(d)),children:[jsx22("span",{className:"nui-cal-num","aria-hidden":"true",children:dayNumberLabel(d,locale,narrow)}),jsx22("div",{className:"nui-cal-chips","data-dots":flag(narrow),children:shown.map(item=>chip(item,narrow?"dot":"chip"))}),(more>0||expanded&&list.length>shownChips(list,!1).shown.length)&&jsx22("button",{type:"button",className:"nui-cal-more","aria-expanded":expanded,"aria-label":narrow?t(expanded?CALENDAR_WORDS.less:fillWords(CALENDAR_WORDS.more,{n:more})):void 0,onClick:()=>setExpandedDay(expanded?null:key),children:t(expanded?narrow?CALENDAR_WORDS.lessShort:CALENDAR_WORDS.less:fillWords(narrow?CALENDAR_WORDS.moreShort:CALENDAR_WORDS.more,{n:more}))})]},key)})]})}else if(view==="week")grid=jsx22("div",{className:"nui-cal-grid","data-view":"week","data-stacked":flag(narrow),children:days.map((d,i)=>{let key=dayKey(d),list=byDay.get(key)??[];return jsxs18("div",{role:"group",className:"nui-cal-wday","aria-label":dayLabel(d),"data-today":flag(key===todayKey),"data-weekend":flag(isWeekend(d)),children:[jsxs18("div",{className:"nui-cal-wdh","aria-hidden":"true",children:[jsx22("span",{className:"nui-cal-wdh-name",children:weekdays[i]}),jsx22("span",{className:"nui-cal-num",children:d.getDate()})]}),jsx22("div",{className:"nui-cal-cards",children:list.map(item=>chip(item,"card"))})]},key)})});else{let shownDays=agendaDays(days,byDay,today),empty=shownDays.every(d=>(byDay.get(dayKey(d))?.length??0)===0),lastMonth=-1;grid=jsxs18("div",{className:"nui-cal-agenda",children:[shownDays.map(d=>{let key=dayKey(d),list=byDay.get(key)??[],heading=d.getMonth()!==lastMonth;return lastMonth=d.getMonth(),jsxs18(React8.Fragment,{children:[heading&&jsx22("div",{className:"nui-cal-amonth","aria-hidden":"true",children:formatMonthYear(d,locale)}),jsxs18("div",{role:"group",className:"nui-cal-aday","aria-label":dayLabel(d),"data-today":flag(key===todayKey),"data-past":flag(key<todayKey),children:[jsxs18("div",{className:"nui-cal-adate","aria-hidden":"true",children:[jsx22("span",{className:"nui-cal-awd",children:weekdayNames(locale,"short")[(d.getDay()+6)%7]}),jsx22("span",{className:"nui-cal-anum",children:d.getDate()})]}),jsx22("div",{className:"nui-cal-arows",children:list.length?list.map(item=>chip(item,"row")):jsx22("div",{className:"nui-cal-aempty",children:t(CALENDAR_WORDS.agendaToday)})})]})]},key)}),empty&&jsx22("div",{className:"nui-cal-aempty","data-all":"",children:t(CALENDAR_WORDS.agendaEmpty)})]})}return jsxs18("div",{ref:rootRef,className:cx("nui-cal",className),"data-notis-ui":"","data-view":view,"data-narrow":flag(narrow),tabIndex:-1,children:[jsxs18("div",{className:"nui-cal-head",children:[jsx22("h2",{className:"nui-cal-title","aria-live":"polite",children:title}),views.length>1&&jsx22("div",{className:"nui-cal-views",role:"group","aria-label":t(CALENDAR_WORDS.view),children:views.map(v=>jsx22("button",{type:"button",className:"nui-cal-btn","aria-pressed":v===view,onClick:()=>{setView(v),setExpandedDay(null)},children:t(CALENDAR_WORDS[v])},v))}),jsxs18("div",{className:"nui-cal-tools",children:[jsx22("button",{type:"button",className:"nui-cal-btn","data-cal-today":"",onClick:()=>{setOffset(0),setExpandedDay(null)},children:t(CALENDAR_WORDS.today)}),jsx22("button",{type:"button",className:"nui-cal-nav","aria-label":t(prevWords),onClick:()=>setOffset(o=>o-offsetStep(view)),children:jsx22(CaretLeftGlyph,{})}),jsx22("button",{type:"button",className:"nui-cal-nav","aria-label":t(nextWords),onClick:()=>setOffset(o=>o+offsetStep(view)),children:jsx22(CaretRightGlyph,{})}),tray&&none.length>0&&jsxs18("button",{type:"button",className:"nui-cal-btn","data-cal-tray":"","aria-expanded":trayOpen,"aria-label":t(trayOpen?CALENDAR_WORDS.trayHide:CALENDAR_WORDS.trayShow),onClick:()=>setTrayOpen(open=>!open),children:[jsx22(TrayGlyph,{}),jsx22("span",{className:"nui-cal-tray-word",children:t(CALENDAR_WORDS.noDate)}),jsx22("span",{className:"nui-cal-count",children:none.length})]})]})]}),jsx22("div",{className:"nui-cal-body","data-tray":trayShown?trayBelow?"below":"side":void 0,children:jsxs18("div",{className:"nui-cal-main",role:"listbox","aria-label":t(label??CALENDAR_WORDS.items),"data-notis-engine-list":"",children:[grid,trayShown&&jsxs18("div",{className:"nui-cal-tray",role:"group","aria-label":t(CALENDAR_WORDS.noDate),children:[jsxs18("div",{className:"nui-cal-tray-head","aria-hidden":"true",children:[jsx22("span",{children:t(CALENDAR_WORDS.noDate)}),jsx22("span",{className:"nui-cal-count",children:none.length})]}),jsx22("div",{className:"nui-cal-tray-list",children:none.map(item=>chip(item,"card"))})]})]})})]})}CalendarView.displayName="CalendarView";import{addDays as addDays3,differenceInCalendarDays as differenceInCalendarDays3,startOfDay as startOfDay5}from"date-fns";var TIMELINE_ZOOMS=Object.freeze(["week","month","quarter"]),TIMELINE_ZOOM=Object.freeze({week:{from:-7,span:35,px:40},month:{from:-14,span:98,px:14},quarter:{from:-30,span:210,px:6}}),TIMELINE_STEP=Object.freeze({week:7,month:28,quarter:91}),TIMELINE_ROW_H=36,TIMELINE_BAR_TOP=6,TIMELINE_TRACK_PAD=12,TIMELINE_MIN_VISIBLE_DAYS=4,TIMELINE_TODAY_GAP=.045;function timelineWindow(zoom,offset=0){let z=TIMELINE_ZOOM[zoom];return{zoom,from:z.from+offset*TIMELINE_STEP[zoom],span:z.span,px:z.px}}function timelineMinWidth(win){return`calc(9rem + ${win.span*win.px}px)`}function dayIndex(date,today){return differenceInCalendarDays3(startOfDay5(date),startOfDay5(today))}function itemSpan(start,end,today){let a=toDay(start);if(!a)return null;let b=toDay(end),s=dayIndex(a,today),last=b?dayIndex(b,today):s;return{s,e:Math.max(s,last)+1}}function barVisibleDays(span,win){return Math.min(span.e,win.from+win.span)-Math.max(span.s,win.from)}function inView(span,win){let visible=barVisibleDays(span,win);return visible<=0?!1:visible>=Math.min(TIMELINE_MIN_VISIBLE_DAYS,span.e-span.s)}function packRows(bars){let ends=[];return{bars:bars.map((bar,i)=>({bar,i})).sort((x,y)=>x.bar.span.s-y.bar.span.s||x.i-y.i).map(({bar})=>{let lastDay=bar.span.e-1,row=ends.findIndex(end=>end<bar.span.s);return row<0?(row=ends.length,ends.push(lastDay)):ends[row]=lastDay,{...bar,row}}),rows:Math.max(1,ends.length)}}var round=v=>Math.round(v*1e3)/1e3;function barGeometry(span,win,row){let a=Math.max(span.s,win.from),b=Math.min(span.e,win.from+win.span);return{left:round((a-win.from)/win.span*100),width:round(Math.max(0,b-a)/win.span*100),top:row*TIMELINE_ROW_H+TIMELINE_BAR_TOP,cutLeft:span.s<win.from,cutRight:span.e>win.from+win.span}}function trackHeight(rows){return Math.max(1,rows)*TIMELINE_ROW_H+TIMELINE_TRACK_PAD}function dayPercent(day,win){return round((day-win.from)/win.span*100)}function todayInWindow(win){return win.from<=0&&0<win.from+win.span}function timelineTicks(win,today,locale){let out=[],monthFmt=dateFormat(locale,{month:"short"});for(let d=win.from;d<win.from+win.span;d++){let date=addDays3(startOfDay5(today),d);(win.zoom==="quarter"?date.getDate()===1:date.getDay()===1)&&out.push({day:d,date,label:win.zoom==="quarter"?upFirst(monthFmt.format(date)):formatShortDay(date,locale),percent:dayPercent(d,win),showLabel:!todayInWindow(win)||Math.abs(d/win.span)>TIMELINE_TODAY_GAP})}return out}function layoutTimeline(input){let groups=new Map;for(let info of input.lanes??[])groups.set(info.id,{info,bars:[]});let undated=[];for(let item of input.items){let span=itemSpan(input.getStart(item),input.getEnd(item),input.today);if(!span){undated.push(item);continue}if(!inView(span,input.win))continue;let info=input.lane(item),group=groups.get(info.id);group||(group={info,bars:[]},groups.set(info.id,group)),group.bars.push({item,id:input.getId(item),span})}let lanes=[],order=[];for(let{info,bars}of groups.values()){let packed=packRows(bars),laid=packed.bars.map(bar=>({...bar,geometry:barGeometry(bar.span,input.win,bar.row)}));for(let bar of laid)order.push(bar.id);lanes.push({...info,bars:laid,rows:packed.rows,height:trackHeight(packed.rows),count:laid.length})}return{lanes,order,undated}}function timelineTodayCursor(lanes){let bars=lanes.flatMap(lane=>lane.bars),running=bars.find(b=>b.span.s<=0&&0<b.span.e);return running?running.id:bars.filter(b=>b.span.s>0).sort((a,b)=>a.span.s-b.span.s)[0]?.id??bars[bars.length-1]?.id??null}import*as React9 from"react";import{startOfDay as startOfDay6}from"date-fns";import{jsx as jsx23,jsxs as jsxs19}from"react/jsx-runtime";function defaultId2(item){let id=item?.id;return id==null?"":String(id)}function defaultTitle2(item){let record=item;return String(record?.title??record?.name??"")}function TimelineView(props){let{items:items2,getStart,getEnd,lane,lanes:laneOrder,getId=defaultId2,getTitle=defaultTitle2,getStatus,getGroup,bar,onOpen,openId=null,label,className}=props,locale=useDateLocale(props.locale),t=words=>pick(words,locale),uid=useStableId("nui-tl"),rootRef=React9.useRef(null),scrollRef=React9.useRef(null),[innerZoom,setInnerZoom]=React9.useState(props.defaultZoom??"month"),zoom=props.zoom??innerZoom,setZoom=next=>{props.zoom===void 0&&setInnerZoom(next),props.onZoomChange?.(next)},[offset,setOffset]=React9.useState(0),[cursor,setCursor]=React9.useState(null),today=startOfDay6(props.today??new Date),layoutFor=(at,z=zoom)=>layoutTimeline({items:items2,getId,getStart,getEnd,lane,lanes:laneOrder,win:timelineWindow(z,at),today}),win=timelineWindow(zoom,offset),{lanes,order}=layoutFor(offset),byId=React9.useMemo(()=>new Map(items2.map(item=>[getId(item),item])),[items2,getId]),orderKey=order.join(`
9
+ `);React9.useEffect(()=>{cursor!==null&&!order.includes(cursor)&&setCursor(order[0]??null)},[orderKey]),React9.useEffect(()=>{let el=scrollRef.current;if(!el||el.scrollWidth<=el.clientWidth)return;let x=((todayInWindow(win)?0:win.from)-win.from)/win.span*(el.scrollWidth-el.clientWidth);el.scrollLeft=Math.max(0,x-el.clientWidth/4)},[zoom,offset]);let focusTo=useCursorFocus(rootRef,cursor),keepFocus=useKeepFocusInside(rootRef),latest=useLatest({cursor,offset,zoom,order,byId,onOpen}),move=id=>id===null?!1:(focusTo(id,latest.current.cursor),setCursor(id),!0),live=()=>isVisibleComposed(rootRef.current),stepLive=()=>live()&&focusInside(rootRef.current),hasBars=()=>live()&&latest.current.order.length>0,step=delta=>()=>(keepFocus(),setOffset(latest.current.offset+delta),!0),defs=[keymapDef("period.prev",TIMELINE_WORDS.keyPrev,stepLive,step(-1)),keymapDef("period.next",TIMELINE_WORDS.keyNext,stepLive,step(1)),keymapDef("period.today",TIMELINE_WORDS.keyToday,live,()=>{keepFocus(),setOffset(0);let target=timelineTodayCursor(layoutFor(0,latest.current.zoom).lanes);return target===null?setCursor(null):move(target),!0}),keymapDef("list.next",TIMELINE_WORDS.keyNextItem,hasBars,event=>move(stepCursor(latest.current.order,latest.current.cursor,1,{repeat:event.repeat}))),keymapDef("list.prev",TIMELINE_WORDS.keyPrevItem,hasBars,event=>move(stepCursor(latest.current.order,latest.current.cursor,-1,{repeat:event.repeat}))),keymapDef("list.open",TIMELINE_WORDS.keyOpen,hasBars,()=>{let{cursor:current,byId:map,onOpen:open}=latest.current,item=current===null?void 0:map.get(current);return!item||!open?!1:(open(item),!0)})];useShortcuts(defs,[locale]);let ticks=timelineTicks(win,today,locale),showToday=todayInWindow(win),todayLeft=`${dayPercent(0,win)}%`,roving=cursor!==null&&order.includes(cursor)?cursor:order[0]??null,gridLines=ticks.map(tick=>jsx23("span",{className:"nui-tl-grid",style:{left:`${tick.percent}%`}},tick.day));return jsxs19("div",{ref:rootRef,className:cx("nui-tl-view",className),"data-notis-ui":"","data-zoom":zoom,tabIndex:-1,children:[jsxs19("div",{className:"nui-tl-head",children:[jsx23("div",{className:"nui-tl-zooms",role:"group","aria-label":t(TIMELINE_WORDS.zoom),children:TIMELINE_ZOOMS.map(z=>jsx23("button",{type:"button",className:"nui-tl-btn","aria-pressed":z===zoom,onClick:()=>{setZoom(z),setOffset(0)},children:t(TIMELINE_WORDS[z])},z))}),jsx23("span",{className:"nui-tl-grow"}),jsx23("button",{type:"button",className:"nui-tl-btn","data-tl-today":"",onClick:()=>setOffset(0),children:t(TIMELINE_WORDS.today)}),jsx23("button",{type:"button",className:"nui-tl-nav","aria-label":t(TIMELINE_WORDS.earlier),onClick:()=>setOffset(o=>o-1),children:jsx23(CaretLeftGlyph,{})}),jsx23("button",{type:"button",className:"nui-tl-nav","aria-label":t(TIMELINE_WORDS.later),onClick:()=>setOffset(o=>o+1),children:jsx23(CaretRightGlyph,{})})]}),jsx23("div",{ref:scrollRef,className:"nui-tl-scroll",children:jsxs19("div",{className:"nui-tl",style:{minWidth:timelineMinWidth(win)},children:[jsxs19("div",{className:"nui-tl-row nui-tl-axis","aria-hidden":"true",children:[jsx23("div",{className:"nui-tl-lab"}),jsxs19("div",{className:"nui-tl-track",children:[ticks.filter(tick=>tick.showLabel).map(tick=>jsx23("span",{className:"nui-tl-tick",style:{left:`${tick.percent}%`},children:tick.label},tick.day)),showToday&&jsx23("span",{className:"nui-tl-today-chip",style:{left:todayLeft},children:t(TIMELINE_WORDS.today)})]})]}),jsx23("div",{role:"listbox","aria-label":t(label??TIMELINE_WORDS.items),"data-notis-engine-list":"",children:lanes.map((ln,index)=>{let labelId=`${uid}-lane-${index}`;return jsxs19("div",{className:"nui-tl-row nui-tl-lane",role:"group","aria-labelledby":labelId,children:[jsxs19("div",{className:"nui-tl-lab",children:[jsx23("span",{id:labelId,className:"nui-tl-lab-text",children:ln.label}),jsx23("span",{className:"nui-tl-count",children:ln.count})]}),jsxs19("div",{className:"nui-tl-track",style:{height:ln.height},children:[gridLines,showToday&&jsx23("span",{className:"nui-tl-today",style:{left:todayLeft},"aria-hidden":"true"}),ln.bars.map(({item,id,span,geometry})=>{let title=getTitle(item),status=getStatus?.(item),a=formatShortDay(new Date(today.getFullYear(),today.getMonth(),today.getDate()+span.s),locale),b=formatShortDay(new Date(today.getFullYear(),today.getMonth(),today.getDate()+span.e-1),locale),name=t(status?fillWords(TIMELINE_WORDS.bar,{t:title,s:status,a,b}):fillWords(TIMELINE_WORDS.barPlain,{t:title,a,b}));return jsx23("div",{role:"option",className:cx("nui-tl-bar",geometry.cutLeft&&"nui-tl-cut-l",geometry.cutRight&&"nui-tl-cut-r"),"data-nav-id":id,"data-group":getGroup?.(item),"aria-label":name,"aria-selected":id===openId,title,tabIndex:id===roving?0:-1,"data-cursor":flag(id===cursor),"data-open":flag(id===openId),style:{left:`${geometry.left}%`,width:`${geometry.width}%`,top:geometry.top},onFocus:()=>setCursor(id),onClick:()=>{setCursor(id),onOpen?.(item)},children:bar?bar(item):jsx23("span",{className:"nui-tl-bar-t",children:title})},id)})]})]},ln.id)})}),order.length===0&&jsx23("div",{className:"nui-tl-empty",children:t(TIMELINE_WORDS.empty)})]})})]})}TimelineView.displayName="TimelineView";import*as React10 from"react";import{Area,Bar,BarStack,CartesianGrid,Cell,ComposedChart,Line,Rectangle,ResponsiveContainer,Text,Tooltip as Tooltip2,XAxis,YAxis}from"recharts";function labelWords(text){return text.split(/[ \t\n\r\f\v]+/).filter(Boolean)}function wrapLabel(text,fits){let lines=[],line="";for(let word of labelWords(text))line?fits(`${line} ${word}`)?line=`${line} ${word}`:(lines.push(line),line=word):line=word;line&&lines.push(line);let clip=l=>{if(fits(l))return l;let cut=l;for(;cut&&!fits(`${cut}\u2026`);)cut=cut.slice(0,-1);return`${cut.trimEnd()}\u2026`};return(lines.length<=2?lines:[lines[0],lines.slice(1).join(" ")]).map(clip)}function twoLineWidth(text,measure2){let words=labelWords(text);if(words.length<=1)return measure2(words[0]??"");let best=Number.POSITIVE_INFINITY;for(let k=1;k<words.length;k++)best=Math.min(best,Math.max(measure2(words.slice(0,k).join(" ")),measure2(words.slice(k).join(" "))));return best}function axisWidth(categories,chartWidth,measure2){let needed=categories.reduce((most,c)=>Math.max(most,twoLineWidth(c,measure2)),0),cap=Math.max(112,Math.min(196,Math.floor(chartWidth*.4)));return Math.min(cap,Math.max(112,Math.ceil(needed)+16))}function valueMargin(labels,measure2){let widest=labels.reduce((most,l)=>Math.max(most,measure2(l)),0);return Math.max(24,Math.ceil(widest)+5+4)}var LABEL_CHAR=7,canvas;function textWidth(text,family){if(canvas===void 0)try{canvas=typeof document>"u"||/jsdom/.test(globalThis.navigator?.userAgent??"")?null:document.createElement("canvas").getContext("2d")}catch{canvas=null}return canvas?(canvas.font=`12px ${family}`,canvas.measureText(text).width):text.length*LABEL_CHAR}import{addDays as addDays4,addHours,differenceInCalendarDays as differenceInCalendarDays4,endOfDay as endOfDay2,endOfHour,endOfMonth as endOfMonth2,startOfDay as startOfDay7,startOfHour}from"date-fns";function binUnit(range){let n=dayCount(range);return n<=1?"hour":n<=31?"day":n<=186?"week":"month"}function buildBins(range,unit=binUnit(range)){let start=startOfDay7(range.from),end=endOfDay2(range.to),out=[];if(unit==="hour"){for(let h=startOfHour(start);h<=end;h=addHours(h,1))out.push({from:h,to:endOfHour(h)});return out}if(unit==="day"){for(let d=start;d<=end;d=addDays4(d,1))out.push({from:d,to:endOfDay2(d)});return out}if(unit==="week"){for(let d=start;d<=end;d=addDays4(d,7)){let last=endOfDay2(addDays4(d,6));out.push({from:d,to:last<end?last:end})}return out}for(let d=start;d<=end;){let last=endOfMonth2(d);out.push({from:d,to:last<end?last:end}),d=startOfDay7(addDays4(last,1))}return out}function toTime(value){if(value instanceof Date)return value.getTime();if(typeof value=="number")return value;if(/^\d{4}-\d{2}-\d{2}$/.test(value)){let[y,m,d]=value.split("-").map(Number);return new Date(y,m-1,d).getTime()}return new Date(value).getTime()}function aggregate(points,bins,mode="sum"){let sums=bins.map(()=>0),counts=bins.map(()=>0);if(!bins.length)return sums;let starts=bins.map(b=>b.from.getTime()),last=bins[bins.length-1].to.getTime();for(let point of points){let t=toTime(point.date),v=Number(point.value);if(!Number.isFinite(t)||!Number.isFinite(v)||t<starts[0]||t>last)continue;let lo=0,hi=starts.length-1;for(;lo<hi;){let mid=lo+hi+1>>1;starts[mid]<=t?lo=mid:hi=mid-1}sums[lo]+=v,counts[lo]+=1}return mode==="avg"?sums.map((s,i)=>counts[i]?s/counts[i]:0):sums}function binLabel(bin,unit,locale){return unit==="hour"?dateFormat(locale,{hour:"numeric"}).format(bin.from):unit==="month"?dateFormat(locale,{month:"short"}).format(bin.from):dateFormat(locale,{day:"numeric",month:"short"}).format(bin.from)}function binRangeLabel(bin,unit,locale){return unit==="hour"?`${binLabel(bin,unit,locale)}, ${formatDateRange({from:bin.from,to:bin.from},locale)}`:unit==="day"?formatDateRange({from:bin.from,to:bin.from},locale):formatDateRange(bin,locale)}function periodSeries(input){let unit=input.unit??binUnit(input.range),bins=buildBins(input.range,unit),values=aggregate(input.points,bins,input.mode),previous=[];if(input.compareRange){let cmpBins=buildBins(input.compareRange,unit).slice(0,bins.length);previous=aggregate(input.comparePoints??input.points,cmpBins,input.mode)}return bins.map((bin,i)=>({key:bin.from.toISOString(),label:binLabel(bin,unit,input.locale),range:binRangeLabel(bin,unit,input.locale),from:bin.from,to:bin.to,value:values[i]??0,compare:input.compareRange?previous[i]??null:null}))}function total(points,range,mode="sum"){let days=buildBins(range,"day"),sum=aggregate(points,days,"sum").reduce((a,b)=>a+b,0);return mode==="avg"?sum/Math.max(1,differenceInCalendarDays4(range.to,range.from)+1):sum}var AXIS_LABEL_HALF=24,AXIS_LABEL_ROOM=3*AXIS_LABEL_HALF+8;function axisLabelStep(count,spacing){let room=spacing&&spacing>0?Math.ceil(AXIS_LABEL_ROOM/spacing):1;return Math.max(1,Math.ceil(count/7),room)}function showAxisLabel(index,count,spacing){return(count-1-index)%axisLabelStep(count,spacing)===0}function edgeAnchor(x,left,right){return!(right-left>2*AXIS_LABEL_HALF)||!Number.isFinite(x)?"middle":x-left<AXIS_LABEL_HALF?"start":right-x<AXIS_LABEL_HALF?"end":"middle"}function chartMax(values){let max=1;for(let v of values)typeof v=="number"&&Number.isFinite(v)&&v>max&&(max=v);return max*1.1}function endsToday(range,now=new Date){return differenceInCalendarDays4(range.to,now)===0}function sparkPaths(values,width=72,height=24){let known=values.map(v=>typeof v=="number"&&Number.isFinite(v)?v:null),max=chartMax(known);if(!known.some(v=>v!=null))return{line:"",area:""};let round2=v=>Math.round(v*100)/100,y=v=>round2(height-Math.max(0,v)/max*height),closed=points=>{let line=points.map(([px2,py],i)=>`${i?"L":"M"}${px2} ${py}`).join(" ");return{line,area:`${line} L${points[points.length-1][0]} ${height} L${points[0][0]} ${height} Z`}},n=known.length;if(n===1)return closed([[0,y(known[0])],[width,y(known[0])]]);let runs=[[]];known.forEach((v,i)=>{v==null?runs.push([]):runs[runs.length-1].push([round2(i/(n-1)*width),y(v)])});let lines=[],areas=[];for(let points of runs)if(points.length===1)lines.push(`M${points[0][0]} ${points[0][1]} L${points[0][0]} ${points[0][1]}`);else if(points.length>1){let path=closed(points);lines.push(path.line),areas.push(path.area)}return{line:lines.join(" "),area:areas.join(" ")}}import{Area as Area2,AreaChart,Bar as Bar2,BarChart,CartesianGrid as CartesianGrid2,Cell as Cell2,ComposedChart as ComposedChart2,LabelList,Legend,Line as Line2,LineChart,Pie,PieChart,ReferenceDot,ReferenceLine,ResponsiveContainer as ResponsiveContainer2,Scatter,Tooltip as Tooltip3,XAxis as XAxis2,YAxis as YAxis2}from"recharts";import{jsx as jsx24,jsxs as jsxs20}from"react/jsx-runtime";var THEMES={light:"",dark:".dark"},ChartContext=React10.createContext(null);function useChart(){let context=React10.useContext(ChartContext);if(!context)throw new Error("useChart must be used within a <ChartContainer />");return context}var NO_CONFIG={};function useChartConfig(){return React10.useContext(ChartContext)?.config??NO_CONFIG}var ChartContainer=React10.forwardRef(({id,className,children,config,aspect,height,style,...props},ref)=>{let uniqueId=React10.useId(),chartId=`chart-${id||uniqueId.replace(/:/g,"")}`,box={...height!=null?{height,aspectRatio:"auto"}:{},...aspect!=null?{aspectRatio:aspect==="auto"?"auto":String(aspect)}:{},...style};return jsx24(ChartContext.Provider,{value:{config},children:jsxs20("div",{"data-chart":chartId,"data-notis-ui":"",ref,className:cx("nui-chart-container",className),style:Object.keys(box).length?box:void 0,...props,children:[jsx24(ChartStyle,{id:chartId,config}),jsx24(ResponsiveContainer,{children})]})})});ChartContainer.displayName="Chart";function ChartStyle({id,config}){let colorConfig=Object.entries(config).filter(([,item])=>item.theme||item.color);if(!colorConfig.length)return null;let css=Object.entries(THEMES).map(([theme,prefix])=>{let lines=colorConfig.map(([key,item])=>{let color=item.theme?.[theme]||item.color;return color?` --color-${key}: ${color};`:null}).filter(Boolean).join(`
10
+ `);return`${prefix} [data-chart=${id}] {
11
+ ${lines}
12
+ }
13
+ `}).join("");return jsx24("style",{dangerouslySetInnerHTML:{__html:css}})}var ChartTooltip=Tooltip2;function payloadConfig(config,payload,key){if(typeof payload!="object"||payload===null)return;let inner="payload"in payload&&typeof payload.payload=="object"?payload.payload??void 0:void 0;return key in config||inner&&key in inner,config[key]}function itemValue(value){return typeof value=="number"||typeof value=="string"?value:Array.isArray(value)&&(typeof value[0]=="number"||typeof value[0]=="string")?value[0]:null}var ChartTooltipContent=React10.forwardRef(({active,payload,className,indicator="dot",hideLabel=!1,hideIndicator=!1,label,labelFormatter,labelClassName,formatter,color,nameKey,labelKey,valueFormatter,locale},ref)=>{let config=useChartConfig(),loc=useDateLocale(locale),tooltipLabel=React10.useMemo(()=>{if(hideLabel||!payload?.length)return null;let[item]=payload,key=`${labelKey||item?.dataKey||item?.name||"value"}`,itemConfig=payloadConfig(config,item,key),value=!labelKey&&typeof label=="string"?config[label]?.label||label:itemConfig?.label,text=labelFormatter?labelFormatter(label,payload):value;return text==null||text===""?null:jsx24("div",{className:cx("nui-chart-tip-label",labelClassName),children:text})},[label,labelFormatter,payload,hideLabel,labelKey,labelClassName,config]);return!active||!payload?.length?null:jsxs20("div",{ref,className:cx("nui-chart-tip",className),"data-notis-ui":"",children:[tooltipLabel,jsx24("div",{className:"nui-chart-tip-rows",children:payload.map((item,index)=>{let key=`${nameKey||item.name||item.dataKey||"value"}`,itemConfig=payloadConfig(config,item,key),indicatorColor=color||item.payload?.fill||item.color,value=itemValue(item.value);if(formatter&&item.value!=null&&item.name)return jsx24("div",{className:"nui-chart-tip-row",children:formatter(item.value,item.name,item,index,payload)},String(item.dataKey??index));let Icon2=itemConfig?.icon;return jsxs20("div",{className:"nui-chart-tip-row",children:[Icon2?jsx24(Icon2,{}):!hideIndicator&&jsx24("span",{className:"nui-chart-tip-ind","data-indicator":indicator,style:{"--nui-chart-ind":indicatorColor},"aria-hidden":"true"}),jsx24("span",{className:"nui-chart-tip-name",children:itemConfig?.label||item.name}),value!=null?jsx24("span",{className:"nui-chart-tip-value",children:valueFormatter?valueFormatter(value,item):typeof value=="number"?formatNumber(value,loc):value}):jsx24("span",{className:"nui-chart-tip-value","data-empty":"",children:pick(CHART_WORDS.noValue,loc)})]},String(item.dataKey??index))})})]})});ChartTooltipContent.displayName="ChartTooltipContent";function legendShape(item){if(item.shape)return item.shape;let dash=typeof item.payload=="object"&&item.payload!==null?item.payload.strokeDasharray:void 0;return item.dashed||dash!=null&&dash!==""&&dash!==0&&dash!=="0"?"dashed":"square"}var ChartLegend=React10.forwardRef(({className,hideIcon=!1,payload,nameKey,verticalAlign:_align,config:configProp,...props},ref)=>{let contextConfig=useChartConfig(),config=configProp??contextConfig,items2=(payload??[]).filter(item=>typeof item=="object"&&item!==null&&item.type!=="none");return items2.length?jsx24("div",{ref,className:cx("nui-chart-legend",className),...props,children:items2.map((item,index)=>{let dataKey=typeof item.dataKey=="string"||typeof item.dataKey=="number"?String(item.dataKey):"",key=`${nameKey||dataKey||"value"}`,itemConfig=payloadConfig(config,item,key),Icon2=itemConfig?.icon,colour=item.color??itemConfig?.color??(dataKey?`var(--color-${dataKey})`:void 0),shape=legendShape(item),label=itemConfig?.label??item.value;return jsxs20("span",{className:"nui-chart-legend-item",children:[Icon2&&!hideIcon?jsx24(Icon2,{}):shape==="line"?jsx24("span",{className:"nui-chart-key",style:{background:colour},"aria-hidden":"true"}):shape==="dashed"?jsx24("span",{className:"nui-chart-key","data-dashed":"",style:{borderTopColor:colour},"aria-hidden":"true"}):jsx24("span",{className:"nui-chart-swatch","data-shape":shape==="circle"?"circle":void 0,style:{backgroundColor:colour},"aria-hidden":"true"}),label]},dataKey||(typeof item.value=="string"?item.value:index))})}):null});ChartLegend.displayName="ChartLegend";function barShape(props){return jsx24(Rectangle,{...props})}function barLabel(props){let{viewBox,value,offset=5,position,formatter,className}=props,box=viewBox;if(!box||value==null||value==="")return null;let text=formatter?formatter(value):value;if(text==null||text===""||text===!1)return null;let{x=0,y=0,width=0,height=0}=box,top=position==="top";return jsx24("text",{className:cx("nui-chart-bar-label",className),x:top?x+width/2:Math.max(x,x+width)+offset,y:top?Math.min(y,y+height)-offset:y+height/2,textAnchor:top?"middle":"start",dominantBaseline:top?"auto":"central",children:String(text)})}var SERIES_COLORS=["hsl(var(--chart-1))","hsl(var(--chart-2))","hsl(var(--chart-3))","hsl(var(--chart-4))","hsl(var(--chart-5))"],COMPARE_COLOR="hsl(var(--muted-foreground) / .7)",PLOT_MARGIN={top:8,right:4,bottom:0,left:4},ROW_HEIGHT=32,SERIES_ROW=14,BAR_HEIGHT=140,PLOT_HEIGHT=200;function useFontFamily(ref,active){let[font,setFont]=React10.useState({family:"sans-serif",fonts:0});return React10.useEffect(()=>{let node=ref.current;if(!active||!node||typeof getComputedStyle>"u")return;let live=!0,read=arrived=>{if(!live)return;let family=getComputedStyle(node).fontFamily||"sans-serif";setFont(f=>!arrived&&f.family===family?f:{family,fonts:f.fonts+(arrived?1:0)})};return read(!1),document.fonts?.ready.then(()=>read(!0)),()=>{live=!1}},[ref,active]),font}function field(row,key){return row[key]}function numberOf(value){return typeof value=="number"&&Number.isFinite(value)?value:null}function asSeriesList(series){return series?Array.isArray(series)?[...series]:[series]:[{key:"value",label:PERIOD_WORDS.thisPeriod}]}function asCompare(compare){return!compare||compare==="none"?null:typeof compare=="string"?{key:"compare",label:COMPARE_WORDS[compare]}:compare}function seriesColor(series,index){return series.color??SERIES_COLORS[index%SERIES_COLORS.length]}function rowTotal(row,series){return series.reduce((sum,s)=>sum+Math.max(0,numberOf(field(row,s.key))??0),0)}function chartTableRows(data,series,compare,nameOf,format){return data.map(row=>{let values=series.map(s=>{let v=numberOf(field(row,s.key));return v==null?null:format(v)});if(compare){let v=numberOf(field(row,compare.key));values.push(v==null?null:format(v))}return[nameOf(row),...values]})}function Chart({kind,data,series:seriesProp,compare:compareProp,xKey:xKeyProp,labelKey="label",nameKey:nameKeyProp,title,height:heightProp,stacked=!1,horizontal:horizontalProp=!1,format:formatProp,labelFormat:labelFormatProp,live:liveProp,locale:localeProp,className}){let locale=useDateLocale(localeProp),horizontal=horizontalProp&&kind==="bar",stack=stacked&&kind!=="line",series=React10.useMemo(()=>asSeriesList(seriesProp),[seriesProp]),compare=React10.useMemo(()=>horizontal?null:asCompare(compareProp),[compareProp,horizontal]),[hover,setHover]=React10.useState(null),plotRef=React10.useRef(null),plotWidth=useElementWidth(plotRef),first=data[0],xKey=xKeyProp??(first&&field(first,"key")!=null?"key":labelKey),nameKey=nameKeyProp??(first&&field(first,"range")!=null?"range":labelKey),format=React10.useCallback(v=>formatProp?formatProp(v,locale):formatValue(v,locale),[formatProp,locale]),nameOf=React10.useCallback(row2=>String(field(row2,nameKey)??field(row2,labelKey)??""),[nameKey,labelKey]),labelOf=React10.useMemo(()=>{let map=new Map;for(let row2 of data)map.set(field(row2,xKey),String(field(row2,labelKey)??field(row2,xKey)??""));return map},[data,xKey,labelKey]),last=data[data.length-1],lastTo=last?field(last,"to"):void 0,live=liveProp??(lastTo instanceof Date?endsToday({from:lastTo,to:lastTo}):!1),max=React10.useMemo(()=>{let values=[];for(let row2 of data){if(stack)values.push(rowTotal(row2,series));else for(let s of series)values.push(numberOf(field(row2,s.key)));compare&&values.push(numberOf(field(row2,compare.key)))}return horizontal?values.reduce((top,v)=>v!=null&&v>top?v:top,1):chartMax(values)},[data,series,compare,stack,horizontal]),shortValue=React10.useCallback(v=>labelFormatProp?labelFormatProp(v,locale):format(v),[labelFormatProp,locale,format]),{family,fonts}=useFontFamily(plotRef,horizontal),measure2=React10.useCallback(line=>textWidth(line,family),[family,fonts]),axis=React10.useMemo(()=>horizontal?axisWidth([...labelOf.values()],plotWidth,measure2):0,[horizontal,labelOf,plotWidth,measure2]),labelRoom=React10.useMemo(()=>{let labels=[];if(horizontal)for(let row2 of data){let values=stack?[rowTotal(row2,series)]:series.map(s=>numberOf(field(row2,s.key)));for(let v of values)v!=null&&labels.push(shortValue(v))}return valueMargin(labels,measure2)},[horizontal,data,stack,series,shortValue,measure2]),labelText=React10.useCallback(v=>typeof v=="number"?shortValue(v):v,[shortValue]),axisLabel=React10.useCallback(value=>labelOf.get(value)??String(value??""),[labelOf]),categoryTick=React10.useCallback(props=>{let lines=wrapLabel(axisLabel(props.payload?.value),line=>measure2(line)<=axis-16);return jsx24("text",{x:props.x,y:props.y,textAnchor:"end",dominantBaseline:"central",className:"recharts-cartesian-axis-tick-value",children:lines.map((line,i)=>jsx24("tspan",{x:props.x,dy:i===0?lines.length>1?"-0.6em":0:"1.2em",children:line},i))})},[axisLabel,measure2,axis]),sideBySide=horizontal&&!stack&&series.length>1,row=sideBySide?Math.max(ROW_HEIGHT,series.length*SERIES_ROW+12):ROW_HEIGHT,height=heightProp??(horizontal?data.length*row+8:kind==="bar"?BAR_HEIGHT:PLOT_HEIGHT),spacing=kind!=="bar"&&data.length>1?(plotWidth-PLOT_MARGIN.left-PLOT_MARGIN.right)/(data.length-1):void 0,ticks=React10.useMemo(()=>data.map((row2,i)=>showAxisLabel(i,data.length,spacing)?field(row2,xKey):void 0).filter(v=>v!==void 0),[data,xKey,spacing]),edgeTick=React10.useCallback(props=>{let value=props.payload?.value,right=typeof props.width=="number"?PLOT_MARGIN.left+props.width:plotWidth-PLOT_MARGIN.right;return jsx24(Text,{...props,textAnchor:edgeAnchor(Number(props.x),PLOT_MARGIN.left,right),children:props.tickFormatter?props.tickFormatter(value,props.index):String(value??"")})},[plotWidth]),config=React10.useMemo(()=>{let out={};return series.forEach((s,i)=>{out[s.key]={label:pick(s.label,locale),color:seriesColor(s,i)}}),compare&&(out[compare.key]={label:pick(compare.label,locale),color:compare.color??COMPARE_COLOR}),out},[series,compare,locale]),titleText=title?pick(title,locale):pick(series[0].label,locale),columns=[pick(CHART_WORDS.date,locale),...series.map(s=>pick(s.label,locale)),...compare?[pick(compare.label,locale)]:[]],rows=chartTableRows(data,series,compare,nameOf,format),showLegend=!!compare||series.length>1,single=series.length===1,onMove=state=>{let raw=state?.activeTooltipIndex,index=raw==null?null:Number(raw);setHover(index==null||Number.isNaN(index)?null:index)},bars=kind==="bar"?series.map((s,i)=>jsx24(Bar,{dataKey:s.key,name:pick(s.label,locale),fill:`var(--color-${s.key})`,maxBarSize:sideBySide?12:28,radius:stack?void 0:horizontal?[0,3,3,0]:[3,3,0,0],isAnimationActive:!1,...horizontal?{shape:barShape}:{},...horizontal&&(!stack||i===series.length-1)?{label:{content:barLabel,position:"right",formatter:labelText}}:{},children:single&&!horizontal&&data.map((row2,index)=>{let full=hover===index||live&&index===data.length-1;return jsx24(Cell,{fillOpacity:full?1:.55},String(field(row2,xKey)??index))})},s.key)):null;return jsxs20("div",{className:cx("nui-chart",className),"data-notis-ui":"","data-kind":kind,children:[jsxs20("div",{ref:plotRef,className:"nui-chart-plot",role:"img","aria-label":titleText,style:{height},children:[jsx24(ChartContainer,{config,className:"nui-chart-box",children:jsxs20(ComposedChart,{data,layout:horizontal?"vertical":"horizontal",margin:horizontal?{top:4,right:labelRoom+PLOT_MARGIN.right,bottom:4,left:0}:PLOT_MARGIN,barCategoryGap:sideBySide?6:"38%",barGap:sideBySide?2:4,onMouseMove:onMove,onMouseLeave:()=>setHover(null),accessibilityLayer:!1,children:[!horizontal&&jsx24(CartesianGrid,{vertical:!1,stroke:"hsl(var(--foreground) / .07)"}),horizontal&&jsx24(XAxis,{type:"number",hide:!0,domain:[0,max]}),horizontal&&jsx24(YAxis,{type:"category",dataKey:xKey,width:axis,interval:0,tickLine:!1,axisLine:!1,tickMargin:8,tick:categoryTick}),!horizontal&&jsx24(YAxis,{hide:!0,domain:[0,max],ticks:[.25,.5,.75,1].map(f=>f*max)}),!horizontal&&jsx24(XAxis,{dataKey:xKey,ticks,interval:0,tickLine:!1,axisLine:!1,tickMargin:8,minTickGap:0,tickFormatter:axisLabel,...kind==="bar"?{}:{tick:edgeTick}}),jsx24(Tooltip2,{cursor:kind==="bar"?!1:{stroke:"hsl(var(--border))"},isAnimationActive:!1,filterNull:!1,content:props=>jsx24(ChartTooltipContent,{...props,labelFormatter:(_label,payload)=>{let row2=payload?.[0]?.payload;return row2?nameOf(row2):""},indicator:compare?"line":"dot",valueFormatter:v=>typeof v=="number"?format(v):v,locale})}),bars&&stack&&jsx24(BarStack,{radius:horizontal?[0,3,3,0]:[3,3,0,0],children:bars}),bars&&!stack&&bars,kind!=="bar"&&series.map(s=>{let colour=`var(--color-${s.key})`;return kind==="area"?jsx24(Area,{dataKey:s.key,name:pick(s.label,locale),type:"linear",stroke:colour,strokeWidth:2,fill:colour,fillOpacity:.12,dot:!1,activeDot:{r:3},isAnimationActive:!1,...stack?{stackId:"stack"}:{}},s.key):jsx24(Line,{dataKey:s.key,name:pick(s.label,locale),type:"linear",stroke:colour,strokeWidth:2,dot:!1,activeDot:{r:3},isAnimationActive:!1},s.key)}),compare&&jsx24(Line,{dataKey:compare.key,name:pick(compare.label,locale),type:"linear",stroke:`var(--color-${compare.key})`,strokeWidth:1.5,strokeDasharray:"4 4",dot:!1,activeDot:!1,isAnimationActive:!1})]})}),jsx24(RenderChartData,{title:titleText,columns,rows})]}),showLegend&&jsxs20("div",{className:"nui-chart-legend","data-placement":"below",children:[series.map((s,i)=>jsxs20("span",{className:"nui-chart-legend-item",children:[jsx24("span",{className:"nui-chart-key",style:{background:seriesColor(s,i)},"aria-hidden":"true"}),pick(s.label,locale)]},s.key)),compare&&jsxs20("span",{className:"nui-chart-legend-item",children:[jsx24("span",{className:"nui-chart-key","data-dashed":"","aria-hidden":"true"}),pick(compare.label,locale)]})]})]})}Chart.displayName="Chart";import{jsx as jsx25,jsxs as jsxs21}from"react/jsx-runtime";function vsTail(compare,locale){return compare==="none"?"":pick(VS_WORDS[compare],locale).replace(/^vs\s+/,"")}function metricView(metric,compare,locale){let format=v=>metric.format?metric.format(v,locale):formatValue(v,locale),label=pick(metric.label,locale),value=typeof metric.value=="number"?format(metric.value):metric.value,showPrev=compare!=="none"&&metric.previous!=null&&Number.isFinite(metric.previous),previous=showPrev?format(metric.previous):null,delta=showPrev&&typeof metric.value=="number"?formatDelta(metric.value,metric.previous,locale,metric.higherIsBetter??!0):null,sub=metric.hint!=null?pick(metric.hint,locale):previous?`${previous} ${vsTail(compare,locale)}`:null;return{key:metric.id??label,label,value,previous,delta,sub}}function hasSlot(node){return node!=null&&node!==!1&&node!==""}function StatRow({metrics,compare="prev",locale:localeProp,className}){let locale=useDateLocale(localeProp);return jsx25("div",{className:cx("nui-stats",className),"data-notis-ui":"",role:"list","aria-label":pick(CHART_WORDS.stats,locale),children:metrics.map(metric=>{let v=metricView(metric,compare,locale);return jsxs21("div",{className:"nui-stat",role:"listitem",children:[jsxs21("div",{className:"nui-stat-head",children:[jsx25("span",{className:"nui-stat-label",children:v.label}),hasSlot(metric.about)&&jsx25("span",{className:"nui-stat-about",children:metric.about})]}),jsxs21("div",{className:"nui-stat-main",children:[jsx25("span",{className:"nui-stat-value",children:v.value}),v.delta&&jsx25("span",{className:"nui-stat-delta","data-tone":v.delta.tone,children:v.delta.text})]}),v.sub&&jsx25("div",{className:"nui-stat-sub",children:v.sub})]},v.key)})})}StatRow.displayName="StatRow";import{jsx as jsx26,jsxs as jsxs22}from"react/jsx-runtime";function Sparkline({values,width=72,height=24,className}){let{line,area}=sparkPaths(values,width,height);return jsxs22("svg",{className:cx("nui-spark",className),viewBox:`0 0 ${width} ${height}`,width,height,"aria-hidden":"true",focusable:"false",preserveAspectRatio:"none",children:[area&&jsx26("path",{className:"nui-spark-fill",d:area}),line&&jsx26("path",{className:"nui-spark-line",d:line})]})}function ChartTable({metrics,compare="prev",title,activeId,onSelect,locale:localeProp,className}){let locale=useDateLocale(localeProp),withCompare=compare!=="none",t=words=>pick(words,locale);return jsx26("div",{className:cx("nui-ctable-wrap",className),"data-notis-ui":"",children:jsxs22("table",{className:"nui-ctable","aria-label":t(title??CHART_WORDS.stats),"data-compare":withCompare?"":void 0,children:[jsx26("thead",{children:jsxs22("tr",{children:[jsx26("th",{scope:"col",className:"nui-ctable-metric",children:t(CHART_WORDS.metric)}),jsx26("th",{scope:"col",className:"nui-ctable-trend",children:t(CHART_WORDS.trend)}),jsx26("th",{scope:"col",className:"nui-ctable-num",children:t(PERIOD_WORDS.value)}),withCompare&&jsx26("th",{scope:"col",className:"nui-ctable-num nui-ctable-prev",children:t(PERIOD_WORDS.previous)}),withCompare&&jsx26("th",{scope:"col",className:"nui-ctable-num nui-ctable-change",children:t(CHART_WORDS.change)})]})}),jsx26("tbody",{children:metrics.map(metric=>{let v=metricView(metric,compare,locale),id=metric.id??v.key;return jsxs22("tr",{"data-active":activeId!=null&&activeId===id?"":void 0,"data-pressable":onSelect?"":void 0,onClick:onSelect?()=>onSelect(metric):void 0,children:[jsxs22("th",{scope:"row",className:"nui-ctable-metric",children:[onSelect?jsx26("button",{type:"button",className:"nui-ctable-pick","aria-pressed":activeId===id,onClick:e=>{e.stopPropagation(),onSelect(metric)},children:v.label}):v.label,hasSlot(metric.about)&&jsx26("span",{className:"nui-ctable-about",onClick:e=>e.stopPropagation(),children:metric.about})]}),jsx26("td",{className:"nui-ctable-trend",children:metric.spark?.length?jsx26(Sparkline,{values:metric.spark}):null}),jsx26("td",{className:"nui-ctable-num",children:v.value}),withCompare&&jsx26("td",{className:"nui-ctable-num nui-ctable-prev",children:v.previous??""}),withCompare&&jsx26("td",{className:"nui-ctable-num nui-ctable-change","data-tone":v.delta?.tone,children:v.delta?.text??""})]},v.key)})})]})})}ChartTable.displayName="ChartTable";import{createContext as createContext7,useCallback as useCallback17,useContext as useContext9,useEffect as useEffect23,useMemo as useMemo18,useRef as useRef22,useState as useState21}from"react";var FIELD_WORDS=Object.freeze({save:{en:"Save",fr:"Enregistrer"},saving:{en:"Saving",fr:"Enregistrement"},cancel:{en:"Cancel",fr:"Annuler"},unsaved:{en:"Unsaved changes",fr:"Modifications non enregistr\xE9es"},changed:{en:"Changed",fr:"Modifi\xE9"},empty:{en:"Empty",fr:"Vide"},choose:{en:"Choose",fr:"Choisir"},edit:{en:"Change",fr:"Changer"},done:{en:"Done",fr:"Termin\xE9"},saveFailed:{en:"Your changes were not saved. Try again.",fr:"Tes modifications n\u2019ont pas \xE9t\xE9 enregistr\xE9es. R\xE9essaie."},add:{en:'Add "{text}"',fr:'Ajouter "{text}"'},noMatch:{en:"No match",fr:"Aucun r\xE9sultat"},addFailed:{en:'Could not add "{text}". Try again.',fr:'Impossible d\u2019ajouter "{text}". R\xE9essaie.'}});import{Fragment as Fragment12,jsx as jsx27,jsxs as jsxs23}from"react/jsx-runtime";var FIELDS_ESCAPE_PRIORITY=ESCAPE_PRIORITY.selection+50,FIELDS_SAVE_KEYS="mod+enter";function EditableFields({dirty,saving=!1,saveDisabled=!1,onSave,onCancel,error,label,footer,children,className}){let t=useT(),id=useStableId("nui-fields"),[pending,setPending]=useState21(!1),[failed,setFailed]=useState21(!1),running=useRef22(!1),mounted=useRef22(!0),barRef=useRef22(null);useEffect23(()=>(mounted.current=!0,()=>{mounted.current=!1}),[]),useEffect23(()=>{dirty||setFailed(!1)},[dirty]);let busy=saving||pending,latest=useLatest({dirty,busy,saveDisabled,onSave,onCancel}),save=useCallback17(async()=>{if(!running.current){running.current=!0,setFailed(!1);try{let result=latest.current.onSave();result&&typeof result.then=="function"&&(setPending(!0),await result)}catch{mounted.current&&setFailed(!0)}finally{running.current=!1,mounted.current&&setPending(!1)}}},[latest]),cancel=useCallback17(()=>{setFailed(!1),latest.current.onCancel()},[latest]);useEscapeLayer(`fields.cancel.${id}`,()=>{let current=latest.current;return!current.dirty||current.busy?!1:(cancel(),!0)},{priority:FIELDS_ESCAPE_PRIORITY,enabled:dirty});let shown=error||(failed?t(FIELD_WORDS.saveFailed):null),canSave=dirty&&!busy&&!saveDisabled,barShown=!!(dirty||shown),inFabCorner=useInFabCorner(barRef,barShown);return jsxs23("div",{className:cx("nui-fields",className),role:"group","aria-label":label?t(label):void 0,"data-dirty":flag(dirty),"data-saving":flag(busy),children:[jsx27("dl",{className:"nui-fields-list",children}),footer,barShown?jsxs23("div",{ref:barRef,className:"nui-fields-bar",role:"group","aria-label":t(FIELD_WORDS.unsaved),"data-fab":flag(inFabCorner),children:[jsx27("div",{className:"nui-fields-error",role:"status",children:shown}),dirty?jsx27("span",{className:"nui-fields-note",children:t(FIELD_WORDS.unsaved)}):null,dirty?jsxs23(Fragment12,{children:[jsxs23(Button,{variant:"ghost",size:"sm",onClick:cancel,disabled:busy,children:[t(FIELD_WORDS.cancel),jsx27(Keycap,{keys:"escape"})]}),jsxs23(Button,{variant:"primary",size:"sm",onClick:()=>{save()},disabled:!canSave,"aria-keyshortcuts":"Meta+Enter Control+Enter",children:[t(busy?FIELD_WORDS.saving:FIELD_WORDS.save),jsx27(Keycap,{keys:FIELDS_SAVE_KEYS,on:"pill"})]})]}):null,dirty?jsx27(SaveKey,{id,enabled:canSave,onSave:save}):null]}):null]})}function FieldList({label,filled,children,className}){let t=useT();return jsx27("div",{className:cx("nui-fields",className),"data-filled":flag(filled),role:label?"group":void 0,"aria-label":label?t(label):void 0,children:jsx27("dl",{className:"nui-fields-list",children})})}function fabCorner(el){let style=el.ownerDocument.defaultView?.getComputedStyle(el),px2=(...names)=>{for(let name of names){let value=parseFloat(style?.getPropertyValue(name)??"");if(Number.isFinite(value))return value}return 0};return{end:px2("--nui-fab-safe-end","--notis-fab-safe-end"),bottom:px2("--nui-fab-safe-bottom","--notis-fab-safe-bottom")}}function overlapsFabCorner(el){let view=el.ownerDocument.defaultView,corner=fabCorner(el);if(!view||corner.end<=0)return!1;let page=el.ownerDocument.documentElement,width=page.clientWidth||view.innerWidth,height=page.clientHeight||view.innerHeight,rect=el.getBoundingClientRect();return rect.width<=0||rect.height<=0?!1:rect.right>width-corner.end&&rect.bottom>height-(corner.bottom>0?corner.bottom:corner.end)&&rect.top<height}function useInFabCorner(ref,shown){let[inCorner,setInCorner]=useState21(!1);return useIsoLayoutEffect(()=>{let bar=ref.current,view=bar?.ownerDocument.defaultView;if(!shown||!bar||!view){setInCorner(!1);return}let frame=0,check=()=>{frame=0,setInCorner(overlapsFabCorner(bar))},schedule=()=>{!frame&&typeof requestAnimationFrame<"u"&&(frame=requestAnimationFrame(check))};check();let listen={capture:!0,passive:!0},rootNode=bar.getRootNode(),scrollTargets=rootNode===bar.ownerDocument?[view]:[view,rootNode];for(let target of scrollTargets)target.addEventListener("scroll",schedule,listen);view.addEventListener("resize",schedule);let observer=typeof ResizeObserver>"u"?null:new ResizeObserver(schedule);return observer?.observe(bar),bar.parentElement&&observer?.observe(bar.parentElement),()=>{frame&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(frame);for(let target of scrollTargets)target.removeEventListener("scroll",schedule,listen);view.removeEventListener("resize",schedule),observer?.disconnect()}},[ref,shown]),inCorner}function SaveKey({id,enabled,onSave}){let latest=useLatest({enabled,onSave});return useShortcut({id:`fields.save.${id}`,keys:FIELDS_SAVE_KEYS,scope:"detail",label:FIELD_WORDS.save,allowInFields:!0,when:()=>latest.current.enabled,run:()=>{latest.current.onSave()}}),null}var FieldRowContext=createContext7(null);function FieldRow({label,hint,stacked,changed,invalid=!1,children,className}){let t=useT(),hintId=useStableId("nui-field-hint"),describedBy=hint?hintId:void 0,state=useMemo18(()=>({describedBy,invalid}),[describedBy,invalid]);return jsxs23("div",{className:cx("nui-field-row",className),"data-stacked":flag(stacked),"data-changed":flag(changed),"data-invalid":flag(invalid),children:[jsxs23("dt",{className:"nui-field-label",children:[jsx27("span",{children:t(label)}),changed?jsx27("span",{className:"nui-field-dot",role:"img","aria-label":t(FIELD_WORDS.changed)}):null]}),jsxs23("dd",{className:"nui-field-value",children:[jsx27(FieldRowContext.Provider,{value:state,children}),hint?jsx27("span",{id:hintId,className:"nui-field-hint",children:hint}):null]})]})}function useTextDescription(invalid,describedBy){let row=useContext9(FieldRowContext);return{"aria-invalid":invalid??row?.invalid?!0:void 0,"aria-describedby":(describedBy??row?.describedBy)||void 0}}function useRowDescribedBy(){return useContext9(FieldRowContext)?.describedBy}function blurOnEscape(event){if(event.key!=="Escape"||event.nativeEvent.isComposing||event.defaultPrevented)return;let field2=event.currentTarget,holder=field2.parentElement?closestComposed(field2.parentElement,"[data-notis-escape-owned][tabindex]"):null;holder&&typeof holder.focus=="function"?holder.focus({preventScroll:!0}):field2.blur()}function FieldText({value,onChange,label,placeholder,readOnly,size="default",maxLength,invalid,describedBy,className}){let t=useT(),description=useTextDescription(invalid,describedBy);return jsx27("input",{type:"text",className:cx("nui-field-input",className),"data-size":size==="default"?void 0:size,value,"aria-label":t(label),...description,placeholder:placeholder?t(placeholder):void 0,readOnly,maxLength,onChange:event=>onChange(event.target.value),onKeyDown:blurOnEscape})}function FieldLongText({value,onChange,label,placeholder,readOnly,maxLength,rows=4,invalid,describedBy,className}){let t=useT(),description=useTextDescription(invalid,describedBy);return jsx27("textarea",{className:cx("nui-field-textarea",className),value,rows,"aria-label":t(label),...description,placeholder:placeholder?t(placeholder):void 0,readOnly,maxLength,onChange:event=>onChange(event.target.value),onKeyDown:blurOnEscape})}function OptionFace({option}){let t=useT();return jsxs23(Fragment12,{children:[option.icon!==void 0?renderIcon(option.icon):null,jsx27("span",{className:"nui-field-text",children:t(option.label)})]})}function FieldSelect({value,options,onChange,label,placeholder,readOnly,menuHeader,className}){let t=useT(),labelled=useLabelValue(),describedBy=useRowDescribedBy(),selected=options.find(option=>option.value===value)??null,face=selected?jsx27(OptionFace,{option:selected}):jsx27("span",{className:"nui-field-text nui-field-placeholder",children:t(placeholder??FIELD_WORDS.choose)}),name=labelled(t(label),t(selected?selected.label:placeholder??FIELD_WORDS.empty));return readOnly?jsx27("span",{className:cx("nui-field-static",className),children:face}):jsxs23(Menu,{label,align:"start",trigger:jsxs23("button",{type:"button",className:cx("nui-field-trigger",className),"aria-label":name,"aria-describedby":describedBy,children:[face,jsx27("span",{className:"nui-field-caret","aria-hidden":"true",children:renderIcon("caret-down")})]}),children:[menuHeader,options.map(option=>jsxs23(Menu.Item,{icon:option.icon,checked:option.value===value,disabled:option.disabled,onSelect:()=>{option.value!==value&&onChange(option.value)},children:[t(option.label),option.hint?jsx27("span",{className:"nui-field-hint",children:` ${t(option.hint)}`}):null]},option.value))]})}function toggleFieldValue(values,value,order,minOne=!1){return values.includes(value)?minOne&&values.length<=1?null:values.filter(current=>current!==value):order.filter(candidate=>candidate===value||values.includes(candidate))}function FieldMultiSelect({values,options,onChange,label,placeholder,minOne,onNeedOne,readOnly,searchable,onAdd,className}){let t=useT(),labelled=useLabelValue(),describedBy=useRowDescribedBy(),latest=useLatest({values,options,onChange,minOne,onNeedOne}),selected=options.filter(option=>values.includes(option.value)),names=selected.map(option=>t(option.label)).join(", "),face=selected.length===0?jsx27("span",{className:"nui-field-text nui-field-placeholder",children:t(placeholder??FIELD_WORDS.choose)}):selected.length>2&&selected.every(option=>option.icon!==void 0)?jsx27("span",{className:"nui-field-static","aria-hidden":"true",children:selected.map(option=>jsx27("span",{className:"nui-field-static",children:renderIcon(option.icon)},option.value))}):jsx27("span",{className:"nui-field-static","aria-hidden":"true",children:selected.map(option=>jsx27("span",{className:"nui-field-static",children:jsx27(OptionFace,{option})},option.value))});if(readOnly)return jsx27("span",{className:cx("nui-field-static",className),"aria-label":names||void 0,children:face});let order=options.map(option=>option.value),trigger=jsxs23("button",{type:"button",className:cx("nui-field-trigger",className),"aria-label":labelled(t(label),names||t(FIELD_WORDS.empty)),"aria-describedby":describedBy,children:[face,jsx27("span",{className:"nui-field-caret","aria-hidden":"true",children:renderIcon("caret-down")})]});if(searchable||onAdd){let toggle=value=>{let current=latest.current,currentOrder=current.options.map(option=>option.value),next=toggleFieldValue(current.values,value,currentOrder.includes(value)?currentOrder:[...currentOrder,value],current.minOne);next===null?current.onNeedOne?.():current.onChange(next)},added=value=>{latest.current.values.includes(value)||toggle(value)};return jsx27(Popover,{label,align:"start",className:"nui-field-search-panel",trigger,content:({close})=>jsx27(OptionSearch,{label,values,options,onToggle:toggle,onAdd,onAdded:added,close})})}return jsx27(Menu,{label,align:"start",trigger,children:options.map(option=>jsx27(Menu.Item,{icon:option.icon,checked:values.includes(option.value),disabled:option.disabled,closeOnSelect:!1,onSelect:()=>{let next=toggleFieldValue(values,option.value,order,minOne);next===null?onNeedOne?.():onChange(next)},children:t(option.label)},option.value))})}function foldText(text){return text.normalize("NFD").replace(/\p{M}/gu,"").toLowerCase().trim()}function entryKey(entry){return entry.kind==="add"?"add":`option:${entry.option.value}`}function OptionSearch({label,values,options,onToggle,onAdd,onAdded,close}){let t=useT(),listId=useStableId("nui-field-options"),[query,setQuery]=useState21(""),[activeKey,setActiveKey]=useState21(null),[adding,setAdding]=useState21(!1),[failed,setFailed]=useState21(null),listRef=useRef22(null),mounted=useRef22(!0);useEffect23(()=>(mounted.current=!0,()=>{mounted.current=!1}),[]);let needle=foldText(query),text=query.trim(),entries=options.filter(option=>!needle||foldText(t(option.label)).includes(needle)).map(option=>({kind:"option",option}));onAdd&&text&&!options.some(option=>foldText(t(option.label))===needle)&&entries.push({kind:"add"});let usable=entry=>!!entry&&(entry.kind==="add"?!adding:!entry.option.disabled),activeIndex=activeKey===null?-1:entries.findIndex(entry=>entryKey(entry)===activeKey),current=activeIndex>=0&&usable(entries[activeIndex])?activeIndex:entries.findIndex(usable),optionId=index=>`${listId}-${index}`;useIsoLayoutEffect(()=>{let el=current<0?null:listRef.current?.querySelector(`[data-index="${current}"]`);el&&typeof el.scrollIntoView=="function"&&el.scrollIntoView({block:"nearest"})},[current]);let move=step=>{let count=entries.length;if(!(current<0))for(let offset=1;offset<count;offset+=1){let index=((current+step*offset)%count+count)%count,entry=entries[index];if(entry&&usable(entry)){setActiveKey(entryKey(entry));return}}},add=async()=>{if(!(!onAdd||adding||!text)){setAdding(!0),setFailed(null);try{let value=await onAdd(text);typeof value=="string"&&onAdded(value),mounted.current&&(setQuery(""),setActiveKey(typeof value=="string"?`option:${value}`:null))}catch{mounted.current&&setFailed(text)}finally{mounted.current&&setAdding(!1)}}},choose=entry=>{if(!(!entry||!usable(entry))){if(entry.kind==="add"){add();return}onToggle(entry.option.value),setQuery(""),setActiveKey(entryKey(entry)),setFailed(null)}},onKeyDown=event=>{if(event.nativeEvent.isComposing)return;let plain=!event.metaKey&&!event.ctrlKey&&!event.altKey&&!event.shiftKey;if((event.key==="ArrowDown"||event.key==="ArrowUp")&&plain)event.preventDefault(),move(event.key==="ArrowDown"?1:-1);else if(event.key==="Enter"&&plain)event.preventDefault(),choose(entries[current]);else if(event.key==="Escape"){if(event.defaultPrevented)return;event.preventDefault(),close()}else event.key==="Tab"&&(event.shiftKey&&event.preventDefault(),close())},status=failed!==null?t(fillWords(FIELD_WORDS.addFailed,{text:failed})):entries.length===0?t(FIELD_WORDS.noMatch):"";return jsxs23(Fragment12,{children:[jsx27("input",{type:"text",role:"combobox",className:"nui-field-search",value:query,"aria-label":t(SHELL_WORDS.search),placeholder:t(SHELL_WORDS.search),"aria-autocomplete":"list","aria-expanded":entries.length>0,"aria-controls":entries.length?listId:void 0,"aria-activedescendant":current>=0?optionId(current):void 0,autoComplete:"off",spellCheck:!1,onChange:event=>{setQuery(event.target.value),setActiveKey(null),setFailed(null)},onKeyDown}),entries.length?jsx27("div",{ref:listRef,id:listId,role:"listbox","aria-label":t(label),"aria-multiselectable":"true",className:"nui-field-options",children:entries.map((entry,index)=>{let disabled=!usable(entry),isAdd=entry.kind==="add";return jsxs23("div",{id:optionId(index),role:"option","aria-selected":!isAdd&&values.includes(entry.option.value),"aria-disabled":disabled||void 0,"data-index":index,"data-active":flag(index===current),className:"nui-menu-item nui-field-option",onMouseDown:event=>event.preventDefault(),onPointerMove:()=>{!disabled&&index!==current&&setActiveKey(entryKey(entry))},onClick:()=>choose(entry),children:[isAdd?jsx27(Icon,{name:"plus"}):renderIcon(entry.option.icon),jsx27("span",{className:"nui-menu-label",children:t(isAdd?fillWords(FIELD_WORDS.add,{text}):entry.option.label)}),isAdd?null:jsx27(Icon,{name:"check",className:"nui-menu-check"})]},entryKey(entry))})}):null,jsx27("div",{className:"nui-field-search-status",role:"status",children:status})]})}function FieldDisclosure({summary,label,children,open,defaultOpen=!1,onOpenChange,readOnly,className}){let t=useT(),labelled=useLabelValue(),describedBy=useRowDescribedBy(),panelId=useStableId("nui-field-panel"),[ownOpen,setOwnOpen]=useState21(defaultOpen),isOpen=open??ownOpen,setOpen=next=>{open===void 0&&setOwnOpen(next),onOpenChange?.(next)};return readOnly?jsx27("span",{className:cx("nui-field-static",className),children:summary}):jsxs23(Fragment12,{children:[jsxs23("button",{type:"button",className:cx("nui-field-trigger",className),"data-wrap":"","aria-expanded":isOpen,"aria-controls":panelId,"aria-label":labelled(t(label),typeof summary=="string"?summary:t(FIELD_WORDS.edit)),"aria-describedby":describedBy,onClick:()=>setOpen(!isOpen),children:[jsx27("span",{className:"nui-field-text",children:summary}),jsx27("span",{className:"nui-field-caret","aria-hidden":"true",children:renderIcon(isOpen?"caret-up":"caret-down")})]}),isOpen?jsx27("div",{id:panelId,className:"nui-field-panel",children}):null]})}import{useCallback as useCallback18,useMemo as useMemo19,useState as useState22}from"react";function changedFieldKeys(saved,draft){return[...new Set([...Object.keys(saved),...Object.keys(draft)])].filter(key=>JSON.stringify(saved[key]??null)!==JSON.stringify(draft[key]??null))}function rebaseFieldDraft(previousSaved,draft,saved){let edited=changedFieldKeys(previousSaved,draft);if(edited.length===0)return saved;let next={...saved};for(let key of edited)key in previousSaved&&!(key in saved)||(next[key]=draft[key]);return next}function useFieldDraft(saved){let[state,setState]=useState22(()=>({saved,draft:saved})),current=state;state.saved!==saved&&changedFieldKeys(state.saved,saved).length>0&&(current={saved,draft:rebaseFieldDraft(state.saved,state.draft,saved)},setState(current));let{draft}=current,changedKeys=useMemo19(()=>changedFieldKeys(saved,draft),[saved,draft]),dirty=changedKeys.length>0,set=useCallback18((key,value)=>{setState(previous=>({...previous,draft:{...previous.draft,[key]:value}}))},[]),patch=useCallback18(values=>{setState(previous=>({...previous,draft:{...previous.draft,...values}}))},[]),reset=useCallback18(()=>setState(previous=>({...previous,draft:previous.saved})),[]),changed=useCallback18(key=>changedKeys.includes(key),[changedKeys]);return{draft,set,patch,dirty,changed,reset}}var COMMENT_COLUMNS=Object.freeze({body:"Body",scope:"Deck",anchor:"Slide",thread:"Thread",author:"Author",x:"X",y:"Y",w:null,h:null,status:"Status",needs:"Needs",options:"Options",answer:"Answer",answeredAt:"Answered at",change:"Change",changedAt:"Changed at",example:"Example"});function commentColumns(columns){return{...COMMENT_COLUMNS,...columns??{}}}function asObject(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function richText(parts){return parts.map(part=>{let item=asObject(part);if(!item)return typeof part=="string"?part:"";let text=asObject(item.text);return text&&typeof text.content=="string"?text.content:typeof item.plain_text=="string"?item.plain_text:""}).join("")}function envelope(value){let item=asObject(value);return!item||typeof item.type!="string"?value:item[item.type]}function property(row,name){if(!name)return;let properties=asObject(row.properties);return envelope(properties?properties[name]:void 0)}function textOf3(row,name){let value=property(row,name);if(typeof value=="string")return value;if(typeof value=="number")return String(value);if(Array.isArray(value))return richText(value);let item=asObject(value);return item&&typeof item.name=="string"?item.name:item&&typeof item.start=="string"?item.start:""}function numberOf2(row,name){let value=property(row,name);return typeof value=="number"&&Number.isFinite(value)?value:typeof value=="string"&&value.trim()&&Number.isFinite(Number(value))?Number(value):null}function dateOf(row,name){let value=property(row,name);if(typeof value=="string")return value||null;let item=asObject(value);return item&&typeof item.start=="string"?item.start:null}function relationOf(row,name){let value=property(row,name);return Array.isArray(value)?value.map(item=>typeof item=="string"?item:String(asObject(item)?.id??"")).filter(Boolean):typeof value=="string"&&value?[value]:[]}function str(value){return typeof value=="string"?value:""}var NEEDS=["none","check","choice","input"],STATUSES=["Open","Resolved","Deleted"],CHANGES=["created","replied","answered","resolved","reopened","deleted"];function oneOf(value,allowed,fallback){return allowed.includes(value)?value:fallback}function readCommentRow(row,options={}){let c=commentColumns(options.columns),change=textOf3(row,c.change),author=textOf3(row,c.author),fallbackAuthor=options.fallbackAuthor??"Notis",value=property(row,c.example);return{id:str(row.id),recordKey:str(row.record_key),revision:typeof row.revision=="number"?row.revision:1,body:str(row.title)||textOf3(row,c.body),scopeIds:relationOf(row,c.scope),anchorIds:relationOf(row,c.anchor),thread:textOf3(row,c.thread).trim(),author:options.authors?options.authors.includes(author)?author:fallbackAuthor:author||fallbackAuthor,x:numberOf2(row,c.x),y:numberOf2(row,c.y),w:numberOf2(row,c.w),h:numberOf2(row,c.h),status:oneOf(textOf3(row,c.status),STATUSES,"Open"),needs:oneOf(textOf3(row,c.needs),NEEDS,"none"),options:textOf3(row,c.options).split("|").map(option=>option.trim()).filter(Boolean),answer:textOf3(row,c.answer),answeredAt:dateOf(row,c.answeredAt),change:CHANGES.includes(change)?change:null,changedAt:dateOf(row,c.changedAt),example:value===!0||value==="true",createdAt:str(row.created_at)||null}}function commentRowsOf(value){let rows=asObject(value)?.rows;return Array.isArray(rows)?rows.filter(row=>!!asObject(row)):[]}function commentTimeOf(value){if(!value)return NaN;let iso=/[zZ]|[+-]\d\d:?\d\d$/.test(value)||!value.includes("T")?value:`${value}Z`;return Date.parse(iso)}function inCommentScope(comment,scope){return scope?comment.scopeIds.includes(scope.id)||comment.scopeIds.includes(scope.recordKey):!0}function commentAnchorOf(comment,anchors){return anchors.find(anchor=>comment.anchorIds.includes(anchor.id)||comment.anchorIds.includes(anchor.recordKey))}function commentThreads(comments,anchors){let roots=comments.filter(comment=>!comment.thread),byRoot=new Map;for(let comment of comments)comment.thread&&byRoot.set(comment.thread,[...byRoot.get(comment.thread)??[],comment]);let created=comment=>commentTimeOf(comment.createdAt)||0;return roots.map(root=>({root,replies:(byRoot.get(root.recordKey)??[]).filter(reply=>reply.status!=="Deleted").sort((a,b)=>created(a)-created(b)),anchor:commentAnchorOf(root,anchors)})).sort((a,b)=>(a.anchor?.order??999)-(b.anchor?.order??999)||created(a.root)-created(b.root))}function commentChangesSince(comments,checkpoint,me="Flo"){let marker=commentTimeOf(checkpoint)||0;return comments.filter(comment=>{if(!comment.change)return!1;let at=commentTimeOf(comment.changedAt);return!Number.isFinite(at)||at<=marker?!1:comment.change==="created"||comment.change==="replied"?comment.author===me:!0}).sort((a,b)=>commentTimeOf(a.changedAt)-commentTimeOf(b.changedAt))}function isCommentZone(comment){return!!(comment&&comment.x!=null&&comment.y!=null&&comment.w!=null&&comment.h!=null&&comment.w>0&&comment.h>0)}function pinText(comment,anchorNoun){if(!comment||comment.x==null||comment.y==null)return`on the whole ${anchorNoun.toLowerCase()}, no pin`;let at=`x ${comment.x.toFixed(2)}, y ${comment.y.toFixed(2)}`;return isCommentZone(comment)?`zone at ${at}, ${comment.w.toFixed(2)} wide by ${comment.h.toFixed(2)} high`:`pin at ${at}`}function quote(value){return`"${value.replace(/\s+/g," ").trim()}"`}function commentDigest(input,options={}){let{scope,comments,anchors,changes,nowIso}=input,heading=options.heading??"Slide comments",scopeNoun=options.scopeNoun??"Deck",anchorNoun=options.anchorNoun??"Slide",me=options.me??"Flo",c=commentColumns(options.columns),byKey=new Map(comments.map(comment=>[comment.recordKey,comment])),same=[c.scope,c.anchor].filter(Boolean).join(" and "),lines=[`# ${heading}: ${scope?.name??scopeNoun}`,`Changes since ${scope?.checkpoint??"the start"} (copied ${nowIso}). ${scopeNoun} record ${scope?.recordKey??""}.`,`Reply by inserting a ${options.table??"Comments"} row with ${same?`the same ${same} and `:""}${c.thread} set to the thread record.`,""];for(let comment of changes){let root=comment.thread?byKey.get(comment.thread):comment,anchor=commentAnchorOf(comment,anchors)??(root?commentAnchorOf(root,anchors):void 0),where=anchor?`${anchorNoun} ${anchor.order} ${quote(anchor.title)}`:`Unknown ${anchorNoun.toLowerCase()}`,thread=root?.recordKey??comment.thread??comment.recordKey,what;switch(comment.change){case"created":what=`${comment.author} commented ${quote(comment.body)}`;break;case"replied":what=`${comment.author} replied ${quote(comment.body)} to ${root?`${root.author}: ${quote(root.body)}`:"a thread"}`;break;case"answered":what=`${me} answered ${comment.author}'s ${comment.needs} ${quote(comment.body)}: ${quote(comment.answer)}`;break;case"resolved":what=`${me} resolved ${comment.author}: ${quote(comment.body)}`;break;case"reopened":what=`${me} reopened ${comment.author}: ${quote(comment.body)}`;break;case"deleted":what=`${me} deleted ${comment.author}: ${quote(comment.body)}`;break;default:what=quote(comment.body)}let state=root?`status ${root.status}${root.answer?`, answer ${quote(root.answer)}`:""}`:"";lines.push(`- ${where}, ${pinText(root,anchorNoun)}: ${what}${state?`; ${state}`:""} (thread ${thread})`)}return changes.length||lines.push("- No changes."),lines.join(`
14
+ `)}function applyCommentPatches(comments,patches){return comments.map(comment=>{let patch=patches[comment.recordKey];return!patch||patch.revision!=null&&comment.revision>=patch.revision?comment:{...comment,...patch.fields,revision:Math.max(comment.revision,patch.revision??0)}})}var COMMENT_CHECK_ANSWERS=["Looks good","Undo"],COMMENT_TEXT_FILE=/\.(txt|md|markdown|csv|tsv|json|ya?ml|html?|xml|srt|vtt)$/i;function clipCommentAnswer(body){return body.length>500?`${body.slice(0,497)}...`:body}function newCommentId(){return typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`}function commentRelativeTime(iso,locale,now){let at=commentTimeOf(iso);if(!Number.isFinite(at))return"";let seconds=Math.round((at-now)/1e3),format=new Intl.RelativeTimeFormat(locale,{numeric:"auto",style:"short"}),abs=Math.abs(seconds);return abs<45?format.format(0,"second"):abs<3600?format.format(Math.round(seconds/60),"minute"):abs<86400?format.format(Math.round(seconds/3600),"hour"):format.format(Math.round(seconds/86400),"day")}async function writeCommentClipboard(text,host){try{if(typeof navigator<"u"&&navigator.clipboard?.writeText)return await navigator.clipboard.writeText(text),!0}catch{}if(!host)return!1;try{let doc=host.ownerDocument,area=doc.createElement("textarea");area.value=text,area.setAttribute("readonly",""),area.style.position="absolute",area.style.opacity="0",area.style.pointerEvents="none",host.appendChild(area),area.select();let ok=doc.execCommand("copy");return area.remove(),ok}catch{return!1}}function scrollCommentIntoView(element){let view=element.ownerDocument.defaultView;if(!view)return;let box=element.parentElement;for(;box&&box.tagName!=="BODY";){let style=view.getComputedStyle(box);if(/(auto|scroll)/.test(style.overflowY)&&box.scrollHeight>box.clientHeight+1)break;box=box.parentElement}if(!box||box.tagName==="BODY")return;let outer=box.getBoundingClientRect(),at=element.getBoundingClientRect(),delta=at.top<outer.top?at.top-outer.top-8:at.bottom>outer.bottom?at.bottom-outer.bottom+8:0;delta&&typeof box.scrollBy=="function"&&box.scrollBy({top:delta,behavior:"smooth"})}var COMMENT_WORDS=Object.freeze({comments:w("Comments","Commentaires"),thisAnchor:w("This item","Cet \xE9l\xE9ment"),all:w("All","Tous"),open:w("Open","Ouverts"),resolved:w("Resolved","R\xE9solu"),resolvedFilter:w("Resolved","R\xE9solus"),status:w("Status","Statut"),scope:w("Show","Afficher"),copy:w("Copy changes since last turn","Copier depuis le dernier tour"),copiedOne:w("Copied 1 change","1 changement copi\xE9"),copiedMany:w("Copied {n} changes","{n} changements copi\xE9s"),copyFailed:w("Could not copy. Try again.","Copie impossible. R\xE9essaie."),anchorLabel:w("Item {n}","\xC9l\xE9ment {n}"),reply:w("Reply","R\xE9pondre"),replyToReopen:w("Reply to reopen","R\xE9pondre pour rouvrir"),newComment:w("New comment","Nouveau commentaire"),newCommentOn:w("New comment on item {n}","Nouveau commentaire sur l\u2019\xE9l\xE9ment {n}"),newCommentWhole:w("New comment on all of item {n}","Nouveau commentaire sur tout l\u2019\xE9l\xE9ment {n}"),commentOnAnchor:w("Comment on all of item {n}","Commenter tout l\u2019\xE9l\xE9ment {n}"),pinHint:w("Click where the comment goes.","Clique l\xE0 o\xF9 va le commentaire."),zoneHint:w("Click to pin a spot, or hold and drag to mark a zone.","Clique pour \xE9pingler un point, ou maintiens et fais glisser pour marquer une zone."),commentPlaceholder:w("Add a comment","Ajouter un commentaire"),send:w("Send","Envoyer"),cancel:w("Cancel","Annuler"),resolve:w("Resolve","R\xE9soudre"),reopen:w("Reopen","Rouvrir"),delete:w("Delete","Supprimer"),deleteTitle:w("Delete this comment thread?",`Supprimer ce fil de commentaires${NNBSP}?`),deleteBody:w("It disappears from the page. The next copy still tells agents you deleted it.","Il dispara\xEEt de la page. La prochaine copie indique quand m\xEAme aux agents que tu l\u2019as supprim\xE9."),needs:w("{who} needs","{who} a besoin de"),needCheck:w("Your check on the change","Ta validation du changement"),needChoice:w("A choice","Un choix"),needInput:w("A file or text","Un fichier ou du texte"),looksGood:w("Looks good","\xC7a me va"),undo:w("Undo","Annuler le changement"),attach:w("Attach a file","Joindre un fichier"),paste:w("Paste text","Coller du texte"),sent:w("{answer}, sent to the agent","{answer}, envoy\xE9 \xE0 l\u2019agent"),example:w("Example","Exemple"),emptyAnchor:w("No comments here yet.","Aucun commentaire ici pour le moment."),emptyAll:w("No comments yet.","Aucun commentaire pour le moment."),emptyResolved:w("No resolved comments.","Aucun commentaire r\xE9solu."),saveError:w("Could not save that change. Try again.","Impossible d\u2019enregistrer ce changement. R\xE9essaie."),textOnly:w("Only text files can be attached here.","Seuls les fichiers texte peuvent \xEAtre joints ici."),newActivity:w("New since last turn","Nouveau depuis le dernier tour"),pin:w("{who}: {body}",`{who}${NNBSP}: {body}`),zone:w("{who}, on a zone: {body}",`{who}, sur une zone${NNBSP}: {body}`)});function commentWords(overrides){return overrides?Object.freeze({...COMMENT_WORDS,...overrides}):COMMENT_WORDS}function commentCopiedWords(words,n){return n===1?words.copiedOne:fillWords(words.copiedMany,{n})}import{useCallback as useCallback19,useEffect as useEffect24,useMemo as useMemo20,useRef as useRef23,useState as useState23}from"react";var ZONE_MIN_PX=4,NO_ANCHORS=Object.freeze([]);function useComments(options={}){let{list="comments",database="comments",scope=null,anchors=NO_ANCHORS,anchorKey=null,me="Flo",authors,fallbackAuthor="Notis",pageSize=500,live=!0}=options,runtime=useNotisRuntime(),locale=useToolkitLocale(),words=useMemo20(()=>commentWords(options.words),[options.words]),say=useCallback19((key,vars)=>pick(vars?fillWords(words[key],vars):words[key],locale),[words,locale]),columns=useMemo20(()=>commentColumns(options.columns),[options.columns]),latest=useRef23(options);latest.current=options;let query=useShown(list,{pageSize}),refetch=query.refetch,refetchRef=useRef23(refetch);refetchRef.current=refetch,useEffect24(()=>{if(!live||!runtime?.subscribeDatabase)return;let stop2=runtime.subscribeDatabase(database,()=>{refetchRef.current()});return()=>{stop2?.()}},[runtime,database,live]);let insertMutation=useNativeMutation(database,"insert"),updateMutation=useNativeMutation(database,"update"),toaster=useToast(),notify=toaster.notify,[patches,setPatches]=useState23({}),[drafts,setDrafts]=useState23([]),[busy,setBusy]=useState23(()=>new Set),[marker,setMarker]=useState23(null),authorsKey=authors?.join("|")??null,serverComments=useMemo20(()=>commentRowsOf(query.data).map(row=>readCommentRow(row,{columns,authors:authorsKey?.split("|"),fallbackAuthor})),[query.data,columns,authorsKey,fallbackAuthor]),comments=useMemo20(()=>{let serverKeys=new Set(serverComments.map(comment=>comment.recordKey)),pending=drafts.filter(draft=>!draft.serverKey||!serverKeys.has(draft.serverKey)).map(draft=>draft.comment);return[...applyCommentPatches(serverComments,patches),...pending]},[serverComments,patches,drafts]);useEffect24(()=>{let serverKeys=new Set(serverComments.map(comment=>comment.recordKey));setDrafts(current=>current.some(draft=>draft.serverKey&&serverKeys.has(draft.serverKey))?current.filter(draft=>!(draft.serverKey&&serverKeys.has(draft.serverKey))):current),setPatches(current=>{let changed=!1,next={};for(let[key,patch]of Object.entries(current)){let row=serverComments.find(comment=>comment.recordKey===key);if(row&&patch.revision!=null&&row.revision>=patch.revision){changed=!0;continue}next[key]=patch}return changed?next:current})},[serverComments]);let scopeKey=scope?`${scope.id}|${scope.recordKey}`:null,inScope=useMemo20(()=>comments.filter(comment=>inCommentScope(comment,scope)),[comments,scopeKey]),threads=useMemo20(()=>commentThreads(inScope,anchors).filter(thread=>thread.root.status!=="Deleted"),[inScope,anchors]),checkpoint=useMemo20(()=>{let saved=scope?.checkpoint??null;return marker&&(commentTimeOf(saved)||0)<commentTimeOf(marker)?marker:saved},[scope?.checkpoint,marker]),changes=useMemo20(()=>commentChangesSince(inScope,checkpoint,me),[inScope,checkpoint,me]),lastTurn=commentTimeOf(checkpoint)||0,isNew=useCallback19(comment=>comment.author!==me&&(commentTimeOf(comment.createdAt)||0)>lastTurn,[me,lastTurn]),threadsOn=useCallback19(key=>threads.filter(thread=>(thread.anchor?.recordKey??null)===(key??null)),[threads]),numberOf3=useCallback19(thread=>threadsOn(thread.anchor?.recordKey).findIndex(item=>item.root.recordKey===thread.root.recordKey)+1,[threadsOn]),anchor=useMemo20(()=>anchors.find(item=>item.recordKey===anchorKey),[anchors,anchorKey]),[filter,setFilter]=useState23("anchor"),[statusFilter,setStatusFilter]=useState23("open"),[threadKey,setThreadKey]=useState23(null),[draftPin,setDraftPin]=useState23(null),[deleting,setDeleting]=useState23(null),[commenting,setCommentingState]=useState23(!1),[copying,setCopying]=useState23(!1),effectiveFilter=anchors.length?filter:"all",visibleThreads=useMemo20(()=>{let wanted=statusFilter==="resolved"?"Resolved":"Open";return(effectiveFilter==="anchor"?threadsOn(anchorKey):threads).filter(thread=>thread.root.status===wanted)},[effectiveFilter,statusFilter,threadsOn,anchorKey,threads]),selectThread=useCallback19(thread=>{setThreadKey(thread.root.recordKey),setDraftPin(null),setCommentingState(!1),setStatusFilter(thread.root.status==="Resolved"?"resolved":"open"),latest.current.onSelectThread?.(thread)},[]),[now,setNow]=useState23(()=>Date.now());useEffect24(()=>{let id=setInterval(()=>setNow(Date.now()),3e4);return()=>clearInterval(id)},[]);let schemaRevision=query.data?.schema_revision,fail=useCallback19(error=>{console.warn("[comments] write failed",error),notify(words.saveError,{tone:"danger"})},[notify,words]),setBusyKey=useCallback19((key,on)=>setBusy(current=>{let next=new Set(current);return on?next.add(key):next.delete(key),next}),[]),commentsRef=useRef23(comments);commentsRef.current=comments;let patchesRef=useRef23(patches);patchesRef.current=patches;let updateRoot=useCallback19(async(root,fields,properties)=>{if(schemaRevision==null)return fail(new Error("Comments schema revision unknown")),!1;let key=root.recordKey,previous=patchesRef.current[key],revision=commentsRef.current.find(comment=>comment.recordKey===key)?.revision??root.revision;setPatches(current=>({...current,[key]:{fields:{...current[key]?.fields??{},...fields},revision:null}})),setBusyKey(key,!0);try{let receipt=await updateMutation.mutate({record_key:key,expected_revision:revision,properties},{schemaRevision,requestId:newCommentId()});return setPatches(current=>current[key]?{...current,[key]:{...current[key],revision:receipt.revision}}:current),refetch(),!0}catch(error){return setPatches(current=>{let next={...current};return previous?next[key]=previous:delete next[key],next}),fail(error),!1}finally{setBusyKey(key,!1)}},[schemaRevision,updateMutation,refetch,fail,setBusyKey]),changeProps=useCallback19((change,at,extra={})=>({...extra,[columns.change]:change,[columns.changedAt]:at}),[columns]),insert=useCallback19(async fields=>{if(schemaRevision==null)return fail(new Error("Comments schema revision unknown")),!1;let at=new Date().toISOString(),tempKey=`draft-${newCommentId()}`,currentScope=latest.current.scope??null,comment={id:tempKey,recordKey:tempKey,revision:0,body:fields.body,scopeIds:currentScope?[currentScope.id]:[],anchorIds:fields.anchor?[fields.anchor.id]:[],thread:fields.thread,author:me,x:fields.x,y:fields.y,w:columns.w&&columns.h?fields.w:null,h:columns.w&&columns.h?fields.h:null,status:"Open",needs:"none",options:[],answer:"",answeredAt:null,change:fields.change,changedAt:at,example:!1,createdAt:at};setDrafts(current=>[...current,{comment,serverKey:null}]);let properties={[columns.author]:me,[columns.status]:"Open",[columns.needs]:"none",[columns.example]:!1,...changeProps(fields.change,at)};columns.scope&&currentScope&&(properties[columns.scope]=[currentScope.id]),columns.anchor&&fields.anchor&&(properties[columns.anchor]=[fields.anchor.id]),fields.thread&&(properties[columns.thread]=fields.thread),fields.x!=null&&fields.y!=null&&(properties[columns.x]=Number(fields.x.toFixed(4)),properties[columns.y]=Number(fields.y.toFixed(4)),columns.w&&columns.h&&fields.w!=null&&fields.h!=null&&(properties[columns.w]=Number(fields.w.toFixed(4)),properties[columns.h]=Number(fields.h.toFixed(4))));try{let receipt=await insertMutation.mutate({columns:{title:fields.body},properties},{schemaRevision,requestId:newCommentId()});return setDrafts(current=>current.map(draft=>draft.comment.recordKey===tempKey?{...draft,serverKey:receipt.record_key}:draft)),refetch(),receipt.record_key}catch(error){return setDrafts(current=>current.filter(draft=>draft.comment.recordKey!==tempKey)),fail(error),!1}},[schemaRevision,me,columns,changeProps,insertMutation,refetch,fail]),actions=useMemo20(()=>({reply:async(thread,body)=>{let{root}=thread;if(root.recordKey.startsWith("draft-"))return!1;let rootFields={},rootProps={},at=new Date().toISOString();if(root.status==="Resolved"&&(Object.assign(rootFields,{status:"Open",change:"reopened",changedAt:at}),Object.assign(rootProps,changeProps("reopened",at,{[columns.status]:"Open"}))),root.needs==="input"&&!root.answer){let answer=clipCommentAnswer(body);Object.assign(rootFields,{answer,answeredAt:at}),Object.assign(rootProps,{[columns.answer]:answer,[columns.answeredAt]:at})}let[inserted]=await Promise.all([insert({body,anchor:thread.anchor,thread:root.recordKey,x:null,y:null,w:null,h:null,change:"replied"}),Object.keys(rootProps).length?updateRoot(root,rootFields,rootProps):Promise.resolve(!0)]);return inserted&&root.status==="Resolved"&&setStatusFilter("open"),!!inserted},answer:(root,answer)=>{let at=new Date().toISOString();updateRoot(root,{answer,answeredAt:at,change:"answered",changedAt:at},changeProps("answered",at,{[columns.answer]:answer,[columns.answeredAt]:at}))},setStatus:(root,status)=>{let at=new Date().toISOString(),change=status==="Resolved"?"resolved":"reopened";updateRoot(root,{status,change,changedAt:at},changeProps(change,at,{[columns.status]:status}))},askDelete:root=>setDeleting(root),notify:text=>notify(text)}),[insert,updateRoot,changeProps,columns,notify]),confirmDelete=useCallback19(async()=>{let root=deleting;if(!root)return;let at=new Date().toISOString();setDeleting(null),setThreadKey(current=>current===root.recordKey?null:current),await updateRoot(root,{status:"Deleted",change:"deleted",changedAt:at},changeProps("deleted",at,{[columns.status]:"Deleted"}))},[deleting,updateRoot,changeProps,columns]),placePin=useCallback19((key,x,y,w2=null,h=null)=>{setCommentingState(!1),setDraftPin({anchorKey:key,x,y,w:x==null||y==null?null:w2,h:x==null||y==null?null:h}),setThreadKey(null),setFilter("anchor"),setStatusFilter("open")},[]),placePinFromEvent=useCallback19((event,key)=>{if(!commenting)return!1;let rect=event.currentTarget.getBoundingClientRect(),x=rect.width?Math.min(1,Math.max(0,(event.clientX-rect.left)/rect.width)):.5,y=rect.height?Math.min(1,Math.max(0,(event.clientY-rect.top)/rect.height)):.5;return placePin(key,x,y),!0},[commenting,placePin]),cancelPin=useCallback19(()=>setDraftPin(null),[]),zones=!!(columns.w&&columns.h),[dragZone,setDragZone]=useState23(null),dragRef=useRef23(null),endDrag=useCallback19(()=>{dragRef.current=null,setDragZone(null)},[]),zoneHandlers=useCallback19(key=>{let zoneOf=(drag,clientX,clientY)=>{let{rect}=drag,clamp2=value=>Math.min(1,Math.max(0,value)),ax=clamp2((drag.x0-rect.left)/(rect.width||1)),ay=clamp2((drag.y0-rect.top)/(rect.height||1)),bx=clamp2((clientX-rect.left)/(rect.width||1)),by=clamp2((clientY-rect.top)/(rect.height||1));return{anchorKey:drag.key,x:Math.min(ax,bx),y:Math.min(ay,by),w:Math.abs(bx-ax),h:Math.abs(by-ay)}};return{onPointerDown:event=>{if(!(!commenting||event.button!==0)){event.preventDefault(),event.stopPropagation();try{event.currentTarget.setPointerCapture(event.pointerId)}catch{}dragRef.current={key,rect:event.currentTarget.getBoundingClientRect(),x0:event.clientX,y0:event.clientY,pointerId:event.pointerId,moved:!1}}},onPointerMove:event=>{let drag=dragRef.current;!drag||drag.pointerId!==event.pointerId||!zones||!drag.moved&&Math.abs(event.clientX-drag.x0)<ZONE_MIN_PX&&Math.abs(event.clientY-drag.y0)<ZONE_MIN_PX||(drag.moved=!0,setDragZone(zoneOf(drag,event.clientX,event.clientY)))},onPointerUp:event=>{let drag=dragRef.current;if(!drag||drag.pointerId!==event.pointerId)return;event.stopPropagation();let{rect}=drag,wide=Math.abs(event.clientX-drag.x0)>=ZONE_MIN_PX&&rect.width>0,high=Math.abs(event.clientY-drag.y0)>=ZONE_MIN_PX&&rect.height>0;if(endDrag(),zones&&drag.moved&&wide&&high){let zone=zoneOf(drag,event.clientX,event.clientY);placePin(drag.key,zone.x,zone.y,zone.w,zone.h);return}let x=rect.width?Math.min(1,Math.max(0,(drag.x0-rect.left)/rect.width)):.5,y=rect.height?Math.min(1,Math.max(0,(drag.y0-rect.top)/rect.height)):.5;placePin(drag.key,x,y)},onPointerCancel:()=>endDrag()}},[commenting,zones,placePin,endDrag]),sendNew=useCallback19(async body=>{let pin=draftPin;if(!pin||!body.trim())return!1;let target=anchors.find(item=>item.recordKey===pin.anchorKey),key=await insert({body:body.trim(),anchor:target,thread:"",x:pin.x,y:pin.y,w:pin.w,h:pin.h,change:"created"});return key?(setDraftPin(null),setThreadKey(key),!0):!1},[draftPin,anchors,insert]),setCommenting=useCallback19(on=>{on?setDraftPin(null):endDrag(),setCommentingState(on)},[endDrag]),toggleCommenting=useCallback19(()=>{setDraftPin(null),endDrag(),setCommentingState(current=>!current)},[endDrag]);useEscapeLayer(`comments.${database}.mode`,()=>(endDrag(),setCommentingState(!1),!0),{priority:ESCAPE_PRIORITY.selection+2,enabled:commenting});let copyChanges=useCallback19(async host=>{if(!changes.length||copying)return!1;setCopying(!0);let at=new Date().toISOString(),count=changes.length,text=commentDigest({scope:scope?{...scope,checkpoint}:null,comments:inScope,anchors,changes,nowIso:at},{me,columns:options.columns,...latest.current.digest??{}});if(!await writeCommentClipboard(text,host))return notify(words.copyFailed,{tone:"danger"}),setCopying(!1),!1;notify(commentCopiedWords(words,count));let previous=marker;setMarker(at);try{await latest.current.onCheckpoint?.(at)}catch(error){setMarker(previous),fail(error)}finally{setCopying(!1)}return!0},[changes,copying,scope,checkpoint,inScope,anchors,me,options.columns,notify,words,marker,fail]);return{comments:inScope,threads,visibleThreads,changes,checkpoint,isNew,threadsOn,numberOf:numberOf3,scope,anchors,anchorKey,anchor,filter:effectiveFilter,setFilter,statusFilter,setStatusFilter,threadKey,setThreadKey,selectThread,actions,commenting,setCommenting,toggleCommenting,draftPin,placePin,placePinFromEvent,cancelPin,sendNew,zones,dragZone,zoneHandlers,deleting,cancelDelete:()=>setDeleting(null),confirmDelete,copyChanges,copying,busy,now,toaster,words,say,locale,me,loading:query.loading&&!query.hasData,hasData:query.hasData,error:query.error??null,refetch}}import{useEffect as useEffect25,useRef as useRef24,useState as useState24}from"react";import{Fragment as Fragment13,jsx as jsx28,jsxs as jsxs24}from"react/jsx-runtime";function CommentAvatar({author,me,className}){return jsx28("span",{"aria-hidden":"true",className:cx("nui-comment-avatar",className),"data-me":author===me?"":void 0,children:(author.trim().slice(0,1)||"?").toUpperCase()})}function IconAction({label,icon,onClick,disabled}){return jsx28(Tooltip,{label,children:jsx28(Button,{variant:"ghost",size:"sm",className:"nui-comment-icon-btn","aria-label":label,disabled,onClick,icon:jsx28(Icon,{name:icon})})})}function answerLabel(controller,answer){return answer===COMMENT_CHECK_ANSWERS[0]?controller.say("looksGood"):answer===COMMENT_CHECK_ANSWERS[1]?controller.say("undo"):answer}function stop(event){event.stopPropagation()}function sendsOnEnter(event){return event.key==="Enter"&&!event.shiftKey&&!event.nativeEvent.isComposing}function CommentThreadCard({controller,thread,showAnchor=!1}){let{root,replies,anchor}=thread,{actions,locale,now,isNew,me}=controller,[draft,setDraft]=useState24(""),[sending,setSending]=useState24(!1),replyRef=useRef24(null),fileRef=useRef24(null),cardRef=useRef24(null),resolved=root.status==="Resolved",selected=controller.threadKey===root.recordKey,busy=controller.busy.has(root.recordKey),number=controller.numberOf(thread);useEffect25(()=>{selected&&cardRef.current&&scrollCommentIntoView(cardRef.current)},[selected]);let send=async()=>{let body=draft.trim();if(!body||sending)return;setSending(!0);let ok=await actions.reply(thread,body);setSending(!1),ok&&setDraft("")},attach=async file=>{if(!file)return;if(!(file.type.startsWith("text/")||COMMENT_TEXT_FILE.test(file.name))){actions.notify(controller.words.textOnly);return}let content=(await file.text()).slice(0,8e3);setDraft(current=>`${current?`${current}
15
+
16
+ `:""}${file.name}
17
+ ${content}`),replyRef.current?.focus()},select=()=>controller.selectThread(thread),onCardKey=event=>{event.target===event.currentTarget&&(event.key==="Enter"||event.key===" ")&&(event.preventDefault(),select())},needsLabel=root.needs==="check"?controller.say("needCheck"):root.needs==="choice"?controller.say("needChoice"):controller.say("needInput"),choices=root.needs==="check"?[...COMMENT_CHECK_ANSWERS]:root.options,meta=[commentRelativeTime(root.createdAt,locale,now),showAnchor&&anchor?controller.say("anchorLabel",{n:anchor.order}):"",number>0&&root.x!=null?`#${number}`:""].filter(Boolean).join(" \xB7 "),replyLabel=resolved?controller.say("replyToReopen"):controller.say("reply"),newDot=comment=>isNew(comment)?jsx28("span",{className:"nui-comment-new",role:"img","aria-label":controller.say("newActivity")}):null;return jsxs24("article",{ref:cardRef,className:"nui-comment-card","data-thread":root.recordKey,"data-selected":selected?"":void 0,"data-resolved":resolved?"":void 0,"aria-current":selected?"true":void 0,"aria-label":controller.say("pin",{who:root.author,body:root.body}),tabIndex:0,onClick:select,onKeyDown:onCardKey,children:[jsxs24("header",{className:"nui-comment-head",children:[jsx28(CommentAvatar,{author:root.author,me}),jsxs24("div",{className:"nui-comment-who",children:[jsx28("span",{className:"nui-comment-author",children:root.author}),jsx28("span",{className:"nui-comment-meta",children:meta}),newDot(root)]}),jsxs24("div",{className:"nui-comment-actions",onClick:stop,onKeyDown:stop,children:[resolved?jsx28(IconAction,{label:controller.say("reopen"),icon:"arrow-counter-clockwise",disabled:busy,onClick:()=>actions.setStatus(root,"Open")}):jsx28(IconAction,{label:controller.say("resolve"),icon:"check",disabled:busy,onClick:()=>actions.setStatus(root,"Resolved")}),jsx28(IconAction,{label:controller.say("delete"),icon:"trash",disabled:busy,onClick:()=>actions.askDelete(root)})]})]}),root.example||resolved?jsxs24("div",{className:"nui-comment-badges",children:[root.example?jsx28(Badge,{children:controller.words.example}):null,resolved?jsx28(Badge,{children:controller.words.resolved}):null]}):null,jsx28("p",{className:"nui-comment-body",children:root.body}),root.needs!=="none"?jsxs24("div",{className:"nui-comment-ask",onClick:stop,onKeyDown:stop,children:[jsxs24("p",{className:"nui-comment-ask-label",children:[jsx28("span",{className:"nui-comment-ask-who",children:controller.say("needs",{who:root.author})})," ",needsLabel]}),root.answer?jsxs24("p",{className:"nui-comment-answer",children:[jsx28(Icon,{name:"check"}),jsx28("span",{children:controller.say("sent",{answer:answerLabel(controller,root.answer)})})]}):root.needs==="input"?jsxs24("div",{className:"nui-comment-choices",children:[jsx28(Button,{size:"sm",variant:"secondary",disabled:busy,icon:"paperclip",onClick:()=>fileRef.current?.click(),children:controller.words.attach}),jsx28(Button,{size:"sm",variant:"secondary",disabled:busy,icon:"clipboard-text",onClick:()=>replyRef.current?.focus(),children:controller.words.paste}),jsx28("input",{ref:fileRef,type:"file",className:"nui-sr-only",tabIndex:-1,"aria-hidden":"true",accept:"text/*,.md,.txt,.csv,.json",onChange:event=>{attach(event.target.files?.[0]),event.target.value=""}})]}):jsx28("div",{className:"nui-comment-choices",role:"group","aria-label":needsLabel,children:choices.map(choice=>jsx28(Button,{size:"sm",variant:"secondary",disabled:busy,onClick:()=>actions.answer(root,choice),children:answerLabel(controller,choice)},choice))})]}):null,replies.length?jsx28("ol",{className:"nui-comment-replies",children:replies.map(reply=>jsxs24("li",{className:"nui-comment-reply",children:[jsx28(CommentAvatar,{author:reply.author,me}),jsxs24("div",{className:"nui-comment-reply-text",children:[jsxs24("div",{className:"nui-comment-who",children:[jsx28("span",{className:"nui-comment-author",children:reply.author}),jsx28("span",{className:"nui-comment-meta",children:commentRelativeTime(reply.createdAt,locale,now)}),newDot(reply)]}),jsx28("p",{className:"nui-comment-body",children:reply.body})]})]},reply.recordKey))}):null,jsxs24("div",{className:"nui-comment-compose",onClick:stop,onKeyDown:stop,children:[jsx28("textarea",{ref:replyRef,className:"nui-comment-input",value:draft,rows:1,placeholder:replyLabel,"aria-label":replyLabel,onChange:event=>setDraft(event.target.value),onKeyDown:event=>{sendsOnEnter(event)&&(event.preventDefault(),send())}}),jsx28(IconAction,{label:controller.say("send"),icon:"paper-plane-right",disabled:!draft.trim()||sending,onClick:()=>{send()}})]})]})}function NewCommentBox({controller}){let pin=controller.draftPin,[body,setBody]=useState24(""),[sending,setSending]=useState24(!1),ref=useRef24(null),cancel=controller.cancelPin,where=pin?.anchorKey??null;if(useEffect25(()=>{ref.current?.focus({preventScroll:!0})},[where]),useEscapeLayer("comments.new",()=>(cancel(),!0),{priority:ESCAPE_PRIORITY.selection+1,enabled:pin!=null}),!pin)return null;let anchor=controller.anchors.find(item=>item.recordKey===pin.anchorKey),heading=anchor&&pin.x==null?controller.say("newCommentWhole",{n:anchor.order}):anchor?controller.say("newCommentOn",{n:anchor.order}):controller.say("newComment"),send=async()=>{if(!body.trim()||sending)return;setSending(!0);let ok=await controller.sendNew(body.trim());setSending(!1),ok&&setBody("")};return jsxs24("div",{className:"nui-comment-new-box",role:"group","aria-label":heading,children:[jsx28("p",{className:"nui-comment-new-title",children:heading}),jsx28("textarea",{ref,className:"nui-comment-input",value:body,rows:2,placeholder:controller.say("commentPlaceholder"),"aria-label":controller.say("commentPlaceholder"),onChange:event=>setBody(event.target.value),onKeyDown:event=>{sendsOnEnter(event)&&(event.preventDefault(),send()),event.key==="Escape"&&!event.nativeEvent.isComposing&&(event.preventDefault(),body.trim()?event.currentTarget.blur():cancel())}}),jsxs24("div",{className:"nui-comment-new-actions",children:[jsx28(Button,{size:"sm",variant:"ghost",onClick:cancel,children:controller.words.cancel}),jsx28(Button,{size:"sm",variant:"primary",disabled:!body.trim()||sending,icon:"paper-plane-right",onClick:()=>{send()},children:controller.words.send})]})]})}function CommentPins({controller,anchorKey,onOpen}){let key=anchorKey===void 0?controller.anchorKey:anchorKey,pins=controller.threadsOn(key).filter(thread=>thread.root.x!=null&&thread.root.y!=null),draft=controller.draftPin,drag=controller.dragZone,here=key??null,open=(event,thread)=>{event.stopPropagation(),onOpen?onOpen(thread):controller.selectThread(thread)},box=zone=>({left:`${zone.x*100}%`,top:`${zone.y*100}%`,width:`${zone.w*100}%`,height:`${zone.h*100}%`});return jsxs24(Fragment13,{children:[controller.commenting?jsx28("div",{className:"nui-comment-capture","aria-hidden":"true",...controller.zoneHandlers(here),onClick:event=>event.stopPropagation()}):null,pins.filter(thread=>isCommentZone(thread.root)).map(thread=>jsx28("span",{className:"nui-comment-zone","aria-hidden":"true","data-selected":thread.root.recordKey===controller.threadKey?"":void 0,"data-resolved":thread.root.status==="Resolved"?"":void 0,style:box({x:thread.root.x,y:thread.root.y,w:thread.root.w,h:thread.root.h})},`zone-${thread.root.recordKey}`)),pins.map(thread=>jsx28("button",{type:"button",className:"nui-comment-pin","data-agent":thread.root.author!==controller.me?"":void 0,"data-selected":thread.root.recordKey===controller.threadKey?"":void 0,"data-resolved":thread.root.status==="Resolved"?"":void 0,style:{left:`${thread.root.x*100}%`,top:`${thread.root.y*100}%`},"aria-label":controller.say(isCommentZone(thread.root)?"zone":"pin",{who:thread.root.author,body:thread.root.body}),onClick:event=>open(event,thread),children:controller.numberOf(thread)},thread.root.recordKey)),drag&&drag.anchorKey===here?jsx28("span",{className:"nui-comment-zone","data-draft":"","data-selected":"","aria-hidden":"true",style:box(drag)}):null,draft&&draft.anchorKey===here&&draft.x!=null&&draft.y!=null?jsxs24(Fragment13,{children:[isCommentZone(draft)?jsx28("span",{className:"nui-comment-zone","data-draft":"","data-selected":"","aria-hidden":"true",style:box({x:draft.x,y:draft.y,w:draft.w,h:draft.h})}):null,jsx28("span",{className:"nui-comment-pin","data-draft":"","data-selected":"","aria-hidden":"true",style:{left:`${draft.x*100}%`,top:`${draft.y*100}%`},children:"+"})]}):null]})}function CommentPane({controller,title,showCopy=!0,className}){let rootRef=useRef24(null),heading=title??controller.say("comments"),{threads,visibleThreads,changes,draftPin,filter,statusFilter,anchors,anchorKey}=controller,scoped=filter==="anchor"?controller.threadsOn(anchorKey):threads,openCount=scoped.filter(thread=>thread.root.status==="Open").length,resolvedCount=scoped.filter(thread=>thread.root.status==="Resolved").length,emptyTitle=statusFilter==="resolved"?controller.say("emptyResolved"):filter==="anchor"?controller.say("emptyAnchor"):controller.say("emptyAll");return jsxs24("aside",{ref:rootRef,className:cx("nui-comment-pane",className),"aria-label":heading,children:[jsxs24("div",{className:"nui-comment-pane-head",children:[jsx28("h2",{className:"nui-comment-pane-title",children:heading}),anchors.length?jsx28(SegmentedControl,{label:controller.words.scope,value:filter,onChange:value=>controller.setFilter(value),options:[{value:"anchor",label:controller.words.thisAnchor,count:controller.threadsOn(anchorKey).length},{value:"all",label:controller.words.all,count:threads.length}]}):null]}),jsx28(SegmentedControl,{label:controller.words.status,value:statusFilter,onChange:value=>controller.setStatusFilter(value),options:[{value:"open",label:controller.words.open,count:openCount},{value:"resolved",label:controller.words.resolvedFilter,count:resolvedCount}]}),showCopy?jsxs24(Button,{variant:"secondary",className:"nui-comment-copy",icon:"copy",disabled:!changes.length||controller.copying,onClick:()=>{controller.copyChanges(rootRef.current)},children:[jsx28("span",{className:"nui-comment-copy-label",children:controller.say("copy")}),jsx28("span",{className:"nui-comment-count",children:changes.length})]}):null,draftPin?jsx28(NewCommentBox,{controller}):anchors.length&&controller.anchor?jsxs24("div",{className:"nui-comment-start",children:[jsx28(Button,{variant:"secondary",icon:"chat-circle-text",onClick:()=>controller.placePin(anchorKey,null,null),children:controller.say("commentOnAnchor",{n:controller.anchor.order})}),controller.commenting?jsx28("p",{className:"nui-comment-hint",children:controller.say(controller.zones?"zoneHint":"pinHint")}):null]}):null,visibleThreads.length?jsx28("div",{className:"nui-comment-list",children:visibleThreads.map(thread=>jsx28(CommentThreadCard,{controller,thread,showAnchor:filter==="all"},thread.root.recordKey))}):!draftPin&&!controller.loading?jsx28(EmptyState,{className:"nui-comment-empty",icon:"chat-circle-text",title:emptyTitle}):null,jsx28(Dialog,{open:controller.deleting!=null,onClose:controller.cancelDelete,title:controller.say("deleteTitle"),description:controller.say("deleteBody"),role:"alertdialog",children:jsxs24("div",{className:"nui-comment-dialog-actions",children:[jsx28(Button,{variant:"ghost","data-dialog-cancel":"",onClick:controller.cancelDelete,children:controller.words.cancel}),jsx28(Button,{variant:"danger","data-dialog-confirm":"",onClick:()=>{controller.confirmDelete()},children:controller.words.delete})]})}),jsx28(ActionToast,{toast:controller.toaster.toast,onUndo:()=>{controller.toaster.undo()},onDismiss:controller.toaster.dismiss})]})}var PRESENT_WORDS=Object.freeze({audienceTitle:{en:"Presentation",fr:"Pr\xE9sentation"},fillScreen:{en:"Click to fill this screen",fr:"Clique pour remplir cet \xE9cran"},dragToScreen:{en:"Drag this window to the other screen, then click to fill it",fr:"Fais glisser cette fen\xEAtre sur l\u2019autre \xE9cran, puis clique pour la remplir"},pressAgain:{en:"Press Present again to show it on the other screen",fr:"Appuie de nouveau sur Pr\xE9senter pour l\u2019afficher sur l\u2019autre \xE9cran"},blocked:{en:"The presentation window was blocked. Allow pop-ups for Notis, then press Present again.",fr:"La fen\xEAtre de pr\xE9sentation a \xE9t\xE9 bloqu\xE9e. Autorise les fen\xEAtres pop-up pour Notis, puis appuie de nouveau sur Pr\xE9senter."},onOtherScreen:{en:"Showing on the other screen",fr:"Affich\xE9 sur l\u2019autre \xE9cran"}});var AUDIENCE_WINDOW_NAME="notis-presenter-audience";function hasSecondScreen(win){return win?.screen?.isExtended===!0}function sameArea(a,b){return a.availLeft===b.availLeft&&a.availTop===b.availTop&&a.availWidth===b.availWidth&&a.availHeight===b.availHeight}function pickAudienceScreen(screens,current){let others=screens.filter(screen=>!(current&&(screen===current||sameArea(screen,current))));return others.length===0?null:[...others].sort((a,b)=>{let external=+(a.isInternal===!0)-+(b.isInternal===!0);return external!==0?external:b.availWidth*b.availHeight-a.availWidth*a.availHeight})[0]}function audienceFeatures(screen){if(!screen)return"popup,width=960,height=540";let{availLeft:left,availTop:top,availWidth:width,availHeight:height}=screen;return`popup,left=${Math.round(left)},top=${Math.round(top)},width=${Math.round(width)},height=${Math.round(height)}`}var KEY_ACTIONS=Object.freeze({ArrowRight:"next",ArrowDown:"next",PageDown:"next"," ":"next",Enter:"next",ArrowLeft:"previous",ArrowUp:"previous",PageUp:"previous",Home:"first",End:"last",Escape:"stop"}),FIELD='input,textarea,select,[contenteditable=""],[contenteditable="true"]',ACTIVE="a[href],button,label,summary,details,video,audio,[role=button],[role=link],[role=tab],[onclick],[tabindex]";function inside(target,selector){let element=target;return!!(element&&typeof element.closest=="function"&&element.closest(selector))}function keyAction(event){let action=KEY_ACTIONS[event.key];return!action||event.defaultPrevented||event.altKey||event.ctrlKey||event.metaKey||inside(event.target,FIELD)||(event.key===" "||event.key==="Enter")&&inside(event.target,ACTIVE)?null:action}function clickHasOwnTarget(target){return inside(target,FIELD)||inside(target,ACTIVE)}function fillsScreen(win){if(win.document.fullscreenElement)return!0;let{width,height}=win.screen;return width>0&&height>0&&win.innerWidth>=width-1&&win.innerHeight>=height-1}function sheetText2(sheet){try{return Array.from(sheet.cssRules,rule=>rule.cssText).join(`
18
+ `)}catch{return""}}function copyNodes(target,source){for(let node of Array.from(source.querySelectorAll('link[rel~="stylesheet"],style')))if(node.localName==="link"){let link=target.createElement("link");link.rel="stylesheet",link.href=node.href;let media=node.getAttribute("media");media&&(link.media=media),target.head.append(link)}else{let style=target.createElement("style");style.textContent=node.textContent,target.head.append(style)}}function copyAdopted(target,sheets){for(let sheet of sheets??[]){let text=sheetText2(sheet);if(!text)continue;let style=target.createElement("style");style.textContent=text,target.head.append(style)}}function copyStylesInto(target,source,shadowRoot){copyNodes(target,source),copyAdopted(target,source.adoptedStyleSheets),shadowRoot&&(copyNodes(target,shadowRoot),copyAdopted(target,shadowRoot.adoptedStyleSheets));let from=source.documentElement,to=target.documentElement;from.className&&(to.className=from.className);let style=from.getAttribute("style");style?to.setAttribute("style",style):to.removeAttribute("style")}import{useCallback as useCallback20,useEffect as useEffect26,useRef as useRef25,useState as useState25}from"react";import{createPortal as createPortal6}from"react-dom";import{jsx as jsx29,jsxs as jsxs25}from"react/jsx-runtime";async function windowManagementState(win){if(typeof win.getScreenDetails!="function")return"unsupported";try{return(await win.navigator.permissions.query({name:"window-management"})).state}catch{return"prompt"}}async function screenDetails(win){try{return await win.getScreenDetails()}catch{return null}}var AUDIENCE_BASE_CSS=["html,body{height:100%;margin:0;overflow:hidden;background:hsl(0 0% 0%)}","[data-notis-audience-root]{position:fixed;inset:0;display:flex;flex-direction:column}"].join("");function setUpWindow(win,anchor,title,locale){let doc=win.document,root=anchor?.getRootNode(),shadow=typeof ShadowRoot<"u"&&root instanceof ShadowRoot?root:null;doc.head.replaceChildren();let charset=doc.createElement("meta");charset.setAttribute("charset","utf-8"),doc.head.append(charset),doc.title=title,doc.documentElement.lang=locale,copyStylesInto(doc,document,shadow);let base=doc.createElement("style");base.textContent=AUDIENCE_BASE_CSS,doc.head.append(base);let appRoot=anchor?.closest("[data-notis-app-root]")??null,container=doc.createElement("div");container.setAttribute("data-notis-app-root",""),container.setAttribute("data-notis-audience-root","");let theme=appRoot?.getAttribute("data-notis-theme");theme&&container.setAttribute("data-notis-theme",theme);let style=appRoot?.getAttribute("style");style&&container.setAttribute("style",style);let layer=doc.createElement("div");return layer.setAttribute(LAYER_ROOT_ATTRIBUTE,""),doc.body.replaceChildren(container,layer),{win,container,layer,placed:!1}}function AudienceView({audience,children}){let t=useT(),{win}=audience,[filled,setFilled]=useState25(()=>fillsScreen(win));useEffect26(()=>{let update=()=>setFilled(fillsScreen(win));return update(),win.addEventListener("resize",update),win.document.addEventListener("fullscreenchange",update),()=>{win.removeEventListener("resize",update),win.document.removeEventListener("fullscreenchange",update)}},[win]);let fill=useCallback20(event=>{event.preventDefault(),event.stopPropagation(),win.document.documentElement.requestFullscreen?.({navigationUI:"hide"})?.catch(()=>{})},[win]);return jsxs25(LayerRootProvider,{root:audience.layer,children:[children,filled?null:jsx29("button",{type:"button","data-notis-audience-fill":"",onClick:fill,className:"fixed inset-0 z-[1000] flex cursor-pointer items-end justify-center bg-transparent p-8",children:jsx29("span",{className:"rounded-full bg-popover px-4 py-2 text-sm text-popover-foreground shadow-lg ring-1 ring-border",children:t(audience.placed?PRESENT_WORDS.fillScreen:PRESENT_WORDS.dragToScreen)})})]})}function useAudienceScreen(options){let t=useT(),locale=useToolkitLocale(),optionsRef=useRef25(options);optionsRef.current=options;let[secondScreen,setSecondScreen]=useState25(()=>typeof window>"u"?!1:hasSecondScreen(window)),[audience,setAudience]=useState25(null),audienceRef=useRef25(null),teardownRef=useRef25(null);useEffect26(()=>{if(typeof window>"u")return;let screen=window.screen,update=()=>setSecondScreen(hasSecondScreen(window));if(update(),typeof screen.addEventListener=="function")return screen.addEventListener("change",update),()=>screen.removeEventListener?.("change",update)},[]);let finish=useCallback20(closeWindow=>{let current=audienceRef.current;current&&(audienceRef.current=null,teardownRef.current?.(),teardownRef.current=null,closeWindow&&!current.win.closed&&current.win.close(),setAudience(null),optionsRef.current.onClose?.())},[]),close=useCallback20(()=>finish(!0),[finish]),open=useCallback20(async anchor=>{let current=audienceRef.current;if(current&&!current.win.closed)return current.win.focus(),"opened";if(typeof window>"u"||!hasSecondScreen(window))return"one-screen";let state=await windowManagementState(window),target=null;if(state==="granted"||state==="prompt"){let details=await screenDetails(window);details&&(target=pickAudienceScreen(details.screens,details.currentScreen))}let win=window.open("",AUDIENCE_WINDOW_NAME,audienceFeatures(target));if(!win)return state==="prompt"?"press-again":"blocked";let next=setUpWindow(win,anchor??null,t(optionsRef.current.title??PRESENT_WORDS.audienceTitle),locale);next.placed=target!==null;let onKey=event=>{let action=keyAction(event);action&&(event.preventDefault(),optionsRef.current.onAction(action))},onClick=event=>{event.defaultPrevented||event.button!==0||clickHasOwnTarget(event.target)||optionsRef.current.onAction("next")},onContextMenu=event=>{event.defaultPrevented||clickHasOwnTarget(event.target)||(event.preventDefault(),optionsRef.current.onAction("previous"))},onGone=()=>finish(!1),onLeave=()=>finish(!0);win.addEventListener("keydown",onKey),win.addEventListener("click",onClick),win.addEventListener("contextmenu",onContextMenu),win.addEventListener("pagehide",onGone),window.addEventListener("pagehide",onLeave);let poll=window.setInterval(()=>{win.closed&&finish(!1)},500);return teardownRef.current?.(),teardownRef.current=()=>{window.clearInterval(poll),window.removeEventListener("pagehide",onLeave),win.removeEventListener("keydown",onKey),win.removeEventListener("click",onClick),win.removeEventListener("contextmenu",onContextMenu),win.removeEventListener("pagehide",onGone)},audienceRef.current=next,setAudience(next),win.focus(),"opened"},[finish,locale,t]);useEffect26(()=>()=>finish(!0),[finish]);let portal=useCallback20(node=>audience?createPortal6(jsx29(AudienceView,{audience,children:node}),audience.container):null,[audience]);return{secondScreen,isOpen:audience!==null,open,close,portal}}export{ACTION_TOAST_MS,ACTION_WORDS,AUDIENCE_WINDOW_NAME,ActionToast,Area2 as Area,AreaChart,AttachmentGallery,BLOCK_WORDS,BOARD_WORDS,Badge,Bar2 as Bar,BarChart,BoardView,Button,CALENDAR_NARROW_MAX,CALENDAR_TRAY_SIDE_MIN,CALENDAR_VIEWS,CALENDAR_WORDS,CHART_WORDS,CHAT_NARROWED_ATTRIBUTE,CHAT_PANEL_DEFAULT_WIDTH_PX,CHAT_PANEL_DESKTOP_MEDIA_QUERY,CHAT_PANEL_KEYBOARD_STEP_PX,CHAT_PANEL_MIN_CONTENT_WIDTH_PX,CHAT_PANEL_MIN_WIDTH_PX,CHAT_PANEL_OVERLAP_PROPERTY,CHAT_PANEL_PAGE_HOVER_DELAY_MS,CHAT_PANEL_PAGE_PEEK_PX,CHAT_PANEL_WIDTH_PROPERTY,CHAT_PANEL_WIDTH_STORAGE_KEY,COMMENT_CHECK_ANSWERS,COMMENT_COLUMNS,COMMENT_TEXT_FILE,COMMENT_WORDS,COMPARES,COMPARE_WORDS,CalendarView,CartesianGrid2 as CartesianGrid,Cell2 as Cell,Chart,ChartContainer,ChartLegend,ChartStyle,ChartTable,ChartTooltip,ChartTooltipContent,CommentAvatar,CommentPane,CommentPins,CommentThreadCard,ComposedChart2 as ComposedChart,DEFAULT_COMPARE,DEFAULT_PRESET,DayPicker,EMPTY_SELECTION,ESCAPE_PRIORITY,EditableFields,EmptyState,FIELDS_ESCAPE_PRIORITY,FIELDS_SAVE_KEYS,FIELD_WORDS,FieldDisclosure,FieldList,FieldLongText,FieldMultiSelect,FieldRow,FieldSelect,FieldText,GALLERY_WORDS,HelpSheet,IDLE_ROW_STATE,IMAGE_VIEWER_ZOOM_LEVELS,Icon,ImageViewer,KeyboardEngine,KeyboardEngineCore,Keycap,KeycapSurface,LAYER_ROOT_ATTRIBUTE,LIST_DRAG_TYPE,LIST_READER_WORDS,LabelList,LayerRootProvider,Legend,Line2 as Line,LineChart,ListReader,ListSkeleton,MANAGER_PHONE_LAYOUT_BELOW_PX,Menu,MenuItem,MenuSeparator,MenuSub,Metric,NativeSelect,NewCommentBox,Notice,NotisKeyClash,OPEN_MODES,OPEN_MODE_CACHE_PREFIX,OPEN_MODE_ICONS,OPEN_MODE_WORDS,OpenAsMenu,OpenModeStoreProvider,PAGE_VIEWPORT_ATTRIBUTE,PANELS_HOVER_DELAY_MS,PANELS_KEYBOARD_STEP_PX,PANELS_LIST_MIN_PX,PANELS_READER_MIN_PX,PANELS_READER_PEEK_PX,PANELS_READER_WANT_PX,PANELS_READER_WANT_WIDE_PX,PANELS_READER_WIDE_FROM_PX,PERIOD_PICKER_TWO_MONTHS_MIN,PERIOD_WORDS,PRESENT_WORDS,PRESETS,PRESET_WORDS,Pagination,Panels,PeriodPicker,Pie,PieChart,Popover,REORDER_DRAG_TYPE,REORDER_WORDS,ROOT_OWNER,ROW_ID_ATTRIBUTE,ROW_INTERACTIVE_SELECTOR,ROW_TIME_WORDS,ReferenceDot,ReferenceLine,RenderChartData,ResponsiveContainer2 as ResponsiveContainer,Row,RowIdContext,RowMore,RowStateContext,SELECTION_BAR_BOOST,SELECTION_BAR_MAX_INLINE,SEQUENCE_TIMEOUT_MS,STAR_WORDS,STATUS_WORDS,Scatter,Section,SegmentedControl,SelectionBar,ShortcutRegistry,ShortcutScope,Sparkline,StarMark,StatRow,StatusIcon,Switch,TABROW_WORDS,TABS_WORDS,TIMELINE_WORDS,TIMELINE_ZOOMS,TabRow,Tabs,TimelineView,ToggleGroup,Tooltip,VS_WORDS,XAxis2 as XAxis,YAxis2 as YAxis,adoptToolkitStyles,applyCommentPatches,audienceFeatures,availableActions,barLabel,barShape,binUnit,dropIndex as boardDropIndex,boardOrder,boardStep,buildBins,chainReorderProps,changedFieldKeys,chatPanelMaxWidth,chatPanelOverlap,chatPanelPageWidth,chatPanelPushLimit,chooseFit,clampChatPanelWidth,clampReaderWidth,clickHasOwnTarget,clipCommentAnswer,commentAnchorOf,commentChangesSince,commentColumns,commentCopiedWords,commentDigest,commentRelativeTime,commentRowsOf,commentThreads,commentTimeOf,commentWords,compareRange,copyStylesInto,createChatPanelEdge,customPeriod,dayCount,dayNumberLabel,detectLocale,detectPlatform,dropIndex2 as dropIndex,failedItemsWords,fillsScreen,findLayerRoot,findRow,formatDateRange,formatDayHeading,formatDelta,formatLongDay,formatMonthYear,formatNumber,formatPeriodParam,formatReaderAgo,formatRowAgo,formatRowTime,formatShortDay,formatValue,fromIsoDay,galleryItemKind,galleryItemName,getOpenModeStore,getSharedInstance,getToolkitStyleSheet,getToolkitStyleText,gridColumns,hasIcon,hasSecondScreen,inCommentScope,intlLocale,isCommentZone,isCompareId,isOpenMode,isPresetId,keyAction,layoutTimeline,localStorageOpenModeStore,metricView,neighbourColumn,newCommentId,normalizeAllowed,normalizePeriod,overlap,pageViewport,panelMath_exports as panelMath,parsePeriodParam,parseRowDate,parseStoredChatPanelWidth,parseStoredWidth,periodRanges,periodSeries,pickAudienceScreen,place,presetRange,pushLimit,rangeBetween,rankActions,readCommentRow,readOpenModeCache,readerMaxWidth,readerWantWidth,registerToolkitStyles,renderIcon,resolveActions,samePeriod,scrollCommentIntoView,selectionReducer,seriesColor,setOpenModeStore,sparkPaths,splitBreakpoint,splitFits,statusGroup,stepCursor,stepTab,successorOf,tabIds,tabPanelProps,timelineWindow,toIsoDay,toggleFieldValue,total,useActions,useAudienceScreen,useChart,useComments,useEngineCore,useEscapeBlocker,useEscapeLayer,useFieldDraft,useHelpSheet,useKeyLabel,useLayerRoot,useListKeys,useMenu,useOpenMode,useOpenModeKey,useOpenModeStore,usePanels,usePeriod,useRegistryVersion,useReorder,useRowState,useSelection,useSelectionBar,useShortcut,useShortcutOwner,useShortcutScope,useShortcuts,useToast,useToolkitLocale,useToolkitPlatform,useToolkitSettings,userSettingsOpenModeStore,weekdayNames,writeCommentClipboard,writeOpenModeCache};