@fayz-ai/admin 0.62.0 → 0.63.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 (169) hide show
  1. package/dist/{CommandPalette-B5PMQFDG.js → CommandPalette-XDJJ5E3O.js} +3 -3
  2. package/dist/{CommandPalette-B5PMQFDG.js.map → CommandPalette-XDJJ5E3O.js.map} +1 -1
  3. package/dist/ConnectedBrandingSettings-43ZM3HCI.js +680 -0
  4. package/dist/ConnectedBrandingSettings-43ZM3HCI.js.map +1 -0
  5. package/dist/ConnectedCompanySettings-I4MALI2Q.js +197 -0
  6. package/dist/ConnectedCompanySettings-I4MALI2Q.js.map +1 -0
  7. package/dist/ConnectedModulesSettings-A2VJ5BMJ.js +563 -0
  8. package/dist/ConnectedModulesSettings-A2VJ5BMJ.js.map +1 -0
  9. package/dist/ConnectedSecuritySettings-25AHA4HJ.js +189 -0
  10. package/dist/ConnectedSecuritySettings-25AHA4HJ.js.map +1 -0
  11. package/dist/ConnectedUserProfile-E7USJRUE.js +424 -0
  12. package/dist/ConnectedUserProfile-E7USJRUE.js.map +1 -0
  13. package/dist/FieldRulesEditor-YGIPKI5T.js +129 -0
  14. package/dist/FieldRulesEditor-YGIPKI5T.js.map +1 -0
  15. package/dist/GettingStartedWidget-HMIJ3Y24.js +12 -0
  16. package/dist/GettingStartedWidget-HMIJ3Y24.js.map +1 -0
  17. package/dist/PermissionProfilesTab-3ZPRCHMZ.js +548 -0
  18. package/dist/PermissionProfilesTab-3ZPRCHMZ.js.map +1 -0
  19. package/dist/PersonTimeline-HQZT527S.js +3 -0
  20. package/dist/{PersonTimeline-X7JTPUWJ.js.map → PersonTimeline-HQZT527S.js.map} +1 -1
  21. package/dist/ProjectsSettings-7O2F27MD.js +5 -0
  22. package/dist/ProjectsSettings-7O2F27MD.js.map +1 -0
  23. package/dist/ScheduleEditor-54ELWR45.js +8 -0
  24. package/dist/{ScheduleEditor-L2UJXKMY.js.map → ScheduleEditor-54ELWR45.js.map} +1 -1
  25. package/dist/SeuSiteWidget-QLSUVC63.js +6 -0
  26. package/dist/SeuSiteWidget-QLSUVC63.js.map +1 -0
  27. package/dist/SubscriptionPage-5GE5HFJK.js +17 -0
  28. package/dist/{SubscriptionPage-IDVEFLZ5.js.map → SubscriptionPage-5GE5HFJK.js.map} +1 -1
  29. package/dist/TeamTab-6RAULFLW.js +502 -0
  30. package/dist/TeamTab-6RAULFLW.js.map +1 -0
  31. package/dist/TrialWidget-Z6CLUCU3.js +7 -0
  32. package/dist/TrialWidget-Z6CLUCU3.js.map +1 -0
  33. package/dist/app/AdminShell.d.ts.map +1 -1
  34. package/dist/app/admin-app.d.ts.map +1 -1
  35. package/dist/app/config.d.ts +14 -0
  36. package/dist/app/config.d.ts.map +1 -1
  37. package/dist/app/routing.d.ts +6 -0
  38. package/dist/app/routing.d.ts.map +1 -1
  39. package/dist/app/scaffold.d.ts.map +1 -1
  40. package/dist/billing/index.js +9 -4
  41. package/dist/chunk-2H46WDG5.js +53 -0
  42. package/dist/chunk-2H46WDG5.js.map +1 -0
  43. package/dist/chunk-3HLX7YB2.js +94 -0
  44. package/dist/chunk-3HLX7YB2.js.map +1 -0
  45. package/dist/chunk-3OUD4XBK.js +3 -0
  46. package/dist/chunk-3OUD4XBK.js.map +1 -0
  47. package/dist/{chunk-IXSY4GPK.js → chunk-5D5QLMOQ.js} +5 -3
  48. package/dist/chunk-5D5QLMOQ.js.map +1 -0
  49. package/dist/chunk-5WR62X2R.js +1081 -0
  50. package/dist/chunk-5WR62X2R.js.map +1 -0
  51. package/dist/{chunk-KPYRTOCK.js → chunk-6CQFGMEO.js} +4 -140
  52. package/dist/chunk-6CQFGMEO.js.map +1 -0
  53. package/dist/chunk-6MMSYC2I.js +116 -0
  54. package/dist/chunk-6MMSYC2I.js.map +1 -0
  55. package/dist/chunk-6QFOE3UD.js +1466 -0
  56. package/dist/chunk-6QFOE3UD.js.map +1 -0
  57. package/dist/chunk-6UUFVQ2E.js +283 -0
  58. package/dist/chunk-6UUFVQ2E.js.map +1 -0
  59. package/dist/chunk-7WNLL3F6.js +7889 -0
  60. package/dist/chunk-7WNLL3F6.js.map +1 -0
  61. package/dist/chunk-A74IHAQE.js +439 -0
  62. package/dist/chunk-A74IHAQE.js.map +1 -0
  63. package/dist/{chunk-JOBRLBIQ.js → chunk-AFA6IO23.js} +4 -3
  64. package/dist/chunk-AFA6IO23.js.map +1 -0
  65. package/dist/{chunk-P5UIGQFY.js → chunk-ALCSIN3Z.js} +5 -5
  66. package/dist/chunk-ALCSIN3Z.js.map +1 -0
  67. package/dist/chunk-AWM4AMBS.js +39 -0
  68. package/dist/chunk-AWM4AMBS.js.map +1 -0
  69. package/dist/{chunk-OQARLKZN.js → chunk-BG5Z6KLN.js} +6 -18
  70. package/dist/chunk-BG5Z6KLN.js.map +1 -0
  71. package/dist/chunk-DPNFZONC.js +19 -0
  72. package/dist/chunk-DPNFZONC.js.map +1 -0
  73. package/dist/chunk-DRCV643L.js +193 -0
  74. package/dist/chunk-DRCV643L.js.map +1 -0
  75. package/dist/chunk-E6DF3VR6.js +206 -0
  76. package/dist/chunk-E6DF3VR6.js.map +1 -0
  77. package/dist/chunk-ENHCVGXZ.js +120 -0
  78. package/dist/chunk-ENHCVGXZ.js.map +1 -0
  79. package/dist/chunk-FK6RHGI7.js +56 -0
  80. package/dist/chunk-FK6RHGI7.js.map +1 -0
  81. package/dist/chunk-G5HNA5QK.js +233 -0
  82. package/dist/chunk-G5HNA5QK.js.map +1 -0
  83. package/dist/chunk-HCFO4Z6A.js +53 -0
  84. package/dist/chunk-HCFO4Z6A.js.map +1 -0
  85. package/dist/chunk-JFIU6NQP.js +51 -0
  86. package/dist/chunk-JFIU6NQP.js.map +1 -0
  87. package/dist/chunk-JRZJBMOY.js +3 -0
  88. package/dist/chunk-JRZJBMOY.js.map +1 -0
  89. package/dist/{chunk-3YP7KW47.js → chunk-JVVOL4BB.js} +41 -512
  90. package/dist/chunk-JVVOL4BB.js.map +1 -0
  91. package/dist/chunk-KAQ3UIAA.js +415 -0
  92. package/dist/chunk-KAQ3UIAA.js.map +1 -0
  93. package/dist/{chunk-P6XUDT2P.js → chunk-KJELMULA.js} +4 -51
  94. package/dist/chunk-KJELMULA.js.map +1 -0
  95. package/dist/chunk-KLO7DKXX.js +1651 -0
  96. package/dist/chunk-KLO7DKXX.js.map +1 -0
  97. package/dist/chunk-M2CMDWUI.js +75 -0
  98. package/dist/chunk-M2CMDWUI.js.map +1 -0
  99. package/dist/chunk-PQ47MLTH.js +255 -0
  100. package/dist/chunk-PQ47MLTH.js.map +1 -0
  101. package/dist/{chunk-VX3WJLKK.js → chunk-QD7BMUDF.js} +17 -8
  102. package/dist/chunk-QD7BMUDF.js.map +1 -0
  103. package/dist/{chunk-E4MESMNR.js → chunk-QTSKCPSW.js} +7 -10
  104. package/dist/chunk-QTSKCPSW.js.map +1 -0
  105. package/dist/chunk-S56FQKPL.js +186 -0
  106. package/dist/chunk-S56FQKPL.js.map +1 -0
  107. package/dist/chunk-SGAFPNMA.js +75 -0
  108. package/dist/chunk-SGAFPNMA.js.map +1 -0
  109. package/dist/{chunk-OD7P4L3D.js → chunk-SOKCLVM4.js} +3 -3
  110. package/dist/{chunk-OD7P4L3D.js.map → chunk-SOKCLVM4.js.map} +1 -1
  111. package/dist/chunk-TL42NKTH.js +3 -0
  112. package/dist/chunk-TL42NKTH.js.map +1 -0
  113. package/dist/chunk-U6ZCO2PS.js +2964 -0
  114. package/dist/chunk-U6ZCO2PS.js.map +1 -0
  115. package/dist/chunk-VSXNROYH.js +16 -0
  116. package/dist/chunk-VSXNROYH.js.map +1 -0
  117. package/dist/chunk-WPFZCYZL.js +619 -0
  118. package/dist/chunk-WPFZCYZL.js.map +1 -0
  119. package/dist/chunk-XFTNIBDW.js +23 -0
  120. package/dist/chunk-XFTNIBDW.js.map +1 -0
  121. package/dist/chunk-Y66JDL6I.js +1020 -0
  122. package/dist/chunk-Y66JDL6I.js.map +1 -0
  123. package/dist/chunk-YEHIBPIX.js +137 -0
  124. package/dist/chunk-YEHIBPIX.js.map +1 -0
  125. package/dist/chunk-YKPPCV2Z.js +53 -0
  126. package/dist/chunk-YKPPCV2Z.js.map +1 -0
  127. package/dist/components/chat/markdown.d.ts.map +1 -1
  128. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  129. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  130. package/dist/connect-XKQJOWR7.js +18 -0
  131. package/dist/connect-XKQJOWR7.js.map +1 -0
  132. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  133. package/dist/crud/CrudListView.d.ts.map +1 -1
  134. package/dist/crud/CrudPage.d.ts.map +1 -1
  135. package/dist/crud/RelatedListTab.d.ts.map +1 -1
  136. package/dist/crud/archetypes/EntityLink.d.ts +1 -1
  137. package/dist/crud/archetypes/EntityLink.d.ts.map +1 -1
  138. package/dist/crud/record-chrome.d.ts.map +1 -1
  139. package/dist/entity-routes-PGU7EHAD.js +4 -0
  140. package/dist/{entity-routes-LXOBW5IB.js.map → entity-routes-PGU7EHAD.js.map} +1 -1
  141. package/dist/hooks/useModuleNavigation.d.ts.map +1 -1
  142. package/dist/impersonation/ImpersonateDialog.d.ts.map +1 -1
  143. package/dist/impersonation/session.d.ts.map +1 -1
  144. package/dist/index.d.ts +1 -1
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +11902 -33551
  147. package/dist/index.js.map +1 -1
  148. package/dist/lib/entity-routes.d.ts.map +1 -1
  149. package/dist/org/index.js +4 -2
  150. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
  151. package/dist/settings/MessageTemplateRow.d.ts.map +1 -1
  152. package/dist/timeline/PersonTimeline.d.ts.map +1 -1
  153. package/dist/timeline/TimelineList.d.ts.map +1 -1
  154. package/dist/units/UnitRailPage.d.ts.map +1 -1
  155. package/dist/units/useUnitFilter.d.ts.map +1 -1
  156. package/package.json +5 -5
  157. package/dist/PersonTimeline-X7JTPUWJ.js +0 -3
  158. package/dist/ScheduleEditor-L2UJXKMY.js +0 -6
  159. package/dist/SubscriptionPage-IDVEFLZ5.js +0 -8
  160. package/dist/chunk-3YP7KW47.js.map +0 -1
  161. package/dist/chunk-E4MESMNR.js.map +0 -1
  162. package/dist/chunk-IXSY4GPK.js.map +0 -1
  163. package/dist/chunk-JOBRLBIQ.js.map +0 -1
  164. package/dist/chunk-KPYRTOCK.js.map +0 -1
  165. package/dist/chunk-OQARLKZN.js.map +0 -1
  166. package/dist/chunk-P5UIGQFY.js.map +0 -1
  167. package/dist/chunk-P6XUDT2P.js.map +0 -1
  168. package/dist/chunk-VX3WJLKK.js.map +0 -1
  169. package/dist/entity-routes-LXOBW5IB.js +0 -4
