@arbidocs/blocks 0.3.184 → 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 +164 -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,8 @@
1
+ /**
2
+ * The column count for a grid of `count` equal tiles in `width` pixels, chosen so the last row is
3
+ * never left with a lone orphan: of the counts that fit (each column at least `minTile` wide),
4
+ * take the one that leaves the fewest empty cells in the last row, preferring more columns on a
5
+ * tie (never fewer than two columns when two fit). Four tiles resolve to 2x2 where three would fit
6
+ * and 4 across when there is room for four; six resolve to 3x2.
7
+ */
8
+ export declare function balancedColumns(count: number, width: number, minTile?: number, gap?: number): number;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Host-app formatting helpers — currency, initials, dates, durations and
3
+ * percentages. Dates default to en-GB ("d MMM yyyy"); currency takes an explicit ISO code. Nothing here is
4
+ * brand-specific, so every host app shares them.
5
+ *
6
+ * Dependency-free on purpose (uses the platform `Intl` APIs) so the package
7
+ * stays light and needs no date library.
8
+ */
9
+ /** Format an amount in an ISO 4217 currency, e.g. £1,240,000 or £12.4k when `compact`. */
10
+ export declare function formatCurrency(value: number, { currency, locale, compact, }: {
11
+ currency: string;
12
+ locale?: string;
13
+ compact?: boolean;
14
+ }): string;
15
+ /** Initials from a person's name, e.g. "Amara N. Okafor" -> "AO". */
16
+ export declare function initials(name: string): string;
17
+ /** "12 Mar 2026" */
18
+ export declare function fmtDate(iso: string): string;
19
+ /** "12 Mar 2026, 14:30" */
20
+ export declare function fmtDateTime(iso: string): string;
21
+ /** "3 days ago" / "in 2 hours" — largest whole unit, like date-fns strict. */
22
+ export declare function fromNow(iso: string, from?: Date): string;
23
+ /** Signed day count to a date from a reference day. Negative = overdue. */
24
+ export declare function daysUntil(iso: string, from?: Date): number;
25
+ /** Compact hours, e.g. 12.5h */
26
+ export declare function hrs(n: number): string;
27
+ /** Percentage with no decimals, e.g. 82% */
28
+ export declare function pct(n: number): string;
29
+ /**
30
+ * Page references for a set of cited pages: "p 2", "pp 2, 5", "pp 2–4, 9".
31
+ *
32
+ * Pages, not passage counts — the page is what a reader turns to; how many
33
+ * passages sit inside it is detail they did not ask for. Consecutive pages
34
+ * collapse into a range, the same way a contiguous run of passages collapses
35
+ * into a single mark in the viewer.
36
+ */
37
+ export declare function formatPageRefs(pages: number[]): string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Observe an element's size. Where `ResizeObserver` does not exist (jsdom, very old webviews)
3
+ * this is a no-op, so blocks render everywhere without a host-provided polyfill. Returns the
4
+ * disconnect function.
5
+ */
6
+ export declare function observeResize(element: Element, callback: ResizeObserverCallback): () => void;
@@ -0,0 +1,24 @@
1
+ /** Bits of estimated entropy at which the meter reads "Strong". */
2
+ export declare const STRONG_BITS = 75;
3
+ export type StrengthScore = 0 | 1 | 2;
4
+ export interface PasswordStrength {
5
+ /** 0 = rejected, 1 = accepted (minimal), 2 = strong. */
6
+ score: StrengthScore;
7
+ label: string;
8
+ }
9
+ /**
10
+ * Estimated entropy in bits (length x log2(alphabet)). Length is the dominant term, which is also
11
+ * what NIST SP 800-63B recommends over composition rules: a 25-character passphrase of plain words
12
+ * outranks "Password123!".
13
+ */
14
+ export declare function estimateEntropyBits(password: string): number;
15
+ /**
16
+ * Three states matching the three colours the form uses: rejected (does not meet the host's
17
+ * requirements), accepted ("could be better") and strong.
18
+ */
19
+ export declare function getPasswordStrength(password: string, meetsRequirements: boolean): PasswordStrength;
20
+ /**
21
+ * Advice computed from the same entropy estimate as the meter, so the hint can never tell you to
22
+ * do something that would not actually move it.
23
+ */
24
+ export declare function getStrengthHint(password: string): string;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Headless sidebar behaviour (no DOM, no store): how the sidebar lays out for a given set of
3
+ * inputs, and the settle timing that keeps labels/tips from squeezing during the width transition.
4
+ *
5
+ * - `drawer` small-screen off-canvas panel (opened by the app bar's menu button)
6
+ * - `collapsed` hidden (width 0) and only revealed while `isPeeking` is on
7
+ * - `pinned` full width, inline, pushes the content
8
+ * - `rail` icon strip that floats open to full width while hovered
9
+ */
10
+ export type SidebarMode = 'drawer' | 'collapsed' | 'pinned' | 'rail';
11
+ export interface SidebarModeInput {
12
+ isSmallScreen: boolean;
13
+ /** The phone drawer was requested open. */
14
+ isDrawerRequested: boolean;
15
+ isCollapsed: boolean;
16
+ isPinned: boolean;
17
+ isHovering: boolean;
18
+ /** The pointer is over the collapsed-sidebar reveal target. */
19
+ isPeeking?: boolean;
20
+ /**
21
+ * Tablet-width viewport (above the phone drawer breakpoint but too narrow to give the content a
22
+ * usable column next to a 255px panel): pinning is ignored and the sidebar stays an icon rail.
23
+ */
24
+ isNarrow?: boolean;
25
+ }
26
+ export interface SidebarLayout {
27
+ mode: SidebarMode;
28
+ /** Labels should be shown (the panel is, or is becoming, full width). */
29
+ expanded: boolean;
30
+ /** Phones: nothing is rendered until the drawer opens. */
31
+ hidden: boolean;
32
+ /** Hover state that actually applies (never on touch-sized screens). */
33
+ hovering: boolean;
34
+ }
35
+ export declare function resolveSidebarLayout(input: SidebarModeInput): SidebarLayout;
36
+ /**
37
+ * Settle timing around the width transition (default 300ms):
38
+ * - `labelsExpanded` switches on immediately but off only after the transition, so labels do not
39
+ * snap to icon-only while the panel is still wide;
40
+ * - `tipsVisible` is the opposite: width-bound content (a tip card) appears only once the panel
41
+ * has fully opened and disappears the instant collapse starts.
42
+ */
43
+ export declare function useSidebarSettle(expanded: boolean, settleMs?: number): {
44
+ labelsExpanded: boolean;
45
+ tipsVisible: boolean;
46
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Compose a stable, kebab-case data-testid from parts.
3
+ * Convention: {area}-{element}[-{qualifier}...]
4
+ * tid("orders", "row", "CLM-2026-0042") -> "orders-row-clm-2026-0042"
5
+ * Keeps Playwright selectors predictable across a host app.
6
+ */
7
+ export declare function tid(...parts: Array<string | number | undefined | false>): string;
@@ -0,0 +1,11 @@
1
+ import { type RefObject } from 'react';
2
+ /**
3
+ * Behaviour of a modal surface (off-canvas drawer, full-screen dock) while it is open: the page
4
+ * behind does not scroll, Escape closes it, focus moves inside and Tab/Shift+Tab cycle within it
5
+ * (portalled popovers opened from inside stay reachable: only the wrap-around is intercepted),
6
+ * and focus returns to the opener on close. Restores the previous body overflow on close/unmount.
7
+ *
8
+ * Pass `containerRef` (the element carrying `role="dialog"`) to get the focus handling; without it
9
+ * only scroll lock and Escape apply.
10
+ */
11
+ export declare function useDrawerBehavior(isOpen: boolean, onClose: () => void, containerRef?: RefObject<HTMLElement | null>): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * State that is controlled when `value` is passed and uncontrolled (seeded by `defaultValue`)
3
+ * otherwise. `onChange` fires in both modes.
4
+ */
5
+ export declare function useControllableState<T>(value: T | undefined, defaultValue: T, onChange?: (next: T) => void): [T, (next: T) => void];
@@ -0,0 +1,15 @@
1
+ import { type RefObject } from 'react';
2
+ export interface UseDismissibleCardOptions {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ /** The card's content: clicks inside never dismiss. */
6
+ contentRef: RefObject<HTMLElement | null>;
7
+ /** Focused when the card opens (the panel is opened to find something: typing just works). */
8
+ focusRef?: RefObject<HTMLElement | null>;
9
+ }
10
+ /**
11
+ * Behaviour of a click-opened card: focus its search box on open, Escape closes it, and a press
12
+ * outside it (or outside any portaled popper that belongs to it, e.g. a dropdown menu opened from
13
+ * inside) closes it too. Bound only while open.
14
+ */
15
+ export declare function useDismissibleCard({ isOpen, onClose, contentRef, focusRef, }: UseDismissibleCardOptions): void;
@@ -0,0 +1,42 @@
1
+ import { type KeyboardEvent } from 'react';
2
+ /** Id of the option at `index` in the listbox `listboxId`. Rows and the combobox agree on it. */
3
+ export declare function listOptionId(listboxId: string, index: number): string;
4
+ export interface UseListKeyNavOptions<T> {
5
+ /** Whether the list is currently shown. Keys fall through when false. */
6
+ open: boolean;
7
+ items: ReadonlyArray<T>;
8
+ /** Enter / Tab on the highlighted row. */
9
+ onPick: (item: T) => void;
10
+ /** Escape. */
11
+ onDismiss?: () => void;
12
+ /** Changing this resets the highlight to the first row (e.g. the filter query). */
13
+ resetKey?: unknown;
14
+ }
15
+ /** ARIA attributes that make the text field the combobox that owns the list. */
16
+ export interface ListComboboxProps {
17
+ role: 'combobox';
18
+ 'aria-autocomplete': 'list';
19
+ 'aria-haspopup': 'listbox';
20
+ 'aria-expanded': true;
21
+ 'aria-controls': string;
22
+ 'aria-activedescendant': string;
23
+ }
24
+ export interface UseListKeyNav {
25
+ /** Pass to the list (`listboxId`) so the field's `aria-controls` points at it. */
26
+ listboxId: string;
27
+ /**
28
+ * Spread onto the text field (`<input>` or `<textarea>`). Empty while the list is closed, so a
29
+ * prompt that is usually just a text box is not announced as a collapsed combobox; it becomes
30
+ * the combobox (expanded, with its active option) the moment the list opens.
31
+ */
32
+ comboboxProps: ListComboboxProps | Record<string, never>;
33
+ selectedIndex: number;
34
+ setSelectedIndex: (index: number) => void;
35
+ /** Call first in the textarea `onKeyDown`. Returns true when the key was consumed. */
36
+ handleKeyDown: (event: KeyboardEvent<HTMLElement>) => boolean;
37
+ }
38
+ /**
39
+ * Headless keyboard navigation for an autocomplete list that sits over a text field:
40
+ * ArrowUp/ArrowDown wrap, Enter/Tab pick, Escape dismisses. Only consumes keys while open.
41
+ */
42
+ export declare function useListKeyNav<T>({ open, items, onPick, onDismiss, resetKey, }: UseListKeyNavOptions<T>): UseListKeyNav;
@@ -0,0 +1,15 @@
1
+ import { type ClipboardEvent } from 'react';
2
+ /** True when the text is big enough that a composer should fold it behind a "Pasted text" chip. */
3
+ export declare function isLongPastedText(value: string): boolean;
4
+ export interface UseLongPaste {
5
+ /** The draft is long AND the user pasted it (typing a long text never folds it). */
6
+ isCollapsed: boolean;
7
+ /** Wire to the textarea `onPaste`. Folds when the post-paste draft is long. */
8
+ onPaste: (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => void;
9
+ /** Wire to the textarea `onChange`: unfolds once the draft is short again. */
10
+ onValueChange: (nextValue: string) => void;
11
+ /** Unfold (the "Expand" chip). */
12
+ expand: () => void;
13
+ }
14
+ /** Headless long-paste folding for a composer draft. */
15
+ export declare function useLongPaste(value: string): UseLongPaste;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Props for a Radix `DialogContent` that put focus back where it was when the dialog opened.
3
+ *
4
+ * Radix Dialog returns focus to its `Trigger` on close and, when the dialog is opened from state
5
+ * (no `DialogTrigger`, as every controlled dialog in the blocks is), drops it to `<body>`:
6
+ * a keyboard or screen-reader user loses their place. Spread the result on `DialogContent`.
7
+ */
8
+ export declare function useRestoreFocus(): {
9
+ onOpenAutoFocus: (event: Event) => void;
10
+ onCloseAutoFocus: (event: Event) => void;
11
+ };
@@ -0,0 +1,34 @@
1
+ /** Which folders and labels a run is limited to. Empty = everything. */
2
+ export interface DocumentScope {
3
+ /** Folder paths; `''` is the "unfiled" bucket. */
4
+ folders: string[];
5
+ /** Label (tag) ids. */
6
+ labels: string[];
7
+ }
8
+ export interface UseScopeSelectionOptions {
9
+ /** Every folder path in the tree (not including the unfiled bucket). */
10
+ folderPaths: string[];
11
+ /** Whether the unfiled bucket is shown as a row. */
12
+ hasUnfiled: boolean;
13
+ scope: DocumentScope;
14
+ onScopeChange: (scope: DocumentScope) => void;
15
+ }
16
+ /**
17
+ * Headless selection logic for a folder + label scope picker.
18
+ *
19
+ * Folders use hierarchical selection: ticking "contracts" also ticks
20
+ * "contracts/2024", and unticking removes the whole subtree. "All" ticks every
21
+ * row, which is NOT the same as an empty scope: empty means "the whole
22
+ * workspace, whatever lands in it later", all-ticked means "these folders, as
23
+ * they are now".
24
+ */
25
+ export declare function useScopeSelection({ folderPaths, hasUnfiled, scope, onScopeChange, }: UseScopeSelectionOptions): {
26
+ selectedFolders: Set<string>;
27
+ selectedLabels: Set<string>;
28
+ allSelected: boolean;
29
+ someSelected: boolean;
30
+ hasSelection: boolean;
31
+ toggleFolder: (path: string) => void;
32
+ toggleAllFolders: () => void;
33
+ toggleLabel: (labelId: string) => void;
34
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Navigation shapes shared by host app shells. The concrete nav manifest (which
3
+ * modules, in what order) is per-app data the app supplies; these interfaces
4
+ * give it a typed contract the shared shell can render.
5
+ */
6
+ import type { LucideIcon } from 'lucide-react';
7
+ export interface AppNavItem {
8
+ to: string;
9
+ label: string;
10
+ icon: LucideIcon;
11
+ id: string;
12
+ /** true for ARBI-powered modules (document management + agentic AI). */
13
+ arbi?: boolean;
14
+ end?: boolean;
15
+ }
16
+ export interface AppNavSection {
17
+ heading: string;
18
+ items: AppNavItem[];
19
+ }
@@ -0,0 +1,20 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { BlockLinkComponent } from '../components/blockLink';
3
+ /**
4
+ * The only way blocks reach the host app's environment. Blocks never import a router, a toast
5
+ * library or an app store; the host injects what it has, and every field has a safe default so a
6
+ * block renders correctly with no provider at all.
7
+ */
8
+ export interface BlocksEnvironment {
9
+ /** Router-aware link (keeps navigation in-SPA). Default: a plain `<a href>`. */
10
+ linkComponent?: BlockLinkComponent;
11
+ /** Imperative navigation for buttons and keyboard shortcuts. Default: `window.location.assign`. */
12
+ navigate: (href: string) => void;
13
+ /** Surface a transient message. Default: no-op. */
14
+ notify: (message: string, kind?: 'success' | 'error' | 'info') => void;
15
+ }
16
+ export interface BlocksProviderProps extends Partial<BlocksEnvironment> {
17
+ children: ReactNode;
18
+ }
19
+ export declare function BlocksProvider({ children, linkComponent, navigate, notify }: BlocksProviderProps): import("react").JSX.Element;
20
+ export declare function useBlocksEnvironment(): BlocksEnvironment;
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * A TooltipProvider that mounts once: inside another `BlocksTooltipProvider` (e.g. a Sidebar under
4
+ * Shell.Root) it renders its children as-is, so tooltips share one delay group. Blocks that show
5
+ * tooltips use this instead of the kit's provider.
6
+ */
7
+ export declare function BlocksTooltipProvider({ children }: {
8
+ children: ReactNode;
9
+ }): import("react").JSX.Element;
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var test = require('@playwright/test');
4
-
5
3
  // src/record/index.ts
6
4
  var DEFAULTS = {
7
5
  displayFont: "ui-serif, Georgia, serif",
@@ -149,14 +147,14 @@ function createCinematic(config) {
149
147
  await page.getByTestId(ids.email).fill(config.creds.email);
150
148
  await page.getByTestId(ids.password).fill(config.creds.password);
151
149
  await page.getByTestId(ids.submit).click();
152
- await test.expect(page).toHaveURL(appUrlPattern, { timeout: 45e3 });
150
+ await page.waitForURL(appUrlPattern, { timeout: 45e3 });
153
151
  return;
154
152
  }
155
153
  await caption(page, opts.caption ?? `${b.firmLabel} \u2014 signing in.`, 1600);
156
154
  await type(page, ids.email, config.creds.email);
157
155
  await type(page, ids.password, config.creds.password);
158
156
  await click(page, ids.submit);
159
- await test.expect(page).toHaveURL(appUrlPattern, { timeout: 45e3 });
157
+ await page.waitForURL(appUrlPattern, { timeout: 45e3 });
160
158
  await beat(page, 800);
161
159
  }
162
160
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/record/index.ts"],"names":["kicker","title","subtitle","expect"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cinematic recording harness — firm-agnostic.\n *\n * Turns a Playwright run into a narrated product demo: a visible cursor that\n * glides between targets, a click ripple, a caption bar that narrates each step,\n * full-screen chapter \"cover\" cards, and human-speed pacing. Every firm app gets\n * the same polished demo capability from one factory — brand colours, fonts,\n * credentials and the login flow arrive as config, so nothing here names a firm.\n *\n * Pair with a Playwright project that records video (see the firm's\n * `playwright.record.config.ts`: video on, a large viewport, some slowMo).\n *\n * Usage in a `*.record.ts` spec:\n * const cine = createCinematic({ brand, creds })\n * await cine.installStage(page) // before the first navigation\n * await cine.cover(page, { kicker, title, subtitle })\n * await cine.login(page)\n * await cine.uncover(page)\n * await cine.caption(page, \"Opening the flagship matter…\")\n * await cine.click(page, \"matters-row-…\")\n *\n * `@playwright/test` is a peer dependency — it is only imported by e2e specs, so\n * it never reaches an app bundle.\n */\nimport { type Page, type Locator, expect } from '@playwright/test'\n\n/** Brand skin for the on-screen chrome. All optional — sensible neutral defaults. */\nexport interface CinematicBrand {\n /** Footer line on chapter cards, e.g. \"Meridian · AI-native counsel\". */\n firmLabel: string\n /** Serif display font for cover titles (CSS font-family value). */\n displayFont?: string\n /** Sans font for captions + cover body. */\n sansFont?: string\n /** Cursor dot radial-gradient stops. */\n cursor?: { from: string; to: string }\n /** Click-ripple ring colour. */\n ripple?: string\n /** Chapter-card background gradient stops. */\n cover?: { from: string; mid: string; to: string }\n /** Accent (kicker text + rule) on chapter cards. */\n accent?: string\n /** Caption bar background base colour. */\n ink?: string\n /** Cover title text colour. */\n coverTitle?: string\n}\n\nexport interface CinematicCreds {\n email: string\n password: string\n}\n\nexport interface CinematicConfig {\n brand: CinematicBrand\n creds: CinematicCreds\n /** Login route (default \"/app/login\"). */\n loginPath?: string\n /** URL the app lands on after auth (default /\\/app$/). */\n appUrlPattern?: RegExp\n /** Login form testids (defaults match the shared AppShell/login convention). */\n testIds?: { email?: string; password?: string; submit?: string }\n}\n\nexport interface Cinematic {\n installStage(page: Page): Promise<void>\n cover(\n page: Page,\n opts: { kicker: string; title: string; subtitle?: string },\n holdMs?: number\n ): Promise<void>\n uncover(page: Page): Promise<void>\n caption(page: Page, text: string, holdMs?: number): Promise<void>\n clearCaption(page: Page): Promise<void>\n beat(page: Page, ms?: number): Promise<void>\n glideTo(page: Page, target: string | Locator): Promise<Locator>\n click(page: Page, target: string | Locator): Promise<void>\n type(page: Page, target: string | Locator, text: string): Promise<void>\n /** Sign in. `{ show: false }` authenticates fast + silent (no animation/caption). */\n login(page: Page, opts?: { show?: boolean; caption?: string }): Promise<void>\n}\n\nconst DEFAULTS = {\n displayFont: 'ui-serif, Georgia, serif',\n sansFont: 'Inter, ui-sans-serif, system-ui, sans-serif',\n cursor: { from: 'rgba(31,111,235,.98)', to: 'rgba(11,42,74,.92)' },\n ripple: 'rgba(11,42,74,.85)',\n cover: { from: '#0b1622', mid: '#0e1b2c', to: '#1f6feb' },\n accent: '#c9a24b',\n ink: '#0e1b2d',\n coverTitle: '#f4f6f8',\n}\n\nexport function createCinematic(config: CinematicConfig): Cinematic {\n const b = config.brand\n const skin = {\n firmLabel: b.firmLabel,\n displayFont: b.displayFont ?? DEFAULTS.displayFont,\n sansFont: b.sansFont ?? DEFAULTS.sansFont,\n cursorFrom: b.cursor?.from ?? DEFAULTS.cursor.from,\n cursorTo: b.cursor?.to ?? DEFAULTS.cursor.to,\n ripple: b.ripple ?? DEFAULTS.ripple,\n coverFrom: b.cover?.from ?? DEFAULTS.cover.from,\n coverMid: b.cover?.mid ?? DEFAULTS.cover.mid,\n coverTo: b.cover?.to ?? DEFAULTS.cover.to,\n accent: b.accent ?? DEFAULTS.accent,\n ink: b.ink ?? DEFAULTS.ink,\n coverTitle: b.coverTitle ?? DEFAULTS.coverTitle,\n }\n const loginPath = config.loginPath ?? '/app/login'\n const appUrlPattern = config.appUrlPattern ?? /\\/app$/\n const ids = {\n email: config.testIds?.email ?? 'auth-email',\n password: config.testIds?.password ?? 'auth-password',\n submit: config.testIds?.submit ?? 'auth-login-submit',\n }\n\n const resolve = (page: Page, t: string | Locator): Locator =>\n typeof t === 'string' ? page.getByTestId(t) : t\n\n async function installStage(page: Page): Promise<void> {\n await page.addInitScript((s: typeof skin) => {\n const boot = () => {\n if (document.getElementById('__cine_cursor')) return\n\n const cursor = document.createElement('div')\n cursor.id = '__cine_cursor'\n cursor.style.cssText =\n 'position:fixed;left:0;top:0;z-index:2147483647;width:22px;height:22px;' +\n 'margin:-11px 0 0 -11px;border-radius:50%;pointer-events:none;' +\n 'transition:transform .09s ease-out;' +\n `background:radial-gradient(circle at 35% 35%, ${s.cursorFrom}, ${s.cursorTo});` +\n 'box-shadow:0 0 0 3px rgba(255,255,255,.6),0 2px 10px rgba(0,0,0,.4);'\n document.body.appendChild(cursor)\n\n window.addEventListener(\n 'mousemove',\n (e) => {\n cursor.style.transform = `translate(${(e as MouseEvent).clientX}px,${(e as MouseEvent).clientY}px)`\n },\n true\n )\n window.addEventListener(\n 'mousedown',\n (e) => {\n const m = e as MouseEvent\n const r = document.createElement('div')\n r.style.cssText =\n `position:fixed;left:${m.clientX}px;top:${m.clientY}px;z-index:2147483646;` +\n 'width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;pointer-events:none;' +\n `border:2px solid ${s.ripple};animation:__cine_ripple .55s ease-out forwards;`\n document.body.appendChild(r)\n setTimeout(() => r.remove(), 600)\n },\n true\n )\n\n const cap = document.createElement('div')\n cap.id = '__cine_cap'\n cap.style.cssText =\n 'position:fixed;left:50%;bottom:34px;transform:translateX(-50%) translateY(8px);' +\n 'z-index:2147483646;max-width:72%;padding:13px 24px;border-radius:13px;' +\n `font:500 17px/1.45 ${s.sansFont};color:#fff;letter-spacing:.01em;` +\n `background:${s.ink}e0;backdrop-filter:blur(7px);` +\n 'box-shadow:0 10px 34px rgba(0,0,0,.4);text-align:center;opacity:0;transition:opacity .35s,transform .35s;'\n document.body.appendChild(cap)\n\n const style = document.createElement('style')\n style.textContent =\n '@keyframes __cine_ripple{to{width:46px;height:46px;margin:-23px 0 0 -23px;opacity:0}}'\n document.head.appendChild(style)\n\n ;(window as unknown as { __cine_cap: (t: string) => void }).__cine_cap = (t: string) => {\n cap.textContent = t\n cap.style.opacity = t ? '1' : '0'\n cap.style.transform = `translateX(-50%) translateY(${t ? 0 : 8}px)`\n }\n }\n if (document.body) boot()\n else document.addEventListener('DOMContentLoaded', boot)\n }, skin)\n }\n\n async function cover(\n page: Page,\n { kicker, title, subtitle }: { kicker: string; title: string; subtitle?: string },\n holdMs = 2600\n ): Promise<void> {\n await page.evaluate(\n ({ kicker, title, subtitle, s }) => {\n document.getElementById('__cine_cover')?.remove()\n const el = document.createElement('div')\n el.id = '__cine_cover'\n el.style.cssText =\n 'position:fixed;inset:0;z-index:2147483647;display:flex;flex-direction:column;' +\n 'align-items:center;justify-content:center;text-align:center;padding:0 8%;' +\n `background:linear-gradient(135deg,${s.coverFrom} 0%,${s.coverMid} 48%,${s.coverTo} 165%);` +\n `opacity:0;transition:opacity .5s ease;font-family:${s.sansFont};`\n el.innerHTML =\n `<div style=\"text-transform:uppercase;letter-spacing:.26em;font-size:13px;font-weight:600;color:${s.accent};margin-bottom:22px\">${kicker}</div>` +\n `<div style=\"font-family:${s.displayFont};font-weight:600;font-size:52px;line-height:1.08;letter-spacing:-.02em;color:${s.coverTitle};max-width:16ch\">${title}</div>` +\n (subtitle\n ? `<div style=\"margin-top:22px;font-size:19px;line-height:1.5;color:${s.coverTitle}b8;max-width:46ch\">${subtitle}</div>`\n : '') +\n `<div style=\"margin-top:44px;display:flex;align-items:center;gap:10px;color:${s.coverTitle}80;font-size:13px;letter-spacing:.02em\">` +\n `<span style=\"width:26px;height:1px;background:${s.accent}\"></span>${s.firmLabel}</div>`\n document.body.appendChild(el)\n requestAnimationFrame(() => (el.style.opacity = '1'))\n },\n { kicker, title, subtitle: subtitle ?? '', s: skin }\n )\n await page.waitForTimeout(holdMs)\n }\n\n async function uncover(page: Page): Promise<void> {\n await page.evaluate(() => {\n const el = document.getElementById('__cine_cover')\n if (!el) return\n el.style.opacity = '0'\n setTimeout(() => el.remove(), 520)\n })\n await page.waitForTimeout(560)\n }\n\n async function caption(page: Page, text: string, holdMs?: number): Promise<void> {\n await page.evaluate(\n (t) => (window as unknown as { __cine_cap?: (s: string) => void }).__cine_cap?.(t),\n text\n )\n const hold = holdMs ?? Math.min(4200, 900 + text.length * 45)\n await page.waitForTimeout(hold)\n }\n\n async function clearCaption(page: Page): Promise<void> {\n await page.evaluate(() =>\n (window as unknown as { __cine_cap?: (s: string) => void }).__cine_cap?.('')\n )\n }\n\n async function beat(page: Page, ms = 650): Promise<void> {\n await page.waitForTimeout(ms)\n }\n\n async function glideTo(page: Page, target: string | Locator): Promise<Locator> {\n const loc = resolve(page, target).first()\n await loc.scrollIntoViewIfNeeded().catch(() => {})\n const box = await loc.boundingBox()\n if (box) {\n await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2, { steps: 26 })\n await page.waitForTimeout(180)\n }\n return loc\n }\n\n async function click(page: Page, target: string | Locator): Promise<void> {\n const loc = await glideTo(page, target)\n await loc.click()\n await page.waitForTimeout(260)\n }\n\n async function type(page: Page, target: string | Locator, text: string): Promise<void> {\n const loc = await glideTo(page, target)\n await loc.click()\n await loc.fill('')\n await loc.pressSequentially(text, { delay: 42 })\n await page.waitForTimeout(240)\n }\n\n async function login(page: Page, opts: { show?: boolean; caption?: string } = {}): Promise<void> {\n await page.goto(loginPath)\n if (opts.show === false) {\n await page.getByTestId(ids.email).fill(config.creds.email)\n await page.getByTestId(ids.password).fill(config.creds.password)\n await page.getByTestId(ids.submit).click()\n await expect(page).toHaveURL(appUrlPattern, { timeout: 45_000 })\n return\n }\n await caption(page, opts.caption ?? `${b.firmLabel} — signing in.`, 1600)\n await type(page, ids.email, config.creds.email)\n await type(page, ids.password, config.creds.password)\n await click(page, ids.submit)\n await expect(page).toHaveURL(appUrlPattern, { timeout: 45_000 })\n await beat(page, 800)\n }\n\n return {\n installStage,\n cover,\n uncover,\n caption,\n clearCaption,\n beat,\n glideTo,\n click,\n type,\n login,\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/record/index.ts"],"names":["kicker","title","subtitle"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cinematic recording harness — host-agnostic.\n *\n * Turns a Playwright run into a narrated product demo: a visible cursor that\n * glides between targets, a click ripple, a caption bar that narrates each step,\n * full-screen chapter \"cover\" cards, and human-speed pacing. Every host app gets\n * the same polished demo capability from one factory — brand colours, fonts,\n * credentials and the login flow arrive as config, so nothing here names a host.\n *\n * Pair with a Playwright project that records video (see the host's\n * `playwright.record.config.ts`: video on, a large viewport, some slowMo).\n *\n * Usage in a `*.record.ts` spec:\n * const cine = createCinematic({ brand, creds })\n * await cine.installStage(page) // before the first navigation\n * await cine.cover(page, { kicker, title, subtitle })\n * await cine.login(page)\n * await cine.uncover(page)\n * await cine.caption(page, \"Opening the flagship matter…\")\n * await cine.click(page, \"matters-row-…\")\n *\n * `@playwright/test` is an optional peer used for TYPES only (no runtime import), so\n * importing this entry never loads Playwright.\n */\nimport type { Page, Locator } from '@playwright/test'\n\n/** Brand skin for the on-screen chrome. All optional — sensible neutral defaults. */\nexport interface CinematicBrand {\n /** Footer line on chapter cards, e.g. \"Meridian · AI-native counsel\". */\n firmLabel: string\n /** Serif display font for cover titles (CSS font-family value). */\n displayFont?: string\n /** Sans font for captions + cover body. */\n sansFont?: string\n /** Cursor dot radial-gradient stops. */\n cursor?: { from: string; to: string }\n /** Click-ripple ring colour. */\n ripple?: string\n /** Chapter-card background gradient stops. */\n cover?: { from: string; mid: string; to: string }\n /** Accent (kicker text + rule) on chapter cards. */\n accent?: string\n /** Caption bar background base colour. */\n ink?: string\n /** Cover title text colour. */\n coverTitle?: string\n}\n\nexport interface CinematicCreds {\n email: string\n password: string\n}\n\nexport interface CinematicConfig {\n brand: CinematicBrand\n creds: CinematicCreds\n /** Login route (default \"/app/login\"). */\n loginPath?: string\n /** URL the app lands on after auth (default /\\/app$/). */\n appUrlPattern?: RegExp\n /** Login form testids (defaults match the shared AppShell/login convention). */\n testIds?: { email?: string; password?: string; submit?: string }\n}\n\nexport interface Cinematic {\n installStage(page: Page): Promise<void>\n cover(\n page: Page,\n opts: { kicker: string; title: string; subtitle?: string },\n holdMs?: number\n ): Promise<void>\n uncover(page: Page): Promise<void>\n caption(page: Page, text: string, holdMs?: number): Promise<void>\n clearCaption(page: Page): Promise<void>\n beat(page: Page, ms?: number): Promise<void>\n glideTo(page: Page, target: string | Locator): Promise<Locator>\n click(page: Page, target: string | Locator): Promise<void>\n type(page: Page, target: string | Locator, text: string): Promise<void>\n /** Sign in. `{ show: false }` authenticates fast + silent (no animation/caption). */\n login(page: Page, opts?: { show?: boolean; caption?: string }): Promise<void>\n}\n\nconst DEFAULTS = {\n displayFont: 'ui-serif, Georgia, serif',\n sansFont: 'Inter, ui-sans-serif, system-ui, sans-serif',\n cursor: { from: 'rgba(31,111,235,.98)', to: 'rgba(11,42,74,.92)' },\n ripple: 'rgba(11,42,74,.85)',\n cover: { from: '#0b1622', mid: '#0e1b2c', to: '#1f6feb' },\n accent: '#c9a24b',\n ink: '#0e1b2d',\n coverTitle: '#f4f6f8',\n}\n\nexport function createCinematic(config: CinematicConfig): Cinematic {\n const b = config.brand\n const skin = {\n firmLabel: b.firmLabel,\n displayFont: b.displayFont ?? DEFAULTS.displayFont,\n sansFont: b.sansFont ?? DEFAULTS.sansFont,\n cursorFrom: b.cursor?.from ?? DEFAULTS.cursor.from,\n cursorTo: b.cursor?.to ?? DEFAULTS.cursor.to,\n ripple: b.ripple ?? DEFAULTS.ripple,\n coverFrom: b.cover?.from ?? DEFAULTS.cover.from,\n coverMid: b.cover?.mid ?? DEFAULTS.cover.mid,\n coverTo: b.cover?.to ?? DEFAULTS.cover.to,\n accent: b.accent ?? DEFAULTS.accent,\n ink: b.ink ?? DEFAULTS.ink,\n coverTitle: b.coverTitle ?? DEFAULTS.coverTitle,\n }\n const loginPath = config.loginPath ?? '/app/login'\n const appUrlPattern = config.appUrlPattern ?? /\\/app$/\n const ids = {\n email: config.testIds?.email ?? 'auth-email',\n password: config.testIds?.password ?? 'auth-password',\n submit: config.testIds?.submit ?? 'auth-login-submit',\n }\n\n const resolve = (page: Page, t: string | Locator): Locator =>\n typeof t === 'string' ? page.getByTestId(t) : t\n\n async function installStage(page: Page): Promise<void> {\n await page.addInitScript((s: typeof skin) => {\n const boot = () => {\n if (document.getElementById('__cine_cursor')) return\n\n const cursor = document.createElement('div')\n cursor.id = '__cine_cursor'\n cursor.style.cssText =\n 'position:fixed;left:0;top:0;z-index:2147483647;width:22px;height:22px;' +\n 'margin:-11px 0 0 -11px;border-radius:50%;pointer-events:none;' +\n 'transition:transform .09s ease-out;' +\n `background:radial-gradient(circle at 35% 35%, ${s.cursorFrom}, ${s.cursorTo});` +\n 'box-shadow:0 0 0 3px rgba(255,255,255,.6),0 2px 10px rgba(0,0,0,.4);'\n document.body.appendChild(cursor)\n\n window.addEventListener(\n 'mousemove',\n (e) => {\n cursor.style.transform = `translate(${(e as MouseEvent).clientX}px,${(e as MouseEvent).clientY}px)`\n },\n true\n )\n window.addEventListener(\n 'mousedown',\n (e) => {\n const m = e as MouseEvent\n const r = document.createElement('div')\n r.style.cssText =\n `position:fixed;left:${m.clientX}px;top:${m.clientY}px;z-index:2147483646;` +\n 'width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;pointer-events:none;' +\n `border:2px solid ${s.ripple};animation:__cine_ripple .55s ease-out forwards;`\n document.body.appendChild(r)\n setTimeout(() => r.remove(), 600)\n },\n true\n )\n\n const cap = document.createElement('div')\n cap.id = '__cine_cap'\n cap.style.cssText =\n 'position:fixed;left:50%;bottom:34px;transform:translateX(-50%) translateY(8px);' +\n 'z-index:2147483646;max-width:72%;padding:13px 24px;border-radius:13px;' +\n `font:500 17px/1.45 ${s.sansFont};color:#fff;letter-spacing:.01em;` +\n `background:${s.ink}e0;backdrop-filter:blur(7px);` +\n 'box-shadow:0 10px 34px rgba(0,0,0,.4);text-align:center;opacity:0;transition:opacity .35s,transform .35s;'\n document.body.appendChild(cap)\n\n const style = document.createElement('style')\n style.textContent =\n '@keyframes __cine_ripple{to{width:46px;height:46px;margin:-23px 0 0 -23px;opacity:0}}'\n document.head.appendChild(style)\n\n ;(window as unknown as { __cine_cap: (t: string) => void }).__cine_cap = (t: string) => {\n cap.textContent = t\n cap.style.opacity = t ? '1' : '0'\n cap.style.transform = `translateX(-50%) translateY(${t ? 0 : 8}px)`\n }\n }\n if (document.body) boot()\n else document.addEventListener('DOMContentLoaded', boot)\n }, skin)\n }\n\n async function cover(\n page: Page,\n { kicker, title, subtitle }: { kicker: string; title: string; subtitle?: string },\n holdMs = 2600\n ): Promise<void> {\n await page.evaluate(\n ({ kicker, title, subtitle, s }) => {\n document.getElementById('__cine_cover')?.remove()\n const el = document.createElement('div')\n el.id = '__cine_cover'\n el.style.cssText =\n 'position:fixed;inset:0;z-index:2147483647;display:flex;flex-direction:column;' +\n 'align-items:center;justify-content:center;text-align:center;padding:0 8%;' +\n `background:linear-gradient(135deg,${s.coverFrom} 0%,${s.coverMid} 48%,${s.coverTo} 165%);` +\n `opacity:0;transition:opacity .5s ease;font-family:${s.sansFont};`\n el.innerHTML =\n `<div style=\"text-transform:uppercase;letter-spacing:.26em;font-size:13px;font-weight:600;color:${s.accent};margin-bottom:22px\">${kicker}</div>` +\n `<div style=\"font-family:${s.displayFont};font-weight:600;font-size:52px;line-height:1.08;letter-spacing:-.02em;color:${s.coverTitle};max-width:16ch\">${title}</div>` +\n (subtitle\n ? `<div style=\"margin-top:22px;font-size:19px;line-height:1.5;color:${s.coverTitle}b8;max-width:46ch\">${subtitle}</div>`\n : '') +\n `<div style=\"margin-top:44px;display:flex;align-items:center;gap:10px;color:${s.coverTitle}80;font-size:13px;letter-spacing:.02em\">` +\n `<span style=\"width:26px;height:1px;background:${s.accent}\"></span>${s.firmLabel}</div>`\n document.body.appendChild(el)\n requestAnimationFrame(() => (el.style.opacity = '1'))\n },\n { kicker, title, subtitle: subtitle ?? '', s: skin }\n )\n await page.waitForTimeout(holdMs)\n }\n\n async function uncover(page: Page): Promise<void> {\n await page.evaluate(() => {\n const el = document.getElementById('__cine_cover')\n if (!el) return\n el.style.opacity = '0'\n setTimeout(() => el.remove(), 520)\n })\n await page.waitForTimeout(560)\n }\n\n async function caption(page: Page, text: string, holdMs?: number): Promise<void> {\n await page.evaluate(\n (t) => (window as unknown as { __cine_cap?: (s: string) => void }).__cine_cap?.(t),\n text\n )\n const hold = holdMs ?? Math.min(4200, 900 + text.length * 45)\n await page.waitForTimeout(hold)\n }\n\n async function clearCaption(page: Page): Promise<void> {\n await page.evaluate(() =>\n (window as unknown as { __cine_cap?: (s: string) => void }).__cine_cap?.('')\n )\n }\n\n async function beat(page: Page, ms = 650): Promise<void> {\n await page.waitForTimeout(ms)\n }\n\n async function glideTo(page: Page, target: string | Locator): Promise<Locator> {\n const loc = resolve(page, target).first()\n await loc.scrollIntoViewIfNeeded().catch(() => {})\n const box = await loc.boundingBox()\n if (box) {\n await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2, { steps: 26 })\n await page.waitForTimeout(180)\n }\n return loc\n }\n\n async function click(page: Page, target: string | Locator): Promise<void> {\n const loc = await glideTo(page, target)\n await loc.click()\n await page.waitForTimeout(260)\n }\n\n async function type(page: Page, target: string | Locator, text: string): Promise<void> {\n const loc = await glideTo(page, target)\n await loc.click()\n await loc.fill('')\n await loc.pressSequentially(text, { delay: 42 })\n await page.waitForTimeout(240)\n }\n\n async function login(page: Page, opts: { show?: boolean; caption?: string } = {}): Promise<void> {\n await page.goto(loginPath)\n if (opts.show === false) {\n await page.getByTestId(ids.email).fill(config.creds.email)\n await page.getByTestId(ids.password).fill(config.creds.password)\n await page.getByTestId(ids.submit).click()\n await page.waitForURL(appUrlPattern, { timeout: 45_000 })\n return\n }\n await caption(page, opts.caption ?? `${b.firmLabel} — signing in.`, 1600)\n await type(page, ids.email, config.creds.email)\n await type(page, ids.password, config.creds.password)\n await click(page, ids.submit)\n await page.waitForURL(appUrlPattern, { timeout: 45_000 })\n await beat(page, 800)\n }\n\n return {\n installStage,\n cover,\n uncover,\n caption,\n clearCaption,\n beat,\n glideTo,\n click,\n type,\n login,\n }\n}\n"]}
@@ -1,15 +1,13 @@
1
- import { Page, Locator } from '@playwright/test';
2
-
3
1
  /**
4
- * Cinematic recording harness — firm-agnostic.
2
+ * Cinematic recording harness — host-agnostic.
5
3
  *
6
4
  * Turns a Playwright run into a narrated product demo: a visible cursor that
7
5
  * glides between targets, a click ripple, a caption bar that narrates each step,
8
- * full-screen chapter "cover" cards, and human-speed pacing. Every firm app gets
6
+ * full-screen chapter "cover" cards, and human-speed pacing. Every host app gets
9
7
  * the same polished demo capability from one factory — brand colours, fonts,
10
- * credentials and the login flow arrive as config, so nothing here names a firm.
8
+ * credentials and the login flow arrive as config, so nothing here names a host.
11
9
  *
12
- * Pair with a Playwright project that records video (see the firm's
10
+ * Pair with a Playwright project that records video (see the host's
13
11
  * `playwright.record.config.ts`: video on, a large viewport, some slowMo).
14
12
  *
15
13
  * Usage in a `*.record.ts` spec:
@@ -21,12 +19,12 @@ import { Page, Locator } from '@playwright/test';
21
19
  * await cine.caption(page, "Opening the flagship matter…")
22
20
  * await cine.click(page, "matters-row-…")
23
21
  *
24
- * `@playwright/test` is a peer dependency — it is only imported by e2e specs, so
25
- * it never reaches an app bundle.
22
+ * `@playwright/test` is an optional peer used for TYPES only (no runtime import), so
23
+ * importing this entry never loads Playwright.
26
24
  */
27
-
25
+ import type { Page, Locator } from '@playwright/test';
28
26
  /** Brand skin for the on-screen chrome. All optional — sensible neutral defaults. */
29
- interface CinematicBrand {
27
+ export interface CinematicBrand {
30
28
  /** Footer line on chapter cards, e.g. "Meridian · AI-native counsel". */
31
29
  firmLabel: string;
32
30
  /** Serif display font for cover titles (CSS font-family value). */
@@ -53,11 +51,11 @@ interface CinematicBrand {
53
51
  /** Cover title text colour. */
54
52
  coverTitle?: string;
55
53
  }
56
- interface CinematicCreds {
54
+ export interface CinematicCreds {
57
55
  email: string;
58
56
  password: string;
59
57
  }
60
- interface CinematicConfig {
58
+ export interface CinematicConfig {
61
59
  brand: CinematicBrand;
62
60
  creds: CinematicCreds;
63
61
  /** Login route (default "/app/login"). */
@@ -71,7 +69,7 @@ interface CinematicConfig {
71
69
  submit?: string;
72
70
  };
73
71
  }
74
- interface Cinematic {
72
+ export interface Cinematic {
75
73
  installStage(page: Page): Promise<void>;
76
74
  cover(page: Page, opts: {
77
75
  kicker: string;
@@ -91,6 +89,4 @@ interface Cinematic {
91
89
  caption?: string;
92
90
  }): Promise<void>;
93
91
  }
94
- declare function createCinematic(config: CinematicConfig): Cinematic;
95
-
96
- export { type Cinematic, type CinematicBrand, type CinematicConfig, type CinematicCreds, createCinematic };
92
+ export declare function createCinematic(config: CinematicConfig): Cinematic;
@@ -1,5 +1,3 @@
1
- import { expect } from '@playwright/test';
2
-
3
1
  // src/record/index.ts
4
2
  var DEFAULTS = {
5
3
  displayFont: "ui-serif, Georgia, serif",
@@ -147,14 +145,14 @@ function createCinematic(config) {
147
145
  await page.getByTestId(ids.email).fill(config.creds.email);
148
146
  await page.getByTestId(ids.password).fill(config.creds.password);
149
147
  await page.getByTestId(ids.submit).click();
150
- await expect(page).toHaveURL(appUrlPattern, { timeout: 45e3 });
148
+ await page.waitForURL(appUrlPattern, { timeout: 45e3 });
151
149
  return;
152
150
  }
153
151
  await caption(page, opts.caption ?? `${b.firmLabel} \u2014 signing in.`, 1600);
154
152
  await type(page, ids.email, config.creds.email);
155
153
  await type(page, ids.password, config.creds.password);
156
154
  await click(page, ids.submit);
157
- await expect(page).toHaveURL(appUrlPattern, { timeout: 45e3 });
155
+ await page.waitForURL(appUrlPattern, { timeout: 45e3 });
158
156
  await beat(page, 800);
159
157
  }
160
158
  return {