@arbidocs/blocks 0.3.185 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/README.md +100 -0
  2. package/dist/agents/approvals/AuthorizeAgentParts.d.ts +79 -0
  3. package/dist/agents/approvals/ConsentPage.d.ts +76 -0
  4. package/dist/agents/approvals/ConsentParts.d.ts +37 -0
  5. package/dist/agents/approvals/index.d.ts +3 -0
  6. package/dist/agents/config/ConfigField.d.ts +43 -0
  7. package/dist/agents/config/ConfigForm.d.ts +35 -0
  8. package/dist/agents/config/TupleArrayField.d.ts +32 -0
  9. package/dist/agents/config/index.d.ts +4 -0
  10. package/dist/agents/config/schema-utils.d.ts +28 -0
  11. package/dist/agents/definitions/AgentCard.d.ts +63 -0
  12. package/dist/agents/definitions/AgentCreator.d.ts +118 -0
  13. package/dist/agents/definitions/AgentEditorParts.d.ts +63 -0
  14. package/dist/agents/definitions/AgentGallery.d.ts +29 -0
  15. package/dist/agents/definitions/index.d.ts +4 -0
  16. package/dist/agents/index.cjs +595 -0
  17. package/dist/agents/index.cjs.map +1 -0
  18. package/dist/agents/index.d.ts +7 -0
  19. package/dist/agents/index.js +14 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/runs/AgentBar.d.ts +103 -0
  22. package/dist/agents/runs/AgentSteps.d.ts +157 -0
  23. package/dist/agents/runs/SubagentRoster.d.ts +37 -0
  24. package/dist/agents/runs/index.d.ts +3 -0
  25. package/dist/agents/skills/SkillBrowserParts.d.ts +70 -0
  26. package/dist/agents/skills/SkillCard.d.ts +48 -0
  27. package/dist/agents/skills/SkillForms.d.ts +64 -0
  28. package/dist/agents/skills/SkillParts.d.ts +31 -0
  29. package/dist/agents/skills/SkillRow.d.ts +34 -0
  30. package/dist/agents/skills/index.d.ts +5 -0
  31. package/dist/agents/tasks/LiveRunsBanner.d.ts +26 -0
  32. package/dist/agents/tasks/RecurrenceBuilder.d.ts +36 -0
  33. package/dist/agents/tasks/TaskComposer.d.ts +108 -0
  34. package/dist/agents/tasks/TaskPlan.d.ts +78 -0
  35. package/dist/agents/tasks/TaskRowActions.d.ts +43 -0
  36. package/dist/agents/tasks/TaskRunsDialog.d.ts +45 -0
  37. package/dist/agents/tasks/TasksChrome.d.ts +36 -0
  38. package/dist/agents/tasks/UploadTaskItem.d.ts +39 -0
  39. package/dist/agents/tasks/UploadTaskList.d.ts +35 -0
  40. package/dist/agents/tasks/elapsed.d.ts +2 -0
  41. package/dist/agents/tasks/index.d.ts +13 -0
  42. package/dist/agents/tasks/rrule.d.ts +36 -0
  43. package/dist/agents/tasks/taskColumns.d.ts +68 -0
  44. package/dist/agents/tasks/taskLabels.d.ts +26 -0
  45. package/dist/agents/workflows/AgentSelect.d.ts +33 -0
  46. package/dist/agents/workflows/SchemaForm.d.ts +37 -0
  47. package/dist/agents/workflows/WorkflowConfigDialog.d.ts +73 -0
  48. package/dist/agents/workflows/WorkflowLauncher.d.ts +38 -0
  49. package/dist/agents/workflows/index.d.ts +6 -0
  50. package/dist/agents/workflows/types.d.ts +125 -0
  51. package/dist/agents/workflows/workflow.d.ts +62 -0
  52. package/dist/auth/AuthFooter.d.ts +56 -0
  53. package/dist/auth/AuthForm.d.ts +105 -0
  54. package/dist/auth/AuthLayout.d.ts +46 -0
  55. package/dist/auth/PasswordStrengthInput.d.ts +44 -0
  56. package/dist/auth/RecoveryDialogs.d.ts +90 -0
  57. package/dist/auth/SsoLoginButton.d.ts +19 -0
  58. package/dist/auth/index.cjs +123 -0
  59. package/dist/auth/index.cjs.map +1 -0
  60. package/dist/auth/index.d.ts +6 -0
  61. package/dist/auth/index.js +6 -0
  62. package/dist/auth/index.js.map +1 -0
  63. package/dist/builder/AgentsPanel.d.ts +9 -0
  64. package/dist/builder/ModuleManager.d.ts +6 -0
  65. package/dist/builder/VerticalBuilder.d.ts +32 -0
  66. package/dist/builder/agents/store.d.ts +21 -0
  67. package/dist/builder/export.d.ts +30 -0
  68. package/dist/builder/modules/registry.d.ts +11 -0
  69. package/dist/builder/modules/store.d.ts +29 -0
  70. package/dist/builder/modules/types.d.ts +29 -0
  71. package/dist/builder/types.d.ts +28 -0
  72. package/dist/chat/BranchControls.d.ts +33 -0
  73. package/dist/chat/Composer.d.ts +156 -0
  74. package/dist/chat/ContextChip.d.ts +19 -0
  75. package/dist/chat/ContextPanel.d.ts +108 -0
  76. package/dist/chat/ConversationEmpty.d.ts +53 -0
  77. package/dist/chat/ConversationLayout.d.ts +40 -0
  78. package/dist/chat/ConversationParts.d.ts +62 -0
  79. package/dist/chat/ConversationSearchView.d.ts +57 -0
  80. package/dist/chat/LabelPinRow.d.ts +30 -0
  81. package/dist/chat/Message.d.ts +189 -0
  82. package/dist/chat/MessageAlert.d.ts +25 -0
  83. package/dist/chat/MessageList.d.ts +102 -0
  84. package/dist/chat/ModelPicker.d.ts +103 -0
  85. package/dist/chat/PendingAnswerBar.d.ts +36 -0
  86. package/dist/chat/PinnedDocChip.d.ts +22 -0
  87. package/dist/chat/SlashMenu.d.ts +57 -0
  88. package/dist/chat/ThreadMap.d.ts +45 -0
  89. package/dist/chat/index.cjs +423 -0
  90. package/dist/chat/index.cjs.map +1 -0
  91. package/dist/chat/index.d.ts +21 -0
  92. package/dist/chat/index.js +6 -0
  93. package/dist/chat/index.js.map +1 -0
  94. package/dist/chat/test-id.d.ts +16 -0
  95. package/dist/chat/useStreamAnnouncement.d.ts +19 -0
  96. package/dist/chunk-223D4727.cjs +50 -0
  97. package/dist/chunk-223D4727.cjs.map +1 -0
  98. package/dist/chunk-4EZVCGRL.js +803 -0
  99. package/dist/chunk-4EZVCGRL.js.map +1 -0
  100. package/dist/chunk-54Q3RNJU.cjs +516 -0
  101. package/dist/chunk-54Q3RNJU.cjs.map +1 -0
  102. package/dist/chunk-5B4PXAKI.cjs +287 -0
  103. package/dist/chunk-5B4PXAKI.cjs.map +1 -0
  104. package/dist/chunk-5TYEJOXY.js +1762 -0
  105. package/dist/chunk-5TYEJOXY.js.map +1 -0
  106. package/dist/chunk-6ALISABK.cjs +677 -0
  107. package/dist/chunk-6ALISABK.cjs.map +1 -0
  108. package/dist/chunk-6HIPFEID.cjs +574 -0
  109. package/dist/chunk-6HIPFEID.cjs.map +1 -0
  110. package/dist/chunk-76JDDMSP.js +31 -0
  111. package/dist/chunk-76JDDMSP.js.map +1 -0
  112. package/dist/chunk-7F6CBP3Z.js +12 -0
  113. package/dist/chunk-7F6CBP3Z.js.map +1 -0
  114. package/dist/chunk-7G2LJMUG.cjs +45 -0
  115. package/dist/chunk-7G2LJMUG.cjs.map +1 -0
  116. package/dist/chunk-7G3JNSJB.cjs +1809 -0
  117. package/dist/chunk-7G3JNSJB.cjs.map +1 -0
  118. package/dist/chunk-A2YAC22G.js +93 -0
  119. package/dist/chunk-A2YAC22G.js.map +1 -0
  120. package/dist/chunk-ADOKTJHV.cjs +262 -0
  121. package/dist/chunk-ADOKTJHV.cjs.map +1 -0
  122. package/dist/chunk-AXIZ2MDV.js +751 -0
  123. package/dist/chunk-AXIZ2MDV.js.map +1 -0
  124. package/dist/chunk-AZQDNYH4.js +2865 -0
  125. package/dist/chunk-AZQDNYH4.js.map +1 -0
  126. package/dist/chunk-C54XEN5T.cjs +34 -0
  127. package/dist/chunk-C54XEN5T.cjs.map +1 -0
  128. package/dist/chunk-CQCC7LE7.js +210 -0
  129. package/dist/chunk-CQCC7LE7.js.map +1 -0
  130. package/dist/chunk-CRIKTUEU.cjs +47 -0
  131. package/dist/chunk-CRIKTUEU.cjs.map +1 -0
  132. package/dist/chunk-CTZ5745I.js +564 -0
  133. package/dist/chunk-CTZ5745I.js.map +1 -0
  134. package/dist/chunk-DPLRHEJZ.js +78 -0
  135. package/dist/chunk-DPLRHEJZ.js.map +1 -0
  136. package/dist/chunk-DVLEQURC.js +672 -0
  137. package/dist/chunk-DVLEQURC.js.map +1 -0
  138. package/dist/chunk-ELR74ME6.cjs +68 -0
  139. package/dist/chunk-ELR74ME6.cjs.map +1 -0
  140. package/dist/{chunk-DBAUZD7A.cjs → chunk-FZQJ2S6P.cjs} +244 -1123
  141. package/dist/chunk-FZQJ2S6P.cjs.map +1 -0
  142. package/dist/chunk-G3G7LZPM.cjs +205 -0
  143. package/dist/chunk-G3G7LZPM.cjs.map +1 -0
  144. package/dist/chunk-GDFWJ73C.cjs +2973 -0
  145. package/dist/chunk-GDFWJ73C.cjs.map +1 -0
  146. package/dist/chunk-ITGHMJOM.js +5528 -0
  147. package/dist/chunk-ITGHMJOM.js.map +1 -0
  148. package/dist/chunk-K4BGOPGG.js +79 -0
  149. package/dist/chunk-K4BGOPGG.js.map +1 -0
  150. package/dist/chunk-KUA3BCT2.cjs +272 -0
  151. package/dist/chunk-KUA3BCT2.cjs.map +1 -0
  152. package/dist/chunk-LGBAZD37.js +341 -0
  153. package/dist/chunk-LGBAZD37.js.map +1 -0
  154. package/dist/chunk-MHVNT4J3.cjs +15 -0
  155. package/dist/chunk-MHVNT4J3.cjs.map +1 -0
  156. package/dist/chunk-MMYCZRKT.cjs +168 -0
  157. package/dist/chunk-MMYCZRKT.cjs.map +1 -0
  158. package/dist/chunk-NBV56SGU.js +42 -0
  159. package/dist/chunk-NBV56SGU.js.map +1 -0
  160. package/dist/chunk-NPLYHR2E.js +13 -0
  161. package/dist/chunk-NPLYHR2E.js.map +1 -0
  162. package/dist/chunk-NUNKSZKU.js +203 -0
  163. package/dist/chunk-NUNKSZKU.js.map +1 -0
  164. package/dist/chunk-OB5F4577.cjs +40 -0
  165. package/dist/chunk-OB5F4577.cjs.map +1 -0
  166. package/dist/chunk-OUW6G4O2.cjs +96 -0
  167. package/dist/chunk-OUW6G4O2.cjs.map +1 -0
  168. package/dist/chunk-OVEQERPO.js +66 -0
  169. package/dist/chunk-OVEQERPO.js.map +1 -0
  170. package/dist/chunk-P6GHJSLR.js +34 -0
  171. package/dist/chunk-P6GHJSLR.js.map +1 -0
  172. package/dist/chunk-PCB2BPN3.cjs +41 -0
  173. package/dist/chunk-PCB2BPN3.cjs.map +1 -0
  174. package/dist/chunk-PPCATBOY.cjs +15 -0
  175. package/dist/chunk-PPCATBOY.cjs.map +1 -0
  176. package/dist/chunk-QN42OA5J.js +887 -0
  177. package/dist/chunk-QN42OA5J.js.map +1 -0
  178. package/dist/{chunk-FZ2S6VAZ.js → chunk-RBXZYNVB.js} +223 -1102
  179. package/dist/chunk-RBXZYNVB.js.map +1 -0
  180. package/dist/chunk-RC6VTY2H.js +47 -0
  181. package/dist/chunk-RC6VTY2H.js.map +1 -0
  182. package/dist/chunk-RFIBUWLF.cjs +232 -0
  183. package/dist/chunk-RFIBUWLF.cjs.map +1 -0
  184. package/dist/chunk-S5T7ZTX2.js +266 -0
  185. package/dist/chunk-S5T7ZTX2.js.map +1 -0
  186. package/dist/chunk-S7PSMMRG.js +38 -0
  187. package/dist/chunk-S7PSMMRG.js.map +1 -0
  188. package/dist/chunk-SCFYPAG6.cjs +18 -0
  189. package/dist/chunk-SCFYPAG6.cjs.map +1 -0
  190. package/dist/chunk-SYDHKKRZ.cjs +818 -0
  191. package/dist/chunk-SYDHKKRZ.cjs.map +1 -0
  192. package/dist/chunk-TX2ZICS7.js +139 -0
  193. package/dist/chunk-TX2ZICS7.js.map +1 -0
  194. package/dist/chunk-TYZUCAT7.js +787 -0
  195. package/dist/chunk-TYZUCAT7.js.map +1 -0
  196. package/dist/chunk-U2E3WT3J.js +45 -0
  197. package/dist/chunk-U2E3WT3J.js.map +1 -0
  198. package/dist/chunk-UBNVIIBT.js +284 -0
  199. package/dist/chunk-UBNVIIBT.js.map +1 -0
  200. package/dist/chunk-UFHMLHIR.cjs +66 -0
  201. package/dist/chunk-UFHMLHIR.cjs.map +1 -0
  202. package/dist/chunk-UJE32SST.js +39 -0
  203. package/dist/chunk-UJE32SST.js.map +1 -0
  204. package/dist/chunk-ULWRNGGE.cjs +146 -0
  205. package/dist/chunk-ULWRNGGE.cjs.map +1 -0
  206. package/dist/chunk-UTWX2X2A.js +165 -0
  207. package/dist/chunk-UTWX2X2A.js.map +1 -0
  208. package/dist/chunk-UWGIB3VQ.js +64 -0
  209. package/dist/chunk-UWGIB3VQ.js.map +1 -0
  210. package/dist/chunk-V4ISCZJ7.cjs +207 -0
  211. package/dist/chunk-V4ISCZJ7.cjs.map +1 -0
  212. package/dist/chunk-VFUWWH52.cjs +83 -0
  213. package/dist/chunk-VFUWWH52.cjs.map +1 -0
  214. package/dist/chunk-VILAPTCB.js +259 -0
  215. package/dist/chunk-VILAPTCB.js.map +1 -0
  216. package/dist/chunk-VLCY46K6.cjs +82 -0
  217. package/dist/chunk-VLCY46K6.cjs.map +1 -0
  218. package/dist/chunk-VPPX5XUF.cjs +813 -0
  219. package/dist/chunk-VPPX5XUF.cjs.map +1 -0
  220. package/dist/chunk-WJMEXTVD.cjs +122 -0
  221. package/dist/chunk-WJMEXTVD.cjs.map +1 -0
  222. package/dist/chunk-WTNMWEBC.js +504 -0
  223. package/dist/chunk-WTNMWEBC.js.map +1 -0
  224. package/dist/chunk-WW6EOVZA.js +112 -0
  225. package/dist/chunk-WW6EOVZA.js.map +1 -0
  226. package/dist/chunk-XNBAXRY7.cjs +5673 -0
  227. package/dist/chunk-XNBAXRY7.cjs.map +1 -0
  228. package/dist/chunk-XQ7PKKDY.cjs +787 -0
  229. package/dist/chunk-XQ7PKKDY.cjs.map +1 -0
  230. package/dist/chunk-XZIYRKLW.cjs +347 -0
  231. package/dist/chunk-XZIYRKLW.cjs.map +1 -0
  232. package/dist/chunk-YBXCZEWS.js +187 -0
  233. package/dist/chunk-YBXCZEWS.js.map +1 -0
  234. package/dist/chunk-YDHO4AVL.js +16 -0
  235. package/dist/chunk-YDHO4AVL.js.map +1 -0
  236. package/dist/chunk-ZORQ5M3W.cjs +934 -0
  237. package/dist/chunk-ZORQ5M3W.cjs.map +1 -0
  238. package/dist/chunk-ZW6FPIFC.cjs +36 -0
  239. package/dist/chunk-ZW6FPIFC.cjs.map +1 -0
  240. package/dist/citations/CitationEditor.d.ts +58 -0
  241. package/dist/citations/PassagePill.d.ts +49 -0
  242. package/dist/citations/QuietMarks.d.ts +81 -0
  243. package/dist/citations/index.cjs +47 -0
  244. package/dist/citations/index.cjs.map +1 -0
  245. package/dist/citations/index.d.ts +3 -0
  246. package/dist/citations/index.js +6 -0
  247. package/dist/citations/index.js.map +1 -0
  248. package/dist/collaboration/contacts/AddContactsParts.d.ts +46 -0
  249. package/dist/collaboration/contacts/index.d.ts +1 -0
  250. package/dist/collaboration/direct-messages/DirectMessages.d.ts +33 -0
  251. package/dist/collaboration/direct-messages/DmParts.d.ts +139 -0
  252. package/dist/collaboration/direct-messages/index.d.ts +2 -0
  253. package/dist/collaboration/index.cjs +141 -0
  254. package/dist/collaboration/index.cjs.map +1 -0
  255. package/dist/collaboration/index.d.ts +5 -0
  256. package/dist/collaboration/index.js +8 -0
  257. package/dist/collaboration/index.js.map +1 -0
  258. package/dist/collaboration/mail/MailFolderTree.d.ts +34 -0
  259. package/dist/collaboration/mail/index.d.ts +2 -0
  260. package/dist/collaboration/mail/mailFolders.d.ts +25 -0
  261. package/dist/collaboration/members/WorkspaceMembers.d.ts +74 -0
  262. package/dist/collaboration/members/index.d.ts +1 -0
  263. package/dist/collaboration/sharing/ShareControl.d.ts +38 -0
  264. package/dist/collaboration/sharing/index.d.ts +1 -0
  265. package/dist/components/Accordion.d.ts +12 -0
  266. package/dist/components/ActionLink.d.ts +18 -0
  267. package/dist/components/AskBar.d.ts +48 -0
  268. package/dist/components/AvatarBlock.d.ts +9 -0
  269. package/dist/components/Banner.d.ts +12 -0
  270. package/dist/components/BlockImage.d.ts +18 -0
  271. package/dist/components/CTABanner.d.ts +17 -0
  272. package/dist/components/Callout.d.ts +9 -0
  273. package/dist/components/Chart.d.ts +27 -0
  274. package/dist/components/CollectionDetail.d.ts +23 -0
  275. package/dist/components/Columns.d.ts +11 -0
  276. package/dist/components/ContactForm.d.ts +42 -0
  277. package/dist/components/Container.d.ts +11 -0
  278. package/dist/components/DataTable.d.ts +47 -0
  279. package/dist/components/DataTableBlock.d.ts +26 -0
  280. package/dist/components/EmptyState.d.ts +11 -0
  281. package/dist/components/EntityChip.d.ts +24 -0
  282. package/dist/components/EntityIdentityBar.d.ts +90 -0
  283. package/dist/components/EntityTooltip.d.ts +43 -0
  284. package/dist/components/FAQ.d.ts +14 -0
  285. package/dist/components/FeatureGrid.d.ts +18 -0
  286. package/dist/components/Footer.d.ts +25 -0
  287. package/dist/components/Gallery.d.ts +15 -0
  288. package/dist/components/Hero.d.ts +35 -0
  289. package/dist/components/ListBlock.d.ts +10 -0
  290. package/dist/components/LogoCloud.d.ts +12 -0
  291. package/dist/components/MediaText.d.ts +15 -0
  292. package/dist/components/MemberAvatarStack.d.ts +36 -0
  293. package/dist/components/MetricCard.d.ts +28 -0
  294. package/dist/components/Navbar.d.ts +39 -0
  295. package/dist/components/PageHeader.d.ts +15 -0
  296. package/dist/components/PricingTable.d.ts +19 -0
  297. package/dist/components/RichTextBlock.d.ts +10 -0
  298. package/dist/components/SectionHeading.d.ts +11 -0
  299. package/dist/components/Spacer.d.ts +7 -0
  300. package/dist/components/StatGroup.d.ts +12 -0
  301. package/dist/components/Steps.d.ts +12 -0
  302. package/dist/components/Tabs.d.ts +15 -0
  303. package/dist/components/TeamGrid.d.ts +18 -0
  304. package/dist/components/Testimonial.d.ts +9 -0
  305. package/dist/components/TestimonialGrid.d.ts +13 -0
  306. package/dist/components/ToneBadge.d.ts +18 -0
  307. package/dist/components/Toolbar.d.ts +11 -0
  308. package/dist/components/UsageMeter.d.ts +21 -0
  309. package/dist/components/VideoEmbed.d.ts +16 -0
  310. package/dist/components/assetImage.d.ts +16 -0
  311. package/dist/components/assetResolver.d.ts +57 -0
  312. package/dist/components/blockLink.d.ts +26 -0
  313. package/dist/components/tones.d.ts +14 -0
  314. package/dist/connect/index.cjs +65 -0
  315. package/dist/connect/index.cjs.map +1 -0
  316. package/dist/connect/index.d.ts +8 -0
  317. package/dist/connect/index.js +28 -0
  318. package/dist/connect/index.js.map +1 -0
  319. package/dist/connection/ArbiAppProvider.d.ts +16 -0
  320. package/dist/connection/ConnectionProvider.d.ts +50 -0
  321. package/dist/connection/ai.d.ts +99 -0
  322. package/dist/connection/types.d.ts +54 -0
  323. package/dist/connection/useImageGen.d.ts +22 -0
  324. package/dist/facts/FactComposer.d.ts +75 -0
  325. package/dist/facts/FactDateInput.d.ts +34 -0
  326. package/dist/facts/FactLabelsCell.d.ts +35 -0
  327. package/dist/facts/FactPassages.d.ts +52 -0
  328. package/dist/facts/FactRowActions.d.ts +18 -0
  329. package/dist/facts/FactSearchParts.d.ts +80 -0
  330. package/dist/facts/FactSourceGroup.d.ts +26 -0
  331. package/dist/facts/FactTimelineViews.d.ts +37 -0
  332. package/dist/facts/FactsBulkBar.d.ts +53 -0
  333. package/dist/facts/FactsEmptyState.d.ts +38 -0
  334. package/dist/facts/FactsFieldsButton.d.ts +21 -0
  335. package/dist/facts/FactsFilterInput.d.ts +46 -0
  336. package/dist/facts/FactsTable.d.ts +28 -0
  337. package/dist/facts/FactsToolbar.d.ts +53 -0
  338. package/dist/facts/FactsViewToggle.d.ts +36 -0
  339. package/dist/facts/fact-date.d.ts +22 -0
  340. package/dist/facts/fact-text.d.ts +14 -0
  341. package/dist/facts/factColumns.d.ts +88 -0
  342. package/dist/facts/index.cjs +2372 -0
  343. package/dist/facts/index.cjs.map +1 -0
  344. package/dist/facts/index.d.ts +34 -0
  345. package/dist/facts/index.js +2316 -0
  346. package/dist/facts/index.js.map +1 -0
  347. package/dist/facts/timezone.d.ts +4 -0
  348. package/dist/files/AiReviewDialog.d.ts +77 -0
  349. package/dist/files/DocStatusIcon.d.ts +12 -0
  350. package/dist/files/DocumentGrid.d.ts +27 -0
  351. package/dist/files/Explorer.d.ts +10 -0
  352. package/dist/files/ExplorerSurface.d.ts +34 -0
  353. package/dist/files/ExplorerTile.d.ts +142 -0
  354. package/dist/files/ExportParts.d.ts +114 -0
  355. package/dist/files/FieldParts.d.ts +64 -0
  356. package/dist/files/FilesPage.d.ts +20 -0
  357. package/dist/files/FilesToolbar.d.ts +59 -0
  358. package/dist/files/FolderPicker.d.ts +82 -0
  359. package/dist/files/GridView.d.ts +59 -0
  360. package/dist/files/HtmlViewerParts.d.ts +183 -0
  361. package/dist/files/MoveToFolderDialog.d.ts +32 -0
  362. package/dist/files/RedlineParts.d.ts +72 -0
  363. package/dist/files/SelectionBar.d.ts +65 -0
  364. package/dist/files/StatusPill.d.ts +23 -0
  365. package/dist/files/TagPassagePanel.d.ts +60 -0
  366. package/dist/files/UploadDropzone.d.ts +33 -0
  367. package/dist/files/UploadFooter.d.ts +59 -0
  368. package/dist/files/UploadParts.d.ts +78 -0
  369. package/dist/files/UploadSources.d.ts +77 -0
  370. package/dist/files/VersionTimeline.d.ts +60 -0
  371. package/dist/files/ViewToggle.d.ts +49 -0
  372. package/dist/files/ViewerChrome.d.ts +155 -0
  373. package/dist/files/ViewerLayout.d.ts +32 -0
  374. package/dist/files/ViewerParts.d.ts +62 -0
  375. package/dist/files/bulk/BulkActionsBar.d.ts +76 -0
  376. package/dist/files/bulk/FolderFilterButton.d.ts +35 -0
  377. package/dist/files/bulk/index.d.ts +2 -0
  378. package/dist/files/cells/DocumentNameCell.d.ts +31 -0
  379. package/dist/files/cells/FolderCell.d.ts +25 -0
  380. package/dist/files/cells/HoverIconCell.d.ts +21 -0
  381. package/dist/files/cells/LabelMultiSelect.d.ts +50 -0
  382. package/dist/files/cells/RelatedDocsCell.d.ts +22 -0
  383. package/dist/files/cells/TagColumnParts.d.ts +29 -0
  384. package/dist/files/cells/index.d.ts +6 -0
  385. package/dist/files/documentGridLayout.d.ts +31 -0
  386. package/dist/files/grid-test-ids.d.ts +18 -0
  387. package/dist/files/import/CalendarImportRow.d.ts +26 -0
  388. package/dist/files/import/ImportParts.d.ts +114 -0
  389. package/dist/files/import/TaskSection.d.ts +51 -0
  390. package/dist/files/import/UrlInputDialogView.d.ts +63 -0
  391. package/dist/files/import/VendorLogo.d.ts +15 -0
  392. package/dist/files/import/index.d.ts +5 -0
  393. package/dist/files/index.cjs +7589 -0
  394. package/dist/files/index.cjs.map +1 -0
  395. package/dist/files/index.d.ts +34 -0
  396. package/dist/files/index.js +7374 -0
  397. package/dist/files/index.js.map +1 -0
  398. package/dist/files/page/FilesAddMenu.d.ts +30 -0
  399. package/dist/files/page/FilesPageParts.d.ts +24 -0
  400. package/dist/files/page/FilesPageTitle.d.ts +24 -0
  401. package/dist/files/page/index.d.ts +3 -0
  402. package/dist/files/tags/BulkTagEditor.d.ts +136 -0
  403. package/dist/files/tags/DocTagPopover.d.ts +113 -0
  404. package/dist/files/tags/TagManager.d.ts +54 -0
  405. package/dist/files/tags/index.d.ts +3 -0
  406. package/dist/files/views/FieldsEditorParts.d.ts +151 -0
  407. package/dist/files/views/FieldsManagerParts.d.ts +17 -0
  408. package/dist/files/views/TagFormParts.d.ts +109 -0
  409. package/dist/files/views/ViewSelectorMenu.d.ts +66 -0
  410. package/dist/files/views/fieldsEditorModel.d.ts +43 -0
  411. package/dist/files/views/index.d.ts +5 -0
  412. package/dist/home/ActionMenuDialog.d.ts +26 -0
  413. package/dist/home/AddFilesFirst.d.ts +22 -0
  414. package/dist/home/CardHeaderBar.d.ts +40 -0
  415. package/dist/home/CollapsibleSection.d.ts +43 -0
  416. package/dist/home/CreateTile.d.ts +17 -0
  417. package/dist/home/DashboardParts.d.ts +32 -0
  418. package/dist/home/FactsStrip.d.ts +41 -0
  419. package/dist/home/FoldSection.d.ts +19 -0
  420. package/dist/home/GettingStartedStrip.d.ts +49 -0
  421. package/dist/home/Greeting.d.ts +18 -0
  422. package/dist/home/HomeLayout.d.ts +28 -0
  423. package/dist/home/KeyValueRow.d.ts +43 -0
  424. package/dist/home/ProjectBandParts.d.ts +70 -0
  425. package/dist/home/QuickActionDialogHeader.d.ts +21 -0
  426. package/dist/home/RecentList.d.ts +48 -0
  427. package/dist/home/ScopePicker.d.ts +65 -0
  428. package/dist/home/StartTiles.d.ts +33 -0
  429. package/dist/home/index.cjs +854 -0
  430. package/dist/home/index.cjs.map +1 -0
  431. package/dist/home/index.d.ts +37 -0
  432. package/dist/home/index.js +763 -0
  433. package/dist/home/index.js.map +1 -0
  434. package/dist/home/sections.d.ts +33 -0
  435. package/dist/index.cjs +1932 -5547
  436. package/dist/index.cjs.map +1 -1
  437. package/dist/index.d.ts +71 -1716
  438. package/dist/index.js +142 -5316
  439. package/dist/index.js.map +1 -1
  440. package/dist/lib/balanced-columns.d.ts +8 -0
  441. package/dist/lib/format.d.ts +37 -0
  442. package/dist/lib/observe-resize.d.ts +6 -0
  443. package/dist/lib/password-strength.d.ts +24 -0
  444. package/dist/lib/sidebar-mode.d.ts +46 -0
  445. package/dist/lib/testid.d.ts +7 -0
  446. package/dist/lib/use-drawer.d.ts +11 -0
  447. package/dist/lib/useControllableState.d.ts +5 -0
  448. package/dist/lib/useDismissibleCard.d.ts +15 -0
  449. package/dist/lib/useListKeyNav.d.ts +42 -0
  450. package/dist/lib/useLongPaste.d.ts +15 -0
  451. package/dist/lib/useRestoreFocus.d.ts +11 -0
  452. package/dist/lib/useScopeSelection.d.ts +34 -0
  453. package/dist/nav/types.d.ts +19 -0
  454. package/dist/provider/BlocksProvider.d.ts +20 -0
  455. package/dist/provider/TooltipScope.d.ts +9 -0
  456. package/dist/record/index.cjs +2 -4
  457. package/dist/record/index.cjs.map +1 -1
  458. package/dist/record/index.d.ts +12 -16
  459. package/dist/record/index.js +2 -4
  460. package/dist/record/index.js.map +1 -1
  461. package/dist/retrieval/HighlightText.d.ts +21 -0
  462. package/dist/retrieval/SearchEmptyState.d.ts +39 -0
  463. package/dist/retrieval/SearchGroupHeader.d.ts +21 -0
  464. package/dist/retrieval/SearchHit.d.ts +36 -0
  465. package/dist/retrieval/SearchPage.d.ts +187 -0
  466. package/dist/retrieval/SearchPagination.d.ts +21 -0
  467. package/dist/retrieval/highlight.d.ts +21 -0
  468. package/dist/retrieval/index.cjs +160 -0
  469. package/dist/retrieval/index.cjs.map +1 -0
  470. package/dist/retrieval/index.d.ts +7 -0
  471. package/dist/retrieval/index.js +7 -0
  472. package/dist/retrieval/index.js.map +1 -0
  473. package/dist/settings/AccountDialogs.d.ts +89 -0
  474. package/dist/settings/AvatarPicker.d.ts +25 -0
  475. package/dist/settings/Billing.d.ts +113 -0
  476. package/dist/settings/ConfigSwitcherBar.d.ts +46 -0
  477. package/dist/settings/ConfirmDialog.d.ts +28 -0
  478. package/dist/settings/ConnectionCard.d.ts +58 -0
  479. package/dist/settings/ConversationSettingsParts.d.ts +53 -0
  480. package/dist/settings/DocumentPicker.d.ts +57 -0
  481. package/dist/settings/EmailWorkspaceDialogView.d.ts +60 -0
  482. package/dist/settings/ErrorDialog.d.ts +36 -0
  483. package/dist/settings/FloatingPanel.d.ts +32 -0
  484. package/dist/settings/JsonTree.d.ts +24 -0
  485. package/dist/settings/LogoutDialog.d.ts +51 -0
  486. package/dist/settings/ModalBreadcrumbHeader.d.ts +32 -0
  487. package/dist/settings/ModalScaffold.d.ts +60 -0
  488. package/dist/settings/MultiSelect.d.ts +111 -0
  489. package/dist/settings/NotificationCategoryList.d.ts +26 -0
  490. package/dist/settings/PanelFrame.d.ts +47 -0
  491. package/dist/settings/PasswordChangeDialog.d.ts +64 -0
  492. package/dist/settings/PlanBadge.d.ts +14 -0
  493. package/dist/settings/PlanCard.d.ts +97 -0
  494. package/dist/settings/PremiumModelsFrame.d.ts +17 -0
  495. package/dist/settings/ProfileCard.d.ts +67 -0
  496. package/dist/settings/Projects.d.ts +108 -0
  497. package/dist/settings/QuotaMeter.d.ts +31 -0
  498. package/dist/settings/ReferralCredit.d.ts +46 -0
  499. package/dist/settings/SegmentedControl.d.ts +20 -0
  500. package/dist/settings/ServerConnectionControls.d.ts +31 -0
  501. package/dist/settings/SettingsPanel.d.ts +61 -0
  502. package/dist/settings/SettingsSwitchRow.d.ts +21 -0
  503. package/dist/settings/SubscriptionParts.d.ts +215 -0
  504. package/dist/settings/SupportPanel.d.ts +32 -0
  505. package/dist/settings/SyncDialogParts.d.ts +155 -0
  506. package/dist/settings/ThreadPreviewDialog.d.ts +18 -0
  507. package/dist/settings/TipsEditorDialog.d.ts +94 -0
  508. package/dist/settings/TriStateFilterMenu.d.ts +66 -0
  509. package/dist/settings/Usage.d.ts +102 -0
  510. package/dist/settings/WelcomeDialog.d.ts +79 -0
  511. package/dist/settings/index.cjs +5131 -0
  512. package/dist/settings/index.cjs.map +1 -0
  513. package/dist/settings/index.d.ts +38 -0
  514. package/dist/settings/index.js +4922 -0
  515. package/dist/settings/index.js.map +1 -0
  516. package/dist/shell/ActionCluster.d.ts +28 -0
  517. package/dist/shell/AskField.d.ts +71 -0
  518. package/dist/shell/InfoBar.d.ts +20 -0
  519. package/dist/shell/MobileBars.d.ts +47 -0
  520. package/dist/shell/OfflinePill.d.ts +28 -0
  521. package/dist/shell/RemoteControlPill.d.ts +23 -0
  522. package/dist/shell/Shell.d.ts +123 -0
  523. package/dist/shell/Sidebar.d.ts +104 -0
  524. package/dist/shell/SidebarBadgeRow.d.ts +29 -0
  525. package/dist/shell/SidebarRowAction.d.ts +24 -0
  526. package/dist/shell/StatusRow.d.ts +20 -0
  527. package/dist/shell/TabHeader.d.ts +70 -0
  528. package/dist/shell/TipCard.d.ts +46 -0
  529. package/dist/shell/ToolButton.d.ts +12 -0
  530. package/dist/shell/Workspace.d.ts +90 -0
  531. package/dist/shell/index.cjs +187 -0
  532. package/dist/shell/index.cjs.map +1 -0
  533. package/dist/shell/index.d.ts +20 -0
  534. package/dist/shell/index.js +10 -0
  535. package/dist/shell/index.js.map +1 -0
  536. package/dist/shell/sidebar-context.d.ts +19 -0
  537. package/dist/shell/types.d.ts +48 -0
  538. package/dist/site/index.cjs +113 -90
  539. package/dist/site/index.d.ts +59 -4
  540. package/dist/site/index.js +8 -1
  541. package/dist/studio/PageRenderer.d.ts +35 -0
  542. package/dist/studio/Section.d.ts +24 -0
  543. package/dist/studio/StudioEditor.d.ts +32 -0
  544. package/dist/studio/aiFields.d.ts +17 -0
  545. package/dist/studio/blockKit.d.ts +36 -0
  546. package/dist/studio/blocksConfig.d.ts +42 -0
  547. package/dist/studio/imageFields.d.ts +14 -0
  548. package/dist/studio/index.cjs +3353 -0
  549. package/dist/studio/index.cjs.map +1 -0
  550. package/dist/studio/index.d.ts +32 -0
  551. package/dist/studio/index.js +3297 -0
  552. package/dist/studio/index.js.map +1 -0
  553. package/dist/studio/liveData.d.ts +4 -0
  554. package/dist/studio/liveWidgetRuntime.d.ts +41 -0
  555. package/dist/studio/persistence.d.ts +38 -0
  556. package/dist/studio/publish.d.ts +39 -0
  557. package/dist/studio/siteBlocks.d.ts +14 -0
  558. package/dist/studio/types.d.ts +46 -0
  559. package/dist/studio/websiteBlocks.d.ts +4 -0
  560. package/dist/studio/widgets.d.ts +20 -0
  561. package/dist/theme/ThemeEditor.d.ts +16 -0
  562. package/dist/theme/fontPairings.d.ts +48 -0
  563. package/dist/theme/store.d.ts +53 -0
  564. package/dist/theme/tokens.d.ts +105 -0
  565. package/dist/timeline/Timeline.d.ts +27 -0
  566. package/dist/timeline/TimelineCalendar.d.ts +54 -0
  567. package/dist/timeline/TimelineGantt.d.ts +71 -0
  568. package/dist/timeline/TimelineZoomControl.d.ts +17 -0
  569. package/dist/timeline/index.cjs +50 -0
  570. package/dist/timeline/index.cjs.map +1 -0
  571. package/dist/timeline/index.d.ts +13 -0
  572. package/dist/timeline/index.js +5 -0
  573. package/dist/timeline/index.js.map +1 -0
  574. package/dist/timeline/span.d.ts +29 -0
  575. package/dist/timeline/types.d.ts +30 -0
  576. package/dist/workspaces/WorkspaceBadges.d.ts +27 -0
  577. package/dist/workspaces/WorkspaceCard.d.ts +142 -0
  578. package/dist/workspaces/WorkspaceFormParts.d.ts +98 -0
  579. package/dist/workspaces/WorkspaceGroup.d.ts +31 -0
  580. package/dist/workspaces/WorkspaceSettingsParts.d.ts +70 -0
  581. package/dist/workspaces/index.cjs +690 -0
  582. package/dist/workspaces/index.cjs.map +1 -0
  583. package/dist/workspaces/index.d.ts +9 -0
  584. package/dist/workspaces/index.js +661 -0
  585. package/dist/workspaces/index.js.map +1 -0
  586. package/package.json +154 -9
  587. package/src/blocks.css +348 -0
  588. package/src/components/grid.css +60 -107
  589. package/src/source.css +20 -0
  590. package/src/studio/studio.css +3 -3
  591. package/src/tokens.css +226 -0
  592. package/dist/chunk-DBAUZD7A.cjs.map +0 -1
  593. package/dist/chunk-FZ2S6VAZ.js.map +0 -1
  594. package/dist/index-DduoEosi.d.cts +0 -846
  595. package/dist/index-DduoEosi.d.ts +0 -846
  596. package/dist/index.d.cts +0 -1717
  597. package/dist/record/index.d.cts +0 -96
  598. package/dist/site/index.d.cts +0 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/timeline/span.ts","../src/timeline/TimelineCalendar.tsx","../src/timeline/TimelineZoomControl.tsx","../src/timeline/TimelineGantt.tsx"],"names":["useMemo","useState","useRef","useCallback","useEffect","day","WEEK_MS","jsx","ChevronLeft","jsxs","ChevronRight","cn","createPortal","ZoomOut","ZoomIn","Calendar","Fragment","X"],"mappings":"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","file":"chunk-VPPX5XUF.cjs","sourcesContent":["/**\n * Reading a stored date span back at the precision it was written.\n *\n * A span carries no precision flag — \"October 2019\" and \"the whole of October\"\n * are the same thing on a timeline — so precision is inferred from the shape of\n * the bounds: midnight to 23:59:59 across a month is \"Oct 2019\", across one day\n * is that date, a zero-width span is an instant, and anything else is a range.\n *\n * Every value is read from its UTC components and NEVER localised. A\n * day-precision value stored at 00:00Z would otherwise display as the previous\n * day for every viewer west of UTC — which is also why these helpers spell out\n * English month names instead of delegating to `Intl`: the formatter's timezone\n * handling is the exact trap being avoided.\n */\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nconst MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nexport const WEEKDAY_NAMES = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n\nexport const DAY_MS = 86_400_000\n\n/** Month name and year, e.g. \"October 2019\". */\nexport function monthLabel(d: Date): string {\n return `${MONTH_NAMES[d.getUTCMonth()]} ${d.getUTCFullYear()}`\n}\n\n/** The UTC midnight that starts the day `d` falls in. */\nexport function utcDay(d: Date): Date {\n return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()))\n}\n\n/** `YYYY-MM-DD` for the UTC day — a stable key and testid suffix. */\nexport function dayKey(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n/** Parse an ISO string, returning null rather than an Invalid Date. */\nexport function parseIso(iso: string | null | undefined): Date | null {\n if (!iso) return null\n const d = new Date(iso)\n return isNaN(d.getTime()) ? null : d\n}\n\nfunction isMidnight(d: Date): boolean {\n return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0\n}\n\nfunction isEndOfDay(d: Date): boolean {\n return d.getUTCHours() === 23 && d.getUTCMinutes() === 59\n}\n\nfunction lastDayOfMonth(d: Date): number {\n return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 0)).getUTCDate()\n}\n\nfunction day(d: Date): string {\n return `${d.getUTCDate()} ${MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}`\n}\n\n/** `day(d)`, but read from `d`'s wall-clock in `timeZone` instead of UTC.\n * Only used for the instant case below, where a real zone was recorded —\n * every viewer reads the same zone, so this doesn't reintroduce the\n * viewer-dependent localisation the rest of this file avoids. */\nfunction zonedDayAndTime(d: Date, timeZone: string): { day: string; hh: string; mm: string } {\n const parts = Object.fromEntries(\n new Intl.DateTimeFormat('en-US', {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n .formatToParts(d)\n .map((p) => [p.type, p.value])\n )\n return { day: `${parts.day} ${parts.month} ${parts.year}`, hh: parts.hour, mm: parts.minute }\n}\n\n/** Format a stored span the way its precision implies. '' when undated.\n * `timezone` renders an instant in its recorded zone instead of UTC — pass it\n * only where the source actually carries one (e.g. a fact's `timezone`\n * field); day-precision spans stay zone-agnostic regardless. */\nexport function formatSpan(\n startIso: string | null | undefined,\n endIso: string | null | undefined,\n timezone?: string | null\n): string {\n if (!startIso) return ''\n const start = new Date(startIso)\n const end = endIso ? new Date(endIso) : start\n\n // An instant — an email, a precise deadline.\n if (startIso === endIso) {\n if (timezone) {\n try {\n const zoned = zonedDayAndTime(start, timezone)\n return `${zoned.day}, ${zoned.hh}:${zoned.mm} ${timezone}`\n } catch {\n // Unrecognised zone string — fall through to the UTC rendering below.\n }\n }\n const hh = String(start.getUTCHours()).padStart(2, '0')\n const mm = String(start.getUTCMinutes()).padStart(2, '0')\n return `${day(start)}, ${hh}:${mm} UTC`\n }\n\n if (isMidnight(start) && isEndOfDay(end)) {\n const sameDay =\n start.getUTCFullYear() === end.getUTCFullYear() &&\n start.getUTCMonth() === end.getUTCMonth() &&\n start.getUTCDate() === end.getUTCDate()\n if (sameDay) return day(start)\n\n // A month or a year only reads as one when the span covers ALL of it. The\n // end bound must reach the last day too, or 1–3 June would print \"Jun 2023\"\n // and a three-day span would lose two days to the label.\n const firstOfMonth = start.getUTCDate() === 1\n const endsMonth = end.getUTCDate() === lastDayOfMonth(end)\n const sameMonth =\n start.getUTCFullYear() === end.getUTCFullYear() && start.getUTCMonth() === end.getUTCMonth()\n if (firstOfMonth && endsMonth && sameMonth) {\n return `${MONTHS[start.getUTCMonth()]} ${start.getUTCFullYear()}`\n }\n\n const wholeYear =\n firstOfMonth &&\n endsMonth &&\n start.getUTCMonth() === 0 &&\n end.getUTCMonth() === 11 &&\n start.getUTCFullYear() === end.getUTCFullYear()\n if (wholeYear) return String(start.getUTCFullYear())\n\n return `${day(start)} – ${day(end)}`\n }\n\n return `${day(start)} – ${day(end)}`\n}\n","/**\n * Continuous calendar over dated items.\n *\n * An item is a span, so one dated \"October 2019\" genuinely occupies every day of\n * October. Repeating its label in all 31 cells is unreadable, so a multi-day item\n * renders as ONE continuous bar spanning its days, broken only where a week ends\n * — the label appears once, on the segment where the item starts.\n *\n * Segments are packed into lanes so overlapping items stack rather than collide,\n * which is what makes a dense month legible.\n *\n * It scrolls as one unbroken run of weeks from the earliest item to the latest,\n * rather than paging month by month: a chronology is read by moving along it, and\n * paging hides exactly the thing you want to see — what sits on either side of a\n * boundary. Month names mark where they change, and weeks stay whole, so days\n * belonging to the neighbouring month simply appear dimmed.\n *\n * Everything reads the UTC components and never localises: a day-precision item\n * stored at 00:00Z would otherwise land on the previous day for viewers west of\n * UTC.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TimelineItem } from './types'\nimport { DAY_MS, WEEKDAY_NAMES, dayKey, formatSpan, monthLabel, utcDay } from './span'\n\n/** Bars per week before the rest collapse into a \"+n more\" row. */\nconst DEFAULT_MAX_LANES = 3\n/** Guard against a stray far-past/future date asking the browser for thousands\n * of week rows, while still covering realistic multi-decade chronologies\n * (~50 years). 520 (10 years) silently dropped everything past the first\n * decade — a 1991–2007 fact set stopped rendering at 2001. */\nconst MAX_WEEKS = 2600\n\nexport interface TimelineCalendarProps<T extends TimelineItem = TimelineItem> {\n items: T[]\n /** Clicking a bar. The caller's own object comes back, not a copy. */\n onSelect?: (item: T) => void\n /** Bars shown per week before the remainder collapses to \"+n more\". */\n maxLanes?: number\n /** Ids to treat as the current selection — positions the event navigator's\n * ‹ n / N › on the matching event (e.g. the one open in the app's editor). */\n selectedIds?: readonly string[]\n /**\n * Where the ‹ n / N › event navigator renders. Omit it for the built-in\n * inline placement. Pass a host element (e.g. a slot in the app's own\n * toolbar) to portal the navigator there instead — or `null` while that slot\n * isn't mounted yet, which renders no navigator at all rather than falling\n * back inline (avoids a flash of the inline one on first paint).\n */\n navigatorContainer?: HTMLElement | null\n /**\n * Denominator shown by the navigator (`n / N`). Defaults to the number of\n * dated items it can step through; a host may pass its full (filtered) item\n * count instead so the figure matches the list it shows elsewhere, even when\n * some of those items carry no date and so never appear here.\n */\n navigatorTotal?: number\n /** Shown when nothing in `items` carries a date. */\n emptyState?: ReactNode\n className?: string\n /** Prefix for every `data-testid` this view emits. */\n testId?: string\n}\n\ninterface Segment<T> {\n item: T\n startCol: number // 0-6 within the week\n span: number // days covered in THIS week\n isStart: boolean // the item begins in this segment — label goes here\n isEnd: boolean\n lane: number\n}\n\nexport function TimelineCalendar<T extends TimelineItem = TimelineItem>({\n items,\n onSelect,\n selectedIds,\n maxLanes = DEFAULT_MAX_LANES,\n navigatorContainer,\n navigatorTotal,\n emptyState,\n className,\n testId = 'timeline-calendar',\n}: TimelineCalendarProps<T>) {\n const dated = useMemo(() => items.filter((i) => i.start), [items])\n\n // Event navigator (‹ n / N ›), mirroring the timeline's: step through the\n // events in chronological order, selecting each and scrolling it into view.\n const sortedItems = useMemo(\n () => [...dated].sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime()),\n [dated]\n )\n const indexById = useMemo(() => new Map(sortedItems.map((it, i) => [it.id, i])), [sortedItems])\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n const scrollRef = useRef<HTMLDivElement>(null)\n const select = useCallback(\n (index: number) => {\n const clamped = Math.max(0, Math.min(sortedItems.length - 1, index))\n setActiveIndex(clamped)\n onSelect?.(sortedItems[clamped])\n return clamped\n },\n [onSelect, sortedItems]\n )\n const scrollToItem = useCallback(\n (id: string, behavior: ScrollBehavior) => {\n scrollRef.current\n ?.querySelector(`[data-testid=\"${testId}-entry-${id}\"]`)\n ?.scrollIntoView({ block: 'center', behavior })\n },\n [testId]\n )\n // The id the navigator last scrolled to, so the selection effect below\n // doesn't scroll a second time (with a jump) after the navigator's smooth one.\n const lastNavScrollRef = useRef<string | null>(null)\n const goTo = useCallback(\n (index: number) => {\n const target = sortedItems[select(index)]\n if (target) {\n lastNavScrollRef.current = target.id\n scrollToItem(target.id, 'smooth')\n }\n },\n [select, sortedItems, scrollToItem]\n )\n\n // An outside selection (e.g. the fact open in the app's editor when the\n // calendar mounts, or one chosen in another view) is scrolled into view, so\n // opening the calendar lands on the fact being viewed rather than at the top.\n const selectedKey = (selectedIds ?? []).join('\\u0000')\n useEffect(() => {\n const id = selectedKey ? selectedKey.split('\\u0000')[0] : null\n if (!id) return\n if (lastNavScrollRef.current === id) {\n lastNavScrollRef.current = null\n return\n }\n scrollToItem(id, 'auto')\n }, [selectedKey, scrollToItem])\n\n /** Every week from the earliest item to the latest, unbroken.\n *\n * Weeks are whole, so a month boundary falls mid-week and the neighbouring\n * month's days show dimmed rather than being clipped. Capped so a stray item\n * dated 1900 cannot ask the browser to lay out fifteen hundred weeks.\n */\n const weeks = useMemo(() => {\n if (dated.length === 0) return []\n const times = dated.flatMap((i) => [\n new Date(i.start).getTime(),\n new Date(i.end ?? i.start).getTime(),\n ])\n const first = utcDay(new Date(Math.min(...times)))\n const last = utcDay(new Date(Math.max(...times)))\n\n // Back up to the Monday on or before the first day.\n const gridStart = new Date(first)\n gridStart.setUTCDate(first.getUTCDate() - ((first.getUTCDay() + 6) % 7))\n\n const out: Date[][] = []\n const cursor = new Date(gridStart)\n while (cursor <= last && out.length < MAX_WEEKS) {\n out.push(\n Array.from({ length: 7 }, (_, d) => {\n const day = new Date(cursor)\n day.setUTCDate(cursor.getUTCDate() + d)\n return day\n })\n )\n cursor.setUTCDate(cursor.getUTCDate() + 7)\n }\n return out\n }, [dated])\n\n /** Per week: one segment per item overlapping it, packed into lanes.\n *\n * One pass: each item's day range is resolved ONCE and the item is dropped\n * into every week it touches (by week index from the grid start), instead of\n * every week re-scanning and re-parsing the whole item list — that was\n * O(weeks × items) with fresh Date objects each time, which is what made a\n * multi-decade chronology (~1,800 weeks) slow to open. */\n const segmentsByWeek = useMemo(() => {\n if (weeks.length === 0) return []\n const gridStartMs = weeks[0][0].getTime()\n const WEEK_MS = 7 * DAY_MS\n type Ranged = { item: T; start: Date; end: Date }\n const ranged: Ranged[] = dated.map((item) => ({\n item,\n start: utcDay(new Date(item.start)),\n end: utcDay(new Date(item.end ?? item.start)),\n }))\n // Longest first so the big spans take the top lanes and read as context.\n // Sorted once here; the per-week buckets below inherit the order.\n ranged.sort((a, b) => {\n const lenA = b.end.getTime() - b.start.getTime()\n const lenB = a.end.getTime() - a.start.getTime()\n return lenA - lenB || a.start.getTime() - b.start.getTime()\n })\n const buckets: Ranged[][] = weeks.map(() => [])\n for (const r of ranged) {\n const from = Math.max(0, Math.floor((r.start.getTime() - gridStartMs) / WEEK_MS))\n const to = Math.min(weeks.length - 1, Math.floor((r.end.getTime() - gridStartMs) / WEEK_MS))\n for (let w = from; w <= to; w++) buckets[w].push(r)\n }\n\n return weeks.map((week, wi) => {\n const weekStart = week[0]\n const weekEnd = week[6]\n const laneEnds: number[] = [] // last occupied column per lane\n const segments: Segment<T>[] = []\n let overflow = 0\n\n for (const { item, start, end } of buckets[wi]) {\n const from = start < weekStart ? weekStart : start\n const to = end > weekEnd ? weekEnd : end\n const startCol = Math.round((from.getTime() - weekStart.getTime()) / DAY_MS)\n const endCol = Math.round((to.getTime() - weekStart.getTime()) / DAY_MS)\n\n let lane = laneEnds.findIndex((last) => last < startCol)\n if (lane === -1) lane = laneEnds.length\n if (lane >= maxLanes) {\n overflow += 1\n continue\n }\n laneEnds[lane] = endCol\n segments.push({\n item,\n startCol,\n span: endCol - startCol + 1,\n isStart: start >= weekStart,\n isEnd: end <= weekEnd,\n lane,\n })\n }\n return { segments, overflow }\n })\n }, [weeks, dated, maxLanes])\n\n if (weeks.length === 0 && emptyState) {\n return <>{emptyState}</>\n }\n\n const selectedSet = new Set(selectedIds ?? [])\n const selectedIndex = sortedItems.findIndex((i) => selectedSet.has(i.id))\n const currentIndex = selectedIndex >= 0 ? selectedIndex : activeIndex\n\n // Step through the events one at a time (‹ n / N ›), selecting each and\n // scrolling it into view — the calendar's equivalent of the timeline nav.\n // Always present, even with nothing dated: a toolbar control that vanishes on\n // an empty month shifts everything beside it, so it stays as a disabled\n // \"– / –\" stepper instead.\n const navigator = (\n <span className=\"flex items-center gap-0.5\" data-testid={`${testId}-nav`}>\n <button\n type=\"button\"\n aria-label=\"Previous event\"\n data-testid={`${testId}-nav-prev`}\n disabled={sortedItems.length === 0 || currentIndex === null || currentIndex <= 0}\n onClick={() => goTo((currentIndex ?? 0) - 1)}\n className=\"rounded p-0.5 text-muted-foreground enabled:hover:bg-accent enabled:hover:text-foreground disabled:opacity-30\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span\n className=\"tabular-nums text-sm font-light text-muted-foreground\"\n data-testid={`${testId}-nav-position`}\n >\n {currentIndex !== null ? currentIndex + 1 : '–'} /{' '}\n {navigatorTotal ?? (sortedItems.length > 0 ? sortedItems.length : '–')}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next event\"\n data-testid={`${testId}-nav-next`}\n disabled={\n sortedItems.length === 0 ||\n (currentIndex !== null && currentIndex >= sortedItems.length - 1)\n }\n onClick={() => goTo(currentIndex === null ? 0 : currentIndex + 1)}\n className=\"rounded p-0.5 text-muted-foreground enabled:hover:bg-accent enabled:hover:text-foreground disabled:opacity-30\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </span>\n )\n\n return (\n <div className={cn('flex flex-col h-full', className)} data-testid={testId}>\n {navigatorContainer === undefined\n ? navigator && (\n <div className=\"flex shrink-0 items-center justify-end border-b border-border px-2 py-1\">\n {navigator}\n </div>\n )\n : navigatorContainer && navigator && createPortal(navigator, navigatorContainer)}\n <div className=\"grid grid-cols-7 border-b border-border bg-background\">\n {WEEKDAY_NAMES.map((d) => (\n <div key={d} className=\"px-2 py-1 text-xs text-muted-foreground text-center\">\n {d}\n </div>\n ))}\n </div>\n\n {/* The scroller is addressable: a continuous calendar is read by scrolling,\n so a test or a host that wants to move through it needs a handle. */}\n <div ref={scrollRef} className=\"flex-1 overflow-auto\" data-testid={`${testId}-scroll`}>\n {weeks.map((week, wi) => {\n const { segments, overflow } = segmentsByWeek[wi]\n // Label a month where it starts: the first week overall, or any week\n // containing the 1st.\n // Prefer the month that STARTS in this week. The first row usually\n // begins in the previous month (the Monday before the earliest item),\n // so labelling it week[0] would name December for a January range.\n const monthStartDay = week.find((d) => d.getUTCDate() === 1)\n const marker = monthStartDay ?? (wi === 0 ? week[0] : undefined)\n return (\n <div key={dayKey(week[0])}>\n {marker && (\n // Sticky, so the month you are LOOKING at names itself: it\n // pins to the top of the scroller while you are inside it and\n // is pushed up by the next one. No scroll listener needed.\n <div\n className=\"sticky top-0 z-10 px-3 py-1 text-xs font-medium text-foreground bg-background/95 backdrop-blur border-y border-border/60\"\n data-testid={`${testId}-month-${marker.getUTCFullYear()}-${String(\n marker.getUTCMonth() + 1\n ).padStart(2, '0')}`}\n >\n {monthLabel(marker)}\n </div>\n )}\n <div className=\"border-b border-border/40\">\n <div className=\"grid grid-cols-7 bg-background\">\n {week.map((day) => (\n <div\n key={dayKey(day)}\n data-testid={`${testId}-day-${dayKey(day)}`}\n className={cn(\n 'px-1 pt-1 text-xs border-r border-border/40',\n day.getUTCDate() === 1\n ? 'text-foreground font-medium'\n : 'text-muted-foreground/60'\n )}\n >\n {day.getUTCDate()}\n </div>\n ))}\n </div>\n\n {/* Bars. A span crossing days is ONE element, not a label\n repeated in every cell. */}\n <div\n className=\"grid auto-rows-[24px] grid-cols-7 gap-y-0.5 px-0.5 pb-1 bg-muted/40 pointer-coarse:auto-rows-[32px]\"\n // Every lane is the SAME fixed height so each event is one\n // uniform single-line bar (labels truncate) — no bar is taller\n // than another regardless of its text.\n style={{ minHeight: 62 }}\n >\n {segments.map((seg) => (\n <button\n key={`${seg.item.id}-${seg.startCol}`}\n type=\"button\"\n onClick={() => select(indexById.get(seg.item.id) ?? 0)}\n title={`${formatSpan(seg.item.start, seg.item.end)} — ${seg.item.label}`}\n data-testid={`${testId}-entry-${seg.item.id}`}\n style={{\n gridColumn: `${seg.startCol + 1} / span ${seg.span}`,\n gridRow: seg.lane + 1,\n }}\n className={cn(\n // One line per event (truncated), so several events stack\n // compactly on the same day instead of a few tall bars\n // pushing the rest into a \"+n more\". Every event is the\n // SAME neutral colour; the one open in the composer is\n // marked by the caller (a ring), not by a different fill.\n 'block h-full w-full truncate text-left text-xs leading-5 px-1.5',\n 'bg-muted text-muted-foreground',\n seg.isStart && 'rounded-l',\n seg.isEnd && 'rounded-r'\n )}\n >\n {/* Label once, where the item begins; a continuation is\n the bar alone. */}\n {seg.isStart ? seg.item.label : ' '}\n </button>\n ))}\n {overflow > 0 && (\n <span\n className=\"text-xs text-muted-foreground px-1\"\n style={{ gridColumn: '1 / span 7', gridRow: maxLanes + 1 }}\n >\n +{overflow} more\n </span>\n )}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n","/**\n * TimelineZoomControl — a slider that drives the Gantt's date-axis zoom.\n *\n * Extracted from <TimelineGantt> so the control can live wherever the app wants\n * it — the chart renders it in its own corner when uncontrolled, but a caller can\n * hoist it into a toolbar/header instead and feed the value back through\n * `zoom` / `onZoomChange` (the same controlled/uncontrolled split as `labelWidth`).\n */\nimport { ZoomIn, ZoomOut } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Zoom bounds shared by the control and the chart, so a hoisted control stays in\n * step with the plot scaling. STEP is the slider granularity. */\nexport const TIMELINE_ZOOM = { MIN: 1, MAX: 10, STEP: 0.25 } as const\n\nexport interface TimelineZoomControlProps {\n /** Current zoom factor (1 = fit). */\n zoom: number\n /** Fired with the next clamped zoom factor. */\n onZoomChange: (zoom: number) => void\n className?: string\n /** Prefix for the `data-testid`s this control emits. */\n testId?: string\n}\n\nexport function TimelineZoomControl({\n zoom,\n onZoomChange,\n className,\n testId = 'timeline-gantt',\n}: TimelineZoomControlProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1',\n className\n )}\n data-testid={`${testId}-zoom`}\n >\n <ZoomOut className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n type=\"range\"\n aria-label=\"Timeline zoom\"\n data-testid={`${testId}-zoom-slider`}\n min={TIMELINE_ZOOM.MIN}\n max={TIMELINE_ZOOM.MAX}\n step={TIMELINE_ZOOM.STEP}\n value={zoom}\n onChange={(e) => onZoomChange(Number(e.target.value))}\n className=\"h-1 w-24 cursor-pointer accent-primary\"\n />\n <ZoomIn className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"w-11 shrink-0 text-right text-xs tabular-nums text-muted-foreground\">\n {Math.round(zoom * 100)}%\n </span>\n </div>\n )\n}\n","/**\n * Gantt view over dated items — one swimlane per item on a shared date axis.\n *\n * The axis is what makes it readable: bars are positioned by real elapsed time,\n * so a span's WIDTH is its duration and an imprecise date shows AS imprecision —\n * an item dated \"2019\" is a year-wide bar, an emailed one a hairline tick.\n *\n * Rows are sorted chronologically here rather than left to the caller: this is a\n * chronology, and a caller handing over rows in creation order (newest first, as\n * a notes list does) would render the timeline backwards.\n *\n * Selecting a bar opens the detail panel. The panel owns the parts every caller\n * has — label, span, description — and hands the rest to `renderDetail`, which is\n * where an app adds its own context (source documents, an owner, a link).\n */\nimport { useRef, useState, type MouseEvent as ReactMouseEvent, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Calendar, ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TimelineItem } from './types'\nimport { formatSpan, parseIso, DAY_MS } from './span'\nimport { TimelineZoomControl } from './TimelineZoomControl'\n\n/** Unlabelled events read as neutral (slate-400), never as a rainbow — colour is\n * reserved for label meaning. */\nconst NEUTRAL_BAR = '#94a3b8'\n\n/**\n * Bar fill from an item's label colours (up to three). One colour fills solid;\n * two or three split the bar into equal, hard-edged HORIZONTAL bands (stacked\n * top-to-bottom) so each label's colour reads distinctly along the length of the\n * bar. No labels → a single neutral fill.\n */\nfunction barBackground(colors?: readonly string[]): string {\n const c = (colors ?? []).filter(Boolean).slice(0, 3)\n if (c.length === 0) return NEUTRAL_BAR\n if (c.length === 1) return c[0]\n const step = 100 / c.length\n const stops = c.map((col, i) => `${col} ${i * step}% ${(i + 1) * step}%`).join(', ')\n // 180deg = top→bottom, so the colours are horizontal bands across the bar's\n // width rather than vertical slices along it.\n return `linear-gradient(180deg, ${stops})`\n}\n\nconst WEEK_MS = 7 * 24 * 60 * 60 * 1000\n\nexport interface TimelineGanttProps<T extends TimelineItem = TimelineItem> {\n items: T[]\n /** The selected item, or null when the panel closes. */\n onSelect?: (item: T | null) => void\n /**\n * Ids to render as selected — e.g. rows a user checked in another view.\n * Their bar and label are highlighted so the selection carries across views;\n * this does not open the detail panel (that stays driven by clicks here).\n */\n selectedIds?: readonly string[]\n /** Extra detail-panel content for the selected item — sources, links, actions. */\n renderDetail?: (item: T) => ReactNode\n /** Width of the row-label gutter, in pixels. */\n labelWidth?: number\n /**\n * When provided, the label gutter becomes user-resizable: a drag handle\n * appears on its right edge and this fires with the new width (px) as the\n * user drags. The caller owns the value (so it can persist it) and feeds it\n * back via `labelWidth`.\n */\n onLabelWidthChange?: (width: number) => void\n /** Clamp for the resizable gutter, in pixels. */\n minLabelWidth?: number\n maxLabelWidth?: number\n /**\n * Controlled date-axis zoom (1 = fit). Provide BOTH `zoom` and `onZoomChange`\n * to drive it from outside — e.g. a button in the app's own header — which also\n * suppresses the chart's built-in corner control. Omit them to use the internal\n * state and the corner control.\n */\n zoom?: number\n onZoomChange?: (zoom: number) => void\n /**\n * Where the ‹ n / N › event navigator renders. Omit it for the built-in\n * inline placement. Pass a host element (e.g. a slot in the app's own\n * toolbar) to portal the navigator there instead — or `null` while that slot\n * isn't mounted yet, which renders no navigator at all rather than falling\n * back inline (avoids a flash of the inline one on first paint).\n */\n navigatorContainer?: HTMLElement | null\n /**\n * Denominator shown by the navigator (`n / N`). Defaults to the number of\n * dated items it can step through; a host may pass its full (filtered) item\n * count instead so the figure matches the list it shows elsewhere, even when\n * some of those items carry no date and so never appear here.\n */\n navigatorTotal?: number\n /** Shown when nothing in `items` carries a usable date. */\n emptyMessage?: string\n className?: string\n /** Prefix for every `data-testid` this view emits. */\n testId?: string\n}\n\n// Finer labels the closer the ticks are: full days when zoomed in, months at the\n// default zoom, years for very wide spans. `intervalDays` is the gap between ticks.\nfunction formatAxisDate(d: Date, intervalDays: number): string {\n if (intervalDays < 45) {\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })\n }\n if (intervalDays < 365 * 2) {\n return d.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })\n }\n return d.toLocaleDateString('en-US', { year: 'numeric' })\n}\n\nexport function TimelineGantt<T extends TimelineItem = TimelineItem>({\n items,\n onSelect,\n selectedIds,\n renderDetail,\n labelWidth = 240,\n onLabelWidthChange,\n minLabelWidth = 120,\n maxLabelWidth = 600,\n zoom: zoomProp,\n onZoomChange,\n navigatorContainer,\n navigatorTotal,\n emptyMessage = 'Nothing dated yet.',\n className,\n testId = 'timeline-gantt',\n}: TimelineGanttProps<T>) {\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n\n // Date-axis zoom scales the plot width so bars spread apart (in) or compress\n // (out) and the chart pans horizontally. Controlled when the caller supplies\n // both zoom + onZoomChange (it renders its own control then); otherwise the\n // chart owns the state and shows the corner control.\n const [internalZoom, setInternalZoom] = useState(1)\n const zoomControlled = zoomProp != null && onZoomChange != null\n const zoomValue = zoomControlled ? zoomProp : internalZoom\n const setZoomValue = zoomControlled ? onZoomChange : setInternalZoom\n\n // Drag-to-resize the label gutter. The start width/x are captured on\n // mousedown; window listeners let the drag continue outside the handle.\n const dragRef = useRef<{ startX: number; startWidth: number } | null>(null)\n\n // The chart column is the only scroller; the event gutter's body follows its\n // vertical position (mirrored on every scroll event) so labels track bars.\n const chartRef = useRef<HTMLDivElement>(null)\n const gutterBodyRef = useRef<HTMLDivElement>(null)\n const startResize = (e: ReactMouseEvent) => {\n if (!onLabelWidthChange) return\n e.preventDefault()\n dragRef.current = { startX: e.clientX, startWidth: labelWidth }\n const onMove = (ev: MouseEvent) => {\n const drag = dragRef.current\n if (!drag) return\n const next = Math.min(\n maxLabelWidth,\n Math.max(minLabelWidth, drag.startWidth + (ev.clientX - drag.startX))\n )\n onLabelWidthChange(next)\n }\n const onUp = () => {\n dragRef.current = null\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n }\n\n const rows = items\n .filter((i) => parseIso(i.start) !== null)\n .slice()\n .sort((a, b) => parseIso(a.start)!.getTime() - parseIso(b.start)!.getTime())\n\n const select = (index: number | null) => {\n setActiveIndex(index)\n onSelect?.(index === null ? null : rows[index])\n }\n\n // The event the navigator points at: whatever is selected from outside\n // (selectedIds — e.g. the fact open in the composer) takes priority, falling\n // back to a bar clicked here. `‹ n / N ›` steps that pointer through the rows\n // in chronological order, selecting each so the caller opens/highlights it.\n const selectedSet = new Set(selectedIds ?? [])\n const selectedRowIndex = rows.findIndex((r) => selectedSet.has(r.id))\n const currentIndex = selectedRowIndex >= 0 ? selectedRowIndex : activeIndex\n const goTo = (index: number) => select(Math.max(0, Math.min(rows.length - 1, index)))\n\n // Step through the events one by one: ‹ n / N › selects each row so the\n // caller opens/highlights it. Lives in the \"Event\" header cell unless the\n // host portals it into its own toolbar.\n const navigator = (\n <span className=\"flex items-center gap-0.5 text-sm font-light\" data-testid={`${testId}-nav`}>\n <button\n type=\"button\"\n aria-label=\"Previous event\"\n data-testid={`${testId}-nav-prev`}\n disabled={rows.length === 0 || currentIndex === null || currentIndex <= 0}\n onClick={() => goTo((currentIndex ?? 0) - 1)}\n className=\"rounded p-0.5 text-muted-foreground enabled:hover:bg-accent enabled:hover:text-foreground disabled:opacity-30\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"tabular-nums text-muted-foreground\" data-testid={`${testId}-nav-position`}>\n {currentIndex !== null ? currentIndex + 1 : '–'} /{' '}\n {navigatorTotal ?? (rows.length > 0 ? rows.length : '–')}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next event\"\n data-testid={`${testId}-nav-next`}\n disabled={rows.length === 0 || (currentIndex !== null && currentIndex >= rows.length - 1)}\n onClick={() => goTo(currentIndex === null ? 0 : currentIndex + 1)}\n className=\"rounded p-0.5 text-muted-foreground enabled:hover:bg-accent enabled:hover:text-foreground disabled:opacity-30\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </span>\n )\n\n if (rows.length === 0) {\n return (\n <div\n data-testid={`${testId}-empty-state`}\n className={cn(\n 'flex flex-col items-center justify-center py-16 text-muted-foreground',\n className\n )}\n >\n <Calendar className=\"w-12 h-12 mb-3 opacity-30\" />\n <p className=\"text-sm\">{emptyMessage}</p>\n {/* Nothing is dated, but the host's toolbar keeps its ‹ – / – › stepper\n rather than dropping a control and reflowing the row. */}\n {navigatorContainer && createPortal(navigator, navigatorContainer)}\n </div>\n )\n }\n\n // Axis bounds, padded so the first and last bars are not flush to the edge.\n const allDates = rows.flatMap((i) => {\n const s = parseIso(i.start)!\n return [s, parseIso(i.end ?? null) ?? s]\n })\n const minTime = Math.min(...allDates.map((d) => d.getTime()))\n const maxTime = Math.max(...allDates.map((d) => d.getTime()))\n const pad = Math.max((maxTime - minTime) * 0.04, WEEK_MS)\n const axisMin = new Date(minTime - pad)\n const axisMax = new Date(maxTime + pad)\n const axisRange = axisMax.getTime() - axisMin.getTime()\n\n const toPercent = (d: Date) =>\n Math.min(100, Math.max(0, ((d.getTime() - axisMin.getTime()) / axisRange) * 100))\n\n // More ticks — and finer date labels — the deeper you zoom in: the plot grows\n // wider, so the same span is subdivided into more, more-detailed marks. The\n // density is doubled (8×/step, capped at 50) so the axis reads at roughly twice\n // the resolution at every zoom level.\n const tickCount = Math.max(2, Math.min(50, Math.round(8 * zoomValue) + 1))\n const tickStep = axisRange / (tickCount - 1)\n const tickIntervalDays = tickStep / DAY_MS\n const ticks = Array.from(\n { length: tickCount },\n (_, i) => new Date(axisMin.getTime() + tickStep * i)\n )\n\n const today = new Date()\n const todayPct = toPercent(today)\n const showToday = today > axisMin && today < axisMax\n\n const activeItem = activeIndex !== null ? rows[activeIndex] : null\n // A detail slot that renders nothing for this item gets no divider either — an\n // empty labelled section reads as missing data rather than as no data.\n const detail = activeItem ? renderDetail?.(activeItem) : null\n\n return (\n <div className={cn('flex h-full min-h-0', className)}>\n {/* Chart area — two side-by-side columns: a fixed event gutter on the\n left and, on the right, the ONLY scroller. Keeping the gutter out of\n the scroller is what makes the horizontal scrollbar start at the\n chart's left edge rather than under the event list. */}\n <div className=\"relative flex min-h-0 flex-1 flex-col p-5\">\n {/* The event/timeline divider: a solid rule at the gutter's right edge\n (p-5 = 20px left padding + labelWidth), spanning the full chart\n height ABOVE both columns so panned bars and axis ticks slide under\n it — the two sections read as separate panes rather than running\n into each other. Deliberately heavier than the 2px/30% tick rules.\n z-30: the sticky axis header below is z-20 with an opaque background\n and comes later in the DOM, so an equal z-index would paint it over\n the rule where the two overlap. */}\n <div\n aria-hidden\n data-testid={`${testId}-gutter-divider`}\n style={{ left: `calc(20px + ${labelWidth}px)` }}\n className=\"pointer-events-none absolute top-0 bottom-0 z-30 w-[3px] -translate-x-1/2 bg-border\"\n />\n {/* Drag handle to resize the gutter, layered on the divider; the same\n full height makes it an easy target across all rows. */}\n {onLabelWidthChange && (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize event column\"\n data-testid={`${testId}-label-resizer`}\n onMouseDown={startResize}\n style={{ left: `calc(20px + ${labelWidth}px)` }}\n className=\"absolute top-0 bottom-0 z-30 w-2 -translate-x-1/2 cursor-col-resize group\"\n >\n <div className=\"mx-auto h-full w-[3px] transition-colors group-hover:bg-primary\" />\n </div>\n )}\n {/* When uncontrolled, the chart shows its own zoom control in the corner;\n a caller that passes zoom/onZoomChange renders one elsewhere (e.g. its\n page header) instead. */}\n {!zoomControlled && (\n <div className=\"absolute right-2 top-2 z-30 shadow-sm\">\n <TimelineZoomControl zoom={zoomValue} onZoomChange={setZoomValue} testId={testId} />\n </div>\n )}\n\n <div className=\"mt-1 flex min-h-0 flex-1\">\n {/* Event gutter — NOT a scroller. Its header stays put and its body\n is `overflow-hidden`, with scrollTop mirrored from the chart\n scroller (see onScroll below) so the labels track the bars.\n Alignment relies on every row and both header cells having the\n SAME fixed height in the two columns (h-6 header, h-9 rows). */}\n <div style={{ width: labelWidth, flexShrink: 0 }} className=\"flex min-h-0 flex-col\">\n <div className=\"mb-1 flex h-6 shrink-0 items-center gap-1 border-b border-border pr-3 text-sm font-medium text-muted-foreground\">\n <span>Event</span>\n {navigatorContainer === undefined ? (\n <span className=\"ml-auto\">{navigator}</span>\n ) : (\n navigatorContainer && createPortal(navigator, navigatorContainer)\n )}\n </div>\n <div\n ref={gutterBodyRef}\n data-testid={`${testId}-gutter`}\n className=\"min-h-0 flex-1 overflow-hidden\"\n // The gutter cannot scroll itself, so a wheel over the labels is\n // forwarded to the chart scroller (whose onScroll mirrors it back).\n onWheel={(e) => {\n if (chartRef.current) chartRef.current.scrollTop += e.deltaY\n }}\n >\n {/* pt-4 matches the chart rows wrapper (room for the \"today\"\n badge). The extra bottom padding keeps this column's scroll\n range at least as long as the chart's, which loses viewport\n height to its horizontal scrollbar when zoomed — otherwise the\n last rows could not follow it all the way down. */}\n <div className=\"pt-4 pb-6\">\n {rows.map((item, i) => {\n const isActive = activeIndex === i\n const isSelected = selectedIds?.includes(item.id) ?? false\n const highlighted = isActive || isSelected\n const zebra = i % 2 === 1\n return (\n // Fixed h-9 = the track row's h-7 bar + py-1, so the two\n // columns stay row-for-row aligned. Clicking the label\n // selects the row exactly like its bar does — the label IS\n // the event's title, so it should be a target too. Keep the\n // `break-words leading-snug` tail on THIS element — a scoped\n // CSS rule (.facts-gantt .break-words.leading-snug) clamps it\n // to one line. A selected row gets the tint plus a left\n // accent bar, mirroring the facts table's edited-row mark.\n <div\n key={item.id}\n onClick={() => select(isActive ? null : i)}\n className={cn(\n 'flex h-9 cursor-pointer items-center rounded border-l-[3px] pr-3 text-xs font-medium',\n isSelected\n ? 'border-l-primary bg-primary/10'\n : zebra\n ? 'border-l-transparent bg-muted'\n : 'border-l-transparent bg-background',\n highlighted ? 'text-foreground' : 'text-muted-foreground',\n 'break-words leading-snug'\n )}\n // The gutter clamps the label to one line; the native title\n // surfaces the full fact text on hover without a side panel.\n title={item.label}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {/* Chronological index, so events read as an ordered\n sequence (1, 2, 3 …) top to bottom, not just a stack. */}\n <span className=\"mr-1 tabular-nums text-muted-foreground/60\">{i + 1}.</span>\n {item.label}\n </span>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Chart column — the one scroller for BOTH axes: vertical always,\n horizontal when zoomed past 1×. The inner plot is scaled to\n `zoom × 100%`, so the axis ticks and every bar share one width. */}\n <div\n ref={chartRef}\n data-testid={`${testId}-scroller`}\n onScroll={(e) => {\n if (gutterBodyRef.current) gutterBodyRef.current.scrollTop = e.currentTarget.scrollTop\n }}\n className={cn(\n 'scrollbar-subtle relative min-h-0 min-w-0 flex-1 overflow-y-auto',\n zoomValue > 1 ? 'overflow-x-auto' : 'overflow-x-hidden'\n )}\n >\n <div\n className=\"relative min-h-full\"\n style={{ width: `${zoomValue * 100}%`, minWidth: '100%' }}\n >\n {/* Axis row — sticky at the top so it stays while the rows scroll.\n Same h-6 + border-b as the gutter's header cell, so the rule\n under the two reads as one continuous line. */}\n <div className=\"sticky top-0 z-20 mb-1 h-6 border-b border-border bg-background\">\n {ticks.map((tick, i) => {\n // Middle ticks centre on their date. The first (oldest) and last\n // ticks instead anchor their inner edge so labels don't spill\n // into the event column or off the right edge of the chart.\n const isFirst = i === 0\n const isLast = i === ticks.length - 1\n const edgeShift = isFirst\n ? 'translate-x-1'\n : isLast\n ? '-translate-x-full'\n : '-translate-x-1/2'\n return (\n <span\n key={i}\n style={{ left: `${toPercent(tick)}%` }}\n className={`absolute bottom-1 text-xs text-muted-foreground whitespace-nowrap select-none ${edgeShift}`}\n >\n {formatAxisDate(tick, tickIntervalDays)}\n </span>\n )\n })}\n </div>\n\n {/* Swimlane rows. The today line spans THIS wrapper — every row, the\n full content height — so it is never cut off partway down the list.\n The wrapper's top padding gives the \"today\" badge room. */}\n <div className=\"relative pt-4\">\n {/* A faint vertical rule under each axis tick, spanning every row,\n so a bar's position is easy to read against the dates. The\n wrapper IS the plot, so a plain percentage places the rule. */}\n {ticks.map((tick, i) => (\n <div\n key={`grid-${i}`}\n aria-hidden\n className=\"pointer-events-none absolute top-0 bottom-0 z-10 border-l-2 border-border/30\"\n style={{ left: `${toPercent(tick)}%` }}\n />\n ))}\n {showToday && (\n <div\n className=\"pointer-events-none absolute top-0 bottom-0 z-10\"\n style={{ left: `${todayPct}%` }}\n >\n <div className=\"h-full border-l-2 border-dashed border-muted-foreground/50\" />\n <span className=\"absolute top-0 -translate-x-1/2 rounded border bg-background px-1 text-xs text-muted-foreground\">\n today\n </span>\n </div>\n )}\n\n {rows.map((item, i) => {\n const startDate = parseIso(item.start)!\n const endDate = parseIso(item.end ?? null) ?? startDate\n const leftPct = toPercent(startDate)\n // A single-day event is exactly one day wide, never a fixed\n // percentage of the axis: percentages are TIME, so a 1% floor\n // on a three-year axis drew one day as ~11 days — and zooming\n // in (which only stretches the plot) made that lie plainer,\n // the bar visibly straddling weeks of day ticks. Staying\n // legible when zoomed OUT is the job of the bar's `min-w-[6px]`\n // CSS floor, which is measured in pixels, where it belongs.\n const dayPct = (DAY_MS / axisRange) * 100\n const widthPct = Math.max(dayPct, toPercent(endDate) - toPercent(startDate))\n const isActive = activeIndex === i\n // Selected in this view (a bar click) OR carried in from another\n // view (selectedIds) — both draw the row as highlighted.\n const isSelected = selectedIds?.includes(item.id) ?? false\n const highlighted = isActive || isSelected\n // Zebra striping: every other row takes a subtle tint (like a\n // spreadsheet) so a long bar is easy to trace back to its label.\n // Applied to BOTH columns, with the same row index.\n const zebra = i % 2 === 1\n\n return (\n // Fixed h-9 (h-7 bar + py-1) — the gutter's label rows use\n // the same height, which is what keeps the columns aligned.\n <div key={item.id} className=\"h-9 py-1\">\n <div\n className={cn(\n 'relative h-7 overflow-visible rounded-md border border-border',\n isSelected ? 'bg-primary/10' : zebra ? 'bg-muted' : 'bg-background'\n )}\n >\n <button\n data-testid={`${testId}-bar-${i}`}\n aria-label={item.label}\n aria-pressed={highlighted}\n style={{\n left: `${leftPct}%`,\n width: `${widthPct}%`,\n // Colour-coded by the item's labels (up to three), not by\n // row order — see barBackground / TimelineItem.colors.\n background: barBackground(item.colors),\n boxShadow: highlighted\n ? '0 0 0 2px white, 0 0 0 4px #6366f1'\n : '0 1px 3px rgba(0,0,0,.2)',\n }}\n // The bar carries NO text — the gutter label to its left is\n // its title, and the exact span is one click (or hover) away.\n title={formatSpan(item.start, item.end) || undefined}\n className=\"absolute top-0.5 h-6 min-w-[6px] rounded cursor-pointer transition-[filter] hover:brightness-110 focus:outline-none\"\n onClick={() => select(isActive ? null : i)}\n />\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Side panel */}\n <div\n data-testid={`${testId}-side-panel`}\n className={cn(\n 'border-l bg-muted/20 flex flex-col shrink-0 overflow-hidden transition-all duration-300',\n activeItem ? 'w-60 open' : 'w-0'\n )}\n >\n <div\n className={cn(\n 'w-60 p-4 flex flex-col gap-3 transition-opacity duration-200',\n activeItem ? 'opacity-100' : 'opacity-0'\n )}\n >\n {activeItem && (\n <>\n <div className=\"flex justify-end\">\n <button\n data-testid={`${testId}-panel-close`}\n className=\"w-6 h-6 rounded flex items-center justify-center text-muted-foreground hover:bg-muted\"\n onClick={() => select(null)}\n aria-label=\"Close panel\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n <div>\n <div\n data-testid={`${testId}-panel-title`}\n className=\"text-sm font-semibold text-foreground leading-snug\"\n >\n {activeIndex !== null && (\n <span className=\"mr-1 tabular-nums text-muted-foreground\">\n {activeIndex + 1}.\n </span>\n )}\n {activeItem.label}\n </div>\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"w-3 h-3 shrink-0\" />\n <span>{formatSpan(activeItem.start, activeItem.end) || 'Date unknown'}</span>\n </div>\n </div>\n\n {activeItem.description && (\n <>\n <hr className=\"border-border\" />\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-1\">\n Summary\n </div>\n <p\n data-testid={`${testId}-panel-desc`}\n className=\"text-xs text-muted-foreground leading-relaxed\"\n >\n {activeItem.description}\n </p>\n </div>\n </>\n )}\n\n {detail && (\n <>\n <hr className=\"border-border\" />\n {detail}\n </>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/lib/format.ts
5
+ function formatCurrency(value, {
6
+ currency,
7
+ locale = "en-GB",
8
+ compact = false
9
+ }) {
10
+ return new Intl.NumberFormat(locale, {
11
+ style: "currency",
12
+ currency,
13
+ maximumFractionDigits: compact && Math.abs(value) >= 1e3 ? 1 : 0,
14
+ notation: compact ? "compact" : "standard"
15
+ }).format(value);
16
+ }
17
+ function initials(name) {
18
+ const parts = name.trim().split(/\s+/);
19
+ if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
20
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
21
+ }
22
+ function parseIso(iso) {
23
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(iso);
24
+ const d = new Date(dateOnly ? `${iso}T00:00:00` : iso);
25
+ if (Number.isNaN(d.getTime())) throw new Error(`Invalid ISO date: ${iso}`);
26
+ return d;
27
+ }
28
+ function fmtDate(iso) {
29
+ try {
30
+ return new Intl.DateTimeFormat("en-GB", {
31
+ day: "numeric",
32
+ month: "short",
33
+ year: "numeric"
34
+ }).format(parseIso(iso));
35
+ } catch {
36
+ return iso;
37
+ }
38
+ }
39
+ function fmtDateTime(iso) {
40
+ try {
41
+ return new Intl.DateTimeFormat("en-GB", {
42
+ day: "numeric",
43
+ month: "short",
44
+ year: "numeric",
45
+ hour: "2-digit",
46
+ minute: "2-digit",
47
+ hour12: false
48
+ }).format(parseIso(iso));
49
+ } catch {
50
+ return iso;
51
+ }
52
+ }
53
+ var RELATIVE_UNITS = [
54
+ ["year", 31536e3],
55
+ ["month", 2592e3],
56
+ ["week", 604800],
57
+ ["day", 86400],
58
+ ["hour", 3600],
59
+ ["minute", 60],
60
+ ["second", 1]
61
+ ];
62
+ function fromNow(iso, from = /* @__PURE__ */ new Date()) {
63
+ try {
64
+ const diffSeconds = (parseIso(iso).getTime() - from.getTime()) / 1e3;
65
+ const abs = Math.abs(diffSeconds);
66
+ const rtf = new Intl.RelativeTimeFormat("en-GB", { numeric: "always" });
67
+ for (const [unit, secs] of RELATIVE_UNITS) {
68
+ if (abs >= secs || unit === "second") {
69
+ const value = Math.round(diffSeconds / secs);
70
+ return rtf.format(value, unit);
71
+ }
72
+ }
73
+ return rtf.format(0, "second");
74
+ } catch {
75
+ return iso;
76
+ }
77
+ }
78
+ function daysUntil(iso, from = /* @__PURE__ */ new Date()) {
79
+ try {
80
+ const target = parseIso(iso);
81
+ const a = Date.UTC(target.getFullYear(), target.getMonth(), target.getDate());
82
+ const b = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate());
83
+ return Math.round((a - b) / 864e5);
84
+ } catch {
85
+ return 0;
86
+ }
87
+ }
88
+ function hrs(n) {
89
+ return `${n.toFixed(1)}h`;
90
+ }
91
+ function pct(n) {
92
+ return `${Math.round(n)}%`;
93
+ }
94
+ function formatPageRefs(pages) {
95
+ const sorted = [...new Set(pages)].sort((a, b) => a - b);
96
+ if (sorted.length === 0) return "";
97
+ const parts = [];
98
+ let start = sorted[0];
99
+ let end = sorted[0];
100
+ for (const page of sorted.slice(1)) {
101
+ if (page === end + 1) {
102
+ end = page;
103
+ continue;
104
+ }
105
+ parts.push(start === end ? `${start}` : `${start}\u2013${end}`);
106
+ start = end = page;
107
+ }
108
+ parts.push(start === end ? `${start}` : `${start}\u2013${end}`);
109
+ return `${sorted.length === 1 ? "p" : "pp"} ${parts.join(", ")}`;
110
+ }
111
+
112
+ exports.daysUntil = daysUntil;
113
+ exports.fmtDate = fmtDate;
114
+ exports.fmtDateTime = fmtDateTime;
115
+ exports.formatCurrency = formatCurrency;
116
+ exports.formatPageRefs = formatPageRefs;
117
+ exports.fromNow = fromNow;
118
+ exports.hrs = hrs;
119
+ exports.initials = initials;
120
+ exports.pct = pct;
121
+ //# sourceMappingURL=chunk-WJMEXTVD.cjs.map
122
+ //# sourceMappingURL=chunk-WJMEXTVD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/format.ts"],"names":[],"mappings":"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","file":"chunk-WJMEXTVD.cjs","sourcesContent":["/**\n * Host-app formatting helpers — currency, initials, dates, durations and\n * percentages. Dates default to en-GB (\"d MMM yyyy\"); currency takes an explicit ISO code. Nothing here is\n * brand-specific, so every host app shares them.\n *\n * Dependency-free on purpose (uses the platform `Intl` APIs) so the package\n * stays light and needs no date library.\n */\n\n/** Format an amount in an ISO 4217 currency, e.g. £1,240,000 or £12.4k when `compact`. */\nexport function formatCurrency(\n value: number,\n {\n currency,\n locale = 'en-GB',\n compact = false,\n }: { currency: string; locale?: string; compact?: boolean }\n): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n maximumFractionDigits: compact && Math.abs(value) >= 1000 ? 1 : 0,\n notation: compact ? 'compact' : 'standard',\n }).format(value)\n}\n\n/** Initials from a person's name, e.g. \"Amara N. Okafor\" -> \"AO\". */\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase()\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n}\n\n/**\n * Parse an ISO string. Date-only strings (\"2026-03-12\") are read as LOCAL\n * midnight (matching date-fns `parseISO`), not UTC, so day-level maths and\n * formatting don't drift across time zones.\n */\nfunction parseIso(iso: string): Date {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(iso)\n const d = new Date(dateOnly ? `${iso}T00:00:00` : iso)\n if (Number.isNaN(d.getTime())) throw new Error(`Invalid ISO date: ${iso}`)\n return d\n}\n\n/** \"12 Mar 2026\" */\nexport function fmtDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\n/** \"12 Mar 2026, 14:30\" */\nexport function fmtDateTime(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000],\n ['month', 2_592_000],\n ['week', 604_800],\n ['day', 86_400],\n ['hour', 3_600],\n ['minute', 60],\n ['second', 1],\n]\n\n/** \"3 days ago\" / \"in 2 hours\" — largest whole unit, like date-fns strict. */\nexport function fromNow(iso: string, from: Date = new Date()): string {\n try {\n const diffSeconds = (parseIso(iso).getTime() - from.getTime()) / 1000\n const abs = Math.abs(diffSeconds)\n const rtf = new Intl.RelativeTimeFormat('en-GB', { numeric: 'always' })\n for (const [unit, secs] of RELATIVE_UNITS) {\n if (abs >= secs || unit === 'second') {\n const value = Math.round(diffSeconds / secs)\n return rtf.format(value, unit)\n }\n }\n return rtf.format(0, 'second')\n } catch {\n return iso\n }\n}\n\n/** Signed day count to a date from a reference day. Negative = overdue. */\nexport function daysUntil(iso: string, from: Date = new Date()): number {\n try {\n const target = parseIso(iso)\n // Compare calendar days at local midnight, ignoring time-of-day.\n const a = Date.UTC(target.getFullYear(), target.getMonth(), target.getDate())\n const b = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())\n return Math.round((a - b) / 86_400_000)\n } catch {\n return 0\n }\n}\n\n/** Compact hours, e.g. 12.5h */\nexport function hrs(n: number): string {\n return `${n.toFixed(1)}h`\n}\n\n/** Percentage with no decimals, e.g. 82% */\nexport function pct(n: number): string {\n return `${Math.round(n)}%`\n}\n\n/**\n * Page references for a set of cited pages: \"p 2\", \"pp 2, 5\", \"pp 2–4, 9\".\n *\n * Pages, not passage counts — the page is what a reader turns to; how many\n * passages sit inside it is detail they did not ask for. Consecutive pages\n * collapse into a range, the same way a contiguous run of passages collapses\n * into a single mark in the viewer.\n */\nexport function formatPageRefs(pages: number[]): string {\n const sorted = [...new Set(pages)].sort((a, b) => a - b)\n if (sorted.length === 0) return ''\n const parts: string[] = []\n let start = sorted[0]\n let end = sorted[0]\n for (const page of sorted.slice(1)) {\n if (page === end + 1) {\n end = page\n continue\n }\n parts.push(start === end ? `${start}` : `${start}–${end}`)\n start = end = page\n }\n parts.push(start === end ? `${start}` : `${start}–${end}`)\n return `${sorted.length === 1 ? 'p' : 'pp'} ${parts.join(', ')}`\n}\n"]}