@@ -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":";;;;;;;;;;AAWA,IAAM,OAAA,uBAAc,GAAA,EAA4B;AAEzC,SAAS,uBAAuB,MAAA,EAA8B;AAGnE,EAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAC/B;AAEO,SAAS,yBAAyB,EAAA,EAAkB;AACzD,EAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnB;AAEO,SAAS,kBAAA,GAAuC;AACrD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACpC;;;ACpBA,IAAM,iBAAA,GAAoB,EAAA;AAE1B,SAAS,WAAA,CAAY,GAAiB,CAAA,EAAyB;AAC7D,EAAA,OAAO,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,EAAQ;AAC3E;AAuBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,QAAA,GAAW,iBAAA;AAAA,EACX;AACF,CAAA,EAK4B;AAC1B,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAM,kBAAA,EAAmB,EAAG,EAAE,CAAA;AACzD,EAAA,MAAMA,QAAAA,GAAU,OAAA;AAAA,IACd,MAAO,eAAA,GAAkB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,eAAA,CAAgB,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,GAAI,UAAA;AAAA,IACpF,CAAC,YAAY,eAAe;AAAA,GAC9B;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAyB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAI5C,EAAA,MAAM,IAAA,GAAO,MAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AAG1C,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,mBAAkB,IAAK,EAAA;AAExC,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,OAAO,QAA4B,GAAA,KAAkE;AAEnG,MAAA,MAAM,SAAS,QAAA,GAAW,CAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5BA,QAAAA,CAAQ,GAAA;AAAA,UAAI,CAAC,MAAA,KACX,MAAA,CACG,KAAA,CAAM,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,CAAA,CAGnD,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,EAAE,YAAY,GAAG,CAAA;AAC3D,YAAA,OAAO,EAAC;AAAA,UACV,CAAC;AAAA;AACL,OACF;AAEA,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,EAAC,EAAG,IAAA,EAAM,KAAA,EAAM;AAE1D,MAAA,MAAM,SAAS,OAAA,CACZ,IAAA,GACA,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA,CAC9D,KAAK,WAAW,CAAA;AAEnB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACrC,MAAA,KAAA,MAAW,QAAQ,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAIjD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,MAAM,CAAA;AAClF,MAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AAAA,IACtB,CAAA;AAAA,IACA,CAACA,QAAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAQ;AAAA,GACxC;AAEA,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,MAAM,GAAA,GAAM,EAAE,KAAA,CAAM,OAAA;AACpB,IAAA,IAAA,CAAK,OAAA,uBAAc,GAAA,EAAI;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,KAAK,SAAA,CAAU,QAAW,GAAG,CAAA,CAAE,KAAK,CAAC,EAAE,IAAA,EAAM,IAAA,EAAK,KAAM;AACtD,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAA,EAAS;AAC3B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,IAAYA,QAAAA,CAAQ,WAAW,CAAA,EAAG;AAClD,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAA,EAAO;AAAA,EACT,GAAG,CAAC,QAAA,EAAU,QAAA,EAAUA,QAAAA,EAAS,MAAM,CAAC,CAAA;AAExC,EAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AAC1B,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA;AAClB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,KAAK,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,GAAG,CAAA,CAAE,KAAK,CAAC,EAAE,IAAA,EAAM,IAAA,EAAK,KAAM;AAC5D,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAA,EAAS;AAC3B,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,IAAI,CAAC,CAAA;AACrC,MAAA,UAAA,CAAW,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAClC,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,SAAS,CAAC,CAAA;AAElC,EAAA,OAAO,EAAE,OAAO,OAAA,EAAS,UAAA,EAAY,SAAS,WAAA,EAAa,OAAA,EAAS,UAAU,MAAA,EAAO;AACvF;AC/GA,IAAM,YAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,gCAAA;AAAA,EACT,IAAA,EAAM,wCAAA;AAAA,EACN,OAAA,EAAS,8CAAA;AAAA,EACT,OAAA,EAAS,8CAAA;AAAA,EACT,KAAA,EAAO,0CAAA;AAAA,EACP,OAAA,EAAS,4BAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,YAAY,IAAA,EAA2B;AAC9C,EAAA,MAAM,KAAA,GAAQ,WAAA;AACd,EAAA,MAAM,IAAA,GAAO,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAClC,EAAA,OAAA,CAAQ,OAAO,IAAA,KAAS,UAAA,IAAc,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,MAAA,KAA0B,WAAA,CAAA,YAAA;AACpG;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,KAAA,CAAA,EAAW;AAAA,MACxC,GAAA,EAAK,SAAA;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA,CAAE,MAAA,CAAO,IAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaA,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,UAAS,EAAiE;AACrG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAGb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,SAAA,EAAY,KAAA,GAAQ,KAAK,WAAW,CAAA,CAAA,EAAI,eAAW,IAAA,EAAC,CAAA;AAAA,oBACrE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sGAAA,EACZ,QAAA,EACH,CAAA;AAAA,IACC,CAAC,IAAA,oBAAQ,GAAA,CAAC,UAAK,SAAA,EAAU,uBAAA,EAAwB,eAAW,IAAA,EAAC;AAAA,GAAA,EAChE,CAAA;AAEJ;AAEA,SAAS,gBAAA,GAAmB;AAC1B,EAAA,2BACG,IAAA,EAAA,EAAG,SAAA,EAAU,aAAY,aAAA,EAAW,IAAA,EAClC,WAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,GAAA,EAAK,0BACnB,IAAA,CAAC,IAAA,EAAA,EAAa,WAAU,YAAA,EACtB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,KAAA,KAAU,CAAA,EAAG,IAAA,EAAM,KAAA,KAAU,CAAA,EACxC,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAA8C,CAAA,EAC/D,CAAA;AAAA,wBACC,IAAA,EAAA,EAAK,SAAA,EAAW,CAAA,eAAA,EAAkB,KAAA,KAAU,IAAI,MAAA,GAAS,MAAM,CAAA,CAAA,EAC9D,QAAA,kBAAA,GAAA,CAAC,eAAY,SAAA,EAAU,KAAA,EACrB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EAA+C,CAAA;AAAA,wBAG9D,GAAA,CAAC,SAAI,SAAA,EAAW,CAAA,mCAAA,EAAsC,UAAU,CAAA,GAAI,OAAA,GAAU,OAAO,CAAA,CAAA,EAAI;AAAA,OAAA,EAC3F,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAmD;AAAA,KAAA,EACpE,GACF,CAAA,EACF;AAAA,GAAA,EAAA,EAhBO,GAiBT,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAI,CAAA,IAAK,QAAQ,QAAQ,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,EAAA,MAAM,IAAA,mBACJ,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,MAAA,EAAS,IAAA,GAAO,MAAA,GAAS,MAAM,CAAA,CAAA;AAAA;AAAA,MAGxC,SAAA,GAAY,qDAAqD,EACnE,CAAA,CAAA;AAAA,MACC,GAAI,CAAC,IAAA,IAAQ,QAAA,GAAW,EAAE,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA,EAAE,GAAI,EAAC;AAAA,MAEhE,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,WAAU,oBAAA,EACrB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2EAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACZ,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAa,eAAK,KAAA,EAAM,CAAA;AAAA,8BACtD,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,+CAAA,EAAkD,IAAA,CAAK,QAAQ,MAAA,GAAS,EAAE,CAAA,CAAA,EACtF,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,EAAE,CAAA;AAAA,cAIxF,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FACZ,QAAA,EAAA,OAAA,EACH;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF,CAAA;AAAA,UACC,KAAK,WAAA,oBACJ,GAAA,CAAC,OAAE,SAAA,EAAU,kEAAA,EAAoE,eAAK,WAAA,EAAY,CAAA;AAAA,UAKnG,OAAA,oBACC,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,kCAAA;AAAA,cAIV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cAEjC,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EAEJ,CAAA;AAAA,QASC,SAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sFAAA,EACb,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,+BAAA,EAAgC,aAAA,EAAW,IAAA,EAAC,CAAA,EACtE;AAAA,OAAA,EAEJ;AAAA;AAAA,GACA;AAGF,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAK,KAAA,EAAc,IAAA,EAClB,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,sDAAA,EAAyD,YAAA,CAAa,IAAI,CAAC,IACzF,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,GAC5B,CAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAIZ,QAAA,EAAA,IAAA,mBAAO,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,IAAA,EAAK,CAAA,GAAO,IAAA,EACrE;AAAA,GAAA,EACF,CAAA;AAEJ;AAWO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAkBG;AACD,EAAA,uBACE,GAAA,CAAC,QAAG,SAAA,EAAU,WAAA,EACX,gBAAM,GAAA,CAAI,CAAC,MAAM,KAAA,qBAChB,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MAEC,IAAA;AAAA,MAGA,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,OAAA,GAAU,IAAI,CAAA,IAAK,SAAA;AAAA,MACtC,IAAA,EAAM,UAAU,IAAI,CAAA;AAAA,MACpB,QAAA;AAAA,MACA,OAAA,EAAS,gBAAgB,IAAI,CAAA;AAAA,MAC7B,OAAA,EAAS,aAAa,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,GAAI,aAAA,GAAgB,IAAI,CAAA,GAAI,MAAA;AAAA,MAC7D,OAAO,KAAA,KAAU,CAAA;AAAA,MACjB,IAAA,EAAM,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS;AAAA,KAAA;AAAA,IAV1B,IAAA,CAAK;AAAA,GAYb,CAAA,EACH,CAAA;AAEJ;ACxPO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAWG;AACD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,SAA+B,MAAS,CAAA;AACtF,EAAA,MAAM,EAAE,OAAO,OAAA,EAAAD,QAAAA,EAAS,SAAS,WAAA,EAAa,OAAA,EAAS,QAAA,EAAS,GAAI,iBAAA,CAAkB;AAAA,IACpF,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA;AAAA,IACzB,MAAM,IAAI,GAAA,CAAIA,QAAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAA,IAAQ,SAAS,CAAU,CAAC,CAAA;AAAA,IACtE,CAACA,QAAO;AAAA,GACV;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,WAAA;AAAA,IACpB,CAAC,IAAA,KAA2C;AAC1C,MAAA,IAAI,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAC3B,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,CAAK,WAAW,OAAO,MAAA;AAG3C,MAAA,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAKA,EAAA,MAAM,OAAA,GAAUA,QAAAA,CAAQ,MAAA,GAAS,CAAA,oBAC/BE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,CAAC,EAAE,EAAA,EAAI,QAAW,KAAA,EAAO,MAAA,EAAO,EAAG,GAAGF,QAAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAA0B,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAC,CAAA,CAAE,GAAA;AAAA,IAC/G,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,GAChB,eAAA,EAAiB,MAAA,KAAW,CAAA,IAAK,eAAA,CAAgB,CAAC,CAAA,KAAM,IAAA,CAAK,EAAA,GAC7D,CAAC,eAAA;AACL,MAAA,uBACEE,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UAEL,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,IAAA,CAAK,EAAE,CAAA,GAAI,MAAS,CAAA;AAAA,UACjE,SAAA,EAAW,CAAA,sEAAA,EACT,MAAA,GACI,2CAAA,GACA,0EACN,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA,IAAA,CAAK;AAAA,SAAA;AAAA,QATD,KAAK,EAAA,IAAM;AAAA,OAUlB;AAAA,IAEJ;AAAA,GACF,EACF,CAAA;AAGF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IAEA,OAAA,mBACCD,GAAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA,GAChB,MAAM,MAAA,KAAW,CAAA,mBACnBA,GAAAA,CAACE,IAAAA,EAAA,EACC,0BAAAF,GAAAA,CAACG,WAAAA,EAAA,EAAY,SAAA,EAAU,6EAAA,EACpB,QAAA,EAAA,eAAA,GACG,+CAAA,GACA,mDAAA,EACN,CAAA,EACF,CAAA,mBAEAF,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UAIA,SAAS,CAAC,IAAA,KAAS,aAAa,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,IAAK,SAAA;AAAA,UACtD;AAAA;AAAA,OACF;AAAA,MACC,OAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,UAAU,WAAA,EAAa,OAAA,EAAS,UACjE,QAAA,EAAA,WAAA,GAAc,kBAAA,GAAgB,iBACjC,CAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-E4MESMNR.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// Importing the component registers the core sources; there is no separate install step.\nimport './core-sources'\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 variant=\"bare\"\n size=\"bare\"\n key={chip.id ?? '__all__'}\n type=\"button\"\n onClick={() => setActiveSourceIds(chip.id ? [chip.id] : undefined)}\n className={`font-normal 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"]}