@fayz-ai/admin 0.47.0 → 0.48.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 (355) hide show
  1. package/dist/ImportWizard-SYP3OXZU.js +3 -0
  2. package/dist/{ImportWizard-7UFB2PPF.js.map → ImportWizard-SYP3OXZU.js.map} +1 -1
  3. package/dist/PersonTimeline-X7JTPUWJ.js +3 -0
  4. package/dist/PersonTimeline-X7JTPUWJ.js.map +1 -0
  5. package/dist/ScheduleEditor-BXWJ7CMI.js +6 -0
  6. package/dist/{ScheduleEditor-MNHZCQIG.js.map → ScheduleEditor-BXWJ7CMI.js.map} +1 -1
  7. package/dist/SubscriptionPage-VBDDRSVW.js +8 -0
  8. package/dist/{SubscriptionPage-JWWS44SE.js.map → SubscriptionPage-VBDDRSVW.js.map} +1 -1
  9. package/dist/access/ModuleUnavailable.d.ts +14 -0
  10. package/dist/access/ModuleUnavailable.d.ts.map +1 -0
  11. package/dist/access/context.d.ts.map +1 -1
  12. package/dist/access/useModuleAccess.d.ts +11 -0
  13. package/dist/access/useModuleAccess.d.ts.map +1 -0
  14. package/dist/app/AdminShell.d.ts +1 -1
  15. package/dist/app/AdminShell.d.ts.map +1 -1
  16. package/dist/app/OfflineBoot.d.ts.map +1 -1
  17. package/dist/app/admin-app.d.ts +1 -1
  18. package/dist/app/admin-app.d.ts.map +1 -1
  19. package/dist/app/config.d.ts +3 -3
  20. package/dist/app/config.d.ts.map +1 -1
  21. package/dist/app/rail-preset.d.ts.map +1 -1
  22. package/dist/billing/TrialWidget.d.ts.map +1 -1
  23. package/dist/billing/ai-usage.d.ts +67 -0
  24. package/dist/billing/ai-usage.d.ts.map +1 -0
  25. package/dist/billing/index.d.ts +2 -0
  26. package/dist/billing/index.d.ts.map +1 -1
  27. package/dist/billing/index.js +3 -2
  28. package/dist/billing/module-families.d.ts +25 -0
  29. package/dist/billing/module-families.d.ts.map +1 -0
  30. package/dist/billing/module-pricing.d.ts +199 -0
  31. package/dist/billing/module-pricing.d.ts.map +1 -0
  32. package/dist/{chunk-IUCDHAAB.js → chunk-2Q6QHTZV.js} +13 -78
  33. package/dist/chunk-2Q6QHTZV.js.map +1 -0
  34. package/dist/{chunk-46UABOOC.js → chunk-5GCC7YCE.js} +40 -39
  35. package/dist/chunk-5GCC7YCE.js.map +1 -0
  36. package/dist/{chunk-WXNTUCX3.js → chunk-E4MESMNR.js} +10 -4
  37. package/dist/chunk-E4MESMNR.js.map +1 -0
  38. package/dist/chunk-F346TYKO.js +1448 -0
  39. package/dist/chunk-F346TYKO.js.map +1 -0
  40. package/dist/chunk-GZWX4ZIK.js +111 -0
  41. package/dist/chunk-GZWX4ZIK.js.map +1 -0
  42. package/dist/{chunk-OINP2UYL.js → chunk-KVIINVY6.js} +133 -169
  43. package/dist/chunk-KVIINVY6.js.map +1 -0
  44. package/dist/chunk-OEY3V6J3.js +581 -0
  45. package/dist/chunk-OEY3V6J3.js.map +1 -0
  46. package/dist/{chunk-V2IBAF4O.js → chunk-ZMP52ZHM.js} +23 -83
  47. package/dist/chunk-ZMP52ZHM.js.map +1 -0
  48. package/dist/components/RightRail.d.ts.map +1 -1
  49. package/dist/components/auth/CenteredLogin.d.ts +1 -1
  50. package/dist/components/auth/CenteredLogin.d.ts.map +1 -1
  51. package/dist/components/auth/LoginForm.d.ts +1 -1
  52. package/dist/components/auth/LoginForm.d.ts.map +1 -1
  53. package/dist/components/auth/LoginPage.d.ts +1 -1
  54. package/dist/components/auth/LoginPage.d.ts.map +1 -1
  55. package/dist/components/auth/OAuthButtons.d.ts +1 -1
  56. package/dist/components/auth/OAuthButtons.d.ts.map +1 -1
  57. package/dist/components/auth/ProtectedRoute.d.ts +1 -1
  58. package/dist/components/auth/ProtectedRoute.d.ts.map +1 -1
  59. package/dist/components/auth/RecoveryForm.d.ts.map +1 -1
  60. package/dist/components/auth/SignupForm.d.ts.map +1 -1
  61. package/dist/components/auth/SplitLogin.d.ts +1 -1
  62. package/dist/components/auth/SplitLogin.d.ts.map +1 -1
  63. package/dist/components/billing/AiUsageSection.d.ts +16 -0
  64. package/dist/components/billing/AiUsageSection.d.ts.map +1 -0
  65. package/dist/components/billing/InvoiceList.d.ts +1 -1
  66. package/dist/components/billing/InvoiceList.d.ts.map +1 -1
  67. package/dist/components/billing/PlanCheckoutSheet.d.ts +24 -0
  68. package/dist/components/billing/PlanCheckoutSheet.d.ts.map +1 -0
  69. package/dist/components/billing/PlanSelector.d.ts +1 -1
  70. package/dist/components/billing/PlanSelector.d.ts.map +1 -1
  71. package/dist/components/billing/PricingOverview.d.ts +20 -0
  72. package/dist/components/billing/PricingOverview.d.ts.map +1 -0
  73. package/dist/components/billing/SoftLimitWidget.d.ts.map +1 -1
  74. package/dist/components/billing/SubscriptionCard.d.ts +1 -1
  75. package/dist/components/billing/SubscriptionCard.d.ts.map +1 -1
  76. package/dist/components/billing/SubscriptionPage.d.ts.map +1 -1
  77. package/dist/components/billing/UpgradePrompt.d.ts.map +1 -1
  78. package/dist/components/billing/access-contract.d.ts +5 -3
  79. package/dist/components/billing/access-contract.d.ts.map +1 -1
  80. package/dist/components/billing/plan-feature.d.ts.map +1 -1
  81. package/dist/components/chat/AssistantActivityBar.d.ts.map +1 -1
  82. package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
  83. package/dist/components/chat/AssistantRecordingView.d.ts.map +1 -1
  84. package/dist/components/chat/ChatAttachments.d.ts.map +1 -1
  85. package/dist/components/chat/ChatComposer.d.ts.map +1 -1
  86. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  87. package/dist/components/chat/ChatFab.d.ts.map +1 -1
  88. package/dist/components/chat/ChatHistory.d.ts.map +1 -1
  89. package/dist/components/chat/ChatMessages.d.ts.map +1 -1
  90. package/dist/components/chat/ChatSuggestions.d.ts.map +1 -1
  91. package/dist/components/chat/ChoiceCard.d.ts.map +1 -1
  92. package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -1
  93. package/dist/components/chat/ConnectorSuggestionCard.d.ts.map +1 -1
  94. package/dist/components/chat/RecordChip.d.ts.map +1 -1
  95. package/dist/components/chat/TourCoachCard.d.ts.map +1 -1
  96. package/dist/components/connect/AddConnectorPanel.d.ts.map +1 -1
  97. package/dist/components/connect/ConnectConsentPage.d.ts.map +1 -1
  98. package/dist/components/connect/ConnectorDetail.d.ts.map +1 -1
  99. package/dist/components/connect/ConnectorRow.d.ts.map +1 -1
  100. package/dist/components/connect/ConnectorSyncActions.d.ts.map +1 -1
  101. package/dist/components/connect/ConnectorsPanel.d.ts.map +1 -1
  102. package/dist/components/layout/BottomNav.d.ts.map +1 -1
  103. package/dist/components/notifications/NotificationInbox.d.ts +1 -1
  104. package/dist/components/notifications/NotificationInbox.d.ts.map +1 -1
  105. package/dist/components/notifications/UpdateReady.d.ts.map +1 -1
  106. package/dist/components/organization/PermissionMatrixEditor.d.ts.map +1 -1
  107. package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -1
  108. package/dist/components/organization/TeamTab.d.ts.map +1 -1
  109. package/dist/components/plugins/ConnectorsHub.d.ts.map +1 -1
  110. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  111. package/dist/components/settings/AddModulesPanel.d.ts.map +1 -1
  112. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  113. package/dist/components/settings/CompanySettings.d.ts +1 -1
  114. package/dist/components/settings/CompanySettings.d.ts.map +1 -1
  115. package/dist/components/settings/ConnectedCompanySettings.d.ts.map +1 -1
  116. package/dist/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -1
  117. package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -1
  118. package/dist/components/settings/ConnectedSecuritySettings.d.ts.map +1 -1
  119. package/dist/components/settings/FieldRulesEditor.d.ts +12 -0
  120. package/dist/components/settings/FieldRulesEditor.d.ts.map +1 -0
  121. package/dist/components/settings/FieldRulesSettings.d.ts.map +1 -1
  122. package/dist/components/settings/HolidaysSettings.d.ts.map +1 -1
  123. package/dist/components/settings/ModuleCard.d.ts +18 -3
  124. package/dist/components/settings/ModuleCard.d.ts.map +1 -1
  125. package/dist/components/settings/ModuleFamilyBits.d.ts +4 -0
  126. package/dist/components/settings/ModuleFamilyBits.d.ts.map +1 -0
  127. package/dist/components/settings/ModulesSettings.d.ts +3 -1
  128. package/dist/components/settings/ModulesSettings.d.ts.map +1 -1
  129. package/dist/components/settings/SecuritySettings.d.ts +1 -1
  130. package/dist/components/settings/SecuritySettings.d.ts.map +1 -1
  131. package/dist/components/settings/SettingsPage.d.ts +19 -0
  132. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  133. package/dist/components/settings/UserProfile.d.ts +1 -1
  134. package/dist/components/settings/UserProfile.d.ts.map +1 -1
  135. package/dist/components/settings/module-links.d.ts +10 -0
  136. package/dist/components/settings/module-links.d.ts.map +1 -0
  137. package/dist/components/settings/module-scope.d.ts +28 -0
  138. package/dist/components/settings/module-scope.d.ts.map +1 -0
  139. package/dist/components/settings/settings-focus.d.ts +17 -0
  140. package/dist/components/settings/settings-focus.d.ts.map +1 -0
  141. package/dist/components/settings/settings-parents.d.ts +11 -0
  142. package/dist/components/settings/settings-parents.d.ts.map +1 -0
  143. package/dist/components/settings/settings-sections.d.ts +56 -0
  144. package/dist/components/settings/settings-sections.d.ts.map +1 -0
  145. package/dist/components/settings/settings-shortcuts.d.ts +7 -0
  146. package/dist/components/settings/settings-shortcuts.d.ts.map +1 -0
  147. package/dist/components/settings/settings-subtabs.d.ts +14 -0
  148. package/dist/components/settings/settings-subtabs.d.ts.map +1 -0
  149. package/dist/components/shared/ContactPicker.d.ts.map +1 -1
  150. package/dist/components/shared/PersonLink.d.ts.map +1 -1
  151. package/dist/components/shared/RecordPickerModal.d.ts.map +1 -1
  152. package/dist/components/survey/PublicSurveyPage.d.ts.map +1 -1
  153. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  154. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  155. package/dist/crud/CrudListView.d.ts.map +1 -1
  156. package/dist/crud/CrudPage.d.ts.map +1 -1
  157. package/dist/crud/EntityOverview.d.ts.map +1 -1
  158. package/dist/crud/ImportWizard.d.ts.map +1 -1
  159. package/dist/crud/InlineField.d.ts +36 -0
  160. package/dist/crud/InlineField.d.ts.map +1 -0
  161. package/dist/crud/LookupCreateInline.d.ts.map +1 -1
  162. package/dist/crud/RelatedSection.d.ts.map +1 -1
  163. package/dist/crud/TagsField.d.ts.map +1 -1
  164. package/dist/crud/archetypes/AccessTab.d.ts.map +1 -1
  165. package/dist/crud/archetypes/ActiveToggle.d.ts.map +1 -1
  166. package/dist/crud/archetypes/AddressFormModal.d.ts +34 -0
  167. package/dist/crud/archetypes/AddressFormModal.d.ts.map +1 -0
  168. package/dist/crud/archetypes/AddressesTab.d.ts +2 -20
  169. package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -1
  170. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts.map +1 -1
  171. package/dist/crud/archetypes/BlockSettingsPopover.d.ts +1 -1
  172. package/dist/crud/archetypes/BlockSettingsPopover.d.ts.map +1 -1
  173. package/dist/crud/archetypes/ClientOrdersTab.d.ts.map +1 -1
  174. package/dist/crud/archetypes/KanbanBoard.d.ts.map +1 -1
  175. package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -1
  176. package/dist/crud/archetypes/OrderBoardView.d.ts.map +1 -1
  177. package/dist/crud/archetypes/OrderCreateScreen.d.ts +3 -1
  178. package/dist/crud/archetypes/OrderCreateScreen.d.ts.map +1 -1
  179. package/dist/crud/archetypes/OrderDetailPage.d.ts.map +1 -1
  180. package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
  181. package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
  182. package/dist/crud/archetypes/PayeeAccountsSection.d.ts.map +1 -1
  183. package/dist/crud/archetypes/PaymentStatusBadge.d.ts.map +1 -1
  184. package/dist/crud/archetypes/PersonPicker.d.ts.map +1 -1
  185. package/dist/crud/archetypes/ScheduleDateExceptions.d.ts.map +1 -1
  186. package/dist/crud/archetypes/ScheduleGridPanel.d.ts.map +1 -1
  187. package/dist/crud/fieldToColumn.d.ts.map +1 -1
  188. package/dist/db.cjs +831 -5
  189. package/dist/db.d.ts +2 -1
  190. package/dist/db.d.ts.map +1 -1
  191. package/dist/db.js +1 -1
  192. package/dist/directory/AppSwitcher.d.ts.map +1 -1
  193. package/dist/handbook/NotebookPanel.d.ts.map +1 -1
  194. package/dist/hooks/useAITools.d.ts.map +1 -1
  195. package/dist/hooks/useAuth.d.ts +3 -3
  196. package/dist/hooks/useAuth.d.ts.map +1 -1
  197. package/dist/hooks/useChat.d.ts.map +1 -1
  198. package/dist/hooks/useFieldRules.d.ts +4 -2
  199. package/dist/hooks/useFieldRules.d.ts.map +1 -1
  200. package/dist/hooks/useFormatters.d.ts.map +1 -1
  201. package/dist/hooks/useGlobalSearch.d.ts.map +1 -1
  202. package/dist/hooks/useLayout.d.ts.map +1 -1
  203. package/dist/hooks/useNotifications.d.ts +1 -1
  204. package/dist/hooks/useNotifications.d.ts.map +1 -1
  205. package/dist/hooks/useTenant.d.ts +2 -2
  206. package/dist/hooks/useTenant.d.ts.map +1 -1
  207. package/dist/hooks/useTenantPlugins.d.ts +1 -1
  208. package/dist/impersonation/ImpersonationBanner.d.ts.map +1 -1
  209. package/dist/index.d.ts +48 -8
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +4945 -4555
  212. package/dist/index.js.map +1 -1
  213. package/dist/lib/currency.d.ts +6 -0
  214. package/dist/lib/currency.d.ts.map +1 -1
  215. package/dist/lib/field-rules-db.d.ts +36 -0
  216. package/dist/lib/field-rules-db.d.ts.map +1 -0
  217. package/dist/onboarding/ActivationProvider.d.ts.map +1 -1
  218. package/dist/onboarding/activation.store.d.ts +1 -1
  219. package/dist/onboarding/activation.store.d.ts.map +1 -1
  220. package/dist/onboarding/checklist.d.ts +1 -1
  221. package/dist/onboarding/checklist.d.ts.map +1 -1
  222. package/dist/onboarding/tasks.d.ts +1 -1
  223. package/dist/onboarding/tasks.d.ts.map +1 -1
  224. package/dist/org/WorkspaceChooser.d.ts.map +1 -1
  225. package/dist/org/WorkspaceUnitSheet.d.ts.map +1 -1
  226. package/dist/org/adapters/supabase.d.ts +1 -0
  227. package/dist/org/adapters/supabase.d.ts.map +1 -1
  228. package/dist/org/index.js +2 -2
  229. package/dist/permissions/v1-catalog.d.ts +16 -0
  230. package/dist/permissions/v1-catalog.d.ts.map +1 -0
  231. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
  232. package/dist/plugins/QuickActionsButton.d.ts.map +1 -1
  233. package/dist/plugins/SettingsGroup.d.ts +12 -4
  234. package/dist/plugins/SettingsGroup.d.ts.map +1 -1
  235. package/dist/plugins/WidgetSlot.d.ts.map +1 -1
  236. package/dist/projects/ProjectsSettings.d.ts.map +1 -1
  237. package/dist/projects/SeuSiteWidget.d.ts.map +1 -1
  238. package/dist/settings/MessageTemplateRow.d.ts +16 -0
  239. package/dist/settings/MessageTemplateRow.d.ts.map +1 -0
  240. package/dist/settings/SettingsForm.d.ts +60 -0
  241. package/dist/settings/SettingsForm.d.ts.map +1 -0
  242. package/dist/settings/UnitScopePicker.d.ts +22 -0
  243. package/dist/settings/UnitScopePicker.d.ts.map +1 -0
  244. package/dist/settings/core-v1-tabs.d.ts +8 -0
  245. package/dist/settings/core-v1-tabs.d.ts.map +1 -0
  246. package/dist/settings/defineSettingsTab.d.ts +17 -0
  247. package/dist/settings/defineSettingsTab.d.ts.map +1 -0
  248. package/dist/settings/registry-parent.d.ts +8 -0
  249. package/dist/settings/registry-parent.d.ts.map +1 -0
  250. package/dist/settings/useSettingKeys.d.ts +28 -0
  251. package/dist/settings/useSettingKeys.d.ts.map +1 -0
  252. package/dist/stores/auth.store.d.ts +1 -1
  253. package/dist/stores/auth.store.d.ts.map +1 -1
  254. package/dist/stores/notifications.store.d.ts +1 -1
  255. package/dist/stores/notifications.store.d.ts.map +1 -1
  256. package/dist/stores/tenant.store.d.ts +1 -1
  257. package/dist/stores/tenant.store.d.ts.map +1 -1
  258. package/dist/tasks/TasksPanel.d.ts +4 -0
  259. package/dist/tasks/TasksPanel.d.ts.map +1 -0
  260. package/dist/tasks/TasksRailPanel.d.ts.map +1 -1
  261. package/dist/tasks/index.d.ts +15 -14
  262. package/dist/tasks/index.d.ts.map +1 -1
  263. package/dist/timeline/PersonTimeline.d.ts +1 -0
  264. package/dist/timeline/PersonTimeline.d.ts.map +1 -1
  265. package/dist/types/billing.d.ts +2 -0
  266. package/dist/types/billing.d.ts.map +1 -1
  267. package/dist/types/plugins.d.ts +2 -0
  268. package/dist/types/plugins.d.ts.map +1 -1
  269. package/dist/ui.d.ts +2 -1
  270. package/dist/ui.d.ts.map +1 -1
  271. package/dist/ui.js +1 -1
  272. package/dist/units/MemberUnitsCell.d.ts.map +1 -1
  273. package/dist/units/UnitMembersTab.d.ts.map +1 -1
  274. package/dist/units/UnitSwitcher.d.ts.map +1 -1
  275. package/package.json +7 -7
  276. package/dist/ImportWizard-7UFB2PPF.js +0 -3
  277. package/dist/ScheduleEditor-MNHZCQIG.js +0 -6
  278. package/dist/SubscriptionPage-JWWS44SE.js +0 -9
  279. package/dist/access/index.d.ts +0 -12
  280. package/dist/access/index.d.ts.map +0 -1
  281. package/dist/access/resolver.d.ts +0 -2
  282. package/dist/access/resolver.d.ts.map +0 -1
  283. package/dist/app/LoginPage.d.ts +0 -3
  284. package/dist/app/LoginPage.d.ts.map +0 -1
  285. package/dist/chunk-46UABOOC.js.map +0 -1
  286. package/dist/chunk-IUCDHAAB.js.map +0 -1
  287. package/dist/chunk-OINP2UYL.js.map +0 -1
  288. package/dist/chunk-QOS6UAQ4.js +0 -54
  289. package/dist/chunk-QOS6UAQ4.js.map +0 -1
  290. package/dist/chunk-V2IBAF4O.js.map +0 -1
  291. package/dist/chunk-VH4LLIMH.js +0 -531
  292. package/dist/chunk-VH4LLIMH.js.map +0 -1
  293. package/dist/chunk-WXNTUCX3.js.map +0 -1
  294. package/dist/components/auth/index.d.ts +0 -7
  295. package/dist/components/auth/index.d.ts.map +0 -1
  296. package/dist/components/layout/index.d.ts +0 -6
  297. package/dist/components/layout/index.d.ts.map +0 -1
  298. package/dist/components/notifications/index.d.ts +0 -5
  299. package/dist/components/notifications/index.d.ts.map +0 -1
  300. package/dist/components/organization/index.d.ts +0 -5
  301. package/dist/components/organization/index.d.ts.map +0 -1
  302. package/dist/components/settings/index.d.ts +0 -11
  303. package/dist/components/settings/index.d.ts.map +0 -1
  304. package/dist/crud/index.d.ts +0 -18
  305. package/dist/crud/index.d.ts.map +0 -1
  306. package/dist/hooks/index.d.ts +0 -20
  307. package/dist/hooks/index.d.ts.map +0 -1
  308. package/dist/lib/format.d.ts +0 -7
  309. package/dist/lib/format.d.ts.map +0 -1
  310. package/dist/lib/plugins.d.ts +0 -2
  311. package/dist/lib/plugins.d.ts.map +0 -1
  312. package/dist/stores/billing.store.d.ts +0 -2
  313. package/dist/stores/billing.store.d.ts.map +0 -1
  314. package/dist/stores/index.d.ts +0 -13
  315. package/dist/stores/index.d.ts.map +0 -1
  316. package/dist/stores/layout.store.d.ts +0 -2
  317. package/dist/stores/layout.store.d.ts.map +0 -1
  318. package/dist/stores/permissions.store.d.ts +0 -2
  319. package/dist/stores/permissions.store.d.ts.map +0 -1
  320. package/dist/tasks/components/TaskCard.d.ts +0 -11
  321. package/dist/tasks/components/TaskCard.d.ts.map +0 -1
  322. package/dist/tasks/components/TaskDetail.d.ts +0 -5
  323. package/dist/tasks/components/TaskDetail.d.ts.map +0 -1
  324. package/dist/tasks/components/TaskLabelBadge.d.ts +0 -9
  325. package/dist/tasks/components/TaskLabelBadge.d.ts.map +0 -1
  326. package/dist/tasks/components/TaskPriorityBadge.d.ts +0 -7
  327. package/dist/tasks/components/TaskPriorityBadge.d.ts.map +0 -1
  328. package/dist/tasks/components/TaskQuickAdd.d.ts +0 -5
  329. package/dist/tasks/components/TaskQuickAdd.d.ts.map +0 -1
  330. package/dist/tasks/components/TaskSourceBadge.d.ts +0 -5
  331. package/dist/tasks/components/TaskSourceBadge.d.ts.map +0 -1
  332. package/dist/tasks/components/TaskStatusGroup.d.ts +0 -17
  333. package/dist/tasks/components/TaskStatusGroup.d.ts.map +0 -1
  334. package/dist/tasks/components/TasksFilterBar.d.ts +0 -3
  335. package/dist/tasks/components/TasksFilterBar.d.ts.map +0 -1
  336. package/dist/tasks/components/TasksPanel.d.ts +0 -14
  337. package/dist/tasks/components/TasksPanel.d.ts.map +0 -1
  338. package/dist/tasks/data/mock.d.ts +0 -3
  339. package/dist/tasks/data/mock.d.ts.map +0 -1
  340. package/dist/tasks/data/supabase.d.ts +0 -3
  341. package/dist/tasks/data/supabase.d.ts.map +0 -1
  342. package/dist/tasks/entity.d.ts +0 -11
  343. package/dist/tasks/entity.d.ts.map +0 -1
  344. package/dist/tasks/store.d.ts +0 -34
  345. package/dist/tasks/store.d.ts.map +0 -1
  346. package/dist/tasks/types.d.ts +0 -89
  347. package/dist/tasks/types.d.ts.map +0 -1
  348. package/dist/theme/index.d.ts +0 -8
  349. package/dist/theme/index.d.ts.map +0 -1
  350. package/dist/timeline/index.d.ts +0 -7
  351. package/dist/timeline/index.d.ts.map +0 -1
  352. package/dist/timeline-LECYQ4IA.js +0 -3
  353. package/dist/timeline-LECYQ4IA.js.map +0 -1
  354. package/dist/types/index.d.ts +0 -16
  355. package/dist/types/index.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/billing/plan-feature.tsx","../src/access/limits-registry.ts","../src/access/upgrade-modal-store.ts","../src/access/context.tsx","../src/access/headless.ts","../src/access/module-nav.ts","../src/components/billing/access-contract.ts","../src/components/billing/SubscriptionPage.tsx"],"names":["jsx","useAuthStore","resolveAccess","countByTenant","React2","React3","jsxs","Sparkles","Check"],"mappings":"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","file":"chunk-VH4LLIMH.js","sourcesContent":["import * as React from 'react'\nimport { Check, Sparkles } from 'lucide-react'\nimport { cn } from '../../lib/cn'\n\n// A plan feature string prefixed with `*` renders highlighted (Sparkles +\n// primary, medium weight) — the config-side seam for \"hero\" features like the\n// AI assistant. Shared by UpgradePrompt, PlanSelector and SubscriptionPage.\n\nexport function parsePlanFeature(feature: string): { label: string; highlighted: boolean } {\n return feature.startsWith('*')\n ? { label: feature.slice(1).trim(), highlighted: true }\n : { label: feature, highlighted: false }\n}\n\nexport function PlanFeatureItem({ feature, className, iconClassName }: {\n feature: string\n className?: string\n iconClassName?: string\n}) {\n const { label, highlighted } = parsePlanFeature(feature)\n return (\n <li className={cn('flex items-start gap-2', className, highlighted && 'font-medium text-primary')}>\n {highlighted ? (\n <Sparkles className={cn('mt-0.5 shrink-0 text-primary', iconClassName)} aria-hidden=\"true\" />\n ) : (\n <Check className={cn('mt-0.5 shrink-0 text-primary', iconClassName)} aria-hidden=\"true\" />\n )}\n <span>{label}</span>\n </li>\n )\n}\n","import type { LimitDeclaration, RegisteredEntity } from '@fayz-ai/core'\nimport { invalidateCount } from '@fayz-ai/core'\n\n/**\n * Module-level registry bridging React (the provider that knows the declarations)\n * and the plain `invalidateLimit(key)` function that create handlers call outside\n * any component. The AccessProvider publishes the merged declarations here on\n * mount; `useLimit`/`useLimitGuard` and `invalidateLimit` read from it.\n */\n\n/**\n * Shell built-in limit declarations. Unlike plugin/app limits (contributed via\n * `PluginManifest.declaredLimits` / `billing.limitDeclarations`), these count\n * core tenant tables that have no owning plugin: seats and units. Merged as the\n * LOWEST-priority layer by the AccessProvider, so a plugin or app may still\n * override a key (e.g. add a `kindFilter`).\n *\n * Counted through the public `v_*` bridges, not the base tables: the spine\n * moved memberships and units into schema `app`, which PostgREST cannot reach.\n */\nexport const CORE_LIMIT_DECLARATIONS: LimitDeclaration[] = [\n { key: 'users', label: 'Users', table: 'v_team_members' },\n { key: 'locations', label: 'Companies', table: 'v_units' },\n]\n\n/**\n * Entity-derived layer of the limit merge: any registered CRUD entity carrying\n * `limitKey` yields a declaration for free from its own data mapping (table +\n * archetype kind) — a cap without a countable binding is a dead cap. Shared by\n * the AccessProvider (live registry) and the manifest derivation (agent\n * contract), so both resolve the identical layer.\n */\nexport function entityDerivedLimitDeclarations(entities: RegisteredEntity[]): LimitDeclaration[] {\n const out: LimitDeclaration[] = []\n for (const e of entities) {\n const def = e.entityDef\n if (def?.limitKey && def.data?.table) {\n out.push({\n key: def.limitKey,\n label: e.labelPlural,\n table: def.data.table,\n kindFilter: def.data.archetypeKind,\n })\n }\n }\n return out\n}\n\nlet registry = new Map<string, LimitDeclaration>()\n\n/** Called by AccessProvider whenever the merged limit declarations change. */\nexport function setLimitRegistry(declarations: LimitDeclaration[]): void {\n const next = new Map<string, LimitDeclaration>()\n for (const decl of declarations) next.set(decl.key, decl)\n registry = next\n}\n\nexport function getLimitDeclaration(key: string): LimitDeclaration | undefined {\n return registry.get(key)\n}\n\n// --- Invalidation pub/sub -------------------------------------------------\n// useLimit subscribes per key; invalidateLimit(key) drops the cached count for\n// the declaration's table and notifies subscribers to re-fetch.\n\nconst listeners = new Map<string, Set<() => void>>()\n\nexport function subscribeLimit(key: string, cb: () => void): () => void {\n let set = listeners.get(key)\n if (!set) {\n set = new Set()\n listeners.set(key, set)\n }\n set.add(cb)\n return () => {\n set?.delete(cb)\n if (set && set.size === 0) listeners.delete(key)\n }\n}\n\n/**\n * Invalidate a limit after a create/delete so its next read is fresh, then wake\n * any mounted `useLimit(key)`. Safe to call from plain handlers (no React).\n */\nexport function invalidateLimit(key: string): void {\n const decl = registry.get(key)\n if (decl) invalidateCount(decl.table)\n listeners.get(key)?.forEach((cb) => cb())\n}\n","import { create } from 'zustand'\n\n/**\n * Payload describing WHY the upgrade modal opened, so the visual component (owned\n * by the shell/gates layer) can tailor its copy — a hit quantity cap\n * (`limitKey`) or a plan-gated feature (`feature`).\n */\nexport interface UpgradeModalPayload {\n limitKey?: string\n feature?: string\n}\n\nexport interface UpgradeModalStore {\n /** The active payload, or null when closed. */\n current: UpgradeModalPayload | null\n open(payload: UpgradeModalPayload): void\n close(): void\n}\n\n/**\n * Global, lightweight store for the single app-wide UpgradeModal. `useLimitGuard`\n * and imperative create handlers call `open(...)` when a limit blocks; the visual\n * modal (rendered once near the shell root by the gates layer) subscribes to\n * `current`. Kept as a zustand singleton so store + component share one instance.\n */\nexport const useUpgradeModalStore = create<UpgradeModalStore>((set) => ({\n current: null,\n open: (payload) => set({ current: payload }),\n close: () => set({ current: null }),\n}))\n","import * as React from 'react'\nimport type { LimitDeclaration, PermissionAction, Plan } from '@fayz-ai/core'\nimport { countByTenant, usePluginRuntimeOptional, getAllEntities } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../org/store'\nimport { usePermissionsStore } from '../permissions/store'\nimport { useBillingStore } from '../billing/store'\nimport { effectivePlan, useTrial } from '../billing/trial'\nimport { mergeLimitDeclarations } from '@fayz-ai/core/access'\nimport { resolveAccess, isEntitledByPlan, resolveLimit } from './resolver'\nimport { entityDerivedLimitDeclarations } from './limits-registry'\nimport { setLimitRegistry, getLimitDeclaration, subscribeLimit, CORE_LIMIT_DECLARATIONS } from './limits-registry'\nimport { useUpgradeModalStore } from './upgrade-modal-store'\nimport type { AccessApi, AccessDecision, AccessSession, LimitState } from './types'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface AccessContextValue extends AccessApi {\n session: AccessSession\n}\n\nconst AccessContext = React.createContext<AccessContextValue | null>(null)\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface AccessProviderProps {\n children: React.ReactNode\n /**\n * App-level limit declarations layered ON TOP of the plugins' `declaredLimits`\n * (app wins on key collision). Sourced from `config.billing.limitDeclarations`.\n */\n limitDeclarations?: LimitDeclaration[]\n /** Plan the tenant is entitled to while its trial runs. See billing/trial.ts. */\n trialPlanId?: string\n}\n\n/**\n * Assembles the reactive {@link AccessSession} from the singleton stores and\n * exposes the composed access API (role × plan). Thin by design — mounts just\n * inside PermissionsProvider so it can reuse the live permission profile and the\n * plugin runtime. Also publishes the merged limit declarations to the module\n * registry so `invalidateLimit` works from non-React create handlers.\n */\nexport function AccessProvider({ children, limitDeclarations, trialPlanId }: AccessProviderProps) {\n const user = useAuthStore((s) => s.user)\n const org = useOrganizationStore((s) => s.currentOrg)\n const profile = usePermissionsStore((s) => s.currentProfile)\n const plans = useBillingStore((s) => s.plans)\n\n const runtime = usePluginRuntimeOptional()\n const pluginLimits = runtime?.pluginLimits\n\n // Merge limit declarations by priority (later wins by key): shell built-ins\n // (users/locations) < entity-derived < plugin `declaredLimits` < app\n // overrides. Then publish to the module registry consumed by\n // invalidateLimit / the limit hooks.\n //\n // Entity-derived: any registered CRUD entity carrying `limitKey` yields a\n // declaration for free from its own data mapping (table + archetype kind) —\n // this is what makes an app's `EntityDef.limitKey: 'clients'` enforceable\n // with ZERO extra wiring (a cap without a countable binding is a dead cap).\n React.useEffect(() => {\n setLimitRegistry(\n mergeLimitDeclarations(\n CORE_LIMIT_DECLARATIONS,\n entityDerivedLimitDeclarations(getAllEntities()),\n pluginLimits,\n limitDeclarations,\n ),\n )\n }, [pluginLimits, limitDeclarations])\n\n // The trial is resolved HERE and nowhere else: it changes which plan's\n // entitlements apply, and every gate in the product already reads that. A\n // per-feature \"…or on trial\" check would have to be repeated in the nav, the\n // gates, the caps and the assistant, and one of them would be forgotten.\n const trial = useTrial()\n const plan: Plan | null = React.useMemo(\n () => effectivePlan(org, plans, trial, trialPlanId),\n [plans, org?.plan, trial.status, trialPlanId],\n )\n\n const session: AccessSession = React.useMemo(\n () => ({ user, org, profile, plan }),\n [user, org, profile, plan],\n )\n\n const value = React.useMemo<AccessContextValue>(\n () => ({\n session,\n can: (feature, action) => resolveAccess(session, feature, action),\n entitled: (feature) => isEntitledByPlan(session.plan, feature),\n }),\n [session],\n )\n\n return <AccessContext.Provider value={value}>{children}</AccessContext.Provider>\n}\nAccessProvider.displayName = 'AccessProvider'\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\nconst ALLOW_ALL: AccessApi = {\n can: () => ({ allowed: true }),\n entitled: () => true,\n}\n\n/**\n * The composed access API. Throws outside <AccessProvider> — use\n * {@link useAccessOptional} for SDK components that must degrade gracefully.\n */\nexport function useAccess(): AccessApi {\n const ctx = React.useContext(AccessContext)\n if (!ctx) throw new Error('useAccess must be used inside <AccessProvider>')\n return { can: ctx.can, entitled: ctx.entitled }\n}\n\n/**\n * Like {@link useAccess} but degrades to allow-all when no provider is mounted,\n * so components stay usable under a bare host shell (gating is an enhancement).\n */\nexport function useAccessOptional(): AccessApi {\n const ctx = React.useContext(AccessContext)\n return ctx ? { can: ctx.can, entitled: ctx.entitled } : ALLOW_ALL\n}\n\n/** Internal: the live session (for hooks that need tenant/plan directly). */\nfunction useAccessSession(): AccessSession | null {\n return React.useContext(AccessContext)?.session ?? null\n}\n\n// ---------------------------------------------------------------------------\n// Limits\n// ---------------------------------------------------------------------------\n\nfunction resolveCap(plan: Plan | null, key: string): number | undefined {\n return plan?.entitlements?.limits?.[key]\n}\n\n/**\n * Live usage of a quantity limit for the active tenant. Resolves the limit's\n * declaration (plugin manifest or app override) → a tenant-scoped `count(*)`,\n * capped by the current plan. No declaration or no cap (or `-1`) ⇒ unlimited.\n * Re-fetches when the tenant, plan cap, or an `invalidateLimit(key)` fires.\n */\nexport function useLimit(key: string): LimitState {\n const session = useAccessSession()\n const tenantId = session?.org?.id\n const cap = resolveCap(session?.plan ?? null, key)\n const declaration = getLimitDeclaration(key)\n\n const unlimited = !declaration || cap === undefined || cap === -1\n\n const [used, setUsed] = React.useState(0)\n const [loading, setLoading] = React.useState(!unlimited)\n const [version, setVersion] = React.useState(0)\n\n const refresh = React.useCallback(() => setVersion((v) => v + 1), [])\n\n // Wake on external invalidation (a create/delete elsewhere).\n React.useEffect(() => subscribeLimit(key, refresh), [key, refresh])\n\n React.useEffect(() => {\n if (unlimited || !declaration || !tenantId) {\n setUsed(0)\n setLoading(false)\n return\n }\n let active = true\n setLoading(true)\n countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: version > 0,\n })\n .then((n) => {\n if (active) {\n setUsed(n)\n setLoading(false)\n }\n })\n .catch(() => {\n if (active) setLoading(false)\n })\n return () => {\n active = false\n }\n }, [unlimited, declaration, tenantId, version])\n\n const bounds = resolveLimit({ cap, hasDeclaration: Boolean(declaration), used })\n\n return { key, ...bounds, loading, refresh }\n}\n\n/**\n * Imperative guard for create handlers: `await guard(n)` returns `'ok'` when\n * adding `n` more rows stays within the cap, or `'blocked'` (and opens the global\n * UpgradeModal) when it would exceed it. Always checks a FRESH count so it never\n * relies on stale hook state.\n */\nexport function useLimitGuard(key: string): (n?: number) => Promise<'ok' | 'blocked'> {\n const session = useAccessSession()\n const tenantId = session?.org?.id\n const plan = session?.plan ?? null\n const openModal = useUpgradeModalStore((s) => s.open)\n\n return React.useCallback(\n async (n = 1) => {\n const cap = resolveCap(plan, key)\n const declaration = getLimitDeclaration(key)\n // Unlimited / no declaration / no tenant ⇒ never block.\n if (!declaration || cap === undefined || cap === -1 || !tenantId) return 'ok'\n\n const used = await countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: true,\n })\n\n if (used + n > cap) {\n openModal({ limitKey: key })\n return 'blocked'\n }\n return 'ok'\n },\n [key, plan, tenantId, openModal],\n )\n}\n","import type { PermissionAction, Plan } from '@fayz-ai/core'\nimport { countByTenant } from '@fayz-ai/core'\nimport { resolveAccess, agentDenial, type AgentGuardResult } from '@fayz-ai/core/access'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../org/store'\nimport { usePermissionsStore } from '../permissions/store'\nimport { useBillingStore } from '../billing/store'\nimport { getLimitDeclaration } from './limits-registry'\nimport type { AccessSession } from './types'\n\n// ---------------------------------------------------------------------------\n// Headless access — the imperative counterpart of useAccess()/useLimitGuard()\n// for runtimes without React: the agent's client-plane tool executor, command\n// handlers, background sync. Reads the SAME singleton stores the providers\n// hydrate, and decides with the SAME engine (@fayz-ai/core/access), so a\n// decision here never diverges from what the UI shows.\n//\n// Denials come back as the structured AgentDenial (never a silent failure) so\n// an agent can explain the denial and offer the upgrade conversationally.\n// ---------------------------------------------------------------------------\n\n/**\n * Snapshot of the live session assembled from the singleton stores — the same\n * assembly AccessProvider does reactively. Values are as-hydrated: before\n * AuthProvider/OrgProvider finish, fields are null, and an unresolved profile\n * DENIES — same semantics as the providers.\n */\nexport function getAccessSnapshot(): AccessSession {\n const user = useAuthStore.getState().user\n const org = useOrganizationStore.getState().currentOrg\n const profile = usePermissionsStore.getState().currentProfile\n const plans = useBillingStore.getState().plans\n const plan: Plan | null = org?.plan ? plans.find((p) => p.id === org.plan) ?? null : null\n return { user, org, profile, plan }\n}\n\n/** Imperative role × plan check over the live snapshot. */\nexport function checkAccess(feature: string, action?: PermissionAction): AgentGuardResult {\n const session = getAccessSnapshot()\n const decision = resolveAccess(session, feature, action)\n if (decision.allowed) return { allowed: true }\n return agentDenial(decision.reason ?? 'role')\n}\n\n/**\n * Imperative plan-limit guard: would adding `n` rows exceed the cap for\n * `key`? Counts FRESH (never trusts stale hook state), mirrors useLimitGuard.\n * No declaration / no cap / `-1` / no tenant ⇒ allowed. Does NOT open the\n * UpgradeModal — the caller decides how to surface the denial (an agent turns\n * it into a conversational upgrade prompt).\n */\nexport async function guardLimit(key: string, n = 1): Promise<AgentGuardResult> {\n const session = getAccessSnapshot()\n const tenantId = session.org?.id\n const cap = session.plan?.entitlements?.limits?.[key]\n const declaration = getLimitDeclaration(key)\n\n if (!declaration || cap === undefined || cap === -1 || !tenantId) return { allowed: true }\n\n const used = await countByTenant(declaration.table, {\n kind: declaration.kindFilter,\n period: declaration.period,\n tenantId,\n fresh: true,\n })\n\n if (used + n > cap) {\n return agentDenial('limit', { key, max: cap, used })\n }\n return { allowed: true }\n}\n","import * as React from 'react'\nimport type { ModuleNavItem } from '@fayz-ai/ui'\nimport { usePermissionsStore } from '../permissions/store'\nimport { useAccessOptional } from './context'\nimport type { AccessApi } from './types'\n\n// ---------------------------------------------------------------------------\n// useModuleNavAccess — the LINK-side counterpart of EntitlementGate for a\n// plugin's INTERNAL navigation (ModulePage sub-nav). Mirrors the top-level\n// Sidebar/AdminShell rule so a premium sub-module link reads identically:\n//\n// • role denies (can(feature,'read').reason === 'role') → REMOVE the link\n// • plan denies (entitled(feature) === false) → keep, premium:true\n// (the click still navigates; the gated CONTENT shows the\n// UpgradePrompt via EntitlementGate)\n// • otherwise → keep as-is\n//\n// A feature id ABSENT from the RBAC catalog is treated as \"default allow\": the\n// role axis is skipped entirely for it (an undeclared feature can't be a role\n// denial), so apps that wire the plugin without declaring the sub-feature don't\n// lose the link. The plan axis is naturally safe already — `entitled` returns\n// true for any feature a plan never disables.\n//\n// Recursive over `children`. Degrades to allow-all when no <AccessProvider> is\n// mounted (bare host shell), exactly like `useAccessOptional`.\n// ---------------------------------------------------------------------------\n\n/**\n * Pure decoration used by {@link useModuleNavAccess}. Kept store-free so it is\n * directly unit-testable: pass the composed {@link AccessApi} and the set of\n * feature ids known to the RBAC catalog.\n */\nexport function applyNavAccess(\n items: ModuleNavItem[],\n access: AccessApi,\n knownFeatures: Set<string>,\n): ModuleNavItem[] {\n const decorate = (item: ModuleNavItem): ModuleNavItem | null => {\n const children = item.children\n ? item.children\n .map(decorate)\n .filter((c): c is ModuleNavItem => c !== null)\n : undefined\n\n if (!item.feature) {\n return children ? { ...item, children } : item\n }\n\n // Role axis — only meaningful for a feature the RBAC catalog actually\n // declares. An undeclared feature defaults to allow (never removed).\n if (knownFeatures.has(item.feature)) {\n const decision = access.can(item.feature, 'read')\n if (!decision.allowed && decision.reason === 'role') return null\n }\n\n // Plan axis — `entitled` is `false` only on an explicit plan denial; absent\n // features stay entitled, so no Crown appears for them.\n const premium = access.entitled(item.feature) === false\n\n return children ? { ...item, premium, children } : { ...item, premium }\n }\n\n return items.map(decorate).filter((i): i is ModuleNavItem => i !== null)\n}\n\n/**\n * Resolve a plugin's internal nav against role × plan: hides role-denied links,\n * badges plan-denied ones with a Crown (`premium`), and passes everything else\n * through unchanged. Recursive over children.\n */\nexport function useModuleNavAccess(items: ModuleNavItem[]): ModuleNavItem[] {\n const access = useAccessOptional()\n const features = usePermissionsStore((s) => s.features)\n const knownFeatures = React.useMemo(\n () => new Set(features.map((f) => f.id)),\n [features],\n )\n return React.useMemo(\n () => applyNavAccess(items, access, knownFeatures),\n [items, access, knownFeatures],\n )\n}\n","// ---------------------------------------------------------------------------\n// access-contract — the single import seam the billing UI uses for the\n// entitlements engine (UpgradePrompt, UpgradeModal, EntitlementGate, LimitGate,\n// SoftLimitWidget, the AdminShell route guard / nav badge, SubscriptionPage\n// matrix). Re-exports the core access engine (packages/saas/src/access) so the\n// billing layer has ONE stable path and the wiring (AccessProvider) stays in the\n// núcleo. `getPlanEntitlements` is a thin local reader — core's Plan carries the\n// entitlements, so this just narrows the access.\n//\n// (History: this file shipped as a temporary stub while the access engine landed\n// in parallel; now repointed to the real module. The public names/types below\n// match the fixed contract, so no billing-wave consumer changed.)\n// ---------------------------------------------------------------------------\nimport type { Plan, PlanEntitlements } from '@fayz-ai/core'\n\nexport {\n useAccessOptional,\n useLimit,\n useLimitGuard,\n invalidateLimit,\n useUpgradeModalStore,\n} from '../../access'\n\nexport type { AccessApi, AccessDecision } from '../../access'\n// The billing layer refers to the limit shape as `LimitInfo`; the engine calls\n// it `LimitState`. Same structure — alias to keep call sites stable.\nexport type { LimitState as LimitInfo } from '../../access'\nexport type { PlanEntitlements } from '@fayz-ai/core'\n\n/** Narrow a plan to its entitlements (undefined when the plan declares none). */\nexport function getPlanEntitlements(plan: Plan | undefined | null): PlanEntitlements | undefined {\n return plan?.entitlements\n}\n\n/**\n * Clean a feature's raw permission label into a display name for the upgrade\n * surfaces. Feature labels in an app's permissions config carry an access-scope\n * suffix — e.g. \"Marketing (acesso)\" / \"Reports (access)\" — which reads as noise\n * when interpolated into a headline (\"Unlock Marketing (acesso)\"). Strip a single\n * trailing parenthetical group and collapse surrounding whitespace. Shared by\n * UpgradePrompt AND UpgradeModal so the two surfaces stay in lockstep.\n */\nexport function featureDisplayName(label: string | null | undefined): string {\n if (!label) return ''\n return label.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim() || label.trim()\n}\n\n/**\n * Which ISO-4217 code to price a plan in. `Plan.currency` is the source of\n * truth, but apps DO ship billing configs that omit it — and silently printing\n * \"$79\" to a tenant billed in reais is worse than any other failure mode here.\n * So the fallback follows the ACTIVE LOCALE's region rather than a hardcoded\n * 'USD'; only a locale we can't place at all lands on USD.\n */\nconst CURRENCY_BY_REGION: Record<string, string> = {\n BR: 'BRL', PT: 'EUR', ES: 'EUR', FR: 'EUR', DE: 'EUR', IT: 'EUR', NL: 'EUR', IE: 'EUR',\n GB: 'GBP', US: 'USD', CA: 'CAD', AU: 'AUD', MX: 'MXN', AR: 'ARS', CL: 'CLP', CO: 'COP',\n}\n\nexport function resolvePlanCurrency(planCurrency: string | undefined, locale: string | undefined): string {\n if (planCurrency) return planCurrency\n const region = locale?.split(/[-_]/)[1]?.toUpperCase()\n return (region && CURRENCY_BY_REGION[region]) || 'USD'\n}\n","import * as React from 'react'\nimport { Crown, Check, Minus, Sparkles } from 'lucide-react'\nimport { PlanFeatureItem, parsePlanFeature } from './plan-feature'\nimport { Button, Badge, Card, CardContent, CardHeader, ConfirmDialog, toast } from '@fayz-ai/ui'\nimport type { Plan } from '@fayz-ai/core'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useBillingStore } from '../../stores/billing.store'\nimport { resolvePlanBadge } from '../../billing/plan-badge'\nimport { useTenantOptional, useOrgAdapterOptional } from '../../org/context'\nimport { useOrganizationStore } from '../../org/store'\nimport { usePermissionsStore } from '../../permissions'\nimport { getPlanEntitlements } from './access-contract'\n\n// ---------------------------------------------------------------------------\n// SubscriptionPage — the shell's self-serve subscription surface. Present as the\n// /settings/subscription tab whenever `config.billing` is configured. Reads the\n// plans seeded into the billing store from config, resolves the current plan\n// from `currentOrg.plan`, and changes plan via the checkout seam (Stripe/Pix) or,\n// when no seam is configured, an optimistic `adapter.updateOrg(orgId, { plan })`.\n// ---------------------------------------------------------------------------\n\nfunction formatPrice(plan: Plan, tr: (k: string, f: string) => string): string {\n if (plan.price <= 0) return tr('billing.free', 'Free')\n try {\n const isInteger = Number.isInteger(plan.price)\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: plan.currency || 'USD',\n minimumFractionDigits: isInteger ? 0 : 2,\n }).format(plan.price)\n } catch {\n return `${plan.currency || ''} ${plan.price}`.trim()\n }\n}\n\nfunction intervalSuffix(plan: Plan, tr: (k: string, f: string) => string): string {\n if (plan.price <= 0) return ''\n return plan.interval === 'year'\n ? tr('billing.perYear', '/yr')\n : tr('billing.perMonth', '/mo')\n}\n\nexport function SubscriptionPage({ className }: { className?: string }) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const plans = useBillingStore((s) => s.plans)\n const checkout = useBillingStore((s) => s.checkout)\n const tenant = useTenantOptional()\n const adapter = useOrgAdapterOptional()\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n\n const currentPlanId = currentOrg?.plan || 'free'\n const currentBadge = resolvePlanBadge(currentPlanId, plans)\n const currentPlan = plans.find((p) => p.id === currentPlanId)\n\n const [pending, setPending] = React.useState<Plan | null>(null)\n const [busy, setBusy] = React.useState(false)\n\n // Feature matrix — union of every plan's features, order-preserved.\n const allFeatures = React.useMemo(() => {\n const seen = new Set<string>()\n const out: string[] = []\n for (const plan of plans) {\n for (const f of plan.features) {\n if (!seen.has(f)) {\n seen.add(f)\n out.push(f)\n }\n }\n }\n return out\n }, [plans])\n\n // Real entitlements matrix — derived from plan.entitlements when any plan\n // declares them. Feature rows show ✓/— per plan; limit rows show \"Up to N\" /\n // \"Unlimited\". Falls back to the marketing-bullet matrix (allFeatures) below\n // when no plan carries entitlements.\n const featureCatalog = usePermissionsStore((s) => s.features)\n const entitlementsMatrix = React.useMemo(() => {\n const hasAny = plans.some((p) => getPlanEntitlements(p))\n if (!hasAny) return null\n\n const featureIds: string[] = []\n const featureSeen = new Set<string>()\n const limitKeys: string[] = []\n const limitSeen = new Set<string>()\n for (const plan of plans) {\n const ent = getPlanEntitlements(plan)\n for (const id of Object.keys(ent?.features ?? {})) {\n if (!featureSeen.has(id)) { featureSeen.add(id); featureIds.push(id) }\n }\n for (const key of Object.keys(ent?.limits ?? {})) {\n if (!limitSeen.has(key)) { limitSeen.add(key); limitKeys.push(key) }\n }\n }\n if (featureIds.length === 0 && limitKeys.length === 0) return null\n\n const labelForFeature = (id: string) => featureCatalog.find((f) => f.id === id)?.label ?? id\n const labelForLimit = (key: string) => {\n const v = t(`limit.label.${key}`)\n return !v || v === `limit.label.${key}` ? key : v\n }\n return { featureIds, limitKeys, labelForFeature, labelForLimit }\n }, [plans, featureCatalog, t])\n\n async function applyChange(plan: Plan) {\n setBusy(true)\n try {\n // Seam: a configured gateway (Stripe/Pix) owns the transition; the webhook\n // is the source of truth for the persisted plan, so we don't mutate here.\n if (checkout) {\n await checkout(plan.id)\n setPending(null)\n return\n }\n // No gateway: optimistic org update. Persist + swap the store so the plan\n // badge and CTAs re-render immediately.\n if (adapter && currentOrg) {\n const updated = await adapter.updateOrg(currentOrg.id, { plan: plan.id })\n setCurrentOrg(updated)\n } else if (currentOrg) {\n setCurrentOrg({ ...currentOrg, plan: plan.id })\n }\n toast.success(\n tr('billing.planChanged', 'Plan updated').replace('{{plan}}', plan.name),\n )\n setPending(null)\n } catch {\n toast.error(tr('billing.planChangeFailed', \"Couldn't change your plan. Please try again.\"))\n } finally {\n setBusy(false)\n }\n }\n\n if (plans.length === 0) {\n return (\n <div className={className ?? 'mx-auto max-w-5xl'}>\n <p className=\"text-sm text-muted-foreground\">\n {tr('billing.noPlans', 'No plans are configured.')}\n </p>\n </div>\n )\n }\n\n return (\n <div className={className ?? 'mx-auto max-w-5xl space-y-8'}>\n {/* Sem título nem descrição: a barra já escreve \"Assinatura\", e a frase\n embaixo custava uma linha para repetir o que os planos mostram. */}\n\n {/* Current plan highlight */}\n <Card\n className={cn(\n 'relative overflow-hidden',\n currentBadge.paid && 'border-amber-400/60 bg-gradient-to-br from-amber-50/60 to-transparent dark:from-amber-950/20',\n )}\n >\n <CardContent className=\"flex flex-wrap items-center justify-between gap-4 p-6\">\n <div className=\"flex items-center gap-4\">\n <div\n className={cn(\n 'flex h-12 w-12 shrink-0 items-center justify-center rounded-xl',\n currentBadge.paid ? 'bg-amber-400/20 text-amber-600 dark:text-amber-400' : 'bg-muted text-muted-foreground',\n )}\n >\n {currentBadge.paid ? <Crown className=\"h-6 w-6\" /> : <Sparkles className=\"h-6 w-6\" />}\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {tr('billing.currentPlan', 'Current Plan')}\n </p>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xl font-bold\">{currentBadge.label}</span>\n {currentBadge.paid && (\n // Paid marker only — a literal \"Pro\" here was misleading next\n // to non-Pro paid tiers (\"Starter / Pro\", QA finding).\n <Badge\n aria-label={tr('billing.paidPlan', 'Paid plan')}\n className=\"border-amber-400/40 bg-amber-400/15 text-amber-700 dark:text-amber-300\"\n >\n <Crown className=\"h-3 w-3\" />\n </Badge>\n )}\n </div>\n </div>\n </div>\n {currentPlan && (\n <div className=\"text-right\">\n <span className=\"text-2xl font-bold\">{formatPrice(currentPlan, tr)}</span>\n <span className=\"text-sm text-muted-foreground\">{intervalSuffix(currentPlan, tr)}</span>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Plan cards */}\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {plans.map((plan) => {\n const isCurrent = plan.id === currentPlanId\n const paid = plan.price > 0\n return (\n <Card\n key={plan.id}\n className={cn(\n 'relative flex flex-col',\n plan.highlighted && 'border-primary shadow-md',\n isCurrent && 'ring-2 ring-primary/40',\n )}\n >\n {plan.highlighted && (\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <Badge>\n <Crown className=\"mr-1 h-3 w-3\" />\n {tr('billing.mostPopular', 'Most Popular')}\n </Badge>\n </div>\n )}\n <CardHeader className=\"pb-0\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-xl font-semibold\">{plan.name}</h3>\n {paid && <Crown className=\"h-4 w-4 text-amber-500\" />}\n </div>\n {plan.description && (\n <p className=\"text-sm text-muted-foreground\">{plan.description}</p>\n )}\n </CardHeader>\n <CardContent className=\"flex flex-1 flex-col pt-4\">\n <div className=\"mb-6\">\n <span className=\"text-4xl font-bold\">{formatPrice(plan, tr)}</span>\n <span className=\"text-muted-foreground\">{intervalSuffix(plan, tr)}</span>\n </div>\n <ul className=\"mb-6 flex-1 space-y-3\">\n {plan.features.map((feature) => (\n <PlanFeatureItem key={feature} feature={feature} className=\"text-sm\" iconClassName=\"h-4 w-4\" />\n ))}\n </ul>\n {isCurrent ? (\n <Button variant=\"outline\" className=\"w-full\" disabled>\n {tr('billing.currentPlan', 'Current Plan')}\n </Button>\n ) : (\n <Button\n className=\"w-full\"\n variant={plan.highlighted ? 'default' : 'outline'}\n onClick={() => setPending(plan)}\n >\n {tr('billing.changeToPlan', 'Switch to this plan')}\n </Button>\n )}\n </CardContent>\n </Card>\n )\n })}\n </div>\n\n {/* Feature matrix */}\n {(entitlementsMatrix || allFeatures.length > 0) && (\n <div className=\"space-y-3\">\n <h2 className=\"text-lg font-semibold\">\n {tr('billing.featureMatrix', 'Feature comparison')}\n </h2>\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/40\">\n <th className=\"px-4 py-3 text-left font-medium\">\n {tr('billing.features', 'Features')}\n </th>\n {plans.map((plan) => (\n <th key={plan.id} className=\"px-4 py-3 text-center font-medium\">\n <span className=\"inline-flex items-center gap-1\">\n {plan.price > 0 && <Crown className=\"h-3.5 w-3.5 text-amber-500\" />}\n {plan.name}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entitlementsMatrix ? (\n <>\n {entitlementsMatrix.featureIds.map((id, i) => (\n <tr key={`f:${id}`} className={cn(i % 2 === 1 && 'bg-muted/20')}>\n <td className=\"px-4 py-2.5 text-left\">{entitlementsMatrix.labelForFeature(id)}</td>\n {plans.map((plan) => {\n const entitled = getPlanEntitlements(plan)?.features?.[id] !== false\n return (\n <td key={plan.id} className=\"px-4 py-2.5 text-center\">\n {entitled ? (\n <Check className=\"mx-auto h-4 w-4 text-primary\" />\n ) : (\n <Minus className=\"mx-auto h-4 w-4 text-muted-foreground/40\" />\n )}\n </td>\n )\n })}\n </tr>\n ))}\n {entitlementsMatrix.limitKeys.map((key, i) => (\n <tr key={`l:${key}`} className={cn((entitlementsMatrix.featureIds.length + i) % 2 === 1 && 'bg-muted/20')}>\n <td className=\"px-4 py-2.5 text-left\">{entitlementsMatrix.labelForLimit(key)}</td>\n {plans.map((plan) => {\n const cap = getPlanEntitlements(plan)?.limits?.[key]\n const cell =\n cap === undefined\n ? '—'\n : cap < 0\n ? tr('billing.unlimited', 'Unlimited')\n : tr('billing.upTo', 'Up to {count}').replace('{count}', String(cap)).replace('{{count}}', String(cap))\n return (\n <td key={plan.id} className=\"px-4 py-2.5 text-center text-muted-foreground\">\n {cell}\n </td>\n )\n })}\n </tr>\n ))}\n </>\n ) : (\n allFeatures.map((feature, i) => (\n <tr key={feature} className={cn(i % 2 === 1 && 'bg-muted/20')}>\n <td className=\"px-4 py-2.5 text-left\">{parsePlanFeature(feature).label}</td>\n {plans.map((plan) => (\n <td key={plan.id} className=\"px-4 py-2.5 text-center\">\n {plan.features.includes(feature) ? (\n <Check className=\"mx-auto h-4 w-4 text-primary\" />\n ) : (\n <Minus className=\"mx-auto h-4 w-4 text-muted-foreground/40\" />\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* Change-plan confirm */}\n <ConfirmDialog\n open={pending !== null}\n onConfirm={() => pending && void applyChange(pending)}\n onCancel={() => setPending(null)}\n title={tr('billing.changePlanConfirmTitle', 'Change plan?')}\n description={\n pending\n ? tr('billing.changePlanConfirmBody', \"You're switching to the {{plan}} plan.\").replace('{{plan}}', pending.name)\n : undefined\n }\n confirmLabel={tr('billing.changePlanConfirm', 'Switch plan')}\n cancelLabel={tr('common.cancel', 'Cancel')}\n loading={busy}\n />\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/timeline/registry.ts","../src/timeline/usePersonTimeline.ts","../src/timeline/TimelineList.tsx","../src/timeline/PersonTimeline.tsx"],"names":["sources","useState","jsx","jsxs","Card","CardContent"],"mappings":"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","file":"chunk-WXNTUCX3.js","sourcesContent":["import type { TimelineSource } from './types'\n\n/**\n * Quem contribui para a linha do tempo de uma pessoa.\n *\n * Registro de módulo, e não contexto de React: os plugins registram no momento\n * em que a fábrica deles roda (`createScribePlugin(...)` dentro do\n * `defineSaas`), que é antes de qualquer árvore montar. Um contexto obrigaria\n * cada app a lembrar de embrulhar a aba num provider — e \"funciona se você\n * lembrou\" é o oposto do que este registro existe para dar.\n */\nconst sources = new Map<string, TimelineSource>()\n\nexport function registerTimelineSource(source: TimelineSource): void {\n // Idempotente: em dev o módulo do plugin recarrega com o HMR, e uma segunda\n // fonte com o mesmo id duplicaria cada evento na tela.\n sources.set(source.id, source)\n}\n\nexport function unregisterTimelineSource(id: string): void {\n sources.delete(id)\n}\n\nexport function getTimelineSources(): TimelineSource[] {\n return Array.from(sources.values())\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { getActiveTenantId } from '@fayz-ai/core'\nimport { getTimelineSources } from './registry'\nimport type { TimelineItem, TimelineSource } from './types'\n\nconst DEFAULT_PAGE_SIZE = 20\n\nfunction newestFirst(a: TimelineItem, b: TimelineItem): number {\n return new Date(b.occurredAt).getTime() - new Date(a.occurredAt).getTime()\n}\n\nexport interface UsePersonTimelineResult {\n items: TimelineItem[]\n sources: TimelineSource[]\n loading: boolean\n loadingMore: boolean\n hasMore: boolean\n loadMore: () => void\n reload: () => void\n}\n\n/**\n * Intercala as fontes registradas numa lista só, em ordem.\n *\n * O ponto todo é a paginação. A versão ingênua pede N de cada fonte e corta o\n * resultado — e aí a fonte volumosa esconde a outra: com 30 agendamentos e um\n * pagamento de hoje, o pagamento não aparece, porque o corte veio depois de os\n * agendamentos já terem enchido a lista. Aqui cada página pergunta a TODAS as\n * fontes \"o que você tem antes deste instante\", junta, ordena e corta; a\n * próxima página repete a pergunta a partir da data do último item mostrado.\n * Assim nenhuma fonte esconde a outra, por mais desbalanceadas que sejam.\n */\nexport function usePersonTimeline({\n personId,\n pageSize = DEFAULT_PAGE_SIZE,\n activeSourceIds,\n}: {\n personId: string\n pageSize?: number\n /** Filtro por tipo. Ausente = todas. */\n activeSourceIds?: string[]\n}): UsePersonTimelineResult {\n const allSources = useMemo(() => getTimelineSources(), [])\n const sources = useMemo(\n () => (activeSourceIds ? allSources.filter((s) => activeSourceIds.includes(s.id)) : allSources),\n [allSources, activeSourceIds],\n )\n\n const [items, setItems] = useState<TimelineItem[]>([])\n const [loading, setLoading] = useState(true)\n const [loadingMore, setLoadingMore] = useState(false)\n const [hasMore, setHasMore] = useState(false)\n\n // Cortar por data faz o mesmo evento poder voltar na página seguinte (dois\n // eventos no mesmo instante, relógios diferentes). O id é o que decide.\n const seen = useRef<Set<string>>(new Set())\n // Muda a cada recarga: uma resposta de uma busca abandonada não pode\n // sobrescrever a lista da busca atual.\n const runId = useRef(0)\n\n const tenantId = getActiveTenantId() ?? ''\n\n const fetchPage = useCallback(\n async (before: string | undefined, run: number): Promise<{ page: TimelineItem[]; more: boolean }> => {\n // `limit + 1` para saber se ainda tem, sem uma segunda ida ao banco.\n const wanted = pageSize + 1\n const results = await Promise.all(\n sources.map((source) =>\n source\n .fetch({ personId, tenantId, before, limit: wanted })\n // Uma fonte que falha vira lista vazia: a linha do tempo inteira não\n // pode sumir porque um plugin quebrou.\n .catch((err) => {\n console.warn(`[timeline] source \"${source.id}\" failed`, err)\n return [] as TimelineItem[]\n }),\n ),\n )\n\n if (run !== runId.current) return { page: [], more: false }\n\n const merged = results\n .flat()\n .filter((item) => item.occurredAt && !seen.current.has(item.id))\n .sort(newestFirst)\n\n const page = merged.slice(0, pageSize)\n for (const item of page) seen.current.add(item.id)\n\n // Ainda tem se sobrou no bolo já lido, OU se alguma fonte devolveu o\n // limite cheio (sinal de que ela tem mais atrás).\n const more = merged.length > page.length || results.some((r) => r.length >= wanted)\n return { page, more }\n },\n [sources, personId, tenantId, pageSize],\n )\n\n const reload = useCallback(() => {\n const run = ++runId.current\n seen.current = new Set()\n setLoading(true)\n void fetchPage(undefined, run).then(({ page, more }) => {\n if (run !== runId.current) return\n setItems(page)\n setHasMore(more)\n setLoading(false)\n })\n }, [fetchPage])\n\n useEffect(() => {\n if (!personId || !tenantId || sources.length === 0) {\n setItems([])\n setHasMore(false)\n setLoading(false)\n return\n }\n reload()\n }, [personId, tenantId, sources, reload])\n\n const loadMore = useCallback(() => {\n const last = items[items.length - 1]\n if (!last || loadingMore) return\n const run = runId.current\n setLoadingMore(true)\n void fetchPage(last.occurredAt, run).then(({ page, more }) => {\n if (run !== runId.current) return\n setItems((prev) => [...prev, ...page])\n setHasMore(more && page.length > 0)\n setLoadingMore(false)\n })\n }, [items, loadingMore, fetchPage])\n\n return { items, sources: allSources, loading, loadingMore, hasMore, loadMore, reload }\n}\n","import React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ChevronRight } from 'lucide-react'\nimport { Badge, Card, CardContent } from '@fayz-ai/ui'\nimport type { TimelineItem, TimelineTone } from './types'\n\n// ---------------------------------------------------------------------------\n// O DESENHO da linha do tempo, sem de onde os itens vieram.\n//\n// Separado da `PersonTimeline` porque o desenho passou a ter DOIS consumidores:\n// a aba Atividade (que intercala sete fontes) e a aba Registros (que lista as\n// respostas de formulário da própria pessoa). Uma ficha clínica que mostrasse\n// duas listas com formas diferentes para a mesma pergunta — \"o que aconteceu,\n// em ordem\" — obrigaria a reaprender a leitura ao trocar de aba.\n//\n// Aqui não há consulta, paginação nem filtro: quem monta a lista é quem sabe de\n// onde ela vem.\n// ---------------------------------------------------------------------------\n\n// Tom → tokens do tema. Um lugar só: é isto que faz uma fonte nova herdar\n// claro/escuro e a paleta do app sem escrever uma cor.\nconst TONE_CLASSES: Record<TimelineTone, string> = {\n neutral: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n magic: 'bg-magic-soft text-magic-soft-foreground',\n primary: 'bg-primary/10 text-primary',\n rose: 'bg-destructive-soft text-destructive-soft-foreground',\n}\n\nfunction resolveIcon(name?: string): LucideIcon {\n const icons = LucideIcons as unknown as Record<string, LucideIcon | undefined>\n const icon = name ? icons[name] : undefined\n return (typeof icon === 'function' || typeof icon === 'object' ? icon : undefined) ?? LucideIcons.CircleDashed\n}\n\nfunction formatWhen(value: string): string {\n try {\n return new Intl.DateTimeFormat(undefined, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(value))\n } catch {\n return value\n }\n}\n\n/**\n * O trilho + a bolha, numa coluna fixa à esquerda. Mesma grade no esqueleto e\n * no item real, para a chegada do conteúdo ser troca de cinza por texto e não a\n * lista mudando de forma.\n *\n * Flex com largura fixa, e não `grid-cols-[…]`: uma utility arbitrária que só\n * existe neste arquivo não chega a ser gerada no CSS do app, e o sintoma não é\n * erro nenhum — é a linha do tempo empilhada, bolha centrada e cartão embaixo.\n * O trilho vira segmento de flex pela mesma razão: nada de posição absoluta\n * dependendo de uma coluna que pode não existir.\n */\nfunction Rail({ first, last, children }: { first: boolean; last: boolean; children: React.ReactNode }) {\n return (\n <div className=\"flex w-11 shrink-0 flex-col items-center\">\n {/* Invisível no primeiro: o espaço continua, para todas as bolhas\n começarem na mesma altura do cartão ao lado. */}\n <span className={`h-4 w-px ${first ? '' : 'bg-border'}`} aria-hidden />\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full border border-border bg-background shadow-sm\">\n {children}\n </div>\n {!last && <span className=\"w-px flex-1 bg-border\" aria-hidden />}\n </div>\n )\n}\n\nfunction TimelineSkeleton() {\n return (\n <ol className=\"space-y-0\" aria-hidden>\n {[0, 1, 2].map((row, index) => (\n <li key={row} className=\"flex gap-4\">\n <Rail first={index === 0} last={index === 2}>\n <div className=\"h-7 w-7 animate-pulse rounded-full bg-muted\" />\n </Rail>\n <Card className={`min-w-0 flex-1 ${index === 2 ? 'mb-0' : 'mb-4'}`}>\n <CardContent className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"h-5 w-20 animate-pulse rounded-full bg-muted\" />\n {/* Larguras diferentes por linha: três barras idênticas leem\n como padrão gráfico, não como texto carregando. */}\n <div className={`h-4 animate-pulse rounded bg-muted ${index === 1 ? 'w-1/2' : 'w-2/3'}`} />\n </div>\n <div className=\"h-3 w-24 shrink-0 animate-pulse rounded bg-muted\" />\n </div>\n </CardContent>\n </Card>\n </li>\n ))}\n </ol>\n )\n}\n\nfunction TimelineRow({\n item,\n tone,\n href,\n onSelect,\n actions,\n preview,\n first,\n last,\n}: {\n item: TimelineItem\n tone: TimelineTone\n href?: string\n onSelect?: (item: TimelineItem) => void\n actions?: React.ReactNode\n /** O conteúdo do registro, aberto DENTRO do cartão. Ver `renderPreview`. */\n preview?: React.ReactNode\n first: boolean\n last: boolean\n}) {\n const clickable = Boolean(href) || Boolean(onSelect)\n const Icon = resolveIcon(item.icon)\n const card = (\n <Card\n className={`group ${last ? 'mb-0' : 'mb-4'} ${\n // O cursor e a sombra só existem quando há para onde ir: é o que\n // distingue, ANTES do clique, o que é atalho do que é só registro.\n clickable ? 'cursor-pointer transition-shadow hover:shadow-md' : ''\n }`}\n {...(!href && onSelect ? { onClick: () => onSelect(item) } : {})}\n >\n <div className=\"flex items-stretch\">\n <CardContent className=\"min-w-0 flex-1 p-4\">\n <div className=\"flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n {item.badge && <Badge variant=\"secondary\">{item.badge}</Badge>}\n <h3 className={`truncate text-sm font-semibold text-foreground ${item.badge ? 'mt-2' : ''}`}>\n {item.title}\n </h3>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <time className=\"text-xs font-medium text-muted-foreground\">{formatWhen(item.occurredAt)}</time>\n {/* Os verbos da linha aparecem no hover, como no resto do SDK: uma\n fileira de ícones sempre visível transforma a lista num painel\n de botões e rouba a leitura do que aconteceu. */}\n {actions && (\n <div className=\"flex gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100\">\n {actions}\n </div>\n )}\n </div>\n </div>\n {item.description && (\n <p className=\"mt-2 whitespace-pre-wrap text-sm leading-6 text-muted-foreground\">{item.description}</p>\n )}\n {/* O conteúdo, aberto no lugar. Separado por uma régua porque sem ela\n o corpo do formulário encosta no título e os dois viram um bloco\n só de texto. */}\n {preview && (\n <div\n className=\"mt-3 border-t border-border pt-3\"\n // O cartão inteiro é clicável; o conteúdo dentro dele não pode\n // abrir a tela cheia ao encostar numa palavra — nem impedir que se\n // selecione um trecho para copiar.\n onClick={(e) => e.stopPropagation()}\n >\n {preview}\n </div>\n )}\n </CardContent>\n\n {/* A SETA que promete o clique.\n Estava em cima, na fileira de ações, como mais um ícone entre outros —\n e um botão \"abrir\" ao lado de um \"ocultar\" faz o leitor escolher entre\n dois verbos quando o gesto natural é clicar no cartão. À direita e no\n meio da altura, ela diz o que o cartão inteiro faz, em vez de\n concorrer com ele. O espaço fica reservado sempre: aparecer no hover\n empurrando o texto seria pior do que não aparecer. */}\n {clickable && (\n <div className=\"flex shrink-0 items-center pr-4 opacity-0 transition-opacity group-hover:opacity-100\">\n <ChevronRight className=\"h-6 w-6 text-muted-foreground\" aria-hidden />\n </div>\n )}\n </div>\n </Card>\n )\n\n return (\n <li className=\"flex gap-4\">\n <Rail first={first} last={last}>\n <div className={`flex h-7 w-7 items-center justify-center rounded-full ${TONE_CLASSES[tone]}`}>\n <Icon className=\"h-4 w-4\" />\n </div>\n </Rail>\n <div className=\"min-w-0 flex-1\">\n {/* `<a>` de verdade, e não um onClick: o clique do meio abre em outra\n aba, o hover mostra o destino na barra de status, e o teclado alcança\n sem nada além do HTML. */}\n {href ? <a href={href} className=\"block no-underline\">{card}</a> : card}\n </div>\n </li>\n )\n}\n\n\n/**\n * A lista: trilho, bolha e cartão, do jeito que a ficha inteira mostra\n * histórico.\n *\n * `renderActions` é a única costura que a aba Registros precisou: ver e\n * arquivar um documento são verbos DAQUELA aba, e a Atividade — que é leitura —\n * não tem nenhum.\n */\nexport function TimelineList({\n items,\n toneFor,\n hrefFor,\n onSelect,\n renderActions,\n renderPreview,\n expandedIds,\n}: {\n items: TimelineItem[]\n /** Tom da bolha quando o item não declara o seu. */\n toneFor?: (item: TimelineItem) => TimelineTone\n hrefFor?: (item: TimelineItem) => string | undefined\n /** Clique no cartão quando ele não é um link — o caso da aba Registros, que\n * abre o documento na própria aba em vez de navegar. */\n onSelect?: (item: TimelineItem) => void\n renderActions?: (item: TimelineItem) => React.ReactNode\n /**\n * O conteúdo do item, aberto dentro do cartão — para ler sem clicar.\n *\n * Só é chamado para o que `expandedIds` mandar abrir: montar o corpo de cem\n * formulários para esconder noventa e nove custa a rolagem inteira.\n */\n renderPreview?: (item: TimelineItem) => React.ReactNode\n /** Quais itens estão abertos. Ausente = nenhum. */\n expandedIds?: ReadonlySet<string>\n}) {\n return (\n <ol className=\"space-y-0\">\n {items.map((item, index) => (\n <TimelineRow\n key={item.id}\n item={item}\n // Item ganha do padrão: um evento que foge da regra da fonte dele\n // (uma exclusão dentro de \"Cadastro\") pode dizer o seu.\n tone={item.tone ?? toneFor?.(item) ?? 'neutral'}\n href={hrefFor?.(item)}\n onSelect={onSelect}\n actions={renderActions?.(item)}\n preview={expandedIds?.has(item.id) ? renderPreview?.(item) : undefined}\n first={index === 0}\n last={index === items.length - 1}\n />\n ))}\n </ol>\n )\n}\n\nexport { TimelineSkeleton }\n","import React, { useState } from 'react'\nimport { Button, Card, CardContent } from '@fayz-ai/ui'\nimport { usePersonTimeline } from './usePersonTimeline'\nimport { TimelineList, TimelineSkeleton } from './TimelineList'\nimport type { TimelineItem } from './types'\n\n/**\n * A linha do tempo de uma pessoa, montada a partir das fontes registradas.\n *\n * Genérico de propósito, em `packages/admin` e não no app: \"o que aconteceu com\n * esta pessoa\" não é específico de salão — a mesma tela serve aluno, paciente e\n * cliente. O app só monta.\n */\nexport function PersonTimeline({\n personId,\n pageSize,\n recordPath,\n}: {\n personId: string\n pageSize?: number\n /**\n * A rota da ficha desta pessoa (`/clients/8e48…`), que é o app quem sabe.\n *\n * Com ela, cada item vira atalho para a aba onde o evento mora — clicar num\n * pagamento abre o Extrato, clicar numa gravação abre Gravações. Sem ela a\n * linha do tempo funciona igual, só não navega: é degradação, não erro.\n */\n recordPath?: string\n}) {\n const [activeSourceIds, setActiveSourceIds] = useState<string[] | undefined>(undefined)\n const { items, sources, loading, loadingMore, hasMore, loadMore } = usePersonTimeline({\n personId,\n pageSize,\n activeSourceIds,\n })\n\n const toneBySource = React.useMemo(\n () => new Map(sources.map((s) => [s.id, s.tone ?? 'neutral'] as const)),\n [sources],\n )\n\n const hrefFor = React.useCallback(\n (item: TimelineItem): string | undefined => {\n if (item.href) return item.href\n if (!recordPath || !item.targetTab) return undefined\n // Mesma forma de rota que o CrudDetailPage usa ao trocar de aba, para o\n // link cair exatamente onde a aba clicada à mão cairia.\n return `#${recordPath}/${item.targetTab}`\n },\n [recordPath],\n )\n\n // Com seis fontes numa base antiga, a lista única fica ilegível. As pastilhas\n // são de seleção ÚNICA (Tudo, ou um tipo): multi-seleção pareceria mais\n // poderosa e na prática vira um estado que ninguém consegue ler de relance.\n const filters = sources.length > 1 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {[{ id: undefined, label: 'Tudo' }, ...sources.map((s) => ({ id: s.id as string | undefined, label: s.label }))].map(\n (chip) => {\n const active = chip.id\n ? activeSourceIds?.length === 1 && activeSourceIds[0] === chip.id\n : !activeSourceIds\n return (\n <button\n key={chip.id ?? '__all__'}\n type=\"button\"\n onClick={() => setActiveSourceIds(chip.id ? [chip.id] : undefined)}\n className={`rounded-full border px-2.5 py-1 text-xs transition-colors ${\n active\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {chip.label}\n </button>\n )\n },\n )}\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {filters}\n\n {loading ? (\n <TimelineSkeleton />\n ) : items.length === 0 ? (\n <Card>\n <CardContent className=\"flex min-h-40 items-center justify-center p-6 text-sm text-muted-foreground\">\n {activeSourceIds\n ? 'Nada deste tipo no histórico desta pessoa.'\n : 'Ainda não há histórico para esta pessoa.'}\n </CardContent>\n </Card>\n ) : (\n <>\n <TimelineList\n items={items}\n // Item ganha da fonte: um evento que foge da regra dela (uma\n // exclusão dentro de \"Cadastro\") pode dizer o seu — o próprio\n // TimelineList resolve essa precedência.\n toneFor={(item) => toneBySource.get(item.sourceId) ?? 'neutral'}\n hrefFor={hrefFor}\n />\n {hasMore && (\n <div className=\"flex justify-center\">\n <Button variant=\"outline\" size=\"sm\" disabled={loadingMore} onClick={loadMore}>\n {loadingMore ? 'Carregando…' : 'Carregar mais'}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n"]}
