@fluid-app/portal-sdk 0.1.350 → 0.1.352

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 (280) hide show
  1. package/dist/{AddressAutocompleteInput-JBXGT1iL.cjs → AddressAutocompleteInput-BQz2jaUO.cjs} +134 -79
  2. package/dist/AddressAutocompleteInput-BQz2jaUO.cjs.map +1 -0
  3. package/dist/{AddressAutocompleteInput-BANMgwzR.mjs → AddressAutocompleteInput-Dds2GjGt.mjs} +134 -79
  4. package/dist/AddressAutocompleteInput-Dds2GjGt.mjs.map +1 -0
  5. package/dist/{AlertWidget-BmOGoxTA.mjs → AlertWidget-DMwOt9u8.mjs} +3 -3
  6. package/dist/{AlertWidget-BmOGoxTA.mjs.map → AlertWidget-DMwOt9u8.mjs.map} +1 -1
  7. package/dist/{AppDownloadScreen-C78ggXk3.mjs → AppDownloadScreen-CBg2shvo.mjs} +5 -5
  8. package/dist/{AppDownloadScreen-C78ggXk3.mjs.map → AppDownloadScreen-CBg2shvo.mjs.map} +1 -1
  9. package/dist/{AppDownloadScreen-DIcwvAZ4.cjs → AppDownloadScreen-CMR1y4kP.cjs} +4 -4
  10. package/dist/{AppDownloadScreen-DIcwvAZ4.cjs.map → AppDownloadScreen-CMR1y4kP.cjs.map} +1 -1
  11. package/dist/{AppNavigationContext-BCj6iFxr.mjs → AppNavigationContext-B-wToUBG.mjs} +3 -3
  12. package/dist/AppNavigationContext-B-wToUBG.mjs.map +1 -0
  13. package/dist/{AppNavigationContext-CoNtdUrr.cjs → AppNavigationContext-CLOwdlpx.cjs} +2 -2
  14. package/dist/AppNavigationContext-CLOwdlpx.cjs.map +1 -0
  15. package/dist/{BulletListWidget-AIIf29RP.mjs → BulletListWidget-D--Mmasw.mjs} +2 -2
  16. package/dist/{BulletListWidget-AIIf29RP.mjs.map → BulletListWidget-D--Mmasw.mjs.map} +1 -1
  17. package/dist/{CalendarWidget-DW5wz5ke.cjs → CalendarWidget-Aa7H9M7f.cjs} +4 -4
  18. package/dist/{CalendarWidget-DW5wz5ke.cjs.map → CalendarWidget-Aa7H9M7f.cjs.map} +1 -1
  19. package/dist/{CalendarWidget-Dn55musX.mjs → CalendarWidget-Cx6KvkaG.mjs} +5 -5
  20. package/dist/{CalendarWidget-Dn55musX.mjs.map → CalendarWidget-Cx6KvkaG.mjs.map} +1 -1
  21. package/dist/{CardWidget-DsfLoyup.cjs → CardWidget-Caytu8qs.cjs} +3 -3
  22. package/dist/{CardWidget--S5FBquC.cjs → CardWidget-CqewqU5a.cjs} +2 -2
  23. package/dist/{CardWidget--S5FBquC.cjs.map → CardWidget-CqewqU5a.cjs.map} +1 -1
  24. package/dist/{CardWidget-ChfurL_z.mjs → CardWidget-DARqLSwy.mjs} +3 -3
  25. package/dist/{CardWidget-ChfurL_z.mjs.map → CardWidget-DARqLSwy.mjs.map} +1 -1
  26. package/dist/{CarouselWidget-SrCl4cSn.mjs → CarouselWidget-Bnl_iggA.mjs} +2 -2
  27. package/dist/{CarouselWidget-SrCl4cSn.mjs.map → CarouselWidget-Bnl_iggA.mjs.map} +1 -1
  28. package/dist/{CatchUpWidget-B_in7Bjq.mjs → CatchUpWidget-Bplozt8D.mjs} +5 -5
  29. package/dist/{CatchUpWidget-B_in7Bjq.mjs.map → CatchUpWidget-Bplozt8D.mjs.map} +1 -1
  30. package/dist/{CatchUpWidget-_ErrC-e8.cjs → CatchUpWidget-DEyXTEFj.cjs} +4 -4
  31. package/dist/{CatchUpWidget-_ErrC-e8.cjs.map → CatchUpWidget-DEyXTEFj.cjs.map} +1 -1
  32. package/dist/{ChartWidget-CIr3v8x6.mjs → ChartWidget-BPOZNKI_.mjs} +2 -2
  33. package/dist/{ChartWidget-CIr3v8x6.mjs.map → ChartWidget-BPOZNKI_.mjs.map} +1 -1
  34. package/dist/{ContactsScreen-f3dXV198.cjs → ContactsScreen-BFbWTMu9.cjs} +4 -4
  35. package/dist/{ContactsScreen-f3dXV198.cjs.map → ContactsScreen-BFbWTMu9.cjs.map} +1 -1
  36. package/dist/{ContactsScreen-DJ8O35Pl.mjs → ContactsScreen-CnLSICv5.mjs} +5 -5
  37. package/dist/{ContactsScreen-DJ8O35Pl.mjs.map → ContactsScreen-CnLSICv5.mjs.map} +1 -1
  38. package/dist/{ContactsScreen-CVmYvRZi.cjs → ContactsScreen-DQjdfcAV.cjs} +5 -5
  39. package/dist/{ContainerWidget-BHWPtBmF.mjs → ContainerWidget-Bv0f8-TC.mjs} +3 -3
  40. package/dist/{ContainerWidget-BHWPtBmF.mjs.map → ContainerWidget-Bv0f8-TC.mjs.map} +1 -1
  41. package/dist/{ContainerWidget-Cf_D4TAi.cjs → ContainerWidget-CF6VDxd8.cjs} +2 -2
  42. package/dist/{ContainerWidget-Cf_D4TAi.cjs.map → ContainerWidget-CF6VDxd8.cjs.map} +1 -1
  43. package/dist/ContainerWidget-D3JoA0IP.cjs +8 -0
  44. package/dist/{CustomersScreen-DGBwaZrt.mjs → CustomersScreen-BHqlHdHZ.mjs} +3 -3
  45. package/dist/{CustomersScreen-DGBwaZrt.mjs.map → CustomersScreen-BHqlHdHZ.mjs.map} +1 -1
  46. package/dist/{CustomersScreen-BXvWK7Y1.cjs → CustomersScreen-C8b3P79M.cjs} +2 -2
  47. package/dist/{CustomersScreen-BXvWK7Y1.cjs.map → CustomersScreen-C8b3P79M.cjs.map} +1 -1
  48. package/dist/{EmbedWidget-D5kFw9HS.mjs → EmbedWidget-DRfjHvRs.mjs} +2 -2
  49. package/dist/{EmbedWidget-D5kFw9HS.mjs.map → EmbedWidget-DRfjHvRs.mjs.map} +1 -1
  50. package/dist/{FluidProvider-BVJmIM13.cjs → FluidProvider-CMfpLju8.cjs} +73 -47
  51. package/dist/FluidProvider-CMfpLju8.cjs.map +1 -0
  52. package/dist/{FluidProvider-CYBXFElI.mjs → FluidProvider-tPt9UpYz.mjs} +101 -81
  53. package/dist/FluidProvider-tPt9UpYz.mjs.map +1 -0
  54. package/dist/{ImageWidget-B3ZTuy4v.mjs → ImageWidget-C7nfRJ6p.mjs} +2 -2
  55. package/dist/{ImageWidget-B3ZTuy4v.mjs.map → ImageWidget-C7nfRJ6p.mjs.map} +1 -1
  56. package/dist/{LayoutWidget-3G-w-YLz.cjs → LayoutWidget-6_Huueb4.cjs} +3 -3
  57. package/dist/{LayoutWidget-CrZG6Ipw.mjs → LayoutWidget-CSFWeXYY.mjs} +3 -3
  58. package/dist/{LayoutWidget-CrZG6Ipw.mjs.map → LayoutWidget-CSFWeXYY.mjs.map} +1 -1
  59. package/dist/{LayoutWidget-CG-dWz_c.cjs → LayoutWidget-DD1ZqWXg.cjs} +2 -2
  60. package/dist/{LayoutWidget-CG-dWz_c.cjs.map → LayoutWidget-DD1ZqWXg.cjs.map} +1 -1
  61. package/dist/{LinkWidget-fPowKN73.mjs → LinkWidget-DI2Uod5O.mjs} +2 -2
  62. package/dist/{LinkWidget-fPowKN73.mjs.map → LinkWidget-DI2Uod5O.mjs.map} +1 -1
  63. package/dist/{ListWidget-CQuNRg_g.mjs → ListWidget-BdUhs2fo.mjs} +2 -2
  64. package/dist/{ListWidget-CQuNRg_g.mjs.map → ListWidget-BdUhs2fo.mjs.map} +1 -1
  65. package/dist/{MessagingScreen-3o_Qb6u_.mjs → MessagingScreen-8hyxHThw.mjs} +10 -10
  66. package/dist/MessagingScreen-8hyxHThw.mjs.map +1 -0
  67. package/dist/{MessagingScreen-Db6wQydU.cjs → MessagingScreen-CaSUJhJc.cjs} +25 -25
  68. package/dist/MessagingScreen-CpMlE96f.mjs +50 -0
  69. package/dist/{MessagingScreen-C4SUSPy3.cjs → MessagingScreen-CvyQL50O.cjs} +8 -8
  70. package/dist/MessagingScreen-CvyQL50O.cjs.map +1 -0
  71. package/dist/{MySiteScreen-D3rkI2UJ.cjs → MySiteScreen-BZnLxHAq.cjs} +6 -6
  72. package/dist/{MySiteScreen-D3rkI2UJ.cjs.map → MySiteScreen-BZnLxHAq.cjs.map} +1 -1
  73. package/dist/MySiteScreen-CYGVxzCE.cjs +11 -0
  74. package/dist/{MySiteScreen-BC_K8gIq.mjs → MySiteScreen-tKgO4G0B.mjs} +7 -7
  75. package/dist/{MySiteScreen-BC_K8gIq.mjs.map → MySiteScreen-tKgO4G0B.mjs.map} +1 -1
  76. package/dist/{MySiteWidget-D6QyWuzN.cjs → MySiteWidget-CabBtq5C.cjs} +4 -4
  77. package/dist/{MySiteWidget-D6QyWuzN.cjs.map → MySiteWidget-CabBtq5C.cjs.map} +1 -1
  78. package/dist/{MySiteWidget-BLALS8Ve.mjs → MySiteWidget-ivytLi6H.mjs} +5 -5
  79. package/dist/{MySiteWidget-BLALS8Ve.mjs.map → MySiteWidget-ivytLi6H.mjs.map} +1 -1
  80. package/dist/{NestedWidget-DuNuNaeT.mjs → NestedWidget-gqdWZS9Q.mjs} +2 -2
  81. package/dist/{NestedWidget-DuNuNaeT.mjs.map → NestedWidget-gqdWZS9Q.mjs.map} +1 -1
  82. package/dist/OrdersScreen-BGVPWrEg.cjs +50 -0
  83. package/dist/OrdersScreen-BZ2iBfWQ.mjs +48 -0
  84. package/dist/{OrdersScreen-CJzegrYb.cjs → OrdersScreen-Ckt7uChL.cjs} +11 -11
  85. package/dist/OrdersScreen-Ckt7uChL.cjs.map +1 -0
  86. package/dist/{OrdersScreen-FaoTq71a.mjs → OrdersScreen-DsKspc_8.mjs} +12 -12
  87. package/dist/OrdersScreen-DsKspc_8.mjs.map +1 -0
  88. package/dist/{PointsWidget-BvGANrJq.mjs → PointsWidget-BJlOIK6o.mjs} +5 -5
  89. package/dist/{PointsWidget-BvGANrJq.mjs.map → PointsWidget-BJlOIK6o.mjs.map} +1 -1
  90. package/dist/{PointsWidget-Byd2-eEi.cjs → PointsWidget-Him7U2k2.cjs} +4 -4
  91. package/dist/{PointsWidget-Byd2-eEi.cjs.map → PointsWidget-Him7U2k2.cjs.map} +1 -1
  92. package/dist/{PortalTenantClientProvider-Bpm-CZq1.cjs → PortalTenantClientProvider-C0eJp8MN.cjs} +3 -3
  93. package/dist/PortalTenantClientProvider-C0eJp8MN.cjs.map +1 -0
  94. package/dist/{PortalTenantClientProvider-BmRtQAbi.mjs → PortalTenantClientProvider-DVClpfbi.mjs} +4 -4
  95. package/dist/PortalTenantClientProvider-DVClpfbi.mjs.map +1 -0
  96. package/dist/{ProfileScreen-DxjLSL0A.cjs → ProfileScreen-21MnRuNH.cjs} +12 -8
  97. package/dist/ProfileScreen-21MnRuNH.cjs.map +1 -0
  98. package/dist/{ProfileScreen-CU4Y3sBq.mjs → ProfileScreen-DA3vl5EU.mjs} +12 -8
  99. package/dist/ProfileScreen-DA3vl5EU.mjs.map +1 -0
  100. package/dist/ProfileScreen-DzxUqJJD.cjs +53 -0
  101. package/dist/ProfileScreen-Uw_6u6Ew.mjs +51 -0
  102. package/dist/{QuickLinksWidget-D8LqZkUS.mjs → QuickLinksWidget-DJUI7r5_.mjs} +2 -2
  103. package/dist/{QuickLinksWidget-D8LqZkUS.mjs.map → QuickLinksWidget-DJUI7r5_.mjs.map} +1 -1
  104. package/dist/{QuickShareWidget-BJpqzZp0.mjs → QuickShareWidget-B7DhQOyt.mjs} +2 -2
  105. package/dist/{QuickShareWidget-BJpqzZp0.mjs.map → QuickShareWidget-B7DhQOyt.mjs.map} +1 -1
  106. package/dist/{RecentActivityWidget-ClgOlTXl.mjs → RecentActivityWidget-BMGeLSUa.mjs} +5 -5
  107. package/dist/{RecentActivityWidget-ClgOlTXl.mjs.map → RecentActivityWidget-BMGeLSUa.mjs.map} +1 -1
  108. package/dist/{RecentActivityWidget-BYzAzBI-.cjs → RecentActivityWidget-DvrmBGsD.cjs} +4 -4
  109. package/dist/{RecentActivityWidget-BYzAzBI-.cjs.map → RecentActivityWidget-DvrmBGsD.cjs.map} +1 -1
  110. package/dist/{ScreenHeaderContext-BiGgRqjY.cjs → ScreenHeaderContext-VOp8pVHr.cjs} +4 -4
  111. package/dist/ScreenHeaderContext-VOp8pVHr.cjs.map +1 -0
  112. package/dist/{ScreenHeaderContext-BjpQOCck.mjs → ScreenHeaderContext-cuVMk00X.mjs} +5 -5
  113. package/dist/ScreenHeaderContext-cuVMk00X.mjs.map +1 -0
  114. package/dist/{ScreenRenderer-TobkTBMC.mjs → ScreenRenderer-D3zNFSr3.mjs} +4 -4
  115. package/dist/ScreenRenderer-D3zNFSr3.mjs.map +1 -0
  116. package/dist/{ScreenRenderer-CLDJUinO.cjs → ScreenRenderer-IMkMMnUJ.cjs} +3 -3
  117. package/dist/ScreenRenderer-IMkMMnUJ.cjs.map +1 -0
  118. package/dist/{SearchSort-B5hq2j-l.cjs → SearchSort-BjjBpuEi.cjs} +2 -2
  119. package/dist/SearchSort-BjjBpuEi.cjs.map +1 -0
  120. package/dist/{SearchSort-CMUL0qt3.mjs → SearchSort-C6RV6d9g.mjs} +3 -3
  121. package/dist/SearchSort-C6RV6d9g.mjs.map +1 -0
  122. package/dist/{SeparatorWidget-CDvDjL-k.mjs → SeparatorWidget-CGFzy35l.mjs} +2 -2
  123. package/dist/{SeparatorWidget-CDvDjL-k.mjs.map → SeparatorWidget-CGFzy35l.mjs.map} +1 -1
  124. package/dist/{ShareablesScreen-COg_WpdP.cjs → ShareablesScreen-B0vxU7i6.cjs} +20 -20
  125. package/dist/ShareablesScreen-B0vxU7i6.cjs.map +1 -0
  126. package/dist/{ShareablesScreen-C9EmRZJW.mjs → ShareablesScreen-CefIC5H8.mjs} +22 -22
  127. package/dist/ShareablesScreen-CefIC5H8.mjs.map +1 -0
  128. package/dist/ShareablesScreen-Cs8iC1qk.mjs +15 -0
  129. package/dist/ShareablesScreen-igzq70Xz.cjs +17 -0
  130. package/dist/{ShopScreen-DTL5xiPY.mjs → ShopScreen-CbeH9wRR.mjs} +10 -10
  131. package/dist/ShopScreen-CbeH9wRR.mjs.map +1 -0
  132. package/dist/{ShopScreen-Bgx6548O.cjs → ShopScreen-Cme3j61f.cjs} +10 -10
  133. package/dist/ShopScreen-Cme3j61f.cjs.map +1 -0
  134. package/dist/ShopScreen-D2LDk2xr.mjs +48 -0
  135. package/dist/ShopScreen-D6xtA_0b.cjs +50 -0
  136. package/dist/{ShopWidget-Cmx4Pb6Q.cjs → ShopWidget-BWURiWyx.cjs} +4 -4
  137. package/dist/{ShopWidget-Cmx4Pb6Q.cjs.map → ShopWidget-BWURiWyx.cjs.map} +1 -1
  138. package/dist/{ShopWidget-C76SSZwW.cjs → ShopWidget-C4jeRRut.cjs} +4 -4
  139. package/dist/{ShopWidget-BzAuvfyC.mjs → ShopWidget-Cqnwq0AG.mjs} +5 -5
  140. package/dist/{ShopWidget-BzAuvfyC.mjs.map → ShopWidget-Cqnwq0AG.mjs.map} +1 -1
  141. package/dist/{SpacerWidget-B0l19UqF.mjs → SpacerWidget-BhxIaqYF.mjs} +2 -2
  142. package/dist/{SpacerWidget-B0l19UqF.mjs.map → SpacerWidget-BhxIaqYF.mjs.map} +1 -1
  143. package/dist/{SubscriptionsScreen-qKJoibtI.mjs → SubscriptionsScreen-Br_gugTG.mjs} +32 -27
  144. package/dist/SubscriptionsScreen-Br_gugTG.mjs.map +1 -0
  145. package/dist/SubscriptionsScreen-CG3OldGE.mjs +50 -0
  146. package/dist/{SubscriptionsScreen-DGE3efWd.cjs → SubscriptionsScreen-CvM68asd.cjs} +26 -26
  147. package/dist/{SubscriptionsScreen-D8bjSX3s.cjs → SubscriptionsScreen-HbrDZhaX.cjs} +31 -26
  148. package/dist/SubscriptionsScreen-HbrDZhaX.cjs.map +1 -0
  149. package/dist/{TableWidget-CpHI9CGQ.mjs → TableWidget-Dwud4Fif.mjs} +2 -2
  150. package/dist/{TableWidget-CpHI9CGQ.mjs.map → TableWidget-Dwud4Fif.mjs.map} +1 -1
  151. package/dist/{TextWidget-Jy-Ktqje.mjs → TextWidget-B5ZtQMX-.mjs} +2 -2
  152. package/dist/{TextWidget-Jy-Ktqje.mjs.map → TextWidget-B5ZtQMX-.mjs.map} +1 -1
  153. package/dist/ToDoWidget-BJ2Ip97m.cjs +11 -0
  154. package/dist/{ToDoWidget-BaWksZpJ.mjs → ToDoWidget-Bnml3xLS.mjs} +6 -6
  155. package/dist/{ToDoWidget-BaWksZpJ.mjs.map → ToDoWidget-Bnml3xLS.mjs.map} +1 -1
  156. package/dist/{ToDoWidget-CZh5a5-z.cjs → ToDoWidget-C3Ob2TP2.cjs} +5 -5
  157. package/dist/{ToDoWidget-CZh5a5-z.cjs.map → ToDoWidget-C3Ob2TP2.cjs.map} +1 -1
  158. package/dist/{UpgradeScreen-VpfRqKdO.cjs → UpgradeScreen-B40dCeub.cjs} +3 -3
  159. package/dist/{UpgradeScreen-VpfRqKdO.cjs.map → UpgradeScreen-B40dCeub.cjs.map} +1 -1
  160. package/dist/{UpgradeScreen-C55rEuCN.cjs → UpgradeScreen-CbdTRnIj.cjs} +3 -3
  161. package/dist/{UpgradeScreen-x9TdC5aR.mjs → UpgradeScreen-GzkZOOR4.mjs} +4 -4
  162. package/dist/{UpgradeScreen-x9TdC5aR.mjs.map → UpgradeScreen-GzkZOOR4.mjs.map} +1 -1
  163. package/dist/{VideoWidget-DP-VHt2s.mjs → VideoWidget-Cm3UQ3-Z.mjs} +2 -2
  164. package/dist/{VideoWidget-DP-VHt2s.mjs.map → VideoWidget-Cm3UQ3-Z.mjs.map} +1 -1
  165. package/dist/{countries-api-context-G-NW4BoH.cjs → countries-api-context-16PZpF7O.cjs} +2 -2
  166. package/dist/countries-api-context-16PZpF7O.cjs.map +1 -0
  167. package/dist/{countries-api-context-DScC_39w.mjs → countries-api-context-Donus2X5.mjs} +3 -3
  168. package/dist/countries-api-context-Donus2X5.mjs.map +1 -0
  169. package/dist/{error-state-DvzIn9Tz.mjs → error-state-BUe589mD.mjs} +3 -3
  170. package/dist/error-state-BUe589mD.mjs.map +1 -0
  171. package/dist/{error-state-DJq7C-23.cjs → error-state-CU87JUpz.cjs} +2 -2
  172. package/dist/error-state-CU87JUpz.cjs.map +1 -0
  173. package/dist/{es-jA6aVeLD.mjs → es-C19weaa-.mjs} +2 -2
  174. package/dist/{es-jA6aVeLD.mjs.map → es-C19weaa-.mjs.map} +1 -1
  175. package/dist/index.cjs +65 -65
  176. package/dist/index.cjs.map +1 -1
  177. package/dist/index.d.cts.map +1 -1
  178. package/dist/index.d.mts.map +1 -1
  179. package/dist/index.mjs +83 -83
  180. package/dist/index.mjs.map +1 -1
  181. package/dist/{mysite-api-context-kUTM3GNG.mjs → mysite-api-context-CoLr9vIf.mjs} +3 -3
  182. package/dist/mysite-api-context-CoLr9vIf.mjs.map +1 -0
  183. package/dist/{mysite-api-context-CilZcDS4.cjs → mysite-api-context-DtEXblIV.cjs} +2 -2
  184. package/dist/mysite-api-context-DtEXblIV.cjs.map +1 -0
  185. package/dist/{preview-context-D9ZzEfWh.mjs → preview-context-BXEGWx9T.mjs} +3 -3
  186. package/dist/preview-context-BXEGWx9T.mjs.map +1 -0
  187. package/dist/{preview-context-BWCl-xyj.cjs → preview-context-DrXkIImI.cjs} +2 -2
  188. package/dist/preview-context-DrXkIImI.cjs.map +1 -0
  189. package/dist/{registry-context-BKvTiuXB.mjs → registry-context-CcoVxCii.mjs} +3 -3
  190. package/dist/{registry-context-BKvTiuXB.mjs.map → registry-context-CcoVxCii.mjs.map} +1 -1
  191. package/dist/{registry-context-DJ5xiVnt.cjs → registry-context-Q_1Iq2Ea.cjs} +2 -2
  192. package/dist/{registry-context-DJ5xiVnt.cjs.map → registry-context-Q_1Iq2Ea.cjs.map} +1 -1
  193. package/dist/{static-dict-adapter-JAau5LHb.cjs → static-dict-adapter-BLq4QzCI.cjs} +2 -2
  194. package/dist/static-dict-adapter-BLq4QzCI.cjs.map +1 -0
  195. package/dist/{static-dict-adapter-DjCpubZc.mjs → static-dict-adapter-DRBq3ndO.mjs} +3 -3
  196. package/dist/static-dict-adapter-DRBq3ndO.mjs.map +1 -0
  197. package/dist/{store-api-context-DViwxyG4.mjs → store-api-context-B_vtKkXO.mjs} +3 -3
  198. package/dist/store-api-context-B_vtKkXO.mjs.map +1 -0
  199. package/dist/{store-api-context-D1gZn22Z.cjs → store-api-context-CGH3YsZB.cjs} +2 -2
  200. package/dist/store-api-context-CGH3YsZB.cjs.map +1 -0
  201. package/dist/{task-composer-form-D_Pbl6qk.mjs → task-composer-form-CZgRqbIc.mjs} +4 -4
  202. package/dist/task-composer-form-CZgRqbIc.mjs.map +1 -0
  203. package/dist/{task-composer-form-BEZGTBBZ.cjs → task-composer-form-Cz8hpMTT.cjs} +3 -3
  204. package/dist/task-composer-form-Cz8hpMTT.cjs.map +1 -0
  205. package/dist/{translation-api-context-factory-BSRK6Z50.cjs → translation-api-context-factory-CjRDqIhF.cjs} +2 -2
  206. package/dist/translation-api-context-factory-CjRDqIhF.cjs.map +1 -0
  207. package/dist/{translation-api-context-factory-CJrVq_EB.mjs → translation-api-context-factory-DFr9yJ6Q.mjs} +3 -3
  208. package/dist/translation-api-context-factory-DFr9yJ6Q.mjs.map +1 -0
  209. package/dist/{use-account-CQ-mhA3W.cjs → use-account-DltRHEwC.cjs} +2 -2
  210. package/dist/{use-account-CQ-mhA3W.cjs.map → use-account-DltRHEwC.cjs.map} +1 -1
  211. package/dist/{use-account-CwGoFpwg.mjs → use-account-Dm6Svko1.mjs} +2 -2
  212. package/dist/{use-account-CwGoFpwg.mjs.map → use-account-Dm6Svko1.mjs.map} +1 -1
  213. package/dist/{use-mysite-portal-ChDJ4z34.mjs → use-mysite-portal-3Tn3bFoE.mjs} +2 -2
  214. package/dist/{use-mysite-portal-ChDJ4z34.mjs.map → use-mysite-portal-3Tn3bFoE.mjs.map} +1 -1
  215. package/dist/{use-mysite-portal-CH9ZQROw.cjs → use-mysite-portal-D3X51_Ax.cjs} +2 -2
  216. package/dist/{use-mysite-portal-CH9ZQROw.cjs.map → use-mysite-portal-D3X51_Ax.cjs.map} +1 -1
  217. package/dist/{use-navigation-parent-DvHbbMB0.mjs → use-navigation-parent-GjQMvU4i.mjs} +2 -2
  218. package/dist/{use-navigation-parent-DvHbbMB0.mjs.map → use-navigation-parent-GjQMvU4i.mjs.map} +1 -1
  219. package/dist/{use-navigation-parent-DQ8CiN9L.cjs → use-navigation-parent-q-la1wD2.cjs} +2 -2
  220. package/dist/{use-navigation-parent-DQ8CiN9L.cjs.map → use-navigation-parent-q-la1wD2.cjs.map} +1 -1
  221. package/dist/{use-store-cwcCLxl_.mjs → use-store-C6KYHvRw.mjs} +2 -2
  222. package/dist/{use-store-cwcCLxl_.mjs.map → use-store-C6KYHvRw.mjs.map} +1 -1
  223. package/dist/{use-store-lOOUcpRT.cjs → use-store-j_6I4DU4.cjs} +2 -2
  224. package/dist/{use-store-lOOUcpRT.cjs.map → use-store-j_6I4DU4.cjs.map} +1 -1
  225. package/package.json +19 -18
  226. package/dist/AddressAutocompleteInput-BANMgwzR.mjs.map +0 -1
  227. package/dist/AddressAutocompleteInput-JBXGT1iL.cjs.map +0 -1
  228. package/dist/AppNavigationContext-BCj6iFxr.mjs.map +0 -1
  229. package/dist/AppNavigationContext-CoNtdUrr.cjs.map +0 -1
  230. package/dist/ContainerWidget-CyDVJu83.cjs +0 -8
  231. package/dist/FluidProvider-BVJmIM13.cjs.map +0 -1
  232. package/dist/FluidProvider-CYBXFElI.mjs.map +0 -1
  233. package/dist/MessagingScreen-3o_Qb6u_.mjs.map +0 -1
  234. package/dist/MessagingScreen-C4SUSPy3.cjs.map +0 -1
  235. package/dist/MessagingScreen-D-wunIkf.mjs +0 -50
  236. package/dist/MySiteScreen-DiCU6P9d.cjs +0 -11
  237. package/dist/OrdersScreen-BL5Ta3Tt.cjs +0 -50
  238. package/dist/OrdersScreen-B_JxQTW8.mjs +0 -48
  239. package/dist/OrdersScreen-CJzegrYb.cjs.map +0 -1
  240. package/dist/OrdersScreen-FaoTq71a.mjs.map +0 -1
  241. package/dist/PortalTenantClientProvider-BmRtQAbi.mjs.map +0 -1
  242. package/dist/PortalTenantClientProvider-Bpm-CZq1.cjs.map +0 -1
  243. package/dist/ProfileScreen-CU4Y3sBq.mjs.map +0 -1
  244. package/dist/ProfileScreen-DMDKlk20.cjs +0 -53
  245. package/dist/ProfileScreen-Dcjp4wNO.mjs +0 -51
  246. package/dist/ProfileScreen-DxjLSL0A.cjs.map +0 -1
  247. package/dist/ScreenHeaderContext-BiGgRqjY.cjs.map +0 -1
  248. package/dist/ScreenHeaderContext-BjpQOCck.mjs.map +0 -1
  249. package/dist/ScreenRenderer-CLDJUinO.cjs.map +0 -1
  250. package/dist/ScreenRenderer-TobkTBMC.mjs.map +0 -1
  251. package/dist/SearchSort-B5hq2j-l.cjs.map +0 -1
  252. package/dist/SearchSort-CMUL0qt3.mjs.map +0 -1
  253. package/dist/ShareablesScreen-BQd1-Og8.mjs +0 -15
  254. package/dist/ShareablesScreen-C9EmRZJW.mjs.map +0 -1
  255. package/dist/ShareablesScreen-COg_WpdP.cjs.map +0 -1
  256. package/dist/ShareablesScreen-CoFM63kh.cjs +0 -17
  257. package/dist/ShopScreen-Bgx6548O.cjs.map +0 -1
  258. package/dist/ShopScreen-Bm2RlZas.cjs +0 -50
  259. package/dist/ShopScreen-Cz7aMt4z.mjs +0 -48
  260. package/dist/ShopScreen-DTL5xiPY.mjs.map +0 -1
  261. package/dist/SubscriptionsScreen-CF6AuW3I.mjs +0 -50
  262. package/dist/SubscriptionsScreen-D8bjSX3s.cjs.map +0 -1
  263. package/dist/SubscriptionsScreen-qKJoibtI.mjs.map +0 -1
  264. package/dist/ToDoWidget-1wI1ntdD.cjs +0 -11
  265. package/dist/countries-api-context-DScC_39w.mjs.map +0 -1
  266. package/dist/countries-api-context-G-NW4BoH.cjs.map +0 -1
  267. package/dist/error-state-DJq7C-23.cjs.map +0 -1
  268. package/dist/error-state-DvzIn9Tz.mjs.map +0 -1
  269. package/dist/mysite-api-context-CilZcDS4.cjs.map +0 -1
  270. package/dist/mysite-api-context-kUTM3GNG.mjs.map +0 -1
  271. package/dist/preview-context-BWCl-xyj.cjs.map +0 -1
  272. package/dist/preview-context-D9ZzEfWh.mjs.map +0 -1
  273. package/dist/static-dict-adapter-DjCpubZc.mjs.map +0 -1
  274. package/dist/static-dict-adapter-JAau5LHb.cjs.map +0 -1
  275. package/dist/store-api-context-D1gZn22Z.cjs.map +0 -1
  276. package/dist/store-api-context-DViwxyG4.mjs.map +0 -1
  277. package/dist/task-composer-form-BEZGTBBZ.cjs.map +0 -1
  278. package/dist/task-composer-form-D_Pbl6qk.mjs.map +0 -1
  279. package/dist/translation-api-context-factory-BSRK6Z50.cjs.map +0 -1
  280. package/dist/translation-api-context-factory-CJrVq_EB.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ToDoWidget-CZh5a5-z.cjs","names":["useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","useWidgetPreviewContext","useDataSourceRegistryConfig","Dialog","DialogContent","DialogHeader","DialogTitle","PortalContainerProvider","TaskComposerForm","useContactsTranslation","useInfiniteContacts","Popover","PopoverTrigger","cn","ChevronsUpDown","PopoverContent","Search","Input","Check","useWidgetPreviewContext","borderWidthClasses","borderColorClasses","ListChecks","ErrorState","Plus","parseTaskBody","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField"],"sources":["../../widgets/src/hooks/use-todos.preview.ts","../../widgets/src/hooks/use-todos.ts","../../widgets/src/hooks/use-update-todo.ts","../../widgets/src/widgets/CreateTodoDialog.tsx","../../widgets/src/widgets/ToDoWidget.tsx"],"sourcesContent":["import type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst now = new Date();\n\nfunction daysFromNow(days: number): string {\n const d = new Date(now);\n d.setDate(d.getDate() + days);\n return d.toISOString();\n}\n\nexport const PREVIEW_DATA: Todo[] = [\n {\n id: 1,\n body: \"Send follow-up email to new leads\",\n dueAt: daysFromNow(1),\n completedAt: null,\n createdAt: daysFromNow(-2),\n contactId: 101,\n contactName: \"Sarah Johnson\",\n },\n {\n id: 2,\n body: \"Prepare slides for team training\",\n dueAt: daysFromNow(3),\n completedAt: null,\n createdAt: daysFromNow(-1),\n contactId: null,\n contactName: null,\n },\n {\n id: 3,\n body: \"Review monthly sales report\",\n dueAt: daysFromNow(-1),\n completedAt: null,\n createdAt: daysFromNow(-5),\n contactId: 102,\n contactName: \"Mike Chen\",\n },\n];\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-todos.preview\";\nimport type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\n\n/**\n * Shared cache key for the todos list. Both useTodos (read) and\n * useUpdateTodo (write) use this — drift would silently break optimistic\n * updates.\n */\nexport function todosQueryKey(args: {\n baseUrl: string | undefined;\n isPreview: boolean;\n}) {\n return [\n \"portal-widget-use\",\n \"todos\",\n args.isPreview ? \"preview\" : args.baseUrl,\n ] as const;\n}\n\nexport function useTodos(): UseQueryResult<Todo[], Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n\n return useQuery({\n queryKey: todosQueryKey({ baseUrl, isPreview }),\n queryFn: ({ signal }) => widgetsApi.fetchTodos(signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\nimport { todosQueryKey } from \"./use-todos\";\n\ntype UpdateVariables = { id: number; completed: boolean };\n\nexport function useUpdateTodo() {\n const widgetsApi = useWidgetsApi();\n const queryClient = useQueryClient();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n\n const queryKey = todosQueryKey({ baseUrl, isPreview });\n\n return useMutation({\n mutationFn: ({ id, completed }: UpdateVariables) => {\n // Defense in depth: ToDoWidget already disables the checkbox in\n // preview mode, but if any other caller fires this mutation while\n // previewing we'd PATCH demo data on the real backend. Fail closed.\n if (isPreview) {\n return Promise.reject(\n new Error(\"Todo updates are disabled in preview mode\"),\n );\n }\n return widgetsApi.updateTodo(id, completed);\n },\n onMutate: async ({ id, completed }) => {\n await queryClient.cancelQueries({ queryKey });\n const previous = queryClient.getQueryData<Todo[]>(queryKey);\n queryClient.setQueryData<Todo[]>(queryKey, (current) =>\n (current ?? []).map((todo) =>\n todo.id === id\n ? {\n ...todo,\n completedAt: completed ? new Date().toISOString() : null,\n }\n : todo,\n ),\n );\n return { previous };\n },\n onSuccess: (updated, { completed }) => {\n queryClient.setQueryData<Todo[]>(queryKey, (current) =>\n (current ?? []).map((todo) =>\n todo.id === updated.id ? updated : todo,\n ),\n );\n // Match the documented test plan: completing toasts, un-completing\n // is silent. The widget today only ever fires completed=true, but\n // gating here keeps the contract honest for any future caller that\n // toggles either direction.\n if (completed) {\n fluidToast({ title: \"Todo completed\", type: \"success\" });\n }\n },\n onError: (_error, _variables, context) => {\n if (context?.previous) {\n queryClient.setQueryData(queryKey, context.previous);\n }\n fluidToast({ title: \"Failed to update todo\", type: \"error\" });\n },\n // Belt-and-suspenders refetch to reconcile any race we couldn't see\n // (e.g., a different tab mutated the same todo). Cheap — one GET per\n // toggle.\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Check, ChevronsUpDown, Search } from \"lucide-react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n PortalContainerProvider,\n} from \"@fluid-app/ui-primitives\";\nimport { useInfiniteContacts } from \"@fluid-app/contacts-core/hooks/use-infinite-contacts\";\nimport { useContactsTranslation } from \"@fluid-app/contacts-core/translation-api-context\";\nimport type { Contact } from \"@fluid-app/contacts-core/types\";\nimport { TaskComposerForm } from \"@fluid-app/contacts-ui/portal/components/tasks/task-composer-form\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { todosQueryKey } from \"../hooks/use-todos\";\n\nconst SEARCH_DEBOUNCE_MS = 200;\n\nexport interface CreateTodoDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function CreateTodoDialog({\n open,\n onOpenChange,\n}: CreateTodoDialogProps): React.JSX.Element {\n const queryClient = useQueryClient();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n const [selectedContact, setSelectedContact] = useState<Contact | null>(null);\n // Anchor the popover's portal inside the dialog. Dialog applies\n // pointer-events: none to the body while open, which kills clicks and\n // scroll on a body-portaled popover in WebKit. See edit-bill-date-dialog\n // for the canonical pattern.\n const [popoverContainer, setPopoverContainer] =\n useState<HTMLDivElement | null>(null);\n\n // Reset state when the dialog closes so the next open starts fresh.\n useEffect(() => {\n if (!open) setSelectedContact(null);\n }, [open]);\n\n const handleDone = () => {\n queryClient.invalidateQueries({\n queryKey: todosQueryKey({ baseUrl, isPreview }),\n });\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"gap-4 p-4 sm:max-w-md sm:gap-6 sm:p-6\">\n <DialogHeader>\n <DialogTitle>Add a to-do</DialogTitle>\n </DialogHeader>\n\n <PortalContainerProvider container={popoverContainer}>\n <div className=\"mt-2 flex flex-col gap-3\">\n <ContactPicker\n value={selectedContact}\n onSelect={setSelectedContact}\n />\n\n {selectedContact && (\n <TaskComposerForm\n key={selectedContact.id}\n contactId={String(selectedContact.id)}\n onDone={handleDone}\n />\n )}\n </div>\n </PortalContainerProvider>\n {/* Portal target for the popover. Must live INSIDE DialogContent so\n it ends up in the dialog's body-level portal — otherwise it\n renders inline next to the widget, and any transformed ancestor\n (builder canvas zoom, etc.) would break `position: fixed`.\n Intentionally NOT aria-hidden — the popover content portaled\n into this container has its own listbox/option semantics that\n screen readers need to reach. `pointer-events-none` keeps the\n empty overlay from capturing clicks; the popover content sets\n `pointer-events-auto` so it remains interactive. */}\n <div\n ref={setPopoverContainer}\n className=\"pointer-events-none fixed inset-0 z-[9998]\"\n />\n </DialogContent>\n </Dialog>\n );\n}\n\ninterface ContactPickerProps {\n value: Contact | null;\n onSelect: (contact: Contact) => void;\n}\n\nfunction ContactPicker({\n value,\n onSelect,\n}: ContactPickerProps): React.JSX.Element {\n const { t } = useContactsTranslation();\n const [open, setOpen] = useState(false);\n const [searchInput, setSearchInput] = useState(\"\");\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handle = window.setTimeout(() => {\n setDebouncedSearch(searchInput.trim());\n }, SEARCH_DEBOUNCE_MS);\n return () => window.clearTimeout(handle);\n }, [searchInput]);\n\n const queryParams = useMemo(\n () => ({\n ...(debouncedSearch ? { search_query: debouncedSearch } : {}),\n sort_by: \"full_name\",\n sort_direction: \"asc\",\n per_page: 25,\n }),\n [debouncedSearch],\n );\n\n const {\n data,\n isLoading,\n isError,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useInfiniteContacts(queryParams);\n\n const contacts: Contact[] = useMemo(\n () => data?.pages.flatMap((page) => page.contacts ?? []) ?? [],\n [data],\n );\n\n // Auto-load the next page when the sentinel scrolls into view, so reps\n // with many contacts can reach all of them without typing a precise\n // search query.\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel || !hasNextPage) return;\n\n const observer = new IntersectionObserver((entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting && !isFetchingNextPage) {\n fetchNextPage();\n }\n });\n\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-muted-foreground text-xs font-medium\">\n {t(\"contact_label\")}\n </label>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n className=\"border-input bg-background hover:bg-muted/40 flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm transition-colors\"\n >\n <span\n className={cn(\n \"truncate\",\n !value && \"text-muted-foreground font-normal\",\n )}\n >\n {value ? value.full_name : t(\"empty_select_contact\")}\n </span>\n <ChevronsUpDown\n className=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"bg-popover text-popover-foreground pointer-events-auto z-[9999] w-(--radix-popover-trigger-width) overflow-hidden rounded-md border p-0 shadow-md\"\n >\n <div className=\"border-border flex items-center gap-2 border-b px-3 py-2\">\n <Search\n className=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <Input\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder={t(\"search_placeholder\")}\n aria-label={t(\"search_placeholder\")}\n className=\"h-7 border-0 px-0 shadow-none focus-visible:ring-0\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\" role=\"listbox\">\n {isLoading ? (\n <div className=\"text-muted-foreground px-3 py-6 text-center text-xs\">\n {t(\"loading\")}\n </div>\n ) : isError ? (\n <div className=\"text-destructive px-3 py-6 text-center text-xs\">\n {t(\"error_loading_list\")}\n </div>\n ) : contacts.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-6 text-center text-xs\">\n {debouncedSearch\n ? t(\"no_contacts_search\", { term: debouncedSearch })\n : t(\"no_contacts_yet\")}\n </div>\n ) : (\n <>\n {contacts.map((contact) => {\n const isSelected = value?.id === contact.id;\n return (\n <button\n key={contact.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n onSelect(contact);\n setOpen(false);\n }}\n className=\"hover:bg-muted/50 flex w-full items-center justify-between gap-2 px-3 py-1.5 text-left text-sm transition-colors\"\n >\n <span className=\"truncate\">{contact.full_name}</span>\n {isSelected && (\n <Check\n className=\"text-primary size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n );\n })}\n {hasNextPage && (\n <div ref={sentinelRef} aria-hidden=\"true\" className=\"h-4\" />\n )}\n {isFetchingNextPage && (\n <div className=\"text-muted-foreground px-3 py-2 text-center text-xs\">\n {t(\"loading_more\")}\n </div>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n","import { useState, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n borderWidthClasses,\n borderColorClasses,\n getColorField,\n getFontSizeField,\n getPaddingField,\n} from \"../core/fields\";\nimport { ListChecks, Plus } from \"lucide-react\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { parseTaskBody } from \"@fluid-app/contacts-core/parse-task-body\";\nimport { useTodos } from \"../hooks/use-todos\";\nimport { useUpdateTodo } from \"../hooks/use-update-todo\";\nimport { ErrorState } from \"../components/error-state\";\nimport { CreateTodoDialog } from \"./CreateTodoDialog\";\n\ntype ToDoWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n titleText?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n\n // Content\n maxItems?: number;\n};\n\nexport function ToDoWidget({\n // Title defaults\n titleEnabled = true,\n titleText = \"To-Do\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n\n // Styling defaults\n background = {\n type: \"solid\",\n color: \"background\",\n },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n // Content defaults\n maxItems = 5,\n\n className,\n ...props\n}: ToDoWidgetProps): React.JSX.Element {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n const { data: todos = [], isLoading, isError } = useTodos();\n const updateTodo = useUpdateTodo();\n const { isPreview } = useWidgetPreviewContext();\n const [pendingIds, setPendingIds] = useState<Set<number>>(new Set());\n const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);\n\n const toggleTodo = (id: number, completed: boolean) => {\n if (isPreview || pendingIds.has(id)) return;\n setPendingIds((prev) => new Set(prev).add(id));\n updateTodo.mutate(\n { id, completed },\n {\n onSettled: () =>\n setPendingIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n }),\n },\n );\n };\n\n const activeTodos = todos.filter((todo) => !todo.completedAt);\n const todosToShow = activeTodos.slice(0, maxItems);\n const remainingCount = activeTodos.length - todosToShow.length;\n const isEmpty = activeTodos.length === 0;\n\n // Group todos by contactId so same-named contacts stay separate.\n const groupedTodos = todosToShow.reduce<\n {\n contactId: number | null;\n contactName: string | null;\n todos: typeof todosToShow;\n }[]\n >((groups, todo) => {\n const existing = groups.find((g) => g.contactId === todo.contactId);\n if (existing) {\n existing.todos.push(todo);\n } else {\n groups.push({\n contactId: todo.contactId,\n contactName: todo.contactName,\n todos: [todo],\n });\n }\n return groups;\n }, []);\n\n return (\n <div\n className={`overflow-hidden rounded-${borderRadius} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} bg-${backgroundColor} text-${textColor} p-${padding} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n {/* Header */}\n <div className=\"mb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {titleEnabled && titleText && (\n <h2\n className={`text-${titleFontSize} font-header font-bold text-${titleColor}`}\n >\n {titleText}\n </h2>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {!isEmpty && !isLoading && (\n <span className={`text-2xl font-bold text-${accentColor}`}>\n {activeTodos.length}\n </span>\n )}\n <div className={`flex size-10 shrink-0 items-center justify-center`}>\n <ListChecks className={`h-5 w-5 text-${accentColor}-foreground`} />\n </div>\n </div>\n </div>\n\n {/* Loading state */}\n {isLoading ? (\n <div className=\"flex min-h-[120px] items-center justify-center\">\n <div className=\"size-6 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n /* Error state */\n <ErrorState />\n ) : isEmpty ? (\n /* Empty state */\n <div className=\"flex flex-col items-center justify-center gap-3 py-8\">\n <p className={`text-center text-${textColor}/60`}>\n You&apos;ve got nothing else To-Do!\n </p>\n {!isPreview && (\n <button\n type=\"button\"\n onClick={() => setIsCreateDialogOpen(true)}\n className={`inline-flex items-center gap-1.5 rounded-full bg-${accentColor} text-${accentColor}-foreground hover:bg-${accentColor}/90 px-4 py-1.5 text-xs font-semibold transition-colors`}\n >\n <Plus className=\"size-3.5\" aria-hidden=\"true\" />\n Add to-do\n </button>\n )}\n </div>\n ) : (\n /* Todo List */\n <>\n <div className=\"flex flex-col gap-3\">\n {groupedTodos.map((group) => (\n <div\n key={group.contactId ?? \"__unassigned__\"}\n className=\"flex flex-col\"\n >\n {group.contactName && (\n <div\n className={`mb-1 text-xs font-semibold tracking-wide uppercase text-${textColor}/60`}\n >\n {group.contactName}\n </div>\n )}\n {group.todos.map((todo, index) => (\n <div\n key={todo.id}\n className={`flex items-center gap-3 py-2 ${\n index !== group.todos.length - 1\n ? `border-b border-${textColor}/10`\n : \"\"\n }`}\n >\n <input\n type=\"checkbox\"\n className={`h-5 w-5 rounded-full border-2 border-${textColor}/30 bg-transparent not-disabled:cursor-pointer disabled:cursor-not-allowed disabled:opacity-60`}\n checked={!!todo.completedAt}\n disabled={isPreview || pendingIds.has(todo.id)}\n onChange={(event) =>\n toggleTodo(todo.id, event.target.checked)\n }\n />\n <span className=\"line-clamp-1 flex-1 text-sm\">\n {parseTaskBody(todo.body).title}\n </span>\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"mt-2 flex items-center justify-between\">\n {remainingCount > 0 && (\n <span className={`text-sm text-${textColor}/50 underline`}>\n {remainingCount} more task{remainingCount > 1 ? \"s\" : \"\"}\n </span>\n )}\n <div className=\"ml-auto\">\n <button\n type=\"button\"\n onClick={() => setIsCreateDialogOpen(true)}\n disabled={isPreview}\n aria-label=\"Add to-do\"\n className={`flex h-8 w-8 items-center justify-center rounded-full transition-colors not-disabled:cursor-pointer hover:bg-${textColor}/10 disabled:opacity-60`}\n >\n <Plus className={`h-5 w-5 text-${textColor}/50`} />\n </button>\n </div>\n </div>\n </>\n )}\n\n {!isPreview && (\n <CreateTodoDialog\n open={isCreateDialogOpen}\n onOpenChange={setIsCreateDialogOpen}\n />\n )}\n </div>\n );\n}\n\nexport const toDoWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ToDoWidget\",\n displayName: \"To-Do Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Styling Tab - Title Group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the todo list\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"titleText\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the todo list\",\n defaultValue: \"To-Do\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling Tab - Design Group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color for todo items\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color used for count badge and icon\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n {\n key: \"maxItems\",\n label: \"Max Items\",\n type: \"number\",\n description: \"Maximum number of todo items to display\",\n min: 1,\n max: 20,\n step: 1,\n defaultValue: 5,\n tab: \"styling\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the widget container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Border width for the widget\",\n defaultValue: \"none\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Border color for the widget\",\n defaultValue: \"muted\",\n tab: \"styling\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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CL,OAAO;GACR;EACDA,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFA,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GACP,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,KAAK;GACL,MAAM;GACN,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACDC,mBAAAA,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFC,mBAAAA,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFC,mBAAAA,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFC,mBAAAA,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACH;CACF"}
1
+ {"version":3,"file":"ToDoWidget-C3Ob2TP2.cjs","names":["useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","useWidgetsApi","useWidgetPreviewContext","useDataSourceRegistryConfig","useWidgetPreviewContext","useDataSourceRegistryConfig","Dialog","DialogContent","DialogHeader","DialogTitle","PortalContainerProvider","TaskComposerForm","useContactsTranslation","useInfiniteContacts","Popover","PopoverTrigger","cn","ChevronsUpDown","PopoverContent","Search","Input","Check","useWidgetPreviewContext","borderWidthClasses","borderColorClasses","ListChecks","ErrorState","Plus","parseTaskBody","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField"],"sources":["../../widgets/src/hooks/use-todos.preview.ts","../../widgets/src/hooks/use-todos.ts","../../widgets/src/hooks/use-update-todo.ts","../../widgets/src/widgets/CreateTodoDialog.tsx","../../widgets/src/widgets/ToDoWidget.tsx"],"sourcesContent":["import type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\n\nconst now = new Date();\n\nfunction daysFromNow(days: number): string {\n const d = new Date(now);\n d.setDate(d.getDate() + days);\n return d.toISOString();\n}\n\nexport const PREVIEW_DATA: Todo[] = [\n {\n id: 1,\n body: \"Send follow-up email to new leads\",\n dueAt: daysFromNow(1),\n completedAt: null,\n createdAt: daysFromNow(-2),\n contactId: 101,\n contactName: \"Sarah Johnson\",\n },\n {\n id: 2,\n body: \"Prepare slides for team training\",\n dueAt: daysFromNow(3),\n completedAt: null,\n createdAt: daysFromNow(-1),\n contactId: null,\n contactName: null,\n },\n {\n id: 3,\n body: \"Review monthly sales report\",\n dueAt: daysFromNow(-1),\n completedAt: null,\n createdAt: daysFromNow(-5),\n contactId: 102,\n contactName: \"Mike Chen\",\n },\n];\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { PREVIEW_DATA } from \"./use-todos.preview\";\nimport type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\n\nexport type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\n\n/**\n * Shared cache key for the todos list. Both useTodos (read) and\n * useUpdateTodo (write) use this — drift would silently break optimistic\n * updates.\n */\nexport function todosQueryKey(args: {\n baseUrl: string | undefined;\n isPreview: boolean;\n}) {\n return [\n \"portal-widget-use\",\n \"todos\",\n args.isPreview ? \"preview\" : args.baseUrl,\n ] as const;\n}\n\nexport function useTodos(): UseQueryResult<Todo[], Error> {\n const widgetsApi = useWidgetsApi();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n\n return useQuery({\n queryKey: todosQueryKey({ baseUrl, isPreview }),\n queryFn: ({ signal }) => widgetsApi.fetchTodos(signal),\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { useWidgetsApi } from \"@fluid-app/portal-core/widgets-api-context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport type { Todo } from \"@fluid-app/portal-core/widgets-api-types\";\nimport { todosQueryKey } from \"./use-todos\";\n\ntype UpdateVariables = { id: number; completed: boolean };\n\nexport function useUpdateTodo() {\n const widgetsApi = useWidgetsApi();\n const queryClient = useQueryClient();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n\n const queryKey = todosQueryKey({ baseUrl, isPreview });\n\n return useMutation({\n mutationFn: ({ id, completed }: UpdateVariables) => {\n // Defense in depth: ToDoWidget already disables the checkbox in\n // preview mode, but if any other caller fires this mutation while\n // previewing we'd PATCH demo data on the real backend. Fail closed.\n if (isPreview) {\n return Promise.reject(\n new Error(\"Todo updates are disabled in preview mode\"),\n );\n }\n return widgetsApi.updateTodo(id, completed);\n },\n onMutate: async ({ id, completed }) => {\n await queryClient.cancelQueries({ queryKey });\n const previous = queryClient.getQueryData<Todo[]>(queryKey);\n queryClient.setQueryData<Todo[]>(queryKey, (current) =>\n (current ?? []).map((todo) =>\n todo.id === id\n ? {\n ...todo,\n completedAt: completed ? new Date().toISOString() : null,\n }\n : todo,\n ),\n );\n return { previous };\n },\n onSuccess: (updated, { completed }) => {\n queryClient.setQueryData<Todo[]>(queryKey, (current) =>\n (current ?? []).map((todo) =>\n todo.id === updated.id ? updated : todo,\n ),\n );\n // Match the documented test plan: completing toasts, un-completing\n // is silent. The widget today only ever fires completed=true, but\n // gating here keeps the contract honest for any future caller that\n // toggles either direction.\n if (completed) {\n fluidToast({ title: \"Todo completed\", type: \"success\" });\n }\n },\n onError: (_error, _variables, context) => {\n if (context?.previous) {\n queryClient.setQueryData(queryKey, context.previous);\n }\n fluidToast({ title: \"Failed to update todo\", type: \"error\" });\n },\n // Belt-and-suspenders refetch to reconcile any race we couldn't see\n // (e.g., a different tab mutated the same todo). Cheap — one GET per\n // toggle.\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Check, ChevronsUpDown, Search } from \"lucide-react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n PortalContainerProvider,\n} from \"@fluid-app/ui-primitives\";\nimport { useInfiniteContacts } from \"@fluid-app/contacts-core/hooks/use-infinite-contacts\";\nimport { useContactsTranslation } from \"@fluid-app/contacts-core/translation-api-context\";\nimport type { Contact } from \"@fluid-app/contacts-core/types\";\nimport { TaskComposerForm } from \"@fluid-app/contacts-ui/portal/components/tasks/task-composer-form\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { useDataSourceRegistryConfig } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { todosQueryKey } from \"../hooks/use-todos\";\n\nconst SEARCH_DEBOUNCE_MS = 200;\n\nexport interface CreateTodoDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function CreateTodoDialog({\n open,\n onOpenChange,\n}: CreateTodoDialogProps): React.JSX.Element {\n const queryClient = useQueryClient();\n const { isPreview } = useWidgetPreviewContext();\n const { baseUrl } = useDataSourceRegistryConfig();\n const [selectedContact, setSelectedContact] = useState<Contact | null>(null);\n // Anchor the popover's portal inside the dialog. Dialog applies\n // pointer-events: none to the body while open, which kills clicks and\n // scroll on a body-portaled popover in WebKit. See edit-bill-date-dialog\n // for the canonical pattern.\n const [popoverContainer, setPopoverContainer] =\n useState<HTMLDivElement | null>(null);\n\n // Reset state when the dialog closes so the next open starts fresh.\n useEffect(() => {\n if (!open) setSelectedContact(null);\n }, [open]);\n\n const handleDone = () => {\n queryClient.invalidateQueries({\n queryKey: todosQueryKey({ baseUrl, isPreview }),\n });\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"gap-4 p-4 sm:max-w-md sm:gap-6 sm:p-6\">\n <DialogHeader>\n <DialogTitle>Add a to-do</DialogTitle>\n </DialogHeader>\n\n <PortalContainerProvider container={popoverContainer}>\n <div className=\"mt-2 flex flex-col gap-3\">\n <ContactPicker\n value={selectedContact}\n onSelect={setSelectedContact}\n />\n\n {selectedContact && (\n <TaskComposerForm\n key={selectedContact.id}\n contactId={String(selectedContact.id)}\n onDone={handleDone}\n />\n )}\n </div>\n </PortalContainerProvider>\n {/* Portal target for the popover. Must live INSIDE DialogContent so\n it ends up in the dialog's body-level portal — otherwise it\n renders inline next to the widget, and any transformed ancestor\n (builder canvas zoom, etc.) would break `position: fixed`.\n Intentionally NOT aria-hidden — the popover content portaled\n into this container has its own listbox/option semantics that\n screen readers need to reach. `pointer-events-none` keeps the\n empty overlay from capturing clicks; the popover content sets\n `pointer-events-auto` so it remains interactive. */}\n <div\n ref={setPopoverContainer}\n className=\"pointer-events-none fixed inset-0 z-[9998]\"\n />\n </DialogContent>\n </Dialog>\n );\n}\n\ninterface ContactPickerProps {\n value: Contact | null;\n onSelect: (contact: Contact) => void;\n}\n\nfunction ContactPicker({\n value,\n onSelect,\n}: ContactPickerProps): React.JSX.Element {\n const { t } = useContactsTranslation();\n const [open, setOpen] = useState(false);\n const [searchInput, setSearchInput] = useState(\"\");\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handle = window.setTimeout(() => {\n setDebouncedSearch(searchInput.trim());\n }, SEARCH_DEBOUNCE_MS);\n return () => window.clearTimeout(handle);\n }, [searchInput]);\n\n const queryParams = useMemo(\n () => ({\n ...(debouncedSearch ? { search_query: debouncedSearch } : {}),\n sort_by: \"full_name\",\n sort_direction: \"asc\",\n per_page: 25,\n }),\n [debouncedSearch],\n );\n\n const {\n data,\n isLoading,\n isError,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useInfiniteContacts(queryParams);\n\n const contacts: Contact[] = useMemo(\n () => data?.pages.flatMap((page) => page.contacts ?? []) ?? [],\n [data],\n );\n\n // Auto-load the next page when the sentinel scrolls into view, so reps\n // with many contacts can reach all of them without typing a precise\n // search query.\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel || !hasNextPage) return;\n\n const observer = new IntersectionObserver((entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting && !isFetchingNextPage) {\n fetchNextPage();\n }\n });\n\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-muted-foreground text-xs font-medium\">\n {t(\"contact_label\")}\n </label>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n className=\"border-input bg-background hover:bg-muted/40 flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm transition-colors\"\n >\n <span\n className={cn(\n \"truncate\",\n !value && \"text-muted-foreground font-normal\",\n )}\n >\n {value ? value.full_name : t(\"empty_select_contact\")}\n </span>\n <ChevronsUpDown\n className=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"bg-popover text-popover-foreground pointer-events-auto z-[9999] w-(--radix-popover-trigger-width) overflow-hidden rounded-md border p-0 shadow-md\"\n >\n <div className=\"border-border flex items-center gap-2 border-b px-3 py-2\">\n <Search\n className=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <Input\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder={t(\"search_placeholder\")}\n aria-label={t(\"search_placeholder\")}\n className=\"h-7 border-0 px-0 shadow-none focus-visible:ring-0\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\" role=\"listbox\">\n {isLoading ? (\n <div className=\"text-muted-foreground px-3 py-6 text-center text-xs\">\n {t(\"loading\")}\n </div>\n ) : isError ? (\n <div className=\"text-destructive px-3 py-6 text-center text-xs\">\n {t(\"error_loading_list\")}\n </div>\n ) : contacts.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-6 text-center text-xs\">\n {debouncedSearch\n ? t(\"no_contacts_search\", { term: debouncedSearch })\n : t(\"no_contacts_yet\")}\n </div>\n ) : (\n <>\n {contacts.map((contact) => {\n const isSelected = value?.id === contact.id;\n return (\n <button\n key={contact.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n onSelect(contact);\n setOpen(false);\n }}\n className=\"hover:bg-muted/50 flex w-full items-center justify-between gap-2 px-3 py-1.5 text-left text-sm transition-colors\"\n >\n <span className=\"truncate\">{contact.full_name}</span>\n {isSelected && (\n <Check\n className=\"text-primary size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n );\n })}\n {hasNextPage && (\n <div ref={sentinelRef} aria-hidden=\"true\" className=\"h-4\" />\n )}\n {isFetchingNextPage && (\n <div className=\"text-muted-foreground px-3 py-2 text-center text-xs\">\n {t(\"loading_more\")}\n </div>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n","import { useState, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n borderWidthClasses,\n borderColorClasses,\n getColorField,\n getFontSizeField,\n getPaddingField,\n} from \"../core/fields\";\nimport { ListChecks, Plus } from \"lucide-react\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-react/data-sources/preview-context\";\nimport { parseTaskBody } from \"@fluid-app/contacts-core/parse-task-body\";\nimport { useTodos } from \"../hooks/use-todos\";\nimport { useUpdateTodo } from \"../hooks/use-update-todo\";\nimport { ErrorState } from \"../components/error-state\";\nimport { CreateTodoDialog } from \"./CreateTodoDialog\";\n\ntype ToDoWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n titleText?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n\n // Content\n maxItems?: number;\n};\n\nexport function ToDoWidget({\n // Title defaults\n titleEnabled = true,\n titleText = \"To-Do\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n\n // Styling defaults\n background = {\n type: \"solid\",\n color: \"background\",\n },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n // Content defaults\n maxItems = 5,\n\n className,\n ...props\n}: ToDoWidgetProps): React.JSX.Element {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n const { data: todos = [], isLoading, isError } = useTodos();\n const updateTodo = useUpdateTodo();\n const { isPreview } = useWidgetPreviewContext();\n const [pendingIds, setPendingIds] = useState<Set<number>>(new Set());\n const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);\n\n const toggleTodo = (id: number, completed: boolean) => {\n if (isPreview || pendingIds.has(id)) return;\n setPendingIds((prev) => new Set(prev).add(id));\n updateTodo.mutate(\n { id, completed },\n {\n onSettled: () =>\n setPendingIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n }),\n },\n );\n };\n\n const activeTodos = todos.filter((todo) => !todo.completedAt);\n const todosToShow = activeTodos.slice(0, maxItems);\n const remainingCount = activeTodos.length - todosToShow.length;\n const isEmpty = activeTodos.length === 0;\n\n // Group todos by contactId so same-named contacts stay separate.\n const groupedTodos = todosToShow.reduce<\n {\n contactId: number | null;\n contactName: string | null;\n todos: typeof todosToShow;\n }[]\n >((groups, todo) => {\n const existing = groups.find((g) => g.contactId === todo.contactId);\n if (existing) {\n existing.todos.push(todo);\n } else {\n groups.push({\n contactId: todo.contactId,\n contactName: todo.contactName,\n todos: [todo],\n });\n }\n return groups;\n }, []);\n\n return (\n <div\n className={`overflow-hidden rounded-${borderRadius} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} bg-${backgroundColor} text-${textColor} p-${padding} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n {/* Header */}\n <div className=\"mb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {titleEnabled && titleText && (\n <h2\n className={`text-${titleFontSize} font-header font-bold text-${titleColor}`}\n >\n {titleText}\n </h2>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {!isEmpty && !isLoading && (\n <span className={`text-2xl font-bold text-${accentColor}`}>\n {activeTodos.length}\n </span>\n )}\n <div className={`flex size-10 shrink-0 items-center justify-center`}>\n <ListChecks className={`h-5 w-5 text-${accentColor}-foreground`} />\n </div>\n </div>\n </div>\n\n {/* Loading state */}\n {isLoading ? (\n <div className=\"flex min-h-[120px] items-center justify-center\">\n <div className=\"size-6 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n /* Error state */\n <ErrorState />\n ) : isEmpty ? (\n /* Empty state */\n <div className=\"flex flex-col items-center justify-center gap-3 py-8\">\n <p className={`text-center text-${textColor}/60`}>\n You&apos;ve got nothing else To-Do!\n </p>\n {!isPreview && (\n <button\n type=\"button\"\n onClick={() => setIsCreateDialogOpen(true)}\n className={`inline-flex items-center gap-1.5 rounded-full bg-${accentColor} text-${accentColor}-foreground hover:bg-${accentColor}/90 px-4 py-1.5 text-xs font-semibold transition-colors`}\n >\n <Plus className=\"size-3.5\" aria-hidden=\"true\" />\n Add to-do\n </button>\n )}\n </div>\n ) : (\n /* Todo List */\n <>\n <div className=\"flex flex-col gap-3\">\n {groupedTodos.map((group) => (\n <div\n key={group.contactId ?? \"__unassigned__\"}\n className=\"flex flex-col\"\n >\n {group.contactName && (\n <div\n className={`mb-1 text-xs font-semibold tracking-wide uppercase text-${textColor}/60`}\n >\n {group.contactName}\n </div>\n )}\n {group.todos.map((todo, index) => (\n <div\n key={todo.id}\n className={`flex items-center gap-3 py-2 ${\n index !== group.todos.length - 1\n ? `border-b border-${textColor}/10`\n : \"\"\n }`}\n >\n <input\n type=\"checkbox\"\n className={`h-5 w-5 rounded-full border-2 border-${textColor}/30 bg-transparent not-disabled:cursor-pointer disabled:cursor-not-allowed disabled:opacity-60`}\n checked={!!todo.completedAt}\n disabled={isPreview || pendingIds.has(todo.id)}\n onChange={(event) =>\n toggleTodo(todo.id, event.target.checked)\n }\n />\n <span className=\"line-clamp-1 flex-1 text-sm\">\n {parseTaskBody(todo.body).title}\n </span>\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"mt-2 flex items-center justify-between\">\n {remainingCount > 0 && (\n <span className={`text-sm text-${textColor}/50 underline`}>\n {remainingCount} more task{remainingCount > 1 ? \"s\" : \"\"}\n </span>\n )}\n <div className=\"ml-auto\">\n <button\n type=\"button\"\n onClick={() => setIsCreateDialogOpen(true)}\n disabled={isPreview}\n aria-label=\"Add to-do\"\n className={`flex h-8 w-8 items-center justify-center rounded-full transition-colors not-disabled:cursor-pointer hover:bg-${textColor}/10 disabled:opacity-60`}\n >\n <Plus className={`h-5 w-5 text-${textColor}/50`} />\n </button>\n </div>\n </div>\n </>\n )}\n\n {!isPreview && (\n <CreateTodoDialog\n open={isCreateDialogOpen}\n onOpenChange={setIsCreateDialogOpen}\n />\n )}\n </div>\n );\n}\n\nexport const toDoWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ToDoWidget\",\n displayName: \"To-Do Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Styling Tab - Title Group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the todo list\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"titleText\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the todo list\",\n defaultValue: \"To-Do\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling Tab - Design Group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color for todo items\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color used for count badge and icon\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n {\n key: \"maxItems\",\n label: \"Max Items\",\n type: \"number\",\n description: \"Maximum number of todo items to display\",\n min: 1,\n max: 20,\n step: 1,\n defaultValue: 5,\n tab: \"styling\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the widget container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Border width for the widget\",\n defaultValue: \"none\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Border color for the widget\",\n defaultValue: \"muted\",\n tab: \"styling\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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CL,OAAO;GACR;EACDA,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFA,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GACP,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,KAAK;GACL,MAAM;GACN,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACDC,mBAAAA,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFC,mBAAAA,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFC,mBAAAA,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACFC,mBAAAA,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EACH;CACF"}
@@ -1,6 +1,6 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- const require_static_dict_adapter = require("./static-dict-adapter-JAau5LHb.cjs");
3
- const require_translation_api_context_factory = require("./translation-api-context-factory-BSRK6Z50.cjs");
2
+ const require_static_dict_adapter = require("./static-dict-adapter-BLq4QzCI.cjs");
3
+ const require_translation_api_context_factory = require("./translation-api-context-factory-CjRDqIhF.cjs");
4
4
  const require_src = require("./src-Cx7UyT_c.cjs");
5
5
  let react = require("react");
6
6
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -201,4 +201,4 @@ Object.defineProperty(exports, "upgradeScreenPropertySchema", {
201
201
  }
202
202
  });
203
203
 
204
- //# sourceMappingURL=UpgradeScreen-VpfRqKdO.cjs.map
204
+ //# sourceMappingURL=UpgradeScreen-B40dCeub.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UpgradeScreen-VpfRqKdO.cjs","names":["createTranslationContext","Sparkles","Phone","MessagesSquare","CalendarMinus","MessageSquareHeart","Card","CardHeader","CardTitle","CardDescription","Button","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict"],"sources":["../../pro-upgrade-ui/src/translation-api-context.ts","../../pro-upgrade-ui/src/lib/cn.ts","../../pro-upgrade-ui/src/components/PortalProUpgradeScreen.tsx","../../pro-upgrade-ui/src/translation-dictionary.ts","../../pro-upgrade-ui/src/translation-adapter.ts","../src/providers/UpgradeTranslationBridge.tsx","../src/screens/UpgradeScreen.tsx"],"sourcesContent":["import { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { UpgradeDict } from \"./translation-dictionary\";\n\nconst { Provider, useTranslation } =\n createTranslationContext<UpgradeDict>(\"Upgrade\");\n\nexport const UpgradeTranslationProvider = Provider;\nexport const useUpgradeTranslation = useTranslation;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import {\n Sparkles,\n Phone,\n MessagesSquare,\n CalendarMinus,\n MessageSquareHeart,\n type LucideIcon,\n} from \"lucide-react\";\nimport {\n Button,\n Card,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { useUpgradeTranslation } from \"../translation-api-context\";\nimport { cn } from \"../lib/cn\";\n\nexport interface PortalProUpgradeScreenProps {\n onJoinWaitlist: () => void;\n waitlistLoading?: boolean;\n className?: string;\n}\n\ninterface Feature {\n icon: LucideIcon;\n titleKey:\n | \"feature_generative_ai_title\"\n | \"feature_business_phone_title\"\n | \"feature_mass_messaging_title\"\n | \"feature_scheduled_messages_title\"\n | \"feature_unified_messaging_title\";\n descriptionKey:\n | \"feature_generative_ai_description\"\n | \"feature_business_phone_description\"\n | \"feature_mass_messaging_description\"\n | \"feature_scheduled_messages_description\"\n | \"feature_unified_messaging_description\";\n}\n\nconst FEATURES: Feature[] = [\n {\n icon: Sparkles,\n titleKey: \"feature_generative_ai_title\",\n descriptionKey: \"feature_generative_ai_description\",\n },\n {\n icon: Phone,\n titleKey: \"feature_business_phone_title\",\n descriptionKey: \"feature_business_phone_description\",\n },\n {\n icon: MessagesSquare,\n titleKey: \"feature_mass_messaging_title\",\n descriptionKey: \"feature_mass_messaging_description\",\n },\n {\n icon: CalendarMinus,\n titleKey: \"feature_scheduled_messages_title\",\n descriptionKey: \"feature_scheduled_messages_description\",\n },\n {\n icon: MessageSquareHeart,\n titleKey: \"feature_unified_messaging_title\",\n descriptionKey: \"feature_unified_messaging_description\",\n },\n];\n\nfunction FeatureCard({ icon: Icon, titleKey, descriptionKey }: Feature) {\n const { t } = useUpgradeTranslation();\n return (\n <Card className=\"bg-background text-foreground h-auto gap-0 border-none py-4\">\n <CardHeader className=\"gap-3 px-4\">\n <Icon className=\"size-6\" strokeWidth={1.5} />\n <CardTitle className=\"text-sm font-bold\">{t(titleKey)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {t(descriptionKey)}\n </CardDescription>\n </CardHeader>\n </Card>\n );\n}\n\nexport function PortalProUpgradeScreen({\n onJoinWaitlist,\n waitlistLoading = false,\n className,\n}: PortalProUpgradeScreenProps) {\n const { t } = useUpgradeTranslation();\n\n return (\n <div\n className={cn(\n \"relative flex h-full w-full flex-col overflow-hidden md:flex-row\",\n className,\n )}\n >\n {/* Pastel gradient background */}\n <div className=\"pointer-events-none absolute inset-0 rounded-xl bg-linear-[33deg,rgba(8,148,255,0.2)_4.5%,rgba(201,89,221,0.2)_24.5%,rgba(255,46,84,0.2)_54.6%,rgba(255,144,4,0.2)_69.2%,rgba(255,255,255,0.2)_76.4%] blur-[125px]\" />\n\n {/* Hero collage - absolute, behind everything, fades right and bottom */}\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/HW87RR/hero-collage_O6DCdkFib.png\"\n alt={t(\"hero_alt\")}\n className=\"pointer-events-none absolute top-0 left-0 h-full w-full mask-b-from-20% mask-b-to-30% object-contain object-left-top md:w-4/5 md:mask-r-from-50% md:mask-r-to-70% md:mask-b-from-60% md:mask-b-to-80%\"\n />\n\n {/* Left Section - Logo & CTA */}\n <div className=\"relative flex w-full shrink-0 flex-col items-center justify-end px-8 pt-40 md:w-1/2 md:pt-0 md:pb-10\">\n <div className=\"flex flex-col items-center gap-4\">\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/ZYT78J/co-founder-badge_NcorZNlUY.png\"\n alt={t(\"badge_alt\")}\n className=\"h-auto w-120 object-contain\"\n />\n {/* TODO: This is currently hidden until we actually have a way to waitlist someone */}\n <Button\n className=\"hidden w-full md:w-auto\"\n size=\"xl\"\n onClick={onJoinWaitlist}\n disabled={waitlistLoading}\n >\n {waitlistLoading ? t(\"joining_waitlist\") : t(\"join_waitlist\")}\n </Button>\n </div>\n </div>\n\n {/* Right Section - Content */}\n <div className=\"relative flex min-w-0 flex-1 flex-col gap-6 overflow-y-auto px-8 pt-8 md:pt-16 md:pr-5 md:pb-5 md:pl-10\">\n <div className=\"flex shrink-0 flex-col gap-2.5\">\n <h1 className=\"text-3xl leading-tight font-semibold tracking-tight text-black md:text-5xl\">\n {t(\"heading_line1\")}\n <br />\n {t(\"heading_line2\")}\n </h1>\n <p className=\"text-sm leading-5 font-medium text-black\">\n {t(\"subheading\")}\n </p>\n </div>\n <div className=\"flex flex-col gap-4 pb-4\">\n {FEATURES.map((feature) => (\n <FeatureCard key={feature.titleKey} {...feature} />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","export const upgradeEn = {\n heading_line1: \"It's like having an\",\n heading_line2: \"assistant in your pocket\",\n subheading: \"Upgrade your business\",\n join_waitlist: \"Join Waitlist\",\n joining_waitlist: \"Joining...\",\n hero_alt: \"People using the app with push notifications\",\n badge_alt: \"Coming Soon - Co-Founder\",\n feature_generative_ai_title: \"Generative AI\",\n feature_generative_ai_description:\n \"Get quick drafts and creative messaging help.\",\n feature_business_phone_title: \"Business phone number\",\n feature_business_phone_description:\n \"Look professional with a dedicated client line.\",\n feature_mass_messaging_title: \"Mass Messaging\",\n feature_mass_messaging_description:\n \"Save time by messaging multiple clients at once.\",\n feature_scheduled_messages_title: \"Scheduled messages\",\n feature_scheduled_messages_description:\n \"Plan ahead and schedule messages easily.\",\n feature_unified_messaging_title: \"Unified messaging\",\n feature_unified_messaging_description:\n \"Combine email, SMS, and internal messages.\",\n} as const satisfies Record<string, string>;\n\nexport type UpgradeDict = typeof upgradeEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { upgradeEn, type UpgradeDict } from \"./translation-dictionary\";\n\nexport const upgradeDomain: DomainTranslations<UpgradeDict> =\n createDomainTranslations<UpgradeDict>({\n fallback: upgradeEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n },\n });\n\nexport function createUpgradeTranslationAdapter(\n locale: string,\n dict: UpgradeDict,\n): TranslationApi<UpgradeDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n upgradeDomain,\n createUpgradeTranslationAdapter,\n} from \"@fluid-app/portal-pro-upgrade-ui/translation-adapter\";\nimport { UpgradeTranslationProvider } from \"@fluid-app/portal-pro-upgrade-ui/translation-api-context\";\n\nexport function UpgradeTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(upgradeDomain, locale);\n const api = useMemo(\n () => createUpgradeTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <UpgradeTranslationProvider value={api}>\n {children}\n </UpgradeTranslationProvider>\n );\n}\n","import type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { PortalProUpgradeScreen } from \"@fluid-app/portal-pro-upgrade-ui\";\nimport { UpgradeTranslationBridge } from \"../providers/UpgradeTranslationBridge\";\n\nexport const upgradeScreenPropertySchema = {\n widgetType: \"UpgradeScreen\",\n displayName: \"Upgrade Screen\",\n fields: [],\n} as const satisfies WidgetPropertySchema;\n\nexport function UpgradeScreen(): React.JSX.Element {\n return (\n <UpgradeTranslationBridge>\n <PortalProUpgradeScreen\n onJoinWaitlist={() => {\n // TODO: Wire up to waitlist API\n }}\n />\n </UpgradeTranslationBridge>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"UpgradeScreen-B40dCeub.cjs","names":["createTranslationContext","Sparkles","Phone","MessagesSquare","CalendarMinus","MessageSquareHeart","Card","CardHeader","CardTitle","CardDescription","Button","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict"],"sources":["../../pro-upgrade-ui/src/translation-api-context.ts","../../pro-upgrade-ui/src/lib/cn.ts","../../pro-upgrade-ui/src/components/PortalProUpgradeScreen.tsx","../../pro-upgrade-ui/src/translation-dictionary.ts","../../pro-upgrade-ui/src/translation-adapter.ts","../src/providers/UpgradeTranslationBridge.tsx","../src/screens/UpgradeScreen.tsx"],"sourcesContent":["import { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { UpgradeDict } from \"./translation-dictionary\";\n\nconst { Provider, useTranslation } =\n createTranslationContext<UpgradeDict>(\"Upgrade\");\n\nexport const UpgradeTranslationProvider = Provider;\nexport const useUpgradeTranslation = useTranslation;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import {\n Sparkles,\n Phone,\n MessagesSquare,\n CalendarMinus,\n MessageSquareHeart,\n type LucideIcon,\n} from \"lucide-react\";\nimport {\n Button,\n Card,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { useUpgradeTranslation } from \"../translation-api-context\";\nimport { cn } from \"../lib/cn\";\n\nexport interface PortalProUpgradeScreenProps {\n onJoinWaitlist: () => void;\n waitlistLoading?: boolean;\n className?: string;\n}\n\ninterface Feature {\n icon: LucideIcon;\n titleKey:\n | \"feature_generative_ai_title\"\n | \"feature_business_phone_title\"\n | \"feature_mass_messaging_title\"\n | \"feature_scheduled_messages_title\"\n | \"feature_unified_messaging_title\";\n descriptionKey:\n | \"feature_generative_ai_description\"\n | \"feature_business_phone_description\"\n | \"feature_mass_messaging_description\"\n | \"feature_scheduled_messages_description\"\n | \"feature_unified_messaging_description\";\n}\n\nconst FEATURES: Feature[] = [\n {\n icon: Sparkles,\n titleKey: \"feature_generative_ai_title\",\n descriptionKey: \"feature_generative_ai_description\",\n },\n {\n icon: Phone,\n titleKey: \"feature_business_phone_title\",\n descriptionKey: \"feature_business_phone_description\",\n },\n {\n icon: MessagesSquare,\n titleKey: \"feature_mass_messaging_title\",\n descriptionKey: \"feature_mass_messaging_description\",\n },\n {\n icon: CalendarMinus,\n titleKey: \"feature_scheduled_messages_title\",\n descriptionKey: \"feature_scheduled_messages_description\",\n },\n {\n icon: MessageSquareHeart,\n titleKey: \"feature_unified_messaging_title\",\n descriptionKey: \"feature_unified_messaging_description\",\n },\n];\n\nfunction FeatureCard({ icon: Icon, titleKey, descriptionKey }: Feature) {\n const { t } = useUpgradeTranslation();\n return (\n <Card className=\"bg-background text-foreground h-auto gap-0 border-none py-4\">\n <CardHeader className=\"gap-3 px-4\">\n <Icon className=\"size-6\" strokeWidth={1.5} />\n <CardTitle className=\"text-sm font-bold\">{t(titleKey)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {t(descriptionKey)}\n </CardDescription>\n </CardHeader>\n </Card>\n );\n}\n\nexport function PortalProUpgradeScreen({\n onJoinWaitlist,\n waitlistLoading = false,\n className,\n}: PortalProUpgradeScreenProps) {\n const { t } = useUpgradeTranslation();\n\n return (\n <div\n className={cn(\n \"relative flex h-full w-full flex-col overflow-hidden md:flex-row\",\n className,\n )}\n >\n {/* Pastel gradient background */}\n <div className=\"pointer-events-none absolute inset-0 rounded-xl bg-linear-[33deg,rgba(8,148,255,0.2)_4.5%,rgba(201,89,221,0.2)_24.5%,rgba(255,46,84,0.2)_54.6%,rgba(255,144,4,0.2)_69.2%,rgba(255,255,255,0.2)_76.4%] blur-[125px]\" />\n\n {/* Hero collage - absolute, behind everything, fades right and bottom */}\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/HW87RR/hero-collage_O6DCdkFib.png\"\n alt={t(\"hero_alt\")}\n className=\"pointer-events-none absolute top-0 left-0 h-full w-full mask-b-from-20% mask-b-to-30% object-contain object-left-top md:w-4/5 md:mask-r-from-50% md:mask-r-to-70% md:mask-b-from-60% md:mask-b-to-80%\"\n />\n\n {/* Left Section - Logo & CTA */}\n <div className=\"relative flex w-full shrink-0 flex-col items-center justify-end px-8 pt-40 md:w-1/2 md:pt-0 md:pb-10\">\n <div className=\"flex flex-col items-center gap-4\">\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/ZYT78J/co-founder-badge_NcorZNlUY.png\"\n alt={t(\"badge_alt\")}\n className=\"h-auto w-120 object-contain\"\n />\n {/* TODO: This is currently hidden until we actually have a way to waitlist someone */}\n <Button\n className=\"hidden w-full md:w-auto\"\n size=\"xl\"\n onClick={onJoinWaitlist}\n disabled={waitlistLoading}\n >\n {waitlistLoading ? t(\"joining_waitlist\") : t(\"join_waitlist\")}\n </Button>\n </div>\n </div>\n\n {/* Right Section - Content */}\n <div className=\"relative flex min-w-0 flex-1 flex-col gap-6 overflow-y-auto px-8 pt-8 md:pt-16 md:pr-5 md:pb-5 md:pl-10\">\n <div className=\"flex shrink-0 flex-col gap-2.5\">\n <h1 className=\"text-3xl leading-tight font-semibold tracking-tight text-black md:text-5xl\">\n {t(\"heading_line1\")}\n <br />\n {t(\"heading_line2\")}\n </h1>\n <p className=\"text-sm leading-5 font-medium text-black\">\n {t(\"subheading\")}\n </p>\n </div>\n <div className=\"flex flex-col gap-4 pb-4\">\n {FEATURES.map((feature) => (\n <FeatureCard key={feature.titleKey} {...feature} />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","export const upgradeEn = {\n heading_line1: \"It's like having an\",\n heading_line2: \"assistant in your pocket\",\n subheading: \"Upgrade your business\",\n join_waitlist: \"Join Waitlist\",\n joining_waitlist: \"Joining...\",\n hero_alt: \"People using the app with push notifications\",\n badge_alt: \"Coming Soon - Co-Founder\",\n feature_generative_ai_title: \"Generative AI\",\n feature_generative_ai_description:\n \"Get quick drafts and creative messaging help.\",\n feature_business_phone_title: \"Business phone number\",\n feature_business_phone_description:\n \"Look professional with a dedicated client line.\",\n feature_mass_messaging_title: \"Mass Messaging\",\n feature_mass_messaging_description:\n \"Save time by messaging multiple clients at once.\",\n feature_scheduled_messages_title: \"Scheduled messages\",\n feature_scheduled_messages_description:\n \"Plan ahead and schedule messages easily.\",\n feature_unified_messaging_title: \"Unified messaging\",\n feature_unified_messaging_description:\n \"Combine email, SMS, and internal messages.\",\n} as const satisfies Record<string, string>;\n\nexport type UpgradeDict = typeof upgradeEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { upgradeEn, type UpgradeDict } from \"./translation-dictionary\";\n\nexport const upgradeDomain: DomainTranslations<UpgradeDict> =\n createDomainTranslations<UpgradeDict>({\n fallback: upgradeEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n },\n });\n\nexport function createUpgradeTranslationAdapter(\n locale: string,\n dict: UpgradeDict,\n): TranslationApi<UpgradeDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n upgradeDomain,\n createUpgradeTranslationAdapter,\n} from \"@fluid-app/portal-pro-upgrade-ui/translation-adapter\";\nimport { UpgradeTranslationProvider } from \"@fluid-app/portal-pro-upgrade-ui/translation-api-context\";\n\nexport function UpgradeTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(upgradeDomain, locale);\n const api = useMemo(\n () => createUpgradeTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <UpgradeTranslationProvider value={api}>\n {children}\n </UpgradeTranslationProvider>\n );\n}\n","import type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { PortalProUpgradeScreen } from \"@fluid-app/portal-pro-upgrade-ui\";\nimport { UpgradeTranslationBridge } from \"../providers/UpgradeTranslationBridge\";\n\nexport const upgradeScreenPropertySchema = {\n widgetType: \"UpgradeScreen\",\n displayName: \"Upgrade Screen\",\n fields: [],\n} as const satisfies WidgetPropertySchema;\n\nexport function UpgradeScreen(): React.JSX.Element {\n return (\n <UpgradeTranslationBridge>\n <PortalProUpgradeScreen\n onJoinWaitlist={() => {\n // TODO: Wire up to waitlist API\n }}\n />\n </UpgradeTranslationBridge>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- require("./static-dict-adapter-JAau5LHb.cjs");
3
- require("./translation-api-context-factory-BSRK6Z50.cjs");
2
+ require("./static-dict-adapter-BLq4QzCI.cjs");
3
+ require("./translation-api-context-factory-CjRDqIhF.cjs");
4
4
  require("./src-Cx7UyT_c.cjs");
5
- const require_UpgradeScreen = require("./UpgradeScreen-VpfRqKdO.cjs");
5
+ const require_UpgradeScreen = require("./UpgradeScreen-B40dCeub.cjs");
6
6
  exports.UpgradeScreen = require_UpgradeScreen.UpgradeScreen;
7
7
  exports.upgradeScreenPropertySchema = require_UpgradeScreen.upgradeScreenPropertySchema;
@@ -1,6 +1,6 @@
1
- import { vt as __exportAll } from "./PortalTenantClientProvider-BmRtQAbi.mjs";
2
- import { a as useActiveLocale, n as createDomainTranslations, r as useDomainDict, t as createStaticDictAdapter } from "./static-dict-adapter-DjCpubZc.mjs";
3
- import { t as createTranslationContext } from "./translation-api-context-factory-CJrVq_EB.mjs";
1
+ import { vt as __exportAll } from "./PortalTenantClientProvider-DVClpfbi.mjs";
2
+ import { a as useActiveLocale, n as createDomainTranslations, r as useDomainDict, t as createStaticDictAdapter } from "./static-dict-adapter-DRBq3ndO.mjs";
3
+ import { t as createTranslationContext } from "./translation-api-context-factory-DFr9yJ6Q.mjs";
4
4
  import { Dt as CardHeader, Ot as CardTitle, St as Card, Tt as CardDescription, wn as Button } from "./src-CJw6JbdS.mjs";
5
5
  import { useMemo } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -194,4 +194,4 @@ function UpgradeScreen() {
194
194
  //#endregion
195
195
  export { UpgradeScreen_exports as t };
196
196
 
197
- //# sourceMappingURL=UpgradeScreen-x9TdC5aR.mjs.map
197
+ //# sourceMappingURL=UpgradeScreen-GzkZOOR4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UpgradeScreen-x9TdC5aR.mjs","names":[],"sources":["../../pro-upgrade-ui/src/translation-api-context.ts","../../pro-upgrade-ui/src/lib/cn.ts","../../pro-upgrade-ui/src/components/PortalProUpgradeScreen.tsx","../../pro-upgrade-ui/src/translation-dictionary.ts","../../pro-upgrade-ui/src/translation-adapter.ts","../src/providers/UpgradeTranslationBridge.tsx","../src/screens/UpgradeScreen.tsx"],"sourcesContent":["import { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { UpgradeDict } from \"./translation-dictionary\";\n\nconst { Provider, useTranslation } =\n createTranslationContext<UpgradeDict>(\"Upgrade\");\n\nexport const UpgradeTranslationProvider = Provider;\nexport const useUpgradeTranslation = useTranslation;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import {\n Sparkles,\n Phone,\n MessagesSquare,\n CalendarMinus,\n MessageSquareHeart,\n type LucideIcon,\n} from \"lucide-react\";\nimport {\n Button,\n Card,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { useUpgradeTranslation } from \"../translation-api-context\";\nimport { cn } from \"../lib/cn\";\n\nexport interface PortalProUpgradeScreenProps {\n onJoinWaitlist: () => void;\n waitlistLoading?: boolean;\n className?: string;\n}\n\ninterface Feature {\n icon: LucideIcon;\n titleKey:\n | \"feature_generative_ai_title\"\n | \"feature_business_phone_title\"\n | \"feature_mass_messaging_title\"\n | \"feature_scheduled_messages_title\"\n | \"feature_unified_messaging_title\";\n descriptionKey:\n | \"feature_generative_ai_description\"\n | \"feature_business_phone_description\"\n | \"feature_mass_messaging_description\"\n | \"feature_scheduled_messages_description\"\n | \"feature_unified_messaging_description\";\n}\n\nconst FEATURES: Feature[] = [\n {\n icon: Sparkles,\n titleKey: \"feature_generative_ai_title\",\n descriptionKey: \"feature_generative_ai_description\",\n },\n {\n icon: Phone,\n titleKey: \"feature_business_phone_title\",\n descriptionKey: \"feature_business_phone_description\",\n },\n {\n icon: MessagesSquare,\n titleKey: \"feature_mass_messaging_title\",\n descriptionKey: \"feature_mass_messaging_description\",\n },\n {\n icon: CalendarMinus,\n titleKey: \"feature_scheduled_messages_title\",\n descriptionKey: \"feature_scheduled_messages_description\",\n },\n {\n icon: MessageSquareHeart,\n titleKey: \"feature_unified_messaging_title\",\n descriptionKey: \"feature_unified_messaging_description\",\n },\n];\n\nfunction FeatureCard({ icon: Icon, titleKey, descriptionKey }: Feature) {\n const { t } = useUpgradeTranslation();\n return (\n <Card className=\"bg-background text-foreground h-auto gap-0 border-none py-4\">\n <CardHeader className=\"gap-3 px-4\">\n <Icon className=\"size-6\" strokeWidth={1.5} />\n <CardTitle className=\"text-sm font-bold\">{t(titleKey)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {t(descriptionKey)}\n </CardDescription>\n </CardHeader>\n </Card>\n );\n}\n\nexport function PortalProUpgradeScreen({\n onJoinWaitlist,\n waitlistLoading = false,\n className,\n}: PortalProUpgradeScreenProps) {\n const { t } = useUpgradeTranslation();\n\n return (\n <div\n className={cn(\n \"relative flex h-full w-full flex-col overflow-hidden md:flex-row\",\n className,\n )}\n >\n {/* Pastel gradient background */}\n <div className=\"pointer-events-none absolute inset-0 rounded-xl bg-linear-[33deg,rgba(8,148,255,0.2)_4.5%,rgba(201,89,221,0.2)_24.5%,rgba(255,46,84,0.2)_54.6%,rgba(255,144,4,0.2)_69.2%,rgba(255,255,255,0.2)_76.4%] blur-[125px]\" />\n\n {/* Hero collage - absolute, behind everything, fades right and bottom */}\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/HW87RR/hero-collage_O6DCdkFib.png\"\n alt={t(\"hero_alt\")}\n className=\"pointer-events-none absolute top-0 left-0 h-full w-full mask-b-from-20% mask-b-to-30% object-contain object-left-top md:w-4/5 md:mask-r-from-50% md:mask-r-to-70% md:mask-b-from-60% md:mask-b-to-80%\"\n />\n\n {/* Left Section - Logo & CTA */}\n <div className=\"relative flex w-full shrink-0 flex-col items-center justify-end px-8 pt-40 md:w-1/2 md:pt-0 md:pb-10\">\n <div className=\"flex flex-col items-center gap-4\">\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/ZYT78J/co-founder-badge_NcorZNlUY.png\"\n alt={t(\"badge_alt\")}\n className=\"h-auto w-120 object-contain\"\n />\n {/* TODO: This is currently hidden until we actually have a way to waitlist someone */}\n <Button\n className=\"hidden w-full md:w-auto\"\n size=\"xl\"\n onClick={onJoinWaitlist}\n disabled={waitlistLoading}\n >\n {waitlistLoading ? t(\"joining_waitlist\") : t(\"join_waitlist\")}\n </Button>\n </div>\n </div>\n\n {/* Right Section - Content */}\n <div className=\"relative flex min-w-0 flex-1 flex-col gap-6 overflow-y-auto px-8 pt-8 md:pt-16 md:pr-5 md:pb-5 md:pl-10\">\n <div className=\"flex shrink-0 flex-col gap-2.5\">\n <h1 className=\"text-3xl leading-tight font-semibold tracking-tight text-black md:text-5xl\">\n {t(\"heading_line1\")}\n <br />\n {t(\"heading_line2\")}\n </h1>\n <p className=\"text-sm leading-5 font-medium text-black\">\n {t(\"subheading\")}\n </p>\n </div>\n <div className=\"flex flex-col gap-4 pb-4\">\n {FEATURES.map((feature) => (\n <FeatureCard key={feature.titleKey} {...feature} />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","export const upgradeEn = {\n heading_line1: \"It's like having an\",\n heading_line2: \"assistant in your pocket\",\n subheading: \"Upgrade your business\",\n join_waitlist: \"Join Waitlist\",\n joining_waitlist: \"Joining...\",\n hero_alt: \"People using the app with push notifications\",\n badge_alt: \"Coming Soon - Co-Founder\",\n feature_generative_ai_title: \"Generative AI\",\n feature_generative_ai_description:\n \"Get quick drafts and creative messaging help.\",\n feature_business_phone_title: \"Business phone number\",\n feature_business_phone_description:\n \"Look professional with a dedicated client line.\",\n feature_mass_messaging_title: \"Mass Messaging\",\n feature_mass_messaging_description:\n \"Save time by messaging multiple clients at once.\",\n feature_scheduled_messages_title: \"Scheduled messages\",\n feature_scheduled_messages_description:\n \"Plan ahead and schedule messages easily.\",\n feature_unified_messaging_title: \"Unified messaging\",\n feature_unified_messaging_description:\n \"Combine email, SMS, and internal messages.\",\n} as const satisfies Record<string, string>;\n\nexport type UpgradeDict = typeof upgradeEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { upgradeEn, type UpgradeDict } from \"./translation-dictionary\";\n\nexport const upgradeDomain: DomainTranslations<UpgradeDict> =\n createDomainTranslations<UpgradeDict>({\n fallback: upgradeEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n },\n });\n\nexport function createUpgradeTranslationAdapter(\n locale: string,\n dict: UpgradeDict,\n): TranslationApi<UpgradeDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n upgradeDomain,\n createUpgradeTranslationAdapter,\n} from \"@fluid-app/portal-pro-upgrade-ui/translation-adapter\";\nimport { UpgradeTranslationProvider } from \"@fluid-app/portal-pro-upgrade-ui/translation-api-context\";\n\nexport function UpgradeTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(upgradeDomain, locale);\n const api = useMemo(\n () => createUpgradeTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <UpgradeTranslationProvider value={api}>\n {children}\n </UpgradeTranslationProvider>\n );\n}\n","import type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { PortalProUpgradeScreen } from \"@fluid-app/portal-pro-upgrade-ui\";\nimport { UpgradeTranslationBridge } from \"../providers/UpgradeTranslationBridge\";\n\nexport const upgradeScreenPropertySchema = {\n widgetType: \"UpgradeScreen\",\n displayName: \"Upgrade Screen\",\n fields: [],\n} as const satisfies WidgetPropertySchema;\n\nexport function UpgradeScreen(): React.JSX.Element {\n return (\n <UpgradeTranslationBridge>\n <PortalProUpgradeScreen\n onJoinWaitlist={() => {\n // TODO: Wire up to waitlist API\n }}\n />\n </UpgradeTranslationBridge>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"UpgradeScreen-GzkZOOR4.mjs","names":[],"sources":["../../pro-upgrade-ui/src/translation-api-context.ts","../../pro-upgrade-ui/src/lib/cn.ts","../../pro-upgrade-ui/src/components/PortalProUpgradeScreen.tsx","../../pro-upgrade-ui/src/translation-dictionary.ts","../../pro-upgrade-ui/src/translation-adapter.ts","../src/providers/UpgradeTranslationBridge.tsx","../src/screens/UpgradeScreen.tsx"],"sourcesContent":["import { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { UpgradeDict } from \"./translation-dictionary\";\n\nconst { Provider, useTranslation } =\n createTranslationContext<UpgradeDict>(\"Upgrade\");\n\nexport const UpgradeTranslationProvider = Provider;\nexport const useUpgradeTranslation = useTranslation;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import {\n Sparkles,\n Phone,\n MessagesSquare,\n CalendarMinus,\n MessageSquareHeart,\n type LucideIcon,\n} from \"lucide-react\";\nimport {\n Button,\n Card,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { useUpgradeTranslation } from \"../translation-api-context\";\nimport { cn } from \"../lib/cn\";\n\nexport interface PortalProUpgradeScreenProps {\n onJoinWaitlist: () => void;\n waitlistLoading?: boolean;\n className?: string;\n}\n\ninterface Feature {\n icon: LucideIcon;\n titleKey:\n | \"feature_generative_ai_title\"\n | \"feature_business_phone_title\"\n | \"feature_mass_messaging_title\"\n | \"feature_scheduled_messages_title\"\n | \"feature_unified_messaging_title\";\n descriptionKey:\n | \"feature_generative_ai_description\"\n | \"feature_business_phone_description\"\n | \"feature_mass_messaging_description\"\n | \"feature_scheduled_messages_description\"\n | \"feature_unified_messaging_description\";\n}\n\nconst FEATURES: Feature[] = [\n {\n icon: Sparkles,\n titleKey: \"feature_generative_ai_title\",\n descriptionKey: \"feature_generative_ai_description\",\n },\n {\n icon: Phone,\n titleKey: \"feature_business_phone_title\",\n descriptionKey: \"feature_business_phone_description\",\n },\n {\n icon: MessagesSquare,\n titleKey: \"feature_mass_messaging_title\",\n descriptionKey: \"feature_mass_messaging_description\",\n },\n {\n icon: CalendarMinus,\n titleKey: \"feature_scheduled_messages_title\",\n descriptionKey: \"feature_scheduled_messages_description\",\n },\n {\n icon: MessageSquareHeart,\n titleKey: \"feature_unified_messaging_title\",\n descriptionKey: \"feature_unified_messaging_description\",\n },\n];\n\nfunction FeatureCard({ icon: Icon, titleKey, descriptionKey }: Feature) {\n const { t } = useUpgradeTranslation();\n return (\n <Card className=\"bg-background text-foreground h-auto gap-0 border-none py-4\">\n <CardHeader className=\"gap-3 px-4\">\n <Icon className=\"size-6\" strokeWidth={1.5} />\n <CardTitle className=\"text-sm font-bold\">{t(titleKey)}</CardTitle>\n <CardDescription className=\"text-xs\">\n {t(descriptionKey)}\n </CardDescription>\n </CardHeader>\n </Card>\n );\n}\n\nexport function PortalProUpgradeScreen({\n onJoinWaitlist,\n waitlistLoading = false,\n className,\n}: PortalProUpgradeScreenProps) {\n const { t } = useUpgradeTranslation();\n\n return (\n <div\n className={cn(\n \"relative flex h-full w-full flex-col overflow-hidden md:flex-row\",\n className,\n )}\n >\n {/* Pastel gradient background */}\n <div className=\"pointer-events-none absolute inset-0 rounded-xl bg-linear-[33deg,rgba(8,148,255,0.2)_4.5%,rgba(201,89,221,0.2)_24.5%,rgba(255,46,84,0.2)_54.6%,rgba(255,144,4,0.2)_69.2%,rgba(255,255,255,0.2)_76.4%] blur-[125px]\" />\n\n {/* Hero collage - absolute, behind everything, fades right and bottom */}\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/HW87RR/hero-collage_O6DCdkFib.png\"\n alt={t(\"hero_alt\")}\n className=\"pointer-events-none absolute top-0 left-0 h-full w-full mask-b-from-20% mask-b-to-30% object-contain object-left-top md:w-4/5 md:mask-r-from-50% md:mask-r-to-70% md:mask-b-from-60% md:mask-b-to-80%\"\n />\n\n {/* Left Section - Logo & CTA */}\n <div className=\"relative flex w-full shrink-0 flex-col items-center justify-end px-8 pt-40 md:w-1/2 md:pt-0 md:pb-10\">\n <div className=\"flex flex-col items-center gap-4\">\n <img\n src=\"https://ik.imagekit.io/fluid/980191006/images/ZYT78J/co-founder-badge_NcorZNlUY.png\"\n alt={t(\"badge_alt\")}\n className=\"h-auto w-120 object-contain\"\n />\n {/* TODO: This is currently hidden until we actually have a way to waitlist someone */}\n <Button\n className=\"hidden w-full md:w-auto\"\n size=\"xl\"\n onClick={onJoinWaitlist}\n disabled={waitlistLoading}\n >\n {waitlistLoading ? t(\"joining_waitlist\") : t(\"join_waitlist\")}\n </Button>\n </div>\n </div>\n\n {/* Right Section - Content */}\n <div className=\"relative flex min-w-0 flex-1 flex-col gap-6 overflow-y-auto px-8 pt-8 md:pt-16 md:pr-5 md:pb-5 md:pl-10\">\n <div className=\"flex shrink-0 flex-col gap-2.5\">\n <h1 className=\"text-3xl leading-tight font-semibold tracking-tight text-black md:text-5xl\">\n {t(\"heading_line1\")}\n <br />\n {t(\"heading_line2\")}\n </h1>\n <p className=\"text-sm leading-5 font-medium text-black\">\n {t(\"subheading\")}\n </p>\n </div>\n <div className=\"flex flex-col gap-4 pb-4\">\n {FEATURES.map((feature) => (\n <FeatureCard key={feature.titleKey} {...feature} />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","export const upgradeEn = {\n heading_line1: \"It's like having an\",\n heading_line2: \"assistant in your pocket\",\n subheading: \"Upgrade your business\",\n join_waitlist: \"Join Waitlist\",\n joining_waitlist: \"Joining...\",\n hero_alt: \"People using the app with push notifications\",\n badge_alt: \"Coming Soon - Co-Founder\",\n feature_generative_ai_title: \"Generative AI\",\n feature_generative_ai_description:\n \"Get quick drafts and creative messaging help.\",\n feature_business_phone_title: \"Business phone number\",\n feature_business_phone_description:\n \"Look professional with a dedicated client line.\",\n feature_mass_messaging_title: \"Mass Messaging\",\n feature_mass_messaging_description:\n \"Save time by messaging multiple clients at once.\",\n feature_scheduled_messages_title: \"Scheduled messages\",\n feature_scheduled_messages_description:\n \"Plan ahead and schedule messages easily.\",\n feature_unified_messaging_title: \"Unified messaging\",\n feature_unified_messaging_description:\n \"Combine email, SMS, and internal messages.\",\n} as const satisfies Record<string, string>;\n\nexport type UpgradeDict = typeof upgradeEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { upgradeEn, type UpgradeDict } from \"./translation-dictionary\";\n\nexport const upgradeDomain: DomainTranslations<UpgradeDict> =\n createDomainTranslations<UpgradeDict>({\n fallback: upgradeEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): UpgradeDict => m.default as UpgradeDict,\n ),\n },\n });\n\nexport function createUpgradeTranslationAdapter(\n locale: string,\n dict: UpgradeDict,\n): TranslationApi<UpgradeDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n upgradeDomain,\n createUpgradeTranslationAdapter,\n} from \"@fluid-app/portal-pro-upgrade-ui/translation-adapter\";\nimport { UpgradeTranslationProvider } from \"@fluid-app/portal-pro-upgrade-ui/translation-api-context\";\n\nexport function UpgradeTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(upgradeDomain, locale);\n const api = useMemo(\n () => createUpgradeTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <UpgradeTranslationProvider value={api}>\n {children}\n </UpgradeTranslationProvider>\n );\n}\n","import type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { PortalProUpgradeScreen } from \"@fluid-app/portal-pro-upgrade-ui\";\nimport { UpgradeTranslationBridge } from \"../providers/UpgradeTranslationBridge\";\n\nexport const upgradeScreenPropertySchema = {\n widgetType: \"UpgradeScreen\",\n displayName: \"Upgrade Screen\",\n fields: [],\n} as const satisfies WidgetPropertySchema;\n\nexport function UpgradeScreen(): React.JSX.Element {\n return (\n <UpgradeTranslationBridge>\n <PortalProUpgradeScreen\n onJoinWaitlist={() => {\n // TODO: Wire up to waitlist API\n }}\n />\n </UpgradeTranslationBridge>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { vt as __exportAll } from "./PortalTenantClientProvider-BmRtQAbi.mjs";
1
+ import { vt as __exportAll } from "./PortalTenantClientProvider-DVClpfbi.mjs";
2
2
  import { i as getBorderColorField, l as getColorField, n as borderWidthClasses, o as getBorderRadiusField, p as getHeightField, s as getBorderWidthField, t as borderColorClasses } from "./registries-59Barbhg.mjs";
3
3
  import { t as MediaRenderer } from "./MediaRenderer-Db1KsIza.mjs";
4
4
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -1003,4 +1003,4 @@ const videoWidgetPropertySchema = {
1003
1003
  //#endregion
1004
1004
  export { VideoWidget_exports as n, videoWidgetPropertySchema as r, VideoWidget as t };
1005
1005
 
1006
- //# sourceMappingURL=VideoWidget-DP-VHt2s.mjs.map
1006
+ //# sourceMappingURL=VideoWidget-Cm3UQ3-Z.mjs.map