@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,12 +1,13 @@
1
- import { gt as useAccountApi } from "./PortalTenantClientProvider-BmRtQAbi.mjs";
2
- import { B as useLanguagesApi, V as usePayApi, n as useFluidContext } from "./FluidProvider-CYBXFElI.mjs";
3
- import { n as useCountriesApi } from "./countries-api-context-DScC_39w.mjs";
1
+ import { gt as useAccountApi } from "./PortalTenantClientProvider-DVClpfbi.mjs";
2
+ import { H as usePayApi, V as useLanguagesApi, n as useFluidContext } from "./FluidProvider-tPt9UpYz.mjs";
3
+ import { n as useCountriesApi } from "./countries-api-context-Donus2X5.mjs";
4
+ import { a as useActiveLocale } from "./static-dict-adapter-DRBq3ndO.mjs";
4
5
  import { On as useZodForm, Q as DialogContent, R as Label, X as Dialog, et as DialogFooter, f as fluidToast, fn as BreadcrumbList, it as DialogTitle, k as Input, ln as Breadcrumb, pn as BreadcrumbPage, tt as DialogHeader, un as BreadcrumbItem, wn as Button } from "./src-CJw6JbdS.mjs";
5
- import { n as ScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-BjpQOCck.mjs";
6
+ import { n as ScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-cuVMk00X.mjs";
6
7
  import { n as payKeys, r as storeKeys, t as accountKeys } from "./query-keys-xJy_fapN.mjs";
7
- import { t as useAccount } from "./use-account-CwGoFpwg.mjs";
8
- import { a as AddressFormDialog, d as UserInfoDialog, f as ConfirmActionDialog, h as useProfileTranslation, i as CreditCardFormDialog, m as ProfileTranslationBridge, n as createFluidPayApiAdapter, o as EditPaymentMethodDialog, p as EllipsesDropdown, r as mapToFluidPayPaymentMethod, s as FluidPayCoreProvider, t as AddressAutocompleteInput } from "./AddressAutocompleteInput-BANMgwzR.mjs";
9
- import { f as usePortalUpdateSettings, s as usePortalMySiteProfile } from "./use-mysite-portal-ChDJ4z34.mjs";
8
+ import { t as useAccount } from "./use-account-Dm6Svko1.mjs";
9
+ import { a as AddressFormDialog, d as UserInfoDialog, f as ConfirmActionDialog, h as useProfileTranslation, i as CreditCardFormDialog, m as ProfileTranslationBridge, n as createFluidPayApiAdapter, o as EditPaymentMethodDialog, p as EllipsesDropdown, r as mapToFluidPayPaymentMethod, s as FluidPayCoreProvider, t as AddressAutocompleteInput } from "./AddressAutocompleteInput-Dds2GjGt.mjs";
10
+ import { f as usePortalUpdateSettings, s as usePortalMySiteProfile } from "./use-mysite-portal-3Tn3bFoE.mjs";
10
11
  import { useCallback, useMemo, useState } from "react";
11
12
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
12
13
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -680,6 +681,7 @@ const SOCIAL_PLACEHOLDERS = {
680
681
  };
681
682
  function ProfileContentScreen({ onToast, countryIso }) {
682
683
  const { t } = useProfileTranslation();
684
+ const { locale } = useActiveLocale();
683
685
  const payApi = usePayApi();
684
686
  const accountApi = useAccountApi();
685
687
  const queryClient = useQueryClient();
@@ -1108,6 +1110,7 @@ function ProfileContentScreen({ onToast, countryIso }) {
1108
1110
  }),
1109
1111
  selectedAddress: addressDialog.selected,
1110
1112
  defaultCountry: addresses.find((a) => a.default)?.country_code ?? countryIso,
1113
+ languageIso: locale,
1111
1114
  t: (key) => t(key),
1112
1115
  onSubmit: async (formData) => {
1113
1116
  if (addressDialog.selected) await updateAddressMutation.mutateAsync({
@@ -1189,6 +1192,7 @@ function ProfileContentScreen({ onToast, countryIso }) {
1189
1192
  isSubmitting: createAddressMutation.isPending,
1190
1193
  countries: countryOptions,
1191
1194
  fetchStates: fetchStatesFromCountries,
1195
+ languageIso: locale,
1192
1196
  t: (key) => t(key),
1193
1197
  renderAddressAutocomplete: ({ control, setValue, countryCode }) => /* @__PURE__ */ jsx(AddressAutocompleteInput, {
1194
1198
  control,
@@ -1364,4 +1368,4 @@ const profileScreenPropertySchema = {
1364
1368
  //#endregion
1365
1369
  export { profileScreenPropertySchema as n, ProfileScreen as t };
1366
1370
 
1367
- //# sourceMappingURL=ProfileScreen-CU4Y3sBq.mjs.map
1371
+ //# sourceMappingURL=ProfileScreen-DA3vl5EU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileScreen-DA3vl5EU.mjs","names":[],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@fluid-app/ui-primitives\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const { t } = useProfileTranslation();\n const {\n account,\n pointsBalance,\n pointsLedger,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || t(\"account_fallback\");\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n\n return (\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"relative size-12 shrink-0 overflow-hidden rounded-full ring-1 ring-black/5 md:size-13\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-primary text-primary-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-foreground truncate text-xl font-bold tracking-tight md:text-2xl\">\n {heroDisplay}\n </h1>\n <p className=\"text-muted-foreground mt-0.5 truncate text-sm\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-border text-foreground inline-flex items-center gap-1.5 rounded-md bg-transparent px-2.5 py-1 text-xs font-semibold ring-1\">\n <Sparkles className=\"text-primary size-3\" strokeWidth={2.25} />\n {(pointsBalance ?? 0).toLocaleString()} {t(\"pts\")}\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title={t(\"personal_information\")}\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label={t(\"edit\")}\n />\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <FieldRow\n icon={User}\n label={t(\"name\")}\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow\n icon={Mail}\n label={t(\"email\")}\n value={account.email ?? \"\"}\n />\n <FieldRow\n icon={Phone}\n label={t(\"phone\")}\n value={account.phone ?? \"\"}\n placeholder={t(\"add_phone_number\")}\n />\n <FieldRow\n icon={Quote}\n label={t(\"bio\")}\n value={account.bio ?? \"\"}\n placeholder={t(\"add_a_short_bio\")}\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title={t(\"payment_methods\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title={t(\"points_history\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"pts_available\", {\n count: String((pointsBalance ?? 0).toLocaleString()),\n })}\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-foreground hover:bg-muted flex w-full items-center justify-center gap-1 px-4 py-3 text-xs font-bold transition-colors\"\n >\n {t(\"see_all_transactions\", { count: ledger.length })}\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-border mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl bg-transparent px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-muted-foreground/75 size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"no_points_yet\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"earn_points_hint\")}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title={t(\"your_mysite_link\")}\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label={t(\"edit_link\")}\n />\n ) : undefined\n }\n />\n <div className=\"ring-border mt-2.5 flex items-center gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"bg-muted text-foreground flex size-11 shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {t(\"public_link\")}\n </div>\n <div className=\"text-foreground mt-0.5 truncate font-mono text-sm font-semibold\">\n {mySiteDisplayUrl || t(\"set_your_mysite_link\")}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n {t(\"copy\")}\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title={t(\"shipping_addresses\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {addresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title={t(\"social_media\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"connected_count\", { count: connectedSocialCount })}\n </span>\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <Dialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n >\n <DialogContent className=\"max-w-md md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t(\"points_history\")}</DialogTitle>\n </DialogHeader>\n <div className=\"ring-border max-h-[60vh] overflow-y-auto rounded-2xl bg-transparent ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\n\n {onSignOut && (\n <div className=\"ring-border mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-destructive/10 flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-destructive size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"sign_out\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"sign_out_description\")}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-destructive/15 text-destructive hover:bg-destructive/25 rounded-md px-4 py-2 text-xs font-bold transition-colors\"\n >\n {t(\"sign_out\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-foreground text-base font-bold tracking-tight\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit ? \"text-emerald-600\" : \"text-destructive\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? transactionType.charAt(0).toUpperCase() + transactionType.slice(1)\n : isCredit\n ? t(\"points_awarded\")\n : t(\"points_redeemed\"));\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-primary\" : \"text-muted-foreground\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-medium\">\n {label}\n </div>\n <div className=\"text-muted-foreground text-xs\">{dateLabel}</div>\n </div>\n <div\n className={`shrink-0 font-mono text-sm font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-muted-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-sm font-medium ${isPlaceholder ? \"text-muted-foreground/55\" : \"text-foreground\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nconst CARD_BRAND_LABEL: Record<string, string> = {\n amex: \"AMERICAN EXPRESS\",\n visa: \"VISA\",\n mastercard: \"MASTERCARD\",\n discover: \"DISCOVER\",\n diners: \"DINERS CLUB\",\n jcb: \"JCB\",\n unionpay: \"UNIONPAY\",\n};\n\nconst CARD_BRAND_BADGE: Record<string, string> = {\n amex: \"AMEX\",\n visa: \"VISA\",\n mastercard: \"MC\",\n discover: \"DISC\",\n diners: \"DC\",\n jcb: \"JCB\",\n unionpay: \"UPI\",\n};\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const brand = (method.details.card_brand || \"\").toLowerCase();\n const brandLabel =\n CARD_BRAND_LABEL[brand] || (brand ? brand.toUpperCase() : \"CARD\");\n const badge = CARD_BRAND_BADGE[brand] || \"CARD\";\n const last4 = method.details.last_four ?? \"••••\";\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder =\n method.details.card_holder || method.billing_address?.name || \"\";\n const badgeBg =\n brand === \"visa\"\n ? \"bg-[#1A1F71]\"\n : brand === \"mastercard\"\n ? \"bg-[#EB001B]\"\n : \"bg-[#0064D2]\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative flex items-start justify-between\">\n <div>\n <div className=\"text-background/50 text-xs font-semibold tracking-widest uppercase\">\n {brandLabel}\n </div>\n <div className=\"text-background mt-1 font-mono text-xl font-bold tracking-wider\">\n {last4}\n </div>\n </div>\n {method.default && (\n <span className=\"bg-background/10 text-background/80 rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"cardholder\")}\n </div>\n <div className=\"text-background truncate text-xs font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"card_expires\")}\n </div>\n <div className=\"text-background font-mono text-xs font-semibold\">\n {exp}\n </div>\n </div>\n <div\n className={`shrink-0 rounded px-1.5 py-0.5 text-xs font-bold tracking-wider text-white ${badgeBg}`}\n >\n {badge}\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"add_payment_method\")}\n </div>\n <div className=\"text-muted-foreground/75 text-xs\">\n {t(\"accepted_cards\")}\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const label = address.name?.trim() || t(\"address\");\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-border hover:bg-muted focus-within:ring-foreground/40 relative flex flex-col rounded-2xl bg-transparent ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-muted-foreground size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-foreground text-sm font-bold\">{label}</div>\n </div>\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-foreground mt-3 space-y-0.5 text-sm leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-muted-foreground\">{address.country_code}</div>\n )}\n </div>\n </button>\n {onDelete && (\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex min-h-37 flex-col items-center justify-center gap-1.5 rounded-2xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"add_an_address\")}\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-bold\">{entry.label}</div>\n <div\n className={`truncate text-xs ${handle ? \"text-muted-foreground\" : \"text-muted-foreground/55\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? t(\"edit\") : t(\"connect\")}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: null,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const { locale } = useActiveLocale();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n const mySiteLastSlash = mySiteDisplayUrl.lastIndexOf(\"/\");\n const mySiteUrlPrefix =\n mySiteLastSlash >= 0 ? mySiteDisplayUrl.slice(0, mySiteLastSlash + 1) : \"\";\n const mySiteCurrentSlug =\n mySiteLastSlash >= 0\n ? mySiteDisplayUrl.slice(mySiteLastSlash + 1)\n : mySiteDisplayUrl;\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesAdapter.listCountries(),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"profile_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_profile\"), \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_delete_payment_method\"), \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_update_payment_method\"), \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set((addressesData ?? []).map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast(t(\"address_already_exists\"), \"warning\");\n } else {\n onToast(t(\"address_created\"), \"success\");\n }\n },\n onError: () => {\n onToast(t(\"failed_to_create_address\"), \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_address\"), \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_deleted\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_delete_address\"), \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n },\n billing_address_id: data.billing_address_id,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onToast(t(\"payment_method_added\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_add_payment_method\"), \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.name ?? \"\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, t(\"first_name_is_required\")),\n last_name: z.string().min(1, t(\"last_name_is_required\")),\n phone_number: z.string().optional(),\n language: z.string().min(1, t(\"language_is_required\")),\n bio: z.string().optional(),\n }),\n [t],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(t(\"mysite_link_copied\"), \"success\");\n } catch {\n onToast(t(\"failed_to_copy_link\"), \"error\");\n }\n }, [mySiteUrl, onToast, t]);\n\n const [isEditMySiteLinkOpen, setIsEditMySiteLinkOpen] = useState(false);\n const [mySiteSlugDraft, setMySiteSlugDraft] = useState(\"\");\n\n const handleOpenEditMySiteLink = useCallback(() => {\n setMySiteSlugDraft(mySiteCurrentSlug);\n setIsEditMySiteLinkOpen(true);\n }, [mySiteCurrentSlug]);\n\n const handleSubmitMySiteLink = useCallback(async () => {\n const trimmed = mySiteSlugDraft.trim();\n if (!trimmed) {\n onToast(t(\"mysite_link_empty\"), \"error\");\n return;\n }\n if (trimmed === mySiteCurrentSlug) {\n setIsEditMySiteLinkOpen(false);\n return;\n }\n try {\n await updateMySiteSettingsMutation.mutateAsync({ slug: trimmed });\n onToast(t(\"mysite_link_updated\"), \"success\");\n setIsEditMySiteLinkOpen(false);\n } catch {\n onToast(t(\"failed_to_update_mysite_link\"), \"error\");\n }\n }, [\n mySiteSlugDraft,\n mySiteCurrentSlug,\n updateMySiteSettingsMutation,\n onToast,\n t,\n ]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(t(\"platform_not_editable\"), \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast, t],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"social_link_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_social_link\"), \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n {t(\"unable_to_load_account\")}\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => setIsAddCardOpen(true)}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onEditMySiteLink={handleOpenEditMySiteLink}\n onConnectSocial={handleConnectSocial}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.name,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ?? countryIso\n }\n languageIso={locale}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => setIsAddCardOpen(false)}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n try {\n await addCreditCardMutation.mutateAsync(data);\n setIsAddCardOpen(false);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n onSubmit={async (data) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(data);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n languageIso={locale}\n t={(key: string) => t(key as never)}\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n )}\n />\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n billingAddress={editPaymentMethod.billing_address}\n countries={countryOptions}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n />\n )}\n\n <Dialog\n open={isEditMySiteLinkOpen}\n onOpenChange={(open) => {\n if (!open && updateMySiteSettingsMutation.isPending) return;\n setIsEditMySiteLinkOpen(open);\n }}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>{t(\"edit_link\")}</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"mysite-slug\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"your_mysite_link\")}\n </Label>\n <div className=\"ring-border focus-within:ring-foreground/40 flex items-center gap-1 rounded-md bg-transparent px-3 py-2 ring-1 transition-all focus-within:ring-2\">\n {mySiteUrlPrefix && (\n <span className=\"text-muted-foreground shrink-0 text-sm\">\n {mySiteUrlPrefix}\n </span>\n )}\n <Input\n id=\"mysite-slug\"\n value={mySiteSlugDraft}\n onChange={(e) => setMySiteSlugDraft(e.target.value)}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !updateMySiteSettingsMutation.isPending\n ) {\n e.preventDefault();\n void handleSubmitMySiteLink();\n }\n }}\n className=\"h-auto min-w-0 flex-1 border-0 p-0 shadow-none focus-visible:ring-0\"\n autoFocus\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsEditMySiteLinkOpen(false)}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitMySiteLink();\n }}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {updateMySiteSettingsMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {editingSocial\n ? t(\"edit_platform_link\", {\n platform: SOCIAL_LABELS[editingSocial] ?? \"\",\n })\n : t(\"edit_social_link\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"url\")}\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n autoFocus\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </FluidPayCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n </>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ require("./chunk-9hOWP6kD.cjs");
2
+ require("./FluidProvider-CMfpLju8.cjs");
3
+ require("./ScreenRenderer-IMkMMnUJ.cjs");
4
+ require("./PortalTenantClientProvider-C0eJp8MN.cjs");
5
+ require("./store-api-context-CGH3YsZB.cjs");
6
+ require("./mysite-api-context-DtEXblIV.cjs");
7
+ require("./countries-api-context-16PZpF7O.cjs");
8
+ require("./task-composer-form-Cz8hpMTT.cjs");
9
+ require("./registry-context-Q_1Iq2Ea.cjs");
10
+ require("./WidgetInteractionContext-BhkusA95.cjs");
11
+ require("./EmbedWidget-B-bkknog.cjs");
12
+ require("./QuickLinksWidget-BRcUEh_P.cjs");
13
+ require("./static-dict-adapter-BLq4QzCI.cjs");
14
+ require("./error-state-CU87JUpz.cjs");
15
+ require("./translation-api-context-factory-CjRDqIhF.cjs");
16
+ require("./LayoutWidget-DD1ZqWXg.cjs");
17
+ require("./registries-CpUM406S.cjs");
18
+ require("./fields-C8gY9GlT.cjs");
19
+ require("./TextWidget-D9H9WUPH.cjs");
20
+ require("./AlertWidget-Bli5ni5t.cjs");
21
+ require("./BulletListWidget-BHkly6-D.cjs");
22
+ require("./preview-context-DrXkIImI.cjs");
23
+ require("./CalendarWidget-Aa7H9M7f.cjs");
24
+ require("./CardWidget-CqewqU5a.cjs");
25
+ require("./purify.es-3IyrJU0_.cjs");
26
+ require("./MediaRenderer-D-hwg614.cjs");
27
+ require("./CarouselWidget-DtwI2yEZ.cjs");
28
+ require("./CatchUpWidget-DEyXTEFj.cjs");
29
+ require("./src-Cx7UyT_c.cjs");
30
+ require("./ChartWidget-BwluyVCs.cjs");
31
+ require("./ContainerWidget-CF6VDxd8.cjs");
32
+ require("./ImageWidget-CeAngL6c.cjs");
33
+ require("./LinkWidget-Cm-vPKHS.cjs");
34
+ require("./ListWidget-D0fL1xOX.cjs");
35
+ require("./MySiteWidget-CabBtq5C.cjs");
36
+ require("./NestedWidget-CZGOZbpZ.cjs");
37
+ require("./PointsWidget-Him7U2k2.cjs");
38
+ require("./QuickShareWidget-BHocc364.cjs");
39
+ require("./RecentActivityWidget-DvrmBGsD.cjs");
40
+ require("./SeparatorWidget-CjVHbHzQ.cjs");
41
+ require("./SpacerWidget-D9lOLPr5.cjs");
42
+ require("./TableWidget-BWt9YhmC.cjs");
43
+ require("./ToDoWidget-C3Ob2TP2.cjs");
44
+ require("./VideoWidget-qBHzFosz.cjs");
45
+ require("./SearchSort-BjjBpuEi.cjs");
46
+ require("./ShopWidget-BWURiWyx.cjs");
47
+ require("./ScreenHeaderContext-VOp8pVHr.cjs");
48
+ require("./AddressAutocompleteInput-BQz2jaUO.cjs");
49
+ require("./Combobox-BqqGQkac.cjs");
50
+ require("./use-mysite-portal-D3X51_Ax.cjs");
51
+ const require_ProfileScreen = require("./ProfileScreen-21MnRuNH.cjs");
52
+ exports.ProfileScreen = require_ProfileScreen.ProfileScreen;
53
+ exports.profileScreenPropertySchema = require_ProfileScreen.profileScreenPropertySchema;
@@ -0,0 +1,51 @@
1
+ import "./PortalTenantClientProvider-DVClpfbi.mjs";
2
+ import "./FluidProvider-tPt9UpYz.mjs";
3
+ import "./ScreenRenderer-D3zNFSr3.mjs";
4
+ import "./store-api-context-B_vtKkXO.mjs";
5
+ import "./mysite-api-context-CoLr9vIf.mjs";
6
+ import "./countries-api-context-Donus2X5.mjs";
7
+ import "./task-composer-form-CZgRqbIc.mjs";
8
+ import "./registry-context-CcoVxCii.mjs";
9
+ import "./WidgetInteractionContext-BWH7njU7.mjs";
10
+ import "./EmbedWidget-DRfjHvRs.mjs";
11
+ import "./QuickLinksWidget-DJUI7r5_.mjs";
12
+ import "./static-dict-adapter-DRBq3ndO.mjs";
13
+ import "./error-state-BUe589mD.mjs";
14
+ import "./translation-api-context-factory-DFr9yJ6Q.mjs";
15
+ import "./LayoutWidget-CSFWeXYY.mjs";
16
+ import "./registries-59Barbhg.mjs";
17
+ import "./fields-Dm8-nLc_.mjs";
18
+ import "./TextWidget-B5ZtQMX-.mjs";
19
+ import "./AlertWidget-DMwOt9u8.mjs";
20
+ import "./BulletListWidget-D--Mmasw.mjs";
21
+ import "./preview-context-BXEGWx9T.mjs";
22
+ import "./CalendarWidget-Cx6KvkaG.mjs";
23
+ import "./CardWidget-DARqLSwy.mjs";
24
+ import "./purify.es-Bl6SBkmi.mjs";
25
+ import "./MediaRenderer-Db1KsIza.mjs";
26
+ import "./CarouselWidget-Bnl_iggA.mjs";
27
+ import "./CatchUpWidget-Bplozt8D.mjs";
28
+ import "./src-CJw6JbdS.mjs";
29
+ import "./ChartWidget-BPOZNKI_.mjs";
30
+ import "./ContainerWidget-Bv0f8-TC.mjs";
31
+ import "./ImageWidget-C7nfRJ6p.mjs";
32
+ import "./LinkWidget-DI2Uod5O.mjs";
33
+ import "./ListWidget-BdUhs2fo.mjs";
34
+ import "./MySiteWidget-ivytLi6H.mjs";
35
+ import "./NestedWidget-gqdWZS9Q.mjs";
36
+ import "./PointsWidget-BJlOIK6o.mjs";
37
+ import "./QuickShareWidget-B7DhQOyt.mjs";
38
+ import "./RecentActivityWidget-BMGeLSUa.mjs";
39
+ import "./SeparatorWidget-CGFzy35l.mjs";
40
+ import "./SpacerWidget-BhxIaqYF.mjs";
41
+ import "./TableWidget-Dwud4Fif.mjs";
42
+ import "./ToDoWidget-Bnml3xLS.mjs";
43
+ import "./VideoWidget-Cm3UQ3-Z.mjs";
44
+ import "./SearchSort-C6RV6d9g.mjs";
45
+ import "./ShopWidget-Cqnwq0AG.mjs";
46
+ import "./ScreenHeaderContext-cuVMk00X.mjs";
47
+ import "./AddressAutocompleteInput-Dds2GjGt.mjs";
48
+ import "./Combobox-D8LKqQ19.mjs";
49
+ import "./use-mysite-portal-3Tn3bFoE.mjs";
50
+ import { n as profileScreenPropertySchema, t as ProfileScreen } from "./ProfileScreen-DA3vl5EU.mjs";
51
+ export { ProfileScreen, profileScreenPropertySchema };
@@ -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, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-59Barbhg.mjs";
3
3
  import { createContext, useContext } from "react";
4
4
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -611,4 +611,4 @@ const quickLinksWidgetPropertySchema = {
611
611
  //#endregion
612
612
  export { QuickLinksWidget_exports as n, quickLinksWidgetPropertySchema as r, QuickLinksWidget as t };
613
613
 
614
- //# sourceMappingURL=QuickLinksWidget-D8LqZkUS.mjs.map
614
+ //# sourceMappingURL=QuickLinksWidget-DJUI7r5_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuickLinksWidget-D8LqZkUS.mjs","names":["LinkIcon"],"sources":["../../widgets/src/contexts/PortalUrlVariablesContext.tsx","../../core/src/url-templating.ts","../../widgets/src/widgets/QuickLinksWidget.tsx"],"sourcesContent":["import { createContext, useContext, type Provider } from \"react\";\nimport type { UrlVariableValues } from \"@fluid-app/portal-core/url-templating\";\n\n/**\n * Values used to substitute `{{token}}` placeholders in widget-configured URLs.\n *\n * **Production runtime substitution happens server-side** in the Portal Tenant\n * BFF via `UrlResolver` (mirroring `MobileTabWidget#resolve_link_urls`).\n * The portal client receives URLs already resolved, so the default `{}` value\n * is the right one for the live `AppShell` — substitution becomes a no-op\n * because there are no `{{...}}` tokens left to match.\n *\n * **Admin builder preview** mounts the provider with `PREVIEW_URL_VARIABLES`\n * so admins see realistic sample values for any `{{username}}` /\n * `{{replicated_url}}` tokens they've configured, without the builder needing\n * to fetch real user data or hit the BFF resolver.\n */\nconst PortalUrlVariablesContext = createContext<UrlVariableValues>({});\n\nexport const PortalUrlVariablesProvider: Provider<UrlVariableValues> =\n PortalUrlVariablesContext.Provider;\n\nexport function usePortalUrlVariables(): UrlVariableValues {\n return useContext(PortalUrlVariablesContext);\n}\n\n/**\n * Deterministic preview values mounted by admin-builder render sites that\n * show widget previews outside the live portal AppShell, so URLs referencing\n * template tokens render to recognizable placeholders rather than their\n * `|| fallback_path` clauses.\n */\nexport const PREVIEW_URL_VARIABLES: UrlVariableValues = {\n username: \"rep\",\n replicated_url: \"https://example.com\",\n};\n","/**\n * URL variable substitution for portal widgets.\n *\n * Mirrors the mobile app's Quick Links template-tag syntax so URLs configured\n * by admins in the portal builder can include placeholders like\n * `{{username || /profile}}` that resolve to user-specific values at render\n * time.\n *\n * Supported syntax:\n * - `{{token}}` — replace with the value at `values[token]`. If no value is\n * provided, the literal placeholder is left in place.\n * - `{{token || fallback_path}}` — replace with the value if present and\n * non-empty, otherwise replace with `fallback_path` (everything after `||`).\n *\n * Leading/trailing whitespace inside the braces is permitted:\n * `{{ username || /profile }}` is equivalent to `{{username || /profile}}`.\n */\n\nconst TOKEN_PATTERN = /\\{\\{\\s*([^}|\\s]+)\\s*(?:\\|\\|\\s*([^}]*?))?\\s*\\}\\}/g;\n\nexport type UrlVariableValues = Record<string, string | null | undefined>;\n\nexport function substituteUrlVariables(\n url: string,\n values: UrlVariableValues,\n): string {\n return url.replace(\n TOKEN_PATTERN,\n (match, rawToken: string, rawFallback?: string) => {\n const token = rawToken.trim();\n const value = values[token];\n if (value != null && value !== \"\") return value;\n if (rawFallback !== undefined) return rawFallback.trim();\n return match;\n },\n );\n}\n","import { 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 {\n PropertyField,\n WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport {\n substituteUrlVariables,\n type UrlVariableValues,\n} from \"@fluid-app/portal-core/url-templating\";\nimport { usePortalUrlVariables } from \"../contexts/PortalUrlVariablesContext\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport {\n Bell,\n BookmarkIcon,\n Calendar,\n ChevronRight,\n ExternalLink,\n Gift,\n Globe,\n Heart,\n Link as LinkIcon,\n Mail,\n MapPin,\n MessageCircle,\n Package,\n Phone,\n Play,\n Share2,\n ShoppingBag,\n Sparkles,\n Star,\n Trophy,\n User,\n Video,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\n\n// ---------- icon registry ----------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n User,\n Share2,\n ShoppingBag,\n Video,\n Mail,\n MessageCircle,\n Globe,\n Calendar,\n Bell,\n Heart,\n Star,\n Zap,\n Gift,\n Phone,\n MapPin,\n Play,\n Package,\n ExternalLink,\n Bookmark: BookmarkIcon,\n Trophy,\n Sparkles,\n Link: LinkIcon,\n};\n\nconst ICON_OPTIONS: Array<{ label: string; value: string }> = [\n { label: \"Link (default)\", value: \"Link\" },\n { label: \"User / Profile\", value: \"User\" },\n { label: \"Share\", value: \"Share2\" },\n { label: \"Shopping Bag\", value: \"ShoppingBag\" },\n { label: \"Video\", value: \"Video\" },\n { label: \"Mail\", value: \"Mail\" },\n { label: \"Message\", value: \"MessageCircle\" },\n { label: \"Globe\", value: \"Globe\" },\n { label: \"Calendar\", value: \"Calendar\" },\n { label: \"Bell / Notifications\", value: \"Bell\" },\n { label: \"Heart\", value: \"Heart\" },\n { label: \"Star\", value: \"Star\" },\n { label: \"Zap / Lightning\", value: \"Zap\" },\n { label: \"Gift\", value: \"Gift\" },\n { label: \"Phone\", value: \"Phone\" },\n { label: \"Map Pin\", value: \"MapPin\" },\n { label: \"Play\", value: \"Play\" },\n { label: \"Package\", value: \"Package\" },\n { label: \"External Link\", value: \"ExternalLink\" },\n { label: \"Bookmark\", value: \"Bookmark\" },\n { label: \"Trophy\", value: \"Trophy\" },\n { label: \"Sparkles\", value: \"Sparkles\" },\n];\n\nconst capitalize = (s: string): string =>\n s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n\nconst getIcon = (name: string | undefined): LucideIcon => {\n if (!name) return LinkIcon;\n return ICON_MAP[name] ?? ICON_MAP[capitalize(name)] ?? LinkIcon;\n};\n\n// ---------- link parsing / collection ----------\n\ntype ParsedLink = {\n id: string;\n label: string;\n url: string;\n iconName: string;\n iconColor: ColorOptions;\n};\n\nconst isColorOption = (value: string): value is ColorOptions =>\n [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n ].includes(value);\n\nconst FALLBACK_COLOR_CYCLE: ColorOptions[] = [\n \"primary\",\n \"accent\",\n \"secondary\",\n \"destructive\",\n];\n\n// Legacy format per line: \"Label | URL | IconName | ColorOption\"\n// Kept for backwards compatibility with existing saved configs.\nconst parseLegacyLinks = (raw: string[] | string): ParsedLink[] => {\n const lines = Array.isArray(raw) ? raw : raw.split(/\\r?\\n/).filter(Boolean);\n return lines\n .map((line, index) => {\n const parts = line.split(\"|\").map((s) => s.trim());\n const label = parts[0] ?? \"\";\n if (!label) return null;\n const url = parts[1] ?? \"#\";\n const iconName = parts[2] && parts[2].length > 0 ? parts[2] : \"Link\";\n const colorCandidate = parts[3];\n const iconColor: ColorOptions =\n colorCandidate && isColorOption(colorCandidate)\n ? colorCandidate\n : (FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\");\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// New structured format — gather links from individual link{n}* props\nconst MAX_LINKS = 8;\n\ntype SlotProps = {\n enabled: boolean;\n label: string | undefined;\n url: string | undefined;\n icon: string | undefined;\n color: ColorOptions | undefined;\n};\n\n// Per-slot merge of structured props with the legacy `links` array. A slot\n// is \"structurally configured\" when at least one of its content props\n// (label / url / icon / color) is explicitly set; in that case structured\n// props win and the slot's `enabled` flag is honored. Slots that haven't\n// been structurally touched fall back to the legacy entry at the same\n// index — so editing one slot in a legacy-format widget doesn't silently\n// drop URLs/icons/colors for the other slots.\nconst resolveLinks = (\n slots: SlotProps[],\n legacy: ParsedLink[],\n): ParsedLink[] => {\n return slots\n .map((slot, index): ParsedLink | null => {\n const legacyEntry = legacy[index];\n\n const hasStructured =\n slot.label !== undefined ||\n slot.url !== undefined ||\n slot.icon !== undefined ||\n slot.color !== undefined;\n\n if (hasStructured) {\n // Slot 1 is always enabled; slots 2+ need enabled=true.\n const isSlotActive = index === 0 || slot.enabled;\n if (!isSlotActive) return null;\n\n const label = (slot.label ?? legacyEntry?.label ?? \"\").trim();\n if (!label) return null;\n\n const url =\n slot.url && slot.url.length > 0\n ? slot.url\n : (legacyEntry?.url ?? \"#\");\n const iconName =\n slot.icon && slot.icon.length > 0\n ? slot.icon\n : (legacyEntry?.iconName ?? \"Link\");\n const iconColor: ColorOptions =\n slot.color ??\n legacyEntry?.iconColor ??\n FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\";\n\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n }\n\n // No structured props for this slot — use the legacy entry as-is.\n // Legacy widgets predate the per-slot `enabled` toggle, so we don't\n // gate legacy entries on it (otherwise legacy slots 5+ would vanish\n // because their `linkNEnabled` defaults to `false`).\n return legacyEntry ?? null;\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// ---------- link row ----------\n\ntype LinkRowProps = {\n link: ParsedLink;\n textColor: ColorOptions;\n borderRadius: BorderRadiusOptions;\n openInNewTab: boolean;\n showChevron: boolean;\n iconRadius: BorderRadiusOptions;\n layout: \"cards\" | \"list\";\n isLast: boolean;\n urlVariables: UrlVariableValues;\n};\n\nfunction LinkRow({\n link,\n textColor,\n borderRadius,\n openInNewTab,\n showChevron,\n iconRadius,\n layout,\n isLast,\n urlVariables,\n}: LinkRowProps) {\n const Icon = getIcon(link.iconName);\n\n const wrapperBase = `group relative flex items-center gap-3 py-3 transition-all duration-200`;\n const wrapperCardClasses = `rounded-${borderRadius} px-3 bg-${textColor}/5 hover:bg-${textColor}/10 hover:-translate-y-0.5`;\n const wrapperListClasses = `px-0 hover:bg-${textColor}/5 rounded-md`;\n\n const wrapperClasses =\n layout === \"cards\"\n ? `${wrapperBase} ${wrapperCardClasses}`\n : `${wrapperBase} ${wrapperListClasses}`;\n\n const content = (\n <>\n {/* Icon badge — colored gradient square with white icon centered */}\n <span\n aria-hidden=\"true\"\n className={`relative flex size-10 shrink-0 items-center justify-center rounded-${iconRadius} text-${link.iconColor}-foreground`}\n style={{\n background: `linear-gradient(135deg, color-mix(in oklch, var(--color-${link.iconColor}) 75%, white 25%) 0%, var(--color-${link.iconColor}) 100%)`,\n boxShadow: `\n inset 0 1px 0 rgba(255,255,255,0.25),\n inset 0 -1px 0 rgba(0,0,0,0.1),\n 0 1px 2px color-mix(in oklch, var(--color-${link.iconColor}) 30%, transparent)\n `,\n }}\n >\n <Icon className=\"size-5\" strokeWidth={2.25} />\n </span>\n\n {/* Label */}\n <span\n className={`min-w-0 flex-1 truncate text-[15px] font-bold tracking-[-0.01em] text-${textColor}`}\n >\n {link.label}\n </span>\n\n {/* Chevron */}\n {showChevron && (\n <ChevronRight\n aria-hidden=\"true\"\n className={`size-4 shrink-0 text-${textColor}/35 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-${textColor}/60`}\n />\n )}\n </>\n );\n\n const separator =\n layout === \"list\" && !isLast ? (\n <div\n aria-hidden=\"true\"\n className=\"ml-[52px]\"\n style={{\n borderBottom: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n />\n ) : null;\n\n const resolvedUrl =\n link.url && link.url !== \"#\"\n ? substituteUrlVariables(link.url, urlVariables)\n : link.url;\n const href = resolvedUrl && resolvedUrl !== \"#\" ? resolvedUrl : undefined;\n\n if (href) {\n return (\n <>\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noopener noreferrer\" : undefined}\n className={wrapperClasses}\n >\n {content}\n </a>\n {separator}\n </>\n );\n }\n\n return (\n <>\n <div className={wrapperClasses}>{content}</div>\n {separator}\n </>\n );\n}\n\n// ---------- widget ----------\n\ntype QuickLinksWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Links — new structured per-slot props\n link1Label?: string;\n link1Url?: string;\n link1Icon?: string;\n link1Color?: ColorOptions;\n link2Enabled?: boolean;\n link2Label?: string;\n link2Url?: string;\n link2Icon?: string;\n link2Color?: ColorOptions;\n link3Enabled?: boolean;\n link3Label?: string;\n link3Url?: string;\n link3Icon?: string;\n link3Color?: ColorOptions;\n link4Enabled?: boolean;\n link4Label?: string;\n link4Url?: string;\n link4Icon?: string;\n link4Color?: ColorOptions;\n link5Enabled?: boolean;\n link5Label?: string;\n link5Url?: string;\n link5Icon?: string;\n link5Color?: ColorOptions;\n link6Enabled?: boolean;\n link6Label?: string;\n link6Url?: string;\n link6Icon?: string;\n link6Color?: ColorOptions;\n link7Enabled?: boolean;\n link7Label?: string;\n link7Url?: string;\n link7Icon?: string;\n link7Color?: ColorOptions;\n link8Enabled?: boolean;\n link8Label?: string;\n link8Url?: string;\n link8Icon?: string;\n link8Color?: ColorOptions;\n\n // Legacy — still accepted for backwards compatibility\n links?: string[] | string;\n\n // Layout\n layout?: \"cards\" | \"list\";\n iconRadius?: BorderRadiusOptions;\n showChevron?: boolean;\n openInNewTab?: boolean;\n\n // Design\n background?: BackgroundValue;\n textColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nexport function QuickLinksWidget({\n titleEnabled = true,\n title = \"Quick Links\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n link1Label,\n link1Url,\n link1Icon,\n link1Color,\n link2Enabled = true,\n link2Label,\n link2Url,\n link2Icon,\n link2Color,\n link3Enabled = true,\n link3Label,\n link3Url,\n link3Icon,\n link3Color,\n link4Enabled = true,\n link4Label,\n link4Url,\n link4Icon,\n link4Color,\n link5Enabled = false,\n link5Label,\n link5Url,\n link5Icon,\n link5Color,\n link6Enabled = false,\n link6Label,\n link6Url,\n link6Icon,\n link6Color,\n link7Enabled = false,\n link7Label,\n link7Url,\n link7Icon,\n link7Color,\n link8Enabled = false,\n link8Label,\n link8Url,\n link8Icon,\n link8Color,\n\n links,\n\n layout = \"cards\",\n iconRadius = \"lg\",\n showChevron = true,\n openInNewTab = false,\n\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: QuickLinksWidgetProps): 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\n // Pass props through verbatim — schema `defaultValue`s pre-populate the\n // builder, so the component shouldn't second-guess with hardcoded\n // fallbacks (which would mask a user's explicit blank label).\n const slots: SlotProps[] = [\n {\n enabled: true,\n label: link1Label,\n url: link1Url,\n icon: link1Icon,\n color: link1Color,\n },\n {\n enabled: link2Enabled,\n label: link2Label,\n url: link2Url,\n icon: link2Icon,\n color: link2Color,\n },\n {\n enabled: link3Enabled,\n label: link3Label,\n url: link3Url,\n icon: link3Icon,\n color: link3Color,\n },\n {\n enabled: link4Enabled,\n label: link4Label,\n url: link4Url,\n icon: link4Icon,\n color: link4Color,\n },\n {\n enabled: link5Enabled,\n label: link5Label,\n url: link5Url,\n icon: link5Icon,\n color: link5Color,\n },\n {\n enabled: link6Enabled,\n label: link6Label,\n url: link6Url,\n icon: link6Icon,\n color: link6Color,\n },\n {\n enabled: link7Enabled,\n label: link7Label,\n url: link7Url,\n icon: link7Icon,\n color: link7Color,\n },\n {\n enabled: link8Enabled,\n label: link8Label,\n url: link8Url,\n icon: link8Icon,\n color: link8Color,\n },\n ];\n\n const legacyLinks: ParsedLink[] = links ? parseLegacyLinks(links) : [];\n const parsed: ParsedLink[] = resolveLinks(slots, legacyLinks);\n const urlVariables = usePortalUrlVariables();\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-3`}>\n {titleEnabled && title && (\n <h2\n className={`text-${titleFontSize} leading-tight font-bold tracking-[-0.01em] text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n\n {parsed.length === 0 ? (\n <p className={`text-[13px] text-${textColor}/55`}>\n No links configured.\n </p>\n ) : layout === \"cards\" ? (\n <div className=\"flex flex-col gap-2\">\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"cards\"\n isLast={idx === parsed.length - 1}\n urlVariables={urlVariables}\n />\n ))}\n </div>\n ) : (\n <div\n className={`flex flex-col overflow-hidden rounded-${borderRadius} bg-${textColor}/5`}\n >\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"list\"\n isLast={idx === parsed.length - 1}\n urlVariables={urlVariables}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ---------- schema helpers ----------\n\n// Quick-insert chips for the URL field property panel. Aligns with the\n// mobile builder's `TEMPLATE_TAGS` token set (same three tokens) — fallback\n// values differ on purpose: portal uses a concrete `/signup` path so the\n// inserted template renders cleanly, whereas mobile uses the literal\n// `fallback_path` placeholder for the admin to edit. The Portal Tenant BFF\n// resolves these server-side via `UrlResolver`; in admin builder preview,\n// `substituteUrlVariables` against `PREVIEW_URL_VARIABLES` renders sample\n// values so admins see what users will see.\nconst URL_TOKEN_SUGGESTIONS = [\n { label: \"username\", value: \"username || /signup\" },\n { label: \"replicated_url\", value: \"replicated_url\" },\n { label: \"external_id\", value: \"external_id || /signup\" },\n] as const;\n\ntype SlotDefaults = {\n label: string;\n icon: string;\n color: ColorOptions;\n};\n\nconst SLOT_DEFAULTS: Record<number, SlotDefaults | undefined> = {\n 1: { label: \"Profile\", icon: \"User\", color: \"primary\" },\n 2: { label: \"Social\", icon: \"Share2\", color: \"accent\" },\n 3: { label: \"Product Links\", icon: \"ShoppingBag\", color: \"secondary\" },\n 4: { label: \"Video\", icon: \"Video\", color: \"destructive\" },\n};\n\nfunction buildLinkSlotFields(slot: number): PropertyField[] {\n const group = `Link ${slot}`;\n const isFirst = slot === 1;\n const defaults = SLOT_DEFAULTS[slot];\n // Enable slots 2-4 by default to match the previous widget behavior.\n const enabledDefault = slot >= 2 && slot <= 4;\n const requires = isFirst ? undefined : `link${slot}Enabled`;\n\n const fields: PropertyField[] = [];\n\n if (!isFirst) {\n fields.push({\n key: `link${slot}Enabled`,\n label: `Show Link ${slot}`,\n type: \"boolean\",\n description: `Display link slot ${slot}`,\n defaultValue: enabledDefault,\n group,\n });\n }\n\n fields.push({\n key: `link${slot}Label`,\n label: \"Label\",\n type: \"text\",\n description: \"Text shown on the link\",\n defaultValue: defaults?.label ?? \"\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Url`,\n label: \"URL\",\n type: \"text\",\n description:\n \"Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path.\",\n defaultValue: \"#\",\n tokenSuggestions: URL_TOKEN_SUGGESTIONS,\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Icon`,\n label: \"Icon\",\n type: \"select\",\n description: \"Icon displayed in the colored badge\",\n options: ICON_OPTIONS,\n defaultValue: defaults?.icon ?? \"Link\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Color`,\n label: \"Badge Color\",\n type: \"colorSelect\",\n description: \"Color of the icon badge\",\n defaultValue:\n defaults?.color ??\n FALLBACK_COLOR_CYCLE[(slot - 1) % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n return fields;\n}\n\nconst linkSlotFields: PropertyField[] = Array.from(\n { length: MAX_LINKS },\n (_, i) => buildLinkSlotFields(i + 1),\n).flat();\n\n// ---------- schema ----------\n\nexport const quickLinksWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"QuickLinksWidget\",\n displayName: \"Quick Links\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Small heading shown above the link list\",\n defaultValue: true,\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Heading shown above the links\",\n defaultValue: \"Quick Links\",\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: \"md\",\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 group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Links — 8 structured slots\n ...linkSlotFields,\n\n // Layout group\n {\n key: \"layout\",\n label: \"Layout\",\n type: \"buttonGroup\",\n description: \"Cards: separated tiles. List: grouped rows with dividers.\",\n defaultValue: \"cards\",\n options: [\n { label: \"Cards\", value: \"cards\" },\n { label: \"List\", value: \"list\" },\n ],\n group: \"Layout\",\n },\n getBorderRadiusField({\n key: \"iconRadius\",\n label: \"Icon Corner Radius\",\n description: \"Corner radius for the colored icon badge\",\n defaultValue: \"lg\",\n group: \"Layout\",\n }),\n {\n key: \"showChevron\",\n label: \"Show Chevron\",\n type: \"boolean\",\n description: \"Right-aligned chevron indicating each row is a link\",\n defaultValue: true,\n group: \"Layout\",\n },\n {\n key: \"openInNewTab\",\n label: \"Open in New Tab\",\n type: \"boolean\",\n description: \"Open links in a new tab instead of the same window\",\n defaultValue: false,\n group: \"Layout\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description:\n \"Label + chevron color, and the base for row backgrounds (via opacity)\",\n defaultValue: \"foreground\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget\",\n defaultValue: 4,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description:\n \"Widget border radius (also drives row corners in cards layout)\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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,EACH,UACA,EAAA,CAAA;AAIP,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,EAC9C,UACA,EAAA,CAAA;;AAwEP,SAAgB,iBAAiB,EAC/B,eAAe,MACf,QAAQ,eACR,gBAAgB,MAChB,aAAa,cAEb,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YAEA,OAEA,SAAS,SACT,aAAa,MACb,cAAc,MACd,eAAe,OAEf,aAAa;CAAE,MAAM;CAAS,OAAO;CAAc,EACnD,YAAY,cACZ,UAAU,GACV,eAAe,MACf,cAAc,QACd,cAAc,SAEd,WACA,GAAG,SACwC;CAC3C,MAAM,kBAAkB,WAAW,SAAS;CAC5C,MAAM,mBACH,WAAW,UAAU,aAAa,WAAW,UAAU,aACxD,WAAW,SAAS,UAChB,OAAO,WAAW,SAAS,aAAa,WAAW,SAAS,SAAS,KACrE;CAiEN,MAAM,SAAuB,aA5DF;EACzB;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EA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AAO;GACP,qBAAqB;GACtB,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACP,qBAAqB;GACtB,CAAC;EAGF,GAAG;EAGH;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,SAAS,CACP;IAAE,OAAO;IAAS,OAAO;IAAS,EAClC;IAAE,OAAO;IAAQ,OAAO;IAAQ,CACjC;GACD,OAAO;GACR;EACD,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,OAAO;GACR;EAGD;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR;EACD,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aACE;GACF,cAAc;GACd,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aACE;GACF,cAAc;GACd,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACH;CACF"}
1
+ {"version":3,"file":"QuickLinksWidget-DJUI7r5_.mjs","names":["LinkIcon"],"sources":["../../widgets/src/contexts/PortalUrlVariablesContext.tsx","../../core/src/url-templating.ts","../../widgets/src/widgets/QuickLinksWidget.tsx"],"sourcesContent":["import { createContext, useContext, type Provider } from \"react\";\nimport type { UrlVariableValues } from \"@fluid-app/portal-core/url-templating\";\n\n/**\n * Values used to substitute `{{token}}` placeholders in widget-configured URLs.\n *\n * **Production runtime substitution happens server-side** in the Portal Tenant\n * BFF via `UrlResolver` (mirroring `MobileTabWidget#resolve_link_urls`).\n * The portal client receives URLs already resolved, so the default `{}` value\n * is the right one for the live `AppShell` — substitution becomes a no-op\n * because there are no `{{...}}` tokens left to match.\n *\n * **Admin builder preview** mounts the provider with `PREVIEW_URL_VARIABLES`\n * so admins see realistic sample values for any `{{username}}` /\n * `{{replicated_url}}` tokens they've configured, without the builder needing\n * to fetch real user data or hit the BFF resolver.\n */\nconst PortalUrlVariablesContext = createContext<UrlVariableValues>({});\n\nexport const PortalUrlVariablesProvider: Provider<UrlVariableValues> =\n PortalUrlVariablesContext.Provider;\n\nexport function usePortalUrlVariables(): UrlVariableValues {\n return useContext(PortalUrlVariablesContext);\n}\n\n/**\n * Deterministic preview values mounted by admin-builder render sites that\n * show widget previews outside the live portal AppShell, so URLs referencing\n * template tokens render to recognizable placeholders rather than their\n * `|| fallback_path` clauses.\n */\nexport const PREVIEW_URL_VARIABLES: UrlVariableValues = {\n username: \"rep\",\n replicated_url: \"https://example.com\",\n};\n","/**\n * URL variable substitution for portal widgets.\n *\n * Mirrors the mobile app's Quick Links template-tag syntax so URLs configured\n * by admins in the portal builder can include placeholders like\n * `{{username || /profile}}` that resolve to user-specific values at render\n * time.\n *\n * Supported syntax:\n * - `{{token}}` — replace with the value at `values[token]`. If no value is\n * provided, the literal placeholder is left in place.\n * - `{{token || fallback_path}}` — replace with the value if present and\n * non-empty, otherwise replace with `fallback_path` (everything after `||`).\n *\n * Leading/trailing whitespace inside the braces is permitted:\n * `{{ username || /profile }}` is equivalent to `{{username || /profile}}`.\n */\n\nconst TOKEN_PATTERN = /\\{\\{\\s*([^}|\\s]+)\\s*(?:\\|\\|\\s*([^}]*?))?\\s*\\}\\}/g;\n\nexport type UrlVariableValues = Record<string, string | null | undefined>;\n\nexport function substituteUrlVariables(\n url: string,\n values: UrlVariableValues,\n): string {\n return url.replace(\n TOKEN_PATTERN,\n (match, rawToken: string, rawFallback?: string) => {\n const token = rawToken.trim();\n const value = values[token];\n if (value != null && value !== \"\") return value;\n if (rawFallback !== undefined) return rawFallback.trim();\n return match;\n },\n );\n}\n","import { 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 {\n PropertyField,\n WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport {\n substituteUrlVariables,\n type UrlVariableValues,\n} from \"@fluid-app/portal-core/url-templating\";\nimport { usePortalUrlVariables } from \"../contexts/PortalUrlVariablesContext\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport {\n Bell,\n BookmarkIcon,\n Calendar,\n ChevronRight,\n ExternalLink,\n Gift,\n Globe,\n Heart,\n Link as LinkIcon,\n Mail,\n MapPin,\n MessageCircle,\n Package,\n Phone,\n Play,\n Share2,\n ShoppingBag,\n Sparkles,\n Star,\n Trophy,\n User,\n Video,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\n\n// ---------- icon registry ----------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n User,\n Share2,\n ShoppingBag,\n Video,\n Mail,\n MessageCircle,\n Globe,\n Calendar,\n Bell,\n Heart,\n Star,\n Zap,\n Gift,\n Phone,\n MapPin,\n Play,\n Package,\n ExternalLink,\n Bookmark: BookmarkIcon,\n Trophy,\n Sparkles,\n Link: LinkIcon,\n};\n\nconst ICON_OPTIONS: Array<{ label: string; value: string }> = [\n { label: \"Link (default)\", value: \"Link\" },\n { label: \"User / Profile\", value: \"User\" },\n { label: \"Share\", value: \"Share2\" },\n { label: \"Shopping Bag\", value: \"ShoppingBag\" },\n { label: \"Video\", value: \"Video\" },\n { label: \"Mail\", value: \"Mail\" },\n { label: \"Message\", value: \"MessageCircle\" },\n { label: \"Globe\", value: \"Globe\" },\n { label: \"Calendar\", value: \"Calendar\" },\n { label: \"Bell / Notifications\", value: \"Bell\" },\n { label: \"Heart\", value: \"Heart\" },\n { label: \"Star\", value: \"Star\" },\n { label: \"Zap / Lightning\", value: \"Zap\" },\n { label: \"Gift\", value: \"Gift\" },\n { label: \"Phone\", value: \"Phone\" },\n { label: \"Map Pin\", value: \"MapPin\" },\n { label: \"Play\", value: \"Play\" },\n { label: \"Package\", value: \"Package\" },\n { label: \"External Link\", value: \"ExternalLink\" },\n { label: \"Bookmark\", value: \"Bookmark\" },\n { label: \"Trophy\", value: \"Trophy\" },\n { label: \"Sparkles\", value: \"Sparkles\" },\n];\n\nconst capitalize = (s: string): string =>\n s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n\nconst getIcon = (name: string | undefined): LucideIcon => {\n if (!name) return LinkIcon;\n return ICON_MAP[name] ?? ICON_MAP[capitalize(name)] ?? LinkIcon;\n};\n\n// ---------- link parsing / collection ----------\n\ntype ParsedLink = {\n id: string;\n label: string;\n url: string;\n iconName: string;\n iconColor: ColorOptions;\n};\n\nconst isColorOption = (value: string): value is ColorOptions =>\n [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n ].includes(value);\n\nconst FALLBACK_COLOR_CYCLE: ColorOptions[] = [\n \"primary\",\n \"accent\",\n \"secondary\",\n \"destructive\",\n];\n\n// Legacy format per line: \"Label | URL | IconName | ColorOption\"\n// Kept for backwards compatibility with existing saved configs.\nconst parseLegacyLinks = (raw: string[] | string): ParsedLink[] => {\n const lines = Array.isArray(raw) ? raw : raw.split(/\\r?\\n/).filter(Boolean);\n return lines\n .map((line, index) => {\n const parts = line.split(\"|\").map((s) => s.trim());\n const label = parts[0] ?? \"\";\n if (!label) return null;\n const url = parts[1] ?? \"#\";\n const iconName = parts[2] && parts[2].length > 0 ? parts[2] : \"Link\";\n const colorCandidate = parts[3];\n const iconColor: ColorOptions =\n colorCandidate && isColorOption(colorCandidate)\n ? colorCandidate\n : (FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\");\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// New structured format — gather links from individual link{n}* props\nconst MAX_LINKS = 8;\n\ntype SlotProps = {\n enabled: boolean;\n label: string | undefined;\n url: string | undefined;\n icon: string | undefined;\n color: ColorOptions | undefined;\n};\n\n// Per-slot merge of structured props with the legacy `links` array. A slot\n// is \"structurally configured\" when at least one of its content props\n// (label / url / icon / color) is explicitly set; in that case structured\n// props win and the slot's `enabled` flag is honored. Slots that haven't\n// been structurally touched fall back to the legacy entry at the same\n// index — so editing one slot in a legacy-format widget doesn't silently\n// drop URLs/icons/colors for the other slots.\nconst resolveLinks = (\n slots: SlotProps[],\n legacy: ParsedLink[],\n): ParsedLink[] => {\n return slots\n .map((slot, index): ParsedLink | null => {\n const legacyEntry = legacy[index];\n\n const hasStructured =\n slot.label !== undefined ||\n slot.url !== undefined ||\n slot.icon !== undefined ||\n slot.color !== undefined;\n\n if (hasStructured) {\n // Slot 1 is always enabled; slots 2+ need enabled=true.\n const isSlotActive = index === 0 || slot.enabled;\n if (!isSlotActive) return null;\n\n const label = (slot.label ?? legacyEntry?.label ?? \"\").trim();\n if (!label) return null;\n\n const url =\n slot.url && slot.url.length > 0\n ? slot.url\n : (legacyEntry?.url ?? \"#\");\n const iconName =\n slot.icon && slot.icon.length > 0\n ? slot.icon\n : (legacyEntry?.iconName ?? \"Link\");\n const iconColor: ColorOptions =\n slot.color ??\n legacyEntry?.iconColor ??\n FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\";\n\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n }\n\n // No structured props for this slot — use the legacy entry as-is.\n // Legacy widgets predate the per-slot `enabled` toggle, so we don't\n // gate legacy entries on it (otherwise legacy slots 5+ would vanish\n // because their `linkNEnabled` defaults to `false`).\n return legacyEntry ?? null;\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// ---------- link row ----------\n\ntype LinkRowProps = {\n link: ParsedLink;\n textColor: ColorOptions;\n borderRadius: BorderRadiusOptions;\n openInNewTab: boolean;\n showChevron: boolean;\n iconRadius: BorderRadiusOptions;\n layout: \"cards\" | \"list\";\n isLast: boolean;\n urlVariables: UrlVariableValues;\n};\n\nfunction LinkRow({\n link,\n textColor,\n borderRadius,\n openInNewTab,\n showChevron,\n iconRadius,\n layout,\n isLast,\n urlVariables,\n}: LinkRowProps) {\n const Icon = getIcon(link.iconName);\n\n const wrapperBase = `group relative flex items-center gap-3 py-3 transition-all duration-200`;\n const wrapperCardClasses = `rounded-${borderRadius} px-3 bg-${textColor}/5 hover:bg-${textColor}/10 hover:-translate-y-0.5`;\n const wrapperListClasses = `px-0 hover:bg-${textColor}/5 rounded-md`;\n\n const wrapperClasses =\n layout === \"cards\"\n ? `${wrapperBase} ${wrapperCardClasses}`\n : `${wrapperBase} ${wrapperListClasses}`;\n\n const content = (\n <>\n {/* Icon badge — colored gradient square with white icon centered */}\n <span\n aria-hidden=\"true\"\n className={`relative flex size-10 shrink-0 items-center justify-center rounded-${iconRadius} text-${link.iconColor}-foreground`}\n style={{\n background: `linear-gradient(135deg, color-mix(in oklch, var(--color-${link.iconColor}) 75%, white 25%) 0%, var(--color-${link.iconColor}) 100%)`,\n boxShadow: `\n inset 0 1px 0 rgba(255,255,255,0.25),\n inset 0 -1px 0 rgba(0,0,0,0.1),\n 0 1px 2px color-mix(in oklch, var(--color-${link.iconColor}) 30%, transparent)\n `,\n }}\n >\n <Icon className=\"size-5\" strokeWidth={2.25} />\n </span>\n\n {/* Label */}\n <span\n className={`min-w-0 flex-1 truncate text-[15px] font-bold tracking-[-0.01em] text-${textColor}`}\n >\n {link.label}\n </span>\n\n {/* Chevron */}\n {showChevron && (\n <ChevronRight\n aria-hidden=\"true\"\n className={`size-4 shrink-0 text-${textColor}/35 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-${textColor}/60`}\n />\n )}\n </>\n );\n\n const separator =\n layout === \"list\" && !isLast ? (\n <div\n aria-hidden=\"true\"\n className=\"ml-[52px]\"\n style={{\n borderBottom: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n />\n ) : null;\n\n const resolvedUrl =\n link.url && link.url !== \"#\"\n ? substituteUrlVariables(link.url, urlVariables)\n : link.url;\n const href = resolvedUrl && resolvedUrl !== \"#\" ? resolvedUrl : undefined;\n\n if (href) {\n return (\n <>\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noopener noreferrer\" : undefined}\n className={wrapperClasses}\n >\n {content}\n </a>\n {separator}\n </>\n );\n }\n\n return (\n <>\n <div className={wrapperClasses}>{content}</div>\n {separator}\n </>\n );\n}\n\n// ---------- widget ----------\n\ntype QuickLinksWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Links — new structured per-slot props\n link1Label?: string;\n link1Url?: string;\n link1Icon?: string;\n link1Color?: ColorOptions;\n link2Enabled?: boolean;\n link2Label?: string;\n link2Url?: string;\n link2Icon?: string;\n link2Color?: ColorOptions;\n link3Enabled?: boolean;\n link3Label?: string;\n link3Url?: string;\n link3Icon?: string;\n link3Color?: ColorOptions;\n link4Enabled?: boolean;\n link4Label?: string;\n link4Url?: string;\n link4Icon?: string;\n link4Color?: ColorOptions;\n link5Enabled?: boolean;\n link5Label?: string;\n link5Url?: string;\n link5Icon?: string;\n link5Color?: ColorOptions;\n link6Enabled?: boolean;\n link6Label?: string;\n link6Url?: string;\n link6Icon?: string;\n link6Color?: ColorOptions;\n link7Enabled?: boolean;\n link7Label?: string;\n link7Url?: string;\n link7Icon?: string;\n link7Color?: ColorOptions;\n link8Enabled?: boolean;\n link8Label?: string;\n link8Url?: string;\n link8Icon?: string;\n link8Color?: ColorOptions;\n\n // Legacy — still accepted for backwards compatibility\n links?: string[] | string;\n\n // Layout\n layout?: \"cards\" | \"list\";\n iconRadius?: BorderRadiusOptions;\n showChevron?: boolean;\n openInNewTab?: boolean;\n\n // Design\n background?: BackgroundValue;\n textColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nexport function QuickLinksWidget({\n titleEnabled = true,\n title = \"Quick Links\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n link1Label,\n link1Url,\n link1Icon,\n link1Color,\n link2Enabled = true,\n link2Label,\n link2Url,\n link2Icon,\n link2Color,\n link3Enabled = true,\n link3Label,\n link3Url,\n link3Icon,\n link3Color,\n link4Enabled = true,\n link4Label,\n link4Url,\n link4Icon,\n link4Color,\n link5Enabled = false,\n link5Label,\n link5Url,\n link5Icon,\n link5Color,\n link6Enabled = false,\n link6Label,\n link6Url,\n link6Icon,\n link6Color,\n link7Enabled = false,\n link7Label,\n link7Url,\n link7Icon,\n link7Color,\n link8Enabled = false,\n link8Label,\n link8Url,\n link8Icon,\n link8Color,\n\n links,\n\n layout = \"cards\",\n iconRadius = \"lg\",\n showChevron = true,\n openInNewTab = false,\n\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: QuickLinksWidgetProps): 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\n // Pass props through verbatim — schema `defaultValue`s pre-populate the\n // builder, so the component shouldn't second-guess with hardcoded\n // fallbacks (which would mask a user's explicit blank label).\n const slots: SlotProps[] = [\n {\n enabled: true,\n label: link1Label,\n url: link1Url,\n icon: link1Icon,\n color: link1Color,\n },\n {\n enabled: link2Enabled,\n label: link2Label,\n url: link2Url,\n icon: link2Icon,\n color: link2Color,\n },\n {\n enabled: link3Enabled,\n label: link3Label,\n url: link3Url,\n icon: link3Icon,\n color: link3Color,\n },\n {\n enabled: link4Enabled,\n label: link4Label,\n url: link4Url,\n icon: link4Icon,\n color: link4Color,\n },\n {\n enabled: link5Enabled,\n label: link5Label,\n url: link5Url,\n icon: link5Icon,\n color: link5Color,\n },\n {\n enabled: link6Enabled,\n label: link6Label,\n url: link6Url,\n icon: link6Icon,\n color: link6Color,\n },\n {\n enabled: link7Enabled,\n label: link7Label,\n url: link7Url,\n icon: link7Icon,\n color: link7Color,\n },\n {\n enabled: link8Enabled,\n label: link8Label,\n url: link8Url,\n icon: link8Icon,\n color: link8Color,\n },\n ];\n\n const legacyLinks: ParsedLink[] = links ? parseLegacyLinks(links) : [];\n const parsed: ParsedLink[] = resolveLinks(slots, legacyLinks);\n const urlVariables = usePortalUrlVariables();\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-3`}>\n {titleEnabled && title && (\n <h2\n className={`text-${titleFontSize} leading-tight font-bold tracking-[-0.01em] text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n\n {parsed.length === 0 ? (\n <p className={`text-[13px] text-${textColor}/55`}>\n No links configured.\n </p>\n ) : layout === \"cards\" ? (\n <div className=\"flex flex-col gap-2\">\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"cards\"\n isLast={idx === parsed.length - 1}\n urlVariables={urlVariables}\n />\n ))}\n </div>\n ) : (\n <div\n className={`flex flex-col overflow-hidden rounded-${borderRadius} bg-${textColor}/5`}\n >\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"list\"\n isLast={idx === parsed.length - 1}\n urlVariables={urlVariables}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ---------- schema helpers ----------\n\n// Quick-insert chips for the URL field property panel. Aligns with the\n// mobile builder's `TEMPLATE_TAGS` token set (same three tokens) — fallback\n// values differ on purpose: portal uses a concrete `/signup` path so the\n// inserted template renders cleanly, whereas mobile uses the literal\n// `fallback_path` placeholder for the admin to edit. The Portal Tenant BFF\n// resolves these server-side via `UrlResolver`; in admin builder preview,\n// `substituteUrlVariables` against `PREVIEW_URL_VARIABLES` renders sample\n// values so admins see what users will see.\nconst URL_TOKEN_SUGGESTIONS = [\n { label: \"username\", value: \"username || /signup\" },\n { label: \"replicated_url\", value: \"replicated_url\" },\n { label: \"external_id\", value: \"external_id || /signup\" },\n] as const;\n\ntype SlotDefaults = {\n label: string;\n icon: string;\n color: ColorOptions;\n};\n\nconst SLOT_DEFAULTS: Record<number, SlotDefaults | undefined> = {\n 1: { label: \"Profile\", icon: \"User\", color: \"primary\" },\n 2: { label: \"Social\", icon: \"Share2\", color: \"accent\" },\n 3: { label: \"Product Links\", icon: \"ShoppingBag\", color: \"secondary\" },\n 4: { label: \"Video\", icon: \"Video\", color: \"destructive\" },\n};\n\nfunction buildLinkSlotFields(slot: number): PropertyField[] {\n const group = `Link ${slot}`;\n const isFirst = slot === 1;\n const defaults = SLOT_DEFAULTS[slot];\n // Enable slots 2-4 by default to match the previous widget behavior.\n const enabledDefault = slot >= 2 && slot <= 4;\n const requires = isFirst ? undefined : `link${slot}Enabled`;\n\n const fields: PropertyField[] = [];\n\n if (!isFirst) {\n fields.push({\n key: `link${slot}Enabled`,\n label: `Show Link ${slot}`,\n type: \"boolean\",\n description: `Display link slot ${slot}`,\n defaultValue: enabledDefault,\n group,\n });\n }\n\n fields.push({\n key: `link${slot}Label`,\n label: \"Label\",\n type: \"text\",\n description: \"Text shown on the link\",\n defaultValue: defaults?.label ?? \"\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Url`,\n label: \"URL\",\n type: \"text\",\n description:\n \"Where the link points (use '#' for a placeholder). Click a chip below to insert a user variable (e.g. `{{username}}`, `{{replicated_url}}`, `{{external_id}}`); append `|| /fallback` to set a fallback path.\",\n defaultValue: \"#\",\n tokenSuggestions: URL_TOKEN_SUGGESTIONS,\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Icon`,\n label: \"Icon\",\n type: \"select\",\n description: \"Icon displayed in the colored badge\",\n options: ICON_OPTIONS,\n defaultValue: defaults?.icon ?? \"Link\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Color`,\n label: \"Badge Color\",\n type: \"colorSelect\",\n description: \"Color of the icon badge\",\n defaultValue:\n defaults?.color ??\n FALLBACK_COLOR_CYCLE[(slot - 1) % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n return fields;\n}\n\nconst linkSlotFields: PropertyField[] = Array.from(\n { length: MAX_LINKS },\n (_, i) => buildLinkSlotFields(i + 1),\n).flat();\n\n// ---------- schema ----------\n\nexport const quickLinksWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"QuickLinksWidget\",\n displayName: \"Quick Links\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Small heading shown above the link list\",\n defaultValue: true,\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Heading shown above the links\",\n defaultValue: \"Quick Links\",\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: \"md\",\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 group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Links — 8 structured slots\n ...linkSlotFields,\n\n // Layout group\n {\n key: \"layout\",\n label: \"Layout\",\n type: \"buttonGroup\",\n description: \"Cards: separated tiles. List: grouped rows with dividers.\",\n defaultValue: \"cards\",\n options: [\n { label: \"Cards\", value: \"cards\" },\n { label: \"List\", value: \"list\" },\n ],\n group: \"Layout\",\n },\n getBorderRadiusField({\n key: \"iconRadius\",\n label: \"Icon Corner Radius\",\n description: \"Corner radius for the colored icon badge\",\n defaultValue: \"lg\",\n group: \"Layout\",\n }),\n {\n key: \"showChevron\",\n label: \"Show Chevron\",\n type: \"boolean\",\n description: \"Right-aligned chevron indicating each row is a link\",\n defaultValue: true,\n group: \"Layout\",\n },\n {\n key: \"openInNewTab\",\n label: \"Open in New Tab\",\n type: \"boolean\",\n description: \"Open links in a new tab instead of the same window\",\n defaultValue: false,\n group: \"Layout\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description:\n \"Label + chevron color, and the base for row backgrounds (via opacity)\",\n defaultValue: \"foreground\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget\",\n defaultValue: 4,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description:\n \"Widget border radius (also drives row corners in cards layout)\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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,EACH,UACA,EAAA,CAAA;AAIP,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,EAC9C,UACA,EAAA,CAAA;;AAwEP,SAAgB,iBAAiB,EAC/B,eAAe,MACf,QAAQ,eACR,gBAAgB,MAChB,aAAa,cAEb,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YAEA,OAEA,SAAS,SACT,aAAa,MACb,cAAc,MACd,eAAe,OAEf,aAAa;CAAE,MAAM;CAAS,OAAO;CAAc,EACnD,YAAY,cACZ,UAAU,GACV,eAAe,MACf,cAAc,QACd,cAAc,SAEd,WACA,GAAG,SACwC;CAC3C,MAAM,kBAAkB,WAAW,SAAS;CAC5C,MAAM,mBACH,WAAW,UAAU,aAAa,WAAW,UAAU,aACxD,WAAW,SAAS,UAChB,OAAO,WAAW,SAAS,aAAa,WAAW,SAAS,SAAS,KACrE;CAiEN,MAAM,SAAuB,aA5DF;EACzB;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EA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AAO;GACP,qBAAqB;GACtB,CAAC;EACF,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACP,qBAAqB;GACtB,CAAC;EAGF,GAAG;EAGH;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,SAAS,CACP;IAAE,OAAO;IAAS,OAAO;IAAS,EAClC;IAAE,OAAO;IAAQ,OAAO;IAAQ,CACjC;GACD,OAAO;GACR;EACD,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,OAAO;GACR;EAGD;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR;EACD,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aACE;GACF,cAAc;GACd,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACR;EACD,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF,qBAAqB;GACnB,KAAK;GACL,OAAO;GACP,aACE;GACF,cAAc;GACd,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF,oBAAoB;GAClB,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACH;CACF"}
@@ -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 { n as useWidgetInteraction } from "./WidgetInteractionContext-BWH7njU7.mjs";
3
3
  import { i as getBorderColorField, l as getColorField, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-59Barbhg.mjs";
4
4
  import { useCallback, useEffect, useState } from "react";
@@ -615,4 +615,4 @@ const quickShareWidgetPropertySchema = {
615
615
  //#endregion
616
616
  export { QuickShareWidget_exports as n, quickShareWidgetPropertySchema as r, QuickShareWidget as t };
617
617
 
618
- //# sourceMappingURL=QuickShareWidget-BJpqzZp0.mjs.map
618
+ //# sourceMappingURL=QuickShareWidget-B7DhQOyt.mjs.map