@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,207 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkPPCATBOY_cjs = require('./chunk-PPCATBOY.cjs');
5
+ var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
6
+ var react = require('react');
7
+ var lucideReact = require('lucide-react');
8
+ var ui = require('@arbidocs/react/ui');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ var NARROW_BELOW_PX = 480;
12
+ var DEFAULT_SELECTION_BAR_LABELS = {
13
+ selected: "selected",
14
+ clearSelection: "Clear selection",
15
+ review: "Review",
16
+ selectionActions: "Selection actions"
17
+ };
18
+ function SelectionBar(props) {
19
+ if (props.count === 0 && !props.status) return null;
20
+ return /* @__PURE__ */ jsxRuntime.jsx(SelectionBarInner, { ...props });
21
+ }
22
+ function SelectionBarInner({
23
+ count,
24
+ onClear,
25
+ onReview,
26
+ actions,
27
+ children,
28
+ status,
29
+ selectedLabel,
30
+ labels,
31
+ testIds,
32
+ className
33
+ }) {
34
+ const l = { ...DEFAULT_SELECTION_BAR_LABELS, ...labels };
35
+ const hasSelection = count > 0;
36
+ const rootRef = react.useRef(null);
37
+ const actionsRef = react.useRef(null);
38
+ const [isCompact, setIsCompact] = react.useState(false);
39
+ const [isNarrow, setIsNarrow] = react.useState(false);
40
+ const overflowRootWidthRef = react.useRef(Number.POSITIVE_INFINITY);
41
+ const measureRef = react.useRef(() => {
42
+ });
43
+ measureRef.current = () => {
44
+ const root = rootRef.current;
45
+ const el = actionsRef.current;
46
+ if (!root || !el) return;
47
+ const available = root.parentElement?.clientWidth ?? 0;
48
+ setIsNarrow(available > 0 && available < NARROW_BELOW_PX);
49
+ if (!isCompact) {
50
+ if (el.scrollWidth > el.clientWidth + 1) {
51
+ overflowRootWidthRef.current = root.clientWidth;
52
+ setIsCompact(true);
53
+ }
54
+ } else if (root.clientWidth > overflowRootWidthRef.current + 64) {
55
+ setIsCompact(false);
56
+ }
57
+ };
58
+ react.useLayoutEffect(() => {
59
+ measureRef.current();
60
+ const root = rootRef.current;
61
+ if (!root) return;
62
+ return chunkPPCATBOY_cjs.observeResize(root, () => measureRef.current());
63
+ }, []);
64
+ react.useLayoutEffect(() => {
65
+ measureRef.current();
66
+ const inner = actionsRef.current;
67
+ if (!inner || typeof ResizeObserver === "undefined") return;
68
+ const observer = new ResizeObserver(() => measureRef.current());
69
+ inner.querySelectorAll("button").forEach((button) => observer.observe(button));
70
+ return () => observer.disconnect();
71
+ });
72
+ react.useLayoutEffect(() => {
73
+ let isCancelled = false;
74
+ void document.fonts?.ready.then(() => {
75
+ if (!isCancelled) measureRef.current();
76
+ });
77
+ return () => {
78
+ isCancelled = true;
79
+ };
80
+ }, []);
81
+ return /* @__PURE__ */ jsxRuntime.jsx(
82
+ "div",
83
+ {
84
+ "data-slot": "selection-bar",
85
+ className: ui.cn("pointer-events-none sticky bottom-0 z-30 h-0", className),
86
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-4 flex justify-center px-3", children: /* @__PURE__ */ jsxRuntime.jsx(
87
+ "div",
88
+ {
89
+ ref: rootRef,
90
+ role: "toolbar",
91
+ "aria-label": l.selectionActions,
92
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.toolbar, { testId: "bulk-actions-toolbar" }),
93
+ "data-narrow": isNarrow || void 0,
94
+ className: "pointer-events-auto flex min-h-12 max-w-full items-center rounded-lg border border-border bg-popover px-2 py-1.5 shadow-xl",
95
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2 px-1", children: [
96
+ /* @__PURE__ */ jsxRuntime.jsxs(
97
+ "div",
98
+ {
99
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.count, { testId: "bulk-selected-count" }),
100
+ "aria-live": "polite",
101
+ className: ui.cn(
102
+ "flex shrink-0 items-center rounded-full bg-accent text-sm font-semibold tabular-nums text-accent-foreground",
103
+ isCompact ? "gap-1 px-2.5 py-1" : "gap-2 px-3 py-1"
104
+ ),
105
+ children: [
106
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
107
+ count,
108
+ !isCompact && ` ${selectedLabel ?? l.selected}`
109
+ ] }),
110
+ hasSelection && /* @__PURE__ */ jsxRuntime.jsx(
111
+ "button",
112
+ {
113
+ type: "button",
114
+ onClick: onClear,
115
+ "aria-label": l.clearSelection,
116
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.clear, { testId: "bulk-clear-selection-button" }),
117
+ className: "rounded-full p-0.5 transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-[15px]",
118
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3.5" })
119
+ }
120
+ )
121
+ ]
122
+ }
123
+ ),
124
+ onReview && /* @__PURE__ */ jsxRuntime.jsxs(
125
+ "button",
126
+ {
127
+ type: "button",
128
+ onClick: onReview,
129
+ "aria-label": isNarrow ? l.review : void 0,
130
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.review, { testId: "bulk-review-button" }),
131
+ className: "flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-accent px-2.5 text-sm font-medium text-accent-foreground transition-colors hover:bg-accent/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11",
132
+ children: [
133
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpen, { className: "size-3.5" }),
134
+ !isNarrow && l.review
135
+ ]
136
+ }
137
+ ),
138
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 w-px shrink-0 bg-border" }),
139
+ /* @__PURE__ */ jsxRuntime.jsxs(
140
+ "div",
141
+ {
142
+ ref: actionsRef,
143
+ className: "flex min-w-0 flex-1 items-center gap-2 overflow-x-auto overscroll-x-contain [scrollbar-width:none]",
144
+ children: [
145
+ status && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-2", children: status }),
146
+ /* @__PURE__ */ jsxRuntime.jsxs(
147
+ "div",
148
+ {
149
+ className: ui.cn(
150
+ "flex min-w-0 items-center gap-2",
151
+ !hasSelection && "pointer-events-none opacity-40"
152
+ ),
153
+ children: [
154
+ actions?.map((a) => /* @__PURE__ */ jsxRuntime.jsx(SelectionBarAction, { ...a, isCompact }, a.id)),
155
+ typeof children === "function" ? children(isCompact, isNarrow) : children
156
+ ]
157
+ }
158
+ )
159
+ ]
160
+ }
161
+ )
162
+ ] })
163
+ }
164
+ ) })
165
+ }
166
+ );
167
+ }
168
+ function SelectionBarAction({
169
+ icon: Icon,
170
+ label,
171
+ onClick,
172
+ disabled = false,
173
+ variant = "ghost",
174
+ tooltip,
175
+ testId,
176
+ className,
177
+ isCompact = false
178
+ }) {
179
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
180
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
181
+ ui.Button,
182
+ {
183
+ variant,
184
+ size: "sm",
185
+ onClick,
186
+ disabled,
187
+ "aria-label": isCompact ? label : void 0,
188
+ "data-testid": testId,
189
+ className: ui.cn(
190
+ "h-8 shrink-0 gap-1.5 whitespace-nowrap px-2 disabled:opacity-50 pointer-coarse:h-11",
191
+ className
192
+ ),
193
+ children: [
194
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-4" }),
195
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: label })
196
+ ]
197
+ }
198
+ ) }),
199
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: tooltip ?? label }) })
200
+ ] });
201
+ }
202
+
203
+ exports.DEFAULT_SELECTION_BAR_LABELS = DEFAULT_SELECTION_BAR_LABELS;
204
+ exports.SelectionBar = SelectionBar;
205
+ exports.SelectionBarAction = SelectionBarAction;
206
+ //# sourceMappingURL=chunk-V4ISCZJ7.cjs.map
207
+ //# sourceMappingURL=chunk-V4ISCZJ7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/SelectionBar.tsx"],"names":["jsx","useRef","useState","useLayoutEffect","observeResize","cn","testIdOr","jsxs","X","BookOpen","Tooltip","TooltipTrigger","Button","TooltipContent"],"mappings":"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","file":"chunk-V4ISCZJ7.cjs","sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { BookOpen, X } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { observeResize } from '../lib/observe-resize'\n\nexport interface SelectionBarActionItem {\n id: string\n icon: LucideIcon\n label: string\n onClick: () => void\n disabled?: boolean\n variant?: 'default' | 'outline' | 'destructive' | 'ghost' | 'secondary'\n /** Tooltip text; falls back to `label`. */\n tooltip?: string\n testId?: string\n className?: string\n}\n\n/** Container width below which the bar is \"narrow\" (phones): only the essentials stay inline. */\nconst NARROW_BELOW_PX = 480\n\n/** Every fixed string of the selection bar. Pass a partial `labels` to translate or reword. */\nexport interface SelectionBarLabels {\n selected: string\n clearSelection: string\n review: string\n selectionActions: string\n}\n\nexport const DEFAULT_SELECTION_BAR_LABELS: SelectionBarLabels = {\n selected: 'selected',\n clearSelection: 'Clear selection',\n review: 'Review',\n selectionActions: 'Selection actions',\n}\n\nexport interface SelectionBarTestIds {\n toolbar: string\n count: string\n clear: string\n review: string\n}\n\nexport interface SelectionBarProps {\n /** Number of selected rows. The bar renders only while this is > 0 (or `status` is set). */\n count: number\n onClear: () => void\n /** Primary-in-bar \"Review\" shortcut (tonal, not the view's filled primary). */\n onReview?: () => void\n /** Actions as data. Rendered icon-only automatically when the bar is narrow. */\n actions?: SelectionBarActionItem[]\n /**\n * Free-form actions; a function receives `isCompact` (icon-only) and `isNarrow` (a phone-width\n * container: fold secondary actions into an overflow menu). Rendered after `actions`.\n */\n children?: ReactNode | ((isCompact: boolean, isNarrow: boolean) => ReactNode)\n /** Always-legible content before the actions (e.g. a running budget); never dimmed. */\n status?: ReactNode\n /** Singular noun shown after the count; wins over `labels.selected`. */\n selectedLabel?: string\n labels?: Partial<SelectionBarLabels>\n /** Overrides for the control test ids (defaults keep the current ids). */\n testIds?: Partial<SelectionBarTestIds>\n className?: string\n}\n\n/**\n * SelectionBar: the floating bar that appears while rows are selected.\n *\n * Stays on ONE row: when the actions overflow it flips to compact mode (icon-only actions and a\n * count-only badge) instead of wrapping. Sticky zero-height anchor, so showing/hiding it never\n * reflows the content beneath. Every control is always visible (nothing hover-only) and 44px on\n * coarse pointers.\n */\nexport function SelectionBar(props: SelectionBarProps) {\n if (props.count === 0 && !props.status) return null\n return <SelectionBarInner {...props} />\n}\n\nfunction SelectionBarInner({\n count,\n onClear,\n onReview,\n actions,\n children,\n status,\n selectedLabel,\n labels,\n testIds,\n className,\n}: SelectionBarProps) {\n const l = { ...DEFAULT_SELECTION_BAR_LABELS, ...labels }\n const hasSelection = count > 0\n const rootRef = useRef<HTMLDivElement>(null)\n const actionsRef = useRef<HTMLDivElement>(null)\n const [isCompact, setIsCompact] = useState(false)\n const [isNarrow, setIsNarrow] = useState(false)\n // Root width at which the labelled actions last overflowed. Compared against the (stable) root\n // width, never the actions' own width, which changes when we collapse labels and would oscillate.\n const overflowRootWidthRef = useRef(Number.POSITIVE_INFINITY)\n\n const measureRef = useRef<() => void>(() => {})\n measureRef.current = () => {\n const root = rootRef.current\n const el = actionsRef.current\n if (!root || !el) return\n // The bar is content-sized, so judge narrowness by the space it is given (its anchor).\n const available = root.parentElement?.clientWidth ?? 0\n setIsNarrow(available > 0 && available < NARROW_BELOW_PX)\n if (!isCompact) {\n if (el.scrollWidth > el.clientWidth + 1) {\n overflowRootWidthRef.current = root.clientWidth\n setIsCompact(true)\n }\n } else if (root.clientWidth > overflowRootWidthRef.current + 64) {\n setIsCompact(false)\n }\n }\n\n useLayoutEffect(() => {\n measureRef.current()\n const root = rootRef.current\n if (!root) return\n return observeResize(root, () => measureRef.current())\n }, [])\n // The bar is capped by its anchor, so its own size does not change when the actions overflow, and\n // the actions' text widens once the web font loads. Re-measure after every render and whenever\n // an action changes size. The measurement only sets state on a change, so this cannot loop.\n useLayoutEffect(() => {\n measureRef.current()\n const inner = actionsRef.current\n if (!inner || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(() => measureRef.current())\n inner.querySelectorAll('button').forEach((button) => observer.observe(button))\n return () => observer.disconnect()\n })\n useLayoutEffect(() => {\n let isCancelled = false\n void document.fonts?.ready.then(() => {\n if (!isCancelled) measureRef.current()\n })\n return () => {\n isCancelled = true\n }\n }, [])\n\n return (\n <div\n data-slot=\"selection-bar\"\n className={cn('pointer-events-none sticky bottom-0 z-30 h-0', className)}\n >\n <div className=\"absolute inset-x-0 bottom-4 flex justify-center px-3\">\n <div\n ref={rootRef}\n role=\"toolbar\"\n aria-label={l.selectionActions}\n data-testid={testIdOr(testIds?.toolbar, { testId: 'bulk-actions-toolbar' })}\n data-narrow={isNarrow || undefined}\n className=\"pointer-events-auto flex min-h-12 max-w-full items-center rounded-lg border border-border bg-popover px-2 py-1.5 shadow-xl\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-1\">\n <div\n data-testid={testIdOr(testIds?.count, { testId: 'bulk-selected-count' })}\n aria-live=\"polite\"\n className={cn(\n 'flex shrink-0 items-center rounded-full bg-accent text-sm font-semibold tabular-nums text-accent-foreground',\n isCompact ? 'gap-1 px-2.5 py-1' : 'gap-2 px-3 py-1'\n )}\n >\n <span>\n {count}\n {!isCompact && ` ${selectedLabel ?? l.selected}`}\n </span>\n {hasSelection && (\n <button\n type=\"button\"\n onClick={onClear}\n aria-label={l.clearSelection}\n data-testid={testIdOr(testIds?.clear, { testId: 'bulk-clear-selection-button' })}\n className=\"rounded-full p-0.5 transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-[15px]\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n\n {onReview && (\n <button\n type=\"button\"\n onClick={onReview}\n aria-label={isNarrow ? l.review : undefined}\n data-testid={testIdOr(testIds?.review, { testId: 'bulk-review-button' })}\n className=\"flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-accent px-2.5 text-sm font-medium text-accent-foreground transition-colors hover:bg-accent/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11\"\n >\n <BookOpen className=\"size-3.5\" />\n {!isNarrow && l.review}\n </button>\n )}\n\n <div className=\"h-6 w-px shrink-0 bg-border\" />\n\n <div\n ref={actionsRef}\n className=\"flex min-w-0 flex-1 items-center gap-2 overflow-x-auto overscroll-x-contain [scrollbar-width:none]\"\n >\n {status && <div className=\"flex shrink-0 items-center gap-2\">{status}</div>}\n <div\n className={cn(\n 'flex min-w-0 items-center gap-2',\n !hasSelection && 'pointer-events-none opacity-40'\n )}\n >\n {actions?.map((a) => (\n <SelectionBarAction key={a.id} {...a} isCompact={isCompact} />\n ))}\n {typeof children === 'function' ? children(isCompact, isNarrow) : children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport interface SelectionBarActionProps extends Omit<SelectionBarActionItem, 'id'> {\n /** Icon-only (the bar passes this when narrow). */\n isCompact?: boolean\n}\n\n/** One action button in the bar: icon + label, icon-only when compact, always with a tooltip. */\nexport function SelectionBarAction({\n icon: Icon,\n label,\n onClick,\n disabled = false,\n variant = 'ghost',\n tooltip,\n testId,\n className,\n isCompact = false,\n}: SelectionBarActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={variant}\n size=\"sm\"\n onClick={onClick}\n disabled={disabled}\n aria-label={isCompact ? label : undefined}\n data-testid={testId}\n className={cn(\n 'h-8 shrink-0 gap-1.5 whitespace-nowrap px-2 disabled:opacity-50 pointer-coarse:h-11',\n className\n )}\n >\n <Icon className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{label}</span>}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltip ?? label}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n"]}
@@ -0,0 +1,83 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var ui = require('@arbidocs/react/ui');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/components/ToneBadge.tsx
8
+
9
+ // src/components/tones.ts
10
+ var TONE_SURFACE = {
11
+ neutral: "bg-gray-bg text-gray-text",
12
+ info: "bg-blue-bg text-blue-text",
13
+ success: "bg-green-bg text-green-text",
14
+ warning: "bg-yellow-bg text-yellow-text",
15
+ danger: "bg-red-bg text-red-text",
16
+ accent: "bg-purple-bg text-purple-text",
17
+ ai: "bg-ai-soft text-ai-ink"
18
+ };
19
+ var TONE_BORDER = {
20
+ neutral: "border-gray-border",
21
+ info: "border-blue-border",
22
+ success: "border-green-border",
23
+ warning: "border-yellow-border",
24
+ danger: "border-red-border",
25
+ accent: "border-purple-border",
26
+ ai: "border-transparent"
27
+ };
28
+ var TONE_DOT = {
29
+ neutral: "bg-gray-text",
30
+ info: "bg-blue-solid",
31
+ success: "bg-green-solid",
32
+ warning: "bg-yellow-solid",
33
+ danger: "bg-red-solid",
34
+ accent: "bg-purple-solid",
35
+ ai: "bg-ai-ink"
36
+ };
37
+ function ToneBadge({
38
+ tone = "neutral",
39
+ icon,
40
+ children,
41
+ className,
42
+ ...rest
43
+ }) {
44
+ return /* @__PURE__ */ jsxRuntime.jsxs(
45
+ "span",
46
+ {
47
+ ...rest,
48
+ "data-slot": "tone-badge",
49
+ "data-tone": tone,
50
+ className: ui.cn(
51
+ "inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium",
52
+ TONE_SURFACE[tone],
53
+ TONE_BORDER[tone],
54
+ className
55
+ ),
56
+ children: [
57
+ icon,
58
+ children
59
+ ]
60
+ }
61
+ );
62
+ }
63
+ function Dot({ tone = "neutral", label, className, ...rest }) {
64
+ return /* @__PURE__ */ jsxRuntime.jsx(
65
+ "span",
66
+ {
67
+ ...rest,
68
+ "data-slot": "dot",
69
+ "data-tone": tone,
70
+ role: label ? "img" : void 0,
71
+ "aria-label": label,
72
+ "aria-hidden": label ? void 0 : true,
73
+ className: ui.cn("inline-block size-2 shrink-0 rounded-full", TONE_DOT[tone], className)
74
+ }
75
+ );
76
+ }
77
+
78
+ exports.Dot = Dot;
79
+ exports.TONE_BORDER = TONE_BORDER;
80
+ exports.TONE_SURFACE = TONE_SURFACE;
81
+ exports.ToneBadge = ToneBadge;
82
+ //# sourceMappingURL=chunk-VFUWWH52.cjs.map
83
+ //# sourceMappingURL=chunk-VFUWWH52.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tones.ts","../src/components/ToneBadge.tsx"],"names":["jsxs","cn","jsx"],"mappings":";;;;;;;;AAWO,IAAM,YAAA,GAAqC;AAAA,EAChD,OAAA,EAAS,2BAAA;AAAA,EACT,IAAA,EAAM,2BAAA;AAAA,EACN,OAAA,EAAS,6BAAA;AAAA,EACT,OAAA,EAAS,+BAAA;AAAA,EACT,MAAA,EAAQ,yBAAA;AAAA,EACR,MAAA,EAAQ,+BAAA;AAAA,EACR,EAAA,EAAI;AACN;AAGO,IAAM,WAAA,GAAoC;AAAA,EAC/C,OAAA,EAAS,oBAAA;AAAA,EACT,IAAA,EAAM,oBAAA;AAAA,EACN,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,sBAAA;AAAA,EACT,MAAA,EAAQ,mBAAA;AAAA,EACR,MAAA,EAAQ,sBAAA;AAAA,EACR,EAAA,EAAI;AACN;AAGO,IAAM,QAAA,GAAiC;AAAA,EAC5C,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,EAAA,EAAI;AACN,CAAA;AC3BO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA,GAAO,SAAA;AAAA,EACP,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,uBACEA,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,WAAA,EAAU,YAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWC,KAAA;AAAA,QACT,oFAAA;AAAA,QACA,aAAa,IAAI,CAAA;AAAA,QACjB,YAAY,IAAI,CAAA;AAAA,QAChB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ;AASO,SAAS,GAAA,CAAI,EAAE,IAAA,GAAO,SAAA,EAAW,OAAO,SAAA,EAAW,GAAG,MAAK,EAAa;AAC7E,EAAA,uBACEC,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,WAAA,EAAU,KAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM,QAAQ,KAAA,GAAQ,MAAA;AAAA,MACtB,YAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAa,QAAQ,MAAA,GAAY,IAAA;AAAA,MACjC,WAAWD,KAAA,CAAG,2CAAA,EAA6C,QAAA,CAAS,IAAI,GAAG,SAAS;AAAA;AAAA,GACtF;AAEJ","file":"chunk-VFUWWH52.cjs","sourcesContent":["/**\n * The ONE status/tone vocabulary of the blocks. `StatusPill`, `ToneBadge`, `Dot` and the plan,\n * connection and tag chips all read these maps, so a tone looks the same wherever it appears and\n * a new tone is added in one place. Every pair is a token pair checked by\n * `tokens.contrast.test.ts` (`--{hue}-text` on `--{hue}-bg`).\n */\n\n/** Semantic tones, mapped to the token palette (`--{hue}-bg|text|border`, `--ai-*`). */\nexport type Tone = 'neutral' | 'info' | 'success' | 'warning' | 'danger' | 'accent' | 'ai'\n\n/** Background + text of a tinted chip. */\nexport const TONE_SURFACE: Record<Tone, string> = {\n neutral: 'bg-gray-bg text-gray-text',\n info: 'bg-blue-bg text-blue-text',\n success: 'bg-green-bg text-green-text',\n warning: 'bg-yellow-bg text-yellow-text',\n danger: 'bg-red-bg text-red-text',\n accent: 'bg-purple-bg text-purple-text',\n ai: 'bg-ai-soft text-ai-ink',\n}\n\n/** Border of a tinted chip (the AI tint has none). */\nexport const TONE_BORDER: Record<Tone, string> = {\n neutral: 'border-gray-border',\n info: 'border-blue-border',\n success: 'border-green-border',\n warning: 'border-yellow-border',\n danger: 'border-red-border',\n accent: 'border-purple-border',\n ai: 'border-transparent',\n}\n\n/** Solid fill of a status dot. */\nexport const TONE_DOT: Record<Tone, string> = {\n neutral: 'bg-gray-text',\n info: 'bg-blue-solid',\n success: 'bg-green-solid',\n warning: 'bg-yellow-solid',\n danger: 'bg-red-solid',\n accent: 'bg-purple-solid',\n ai: 'bg-ai-ink',\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { TONE_BORDER, TONE_DOT, TONE_SURFACE, type Tone } from './tones'\n\nexport type { Tone }\n\nexport interface ToneBadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: Tone\n /** Leading glyph or dot. */\n icon?: ReactNode\n children: ReactNode\n}\n\n/** A small tinted label. The host decides the tone and the words (status, level, priority...). */\nexport function ToneBadge({\n tone = 'neutral',\n icon,\n children,\n className,\n ...rest\n}: ToneBadgeProps) {\n return (\n <span\n {...rest}\n data-slot=\"tone-badge\"\n data-tone={tone}\n className={cn(\n 'inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium',\n TONE_SURFACE[tone],\n TONE_BORDER[tone],\n className\n )}\n >\n {icon}\n {children}\n </span>\n )\n}\n\nexport interface DotProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: Tone\n /** Accessible name; without it the dot is decorative (`aria-hidden`). */\n label?: string\n}\n\n/** A solid status dot in a tone. */\nexport function Dot({ tone = 'neutral', label, className, ...rest }: DotProps) {\n return (\n <span\n {...rest}\n data-slot=\"dot\"\n data-tone={tone}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={cn('inline-block size-2 shrink-0 rounded-full', TONE_DOT[tone], className)}\n />\n )\n}\n"]}
@@ -0,0 +1,259 @@
1
+ "use client";
2
+ import { testIdOr } from './chunk-7F6CBP3Z.js';
3
+ import { useId, useMemo, useState } from 'react';
4
+ import { Info } from 'lucide-react';
5
+ import { Input, cn, Tooltip, TooltipTrigger, TooltipContent } from '@arbidocs/react/ui';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ // src/lib/password-strength.ts
9
+ var STRONG_BITS = 75;
10
+ function alphabetSize(password) {
11
+ return (/[a-z]/.test(password) ? 26 : 0) + (/[A-Z]/.test(password) ? 26 : 0) + (/\d/.test(password) ? 10 : 0) + (/[^a-zA-Z0-9]/.test(password) ? 33 : 0);
12
+ }
13
+ function estimateEntropyBits(password) {
14
+ return password.length * Math.log2(Math.max(alphabetSize(password), 2));
15
+ }
16
+ function getPasswordStrength(password, meetsRequirements) {
17
+ if (!password || !meetsRequirements) return { score: 0, label: "" };
18
+ if (estimateEntropyBits(password) >= STRONG_BITS) {
19
+ return { score: 2, label: "Password meets all criteria" };
20
+ }
21
+ return { score: 1, label: "Password meets minimal criteria" };
22
+ }
23
+ function getStrengthHint(password) {
24
+ if (!password) return "";
25
+ const hasSymbol = /[^a-zA-Z0-9]/.test(password);
26
+ const hasUpper = /[A-Z]/.test(password);
27
+ const perChar = Math.log2(Math.max(alphabetSize(password), 2));
28
+ const missing = Math.max(0, STRONG_BITS - password.length * perChar);
29
+ if (missing === 0) return "Long enough to resist guessing.";
30
+ const moreChars = Math.ceil(missing / perChar);
31
+ const goal = `Add ${moreChars} more character${moreChars === 1 ? "" : "s"} to make a strong password`;
32
+ const unused = !hasSymbol ? "a symbol" : !hasUpper ? "a capital" : null;
33
+ return unused ? `${goal} \u2014 or ${unused}, which counts for more.` : `${goal}.`;
34
+ }
35
+ var DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS = {
36
+ password: "Password",
37
+ confirmPassword: "Confirm Password",
38
+ passwordsMatch: "Passwords match",
39
+ passwordsDoNotMatch: "Passwords do not match",
40
+ strengthInfo: (strength) => `${strength}. How to strengthen it`,
41
+ strengthFallbackHint: "Long enough to resist guessing."
42
+ };
43
+ var STRENGTH_STYLE = {
44
+ 0: { bar: "bg-red-text", text: "text-red-text", width: "33%" },
45
+ 1: { bar: "bg-primary", text: "text-primary", width: "66%" },
46
+ 2: { bar: "bg-green-text", text: "text-green-text", width: "100%" }
47
+ };
48
+ function Label({ htmlFor, children }) {
49
+ return /* @__PURE__ */ jsxs("label", { htmlFor, className: "mb-1 block text-sm font-medium text-foreground", children: [
50
+ children,
51
+ " ",
52
+ /* @__PURE__ */ jsx("span", { className: "text-red-text", children: "*" })
53
+ ] });
54
+ }
55
+ function PasswordStrengthInput({
56
+ password,
57
+ confirmPassword = "",
58
+ onPasswordChange,
59
+ onConfirmPasswordChange,
60
+ showConfirmation = false,
61
+ disabled = false,
62
+ passwordLabel,
63
+ confirmLabel,
64
+ layout = "stacked",
65
+ autoFocus = false,
66
+ showStrengthIndicator = true,
67
+ emptyStateMessage,
68
+ getUnmetRequirement,
69
+ labels,
70
+ testIds
71
+ }) {
72
+ const confirmPasswordId = useId();
73
+ const mismatchId = `${confirmPasswordId}-mismatch`;
74
+ const passwordId = useId();
75
+ const l = useMemo(() => ({ ...DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS, ...labels }), [labels]);
76
+ const firstUnmetRequirement = useMemo(
77
+ () => getUnmetRequirement(password),
78
+ [getUnmetRequirement, password]
79
+ );
80
+ const hint = useMemo(() => getStrengthHint(password), [password]);
81
+ const strength = useMemo(
82
+ () => getPasswordStrength(password, firstUnmetRequirement === null),
83
+ [password, firstUnmetRequirement]
84
+ );
85
+ const strengthStyle = STRENGTH_STYLE[strength.score];
86
+ const [confirmBlurred, setConfirmBlurred] = useState(false);
87
+ const passwordsMatch = !!confirmPassword && password === confirmPassword;
88
+ const showConfirmFeedback = showConfirmation && confirmBlurred && !!confirmPassword;
89
+ const passwordMismatch = showConfirmFeedback && !passwordsMatch;
90
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", "data-slot": "password-strength-input", children: [
91
+ /* @__PURE__ */ jsxs(
92
+ "div",
93
+ {
94
+ className: cn(
95
+ layout === "side-by-side" ? "grid grid-cols-1 gap-4 sm:grid-cols-2" : "space-y-3"
96
+ ),
97
+ children: [
98
+ /* @__PURE__ */ jsxs("div", { children: [
99
+ /* @__PURE__ */ jsx(Label, { htmlFor: passwordId, children: passwordLabel ?? l.password }),
100
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
101
+ /* @__PURE__ */ jsx(
102
+ Input,
103
+ {
104
+ type: "password",
105
+ id: passwordId,
106
+ name: "password",
107
+ placeholder: "",
108
+ value: password,
109
+ onChange: (e) => onPasswordChange(e.target.value),
110
+ disabled,
111
+ autoFocus,
112
+ autoComplete: showConfirmation ? "new-password" : "current-password",
113
+ required: true,
114
+ className: cn(
115
+ "placeholder:text-muted-foreground",
116
+ showStrengthIndicator && "rounded-b-none border-b-0"
117
+ ),
118
+ "data-testid": testIdOr(testIds?.input, { testId: "password-input" })
119
+ }
120
+ ),
121
+ showStrengthIndicator && /* @__PURE__ */ jsx(
122
+ "div",
123
+ {
124
+ "data-testid": testIdOr(testIds?.strengthIndicator, {
125
+ testId: "password-strength-indicator"
126
+ }),
127
+ children: /* @__PURE__ */ jsx("div", { className: "h-1 w-full rounded-b bg-border", children: /* @__PURE__ */ jsx(
128
+ "div",
129
+ {
130
+ className: cn(
131
+ "h-full rounded-b transition-all duration-300",
132
+ password ? strengthStyle.bar : "bg-border"
133
+ ),
134
+ style: { width: password ? strengthStyle.width : "0%" },
135
+ "data-testid": testIdOr(testIds?.strengthBar, { testId: "strength-bar" })
136
+ }
137
+ ) })
138
+ }
139
+ )
140
+ ] })
141
+ ] }),
142
+ showConfirmation && /* @__PURE__ */ jsxs("div", { children: [
143
+ /* @__PURE__ */ jsx(Label, { htmlFor: confirmPasswordId, children: confirmLabel ?? l.confirmPassword }),
144
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
145
+ /* @__PURE__ */ jsx(
146
+ Input,
147
+ {
148
+ type: "password",
149
+ id: confirmPasswordId,
150
+ name: "confirm-password",
151
+ placeholder: "",
152
+ value: confirmPassword,
153
+ onChange: (e) => {
154
+ onConfirmPasswordChange?.(e.target.value);
155
+ setConfirmBlurred(false);
156
+ },
157
+ onBlur: () => setConfirmBlurred(true),
158
+ disabled,
159
+ autoComplete: "new-password",
160
+ "aria-invalid": passwordMismatch || void 0,
161
+ "aria-describedby": showStrengthIndicator ? mismatchId : void 0,
162
+ required: true,
163
+ className: cn(
164
+ "placeholder:text-muted-foreground",
165
+ showStrengthIndicator && "rounded-b-none border-b-0",
166
+ passwordMismatch && "border-red-border"
167
+ ),
168
+ "data-testid": testIdOr(testIds?.confirmInput, { testId: "confirm-password-input" })
169
+ }
170
+ ),
171
+ showStrengthIndicator && /* @__PURE__ */ jsxs(
172
+ "div",
173
+ {
174
+ "data-testid": testIdOr(testIds?.confirmIndicator, {
175
+ testId: "confirm-password-indicator"
176
+ }),
177
+ children: [
178
+ /* @__PURE__ */ jsx("div", { className: "h-1 w-full rounded-b bg-border", children: /* @__PURE__ */ jsx(
179
+ "div",
180
+ {
181
+ className: cn(
182
+ "h-full rounded-b transition-all duration-300",
183
+ showConfirmFeedback ? passwordsMatch ? "bg-green-text" : "bg-red-text" : "bg-border"
184
+ ),
185
+ style: { width: showConfirmFeedback ? "100%" : "0%" },
186
+ "data-testid": testIdOr(testIds?.confirmStrengthBar, {
187
+ testId: "confirm-strength-bar"
188
+ })
189
+ }
190
+ ) }),
191
+ /* @__PURE__ */ jsx(
192
+ "p",
193
+ {
194
+ id: mismatchId,
195
+ "aria-live": "polite",
196
+ className: cn(
197
+ "mt-0.5 h-4 text-sm font-medium",
198
+ showConfirmFeedback ? passwordsMatch ? "text-green-text" : "text-red-text" : "text-transparent"
199
+ ),
200
+ "data-testid": testIdOr(testIds?.mismatchError, {
201
+ testId: "password-mismatch-error"
202
+ }),
203
+ children: showConfirmFeedback ? passwordsMatch ? l.passwordsMatch : l.passwordsDoNotMatch : " "
204
+ }
205
+ )
206
+ ]
207
+ }
208
+ )
209
+ ] })
210
+ ] })
211
+ ]
212
+ }
213
+ ),
214
+ showConfirmation && /* @__PURE__ */ jsx(
215
+ "div",
216
+ {
217
+ className: "h-5 text-sm leading-5",
218
+ "data-testid": testIdOr(testIds?.requirements, { testId: "password-requirements" }),
219
+ children: password ? firstUnmetRequirement ? /* @__PURE__ */ jsxs("p", { className: "truncate text-red-text", children: [
220
+ "\u2717 ",
221
+ firstUnmetRequirement
222
+ ] }) : /* @__PURE__ */ jsxs(Tooltip, { delayDuration: 0, children: [
223
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
224
+ "button",
225
+ {
226
+ type: "button",
227
+ "aria-label": l.strengthInfo(strength.label),
228
+ className: cn(
229
+ "inline-flex items-center gap-1 truncate rounded font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
230
+ strengthStyle.text
231
+ ),
232
+ "data-testid": testIdOr(testIds?.strengthInfoButton, {
233
+ testId: "strength-info-button"
234
+ }),
235
+ children: [
236
+ /* @__PURE__ */ jsxs(
237
+ "span",
238
+ {
239
+ "data-testid": testIdOr(testIds?.strengthLabel, { testId: "strength-label" }),
240
+ children: [
241
+ "\u2713 ",
242
+ strength.label
243
+ ]
244
+ }
245
+ ),
246
+ /* @__PURE__ */ jsx(Info, { className: "h-3.5 w-3.5 opacity-80" })
247
+ ]
248
+ }
249
+ ) }),
250
+ /* @__PURE__ */ jsx(TooltipContent, { side: "bottom", className: "max-w-[260px] text-center", children: hint || l.strengthFallbackHint })
251
+ ] }) : /* @__PURE__ */ jsx("p", { className: "truncate text-muted-foreground", children: emptyStateMessage || "\xA0" })
252
+ }
253
+ )
254
+ ] });
255
+ }
256
+
257
+ export { DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS, PasswordStrengthInput };
258
+ //# sourceMappingURL=chunk-VILAPTCB.js.map
259
+ //# sourceMappingURL=chunk-VILAPTCB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/password-strength.ts","../src/auth/PasswordStrengthInput.tsx"],"names":[],"mappings":"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","file":"chunk-VILAPTCB.js","sourcesContent":["/** Bits of estimated entropy at which the meter reads \"Strong\". */\nexport const STRONG_BITS = 75\n\nexport type StrengthScore = 0 | 1 | 2\n\nexport interface PasswordStrength {\n /** 0 = rejected, 1 = accepted (minimal), 2 = strong. */\n score: StrengthScore\n label: string\n}\n\n/** Size of the character alphabet a password draws from (lower, upper, digit, symbol). */\nfunction alphabetSize(password: string): number {\n return (\n (/[a-z]/.test(password) ? 26 : 0) +\n (/[A-Z]/.test(password) ? 26 : 0) +\n (/\\d/.test(password) ? 10 : 0) +\n (/[^a-zA-Z0-9]/.test(password) ? 33 : 0)\n )\n}\n\n/**\n * Estimated entropy in bits (length x log2(alphabet)). Length is the dominant term, which is also\n * what NIST SP 800-63B recommends over composition rules: a 25-character passphrase of plain words\n * outranks \"Password123!\".\n */\nexport function estimateEntropyBits(password: string): number {\n return password.length * Math.log2(Math.max(alphabetSize(password), 2))\n}\n\n/**\n * Three states matching the three colours the form uses: rejected (does not meet the host's\n * requirements), accepted (\"could be better\") and strong.\n */\nexport function getPasswordStrength(\n password: string,\n meetsRequirements: boolean\n): PasswordStrength {\n // No label for rejected: the requirement line already says what is missing.\n if (!password || !meetsRequirements) return { score: 0, label: '' }\n if (estimateEntropyBits(password) >= STRONG_BITS) {\n return { score: 2, label: 'Password meets all criteria' }\n }\n return { score: 1, label: 'Password meets minimal criteria' }\n}\n\n/**\n * Advice computed from the same entropy estimate as the meter, so the hint can never tell you to\n * do something that would not actually move it.\n */\nexport function getStrengthHint(password: string): string {\n if (!password) return ''\n const hasSymbol = /[^a-zA-Z0-9]/.test(password)\n const hasUpper = /[A-Z]/.test(password)\n const perChar = Math.log2(Math.max(alphabetSize(password), 2))\n const missing = Math.max(0, STRONG_BITS - password.length * perChar)\n if (missing === 0) return 'Long enough to resist guessing.'\n\n const moreChars = Math.ceil(missing / perChar)\n const goal = `Add ${moreChars} more character${moreChars === 1 ? '' : 's'} to make a strong password`\n const unused = !hasSymbol ? 'a symbol' : !hasUpper ? 'a capital' : null\n return unused ? `${goal} — or ${unused}, which counts for more.` : `${goal}.`\n}\n","import { useMemo, useState, useId } from 'react'\nimport { Info } from 'lucide-react'\nimport { cn, Input, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { getPasswordStrength, getStrengthHint } from '../lib/password-strength'\nimport { testIdOr } from '../chat/test-id'\n\n/** Overridable ids of the password input; defaults are the current ids. */\nexport type PasswordStrengthInputTestIds = Partial<\n Record<\n | 'input'\n | 'strengthIndicator'\n | 'strengthBar'\n | 'confirmInput'\n | 'confirmIndicator'\n | 'confirmStrengthBar'\n | 'mismatchError'\n | 'requirements'\n | 'strengthInfoButton'\n | 'strengthLabel',\n string\n >\n>\n\n/** Every fixed string of the password input. `passwordLabel` / `confirmLabel` props win. */\nexport interface PasswordStrengthInputLabels {\n password: string\n confirmPassword: string\n passwordsMatch: string\n passwordsDoNotMatch: string\n /** Accessible name of the strength button; `strength` is the meter's label. */\n strengthInfo: (strength: string) => string\n /** Tooltip when the password is acceptable and there is no specific hint. */\n strengthFallbackHint: string\n}\n\nexport const DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS: PasswordStrengthInputLabels = {\n password: 'Password',\n confirmPassword: 'Confirm Password',\n passwordsMatch: 'Passwords match',\n passwordsDoNotMatch: 'Passwords do not match',\n strengthInfo: (strength) => `${strength}. How to strengthen it`,\n strengthFallbackHint: 'Long enough to resist guessing.',\n}\n\nexport interface PasswordStrengthInputProps {\n labels?: Partial<PasswordStrengthInputLabels>\n password: string\n confirmPassword?: string\n onPasswordChange: (value: string) => void\n onConfirmPasswordChange?: (value: string) => void\n /** Show the confirmation field, the match indicator and the requirement line. */\n showConfirmation?: boolean\n disabled?: boolean\n passwordLabel?: string\n confirmLabel?: string\n layout?: 'stacked' | 'side-by-side'\n autoFocus?: boolean\n showStrengthIndicator?: boolean\n /** Shown in the requirements line while no password is entered. */\n emptyStateMessage?: string\n /**\n * The host's password policy: returns the first unmet requirement (as a message), or `null` when\n * the password is acceptable. Kept in the host so the policy has one source of truth.\n */\n getUnmetRequirement: (password: string) => string | null\n /** Part ids; defaults are the current ids. */\n testIds?: PasswordStrengthInputTestIds\n}\n\nconst STRENGTH_STYLE = {\n 0: { bar: 'bg-red-text', text: 'text-red-text', width: '33%' },\n 1: { bar: 'bg-primary', text: 'text-primary', width: '66%' },\n 2: { bar: 'bg-green-text', text: 'text-green-text', width: '100%' },\n} as const\n\nfunction Label({ htmlFor, children }: { htmlFor: string; children: string }) {\n return (\n <label htmlFor={htmlFor} className=\"mb-1 block text-sm font-medium text-foreground\">\n {children} <span className=\"text-red-text\">*</span>\n </label>\n )\n}\n\n/**\n * Password input with a strength meter and optional confirmation field. The match verdict only\n * appears once the confirmation field loses focus, so the user is never nagged mid-keystroke, and\n * the requirement line has a fixed height so typing never shifts the form.\n */\nexport function PasswordStrengthInput({\n password,\n confirmPassword = '',\n onPasswordChange,\n onConfirmPasswordChange,\n showConfirmation = false,\n disabled = false,\n passwordLabel,\n confirmLabel,\n layout = 'stacked',\n autoFocus = false,\n showStrengthIndicator = true,\n emptyStateMessage,\n getUnmetRequirement,\n labels,\n testIds,\n}: PasswordStrengthInputProps) {\n const confirmPasswordId = useId()\n const mismatchId = `${confirmPasswordId}-mismatch`\n const passwordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS, ...labels }), [labels])\n const firstUnmetRequirement = useMemo(\n () => getUnmetRequirement(password),\n [getUnmetRequirement, password]\n )\n const hint = useMemo(() => getStrengthHint(password), [password])\n const strength = useMemo(\n () => getPasswordStrength(password, firstUnmetRequirement === null),\n [password, firstUnmetRequirement]\n )\n const strengthStyle = STRENGTH_STYLE[strength.score]\n\n const [confirmBlurred, setConfirmBlurred] = useState(false)\n const passwordsMatch = !!confirmPassword && password === confirmPassword\n const showConfirmFeedback = showConfirmation && confirmBlurred && !!confirmPassword\n const passwordMismatch = showConfirmFeedback && !passwordsMatch\n\n return (\n <div className=\"space-y-2\" data-slot=\"password-strength-input\">\n <div\n className={cn(\n layout === 'side-by-side' ? 'grid grid-cols-1 gap-4 sm:grid-cols-2' : 'space-y-3'\n )}\n >\n <div>\n <Label htmlFor={passwordId}>{passwordLabel ?? l.password}</Label>\n <div className=\"relative\">\n <Input\n type=\"password\"\n id={passwordId}\n name=\"password\"\n placeholder=\"\"\n value={password}\n onChange={(e) => onPasswordChange(e.target.value)}\n disabled={disabled}\n autoFocus={autoFocus}\n autoComplete={showConfirmation ? 'new-password' : 'current-password'}\n required\n className={cn(\n 'placeholder:text-muted-foreground',\n showStrengthIndicator && 'rounded-b-none border-b-0'\n )}\n data-testid={testIdOr(testIds?.input, { testId: 'password-input' })}\n />\n {showStrengthIndicator && (\n <div\n data-testid={testIdOr(testIds?.strengthIndicator, {\n testId: 'password-strength-indicator',\n })}\n >\n <div className=\"h-1 w-full rounded-b bg-border\">\n <div\n className={cn(\n 'h-full rounded-b transition-all duration-300',\n password ? strengthStyle.bar : 'bg-border'\n )}\n style={{ width: password ? strengthStyle.width : '0%' }}\n data-testid={testIdOr(testIds?.strengthBar, { testId: 'strength-bar' })}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {showConfirmation && (\n <div>\n <Label htmlFor={confirmPasswordId}>{confirmLabel ?? l.confirmPassword}</Label>\n <div className=\"relative\">\n <Input\n type=\"password\"\n id={confirmPasswordId}\n name=\"confirm-password\"\n placeholder=\"\"\n value={confirmPassword}\n onChange={(e) => {\n onConfirmPasswordChange?.(e.target.value)\n // Hide the verdict while the user is editing again.\n setConfirmBlurred(false)\n }}\n onBlur={() => setConfirmBlurred(true)}\n disabled={disabled}\n autoComplete=\"new-password\"\n aria-invalid={passwordMismatch || undefined}\n aria-describedby={showStrengthIndicator ? mismatchId : undefined}\n required\n className={cn(\n 'placeholder:text-muted-foreground',\n showStrengthIndicator && 'rounded-b-none border-b-0',\n passwordMismatch && 'border-red-border'\n )}\n data-testid={testIdOr(testIds?.confirmInput, { testId: 'confirm-password-input' })}\n />\n {showStrengthIndicator && (\n <div\n data-testid={testIdOr(testIds?.confirmIndicator, {\n testId: 'confirm-password-indicator',\n })}\n >\n <div className=\"h-1 w-full rounded-b bg-border\">\n <div\n className={cn(\n 'h-full rounded-b transition-all duration-300',\n showConfirmFeedback\n ? passwordsMatch\n ? 'bg-green-text'\n : 'bg-red-text'\n : 'bg-border'\n )}\n style={{ width: showConfirmFeedback ? '100%' : '0%' }}\n data-testid={testIdOr(testIds?.confirmStrengthBar, {\n testId: 'confirm-strength-bar',\n })}\n />\n </div>\n <p\n id={mismatchId}\n aria-live=\"polite\"\n className={cn(\n 'mt-0.5 h-4 text-sm font-medium',\n showConfirmFeedback\n ? passwordsMatch\n ? 'text-green-text'\n : 'text-red-text'\n : 'text-transparent'\n )}\n data-testid={testIdOr(testIds?.mismatchError, {\n testId: 'password-mismatch-error',\n })}\n >\n {showConfirmFeedback\n ? passwordsMatch\n ? l.passwordsMatch\n : l.passwordsDoNotMatch\n : ' '}\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {showConfirmation && (\n <div\n className=\"h-5 text-sm leading-5\"\n data-testid={testIdOr(testIds?.requirements, { testId: 'password-requirements' })}\n >\n {password ? (\n firstUnmetRequirement ? (\n <p className=\"truncate text-red-text\">✗ {firstUnmetRequirement}</p>\n ) : (\n <Tooltip delayDuration={0}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.strengthInfo(strength.label)}\n className={cn(\n 'inline-flex items-center gap-1 truncate rounded font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n strengthStyle.text\n )}\n data-testid={testIdOr(testIds?.strengthInfoButton, {\n testId: 'strength-info-button',\n })}\n >\n <span\n data-testid={testIdOr(testIds?.strengthLabel, { testId: 'strength-label' })}\n >\n ✓ {strength.label}\n </span>\n <Info className=\"h-3.5 w-3.5 opacity-80\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" className=\"max-w-[260px] text-center\">\n {hint || l.strengthFallbackHint}\n </TooltipContent>\n </Tooltip>\n )\n ) : (\n <p className=\"truncate text-muted-foreground\">{emptyStateMessage || ' '}</p>\n )}\n </div>\n )}\n </div>\n )\n}\n"]}