@@ -1,7 +0,0 @@
1
- export { LoginForm } from './LoginForm';
2
- export { SignupForm } from './SignupForm';
3
- export { RecoveryForm } from './RecoveryForm';
4
- export { OAuthButtons } from './OAuthButtons';
5
- export { ProtectedRoute } from './ProtectedRoute';
6
- export { LoginPage } from './LoginPage';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA"}
@@ -1,6 +0,0 @@
1
- export { BottomNav } from './BottomNav';
2
- export { CommandPalette } from './CommandPalette';
3
- export { LocationSwitchOverlay } from './LocationSwitchOverlay';
4
- export { MockModeBanner } from './MockModeBanner';
5
- export { PrintHeader, PrintFooter } from './PrintChrome';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
@@ -1,5 +0,0 @@
1
- export { NotificationBell } from './NotificationBell';
2
- export { NotificationInbox } from './NotificationInbox';
3
- export { ChangelogFeed } from './ChangelogFeed';
4
- export { ToastProvider, toast } from './ToastProvider';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/notifications/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA"}
@@ -1,5 +0,0 @@
1
- export { PermissionMatrixEditor } from './PermissionMatrixEditor';
2
- export { PermissionProfilesTab } from './PermissionProfilesTab';
3
- export { TeamTab } from './TeamTab';
4
- export { InviteMemberDialog } from './InviteMemberDialog';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/organization/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1,11 +0,0 @@
1
- export { SettingsPage } from './SettingsPage';
2
- export { CompanySettings } from './CompanySettings';
3
- export { UserProfile } from './UserProfile';
4
- export { SecuritySettings } from './SecuritySettings';
5
- export { BrandingSettings } from './BrandingSettings';
6
- export { LocationsOverview } from './LocationsOverview';
7
- export { HolidaysSettings } from './HolidaysSettings';
8
- export type { Holiday } from './HolidaysSettings';
9
- export { FieldRulesSettings } from './FieldRulesSettings';
10
- export { ConnectedFieldRulesSettings } from './ConnectedFieldRulesSettings';
11
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAA"}
@@ -1,18 +0,0 @@
1
- export { createCrudPage } from './createCrudPage';
2
- export { CrudPage } from './CrudPage';
3
- export { CrudListView } from './CrudListView';
4
- export type { CrudListViewProps, CrudFacet, CrudNavTab, CrudBulkAction } from './CrudListView';
5
- export { CrudFormPage } from './CrudFormPage';
6
- export { CrudDetailPage } from './CrudDetailPage';
7
- export { CrudCardGrid } from './CrudCardGrid';
8
- export { DeleteConfirmDialog } from './DeleteConfirmDialog';
9
- export { ImportWizard } from './ImportWizard';
10
- export type { ImportRowError } from './ImportWizard';
11
- export { exportToCSV } from './csv-export';
12
- export { RelationSelect, RelationCell, useRelationOptions, loadRelationOptions, invalidateRelationOptions } from './relation-field';
13
- export { EntityLink, registerEntityPath, getPersonPath } from './archetypes/EntityLink';
14
- export { CrudDetailSkeleton, CrudFormSkeleton } from './CrudSkeletons';
15
- export type { CrudSkeletonProps, CrudFormSkeletonProps } from './CrudSkeletons';
16
- export { duplicateWrite, humanizeWriteError } from './write-errors';
17
- export type { DuplicateWrite } from './write-errors';
18
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crud/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAMnI,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACtE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
@@ -1,20 +0,0 @@
1
- export { useAuth } from './useAuth';
2
- export { useTenant } from './useTenant';
3
- export { useSystemPermission } from './useSystemPermission';
4
- export { useLayout } from './useLayout';
5
- export { useNotifications } from './useNotifications';
6
- export { useTranslation } from './useTranslation';
7
- export { useFormatters } from './useFormatters';
8
- export { useChat } from './useChat';
9
- export { useAITools } from './useAITools';
10
- export type { ResolvedSuggestion, ResolvedToolGroup, ResolvedToolEntry } from './useAITools';
11
- export { usePlugins, usePluginsOptional, useWidgets } from './usePlugins';
12
- export { useTenantPlugins } from './useTenantPlugins';
13
- export { useModuleNavigation } from './useModuleNavigation';
14
- export type { NavDirection, DepthMap } from './useModuleNavigation';
15
- export { usePluginPrefs, getPluginPref, setPluginPref } from './usePluginPrefs';
16
- export type { PluginPrefs } from './usePluginPrefs';
17
- export { useTenantPluginSettings } from './useTenantPluginSettings';
18
- export type { TenantPluginSettings } from './useTenantPluginSettings';
19
- export { useFieldRules } from './useFieldRules';
20
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC/E,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
@@ -1,7 +0,0 @@
1
- export declare function setDefaultCurrency(code: string | undefined): void;
2
- export declare function getActiveLocale(): string;
3
- export declare function getDefaultCurrency(): string;
4
- export declare function formatCurrency(value: unknown, currency?: string): string;
5
- export declare function formatDate(value: unknown): string;
6
- export declare function formatDateTime(value: unknown): string;
7
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAgBA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEjE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOrD"}
@@ -1,2 +0,0 @@
1
- export { resolvePluginRuntime, getWidgetsForZone, usePluginRuntime, usePluginRuntimeOptional, PluginRuntimeProvider, definePlugin, resolvePluginComponent, } from '@fayz-ai/core';
2
- //# sourceMappingURL=plugins.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/lib/plugins.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,EACZ,sBAAsB,GACvB,MAAM,eAAe,CAAA"}
@@ -1,2 +0,0 @@
1
- export { useBillingStore } from '../billing';
2
- //# sourceMappingURL=billing.store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"billing.store.d.ts","sourceRoot":"","sources":["../../src/stores/billing.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
@@ -1,13 +0,0 @@
1
- export { useAuthStore } from './auth.store';
2
- export { useTenantStore } from './tenant.store';
3
- export { usePluginStore } from './plugin.store';
4
- export { useLayoutStore } from './layout.store';
5
- export { useThemeStore } from './theme.store';
6
- export { useBillingStore } from './billing.store';
7
- export { useNotificationStore } from './notifications.store';
8
- export { useLocaleStore } from './locale.store';
9
- export { useChatStore } from './chat.store';
10
- export { useOrganizationStore } from './organization.store';
11
- export { usePermissionsStore } from './permissions.store';
12
- export { useInviteStore } from './invite.store';
13
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
@@ -1,2 +0,0 @@
1
- export { useLayoutStore } from '@fayz-ai/ui';
2
- //# sourceMappingURL=layout.store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"layout.store.d.ts","sourceRoot":"","sources":["../../src/stores/layout.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -1,2 +0,0 @@
1
- export { usePermissionsStore } from '../permissions';
2
- //# sourceMappingURL=permissions.store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permissions.store.d.ts","sourceRoot":"","sources":["../../src/stores/permissions.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- import type { Task } from '../types';
3
- export declare function TaskCard({ task, subtaskCount, showSource, }: {
4
- task: Task;
5
- subtaskCount?: {
6
- done: number;
7
- total: number;
8
- };
9
- showSource?: boolean;
10
- }): React.JSX.Element;
11
- //# sourceMappingURL=TaskCard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskCard.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AA6BpC,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,YAAY,EAGZ,UAAiB,GAClB,EAAE;IACD,IAAI,EAAE,IAAI,CAAA;IACV,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,qBA0FA"}
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- export declare function TaskDetail({ taskId }: {
3
- taskId: string;
4
- }): React.JSX.Element;
5
- //# sourceMappingURL=TaskDetail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskDetail.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AA6B/D,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,qBAyNxD"}
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- export declare function TaskLabelBadge({ labelId }: {
3
- labelId: string;
4
- }): React.JSX.Element | null;
5
- export declare function TaskLabelBadges({ labelIds, max }: {
6
- labelIds: string[];
7
- max?: number;
8
- }): React.JSX.Element | null;
9
- //# sourceMappingURL=TaskLabelBadge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskLabelBadge.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskLabelBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,4BAe9D;AAED,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,4BAiB1F"}
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import type { TaskPriority } from '../types';
3
- export declare function TaskPriorityBadge({ priority, showLabel }: {
4
- priority: TaskPriority;
5
- showLabel?: boolean;
6
- }): React.JSX.Element;
7
- //# sourceMappingURL=TaskPriorityBadge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskPriorityBadge.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskPriorityBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAS5C,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,qBASzG"}
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- export declare function TaskQuickAdd({ parentId }: {
3
- parentId?: string | null;
4
- }): React.JSX.Element;
5
- //# sourceMappingURL=TaskQuickAdd.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskQuickAdd.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskQuickAdd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAKpD,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,qBAmCtE"}
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- export declare function TaskSourceBadge({ source }: {
3
- source: string | null;
4
- }): React.JSX.Element | null;
5
- //# sourceMappingURL=TaskSourceBadge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskSourceBadge.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskSourceBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAiBzB,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,4BAmBpE"}
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
- import type { Task, TaskStatus } from '../types';
3
- /** One collapsible section of the list. `dotClass`/`title` let the getting-started
4
- * group reuse the exact shape without being a status. */
5
- export declare function TaskGroup({ title, dotClass, tasks, defaultCollapsed, showSource, }: {
6
- title: string;
7
- dotClass: string;
8
- tasks: Task[];
9
- defaultCollapsed?: boolean;
10
- /** Off when the header already names what the tag would say. */
11
- showSource?: boolean;
12
- }): React.JSX.Element | null;
13
- export declare function TaskStatusGroup({ status, tasks }: {
14
- status: TaskStatus;
15
- tasks: Task[];
16
- }): React.JSX.Element;
17
- //# sourceMappingURL=TaskStatusGroup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskStatusGroup.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TaskStatusGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAIvC,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAShD;0DAC0D;AAC1D,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,gBAAwB,EACxB,UAAiB,GAClB,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,4BA8BA;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,qBAUvF"}
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- export declare function TasksFilterBar(): React.JSX.Element;
3
- //# sourceMappingURL=TasksFilterBar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TasksFilterBar.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TasksFilterBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAiBzB,wBAAgB,cAAc,sBA4D7B"}
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
- import { type Task } from '../types';
3
- /** The setup checklist reads as one thing, not as five tasks scattered through
4
- * the board — so it is lifted out before the status grouping runs. */
5
- export declare function splitOnboardingTasks(tasks: Task[]): {
6
- onboarding: Task[];
7
- rest: Task[];
8
- };
9
- /** The task list with no box around it — shared by the sheet and the shell's
10
- * right-rail tab. */
11
- export declare function TasksPanel(): React.JSX.Element;
12
- /** One-line summary of what needs attention ("3 atrasadas · 2 para hoje"). */
13
- export declare function useTasksSummaryLine(): string;
14
- //# sourceMappingURL=TasksPanel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TasksPanel.d.ts","sourceRoot":"","sources":["../../../src/tasks/components/TasksPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,OAAO,EAA0B,KAAK,IAAI,EAAmB,MAAM,UAAU,CAAA;AAI7E;uEACuE;AACvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAQxF;AAED;sBACsB;AACtB,wBAAgB,UAAU,sBAqEzB;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C"}
@@ -1,3 +0,0 @@
1
- import type { TasksDataProvider } from '../types';
2
- export declare function createMockTasksProvider(): TasksDataProvider;
3
- //# sourceMappingURL=mock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/tasks/data/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEC,iBAAiB,EAC7B,MAAM,UAAU,CAAA;AA+DjB,wBAAgB,uBAAuB,IAAI,iBAAiB,CAqF3D"}
@@ -1,3 +0,0 @@
1
- import type { TasksDataProvider } from '../types';
2
- export declare function createSupabaseTasksProvider(): TasksDataProvider;
3
- //# sourceMappingURL=supabase.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../src/tasks/data/supabase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAiClE,wBAAgB,2BAA2B,IAAI,iBAAiB,CAkL/D"}
@@ -1,11 +0,0 @@
1
- import type { EntityDef } from '@fayz-ai/core';
2
- /**
3
- * public.tasks — @fayz-ai/db spine migration 047_tasks.
4
- *
5
- * Declared as an EntityDef so the agent can read and close tasks in every app,
6
- * even though the surface is a rail tab rather than a CRUD page. Unit narrowing
7
- * is not declared here on purpose: resolveDataProvider turns it on from the
8
- * `scoped_resources` registry the shell loads at boot.
9
- */
10
- export declare const taskEntityDef: EntityDef;
11
- //# sourceMappingURL=entity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/tasks/entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,SA2C3B,CAAA"}