@fayz-ai/saas 0.1.6

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 (645) hide show
  1. package/dist/app/AdminShell.d.ts +31 -0
  2. package/dist/app/AdminShell.d.ts.map +1 -0
  3. package/dist/app/LoginPage.d.ts +17 -0
  4. package/dist/app/LoginPage.d.ts.map +1 -0
  5. package/dist/app/config.d.ts +83 -0
  6. package/dist/app/config.d.ts.map +1 -0
  7. package/dist/app/createFayzApp.d.ts +11 -0
  8. package/dist/app/createFayzApp.d.ts.map +1 -0
  9. package/dist/app/routing.d.ts +10 -0
  10. package/dist/app/routing.d.ts.map +1 -0
  11. package/dist/app/scaffold.d.ts +17 -0
  12. package/dist/app/scaffold.d.ts.map +1 -0
  13. package/dist/archetype-lookup.d.ts +30 -0
  14. package/dist/archetype-lookup.d.ts.map +1 -0
  15. package/dist/billing/index.cjs +12 -0
  16. package/dist/billing/index.cjs.map +1 -0
  17. package/dist/billing/index.d.ts +3 -0
  18. package/dist/billing/index.d.ts.map +1 -0
  19. package/dist/billing/index.js +3 -0
  20. package/dist/billing/index.js.map +1 -0
  21. package/dist/billing/store.d.ts +35 -0
  22. package/dist/billing/store.d.ts.map +1 -0
  23. package/dist/chunk-4XTQ4V5L.cjs +124 -0
  24. package/dist/chunk-4XTQ4V5L.cjs.map +1 -0
  25. package/dist/chunk-5GYQK5IW.js +21 -0
  26. package/dist/chunk-5GYQK5IW.js.map +1 -0
  27. package/dist/chunk-DJW67TCY.js +781 -0
  28. package/dist/chunk-DJW67TCY.js.map +1 -0
  29. package/dist/chunk-KYID2MR6.cjs +23 -0
  30. package/dist/chunk-KYID2MR6.cjs.map +1 -0
  31. package/dist/chunk-QGMDVLLW.cjs +816 -0
  32. package/dist/chunk-QGMDVLLW.cjs.map +1 -0
  33. package/dist/chunk-XNWCGJYH.js +97 -0
  34. package/dist/chunk-XNWCGJYH.js.map +1 -0
  35. package/dist/components/shared/PersonLink.d.ts +18 -0
  36. package/dist/components/shared/PersonLink.d.ts.map +1 -0
  37. package/dist/crud/CrudCardGrid.d.ts +13 -0
  38. package/dist/crud/CrudCardGrid.d.ts.map +1 -0
  39. package/dist/crud/CrudDetailPage.d.ts +18 -0
  40. package/dist/crud/CrudDetailPage.d.ts.map +1 -0
  41. package/dist/crud/CrudFormPage.d.ts +18 -0
  42. package/dist/crud/CrudFormPage.d.ts.map +1 -0
  43. package/dist/crud/CrudListView.d.ts +51 -0
  44. package/dist/crud/CrudListView.d.ts.map +1 -0
  45. package/dist/crud/CrudPage.d.ts +20 -0
  46. package/dist/crud/CrudPage.d.ts.map +1 -0
  47. package/dist/crud/DeleteConfirmDialog.d.ts +11 -0
  48. package/dist/crud/DeleteConfirmDialog.d.ts.map +1 -0
  49. package/dist/crud/EntityOverview.d.ts +14 -0
  50. package/dist/crud/EntityOverview.d.ts.map +1 -0
  51. package/dist/crud/ImportWizard.d.ts +18 -0
  52. package/dist/crud/ImportWizard.d.ts.map +1 -0
  53. package/dist/crud/archetypes/ActiveToggle.d.ts +8 -0
  54. package/dist/crud/archetypes/ActiveToggle.d.ts.map +1 -0
  55. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts +11 -0
  56. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts.map +1 -0
  57. package/dist/crud/archetypes/BlockSettingsPopover.d.ts +15 -0
  58. package/dist/crud/archetypes/BlockSettingsPopover.d.ts.map +1 -0
  59. package/dist/crud/archetypes/EntityLink.d.ts +32 -0
  60. package/dist/crud/archetypes/EntityLink.d.ts.map +1 -0
  61. package/dist/crud/archetypes/LocationDetailTabs.d.ts +11 -0
  62. package/dist/crud/archetypes/LocationDetailTabs.d.ts.map +1 -0
  63. package/dist/crud/archetypes/LocationFormLayout.d.ts +12 -0
  64. package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -0
  65. package/dist/crud/archetypes/PersonDetailTabs.d.ts +22 -0
  66. package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -0
  67. package/dist/crud/archetypes/PersonFormLayout.d.ts +13 -0
  68. package/dist/crud/archetypes/PersonFormLayout.d.ts.map +1 -0
  69. package/dist/crud/archetypes/PersonPicker.d.ts +23 -0
  70. package/dist/crud/archetypes/PersonPicker.d.ts.map +1 -0
  71. package/dist/crud/archetypes/ProductDetailTabs.d.ts +11 -0
  72. package/dist/crud/archetypes/ProductDetailTabs.d.ts.map +1 -0
  73. package/dist/crud/archetypes/ProductFormLayout.d.ts +12 -0
  74. package/dist/crud/archetypes/ProductFormLayout.d.ts.map +1 -0
  75. package/dist/crud/archetypes/ScheduleEditor.d.ts +7 -0
  76. package/dist/crud/archetypes/ScheduleEditor.d.ts.map +1 -0
  77. package/dist/crud/archetypes/ServiceDetailTabs.d.ts +10 -0
  78. package/dist/crud/archetypes/ServiceDetailTabs.d.ts.map +1 -0
  79. package/dist/crud/archetypes/ServiceFormLayout.d.ts +12 -0
  80. package/dist/crud/archetypes/ServiceFormLayout.d.ts.map +1 -0
  81. package/dist/crud/archetypes/SubjectDetailTabs.d.ts +12 -0
  82. package/dist/crud/archetypes/SubjectDetailTabs.d.ts.map +1 -0
  83. package/dist/crud/archetypes/SubjectFormLayout.d.ts +14 -0
  84. package/dist/crud/archetypes/SubjectFormLayout.d.ts.map +1 -0
  85. package/dist/crud/createCrudPage.d.ts +20 -0
  86. package/dist/crud/createCrudPage.d.ts.map +1 -0
  87. package/dist/crud/csv-export.d.ts +3 -0
  88. package/dist/crud/csv-export.d.ts.map +1 -0
  89. package/dist/crud/fieldToColumn.d.ts +14 -0
  90. package/dist/crud/fieldToColumn.d.ts.map +1 -0
  91. package/dist/crud/index.d.ts +12 -0
  92. package/dist/crud/index.d.ts.map +1 -0
  93. package/dist/hooks/useFieldRules.d.ts +5 -0
  94. package/dist/hooks/useFieldRules.d.ts.map +1 -0
  95. package/dist/hooks/useModuleNavigation.d.ts +25 -0
  96. package/dist/hooks/useModuleNavigation.d.ts.map +1 -0
  97. package/dist/hooks/usePluginPrefs.d.ts +23 -0
  98. package/dist/hooks/usePluginPrefs.d.ts.map +1 -0
  99. package/dist/index.cjs +13880 -0
  100. package/dist/index.cjs.map +1 -0
  101. package/dist/index.d.ts +46 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +13730 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/lib/currency.d.ts +13 -0
  106. package/dist/lib/currency.d.ts.map +1 -0
  107. package/dist/lib/entity-routes.d.ts +24 -0
  108. package/dist/lib/entity-routes.d.ts.map +1 -0
  109. package/dist/lib/schedule-config.d.ts +32 -0
  110. package/dist/lib/schedule-config.d.ts.map +1 -0
  111. package/dist/lib/schedule-service.d.ts +76 -0
  112. package/dist/lib/schedule-service.d.ts.map +1 -0
  113. package/dist/org/adapters/mock.d.ts +4 -0
  114. package/dist/org/adapters/mock.d.ts.map +1 -0
  115. package/dist/org/adapters/supabase.d.ts +7 -0
  116. package/dist/org/adapters/supabase.d.ts.map +1 -0
  117. package/dist/org/context.d.ts +29 -0
  118. package/dist/org/context.d.ts.map +1 -0
  119. package/dist/org/index.cjs +44 -0
  120. package/dist/org/index.cjs.map +1 -0
  121. package/dist/org/index.d.ts +8 -0
  122. package/dist/org/index.d.ts.map +1 -0
  123. package/dist/org/index.js +3 -0
  124. package/dist/org/index.js.map +1 -0
  125. package/dist/org/store.d.ts +16 -0
  126. package/dist/org/store.d.ts.map +1 -0
  127. package/dist/permissions/PermissionGate.d.ts +12 -0
  128. package/dist/permissions/PermissionGate.d.ts.map +1 -0
  129. package/dist/permissions/context.d.ts +37 -0
  130. package/dist/permissions/context.d.ts.map +1 -0
  131. package/dist/permissions/index.cjs +32 -0
  132. package/dist/permissions/index.cjs.map +1 -0
  133. package/dist/permissions/index.d.ts +5 -0
  134. package/dist/permissions/index.d.ts.map +1 -0
  135. package/dist/permissions/index.js +3 -0
  136. package/dist/permissions/index.js.map +1 -0
  137. package/dist/permissions/store.d.ts +21 -0
  138. package/dist/permissions/store.d.ts.map +1 -0
  139. package/dist/placeholder.d.ts +7 -0
  140. package/dist/placeholder.d.ts.map +1 -0
  141. package/dist/plugins/ModuleActionBar.d.ts +27 -0
  142. package/dist/plugins/ModuleActionBar.d.ts.map +1 -0
  143. package/dist/plugins/PluginRegistryManager.d.ts +13 -0
  144. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -0
  145. package/dist/plugins/QuickActionsButton.d.ts +12 -0
  146. package/dist/plugins/QuickActionsButton.d.ts.map +1 -0
  147. package/dist/plugins/SettingsGroup.d.ts +25 -0
  148. package/dist/plugins/SettingsGroup.d.ts.map +1 -0
  149. package/dist/plugins/WidgetSlot.d.ts +8 -0
  150. package/dist/plugins/WidgetSlot.d.ts.map +1 -0
  151. package/dist/plugins/createPluginContext.d.ts +28 -0
  152. package/dist/plugins/createPluginContext.d.ts.map +1 -0
  153. package/dist/plugins/createViewRouter.d.ts +38 -0
  154. package/dist/plugins/createViewRouter.d.ts.map +1 -0
  155. package/dist/shell/components/auth/CenteredLogin.d.ts +13 -0
  156. package/dist/shell/components/auth/CenteredLogin.d.ts.map +1 -0
  157. package/dist/shell/components/auth/LoginForm.d.ts +12 -0
  158. package/dist/shell/components/auth/LoginForm.d.ts.map +1 -0
  159. package/dist/shell/components/auth/LoginPage.d.ts +15 -0
  160. package/dist/shell/components/auth/LoginPage.d.ts.map +1 -0
  161. package/dist/shell/components/auth/OAuthButtons.d.ts +10 -0
  162. package/dist/shell/components/auth/OAuthButtons.d.ts.map +1 -0
  163. package/dist/shell/components/auth/ProtectedRoute.d.ts +11 -0
  164. package/dist/shell/components/auth/ProtectedRoute.d.ts.map +1 -0
  165. package/dist/shell/components/auth/RecoveryForm.d.ts +9 -0
  166. package/dist/shell/components/auth/RecoveryForm.d.ts.map +1 -0
  167. package/dist/shell/components/auth/SignupForm.d.ts +10 -0
  168. package/dist/shell/components/auth/SignupForm.d.ts.map +1 -0
  169. package/dist/shell/components/auth/SplitLogin.d.ts +14 -0
  170. package/dist/shell/components/auth/SplitLogin.d.ts.map +1 -0
  171. package/dist/shell/components/auth/index.d.ts +7 -0
  172. package/dist/shell/components/auth/index.d.ts.map +1 -0
  173. package/dist/shell/components/billing/BillingPage.d.ts +7 -0
  174. package/dist/shell/components/billing/BillingPage.d.ts.map +1 -0
  175. package/dist/shell/components/billing/InvoiceList.d.ts +9 -0
  176. package/dist/shell/components/billing/InvoiceList.d.ts.map +1 -0
  177. package/dist/shell/components/billing/PaywallGate.d.ts +11 -0
  178. package/dist/shell/components/billing/PaywallGate.d.ts.map +1 -0
  179. package/dist/shell/components/billing/PlanSelector.d.ts +13 -0
  180. package/dist/shell/components/billing/PlanSelector.d.ts.map +1 -0
  181. package/dist/shell/components/billing/SubscriptionCard.d.ts +12 -0
  182. package/dist/shell/components/billing/SubscriptionCard.d.ts.map +1 -0
  183. package/dist/shell/components/billing/index.d.ts +6 -0
  184. package/dist/shell/components/billing/index.d.ts.map +1 -0
  185. package/dist/shell/components/chat/ChatFab.d.ts +9 -0
  186. package/dist/shell/components/chat/ChatFab.d.ts.map +1 -0
  187. package/dist/shell/components/chat/ChatPanel.d.ts +10 -0
  188. package/dist/shell/components/chat/ChatPanel.d.ts.map +1 -0
  189. package/dist/shell/components/chat/ChatSuggestions.d.ts +14 -0
  190. package/dist/shell/components/chat/ChatSuggestions.d.ts.map +1 -0
  191. package/dist/shell/components/chat/index.d.ts +3 -0
  192. package/dist/shell/components/chat/index.d.ts.map +1 -0
  193. package/dist/shell/components/crud/archetypes/ClientOrdersTab.d.ts +16 -0
  194. package/dist/shell/components/crud/archetypes/ClientOrdersTab.d.ts.map +1 -0
  195. package/dist/shell/components/layout/BottomNav.d.ts +24 -0
  196. package/dist/shell/components/layout/BottomNav.d.ts.map +1 -0
  197. package/dist/shell/components/layout/CommandPalette.d.ts +29 -0
  198. package/dist/shell/components/layout/CommandPalette.d.ts.map +1 -0
  199. package/dist/shell/components/layout/LocationSwitchOverlay.d.ts +3 -0
  200. package/dist/shell/components/layout/LocationSwitchOverlay.d.ts.map +1 -0
  201. package/dist/shell/components/layout/MockModeBanner.d.ts +3 -0
  202. package/dist/shell/components/layout/MockModeBanner.d.ts.map +1 -0
  203. package/dist/shell/components/layout/PrintChrome.d.ts +10 -0
  204. package/dist/shell/components/layout/PrintChrome.d.ts.map +1 -0
  205. package/dist/shell/components/layout/index.d.ts +6 -0
  206. package/dist/shell/components/layout/index.d.ts.map +1 -0
  207. package/dist/shell/components/notifications/ChangelogFeed.d.ts +8 -0
  208. package/dist/shell/components/notifications/ChangelogFeed.d.ts.map +1 -0
  209. package/dist/shell/components/notifications/NotificationBell.d.ts +9 -0
  210. package/dist/shell/components/notifications/NotificationBell.d.ts.map +1 -0
  211. package/dist/shell/components/notifications/NotificationInbox.d.ts +13 -0
  212. package/dist/shell/components/notifications/NotificationInbox.d.ts.map +1 -0
  213. package/dist/shell/components/notifications/ToastProvider.d.ts +2 -0
  214. package/dist/shell/components/notifications/ToastProvider.d.ts.map +1 -0
  215. package/dist/shell/components/notifications/index.d.ts +5 -0
  216. package/dist/shell/components/notifications/index.d.ts.map +1 -0
  217. package/dist/shell/components/organization/ImpersonationBanner.d.ts +3 -0
  218. package/dist/shell/components/organization/ImpersonationBanner.d.ts.map +1 -0
  219. package/dist/shell/components/organization/InviteMemberDialog.d.ts +10 -0
  220. package/dist/shell/components/organization/InviteMemberDialog.d.ts.map +1 -0
  221. package/dist/shell/components/organization/OrgInitializer.d.ts +7 -0
  222. package/dist/shell/components/organization/OrgInitializer.d.ts.map +1 -0
  223. package/dist/shell/components/organization/OrgSwitcher.d.ts +7 -0
  224. package/dist/shell/components/organization/OrgSwitcher.d.ts.map +1 -0
  225. package/dist/shell/components/organization/PermissionGate.d.ts +11 -0
  226. package/dist/shell/components/organization/PermissionGate.d.ts.map +1 -0
  227. package/dist/shell/components/organization/PermissionMatrixEditor.d.ts +17 -0
  228. package/dist/shell/components/organization/PermissionMatrixEditor.d.ts.map +1 -0
  229. package/dist/shell/components/organization/PermissionProfilesTab.d.ts +3 -0
  230. package/dist/shell/components/organization/PermissionProfilesTab.d.ts.map +1 -0
  231. package/dist/shell/components/organization/TeamTab.d.ts +3 -0
  232. package/dist/shell/components/organization/TeamTab.d.ts.map +1 -0
  233. package/dist/shell/components/organization/TenantOnboarding.d.ts +9 -0
  234. package/dist/shell/components/organization/TenantOnboarding.d.ts.map +1 -0
  235. package/dist/shell/components/organization/index.d.ts +8 -0
  236. package/dist/shell/components/organization/index.d.ts.map +1 -0
  237. package/dist/shell/components/plugins/PluginSettingsPanel.d.ts +23 -0
  238. package/dist/shell/components/plugins/PluginSettingsPanel.d.ts.map +1 -0
  239. package/dist/shell/components/settings/BrandingSettings.d.ts +12 -0
  240. package/dist/shell/components/settings/BrandingSettings.d.ts.map +1 -0
  241. package/dist/shell/components/settings/CompanySettings.d.ts +13 -0
  242. package/dist/shell/components/settings/CompanySettings.d.ts.map +1 -0
  243. package/dist/shell/components/settings/ConnectedBrandingSettings.d.ts +2 -0
  244. package/dist/shell/components/settings/ConnectedBrandingSettings.d.ts.map +1 -0
  245. package/dist/shell/components/settings/ConnectedCompanySettings.d.ts +2 -0
  246. package/dist/shell/components/settings/ConnectedCompanySettings.d.ts.map +1 -0
  247. package/dist/shell/components/settings/ConnectedFieldRulesSettings.d.ts +2 -0
  248. package/dist/shell/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -0
  249. package/dist/shell/components/settings/ConnectedHolidaysSettings.d.ts +3 -0
  250. package/dist/shell/components/settings/ConnectedHolidaysSettings.d.ts.map +1 -0
  251. package/dist/shell/components/settings/ConnectedLocationsOverview.d.ts +3 -0
  252. package/dist/shell/components/settings/ConnectedLocationsOverview.d.ts.map +1 -0
  253. package/dist/shell/components/settings/ConnectedSecuritySettings.d.ts +2 -0
  254. package/dist/shell/components/settings/ConnectedSecuritySettings.d.ts.map +1 -0
  255. package/dist/shell/components/settings/ConnectedUserProfile.d.ts +2 -0
  256. package/dist/shell/components/settings/ConnectedUserProfile.d.ts.map +1 -0
  257. package/dist/shell/components/settings/FieldRulesSettings.d.ts +11 -0
  258. package/dist/shell/components/settings/FieldRulesSettings.d.ts.map +1 -0
  259. package/dist/shell/components/settings/HolidaysSettings.d.ts +21 -0
  260. package/dist/shell/components/settings/HolidaysSettings.d.ts.map +1 -0
  261. package/dist/shell/components/settings/LocationsCrudPage.d.ts +6 -0
  262. package/dist/shell/components/settings/LocationsCrudPage.d.ts.map +1 -0
  263. package/dist/shell/components/settings/LocationsOverview.d.ts +19 -0
  264. package/dist/shell/components/settings/LocationsOverview.d.ts.map +1 -0
  265. package/dist/shell/components/settings/SecuritySettings.d.ts +17 -0
  266. package/dist/shell/components/settings/SecuritySettings.d.ts.map +1 -0
  267. package/dist/shell/components/settings/SettingsPage.d.ts +18 -0
  268. package/dist/shell/components/settings/SettingsPage.d.ts.map +1 -0
  269. package/dist/shell/components/settings/UserProfile.d.ts +12 -0
  270. package/dist/shell/components/settings/UserProfile.d.ts.map +1 -0
  271. package/dist/shell/components/settings/index.d.ts +11 -0
  272. package/dist/shell/components/settings/index.d.ts.map +1 -0
  273. package/dist/shell/config/index.d.ts +7 -0
  274. package/dist/shell/config/index.d.ts.map +1 -0
  275. package/dist/shell/config/permissions.d.ts +7 -0
  276. package/dist/shell/config/permissions.d.ts.map +1 -0
  277. package/dist/shell/config/tailwind-preset.d.ts +4 -0
  278. package/dist/shell/config/tailwind-preset.d.ts.map +1 -0
  279. package/dist/shell/config/theme/dark.d.ts +3 -0
  280. package/dist/shell/config/theme/dark.d.ts.map +1 -0
  281. package/dist/shell/config/theme/index.d.ts +6 -0
  282. package/dist/shell/config/theme/index.d.ts.map +1 -0
  283. package/dist/shell/config/theme/light.d.ts +3 -0
  284. package/dist/shell/config/theme/light.d.ts.map +1 -0
  285. package/dist/shell/config/theme/tokens.d.ts +97 -0
  286. package/dist/shell/config/theme/tokens.d.ts.map +1 -0
  287. package/dist/shell/config/theme/utils.d.ts +23 -0
  288. package/dist/shell/config/theme/utils.d.ts.map +1 -0
  289. package/dist/shell/createSaasApp.d.ts +145 -0
  290. package/dist/shell/createSaasApp.d.ts.map +1 -0
  291. package/dist/shell/hooks/index.d.ts +19 -0
  292. package/dist/shell/hooks/index.d.ts.map +1 -0
  293. package/dist/shell/hooks/useAITools.d.ts +21 -0
  294. package/dist/shell/hooks/useAITools.d.ts.map +1 -0
  295. package/dist/shell/hooks/useAuth.d.ts +16 -0
  296. package/dist/shell/hooks/useAuth.d.ts.map +1 -0
  297. package/dist/shell/hooks/useBilling.d.ts +14 -0
  298. package/dist/shell/hooks/useBilling.d.ts.map +1 -0
  299. package/dist/shell/hooks/useChat.d.ts +16 -0
  300. package/dist/shell/hooks/useChat.d.ts.map +1 -0
  301. package/dist/shell/hooks/useFieldRules.d.ts +6 -0
  302. package/dist/shell/hooks/useFieldRules.d.ts.map +1 -0
  303. package/dist/shell/hooks/useFormatters.d.ts +7 -0
  304. package/dist/shell/hooks/useFormatters.d.ts.map +1 -0
  305. package/dist/shell/hooks/useLayout.d.ts +16 -0
  306. package/dist/shell/hooks/useLayout.d.ts.map +1 -0
  307. package/dist/shell/hooks/useModuleNavigation.d.ts +25 -0
  308. package/dist/shell/hooks/useModuleNavigation.d.ts.map +1 -0
  309. package/dist/shell/hooks/useNotifications.d.ts +11 -0
  310. package/dist/shell/hooks/useNotifications.d.ts.map +1 -0
  311. package/dist/shell/hooks/usePermission.d.ts +16 -0
  312. package/dist/shell/hooks/usePermission.d.ts.map +1 -0
  313. package/dist/shell/hooks/usePluginPrefs.d.ts +23 -0
  314. package/dist/shell/hooks/usePluginPrefs.d.ts.map +1 -0
  315. package/dist/shell/hooks/usePlugins.d.ts +5 -0
  316. package/dist/shell/hooks/usePlugins.d.ts.map +1 -0
  317. package/dist/shell/hooks/useTenant.d.ts +23 -0
  318. package/dist/shell/hooks/useTenant.d.ts.map +1 -0
  319. package/dist/shell/hooks/useTenantPlugins.d.ts +10 -0
  320. package/dist/shell/hooks/useTenantPlugins.d.ts.map +1 -0
  321. package/dist/shell/hooks/useTranslation.d.ts +5 -0
  322. package/dist/shell/hooks/useTranslation.d.ts.map +1 -0
  323. package/dist/shell/lib/api.d.ts +28 -0
  324. package/dist/shell/lib/api.d.ts.map +1 -0
  325. package/dist/shell/lib/apply-field-rules.d.ts +4 -0
  326. package/dist/shell/lib/apply-field-rules.d.ts.map +1 -0
  327. package/dist/shell/lib/auth-adapters/mock.d.ts +3 -0
  328. package/dist/shell/lib/auth-adapters/mock.d.ts.map +1 -0
  329. package/dist/shell/lib/auth-adapters/supabase.d.ts +3 -0
  330. package/dist/shell/lib/auth-adapters/supabase.d.ts.map +1 -0
  331. package/dist/shell/lib/auth-context.d.ts +5 -0
  332. package/dist/shell/lib/auth-context.d.ts.map +1 -0
  333. package/dist/shell/lib/cache.d.ts +18 -0
  334. package/dist/shell/lib/cache.d.ts.map +1 -0
  335. package/dist/shell/lib/cn.d.ts +2 -0
  336. package/dist/shell/lib/cn.d.ts.map +1 -0
  337. package/dist/shell/lib/core-ai-tools.d.ts +15 -0
  338. package/dist/shell/lib/core-ai-tools.d.ts.map +1 -0
  339. package/dist/shell/lib/create-client-orders-provider.d.ts +3 -0
  340. package/dist/shell/lib/create-client-orders-provider.d.ts.map +1 -0
  341. package/dist/shell/lib/csv.d.ts +14 -0
  342. package/dist/shell/lib/csv.d.ts.map +1 -0
  343. package/dist/shell/lib/dedup.d.ts +2 -0
  344. package/dist/shell/lib/dedup.d.ts.map +1 -0
  345. package/dist/shell/lib/entity-registry.d.ts +19 -0
  346. package/dist/shell/lib/entity-registry.d.ts.map +1 -0
  347. package/dist/shell/lib/entity-routes.d.ts +24 -0
  348. package/dist/shell/lib/entity-routes.d.ts.map +1 -0
  349. package/dist/shell/lib/format.d.ts +7 -0
  350. package/dist/shell/lib/format.d.ts.map +1 -0
  351. package/dist/shell/lib/i18n.d.ts +4 -0
  352. package/dist/shell/lib/i18n.d.ts.map +1 -0
  353. package/dist/shell/lib/locale-config.d.ts +8 -0
  354. package/dist/shell/lib/locale-config.d.ts.map +1 -0
  355. package/dist/shell/lib/org-adapters/mock.d.ts +4 -0
  356. package/dist/shell/lib/org-adapters/mock.d.ts.map +1 -0
  357. package/dist/shell/lib/org-adapters/supabase.d.ts +3 -0
  358. package/dist/shell/lib/org-adapters/supabase.d.ts.map +1 -0
  359. package/dist/shell/lib/org-context.d.ts +5 -0
  360. package/dist/shell/lib/org-context.d.ts.map +1 -0
  361. package/dist/shell/lib/plugins.d.ts +2 -0
  362. package/dist/shell/lib/plugins.d.ts.map +1 -0
  363. package/dist/shell/lib/router.d.ts +15 -0
  364. package/dist/shell/lib/router.d.ts.map +1 -0
  365. package/dist/shell/lib/schedule-config.d.ts +32 -0
  366. package/dist/shell/lib/schedule-config.d.ts.map +1 -0
  367. package/dist/shell/lib/schedule-service.d.ts +76 -0
  368. package/dist/shell/lib/schedule-service.d.ts.map +1 -0
  369. package/dist/shell/lib/supabase.d.ts +9 -0
  370. package/dist/shell/lib/supabase.d.ts.map +1 -0
  371. package/dist/shell/stores/auth.store.d.ts +12 -0
  372. package/dist/shell/stores/auth.store.d.ts.map +1 -0
  373. package/dist/shell/stores/billing.store.d.ts +2 -0
  374. package/dist/shell/stores/billing.store.d.ts.map +1 -0
  375. package/dist/shell/stores/chat.store.d.ts +20 -0
  376. package/dist/shell/stores/chat.store.d.ts.map +1 -0
  377. package/dist/shell/stores/index.d.ts +13 -0
  378. package/dist/shell/stores/index.d.ts.map +1 -0
  379. package/dist/shell/stores/invite.store.d.ts +11 -0
  380. package/dist/shell/stores/invite.store.d.ts.map +1 -0
  381. package/dist/shell/stores/layout.store.d.ts +2 -0
  382. package/dist/shell/stores/layout.store.d.ts.map +1 -0
  383. package/dist/shell/stores/locale.store.d.ts +7 -0
  384. package/dist/shell/stores/locale.store.d.ts.map +1 -0
  385. package/dist/shell/stores/location.store.d.ts +20 -0
  386. package/dist/shell/stores/location.store.d.ts.map +1 -0
  387. package/dist/shell/stores/notifications.store.d.ts +12 -0
  388. package/dist/shell/stores/notifications.store.d.ts.map +1 -0
  389. package/dist/shell/stores/organization.store.d.ts +2 -0
  390. package/dist/shell/stores/organization.store.d.ts.map +1 -0
  391. package/dist/shell/stores/permissions.store.d.ts +2 -0
  392. package/dist/shell/stores/permissions.store.d.ts.map +1 -0
  393. package/dist/shell/stores/plugin.store.d.ts +24 -0
  394. package/dist/shell/stores/plugin.store.d.ts.map +1 -0
  395. package/dist/shell/stores/tenant.store.d.ts +11 -0
  396. package/dist/shell/stores/tenant.store.d.ts.map +1 -0
  397. package/dist/shell/stores/theme.store.d.ts +17 -0
  398. package/dist/shell/stores/theme.store.d.ts.map +1 -0
  399. package/dist/shell/test-setup.d.ts +2 -0
  400. package/dist/shell/test-setup.d.ts.map +1 -0
  401. package/dist/shell/types/auth-adapter.d.ts +14 -0
  402. package/dist/shell/types/auth-adapter.d.ts.map +1 -0
  403. package/dist/shell/types/auth.d.ts +34 -0
  404. package/dist/shell/types/auth.d.ts.map +1 -0
  405. package/dist/shell/types/billing.d.ts +74 -0
  406. package/dist/shell/types/billing.d.ts.map +1 -0
  407. package/dist/shell/types/client-orders.d.ts +43 -0
  408. package/dist/shell/types/client-orders.d.ts.map +1 -0
  409. package/dist/shell/types/crud.d.ts +122 -0
  410. package/dist/shell/types/crud.d.ts.map +1 -0
  411. package/dist/shell/types/entities.d.ts +150 -0
  412. package/dist/shell/types/entities.d.ts.map +1 -0
  413. package/dist/shell/types/entity-lookup.d.ts +18 -0
  414. package/dist/shell/types/entity-lookup.d.ts.map +1 -0
  415. package/dist/shell/types/index.d.ts +17 -0
  416. package/dist/shell/types/index.d.ts.map +1 -0
  417. package/dist/shell/types/integrations.d.ts +48 -0
  418. package/dist/shell/types/integrations.d.ts.map +1 -0
  419. package/dist/shell/types/invite.d.ts +23 -0
  420. package/dist/shell/types/invite.d.ts.map +1 -0
  421. package/dist/shell/types/layout.d.ts +26 -0
  422. package/dist/shell/types/layout.d.ts.map +1 -0
  423. package/dist/shell/types/notifications.d.ts +31 -0
  424. package/dist/shell/types/notifications.d.ts.map +1 -0
  425. package/dist/shell/types/org-adapter.d.ts +72 -0
  426. package/dist/shell/types/org-adapter.d.ts.map +1 -0
  427. package/dist/shell/types/permissions.d.ts +39 -0
  428. package/dist/shell/types/permissions.d.ts.map +1 -0
  429. package/dist/shell/types/platform.d.ts +25 -0
  430. package/dist/shell/types/platform.d.ts.map +1 -0
  431. package/dist/shell/types/plugins.d.ts +308 -0
  432. package/dist/shell/types/plugins.d.ts.map +1 -0
  433. package/dist/shell/types/tenant.d.ts +74 -0
  434. package/dist/shell/types/tenant.d.ts.map +1 -0
  435. package/dist/stores/createCrudStore.d.ts +32 -0
  436. package/dist/stores/createCrudStore.d.ts.map +1 -0
  437. package/dist/supabase/client.d.ts +18 -0
  438. package/dist/supabase/client.d.ts.map +1 -0
  439. package/package.json +72 -0
  440. package/src/app/AdminShell.tsx +449 -0
  441. package/src/app/LoginPage.tsx +264 -0
  442. package/src/app/config.ts +146 -0
  443. package/src/app/createFayzApp.tsx +254 -0
  444. package/src/app/routing.tsx +65 -0
  445. package/src/app/scaffold.tsx +175 -0
  446. package/src/archetype-lookup.ts +160 -0
  447. package/src/billing/index.ts +7 -0
  448. package/src/billing/store.ts +62 -0
  449. package/src/components/shared/PersonLink.tsx +199 -0
  450. package/src/crud/CrudCardGrid.tsx +92 -0
  451. package/src/crud/CrudDetailPage.tsx +366 -0
  452. package/src/crud/CrudFormPage.tsx +467 -0
  453. package/src/crud/CrudListView.tsx +223 -0
  454. package/src/crud/CrudPage.tsx +491 -0
  455. package/src/crud/DeleteConfirmDialog.tsx +41 -0
  456. package/src/crud/EntityOverview.tsx +230 -0
  457. package/src/crud/ImportWizard.tsx +690 -0
  458. package/src/crud/archetypes/ActiveToggle.tsx +23 -0
  459. package/src/crud/archetypes/ArchetypeStatusBar.tsx +58 -0
  460. package/src/crud/archetypes/BlockSettingsPopover.tsx +322 -0
  461. package/src/crud/archetypes/EntityLink.tsx +74 -0
  462. package/src/crud/archetypes/LocationDetailTabs.tsx +72 -0
  463. package/src/crud/archetypes/LocationFormLayout.tsx +173 -0
  464. package/src/crud/archetypes/PersonDetailTabs.tsx +87 -0
  465. package/src/crud/archetypes/PersonFormLayout.tsx +184 -0
  466. package/src/crud/archetypes/PersonPicker.tsx +299 -0
  467. package/src/crud/archetypes/ProductDetailTabs.tsx +72 -0
  468. package/src/crud/archetypes/ProductFormLayout.tsx +197 -0
  469. package/src/crud/archetypes/ScheduleEditor.tsx +796 -0
  470. package/src/crud/archetypes/ServiceDetailTabs.tsx +60 -0
  471. package/src/crud/archetypes/ServiceFormLayout.tsx +155 -0
  472. package/src/crud/archetypes/SubjectDetailTabs.tsx +142 -0
  473. package/src/crud/archetypes/SubjectFormLayout.tsx +164 -0
  474. package/src/crud/createCrudPage.tsx +65 -0
  475. package/src/crud/csv-export.ts +17 -0
  476. package/src/crud/fieldToColumn.tsx +109 -0
  477. package/src/crud/index.ts +11 -0
  478. package/src/hooks/useFieldRules.ts +10 -0
  479. package/src/hooks/useModuleNavigation.ts +124 -0
  480. package/src/hooks/usePluginPrefs.ts +113 -0
  481. package/src/index.ts +168 -0
  482. package/src/lib/currency.ts +19 -0
  483. package/src/lib/entity-routes.ts +53 -0
  484. package/src/lib/schedule-config.ts +42 -0
  485. package/src/lib/schedule-service.ts +307 -0
  486. package/src/org/adapters/mock.ts +353 -0
  487. package/src/org/adapters/supabase.ts +509 -0
  488. package/src/org/context.tsx +174 -0
  489. package/src/org/index.ts +19 -0
  490. package/src/org/store.ts +70 -0
  491. package/src/permissions/PermissionGate.tsx +17 -0
  492. package/src/permissions/context.tsx +126 -0
  493. package/src/permissions/index.ts +13 -0
  494. package/src/permissions/store.ts +68 -0
  495. package/src/placeholder.ts +32 -0
  496. package/src/plugins/ModuleActionBar.tsx +57 -0
  497. package/src/plugins/PluginRegistryManager.tsx +110 -0
  498. package/src/plugins/QuickActionsButton.tsx +73 -0
  499. package/src/plugins/SettingsGroup.tsx +100 -0
  500. package/src/plugins/WidgetSlot.tsx +38 -0
  501. package/src/plugins/createPluginContext.tsx +68 -0
  502. package/src/plugins/createViewRouter.tsx +45 -0
  503. package/src/shell/components/auth/CenteredLogin.tsx +86 -0
  504. package/src/shell/components/auth/LoginForm.tsx +129 -0
  505. package/src/shell/components/auth/LoginPage.tsx +22 -0
  506. package/src/shell/components/auth/OAuthButtons.tsx +66 -0
  507. package/src/shell/components/auth/ProtectedRoute.tsx +52 -0
  508. package/src/shell/components/auth/RecoveryForm.tsx +110 -0
  509. package/src/shell/components/auth/SignupForm.tsx +170 -0
  510. package/src/shell/components/auth/SplitLogin.tsx +124 -0
  511. package/src/shell/components/auth/index.ts +6 -0
  512. package/src/shell/components/billing/BillingPage.tsx +56 -0
  513. package/src/shell/components/billing/InvoiceList.tsx +123 -0
  514. package/src/shell/components/billing/PaywallGate.tsx +80 -0
  515. package/src/shell/components/billing/PlanSelector.tsx +125 -0
  516. package/src/shell/components/billing/SubscriptionCard.tsx +108 -0
  517. package/src/shell/components/billing/index.ts +5 -0
  518. package/src/shell/components/chat/ChatFab.tsx +195 -0
  519. package/src/shell/components/chat/ChatPanel.tsx +170 -0
  520. package/src/shell/components/chat/ChatSuggestions.tsx +102 -0
  521. package/src/shell/components/chat/index.ts +2 -0
  522. package/src/shell/components/crud/archetypes/ClientOrdersTab.tsx +212 -0
  523. package/src/shell/components/layout/BottomNav.tsx +131 -0
  524. package/src/shell/components/layout/CommandPalette.tsx +257 -0
  525. package/src/shell/components/layout/LocationSwitchOverlay.tsx +64 -0
  526. package/src/shell/components/layout/MockModeBanner.tsx +17 -0
  527. package/src/shell/components/layout/PrintChrome.tsx +200 -0
  528. package/src/shell/components/layout/index.ts +5 -0
  529. package/src/shell/components/notifications/ChangelogFeed.tsx +85 -0
  530. package/src/shell/components/notifications/NotificationBell.tsx +44 -0
  531. package/src/shell/components/notifications/NotificationInbox.tsx +175 -0
  532. package/src/shell/components/notifications/ToastProvider.tsx +2 -0
  533. package/src/shell/components/notifications/index.ts +4 -0
  534. package/src/shell/components/organization/ImpersonationBanner.tsx +29 -0
  535. package/src/shell/components/organization/InviteMemberDialog.tsx +161 -0
  536. package/src/shell/components/organization/OrgInitializer.tsx +179 -0
  537. package/src/shell/components/organization/OrgSwitcher.tsx +177 -0
  538. package/src/shell/components/organization/PermissionGate.tsx +16 -0
  539. package/src/shell/components/organization/PermissionMatrixEditor.tsx +206 -0
  540. package/src/shell/components/organization/PermissionProfilesTab.tsx +148 -0
  541. package/src/shell/components/organization/TeamTab.tsx +243 -0
  542. package/src/shell/components/organization/TenantOnboarding.tsx +179 -0
  543. package/src/shell/components/organization/index.ts +7 -0
  544. package/src/shell/components/plugins/PluginSettingsPanel.tsx +189 -0
  545. package/src/shell/components/settings/BrandingSettings.tsx +255 -0
  546. package/src/shell/components/settings/CompanySettings.tsx +188 -0
  547. package/src/shell/components/settings/ConnectedBrandingSettings.tsx +82 -0
  548. package/src/shell/components/settings/ConnectedCompanySettings.tsx +63 -0
  549. package/src/shell/components/settings/ConnectedFieldRulesSettings.tsx +47 -0
  550. package/src/shell/components/settings/ConnectedHolidaysSettings.tsx +99 -0
  551. package/src/shell/components/settings/ConnectedLocationsOverview.tsx +57 -0
  552. package/src/shell/components/settings/ConnectedSecuritySettings.tsx +59 -0
  553. package/src/shell/components/settings/ConnectedUserProfile.tsx +59 -0
  554. package/src/shell/components/settings/FieldRulesSettings.tsx +511 -0
  555. package/src/shell/components/settings/HolidaysSettings.tsx +141 -0
  556. package/src/shell/components/settings/LocationsCrudPage.ts +36 -0
  557. package/src/shell/components/settings/LocationsOverview.tsx +171 -0
  558. package/src/shell/components/settings/SecuritySettings.tsx +208 -0
  559. package/src/shell/components/settings/SettingsPage.tsx +162 -0
  560. package/src/shell/components/settings/UserProfile.tsx +151 -0
  561. package/src/shell/components/settings/index.ts +10 -0
  562. package/src/shell/config/index.ts +6 -0
  563. package/src/shell/config/permissions.ts +31 -0
  564. package/src/shell/config/tailwind-preset.ts +164 -0
  565. package/src/shell/config/theme/dark.ts +63 -0
  566. package/src/shell/config/theme/index.ts +5 -0
  567. package/src/shell/config/theme/light.ts +63 -0
  568. package/src/shell/config/theme/tokens.ts +105 -0
  569. package/src/shell/config/theme/utils.ts +249 -0
  570. package/src/shell/createSaasApp.tsx +922 -0
  571. package/src/shell/hooks/index.ts +18 -0
  572. package/src/shell/hooks/useAITools.ts +139 -0
  573. package/src/shell/hooks/useAuth.ts +109 -0
  574. package/src/shell/hooks/useBilling.ts +151 -0
  575. package/src/shell/hooks/useChat.ts +84 -0
  576. package/src/shell/hooks/useFieldRules.ts +19 -0
  577. package/src/shell/hooks/useFormatters.ts +56 -0
  578. package/src/shell/hooks/useLayout.ts +76 -0
  579. package/src/shell/hooks/useModuleNavigation.ts +124 -0
  580. package/src/shell/hooks/useNotifications.ts +114 -0
  581. package/src/shell/hooks/usePermission.ts +101 -0
  582. package/src/shell/hooks/usePluginPrefs.ts +113 -0
  583. package/src/shell/hooks/usePlugins.ts +18 -0
  584. package/src/shell/hooks/useTenant.ts +106 -0
  585. package/src/shell/hooks/useTenantPlugins.ts +103 -0
  586. package/src/shell/hooks/useTranslation.ts +10 -0
  587. package/src/shell/lib/api.ts +67 -0
  588. package/src/shell/lib/apply-field-rules.ts +14 -0
  589. package/src/shell/lib/auth-adapters/mock.ts +97 -0
  590. package/src/shell/lib/auth-adapters/supabase.ts +96 -0
  591. package/src/shell/lib/auth-context.ts +18 -0
  592. package/src/shell/lib/cache.ts +124 -0
  593. package/src/shell/lib/cn.ts +1 -0
  594. package/src/shell/lib/core-ai-tools.ts +90 -0
  595. package/src/shell/lib/create-client-orders-provider.ts +105 -0
  596. package/src/shell/lib/csv.ts +54 -0
  597. package/src/shell/lib/dedup.ts +17 -0
  598. package/src/shell/lib/entity-registry.ts +39 -0
  599. package/src/shell/lib/entity-routes.ts +53 -0
  600. package/src/shell/lib/format.ts +58 -0
  601. package/src/shell/lib/i18n.ts +3723 -0
  602. package/src/shell/lib/locale-config.ts +14 -0
  603. package/src/shell/lib/org-adapters/mock.ts +318 -0
  604. package/src/shell/lib/org-adapters/supabase.ts +533 -0
  605. package/src/shell/lib/org-context.ts +18 -0
  606. package/src/shell/lib/plugins.ts +11 -0
  607. package/src/shell/lib/router.ts +86 -0
  608. package/src/shell/lib/schedule-config.ts +42 -0
  609. package/src/shell/lib/schedule-service.ts +307 -0
  610. package/src/shell/lib/supabase.ts +19 -0
  611. package/src/shell/stores/auth.store.ts +29 -0
  612. package/src/shell/stores/billing.store.ts +1 -0
  613. package/src/shell/stores/chat.store.ts +45 -0
  614. package/src/shell/stores/index.ts +12 -0
  615. package/src/shell/stores/invite.store.ts +18 -0
  616. package/src/shell/stores/layout.store.ts +1 -0
  617. package/src/shell/stores/locale.store.ts +24 -0
  618. package/src/shell/stores/location.store.ts +89 -0
  619. package/src/shell/stores/notifications.store.ts +48 -0
  620. package/src/shell/stores/organization.store.ts +3 -0
  621. package/src/shell/stores/permissions.store.ts +1 -0
  622. package/src/shell/stores/plugin.store.ts +50 -0
  623. package/src/shell/stores/tenant.store.ts +26 -0
  624. package/src/shell/stores/theme.store.ts +162 -0
  625. package/src/shell/styles.css +433 -0
  626. package/src/shell/test-setup.ts +1 -0
  627. package/src/shell/types/auth-adapter.ts +11 -0
  628. package/src/shell/types/auth.ts +38 -0
  629. package/src/shell/types/billing.ts +90 -0
  630. package/src/shell/types/client-orders.ts +58 -0
  631. package/src/shell/types/crud.ts +134 -0
  632. package/src/shell/types/entities.ts +169 -0
  633. package/src/shell/types/entity-lookup.ts +25 -0
  634. package/src/shell/types/index.ts +16 -0
  635. package/src/shell/types/integrations.ts +51 -0
  636. package/src/shell/types/invite.ts +23 -0
  637. package/src/shell/types/layout.ts +29 -0
  638. package/src/shell/types/notifications.ts +33 -0
  639. package/src/shell/types/org-adapter.ts +72 -0
  640. package/src/shell/types/permissions.ts +64 -0
  641. package/src/shell/types/platform.ts +25 -0
  642. package/src/shell/types/plugins.ts +359 -0
  643. package/src/shell/types/tenant.ts +79 -0
  644. package/src/stores/createCrudStore.ts +138 -0
  645. package/src/supabase/client.ts +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shell/stores/chat.store.ts","../src/shell/lib/core-ai-tools.ts","../src/shell/hooks/useAITools.ts","../src/shell/hooks/useChat.ts","../src/shell/hooks/useTranslation.ts","../src/shell/components/chat/ChatFab.tsx","../src/shell/components/chat/ChatSuggestions.tsx","../src/shell/components/chat/ChatPanel.tsx","../src/shell/config/theme/light.ts","../src/shell/config/theme/dark.ts","../src/shell/config/theme/utils.ts","../src/shell/stores/theme.store.ts","../src/app/routing.tsx","../src/app/LoginPage.tsx","../src/lib/entity-routes.ts","../src/shell/stores/locale.store.ts","../src/shell/lib/locale-config.ts","../src/shell/components/settings/CompanySettings.tsx","../src/shell/lib/org-context.ts","../src/shell/components/settings/ConnectedCompanySettings.tsx","../src/shell/components/settings/UserProfile.tsx","../src/shell/stores/auth.store.ts","../src/shell/lib/supabase.ts","../src/shell/components/settings/ConnectedUserProfile.tsx","../src/shell/components/settings/SecuritySettings.tsx","../src/shell/lib/auth-context.ts","../src/shell/components/settings/ConnectedSecuritySettings.tsx","../src/shell/components/settings/BrandingSettings.tsx","../src/shell/components/settings/ConnectedBrandingSettings.tsx","../src/shell/components/settings/SettingsPage.tsx","../src/shell/stores/invite.store.ts","../src/shell/components/organization/InviteMemberDialog.tsx","../src/shell/stores/tenant.store.ts","../src/shell/hooks/usePermission.ts","../src/shell/lib/dedup.ts","../src/shell/components/organization/TeamTab.tsx","../src/shell/components/organization/PermissionMatrixEditor.tsx","../src/shell/components/organization/PermissionProfilesTab.tsx","../src/crud/archetypes/ActiveToggle.tsx","../src/crud/archetypes/PersonFormLayout.tsx","../src/crud/archetypes/ProductFormLayout.tsx","../src/crud/archetypes/ServiceFormLayout.tsx","../src/crud/archetypes/LocationFormLayout.tsx","../src/crud/archetypes/PersonPicker.tsx","../src/crud/archetypes/SubjectFormLayout.tsx","../src/crud/CrudFormPage.tsx","../src/crud/fieldToColumn.tsx","../src/crud/CrudCardGrid.tsx","../src/permissions/PermissionGate.tsx","../src/crud/CrudListView.tsx","../src/plugins/WidgetSlot.tsx","../src/lib/schedule-service.ts","../src/lib/schedule-config.ts","../src/crud/archetypes/BlockSettingsPopover.tsx","../src/crud/archetypes/ScheduleEditor.tsx","../src/crud/archetypes/PersonDetailTabs.tsx","../src/crud/archetypes/ProductDetailTabs.tsx","../src/crud/archetypes/ServiceDetailTabs.tsx","../src/crud/archetypes/LocationDetailTabs.tsx","../src/crud/archetypes/EntityLink.tsx","../src/crud/archetypes/SubjectDetailTabs.tsx","../src/crud/CrudDetailPage.tsx","../src/crud/DeleteConfirmDialog.tsx","../src/crud/ImportWizard.tsx","../src/crud/csv-export.ts","../src/hooks/useFieldRules.ts","../src/crud/CrudPage.tsx","../src/stores/createCrudStore.ts","../src/crud/createCrudPage.tsx","../src/shell/components/settings/LocationsCrudPage.ts","../src/shell/components/settings/FieldRulesSettings.tsx","../src/shell/lib/entity-registry.ts","../src/shell/components/settings/ConnectedFieldRulesSettings.tsx","../src/app/AdminShell.tsx","../src/app/createFayzApp.tsx","../src/shell/lib/entity-routes.ts","../src/shell/lib/router.ts","../src/shell/components/layout/MockModeBanner.tsx","../src/shell/components/billing/PlanSelector.tsx","../src/shell/components/billing/SubscriptionCard.tsx","../src/shell/hooks/useBilling.ts","../src/shell/components/billing/BillingPage.tsx","../src/shell/components/layout/CommandPalette.tsx","../src/shell/hooks/useAuth.ts","../src/shell/components/auth/OAuthButtons.tsx","../src/shell/components/auth/LoginForm.tsx","../src/shell/components/auth/SignupForm.tsx","../src/shell/components/auth/RecoveryForm.tsx","../src/shell/components/auth/SplitLogin.tsx","../src/shell/components/auth/CenteredLogin.tsx","../src/shell/components/auth/LoginPage.tsx","../src/shell/components/auth/ProtectedRoute.tsx","../src/shell/lib/auth-adapters/mock.ts","../src/shell/lib/auth-adapters/supabase.ts","../src/shell/lib/org-adapters/mock.ts","../src/shell/lib/org-adapters/supabase.ts","../src/shell/components/organization/OrgSwitcher.tsx","../src/shell/stores/location.store.ts","../src/shell/components/organization/TenantOnboarding.tsx","../src/shell/components/organization/OrgInitializer.tsx","../src/shell/components/organization/ImpersonationBanner.tsx","../src/shell/components/layout/LocationSwitchOverlay.tsx","../src/shell/types/billing.ts","../src/shell/stores/plugin.store.ts","../src/shell/hooks/useTenantPlugins.ts","../src/shell/lib/i18n.ts","../src/shell/createSaasApp.tsx","../src/app/scaffold.tsx","../src/shell/components/crud/archetypes/ClientOrdersTab.tsx","../src/shell/lib/create-client-orders-provider.ts","../src/archetype-lookup.ts","../src/placeholder.ts","../src/plugins/SettingsGroup.tsx","../src/plugins/QuickActionsButton.tsx","../src/plugins/ModuleActionBar.tsx","../src/plugins/createPluginContext.tsx","../src/plugins/createViewRouter.tsx","../src/lib/currency.ts","../src/plugins/PluginRegistryManager.tsx","../src/hooks/useModuleNavigation.ts","../src/components/shared/PersonLink.tsx","../src/hooks/usePluginPrefs.ts","../src/shell/components/plugins/PluginSettingsPanel.tsx"],"names":["create","registry","usePluginRuntimeOptional","React","useCallback","coreUseTranslation","getCurrentLocale","React2","jsx","useOrganizationStore","cn","jsxs","X","MessageCircle","Sparkles","Pencil","BookOpen","React3","Settings2","ArrowUp","createFayzTheme","hashRouterAdapter","React4","useTranslation","useAuth","React5","LoginForm","Input","Button","STORAGE_KEY","React6","Card","CardHeader","CardTitle","CardDescription","CardContent","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","CardFooter","Save","Check","createContext","useOrgAdapter","adapter","useContext","useOrgAdapterOptional","toast","React7","Avatar","AvatarImage","AvatarFallback","Camera","_getOpt","getFayzSupabaseClient","React8","Loader2","KeyRound","ShieldCheck","UserPlus","Clock","React9","Upload","currentSettings","React10","Building2","User","Shield","Palette","t","ChevronRight","ArrowLeft","usePermissionsStore","React11","Modal","ModalContent","ModalHeader","ModalTitle","ModalDescription","Plus","ModalFooter","Fragment","initialState","usePermission","useMemo","React12","Badge","Dropdown","DropdownTrigger","MoreHorizontal","DropdownContent","DropdownItem","Mail","React13","Search","ChevronDown","Checkbox","React14","Eye","Trash2","renderField","SKIP_FIELDS","FieldItem","Package","IDENTITY_FIELDS","PRICING_FIELDS","Briefcase","CONTACT_FIELDS","ADDRESS_FIELDS","MapPin","useState","useRef","useEffect","getSupabaseClientOptional","LucideIcons","CurrencyInput","ImagePlus","useSaveBar","useBackHandler","formatCurrencyLocale","formatDateLocale","formatDateTimeLocale","formatCurrency","formatDate","LucideIcons2","usePermissionOptional","MoreVertical","Download","DataTable","getWidgetsForZone","resolvePluginComponent","getCoreSchemaClient","createPortal","TooltipProvider","TimePicker","Tooltip","TooltipTrigger","TooltipContent","Copy","Settings","useSyncExternalStore","Skeleton","CalendarOff","CalendarPlus","ModalBody","DatePicker","Tabs","TabsList","TabsTrigger","usePluginsOptional","FileText","CalendarDays","ComingSoon","BarChart3","Truck","Tag","Users","ExternalLink","formatValue","DollarSign","ShoppingBag","Breadcrumb","Edit","Separator","TabsContent","FileSpreadsheet","ArrowRight","AlertCircle","exportCSV","deriveEntityKey","resolveDataProvider","registerEntity","RotateCcw","React26","ChevronsUpDown","LucideIcons4","DropdownLabel","DropdownSeparator","SlidersHorizontal","Puzzle","React27","usePluginRuntime","ModuleLayoutProvider","AppShell","PageTransition","auth","createSupabaseAuthAdapter","getFayzSupabaseClientOptional","createMockAuthAdapter","createSupabaseOrgAdapter","createMockOrgAdapter","mergeTranslations","coreTranslations","useBillingStore","React28","createFayzSupabaseClient","setCurrentLocale","resolvePluginRuntime","AuthProvider","OrgProvider","PluginRuntimeProvider","PermissionsProvider","I18nProvider","ToastProvider","NavTransitionProvider","routeMap","setEntityRouteMap","resolveEntityRoute","resolveEntityHref","React29","WifiOff","Calendar","setInterval","React30","Home","CreditCard","Bell","Megaphone","ShoppingCart","Target","Wrench","ClipboardList","UserCog","Globe","Percent","UtensilsCrossed","Handshake","Contact","Filter","List","Box","Dialog","Command","LoginPage","listeners","getStored","setStored","dedup","slugify","CORE_SCHEMA","React37","TIMEZONES","CURRENCIES","React38","getPersistedOrgId","RefreshCw","error","sectionOrder","useLayoutStore","resolveAuthAdapter","resolveOrgAdapter","buildSettingsTabs","setDefaultCurrency","registerTranslations","defineApp","getPluginFactory","getComponent","React41","registerScaffold","CircleDashed","CircleCheckBig","CircleEllipsis","CircleAlert","Ban","UserX","ListView","ToggleRow","useModuleLayout","ICON_MAP","useZustandStore","createMockProvider","PersonLink","Popover","PopoverTrigger","PopoverContent","Phone","Cake","RegistryCrudView","ChevronLeft"],"mappings":"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","file":"index.cjs","sourcesContent":["import { create } from 'zustand'\n\nexport interface ChatMessage {\n id: string\n role: 'user' | 'assistant'\n content: string\n timestamp: string\n}\n\ninterface ChatState {\n messages: ChatMessage[]\n isOpen: boolean\n isStreaming: boolean\n setOpen: (open: boolean) => void\n toggleOpen: () => void\n addMessage: (message: ChatMessage) => void\n updateLastAssistant: (content: string) => void\n setStreaming: (streaming: boolean) => void\n reset: () => void\n}\n\nexport const useChatStore = create<ChatState>((set) => ({\n messages: [],\n isOpen: false,\n isStreaming: false,\n\n setOpen: (open) => set({ isOpen: open }),\n toggleOpen: () => set((s) => ({ isOpen: !s.isOpen })),\n\n addMessage: (message) =>\n set((s) => ({ messages: [...s.messages, message] })),\n\n updateLastAssistant: (content) =>\n set((s) => {\n const msgs = [...s.messages]\n const lastIdx = msgs.length - 1\n if (lastIdx >= 0 && msgs[lastIdx].role === 'assistant') {\n msgs[lastIdx] = { ...msgs[lastIdx], content }\n }\n return { messages: msgs }\n }),\n\n setStreaming: (isStreaming) => set({ isStreaming }),\n reset: () => set({ messages: [], isStreaming: false }),\n}))\n","import type { PluginAITool, PluginRegistryDef } from '../types/plugins'\n\n/**\n * Core SaaS-level AI tools — always available, no plugin required.\n */\nexport const coreAITools: PluginAITool[] = [\n {\n id: 'core.business-summary',\n name: 'getBusinessSummary',\n description: 'Returns a summary of the current business: name, plan, vertical, team size, and key metrics.',\n icon: 'Building2',\n mode: 'read',\n parameters: { type: 'object', properties: {}, required: [] },\n category: 'Core',\n suggestions: [\n { label: \"How's my business doing today?\" },\n ],\n },\n {\n id: 'core.team-members',\n name: 'getTeamMembers',\n description: 'Lists team members for the current tenant with their roles and status.',\n icon: 'Users',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n role: { type: 'string', description: 'Filter by role: owner, admin, manager, staff, viewer' },\n },\n },\n permission: { feature: 'team', action: 'read' },\n category: 'Core',\n suggestions: [\n { label: 'Who is on my team?' },\n ],\n },\n {\n id: 'core.navigate',\n name: 'navigateTo',\n description: 'Helps the user find and navigate to a specific page or feature in the app.',\n icon: 'Compass',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n page: { type: 'string', description: 'Page name or feature the user is looking for' },\n },\n required: ['page'],\n },\n category: 'Core',\n },\n]\n\n/**\n * Auto-generates read tools from plugin registry definitions.\n * Each registry gets a basic \"list\" tool so plugins get AI capabilities for free.\n */\nexport function generateRegistryTools(pluginId: string, registries: PluginRegistryDef[]): PluginAITool[] {\n return registries\n .filter((r) => !r.readOnly)\n .map((registry) => {\n const plural = registry.entity.namePlural ?? `${registry.entity.name}s`\n return {\n id: `${pluginId}.list-${registry.id}`,\n name: `list${plural.replace(/\\s+/g, '')}`,\n description: `Lists all ${plural.toLowerCase()} for the current business.`,\n icon: registry.icon ?? registry.entity.icon,\n mode: 'read' as const,\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Search text' },\n },\n },\n category: pluginId.charAt(0).toUpperCase() + pluginId.slice(1),\n }\n })\n}\n\n/**\n * Formats a tool as a function signature: e.g. \"getRevenue(period?)\"\n */\nexport function formatToolSignature(tool: PluginAITool): string {\n const params = tool.parameters?.properties\n ? Object.entries(tool.parameters.properties)\n .map(([key]) => tool.parameters?.required?.includes(key) ? key : `${key}?`)\n .join(', ')\n : ''\n return `${tool.name}(${params})`\n}\n","import * as React from 'react'\nimport { usePluginRuntimeOptional } from '../lib/plugins'\nimport { coreAITools, generateRegistryTools, formatToolSignature } from '../lib/core-ai-tools'\nimport type { PluginAITool, AIToolSuggestion } from '../types/plugins'\n\nexport interface ResolvedSuggestion extends AIToolSuggestion {\n toolId: string\n category: string\n}\n\nexport interface ResolvedToolEntry {\n tool: PluginAITool\n signature: string\n}\n\nexport interface ResolvedToolGroup {\n category: string\n tools: ResolvedToolEntry[]\n}\n\n/**\n * Detects which plugin \"owns\" the current page based on route matching.\n * Returns the plugin ID or null for non-plugin pages (e.g. settings/general, dashboard).\n */\nfunction detectActivePluginId(runtime: ReturnType<typeof usePluginRuntimeOptional>): string | null {\n if (!runtime) return null\n const path = runtime.context.currentPath\n\n // Check each active plugin's routes for a match\n for (const plugin of runtime.activePlugins) {\n for (const route of plugin.routes) {\n if (path === route.path || path.startsWith(`${route.path}/`)) {\n return plugin.id\n }\n }\n }\n\n // Also match settings sub-pages: /settings/financial → financial\n const settingsMatch = path.match(/^\\/settings\\/([^/]+)/)\n if (settingsMatch) {\n const tabId = settingsMatch[1]\n if (runtime.activePlugins.some((p) => p.id === tabId)) {\n return tabId\n }\n }\n\n return null\n}\n\nexport function useAITools(): {\n tools: PluginAITool[]\n suggestions: ResolvedSuggestion[]\n /** Suggestions from the currently active plugin only (empty on non-plugin pages) */\n contextualSuggestions: ResolvedSuggestion[]\n toolGroups: ResolvedToolGroup[]\n} {\n const runtime = usePluginRuntimeOptional()\n\n return React.useMemo(() => {\n const hasPermission = runtime?.context.hasPermission\n const verticalId = runtime?.context.tenant?.verticalId\n const activePluginId = detectActivePluginId(runtime)\n\n // Collect all tools: core + plugin-declared + auto-generated from registries\n const allTools: PluginAITool[] = [...coreAITools]\n\n if (runtime) {\n allTools.push(...runtime.aiTools)\n\n // Auto-generate registry tools for active plugins\n for (const [pluginId, registries] of runtime.registries) {\n const autoTools = generateRegistryTools(pluginId, registries)\n // Only add auto-tools that weren't explicitly declared\n const declaredIds = new Set(runtime.aiTools.map((t) => t.id))\n for (const tool of autoTools) {\n if (!declaredIds.has(tool.id)) {\n allTools.push(tool)\n }\n }\n }\n }\n\n // Filter by permission\n const tools = allTools.filter((tool) => {\n if (!tool.permission) return true\n if (!hasPermission) return true\n return hasPermission(tool.permission)\n })\n\n // Flatten suggestions, filter by vertical\n const allSuggestions: ResolvedSuggestion[] = []\n for (const tool of tools) {\n if (!tool.suggestions) continue\n for (const suggestion of tool.suggestions) {\n if (suggestion.verticalId && suggestion.verticalId !== verticalId) continue\n allSuggestions.push({\n ...suggestion,\n toolId: tool.id,\n category: tool.category ?? 'General',\n })\n }\n }\n\n // Prioritize suggestions from the active plugin's context\n const contextualSuggestions = activePluginId\n ? allSuggestions.filter((s) => s.toolId.startsWith(`${activePluginId}.`))\n : []\n let suggestions: ResolvedSuggestion[]\n if (activePluginId) {\n const others = allSuggestions.filter((s) => !s.toolId.startsWith(`${activePluginId}.`))\n suggestions = [...contextualSuggestions, ...others]\n } else {\n suggestions = allSuggestions\n }\n\n // Group tools by category with signatures\n const groupMap = new Map<string, ResolvedToolEntry[]>()\n for (const tool of tools) {\n const cat = tool.category ?? 'General'\n if (!groupMap.has(cat)) groupMap.set(cat, [])\n groupMap.get(cat)!.push({\n tool,\n signature: formatToolSignature(tool),\n })\n }\n\n // Core first, then alphabetical\n const toolGroups: ResolvedToolGroup[] = []\n if (groupMap.has('Core')) {\n toolGroups.push({ category: 'Core', tools: groupMap.get('Core')! })\n groupMap.delete('Core')\n }\n for (const [category, groupTools] of [...groupMap.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n toolGroups.push({ category, tools: groupTools })\n }\n\n return { tools, suggestions, contextualSuggestions, toolGroups }\n }, [runtime])\n}\n","import { useCallback } from 'react'\nimport { useChatStore, type ChatMessage } from '../stores/chat.store'\n\ninterface UseChatOptions {\n apiEndpoint?: string\n systemPrompt?: string\n}\n\nexport function useChat(options?: UseChatOptions) {\n const store = useChatStore()\n\n const sendMessage = useCallback(\n async (content: string) => {\n const userMsg: ChatMessage = {\n id: `msg-${Date.now()}`,\n role: 'user',\n content,\n timestamp: new Date().toISOString(),\n }\n store.addMessage(userMsg)\n\n const assistantMsg: ChatMessage = {\n id: `msg-${Date.now() + 1}`,\n role: 'assistant',\n content: '',\n timestamp: new Date().toISOString(),\n }\n store.addMessage(assistantMsg)\n store.setStreaming(true)\n\n if (!options?.apiEndpoint) {\n // Mock response if no endpoint configured\n setTimeout(() => {\n store.updateLastAssistant(\n \"I'm your AI assistant. This is a demo response — connect an API endpoint to enable real conversations.\"\n )\n store.setStreaming(false)\n }, 800)\n return\n }\n\n try {\n const response = await fetch(options.apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: [\n ...(options.systemPrompt\n ? [{ role: 'system', content: options.systemPrompt }]\n : []),\n ...store.messages.map((m) => ({ role: m.role, content: m.content })),\n { role: 'user', content },\n ],\n }),\n })\n\n if (!response.ok) {\n store.updateLastAssistant('Sorry, something went wrong. Please try again.')\n store.setStreaming(false)\n return\n }\n\n const data = await response.json()\n const text = data.choices?.[0]?.message?.content ?? data.content ?? 'No response.'\n store.updateLastAssistant(text)\n } catch {\n store.updateLastAssistant('Sorry, I could not connect. Please try again later.')\n } finally {\n store.setStreaming(false)\n }\n },\n [store, options?.apiEndpoint, options?.systemPrompt]\n )\n\n return {\n messages: store.messages,\n isOpen: store.isOpen,\n isStreaming: store.isStreaming,\n sendMessage,\n toggleOpen: store.toggleOpen,\n setOpen: store.setOpen,\n reset: store.reset,\n }\n}\n","// Compat wrapper → @fayz-ai/core's unified translator. The shell calls\n// `const { t } = useTranslation()`, while @fayz-ai/core returns `t` directly — this\n// keeps the `{ t, locale }` shape so shell components resolve from the SAME\n// registry the native plugins use (registered by createSaasApp).\nimport { useTranslation as coreUseTranslation, getCurrentLocale } from '@fayz-ai/core'\n\nexport function useTranslation() {\n const t = coreUseTranslation()\n return { t, locale: getCurrentLocale() }\n}\n","import * as React from 'react'\nimport { MessageCircle, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useChatStore } from '../../stores/chat.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useAITools, type ResolvedSuggestion } from '../../hooks/useAITools'\nimport { useChat } from '../../hooks/useChat'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface ChatFabProps {\n className?: string\n apiEndpoint?: string\n systemPrompt?: string\n}\n\nfunction TypewriterText({ text, speed = 28, onDone }: { text: string; speed?: number; onDone?: () => void }) {\n const [displayed, setDisplayed] = React.useState('')\n const indexRef = React.useRef(0)\n\n React.useEffect(() => {\n setDisplayed('')\n indexRef.current = 0\n const interval = setInterval(() => {\n indexRef.current++\n if (indexRef.current > text.length) {\n clearInterval(interval)\n onDone?.()\n return\n }\n setDisplayed(text.slice(0, indexRef.current))\n }, speed)\n return () => clearInterval(interval)\n }, [text, speed])\n\n return (\n <span>\n {displayed}\n {displayed.length < text.length && (\n <span className=\"inline-block w-[2px] h-3 bg-current/60 animate-pulse ml-0.5 -mb-px\" />\n )}\n </span>\n )\n}\n\n/** Injected once — keyframes for pill grow/shrink */\nconst STYLE_ID = 'chat-fab-anims'\nfunction ensureStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID)) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n @keyframes fabPillGrow {\n 0% { max-width: 2.75rem; opacity: 0.6; }\n 40% { opacity: 1; }\n 100% { max-width: 22rem; opacity: 1; }\n }\n @keyframes fabPillShrink {\n 0% { max-width: 22rem; opacity: 1; }\n 60% { opacity: 0.6; }\n 100% { max-width: 2.75rem; opacity: 0; }\n }\n `\n document.head.appendChild(style)\n}\n\nexport function ChatFab({ className, apiEndpoint, systemPrompt }: ChatFabProps) {\n const { isOpen, toggleOpen, setOpen } = useChatStore()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const { contextualSuggestions } = useAITools()\n const { sendMessage } = useChat({ apiEndpoint, systemPrompt })\n const { t } = useTranslation()\n\n const [phase, setPhase] = React.useState<'idle' | 'expanding' | 'typing' | 'visible' | 'collapsing'>('idle')\n const [activeSuggestion, setActiveSuggestion] = React.useState<ResolvedSuggestion | null>(null)\n const timersRef = React.useRef<ReturnType<typeof setTimeout>[]>([])\n const prevSuggestionRef = React.useRef<string | null>(null)\n\n React.useEffect(ensureStyles, [])\n\n const clearTimers = () => { timersRef.current.forEach(clearTimeout); timersRef.current = [] }\n const addTimer = (fn: () => void, ms: number) => { timersRef.current.push(setTimeout(fn, ms)) }\n\n const topSuggestion = contextualSuggestions[0] ?? null\n const topLabel = topSuggestion?.label ?? null\n\n React.useEffect(() => {\n if (isOpen || !topSuggestion || !topLabel) {\n if (phase !== 'idle') { clearTimers(); setPhase('collapsing'); addTimer(() => setPhase('idle'), 450) }\n prevSuggestionRef.current = null\n return\n }\n if (prevSuggestionRef.current === topLabel) return\n prevSuggestionRef.current = topLabel\n clearTimers()\n\n const startExpand = () => {\n setActiveSuggestion(topSuggestion)\n setPhase('expanding')\n // Start typing while pill is still growing\n addTimer(() => setPhase('typing'), 350)\n }\n\n if (phase !== 'idle') {\n setPhase('collapsing')\n addTimer(startExpand, 500)\n } else {\n addTimer(startExpand, 800)\n }\n\n addTimer(() => {\n setPhase('collapsing')\n addTimer(() => setPhase('idle'), 450)\n }, 9000)\n\n return clearTimers\n }, [topLabel, isOpen])\n\n React.useEffect(() => {\n if (isOpen && phase !== 'idle') { clearTimers(); setPhase('idle') }\n }, [isOpen])\n\n if (!currentOrg) return null\n\n // Resolve translated label for a suggestion (same logic as ChatSuggestions)\n const resolveLabel = (s: ResolvedSuggestion, index: number) => {\n const key = `chat.suggestion.${s.toolId}.${index}`\n const translated = t(key)\n return translated === key ? s.label : translated\n }\n\n const activeLabel = activeSuggestion ? resolveLabel(activeSuggestion, 0) : ''\n\n const handleSuggestionClick = () => {\n if (!activeSuggestion) return\n clearTimers()\n setPhase('idle')\n setOpen(true)\n setTimeout(() => { sendMessage(activeSuggestion.prompt ?? activeLabel) }, 150)\n }\n\n const showPill = phase === 'expanding' || phase === 'typing' || phase === 'visible'\n\n return (\n <div className={cn('fixed bottom-4 right-4 z-50 hidden md:block', className)}>\n {/* Pill — grows from FAB circle size outward */}\n {(showPill || phase === 'collapsing') && !isOpen && (\n <button\n onClick={handleSuggestionClick}\n className=\"absolute right-0 bottom-0 flex flex-col items-start justify-center rounded-full bg-foreground text-background shadow-lg hover:opacity-95 cursor-pointer pl-5 overflow-hidden\"\n style={{\n paddingRight: '3.25rem',\n height: '2.75rem',\n animation: showPill\n ? 'fabPillGrow 650ms cubic-bezier(0.22, 1, 0.36, 1) forwards'\n : 'fabPillShrink 400ms cubic-bezier(0.55, 0, 1, 0.45) forwards',\n }}\n >\n <span className=\"text-[7px] font-semibold uppercase tracking-widest opacity-40\">\n {t('chat.fab.tryIt')}\n </span>\n <span className={cn(\n 'text-[13px] font-medium whitespace-nowrap min-h-[1.15em] transition-opacity',\n phase === 'expanding' ? 'opacity-0 duration-200' : 'opacity-100 duration-300',\n )}>\n {phase === 'typing' && activeSuggestion ? (\n <TypewriterText\n text={`\"${activeLabel}\"`}\n onDone={() => setPhase('visible')}\n />\n ) : (phase === 'visible') && activeSuggestion ? (\n `\"${activeLabel}\"`\n ) : (\n '\\u00A0'\n )}\n </span>\n </button>\n )}\n\n {/* FAB circle */}\n <button\n onClick={toggleOpen}\n className={cn(\n 'relative z-10 h-11 w-11 flex items-center justify-center transition-all hover:opacity-90 focus:outline-none',\n isOpen\n ? 'rounded-tl-none rounded-tr-lg rounded-br-full rounded-bl-full bg-card text-muted-foreground border border-border/50 border-t-0 shadow-lg'\n : 'rounded-full bg-foreground text-background shadow-lg',\n )}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {isOpen ? <X className=\"h-4 w-4\" /> : <MessageCircle className=\"h-4 w-4\" />}\n </button>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Sparkles, BookOpen, Pencil } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { ResolvedSuggestion, ResolvedToolGroup } from '../../hooks/useAITools'\n\ninterface ChatSuggestionsProps {\n suggestions: ResolvedSuggestion[]\n onSelect: (suggestion: ResolvedSuggestion) => void\n}\n\nconst MAX_SUGGESTIONS = 5\n\nexport function ChatSuggestions({ suggestions, onSelect }: ChatSuggestionsProps) {\n const { t } = useTranslation()\n const visible = suggestions.slice(0, MAX_SUGGESTIONS)\n\n return (\n <div className=\"flex flex-col gap-1 px-3 py-3\">\n <div className=\"flex items-center gap-1.5 px-1 pb-1\">\n <Sparkles className=\"h-3 w-3 text-muted-foreground/60\" />\n <span className=\"text-[11px] font-medium text-muted-foreground/70\">{t('chat.tryAsking')}</span>\n </div>\n {visible.map((suggestion, i) => {\n const labelKey = `chat.suggestion.${suggestion.toolId}.${i}`\n const translated = t(labelKey)\n const label = translated === labelKey ? suggestion.label : translated\n return (\n <button\n key={`${suggestion.toolId}-${i}`}\n onClick={() => onSelect(suggestion)}\n className={cn(\n 'rounded-md px-2.5 py-1.5 text-left text-xs text-muted-foreground',\n 'transition-colors hover:bg-muted hover:text-foreground'\n )}\n >\n &ldquo;{label}&rdquo;\n </button>\n )\n })}\n </div>\n )\n}\n\n// --- Tools panel (shown via config button) ---\n\ninterface ChatToolsPanelProps {\n toolGroups: ResolvedToolGroup[]\n onClose: () => void\n}\n\nexport function ChatToolsPanel({ toolGroups, onClose }: ChatToolsPanelProps) {\n const { t } = useTranslation()\n const totalTools = toolGroups.reduce((sum, g) => sum + g.tools.length, 0)\n\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between border-b border-border/40 bg-card px-4 py-2\">\n <span className=\"text-[11px] font-semibold text-foreground\">\n {t('chat.toolsAvailable', { count: totalTools })}\n </span>\n <button\n onClick={onClose}\n className=\"text-[11px] text-muted-foreground hover:text-foreground transition-colors\"\n >\n {t('common.done')}\n </button>\n </div>\n <div className=\"flex flex-col gap-3 px-3 py-3\">\n {toolGroups.map((group) => (\n <div key={group.category} className=\"flex flex-col gap-0.5\">\n <span className=\"px-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/50\">\n {group.category}\n </span>\n {group.tools.map(({ tool, signature }) => {\n const ModeIcon = tool.mode === 'persist' ? Pencil : BookOpen\n return (\n <div\n key={tool.id}\n className=\"flex items-start gap-1.5 rounded-md px-2 py-1 transition-colors hover:bg-muted/50\"\n title={tool.description}\n >\n <ModeIcon className=\"mt-0.5 h-3 w-3 shrink-0 text-muted-foreground/40\" />\n <div className=\"min-w-0\">\n <code className=\"text-[11px] font-mono text-muted-foreground\">\n {signature}\n </code>\n {tool.description && (\n <p className=\"text-[10px] leading-tight text-muted-foreground/40 truncate\">\n {tool.description}\n </p>\n )}\n </div>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { ArrowUp, Settings2 } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useChatStore, type ChatMessage } from '../../stores/chat.store'\nimport { useChat } from '../../hooks/useChat'\nimport { useAITools } from '../../hooks/useAITools'\nimport { ChatSuggestions, ChatToolsPanel } from './ChatSuggestions'\n\ninterface ChatPanelProps {\n title?: string\n apiEndpoint?: string\n systemPrompt?: string\n className?: string\n}\n\nexport function ChatPanel({\n title = 'Assistant',\n apiEndpoint,\n systemPrompt,\n className,\n}: ChatPanelProps) {\n const { isOpen, messages, isStreaming } = useChatStore()\n const { sendMessage } = useChat({ apiEndpoint, systemPrompt })\n const { t } = useTranslation()\n const { suggestions, toolGroups } = useAITools()\n const [input, setInput] = React.useState('')\n const [showTools, setShowTools] = React.useState(false)\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const hasMessages = messages.length > 0\n const totalTools = toolGroups.reduce((sum, g) => sum + g.tools.length, 0)\n\n React.useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' })\n }, [messages])\n\n React.useEffect(() => {\n if (isOpen) {\n const timer = setTimeout(() => inputRef.current?.focus(), 100)\n return () => clearTimeout(timer)\n }\n setShowTools(false)\n }, [isOpen])\n\n if (!isOpen) return null\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n const text = input.trim()\n if (!text || isStreaming) return\n setInput('')\n setShowTools(false)\n sendMessage(text)\n }\n\n return (\n <div\n className={cn(\n 'fixed z-40 flex flex-col overflow-hidden bg-card shadow-2xl',\n // Mobile: below header, above bottom nav\n 'inset-x-0 top-12 bottom-16 rounded-none border-0',\n // Desktop: floating card — sits just above the FAB, touching it\n 'md:inset-auto md:bottom-[3.75rem] md:right-4 md:w-[22rem] md:max-h-[min(70vh,520px)] md:rounded-2xl md:rounded-br-none md:border md:border-border/50',\n 'animate-in slide-in-from-bottom-2 fade-in-0 duration-150',\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border/40 px-4 py-2.5\">\n <div className=\"flex items-center gap-2\">\n <div className=\"h-1.5 w-1.5 rounded-full bg-success\" />\n <span className=\"text-xs font-semibold text-foreground\">{title}</span>\n </div>\n {totalTools > 0 && (\n <button\n onClick={() => setShowTools(!showTools)}\n className={cn(\n 'inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[10px] transition-colors',\n showTools\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted/50 hover:text-foreground'\n )}\n title=\"Available tools\"\n >\n <Settings2 className=\"h-3 w-3\" />\n <span className=\"font-medium\">{totalTools}</span>\n </button>\n )}\n </div>\n\n {/* Tools panel overlay */}\n {showTools ? (\n <ChatToolsPanel toolGroups={toolGroups} onClose={() => setShowTools(false)} />\n ) : (\n /* Messages / suggestions area */\n <div\n ref={scrollRef}\n className={cn(\n 'min-h-0 flex-1 overflow-y-auto',\n hasMessages && 'space-y-2 px-3 py-3'\n )}\n >\n {!hasMessages && (\n <ChatSuggestions\n suggestions={suggestions}\n onSelect={(suggestion) => {\n setInput('')\n sendMessage(suggestion.prompt ?? suggestion.label)\n }}\n />\n )}\n {messages.map((msg) => (\n <MessageBubble key={msg.id} message={msg} />\n ))}\n {isStreaming && messages[messages.length - 1]?.content === '' && (\n <div className=\"flex items-center gap-1 px-2 py-1.5\">\n <span className=\"h-1 w-1 rounded-full bg-muted-foreground/50 animate-pulse\" />\n <span className=\"h-1 w-1 rounded-full bg-muted-foreground/50 animate-pulse [animation-delay:150ms]\" />\n <span className=\"h-1 w-1 rounded-full bg-muted-foreground/50 animate-pulse [animation-delay:300ms]\" />\n </div>\n )}\n </div>\n )}\n\n {/* Input */}\n <form onSubmit={handleSubmit} className=\"border-t border-border/40 p-2\">\n <div className=\"flex items-center gap-1.5 rounded-full border border-border bg-background py-1 pl-3.5 pr-1 transition-colors focus-within:border-foreground/20\">\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={t('chat.messagePlaceholder')}\n className=\"min-w-0 flex-1 bg-transparent text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none\"\n disabled={isStreaming}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-foreground text-background transition-opacity hover:opacity-80 disabled:opacity-20\"\n aria-label=\"Send message\"\n >\n <ArrowUp className=\"h-3.5 w-3.5\" strokeWidth={2.5} />\n </button>\n </div>\n </form>\n </div>\n )\n}\n\nfunction MessageBubble({ message }: { message: ChatMessage }) {\n const isUser = message.role === 'user'\n\n return (\n <div className={cn('flex', isUser ? 'justify-end' : 'justify-start')}>\n <div\n className={cn(\n 'max-w-[85%] rounded-2xl px-3 py-1.5 text-[13px] leading-relaxed',\n isUser\n ? 'rounded-br-sm bg-foreground text-background'\n : 'rounded-bl-sm bg-muted text-foreground'\n )}\n >\n {message.content}\n </div>\n </div>\n )\n}\n","import type { ThemeTokens } from './tokens'\n\n// Polaris (Shopify Admin \"Sail\") light theme.\n// Page #f1f1f1, cards #ffffff, near-black brand #303030, light sidebar #ebebeb\n// with raised-white active items. Semantic accents only carry color.\nexport const lightTheme: ThemeTokens = {\n name: 'light',\n colors: {\n // Brand surface is near-black, not a saturated hue. Buttons get the bevel\n // shadow below; flat color is only half the look.\n primary: '0 0% 18.8%', // #303030\n primaryForeground: '0 0% 100%', // #ffffff\n secondary: '0 0% 96.9%', // #f7f7f7\n secondaryForeground: '0 0% 18.8%', // #303030\n accent: '0 0% 94.5%', // #f1f1f1 (hover/selected step)\n accentForeground: '0 0% 18.8%', // #303030\n background: '0 0% 94.5%', // #f1f1f1 — page is never white\n foreground: '0 0% 18.8%', // #303030\n card: '0 0% 100%', // #ffffff\n cardForeground: '0 0% 18.8%', // #303030\n muted: '0 0% 96.9%', // #f7f7f7\n mutedForeground: '0 0% 38%', // #616161\n border: '0 0% 89%', // #e3e3e3 (hairline, not dark gray)\n input: '0 0% 54.1%', // #8a8a8a — inputs need stronger border\n ring: '214 100% 41.4%', // #005bd3 — focus blue\n popover: '0 0% 100%',\n popoverForeground: '0 0% 18.8%',\n destructive: '354 92% 41%', // #c70a24\n destructiveForeground: '0 0% 100%',\n success: '167 95% 25.1%', // #047b5d\n successForeground: '0 0% 100%',\n warning: '43 100% 50%', // #ffb800\n warningForeground: '0 0% 18.8%',\n\n // Layout surfaces — light gray rail (Polaris \"Sail\"), raised white active items.\n sidebar: '0 0% 92.2%', // #ebebeb\n sidebarForeground: '0 0% 18.8%', // #303030\n sidebarBorder: '0 0% 86.3%', // #dcdcdc\n sidebarAccent: '0 0% 100%', // #ffffff — active item floats above rail\n sidebarAccentForeground: '0 0% 18.8%',\n sidebarMuted: '0 0% 38%', // #616161\n content: '0 0% 94.5%', // #f1f1f1\n },\n perception: {\n buttonRadius: '0.5rem', // 8px (--p-border-radius-200)\n cardRadius: '0.5rem', // 8px — Polaris cards are 8px, not 12px\n inputRadius: '0.5rem',\n modalRadius: '1rem', // 16px (--p-border-radius-400)\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n // Polaris hairline + a touch of bottom lift so cards visibly float on the gray page.\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(26, 26, 26, 0.06), 0 1px 2px -1px rgba(26, 26, 26, 0.06)',\n shadowMd: '0 1px 1px -1px rgba(26, 26, 26, 0.07), 0 4px 8px -2px rgba(26, 26, 26, 0.10)',\n shadowLg: '0 4px 12px -2px rgba(26, 26, 26, 0.15), 0 1px 3px rgba(26, 26, 26, 0.08)',\n // Inset bevels — Polaris signature. Buttons feel physical because of these.\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.50), 0 1px 0 rgba(0,0,0,0.05)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.20), 0 1px 1.5px rgba(0,0,0,0.20)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.20), inset 0 0 0 1px rgba(0,0,0,0.05)',\n },\n}\n","import type { ThemeTokens } from './tokens'\n\n// \"Sail midnight\" — Polaris/Shopify Admin dark companion. No upstream reference;\n// designed from the same philosophy as the light theme: neutral grayscale chrome,\n// page bg darker than cards (mirrors the light \"card floats on page\" hierarchy),\n// brand surface is the highest-contrast color (here near-white instead of near-black).\nexport const darkTheme: ThemeTokens = {\n name: 'dark',\n colors: {\n primary: '0 0% 100%', // #ffffff — inverted brand surface\n primaryForeground: '0 0% 10.2%', // #1a1a1a\n secondary: '0 0% 18.8%', // #303030\n secondaryForeground: '0 0% 89%', // #e3e3e3\n accent: '0 0% 22.7%', // #3a3a3a — hover/selected one step up from card\n accentForeground: '0 0% 100%',\n background: '0 0% 10.2%', // #1a1a1a — page\n foreground: '0 0% 89%', // #e3e3e3\n card: '0 0% 14.9%', // #262626 — one step lighter than page\n cardForeground: '0 0% 89%',\n muted: '0 0% 18.8%', // #303030\n mutedForeground: '0 0% 64.7%', // #a5a5a5\n border: '0 0% 22.7%', // #3a3a3a — hairline visible on cards\n input: '0 0% 32.2%', // #525252\n ring: '217 100% 68.4%', // #5b9bff — brighter blue for dark\n popover: '0 0% 18.8%', // popovers sit above cards\n popoverForeground: '0 0% 89%',\n destructive: '7 100% 44.9%', // #e51c00\n destructiveForeground: '0 0% 100%',\n success: '156 71% 42.5%', // #1fb87a\n successForeground: '0 0% 0%',\n warning: '41 100% 65.1%', // #ffc94d\n warningForeground: '0 0% 10.2%',\n\n // Sidebar matches page; active item is a raised dark pill.\n sidebar: '0 0% 10.2%', // #1a1a1a\n sidebarForeground: '0 0% 89%',\n sidebarBorder: '0 0% 16.5%', // #2a2a2a\n sidebarAccent: '0 0% 18.8%', // #303030\n sidebarAccentForeground: '0 0% 100%',\n sidebarMuted: '0 0% 64.7%',\n content: '0 0% 10.2%',\n },\n perception: {\n buttonRadius: '0.5rem',\n cardRadius: '0.5rem',\n inputRadius: '0.5rem',\n modalRadius: '1rem',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n // Shadows on dark are stronger or they disappear.\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.35), 0 1px 2px -1px rgba(0, 0, 0, 0.35)',\n shadowMd: '0 1px 1px -1px rgba(0, 0, 0, 0.5), 0 4px 8px -2px rgba(0, 0, 0, 0.6)',\n shadowLg: '0 4px 12px -2px rgba(0, 0, 0, 0.6), 0 1px 3px rgba(0, 0, 0, 0.4)',\n // Bevels — top highlight strengthens on near-white primary; on dark default\n // buttons we lean on the inset-bottom shadow for depth.\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.08), 0 1px 0 rgba(0,0,0,0.30)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.40), 0 1px 1.5px rgba(0,0,0,0.40)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.50), inset 0 0 0 1px rgba(0,0,0,0.20)',\n },\n}\n","import type {\n ThemeTokens,\n SemanticColors,\n UIPerceptionTokens,\n SaasTheme,\n ThemeRadius,\n ThemeShadow,\n ThemeFont,\n} from './tokens'\nimport { lightTheme } from './light'\nimport { createFayzTheme } from '@fayz-ai/ui'\n\nexport interface CreateThemeOptions {\n name?: string\n colors?: Partial<SemanticColors>\n /** Dark mode color overrides — applied instead of `colors` when in dark mode */\n darkColors?: Partial<SemanticColors>\n perception?: Partial<UIPerceptionTokens>\n /** Shorthand: single HSL value that auto-derives primary, ring, and accent */\n brand?: string\n}\n\n// --- Friendly preset maps ---\n\nconst RADIUS_MAP: Record<ThemeRadius, { button: string; card: string; input: string; modal: string }> = {\n sharp: { button: '0.25rem', card: '0.375rem', input: '0.25rem', modal: '0.5rem' },\n soft: { button: '0.5rem', card: '0.75rem', input: '0.5rem', modal: '0.75rem' },\n round: { button: '9999px', card: '1rem', input: '0.75rem', modal: '1.25rem' },\n}\n\nconst SHADOW_MAP: Record<ThemeShadow, { sm: string; md: string; lg: string }> = {\n none: { sm: 'none', md: 'none', lg: 'none' },\n subtle: { sm: '0 1px 2px 0 rgb(0 0 0 / 0.03)', md: '0 2px 4px -1px rgb(0 0 0 / 0.06)', lg: '0 4px 6px -2px rgb(0 0 0 / 0.05)' },\n medium: { sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)', md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)' },\n bold: { sm: '0 1px 3px 0 rgb(0 0 0 / 0.1)', md: '0 4px 8px -1px rgb(0 0 0 / 0.15), 0 2px 4px -1px rgb(0 0 0 / 0.1)', lg: '0 12px 24px -4px rgb(0 0 0 / 0.15), 0 4px 8px -2px rgb(0 0 0 / 0.1)' },\n}\n\nconst FONT_MAP: Record<ThemeFont, string> = {\n 'system': 'ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'inter': '\"Inter\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'dm-sans': '\"DM Sans\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'poppins': '\"Poppins\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'geist': '\"Geist\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'plus-jakarta': '\"Plus Jakarta Sans\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'outfit': '\"Outfit\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", sans-serif',\n 'nunito': '\"Nunito\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'source-sans': '\"Source Sans 3\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'raleway': '\"Raleway\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'manrope': '\"Manrope\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n}\n\n/**\n * Resolve a SaasTheme (friendly format) into CreateThemeOptions (internal format).\n * This is the main API for vertical themes.\n *\n * Light-only colors (content bg, card, border, etc.) go into `colors`.\n * Dark-mode overrides go into `darkColors` so the dark base theme isn't broken.\n * Sidebar colors are always applied (same in both modes — the sidebar has its own palette).\n */\nexport function resolveTheme(theme: SaasTheme): CreateThemeOptions {\n const presetId = theme.preset ?? 'classic_admin'\n const preset = createFayzTheme(presetId)\n const radius = theme.radius ? RADIUS_MAP[theme.radius] : presetId === 'classic_admin' ? RADIUS_MAP.soft : undefined\n const shadow = theme.shadow ? SHADOW_MAP[theme.shadow] : presetId === 'classic_admin' ? SHADOW_MAP.medium : undefined\n const font = theme.font ? FONT_MAP[theme.font] : presetId === 'classic_admin' ? FONT_MAP.inter : undefined\n\n // --- Light mode colors ---\n const colors: Partial<SemanticColors> = { ...theme.colors }\n\n // Content background (light mode only)\n if (theme.content) {\n colors.content = theme.content.background\n }\n\n // Sidebar colors apply in both modes (sidebar has its own palette)\n if (theme.sidebar) {\n colors.sidebar = theme.sidebar.background\n colors.sidebarForeground = theme.sidebar.foreground\n colors.sidebarAccent = theme.sidebar.accent\n colors.sidebarAccentForeground = theme.sidebar.accentForeground\n if (theme.sidebar.border) colors.sidebarBorder = theme.sidebar.border\n if (theme.sidebar.muted) colors.sidebarMuted = theme.sidebar.muted\n }\n\n // --- Dark mode colors (only sidebar + brand — let darkTheme handle the rest) ---\n const darkColors: Partial<SemanticColors> = {}\n\n // Sidebar keeps same palette in dark mode\n if (theme.sidebar) {\n darkColors.sidebar = theme.sidebar.background\n darkColors.sidebarForeground = theme.sidebar.foreground\n darkColors.sidebarAccent = theme.sidebar.accent\n darkColors.sidebarAccentForeground = theme.sidebar.accentForeground\n if (theme.sidebar.border) darkColors.sidebarBorder = theme.sidebar.border\n if (theme.sidebar.muted) darkColors.sidebarMuted = theme.sidebar.muted\n }\n\n return {\n ...preset,\n name: theme.name,\n brand: theme.brand,\n colors: {\n ...(preset.colors ?? {}),\n ...colors,\n },\n darkColors: {\n ...(preset.darkColors ?? {}),\n ...darkColors,\n },\n perception: {\n ...(preset.perception ?? {}),\n fontFamilyMono: '\"JetBrains Mono\", ui-monospace, SFMono-Regular, monospace',\n ...(radius\n ? {\n buttonRadius: radius.button,\n cardRadius: radius.card,\n inputRadius: radius.input,\n modalRadius: radius.modal,\n }\n : {}),\n ...(font ? { fontFamily: font } : {}),\n ...(shadow\n ? {\n shadowSm: shadow.sm,\n shadowMd: shadow.md,\n shadowLg: shadow.lg,\n }\n : {}),\n },\n }\n}\n\nexport function createTheme(overrides: CreateThemeOptions): ThemeTokens {\n const colors = { ...lightTheme.colors, ...overrides.colors }\n\n // Brand shorthand: auto-derive primary, ring, accent from single HSL\n if (overrides.brand) {\n colors.primary = overrides.brand\n colors.primaryForeground = '0 0% 100%'\n colors.ring = overrides.brand\n // Derive accent by shifting hue ~50 degrees\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n colors.accentForeground = '0 0% 100%'\n }\n }\n\n return {\n name: overrides.name ?? lightTheme.name,\n colors,\n perception: {\n ...lightTheme.perception,\n ...overrides.perception,\n },\n }\n}\n\nconst colorVarMap: Record<string, string> = {\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n secondary: '--secondary',\n secondaryForeground: '--secondary-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n background: '--background',\n foreground: '--foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n success: '--success',\n successForeground: '--success-foreground',\n warning: '--warning',\n warningForeground: '--warning-foreground',\n // Layout surfaces\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarMuted: '--sidebar-muted',\n content: '--content',\n}\n\nconst perceptionVarMap: Record<string, string> = {\n buttonRadius: '--button-radius',\n cardRadius: '--card-radius',\n inputRadius: '--input-radius',\n modalRadius: '--modal-radius',\n fontFamily: '--font-family',\n fontFamilyMono: '--font-family-mono',\n shadowSm: '--shadow-sm',\n shadowMd: '--shadow-md',\n shadowLg: '--shadow-lg',\n shadowButton: '--shadow-button',\n shadowButtonPrimary: '--shadow-button-primary',\n shadowButtonInset: '--shadow-button-inset',\n surfaceBackdropFilter: '--surface-backdrop-filter',\n modalBackground: '--modal-bg',\n modalBorder: '--modal-border',\n modalOverlayBackground: '--modal-overlay-bg',\n modalOverlayBackdropFilter: '--modal-overlay-backdrop-filter',\n modalShadow: '--modal-shadow',\n glassEdgeGradient: '--glass-edge-gradient',\n glassPrimaryEdgeGradient: '--glass-primary-edge-gradient',\n glassInnerHighlight: '--glass-inner-highlight',\n fieldBackground: '--field-bg',\n fieldBorder: '--field-border',\n fieldShadow: '--field-shadow',\n buttonBackground: '--button-bg',\n buttonBackgroundHover: '--button-hover-bg',\n buttonBorder: '--button-border',\n buttonPrimaryBackground: '--button-primary-bg',\n buttonPrimaryBackgroundHover: '--button-primary-hover-bg',\n buttonPrimaryBorder: '--button-primary-border',\n buttonBackdropFilter: '--button-backdrop-filter',\n}\n\nexport function applyTheme(theme: ThemeTokens, element?: HTMLElement): void {\n const target = element ?? document.documentElement\n\n for (const [key, cssVar] of Object.entries(colorVarMap)) {\n const value = theme.colors[key as keyof typeof theme.colors]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n\n for (const [key, cssVar] of Object.entries(perceptionVarMap)) {\n const value = theme.perception[key as keyof typeof theme.perception]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n}\n\nexport function getSystemPreference(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n","import { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport type { ThemeTokens } from '../config/theme/tokens'\nimport { lightTheme } from '../config/theme/light'\nimport { darkTheme } from '../config/theme/dark'\nimport { applyTheme } from '../config/theme/utils'\nimport type { CreateThemeOptions } from '../config/theme/utils'\n\ntype ThemeMode = 'light' | 'dark' | 'system'\n\nconst STORAGE_KEY = 'saas-core:theme-mode'\n\ninterface ThemeState {\n mode: ThemeMode\n resolvedMode: 'light' | 'dark'\n /** Only the user's partial overrides — NOT a full theme */\n overrides: CreateThemeOptions | null\n setMode: (mode: ThemeMode) => void\n setOverrides: (overrides: CreateThemeOptions | null) => void\n initialize: () => void\n // Keep old API name working\n setCustomTheme: (theme: ThemeTokens | null) => void\n}\n\nfunction getSystemPreference(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getSavedMode(): ThemeMode {\n if (typeof window === 'undefined') return 'light'\n const saved = localStorage.getItem(STORAGE_KEY)\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved\n return 'light'\n}\n\nfunction resolveMode(mode: ThemeMode): 'light' | 'dark' {\n return mode === 'system' ? getSystemPreference() : mode\n}\n\n/** Merge base theme (light or dark) with user's partial overrides */\nfunction buildTheme(base: ThemeTokens, overrides: CreateThemeOptions | null): ThemeTokens {\n if (!overrides) return base\n\n const isDark = base.name === 'dark'\n const colors = { ...base.colors }\n\n // Brand shorthand: derive primary, ring, accent from single HSL\n if (overrides.brand) {\n colors.primary = overrides.brand\n colors.primaryForeground = '0 0% 100%'\n colors.ring = overrides.brand\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n colors.accentForeground = '0 0% 100%'\n }\n }\n\n // Apply explicit color overrides.\n // In dark mode, use darkColors if provided; otherwise skip light-only colors.\n const colorOverrides = isDark && overrides.darkColors\n ? overrides.darkColors\n : overrides.colors\n\n if (colorOverrides) {\n for (const [key, value] of Object.entries(colorOverrides)) {\n if (value !== undefined) {\n (colors as any)[key] = value\n }\n }\n }\n\n return {\n name: overrides.name ?? base.name,\n colors,\n perception: {\n ...base.perception,\n ...(overrides.perception ?? {}),\n },\n }\n}\n\nconst STORE_KEY = '__saas_core_theme_store__'\n\nfunction createThemeStore(): UseBoundStore<StoreApi<ThemeState>> {\n // Window-level singleton to survive linked-package dual-module loading\n if (typeof window !== 'undefined' && (window as any)[STORE_KEY]) {\n return (window as any)[STORE_KEY]\n }\n\n const store = create<ThemeState>((set, get) => ({\n mode: getSavedMode(),\n resolvedMode: 'light',\n overrides: null,\n\n setMode: (mode) => {\n const resolved = resolveMode(mode)\n set({ mode, resolvedMode: resolved })\n\n // Persist to localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, mode)\n }\n\n const { overrides } = get()\n const baseTheme = resolved === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n\n if (typeof document !== 'undefined') {\n // Enable color transition before applying changes\n document.documentElement.classList.add('theme-transitioning')\n\n applyTheme(theme)\n document.documentElement.classList.toggle('dark', resolved === 'dark')\n\n // Remove transition class after animation completes\n setTimeout(() => {\n document.documentElement.classList.remove('theme-transitioning')\n }, 450)\n } else {\n applyTheme(theme)\n }\n },\n\n setOverrides: (overrides) => {\n set({ overrides })\n const { resolvedMode } = get()\n const baseTheme = resolvedMode === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n applyTheme(theme)\n },\n\n // Legacy compat — if someone passes a full ThemeTokens, store it as overrides\n setCustomTheme: (_theme) => {\n // Ignore — callers should use setOverrides now\n },\n\n initialize: () => {\n const { mode, setMode } = get()\n setMode(mode)\n\n // Listen for OS theme changes when in 'system' mode\n if (typeof window !== 'undefined') {\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const current = get()\n if (current.mode === 'system') {\n current.setMode('system')\n }\n })\n }\n },\n }))\n\n if (typeof window !== 'undefined') {\n (window as any)[STORE_KEY] = store\n }\n\n return store\n}\n\nexport const useThemeStore = createThemeStore()\n","import * as React from 'react'\nimport { hashRouterAdapter } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Admin hash router — the same lightweight approach the storefront uses. The\n// admin shell collects routes from the plugin runtime + manifest pages and\n// switches on the current hash path. Deliberately not react-router: an SDK\n// shell shipping a router creates singleton hazards under source-alias dev.\n// ---------------------------------------------------------------------------\n\nconst adapter = hashRouterAdapter()\n\nexport function normalizeAdminPath(path: string): string {\n const clean = `/${path}`.replace(/\\/+/g, '/')\n return clean.length > 1 ? clean.replace(/\\/+$/, '') : clean\n}\n\nexport function navigateTo(to: string): void {\n adapter.navigate(normalizeAdminPath(to))\n}\n\nexport function useAdminPath(): string {\n const [path, setPath] = React.useState(() => normalizeAdminPath(adapter.getCurrentPath() || '/'))\n React.useEffect(() => {\n return adapter.onPathChange((p) => {\n setPath(normalizeAdminPath(p || '/'))\n if (typeof window !== 'undefined') window.scrollTo(0, 0)\n })\n }, [])\n return path\n}\n\n/** Match '/courses/:id' against '/courses/abc' → { id: 'abc' }; supports a\n * trailing '/*' wildcard (matches the base and any deeper path). */\nexport function matchRoute(pattern: string, path: string): Record<string, string> | null {\n const cleanPath = (path.split('?')[0] ?? '').replace(/\\/+$/, '') || '/'\n if (pattern.endsWith('/*')) {\n const base = pattern.slice(0, -2)\n if (cleanPath === base || cleanPath.startsWith(`${base}/`)) return {}\n return null\n }\n const patternParts = pattern.split('/').filter(Boolean)\n const pathParts = cleanPath.split('/').filter(Boolean)\n if (patternParts.length !== pathParts.length) return null\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pat = patternParts[i]!\n const part = pathParts[i]!\n if (pat.startsWith(':')) params[pat.slice(1)] = decodeURIComponent(part)\n else if (pat !== part) return null\n }\n return params\n}\n\n/** Score a route pattern for specificity so the most specific match wins\n * (static segments beat params; longer beats shorter; wildcard loses). */\nexport function routeScore(pattern: string): number {\n const isWildcard = pattern.endsWith('/*')\n const routePattern = isWildcard ? pattern.slice(0, -2) : pattern\n const parts = routePattern.split('/').filter(Boolean)\n let score = parts.length * 10\n for (const p of parts) if (!p.startsWith(':')) score += 5\n if (isWildcard) score -= 1\n return score\n}\n","import * as React from 'react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport { useAuth } from '@fayz-ai/auth'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { AuthProvider } from '@fayz-ai/core'\n\nexport interface LoginPageProps {\n appName?: string\n logo?: React.ReactNode\n loginLogo?: React.ReactNode\n layout?: 'split' | 'centered'\n tagline?: string\n description?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n}\n\ntype View = 'login' | 'signup' | 'recovery'\n\nfunction providerLabel(provider: string): string {\n return provider.charAt(0).toUpperCase() + provider.slice(1)\n}\n\nexport function LoginPage({\n appName = 'Fayz',\n logo,\n loginLogo,\n layout = 'split',\n tagline,\n description,\n showOAuth = false,\n oauthProviders = ['google'],\n}: LoginPageProps) {\n const t = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key || v.includes('{{') ? fallback : v\n }\n const { signIn, signUp, signInWithOAuth, resetPassword, isLoading, error } = useAuth()\n const [view, setView] = React.useState<View>('login')\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [fullName, setFullName] = React.useState('')\n const [notice, setNotice] = React.useState<string | null>(null)\n const [submitting, setSubmitting] = React.useState(false)\n\n const busy = submitting || isLoading\n const brandLogo = loginLogo ?? logo\n const heading = view === 'login'\n ? tr('auth.login.title', 'Welcome back')\n : view === 'signup'\n ? tr('auth.signup.title', 'Create account')\n : tr('auth.recovery.title', 'Reset password')\n const subtitle = view === 'login'\n ? tr('auth.login.enterCredentials', 'Enter your credentials to continue')\n : view === 'signup'\n ? tr('auth.signup.getStarted', 'Create your account to get started')\n : tr('auth.recovery.resetSubtitle', 'Enter your email and we will send reset instructions')\n\n async function submitLogin(e: React.FormEvent) {\n e.preventDefault()\n setNotice(null)\n setSubmitting(true)\n try {\n await signIn(email, password)\n } catch {\n // error is surfaced by useAuth().error\n } finally {\n setSubmitting(false)\n }\n }\n\n async function submitSignup(e: React.FormEvent) {\n e.preventDefault()\n setNotice(null)\n setSubmitting(true)\n try {\n await signUp(email, password, fullName)\n } catch {\n // error is surfaced by useAuth().error\n } finally {\n setSubmitting(false)\n }\n }\n\n async function submitRecovery(e: React.FormEvent) {\n e.preventDefault()\n setSubmitting(true)\n try {\n await resetPassword(email)\n setNotice(tr('auth.recovery.sent', 'Password reset instructions sent.'))\n } catch {\n // error is surfaced by useAuth().error\n } finally {\n setSubmitting(false)\n }\n }\n\n async function submitOAuth(provider: AuthProvider) {\n setSubmitting(true)\n try {\n await signInWithOAuth(provider)\n } finally {\n setSubmitting(false)\n }\n }\n\n const LoginForm = (\n <form onSubmit={view === 'signup' ? submitSignup : view === 'recovery' ? submitRecovery : submitLogin} className=\"space-y-4\">\n {view === 'signup' && (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\" htmlFor=\"login-name\">\n {tr('auth.fullName', 'Full name')}\n </label>\n <Input id=\"login-name\" value={fullName} onChange={(e) => setFullName(e.target.value)} required disabled={busy} />\n </div>\n )}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\" htmlFor=\"login-email\">\n {tr('auth.email', 'Email')}\n </label>\n <Input\n id=\"login-email\"\n type=\"email\"\n autoComplete=\"username\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={busy}\n />\n </div>\n {view !== 'recovery' && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <label className=\"text-sm font-medium text-foreground\" htmlFor=\"login-password\">\n {tr('auth.password', 'Password')}\n </label>\n {view === 'login' && (\n <button type=\"button\" className=\"text-xs font-medium text-primary hover:underline\" onClick={() => setView('recovery')}>\n {tr('auth.forgotPassword', 'Forgot password?')}\n </button>\n )}\n </div>\n <Input\n id=\"login-password\"\n type=\"password\"\n autoComplete={view === 'signup' ? 'new-password' : 'current-password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n disabled={busy}\n />\n </div>\n )}\n {error && <p className=\"text-sm text-destructive\">{String(error.message ?? error)}</p>}\n {notice && <p className=\"text-sm text-success\">{notice}</p>}\n <Button type=\"submit\" className=\"w-full\" disabled={busy}>\n {busy\n ? tr('common.loading', 'Loading...')\n : view === 'signup'\n ? tr('auth.signUp', 'Sign up')\n : view === 'recovery'\n ? tr('auth.recovery.submit', 'Send reset link')\n : tr('auth.signIn', 'Sign in')}\n </Button>\n {showOAuth && view === 'login' && oauthProviders.length > 0 && (\n <div className=\"space-y-2\">\n {oauthProviders.map((provider) => (\n <Button\n key={provider}\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n disabled={busy}\n onClick={() => { void submitOAuth(provider) }}\n >\n {tr(`auth.oauth.${provider}`, `Continue with ${providerLabel(provider)}`)}\n </Button>\n ))}\n </div>\n )}\n </form>\n )\n\n const viewSwitch = view === 'login' ? (\n <p className=\"text-center text-sm text-muted-foreground\">\n {tr('auth.login.noAccount', 'Do not have an account?')}{' '}\n <button type=\"button\" onClick={() => setView('signup')} className=\"font-medium text-primary hover:underline\">\n {tr('auth.signUp', 'Sign up')}\n </button>\n </p>\n ) : (\n <p className=\"text-center text-sm text-muted-foreground\">\n {view === 'signup' ? tr('auth.signup.hasAccount', 'Already have an account?') : tr('auth.recovery.remembered', 'Remembered your password?')}{' '}\n <button type=\"button\" onClick={() => setView('login')} className=\"font-medium text-primary hover:underline\">\n {tr('auth.signIn', 'Sign in')}\n </button>\n </p>\n )\n\n if (layout === 'centered') {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"relative w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n <div className=\"mb-8 text-center\">\n {brandLogo && <div className=\"mb-4 flex justify-center\">{brandLogo}</div>}\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {LoginForm}\n {viewSwitch}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex min-h-screen bg-sidebar\">\n <div className=\"relative hidden w-1/2 overflow-hidden lg:block\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-sidebar-accent/50 via-transparent to-sidebar/80\" />\n <div className=\"absolute -left-20 -top-20 h-80 w-80 rounded-full bg-primary/10\" />\n <div className=\"absolute -bottom-10 -right-10 h-60 w-60 rounded-full bg-primary/5\" />\n <div className=\"absolute right-1/4 top-1/3 h-40 w-40 rounded-full bg-primary/5\" />\n <div className=\"relative flex h-full flex-col justify-end p-12\">\n <div className=\"space-y-4\">\n <p className=\"text-sm font-medium text-sidebar-muted\">{appName}</p>\n <h2 className=\"text-3xl font-bold text-sidebar-foreground\">\n {tagline ?? tr('auth.login.welcomeTo', `Welcome to ${appName}`)}\n </h2>\n {description && <p className=\"max-w-md text-sm leading-relaxed text-sidebar-muted\">{description}</p>}\n <div className=\"mt-8 flex items-center gap-3 rounded-xl bg-sidebar-accent/40 p-4\">\n <div className=\"flex -space-x-2\">\n {['bg-primary', 'bg-success', 'bg-warning'].map((bg, i) => (\n <div key={i} className={`${bg} h-8 w-8 rounded-full border-2 border-sidebar`} />\n ))}\n </div>\n <p className=\"text-xs text-sidebar-foreground/80\">\n {tr('auth.login.socialProof', `${appName} keeps your operation moving.`)}\n </p>\n </div>\n </div>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col lg:p-3 lg:pl-3\">\n <div className=\"flex flex-1 flex-col justify-center bg-background px-6 py-12 lg:rounded-[1.25rem] lg:px-16\">\n <div className=\"mx-auto w-full max-w-sm\">\n {brandLogo && <div className=\"mb-8\">{brandLogo}</div>}\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {LoginForm}\n {viewSwitch}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\nLoginPage.displayName = 'AdminLoginPage'\n","/**\n * Global entity route registry.\n *\n * Populated once during buildNavigation() with mappings from\n * \"archetype:kind\" (e.g. \"person:staff\") to the registered route path\n * (e.g. \"/registry/staff\"). Used by PersonLink, command palette, and\n * any component that needs to resolve an entity detail URL.\n */\n\nlet routeMap = new Map<string, string>()\n\n/** Replace the entity route map (called once at app init by buildNavigation). */\nexport function setEntityRouteMap(map: Map<string, string>): void {\n routeMap = map\n}\n\n/**\n * Resolve the route path for an entity given its archetype and kind.\n * Returns the registered path (e.g. \"/registry/staff\") or null if not found.\n *\n * Tries \"archetype:kind\" first, then \"archetype\" alone.\n */\nexport function resolveEntityRoute(archetype?: string, kind?: string): string | null {\n if (archetype && kind) {\n const specific = routeMap.get(`${archetype}:${kind}`)\n if (specific) return specific\n }\n if (archetype) {\n const general = routeMap.get(archetype)\n if (general) return general\n }\n return null\n}\n\n/**\n * Build a full URL path for an entity detail page.\n * Returns e.g. \"/registry/staff/uuid\" or \"/registry/staff/uuid/schedule\".\n * Falls back to \"/kind/uuid\" if no route registered.\n */\nexport function resolveEntityHref(id: string, archetype?: string, kind?: string, tab?: string): string {\n const route = resolveEntityRoute(archetype, kind)\n let href: string\n if (route) {\n href = `${route}/${id}`\n } else if (kind) {\n const plural = kind.endsWith('s') ? kind : kind + 's'\n href = `/${plural}/${id}`\n } else {\n href = `/${id}`\n }\n if (tab) href += `/${tab}`\n return href\n}\n","import { create } from 'zustand'\n\nconst STORAGE_KEY = 'saas-core:locale'\n\nfunction getPersistedLocale(): string {\n try {\n return localStorage.getItem(STORAGE_KEY) ?? 'en'\n } catch {\n return 'en'\n }\n}\n\ninterface LocaleState {\n locale: string\n setLocale: (locale: string) => void\n}\n\nexport const useLocaleStore = create<LocaleState>((set) => ({\n locale: getPersistedLocale(),\n setLocale: (locale) => {\n try { localStorage.setItem(STORAGE_KEY, locale) } catch { /* ignore */ }\n set({ locale })\n },\n}))\n","export interface LocaleOption {\n code: string\n label: string\n flag: string\n}\n\nexport const SUPPORTED_LOCALES: LocaleOption[] = [\n { code: 'en', label: 'English', flag: '🇺🇸' },\n { code: 'pt-BR', label: 'Português (BR)', flag: '🇧🇷' },\n]\n\nexport function getLocaleOption(code: string): LocaleOption {\n return SUPPORTED_LOCALES.find((l) => l.code === code) ?? SUPPORTED_LOCALES[0]\n}\n","import * as React from 'react'\nimport { Save, Check } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useLocaleStore } from '../../stores/locale.store'\nimport { SUPPORTED_LOCALES } from '../../lib/locale-config'\nimport type { Tenant } from '../../types'\n\ninterface CompanySettingsProps {\n tenant?: Tenant | null\n onSave?: (settings: {\n name: string\n timezone: string\n currency: string\n }) => void\n}\n\nconst TIMEZONES = [\n { value: 'America/Sao_Paulo', label: 'Brasilia (BRT)' },\n { value: 'America/New_York', label: 'Eastern (US)' },\n { value: 'America/Chicago', label: 'Central (US)' },\n { value: 'America/Denver', label: 'Mountain (US)' },\n { value: 'America/Los_Angeles', label: 'Pacific (US)' },\n { value: 'America/Mexico_City', label: 'Mexico City' },\n { value: 'America/Buenos_Aires', label: 'Buenos Aires' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Europe/Madrid', label: 'Madrid' },\n { value: 'Europe/Lisbon', label: 'Lisbon' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' },\n { value: 'UTC', label: 'UTC' },\n]\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'BRL - Real' },\n { value: 'USD', label: 'USD - US Dollar' },\n { value: 'EUR', label: 'EUR - Euro' },\n { value: 'GBP', label: 'GBP - British Pound' },\n { value: 'JPY', label: 'JPY - Japanese Yen' },\n { value: 'CAD', label: 'CAD - Canadian Dollar' },\n { value: 'AUD', label: 'AUD - Australian Dollar' },\n { value: 'MXN', label: 'MXN - Mexican Peso' },\n { value: 'ARS', label: 'ARS - Argentine Peso' },\n]\n\nexport function CompanySettings({ tenant, onSave }: CompanySettingsProps) {\n const { t } = useTranslation()\n const { locale: uiLocale, setLocale: setUiLocale } = useLocaleStore()\n const [name, setName] = React.useState(tenant?.name ?? '')\n const [timezone, setTimezone] = React.useState(tenant?.settings?.timezone ?? 'UTC')\n const [currency, setCurrency] = React.useState(tenant?.settings?.currency ?? 'USD')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (tenant) {\n setName(tenant.name)\n setTimezone(tenant.settings?.timezone ?? 'UTC')\n setCurrency(tenant.settings?.currency ?? 'USD')\n }\n }, [tenant])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ name, timezone, currency })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.company.title')}</CardTitle>\n <CardDescription>\n {t('settings.company.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"company-name\" className=\"text-sm font-medium\">\n {t('settings.company.name')}\n </label>\n <Input\n id=\"company-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Acme Inc.\"\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.company.timezone')}</label>\n <Select value={timezone} onValueChange={setTimezone}>\n <SelectTrigger>\n <SelectValue placeholder={t('settings.company.timezonePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {TIMEZONES.map((tz) => (\n <SelectItem key={tz.value} value={tz.value}>\n {tz.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.company.currency')}</label>\n <Select value={currency} onValueChange={setCurrency}>\n <SelectTrigger>\n <SelectValue placeholder={t('settings.company.currencyPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {CURRENCIES.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.save')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n\n {/* UI Language */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">{t('settings.uiLanguage')}</CardTitle>\n <CardDescription>{t('settings.uiLanguageDescription')}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {SUPPORTED_LOCALES.map((loc) => (\n <button\n key={loc.code}\n onClick={() => {\n setUiLocale(loc.code)\n window.location.reload()\n }}\n className={`flex items-center justify-between rounded-lg border-2 px-4 py-3 text-sm transition-all ${\n uiLocale === loc.code\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/30 hover:bg-muted/50'\n }`}\n >\n <span className=\"flex items-center gap-3\">\n <span className=\"text-xl\">{loc.flag}</span>\n <span className=\"font-medium\">{loc.label}</span>\n </span>\n {uiLocale === loc.code && <Check className=\"h-4 w-4 text-primary\" />}\n </button>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type { OrgAdapter } from '../types/org-adapter'\n\nconst OrgAdapterContext = createContext<OrgAdapter | null>(null)\n\nexport const OrgAdapterProvider = OrgAdapterContext.Provider\n\nexport function useOrgAdapter(): OrgAdapter {\n const adapter = useContext(OrgAdapterContext)\n if (!adapter) {\n throw new Error('useOrgAdapter must be used within an OrgAdapterProvider')\n }\n return adapter\n}\n\nexport function useOrgAdapterOptional(): OrgAdapter | null {\n return useContext(OrgAdapterContext)\n}\n","import { CompanySettings } from './CompanySettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { toast } from '../notifications/ToastProvider'\nimport type { Tenant, TenantSettings } from '../../types'\n\nfunction toTenantSettings(settings: unknown): TenantSettings {\n const source = (settings && typeof settings === 'object' ? settings : {}) as Partial<TenantSettings>\n const branding = (source.branding && typeof source.branding === 'object' ? source.branding : {}) as TenantSettings['branding']\n\n return {\n timezone: source.timezone ?? 'America/Sao_Paulo',\n currency: source.currency ?? 'BRL',\n locale: source.locale ?? 'pt-BR',\n branding: {\n primaryColor: branding.primaryColor,\n accentColor: branding.accentColor,\n logoUrl: branding.logoUrl,\n faviconUrl: branding.faviconUrl,\n },\n }\n}\n\nexport function ConnectedCompanySettings() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const adapter = useOrgAdapterOptional()\n // Map Organization to Tenant shape for the component\n const tenant: Tenant | null = currentOrg\n ? {\n id: currentOrg.id,\n name: currentOrg.name,\n slug: currentOrg.slug,\n logoUrl: currentOrg.logoUrl,\n plan: currentOrg.plan ?? 'free',\n settings: toTenantSettings(currentOrg.settings),\n createdAt: currentOrg.createdAt,\n updatedAt: currentOrg.updatedAt,\n }\n : null\n\n const handleSave = async (data: { name: string; timezone: string; currency: string }) => {\n if (!adapter || !currentOrg) return\n\n try {\n const currentSettings = toTenantSettings(currentOrg.settings)\n const updated = await adapter.updateOrg(currentOrg.id, {\n name: data.name,\n settings: {\n ...currentSettings,\n timezone: data.timezone,\n currency: data.currency,\n },\n })\n setCurrentOrg(updated)\n toast.success('Settings saved')\n } catch (err: any) {\n toast.error('Failed to save', { description: err?.message })\n }\n }\n\n return <CompanySettings tenant={tenant} onSave={handleSave} />\n}\n","import * as React from 'react'\nimport { Camera, Save } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types'\n\ninterface UserProfileProps {\n user?: AuthUser | null\n onSave?: (data: { fullName: string }) => void\n onAvatarChange?: (file: File) => void\n}\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((part) => part[0])\n .filter(Boolean)\n .slice(0, 2)\n .join('')\n .toUpperCase()\n}\n\nexport function UserProfile({ user, onSave, onAvatarChange }: UserProfileProps) {\n const { t } = useTranslation()\n const [fullName, setFullName] = React.useState(user?.fullName ?? '')\n const [saving, setSaving] = React.useState(false)\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (user) {\n setFullName(user.fullName)\n }\n }, [user])\n\n const handleAvatarClick = () => {\n fileInputRef.current?.click()\n }\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file && onAvatarChange) {\n onAvatarChange(file)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ fullName })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.profile.title')}</CardTitle>\n <CardDescription>\n {t('settings.profile.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n <div className=\"flex items-center gap-6\">\n <div className=\"relative\">\n <Avatar className=\"h-20 w-20\">\n <AvatarImage src={user?.avatarUrl} alt={user?.fullName} />\n <AvatarFallback className=\"text-lg\">\n {user?.fullName ? getInitials(user.fullName) : '?'}\n </AvatarFallback>\n </Avatar>\n {onAvatarChange && (\n <button\n type=\"button\"\n onClick={handleAvatarClick}\n className={cn(\n 'absolute -bottom-1 -right-1 flex h-8 w-8 items-center justify-center rounded-full',\n 'border-2 border-background bg-primary text-primary-foreground',\n 'transition-colors hover:bg-primary/90'\n )}\n aria-label=\"Change avatar\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </button>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleFileChange}\n />\n </div>\n\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{user?.fullName ?? 'User'}</p>\n <p className=\"text-sm text-muted-foreground\">{user?.email}</p>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"full-name\" className=\"text-sm font-medium\">\n {t('settings.profile.fullName')}\n </label>\n <Input\n id=\"full-name\"\n value={fullName}\n onChange={(e) => setFullName(e.target.value)}\n placeholder=\"John Doe\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"email\" className=\"text-sm font-medium\">\n {t('settings.profile.email')}\n </label>\n <Input\n id=\"email\"\n type=\"email\"\n value={user?.email ?? ''}\n disabled\n className=\"bg-muted\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.profile.emailHelp')}\n </p>\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.profile.saveProfile')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n )\n}\n","import { create } from 'zustand'\nimport type { AuthUser, AuthSession, AuthState } from '../types'\n\ninterface AuthStore extends AuthState {\n setUser: (user: AuthUser | null) => void\n setSession: (session: AuthSession | null) => void\n setLoading: (loading: boolean) => void\n setInitialized: (initialized: boolean) => void\n setPendingEmailVerification: (pending: boolean) => void\n reset: () => void\n}\n\nconst initialState: AuthState = {\n user: null,\n session: null,\n loading: true,\n initialized: false,\n pendingEmailVerification: false,\n}\n\nexport const useAuthStore = create<AuthStore>((set) => ({\n ...initialState,\n setUser: (user) => set({ user }),\n setSession: (session) => set({ session, user: session?.user ?? null, pendingEmailVerification: false }),\n setLoading: (loading) => set({ loading }),\n setInitialized: (initialized) => set({ initialized }),\n setPendingEmailVerification: (pendingEmailVerification) => set({ pendingEmailVerification }),\n reset: () => set(initialState),\n}))\n","// Shim → native Supabase client (unified singleton across shell + plugins).\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { getSupabaseClientOptional as _getOpt } from '@fayz-ai/core'\nexport { createSupabaseProvider, setGlobalSupabaseClient } from '@fayz-ai/core'\n// @fayz-ai/core returns a loosely-typed client (no hard supabase coupling); the\n// shell does `.schema(...).from(...)`, so surface it as the real client type.\nexport const getSupabaseClientOptional = (): SupabaseClient | null =>\n _getOpt() as unknown as SupabaseClient | null\nexport {\n CORE_SCHEMA,\n getCoreSchemaClient as getCoreClient,\n getFayzSupabaseClient as getSupabaseClient,\n getFayzSupabaseClientOptional as getSupabaseClientSafe,\n createFayzSupabaseClient as createSupabaseClient,\n} from '../../supabase/client'\nimport { getFayzSupabaseClient } from '../../supabase/client'\nexport const getCoreSupabaseClient = getFayzSupabaseClient\nexport const getProjectSupabaseClient = getFayzSupabaseClient\nexport type { SupabaseClient }\n","import { UserProfile } from './UserProfile'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { getSupabaseClient } from '../../lib/supabase'\nimport { toast } from '../notifications/ToastProvider'\n\nexport function ConnectedUserProfile() {\n const user = useAuthStore((s) => s.user)\n const setUser = useAuthStore((s) => s.setUser)\n const handleSave = async (data: { fullName: string }) => {\n try {\n const supabase = getSupabaseClient()\n\n if (data.fullName !== user?.fullName) {\n const { error: metaError } = await supabase.auth.updateUser({\n data: { full_name: data.fullName },\n })\n if (metaError) throw metaError\n\n const { error: profileError } = await supabase\n .from('profiles')\n .update({ full_name: data.fullName })\n .eq('id', user!.id)\n if (profileError) throw profileError\n\n setUser(user ? { ...user, fullName: data.fullName } : null)\n }\n\n toast.success('Profile updated')\n } catch (err: any) {\n toast.error('Failed to update', { description: err?.message })\n }\n }\n\n const handleAvatarChange = async (file: File) => {\n try {\n const supabase = getSupabaseClient()\n const ext = file.name.split('.').pop()\n const path = `avatars/${user!.id}.${ext}`\n\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, file, { upsert: true })\n if (uploadError) throw uploadError\n\n const { data: urlData } = supabase.storage.from('avatars').getPublicUrl(path)\n const avatarUrl = urlData.publicUrl\n\n await supabase.auth.updateUser({ data: { avatar_url: avatarUrl } })\n await supabase.from('profiles').update({ avatar_url: avatarUrl }).eq('id', user!.id)\n\n setUser(user ? { ...user, avatarUrl } : null)\n toast.success('Avatar updated')\n } catch (err: any) {\n toast.error('Failed to upload avatar', { description: err?.message })\n }\n }\n\n return <UserProfile user={user as any} onSave={handleSave} onAvatarChange={handleAvatarChange} />\n}\n","import * as React from 'react'\nimport { KeyRound, Loader2, Clock, ShieldCheck, UserPlus } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types'\n\nexport interface TenantSecuritySettings {\n sessionTimeoutMinutes?: number\n require2FA?: boolean\n inviteOnly?: boolean\n}\n\ninterface SecuritySettingsProps {\n user?: AuthUser | null\n tenantSecurity?: TenantSecuritySettings\n isAdmin?: boolean\n onResetPassword?: () => Promise<void>\n onTenantSecurityChange?: (settings: TenantSecuritySettings) => Promise<void>\n}\n\nconst SESSION_TIMEOUT_OPTIONS = [\n { label: '30 minutes', value: 30 },\n { label: '1 hour', value: 60 },\n { label: '4 hours', value: 240 },\n { label: '8 hours', value: 480 },\n { label: '24 hours', value: 1440 },\n { label: 'No limit', value: 0 },\n]\n\nfunction ToggleRow({\n icon,\n label,\n description,\n checked,\n onChange,\n disabled,\n}: {\n icon: React.ReactNode\n label: string\n description: string\n checked: boolean\n onChange: (val: boolean) => void\n disabled?: boolean\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"flex gap-3\">\n <div className=\"mt-0.5 text-muted-foreground\">{icon}</div>\n <div>\n <p className=\"text-sm font-medium\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n </div>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={`relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n checked ? 'bg-primary' : 'bg-muted-foreground/30'\n }`}\n >\n <span\n className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${\n checked ? 'translate-x-[18px]' : 'translate-x-[2px]'\n }`}\n />\n </button>\n </div>\n )\n}\n\nexport function SecuritySettings({\n user,\n tenantSecurity,\n isAdmin,\n onResetPassword,\n onTenantSecurityChange,\n}: SecuritySettingsProps) {\n const { t } = useTranslation()\n const [resetting, setResetting] = React.useState(false)\n const [resetSent, setResetSent] = React.useState(false)\n const [savingTenant, setSavingTenant] = React.useState(false)\n\n const handleResetPassword = async () => {\n if (!onResetPassword) return\n setResetting(true)\n try {\n await onResetPassword()\n setResetSent(true)\n } catch {\n // handled via toast in connected wrapper\n } finally {\n setResetting(false)\n }\n }\n\n const updateTenantSecurity = async (partial: Partial<TenantSecuritySettings>) => {\n if (!onTenantSecurityChange) return\n setSavingTenant(true)\n try {\n await onTenantSecurityChange({ ...tenantSecurity, ...partial })\n } catch {\n // handled via toast\n } finally {\n setSavingTenant(false)\n }\n }\n\n const baseClass =\n 'flex h-10 w-full rounded-input border border-input bg-background px-3 py-2 text-sm shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n\n return (\n <div className=\"space-y-6\">\n {/* Password reset */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.security.passwordTitle')}</CardTitle>\n <CardDescription>\n {t('settings.security.passwordSubtitle')}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">{user?.email}</p>\n <p className=\"text-xs text-muted-foreground\">\n {resetSent\n ? t('settings.security.resetLinkSent')\n : t('settings.security.resetLinkDescription')}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={resetting || resetSent}\n onClick={handleResetPassword}\n >\n {resetting && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n <KeyRound className=\"mr-2 h-4 w-4\" />\n {resetSent ? t('settings.security.linkSent') : t('settings.security.resetPassword')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Tenant security — only visible to admins */}\n {isAdmin && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.security.orgSecurityTitle')}</CardTitle>\n <CardDescription>\n {t('settings.security.orgSecuritySubtitle')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-1 divide-y\">\n <ToggleRow\n icon={<ShieldCheck className=\"h-4 w-4\" />}\n label={t('settings.security.require2FA')}\n description={t('settings.security.require2FADescription')}\n checked={tenantSecurity?.require2FA ?? false}\n onChange={(val) => updateTenantSecurity({ require2FA: val })}\n disabled={savingTenant}\n />\n <ToggleRow\n icon={<UserPlus className=\"h-4 w-4\" />}\n label={t('settings.security.inviteOnly')}\n description={t('settings.security.inviteOnlyDescription')}\n checked={tenantSecurity?.inviteOnly ?? true}\n onChange={(val) => updateTenantSecurity({ inviteOnly: val })}\n disabled={savingTenant}\n />\n\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"flex gap-3\">\n <div className=\"mt-0.5 text-muted-foreground\">\n <Clock className=\"h-4 w-4\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{t('settings.security.sessionTimeout')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.security.sessionTimeoutDescription')}\n </p>\n </div>\n </div>\n <select\n value={tenantSecurity?.sessionTimeoutMinutes ?? 0}\n onChange={(e) =>\n updateTenantSecurity({ sessionTimeoutMinutes: Number(e.target.value) })\n }\n disabled={savingTenant}\n className={`${baseClass} w-36`}\n >\n {SESSION_TIMEOUT_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type { AuthAdapter } from '../types/auth-adapter'\n\nconst AuthAdapterContext = createContext<AuthAdapter | null>(null)\n\nexport const AuthAdapterProvider = AuthAdapterContext.Provider\n\nexport function useAuthAdapter(): AuthAdapter {\n const adapter = useContext(AuthAdapterContext)\n if (!adapter) {\n throw new Error('useAuthAdapter must be used within an AuthAdapterProvider')\n }\n return adapter\n}\n\nexport function useAuthAdapterOptional(): AuthAdapter | null {\n return useContext(AuthAdapterContext)\n}\n","import { SecuritySettings } from './SecuritySettings'\nimport type { TenantSecuritySettings } from './SecuritySettings'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useAuthAdapterOptional } from '../../lib/auth-context'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { toast } from '../notifications/ToastProvider'\n\nexport function ConnectedSecuritySettings() {\n const user = useAuthStore((s) => s.user)\n const authAdapter = useAuthAdapterOptional()\n const orgAdapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n\n const settings = (currentOrg?.settings ?? {}) as Record<string, unknown>\n const tenantSecurity = (settings.security ?? {}) as TenantSecuritySettings\n\n // Determine if current user is admin (owner/admin role)\n const members = useOrganizationStore((s) => s.members)\n const currentMember = members.find((m) => m.userId === user?.id)\n const isAdmin = currentMember?.profileName?.toLowerCase() === 'owner' ||\n currentMember?.profileName?.toLowerCase() === 'admin'\n\n const handleResetPassword = async () => {\n if (!authAdapter || !user?.email) return\n try {\n await authAdapter.resetPassword(user.email)\n toast.success('Password reset link sent', { description: `Check ${user.email} for the reset link.` })\n } catch (err: any) {\n toast.error('Failed to send reset link', { description: err?.message })\n throw err\n }\n }\n\n const handleTenantSecurityChange = async (security: TenantSecuritySettings) => {\n if (!orgAdapter || !currentOrg) return\n try {\n const updated = await orgAdapter.updateOrg(currentOrg.id, {\n settings: { ...settings, security },\n })\n setCurrentOrg(updated)\n toast.success('Security settings updated')\n } catch (err: any) {\n toast.error('Failed to update security settings', { description: err?.message })\n throw err\n }\n }\n\n return (\n <SecuritySettings\n user={user as any}\n tenantSecurity={tenantSecurity}\n isAdmin={isAdmin}\n onResetPassword={handleResetPassword}\n onTenantSecurityChange={orgAdapter ? handleTenantSecurityChange : undefined}\n />\n )\n}\n","import * as React from 'react'\nimport { Upload, Save, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { TenantSettings } from '../../types'\n\ninterface BrandingSettingsProps {\n branding?: TenantSettings['branding'] | null\n onSave?: (branding: TenantSettings['branding'], assets?: {\n logoFile?: File | null\n faviconFile?: File | null\n }) => void\n}\n\ninterface FileUploadProps {\n label: string\n accept: string\n currentUrl?: string\n onFileSelect: (file: File) => void\n onClear?: () => void\n hint?: string\n}\n\nfunction FileUploadField({\n label,\n accept,\n currentUrl,\n onFileSelect,\n onClear,\n hint,\n}: FileUploadProps) {\n const { t } = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [preview, setPreview] = React.useState<string | null>(null)\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n onFileSelect(file)\n const url = URL.createObjectURL(file)\n setPreview(url)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const displayUrl = preview ?? currentUrl\n\n return (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{label}</label>\n <div className=\"flex items-center gap-4\">\n {displayUrl ? (\n <div className=\"relative\">\n <img\n src={displayUrl}\n alt={label}\n className=\"h-16 w-16 rounded-md border object-contain p-1\"\n />\n {onClear && (\n <button\n type=\"button\"\n onClick={() => {\n onClear()\n setPreview(null)\n }}\n className=\"absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full bg-destructive text-destructive-foreground\"\n aria-label={`Remove ${label.toLowerCase()}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex h-16 w-16 items-center justify-center rounded-md border border-dashed\">\n <Upload className=\"h-5 w-5 text-muted-foreground/50\" />\n </div>\n )}\n\n <div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => inputRef.current?.click()}\n >\n {t('settings.branding.chooseFile')}\n </Button>\n {hint && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{hint}</p>\n )}\n </div>\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={handleChange}\n />\n </div>\n )\n}\n\nexport function BrandingSettings({ branding, onSave }: BrandingSettingsProps) {\n const { t } = useTranslation()\n const [primaryColor, setPrimaryColor] = React.useState(branding?.primaryColor ?? '#000000')\n const [accentColor, setAccentColor] = React.useState(branding?.accentColor ?? '#6366f1')\n const [logoFile, setLogoFile] = React.useState<File | null>(null)\n const [faviconFile, setFaviconFile] = React.useState<File | null>(null)\n const [logoUrl, setLogoUrl] = React.useState(branding?.logoUrl ?? '')\n const [faviconUrl, setFaviconUrl] = React.useState(branding?.faviconUrl ?? '')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (branding) {\n setPrimaryColor(branding.primaryColor ?? '#000000')\n setAccentColor(branding.accentColor ?? '#6366f1')\n setLogoUrl(branding.logoUrl ?? '')\n setFaviconUrl(branding.faviconUrl ?? '')\n }\n }, [branding])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({\n primaryColor,\n accentColor,\n logoUrl,\n faviconUrl,\n }, {\n logoFile,\n faviconFile,\n })\n setLogoFile(null)\n setFaviconFile(null)\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.branding.title')}</CardTitle>\n <CardDescription>\n {t('settings.branding.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n <div className=\"grid gap-6 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label htmlFor=\"primary-color\" className=\"text-sm font-medium\">\n {t('settings.branding.primaryColor')}\n </label>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n id=\"primary-color\"\n value={primaryColor}\n onChange={(e) => setPrimaryColor(e.target.value)}\n className=\"h-10 w-10 cursor-pointer rounded-md border bg-transparent p-0.5\"\n />\n <Input\n value={primaryColor}\n onChange={(e) => setPrimaryColor(e.target.value)}\n placeholder=\"#000000\"\n className=\"flex-1\"\n maxLength={7}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"accent-color\" className=\"text-sm font-medium\">\n {t('settings.branding.accentColor')}\n </label>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n id=\"accent-color\"\n value={accentColor}\n onChange={(e) => setAccentColor(e.target.value)}\n className=\"h-10 w-10 cursor-pointer rounded-md border bg-transparent p-0.5\"\n />\n <Input\n value={accentColor}\n onChange={(e) => setAccentColor(e.target.value)}\n placeholder=\"#6366f1\"\n className=\"flex-1\"\n maxLength={7}\n />\n </div>\n </div>\n </div>\n\n <div className=\"rounded-md border p-4\">\n <p className=\"mb-3 text-sm font-medium\">{t('settings.branding.preview')}</p>\n <div className=\"flex items-center gap-3\">\n <div\n className=\"h-10 w-24 rounded-md\"\n style={{ backgroundColor: primaryColor }}\n />\n <div\n className=\"h-10 w-24 rounded-md\"\n style={{ backgroundColor: accentColor }}\n />\n </div>\n </div>\n\n <FileUploadField\n label=\"Logo\"\n accept=\"image/png,image/jpeg,image/svg+xml,image/webp\"\n currentUrl={logoUrl || undefined}\n onFileSelect={setLogoFile}\n onClear={() => {\n setLogoUrl('')\n setLogoFile(null)\n }}\n hint=\"Recommended: 200x50px, PNG or SVG\"\n />\n\n <FileUploadField\n label=\"Favicon\"\n accept=\"image/png,image/x-icon,image/svg+xml\"\n currentUrl={faviconUrl || undefined}\n onFileSelect={setFaviconFile}\n onClear={() => {\n setFaviconUrl('')\n setFaviconFile(null)\n }}\n hint=\"Recommended: 32x32px, PNG or ICO\"\n />\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.branding.saveBranding')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n )\n}\n","import { BrandingSettings } from './BrandingSettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { toast } from '../notifications/ToastProvider'\nimport { getSupabaseClient } from '../../lib/supabase'\nimport type { TenantSettings } from '../../types'\n\nexport function ConnectedBrandingSettings() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n\n const handleSave = async (\n branding: TenantSettings['branding'],\n assets?: { logoFile?: File | null; faviconFile?: File | null },\n ) => {\n if (!currentOrg) return\n\n try {\n const supabase = getSupabaseClient()\n let nextBranding = { ...branding }\n\n if (assets?.logoFile) {\n const ext = assets.logoFile.name.split('.').pop() ?? 'png'\n const path = `branding/${currentOrg.id}/logo.${ext}`\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, assets.logoFile, { upsert: true })\n if (uploadError) throw uploadError\n const { data } = supabase.storage.from('avatars').getPublicUrl(path)\n nextBranding.logoUrl = data.publicUrl\n }\n\n if (assets?.faviconFile) {\n const ext = assets.faviconFile.name.split('.').pop() ?? 'png'\n const path = `branding/${currentOrg.id}/favicon.${ext}`\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, assets.faviconFile, { upsert: true })\n if (uploadError) throw uploadError\n const { data } = supabase.storage.from('avatars').getPublicUrl(path)\n nextBranding.faviconUrl = data.publicUrl\n }\n\n const currentSettings = (currentOrg.settings ?? {}) as Record<string, unknown>\n const settings = {\n ...currentSettings,\n branding: nextBranding,\n }\n\n const { data: updatedTenant, error: updateError } = await supabase\n .from('tenants')\n .update({\n settings,\n logo_url: nextBranding.logoUrl ?? currentOrg.logoUrl ?? null,\n })\n .eq('id', currentOrg.id)\n .select()\n .single()\n\n if (updateError) throw updateError\n\n setCurrentOrg({\n ...currentOrg,\n logoUrl: updatedTenant.logo_url ?? undefined,\n settings: updatedTenant.settings ?? settings,\n updatedAt: updatedTenant.updated_at ?? currentOrg.updatedAt,\n })\n\n toast.success('Branding saved')\n } catch (err: any) {\n toast.error('Failed to save branding', { description: err?.message })\n }\n }\n\n const currentSettings = (currentOrg?.settings ?? {}) as Partial<TenantSettings>\n\n return (\n <BrandingSettings\n branding={currentSettings.branding}\n onSave={handleSave}\n />\n )\n}\n","import * as React from 'react'\nimport { Building2, User, Shield, Palette, ArrowLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ConnectedCompanySettings } from './ConnectedCompanySettings'\nimport { ConnectedUserProfile } from './ConnectedUserProfile'\nimport { ConnectedSecuritySettings } from './ConnectedSecuritySettings'\nimport { ConnectedBrandingSettings } from './ConnectedBrandingSettings'\n\ninterface SettingsTab {\n id: string\n label: string\n icon?: React.ReactNode\n component: React.ReactNode\n}\n\ninterface SettingsPageProps {\n tabs?: SettingsTab[]\n extraTabs?: SettingsTab[]\n defaultTab?: string\n className?: string\n beforeContent?: React.ReactNode\n afterContent?: React.ReactNode\n}\n\nexport function SettingsPage({\n tabs,\n extraTabs,\n defaultTab,\n className,\n beforeContent,\n afterContent,\n}: SettingsPageProps) {\n const { t } = useTranslation()\n\n const defaultTabs: SettingsTab[] = React.useMemo(() => [\n { id: 'general', label: t('settings.general'), icon: <Building2 className=\"h-4 w-4\" />, component: <ConnectedCompanySettings /> },\n { id: 'profile', label: t('settings.profile'), icon: <User className=\"h-4 w-4\" />, component: <ConnectedUserProfile /> },\n { id: 'security', label: t('settings.security'), icon: <Shield className=\"h-4 w-4\" />, component: <ConnectedSecuritySettings /> },\n { id: 'branding', label: t('settings.branding'), icon: <Palette className=\"h-4 w-4\" />, component: <ConnectedBrandingSettings /> },\n ], [t])\n\n const baseTabs = tabs ?? defaultTabs\n const resolvedTabs = extraTabs ? [...baseTabs, ...extraTabs] : baseTabs\n\n // Detect active tab from URL: /settings/financial/... → 'financial'\n function getTabFromHash(): string | null {\n const hash = typeof window !== 'undefined' ? window.location.hash.slice(1) || '/' : '/'\n if (hash.startsWith('/settings/')) {\n const tabId = hash.slice('/settings/'.length).split('/')[0]\n if (resolvedTabs.find((t) => t.id === tabId)) return tabId\n }\n return null\n }\n\n const [activeTab, setActiveTab] = React.useState<string | null>(() => {\n return getTabFromHash() ?? defaultTab ?? null\n })\n\n // Sync tab from hash changes\n React.useEffect(() => {\n const handler = () => {\n const tab = getTabFromHash()\n if (tab) setActiveTab(tab)\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [resolvedTabs])\n\n // Desktop always shows a selected tab; when none is chosen yet (landing on\n // /settings), default to the first tab — 'general'. Mobile keeps its\n // list-first master/detail behaviour (driven by the raw activeTab below).\n const desktopTab = activeTab ?? resolvedTabs[0]?.id ?? null\n const activeContent = desktopTab ? resolvedTabs.find((t) => t.id === desktopTab)?.component : null\n const activeLabel = activeTab ? resolvedTabs.find((t) => t.id === activeTab)?.label : null\n\n // On mobile: show list OR content. On desktop: show both.\n const showingContent = activeTab !== null\n\n const handleSelectTab = (tabId: string) => {\n setActiveTab(tabId)\n window.location.hash = `/settings/${tabId}`\n }\n\n const handleBack = () => {\n setActiveTab(null)\n window.location.hash = '/settings'\n }\n\n const renderNav = (activeId: string | null) => (\n <ul className=\"space-y-0.5\">\n {resolvedTabs.map((tab, i) => (\n <React.Fragment key={tab.id}>\n {(tab as any).isPlugin && (i === 0 || !(resolvedTabs[i - 1] as any)?.isPlugin) && (\n <li className=\"py-2\">\n <div className=\"border-t\" />\n <p className=\"px-3 pt-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">{t('common.plugins')}</p>\n </li>\n )}\n <li>\n <button\n onClick={() => handleSelectTab(tab.id)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors',\n activeId === tab.id\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted/50 hover:text-foreground'\n )}\n >\n {tab.icon && <span className=\"shrink-0\">{tab.icon}</span>}\n <span className=\"flex-1 text-left\">{tab.label}</span>\n {/* Mobile: show chevron */}\n <ChevronRight className=\"h-4 w-4 text-muted-foreground/50 md:hidden\" />\n </button>\n </li>\n </React.Fragment>\n ))}\n </ul>\n )\n\n return (\n <div className={cn('space-y-6', className)}>\n {/* Mobile: back button + tab title when viewing content */}\n {showingContent && (\n <button\n onClick={handleBack}\n className=\"flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors md:hidden\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {t('settings.title')}\n </button>\n )}\n\n {/* Header — hidden on mobile when viewing content */}\n <div className={cn(showingContent && 'hidden md:block')}>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('settings.title')}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('settings.subtitle')}\n </p>\n </div>\n\n {beforeContent}\n\n {/* Desktop: side-by-side layout */}\n <div className=\"hidden md:flex md:gap-6\">\n <nav className=\"w-52 shrink-0\">{renderNav(desktopTab)}</nav>\n <div className=\"min-w-0 flex-1\">{activeContent ?? resolvedTabs[0]?.component}</div>\n </div>\n\n {/* Mobile: list or content, not both */}\n <div className=\"md:hidden\">\n {showingContent ? (\n <div>{activeContent}</div>\n ) : (\n <nav>{renderNav(activeTab)}</nav>\n )}\n </div>\n\n {afterContent}\n </div>\n )\n}\n","import { create } from 'zustand'\nimport type { Invite } from '../types/invite'\n\ninterface InviteStore {\n invites: Invite[]\n loading: boolean\n setInvites: (invites: Invite[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useInviteStore = create<InviteStore>((set) => ({\n invites: [],\n loading: false,\n setInvites: (invites) => set({ invites }),\n setLoading: (loading) => set({ loading }),\n reset: () => set({ invites: [], loading: false }),\n}))\n","import * as React from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { toast } from '../notifications/ToastProvider'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useInviteStore } from '../../stores/invite.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface InviteMemberDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Pre-fill the first email (e.g. from person detail Access tab) */\n defaultEmail?: string\n}\n\nexport function InviteMemberDialog({ open, onOpenChange, defaultEmail }: InviteMemberDialogProps) {\n const { t } = useTranslation()\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const setInvites = useInviteStore((s) => s.setInvites)\n const user = useAuthStore((s) => s.user)\n\n const [emails, setEmails] = React.useState<string[]>([defaultEmail ?? ''])\n const [profileId, setProfileId] = React.useState(profiles[1]?.id ?? profiles[0]?.id ?? '')\n const [sending, setSending] = React.useState(false)\n const [sent, setSent] = React.useState(false)\n\n const addEmail = () => setEmails((prev) => [...prev, ''])\n\n const updateEmail = (idx: number, value: string) => {\n setEmails((prev) => {\n const next = [...prev]\n next[idx] = value\n return next\n })\n }\n\n const removeEmail = (idx: number) => {\n setEmails((prev) => prev.filter((_, i) => i !== idx))\n }\n\n const handleSend = async () => {\n if (!adapter || !currentOrg || !user) return\n const validEmails = emails.filter((e) => e.trim() && e.includes('@'))\n if (validEmails.length === 0) return\n\n setSending(true)\n try {\n if (validEmails.length === 1) {\n await adapter.createInvite(currentOrg.id, validEmails[0].trim(), profileId, user.id)\n } else {\n await adapter.bulkInvite(currentOrg.id, validEmails.map((e) => e.trim()), profileId, user.id)\n }\n const invites = await adapter.listInvites(currentOrg.id)\n setInvites(invites)\n setSent(true)\n } catch (err: any) {\n toast.error('Failed to send invites', { description: err?.message })\n } finally {\n setSending(false)\n }\n }\n\n const handleClose = () => {\n onOpenChange(false)\n // Reset after animation\n setTimeout(() => {\n setEmails([''])\n setProfileId(profiles[1]?.id ?? profiles[0]?.id ?? '')\n setSent(false)\n }, 200)\n }\n\n return (\n <Modal open={open} onOpenChange={handleClose}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('organization.invite.title')}</ModalTitle>\n <ModalDescription>{t('organization.invite.description')}</ModalDescription>\n </ModalHeader>\n\n {sent ? (\n <div className=\"py-8 text-center\">\n <div className=\"mx-auto mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-success/10\">\n <svg className=\"h-6 w-6 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n </div>\n <p className=\"text-sm font-medium\">{t('organization.invite.sent')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('organization.invite.sentDescription')}</p>\n </div>\n ) : (\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('organization.invite.emailLabel')}</label>\n {emails.map((email, idx) => (\n <div key={idx} className=\"flex items-center gap-2\">\n <Input\n type=\"email\"\n placeholder=\"team@example.com\"\n value={email}\n onChange={(e) => updateEmail(idx, e.target.value)}\n />\n {emails.length > 1 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeEmail(idx)}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={addEmail} className=\"text-xs\">\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n {t('organization.invite.addAnother')}\n </Button>\n </div>\n\n <div>\n <label className=\"text-sm font-medium\">{t('organization.invite.roleLabel')}</label>\n <Select value={profileId} onValueChange={setProfileId}>\n <SelectTrigger className=\"mt-1\">\n <SelectValue placeholder={t('organization.invite.rolePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )}\n\n <ModalFooter>\n {sent ? (\n <Button onClick={handleClose}>{t('common.done')}</Button>\n ) : (\n <>\n <Button variant=\"outline\" onClick={handleClose}>{t('common.cancel')}</Button>\n <Button onClick={handleSend} disabled={sending || emails.every((e) => !e.trim())}>\n {sending ? t('organization.invite.sending') : t('organization.invite.sendInvites')}\n </Button>\n </>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import { create } from 'zustand'\nimport type { Tenant, TenantMember, MemberRole, TenantState } from '../types'\n\ninterface TenantStore extends TenantState {\n setTenant: (tenant: Tenant | null) => void\n setMembers: (members: TenantMember[]) => void\n setCurrentRole: (role: MemberRole | null) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nconst initialState: TenantState = {\n tenant: null,\n members: [],\n currentRole: null,\n loading: false,\n}\n\nexport const useTenantStore = create<TenantStore>((set) => ({\n ...initialState,\n setTenant: (tenant) => set({ tenant }),\n setMembers: (members) => set({ members }),\n setCurrentRole: (role) => set({ currentRole: role }),\n setLoading: (loading) => set({ loading }),\n reset: () => set(initialState),\n}))\n","import { useCallback, useMemo } from 'react'\nimport { useTenantStore } from '../stores/tenant.store'\nimport { usePermissionsStore } from '../stores/permissions.store'\nimport type { MemberRole } from '../types'\nimport type { PermissionAction, SystemPermission } from '../types/permissions'\n\n// Legacy role-based permissions (backward compat)\nconst PERMISSIONS = [\n 'manage_billing',\n 'manage_members',\n 'manage_settings',\n 'manage_content',\n 'view_content',\n 'view_analytics',\n] as const\n\nexport type Permission = (typeof PERMISSIONS)[number]\n\nconst ROLE_PERMISSIONS: Record<MemberRole, Permission[]> = {\n owner: [...PERMISSIONS],\n admin: PERMISSIONS.filter((p) => p !== 'manage_billing'),\n manager: ['manage_content', 'view_content', 'view_analytics'],\n staff: ['view_content'],\n viewer: ['view_content'],\n}\n\nconst ROLE_HIERARCHY: Record<MemberRole, number> = {\n owner: 5,\n admin: 4,\n manager: 3,\n staff: 2,\n viewer: 1,\n}\n\nexport function usePermission() {\n const currentRole = useTenantStore((s) => s.currentRole)\n const currentProfile = usePermissionsStore((s) => s.currentProfile)\n\n // Profile-based permission check (feature × action matrix)\n const can = useCallback(\n (featureId: string, action: PermissionAction): boolean => {\n if (!currentProfile) return true // no permissions configured = allow all\n // Owner bypasses all feature checks\n if (currentProfile.id === 'owner') return true\n return currentProfile.grants[featureId]?.includes(action) ?? false\n },\n [currentProfile],\n )\n\n const hasSystemPermission = useCallback(\n (perm: SystemPermission): boolean => {\n if (!currentProfile) return true\n return (currentProfile.systemPermissions ?? []).includes(perm)\n },\n [currentProfile],\n )\n\n // Legacy role-based permissions\n const permissions = useMemo<Permission[]>(() => {\n if (!currentRole) return []\n return ROLE_PERMISSIONS[currentRole]\n }, [currentRole])\n\n const hasPermission = useCallback(\n (permission: Permission | string): boolean => {\n // First try profile-based system permissions\n if (currentProfile) {\n return (currentProfile.systemPermissions ?? []).includes(permission as SystemPermission)\n }\n // Fall back to legacy role-based\n return permissions.includes(permission as Permission)\n },\n [currentProfile, permissions],\n )\n\n const requireRole = useCallback(\n (role: MemberRole): boolean => {\n if (!currentRole) return false\n return ROLE_HIERARCHY[currentRole] >= ROLE_HIERARCHY[role]\n },\n [currentRole],\n )\n\n const canAccess = useCallback(\n (requiredPermissions: Permission[]): boolean => {\n return requiredPermissions.every((p) => permissions.includes(p))\n },\n [permissions],\n )\n\n return {\n currentRole,\n currentProfile,\n permissions,\n can,\n hasSystemPermission,\n hasPermission,\n requireRole,\n canAccess,\n }\n}\n","/**\n * Request deduplication — prevents duplicate in-flight requests with the same key.\n * If a request with the same key is already in-flight, returns the existing promise.\n */\nconst inflight = new Map<string, Promise<any>>()\n\nexport function dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflight.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflight.delete(key)\n })\n\n inflight.set(key, promise)\n return promise\n}\n","import * as React from 'react'\nimport { UserPlus, MoreHorizontal, Mail, Clock } from 'lucide-react'\nimport { Card } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n} from '@fayz-ai/ui'\nimport { InviteMemberDialog } from './InviteMemberDialog'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useInviteStore } from '../../stores/invite.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { usePermission } from '../../hooks/usePermission'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { dedup } from '../../lib/dedup'\n\nexport function TeamTab() {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const profiles = usePermissionsStore((s) => s.profiles)\n const invites = useInviteStore((s) => s.invites)\n const setInvites = useInviteStore((s) => s.setInvites)\n const user = useAuthStore((s) => s.user)\n const { hasSystemPermission } = usePermission()\n\n const [inviteOpen, setInviteOpen] = React.useState(false)\n\n // Load invites on mount (deduped to avoid strict mode double-fetch)\n React.useEffect(() => {\n if (adapter && currentOrg) {\n dedup('team:invites:' + currentOrg.id, () => adapter.listInvites(currentOrg.id)).then(setInvites).catch(() => {})\n }\n }, [adapter, currentOrg?.id])\n\n const handleChangeProfile = async (memberId: string, profileId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.updateMemberProfile(currentOrg.id, memberId, profileId)\n const updated = await adapter.listMembers(currentOrg.id)\n setMembers(updated)\n } catch {\n // ignore\n }\n }\n\n const handleRemoveMember = async (memberId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.removeMember(currentOrg.id, memberId)\n const updated = await adapter.listMembers(currentOrg.id)\n setMembers(updated)\n } catch {\n // ignore\n }\n }\n\n const handleRevokeInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.revokeInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n } catch {\n // ignore\n }\n }\n\n const handleResendInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.resendInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n } catch {\n // ignore\n }\n }\n\n const { t } = useTranslation()\n const canManageTeam = hasSystemPermission('manage_team')\n const pendingInvites = invites.filter((i) => i.status === 'pending')\n\n return (\n <div className=\"space-y-6\">\n {/* Members */}\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <h3 className=\"text-lg font-semibold\">{t('organization.team.title')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('organization.team.memberCount', { count: String(members.length), plural: members.length !== 1 ? 's' : '' })}</p>\n </div>\n {canManageTeam && (\n <Button size=\"sm\" onClick={() => setInviteOpen(true)}>\n <UserPlus className=\"h-4 w-4 mr-1\" />\n {t('organization.team.invite')}\n </Button>\n )}\n </div>\n\n <Card className=\"overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('organization.team.member')}</th>\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('organization.team.role')}</th>\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('organization.team.joined')}</th>\n {canManageTeam && (\n <th className=\"text-right p-3 text-sm font-medium text-muted-foreground w-12\" />\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {members.map((member) => {\n const initials = member.user.fullName\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n const isCurrentUser = member.userId === user?.id\n\n return (\n <tr key={member.id} className=\"hover:bg-muted/30\">\n <td className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-8 w-8\">\n {member.user.avatarUrl && <AvatarImage src={member.user.avatarUrl} />}\n <AvatarFallback className=\"text-xs\">{initials}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"text-sm font-medium\">\n {member.user.fullName}\n {isCurrentUser && <span className=\"text-muted-foreground ml-1\">{t('organization.team.you')}</span>}\n </p>\n <p className=\"text-xs text-muted-foreground\">{member.user.email}</p>\n </div>\n </div>\n </td>\n <td className=\"p-3\">\n {canManageTeam && !isCurrentUser ? (\n <Select\n value={member.profileId}\n onValueChange={(val) => handleChangeProfile(member.id, val)}\n >\n <SelectTrigger className=\"h-8 w-36 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Badge variant=\"secondary\" className=\"text-xs\">{member.profileName}</Badge>\n )}\n </td>\n <td className=\"p-3 text-sm text-muted-foreground\">\n {new Date(member.joinedAt).toLocaleDateString()}\n </td>\n {canManageTeam && (\n <td className=\"p-3 text-right\">\n {!isCurrentUser && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem\n className=\"text-destructive\"\n onClick={() => handleRemoveMember(member.id)}\n >\n {t('organization.team.removeMember')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )}\n </td>\n )}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n </Card>\n </div>\n\n {/* Pending Invites */}\n {pendingInvites.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold mb-3\">{t('organization.team.pendingInvites')}</h3>\n <div className=\"space-y-2\">\n {pendingInvites.map((invite) => (\n <Card key={invite.id} className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-muted\">\n <Mail className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium\">{invite.email}</p>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Badge variant=\"secondary\" className=\"text-xs\">{invite.profileName}</Badge>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n Sent {new Date(invite.createdAt).toLocaleDateString()}\n </span>\n </div>\n </div>\n {canManageTeam && (\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => handleResendInvite(invite.id)}>\n {t('organization.team.resend')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs text-destructive\" onClick={() => handleRevokeInvite(invite.id)}>\n {t('organization.team.revoke')}\n </Button>\n </div>\n )}\n </div>\n </Card>\n ))}\n </div>\n </div>\n )}\n\n <InviteMemberDialog open={inviteOpen} onOpenChange={setInviteOpen} />\n </div>\n )\n}\n","import * as React from 'react'\nimport { Card } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Checkbox, type CheckboxColor } from '@fayz-ai/ui'\nimport { ChevronDown, ChevronRight, Search } from 'lucide-react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { FeatureDeclaration, PermissionAction, PermissionProfile, SystemPermission } from '../../types/permissions'\n\nconst ACTIONS: PermissionAction[] = ['read', 'create', 'edit', 'delete']\nconst ACTION_COLORS: Partial<Record<PermissionAction, CheckboxColor>> = {\n read: 'primary',\n create: 'success',\n edit: 'warning',\n delete: 'destructive',\n}\nconst SYSTEM_PERMISSIONS: { id: SystemPermission; key: string }[] = [\n { id: 'manage_team', key: 'organization.permissions.manageTeam' },\n { id: 'manage_billing', key: 'organization.permissions.manageBilling' },\n { id: 'manage_settings', key: 'organization.permissions.manageSettings' },\n { id: 'manage_permissions', key: 'organization.permissions.managePermissions' },\n]\n\ninterface PermissionMatrixEditorProps {\n features: FeatureDeclaration[]\n profile?: PermissionProfile\n onSave: (data: { name: string; description?: string; systemPermissions: SystemPermission[]; grants: Record<string, PermissionAction[]> }) => void\n onCancel: () => void\n saving?: boolean\n}\n\nexport function PermissionMatrixEditor({ features, profile, onSave, onCancel, saving }: PermissionMatrixEditorProps) {\n const { t } = useTranslation()\n const [name, setName] = React.useState(profile?.name ?? '')\n const [description, setDescription] = React.useState(profile?.description ?? '')\n const [systemPerms, setSystemPerms] = React.useState<SystemPermission[]>(profile?.systemPermissions ?? [])\n const [grants, setGrants] = React.useState<Record<string, PermissionAction[]>>(profile?.grants ?? {})\n const [collapsed, setCollapsed] = React.useState<Set<string>>(new Set())\n const [search, setSearch] = React.useState('')\n\n const toggleSystemPerm = (perm: SystemPermission) => {\n setSystemPerms((prev) =>\n prev.includes(perm) ? prev.filter((p) => p !== perm) : [...prev, perm]\n )\n }\n\n const toggleGrant = (featureId: string, action: PermissionAction) => {\n setGrants((prev) => {\n const current = prev[featureId] ?? []\n const next = current.includes(action)\n ? current.filter((a) => a !== action)\n : [...current, action]\n return { ...prev, [featureId]: next }\n })\n }\n\n const toggleGroup = (group: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev)\n next.has(group) ? next.delete(group) : next.add(group)\n return next\n })\n }\n\n const handleSave = () => {\n if (!name.trim()) return\n onSave({ name: name.trim(), description: description.trim() || undefined, systemPermissions: systemPerms, grants })\n }\n\n // Group features, filtering by search\n const groups = React.useMemo(() => {\n const filtered = search\n ? features.filter((f) => f.label.toLowerCase().includes(search.toLowerCase()))\n : features\n const map = new Map<string, FeatureDeclaration[]>()\n for (const f of filtered) {\n const group = f.group ?? 'General'\n if (!map.has(group)) map.set(group, [])\n map.get(group)!.push(f)\n }\n return map\n }, [features, search])\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"text-sm font-medium\">{t('organization.permissions.profileName')}</label>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={t('organization.permissions.profileNamePlaceholder')} className=\"mt-1\" />\n </div>\n <div>\n <label className=\"text-sm font-medium\">{t('organization.permissions.description')}</label>\n <Input value={description} onChange={(e) => setDescription(e.target.value)} placeholder={t('organization.permissions.descriptionPlaceholder')} className=\"mt-1\" />\n </div>\n </div>\n\n {/* Unified Permission Matrix */}\n <Card className=\"overflow-hidden\">\n {/* Search filter */}\n {features.length > 8 && (\n <div className=\"border-b border-border/40 px-3 py-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('organization.permissions.searchFeatures')}\n className=\"h-8 pl-8 text-xs\"\n />\n </div>\n </div>\n )}\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('common.feature')}</th>\n {ACTIONS.map((action) => (\n <th key={action} className=\"p-3 text-center text-sm font-medium text-muted-foreground capitalize w-20\">\n {t(`organization.permissions.action.${action}`) === `organization.permissions.action.${action}` ? action : t(`organization.permissions.action.${action}`)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {/* System permissions group */}\n <tr>\n <td colSpan={5} className=\"p-2 px-3\">\n <button\n onClick={() => toggleGroup('__system')}\n className=\"flex items-center gap-1.5 text-xs\"\n >\n {collapsed.has('__system')\n ? <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n : <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n }\n <Badge variant=\"secondary\" className=\"text-xs\">{t('organization.permissions.systemPermissions')}</Badge>\n </button>\n </td>\n </tr>\n {!collapsed.has('__system') && SYSTEM_PERMISSIONS.map((sp) => (\n <tr key={sp.id} className=\"hover:bg-muted/30\">\n <td className=\"p-3 text-sm font-medium\">{t(sp.key)}</td>\n <td colSpan={4} className=\"p-3\">\n <div className=\"flex justify-center\">\n <Checkbox\n checked={systemPerms.includes(sp.id)}\n onChange={() => toggleSystemPerm(sp.id)}\n />\n </div>\n </td>\n </tr>\n ))}\n\n {/* Feature permission groups */}\n {Array.from(groups.entries()).map(([groupName, groupFeatures]) => (\n <React.Fragment key={groupName}>\n <tr>\n <td colSpan={5} className=\"p-2 px-3\">\n <button\n onClick={() => toggleGroup(groupName)}\n className=\"flex items-center gap-1.5 text-xs\"\n >\n {collapsed.has(groupName)\n ? <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n : <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n }\n <Badge variant=\"secondary\" className=\"text-xs\">{groupName}</Badge>\n <span className=\"text-[10px] text-muted-foreground\">{groupFeatures.length}</span>\n </button>\n </td>\n </tr>\n {!collapsed.has(groupName) && groupFeatures.map((feature) => (\n <tr key={feature.id} className=\"hover:bg-muted/30\">\n <td className=\"p-3 text-sm font-medium\">{feature.label}</td>\n {ACTIONS.map((action) => (\n <td key={action} className=\"p-3 text-center\">\n <div className=\"flex justify-center\">\n <Checkbox\n checked={grants[feature.id]?.includes(action) ?? false}\n onChange={() => toggleGrant(feature.id, action)}\n color={ACTION_COLORS[action]}\n />\n </div>\n </td>\n ))}\n </tr>\n ))}\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </div>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={onCancel}>{t('common.cancel')}</Button>\n <Button onClick={handleSave} disabled={!name.trim() || saving}>\n {saving ? t('common.saving') : profile ? t('organization.permissions.updateProfile') : t('organization.permissions.createProfile')}\n </Button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Shield, Pencil, Trash2, Plus, Eye } from 'lucide-react'\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { PermissionMatrixEditor } from './PermissionMatrixEditor'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { PermissionProfile, PermissionAction, SystemPermission } from '../../types/permissions'\n\nexport function PermissionProfilesTab() {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const features = usePermissionsStore((s) => s.features)\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const members = useOrganizationStore((s) => s.members)\n const realProfile = usePermissionsStore((s) => s.realProfile)\n const startImpersonation = usePermissionsStore((s) => s.startImpersonation)\n\n const canPreview = (realProfile?.systemPermissions ?? []).includes('manage_permissions') ?? false\n\n const { t } = useTranslation()\n const [editingProfile, setEditingProfile] = React.useState<PermissionProfile | null>(null)\n const [creating, setCreating] = React.useState(false)\n const [saving, setSaving] = React.useState(false)\n\n const memberCountByProfile = React.useMemo(() => {\n const counts: Record<string, number> = {}\n for (const m of members) {\n counts[m.profileId] = (counts[m.profileId] ?? 0) + 1\n }\n return counts\n }, [members])\n\n const handleSave = async (data: { name: string; description?: string; systemPermissions: SystemPermission[]; grants: Record<string, PermissionAction[]> }) => {\n if (!adapter || !currentOrg) return\n setSaving(true)\n try {\n if (editingProfile) {\n await adapter.updateProfile(currentOrg.id, editingProfile.id, data)\n } else {\n await adapter.createProfile(currentOrg.id, data)\n }\n const updated = await adapter.listProfiles(currentOrg.id)\n setProfiles(updated)\n setEditingProfile(null)\n setCreating(false)\n } catch {\n // ignore\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async (profile: PermissionProfile) => {\n if (!adapter || !currentOrg || profile.isSystem) return\n try {\n await adapter.deleteProfile(currentOrg.id, profile.id)\n const updated = await adapter.listProfiles(currentOrg.id)\n setProfiles(updated)\n } catch {\n // ignore\n }\n }\n\n if (creating || editingProfile) {\n return (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">\n {editingProfile ? t('organization.permissions.editProfile', { name: editingProfile.name }) : t('organization.permissions.createCustom')}\n </h3>\n <PermissionMatrixEditor\n features={features}\n profile={editingProfile ?? undefined}\n onSave={handleSave}\n onCancel={() => { setEditingProfile(null); setCreating(false) }}\n saving={saving}\n />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold\">{t('organization.permissions.title')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('organization.permissions.subtitle')}</p>\n </div>\n <Button onClick={() => setCreating(true)} size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('organization.permissions.createProfile')}\n </Button>\n </div>\n\n <div className=\"grid gap-3\">\n {profiles.map((profile) => (\n <Card key={profile.id}>\n <CardContent className=\"flex items-center gap-4 p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10\">\n <Shield className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <CardTitle className=\"text-sm\">{profile.name}</CardTitle>\n {profile.isSystem && <Badge variant=\"secondary\" className=\"text-xs\">{t('organization.permissions.system')}</Badge>}\n </div>\n {profile.description && (\n <CardDescription className=\"text-xs mt-0.5\">{profile.description}</CardDescription>\n )}\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('organization.permissions.memberCount', { count: String(memberCountByProfile[profile.id] ?? 0), plural: (memberCountByProfile[profile.id] ?? 0) !== 1 ? 's' : '' })}\n </p>\n </div>\n <div className=\"flex items-center gap-1\">\n {canPreview && profile.id !== realProfile?.id && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={t('organization.permissions.previewAs')}\n onClick={() => startImpersonation(profile)}\n >\n <Eye className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setEditingProfile(profile)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive hover:text-destructive\"\n disabled={profile.isSystem}\n onClick={() => handleDelete(profile)}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )\n}\n","import React from 'react'\n\ninterface ActiveToggleProps {\n active: boolean\n onChange: (active: boolean) => void\n}\n\nexport function ActiveToggle({ active, onChange }: ActiveToggleProps) {\n return (\n <button type=\"button\" onClick={() => onChange(!active)} className=\"flex items-center gap-1.5\">\n <div className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${\n active ? 'bg-primary' : 'bg-muted-foreground/30'\n }`}>\n <span className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${\n active ? 'translate-x-[18px]' : 'translate-x-[2px]'\n }`} />\n </div>\n <span className={`text-xs font-medium ${active ? 'text-foreground' : 'text-muted-foreground'}`}>\n {active ? 'Active' : 'Inactive'}\n </span>\n </button>\n )\n}\n","import React from 'react'\nimport { User } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface PersonFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n compact?: boolean\n}\n\nconst IDENTITY_FIELDS = new Set(['name', 'dateOfBirth', 'documentNumber'])\nconst CONTACT_FIELDS = new Set(['email', 'phone'])\nconst ADDRESS_FIELDS = new Set(['address', 'city', 'state', 'country', 'postalCode'])\nconst SKIP_FIELDS = new Set(['isActive', 'status', 'tags', 'avatarUrl', 'notes'])\nconst ALL_PERSON_FIELDS = new Set([...IDENTITY_FIELDS, ...CONTACT_FIELDS, ...ADDRESS_FIELDS, ...SKIP_FIELDS])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan, compact }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: PersonFormLayoutProps['renderField']; colSpan?: boolean; compact?: boolean\n}) {\n return (\n <div className={`${compact ? 'space-y-1' : 'space-y-1.5'} ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function PersonFormLayout({ fields, fieldGroups, values, onChange, renderField, compact }: PersonFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const docField = fields.find((f) => f.key === 'documentNumber')\n const dobField = fields.find((f) => f.key === 'dateOfBirth')\n const contactFields = fields.filter((f) => CONTACT_FIELDS.has(f.key))\n const addressFields = fields.filter((f) => ADDRESS_FIELDS.has(f.key))\n const notesField = fields.find((f) => f.key === 'notes')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !ALL_PERSON_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n const gap = compact ? 'gap-2.5' : 'gap-3'\n const cardPad = compact ? 'pt-3' : 'pt-4'\n const sectionLabel = compact ? 'text-xs font-semibold text-foreground' : 'text-sm font-semibold text-foreground'\n\n return (\n <div className={compact ? 'space-y-2.5' : 'space-y-5'}>\n {/* Identity card — avatar + name + dob + doc + active toggle */}\n <Card>\n <CardContent className={cardPad}>\n <div className={`flex ${compact ? 'gap-3' : 'gap-5'}`}>\n <div className={`flex shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary ${compact ? 'h-10 w-10' : 'h-16 w-16'}`}>\n <User className={compact ? 'h-4 w-4' : 'h-6 w-6'} />\n </div>\n <div className={`flex-1 ${compact ? 'space-y-2' : 'space-y-4'}`}>\n {/* Row 1: Name + Document + Active toggle */}\n <div className={`flex items-start ${gap}`}>\n <div className={`flex-1 grid ${gap} sm:grid-cols-2`}>\n {nameField && (\n <div className={`${compact ? 'space-y-1' : 'space-y-1.5'} ${!docField ? 'sm:col-span-2' : ''}`}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {docField && (\n <div className={compact ? 'space-y-1' : 'space-y-1.5'}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>{docField.label}{docField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(docField, values[docField.key], (val) => onChange(docField.key, val))}\n </div>\n )}\n </div>\n {hasActive && (\n <div className={`shrink-0 ${compact ? 'mt-4' : 'mt-6'}`}>\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n </div>\n )}\n </div>\n {/* Row 2: Date of birth */}\n {dobField && (\n <div className={`grid ${gap} sm:grid-cols-2`}>\n <FieldItem field={dobField} value={values[dobField.key]} onChange={(val) => onChange(dobField.key, val)} renderField={renderField} compact={compact} />\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className={sectionLabel}>{group.label}</h3>\n {group.description && <p className={`text-muted-foreground ${compact ? 'text-[10px] mt-0.5 mb-1.5' : 'text-xs mt-0.5 mb-3'}`}>{group.description}</p>}\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`grid ${gap} ${cols >= 2 ? 'md:grid-cols-2' : ''} ${cols >= 3 ? 'lg:grid-cols-3' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <Card>\n <CardContent className={cardPad}>\n <div className={`grid ${gap} md:grid-cols-2`}>\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Contact */}\n {contactFields.length > 0 && (\n <div>\n <h3 className={sectionLabel}>Contact</h3>\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`grid ${gap} md:grid-cols-2`}>\n {contactFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Address */}\n {addressFields.length > 0 && (\n <div>\n <h3 className={sectionLabel}>Address</h3>\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`grid ${gap} md:grid-cols-2`}>\n {addressFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.key === 'address'} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className={cardPad}>\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} compact={compact} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface ProductFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst PRICING_FIELDS = new Set(['price', 'cost', 'currency', 'unit'])\nconst STOCK_FIELDS = new Set(['stock', 'minStock'])\nconst SKIP_FIELDS = new Set(['status', 'isActive', 'tags', 'imageUrl', 'name', 'description', 'sku', 'category'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: ProductFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function ProductFormLayout({ fields, fieldGroups, values, onChange, renderField }: ProductFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const descField = fields.find((f) => f.key === 'description')\n const skuField = fields.find((f) => f.key === 'sku')\n const categoryField = fields.find((f) => f.key === 'category')\n const imageField = fields.find((f) => f.key === 'imageUrl')\n const pricingFields = fields.filter((f) => PRICING_FIELDS.has(f.key))\n const stockFields = fields.filter((f) => STOCK_FIELDS.has(f.key))\n const statusField = fields.find((f) => f.key === 'status')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !SKIP_FIELDS.has(f.key) && !PRICING_FIELDS.has(f.key) && !STOCK_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity card — image + name + category + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n {/* Product image or placeholder */}\n <div className=\"shrink-0 space-y-2\">\n {values.imageUrl ? (\n <img src={values.imageUrl} alt=\"\" className=\"h-24 w-24 rounded-2xl object-cover\" />\n ) : (\n <div className=\"flex h-24 w-24 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <Package className=\"h-8 w-8\" />\n </div>\n )}\n {imageField && (\n <div className=\"w-24\">\n <input\n type=\"text\"\n value={values.imageUrl ?? ''}\n onChange={(e) => onChange('imageUrl', e.target.value)}\n placeholder=\"Image URL\"\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-[10px] text-muted-foreground placeholder:text-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 space-y-4\">\n {/* Name + active toggle */}\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {(hasActive || statusField) && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle\n active={hasActive ? (values.isActive ?? true) : statusField ? values[statusField.key] === 'active' || values[statusField.key] === 'available' : true}\n onChange={(v) => {\n if (hasActive) onChange('isActive', v)\n if (statusField) {\n const opts = statusField.options?.map((o: any) => typeof o === 'string' ? o : o.value) ?? []\n const activeVal = opts.find((o: string) => o === 'active' || o === 'available') ?? 'active'\n const inactiveVal = opts.find((o: string) => o === 'inactive' || o === 'sold_out' || o === 'hidden') ?? 'inactive'\n onChange(statusField.key, v ? activeVal : inactiveVal)\n }\n }}\n />\n </div>\n )}\n </div>\n\n {/* Category + SKU */}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {categoryField && <FieldItem field={categoryField} value={values[categoryField.key]} onChange={(val) => onChange(categoryField.key, val)} renderField={renderField} />}\n {skuField && <FieldItem field={skuField} value={values[skuField.key]} onChange={(val) => onChange(skuField.key, val)} renderField={renderField} />}\n </div>\n\n {/* Description */}\n {descField && <FieldItem field={descField} value={values[descField.key]} onChange={(val) => onChange(descField.key, val)} renderField={renderField} colSpan />}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Pricing */}\n {pricingFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Pricing</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {pricingFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Stock */}\n {stockFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Inventory</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {stockFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Details</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Briefcase } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface ServiceFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst IDENTITY_FIELDS = new Set(['name', 'description', 'imageUrl', 'category'])\nconst PRICING_FIELDS = new Set(['price', 'cost', 'currency', 'durationMinutes'])\nconst SKIP_FIELDS = new Set(['status', 'isActive', 'tags'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: ServiceFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function ServiceFormLayout({ fields, fieldGroups, values, onChange, renderField }: ServiceFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const descField = fields.find((f) => f.key === 'description')\n const otherIdentity = fields.filter((f) => IDENTITY_FIELDS.has(f.key) && f.key !== 'name' && f.key !== 'description')\n const pricingFields = fields.filter((f) => PRICING_FIELDS.has(f.key))\n const statusField = fields.find((f) => f.key === 'status')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n const allKnown = new Set([...IDENTITY_FIELDS, ...PRICING_FIELDS, ...SKIP_FIELDS])\n const projectFields = fields.filter((f) => !allKnown.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <Briefcase className=\"h-8 w-8\" />\n </div>\n <div className=\"flex-1 space-y-4\">\n {/* Name + active toggle */}\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {(hasActive || statusField) && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle\n active={hasActive ? (values.isActive ?? true) : statusField ? values[statusField.key] === 'active' : true}\n onChange={(v) => {\n if (hasActive) onChange('isActive', v)\n if (statusField) onChange(statusField.key, v ? 'active' : 'inactive')\n }}\n />\n </div>\n )}\n </div>\n {/* Description */}\n {descField && <FieldItem field={descField} value={values[descField.key]} onChange={(val) => onChange(descField.key, val)} renderField={renderField} colSpan />}\n {/* Other identity */}\n {otherIdentity.length > 0 && (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {otherIdentity.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Pricing & Duration */}\n {pricingFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Pricing & Duration</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {pricingFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Details</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { MapPin } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface LocationFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst IDENTITY_FIELDS = new Set(['name'])\nconst CONTACT_FIELDS = new Set(['phone', 'email'])\nconst ADDRESS_FIELDS = new Set(['address', 'city', 'state', 'country', 'postalCode'])\nconst SKIP_FIELDS = new Set(['isActive', 'status', 'tags', 'notes', 'isHeadquarters'])\nconst ALL_LOCATION_FIELDS = new Set([...IDENTITY_FIELDS, ...CONTACT_FIELDS, ...ADDRESS_FIELDS, ...SKIP_FIELDS])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: LocationFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function LocationFormLayout({ fields, fieldGroups, values, onChange, renderField }: LocationFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const contactFields = fields.filter((f) => CONTACT_FIELDS.has(f.key))\n const addressFields = fields.filter((f) => ADDRESS_FIELDS.has(f.key))\n const notesField = fields.find((f) => f.key === 'notes')\n const hasActive = fields.some((f) => f.key === 'isActive')\n const hqField = fields.find((f) => f.key === 'isHeadquarters')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !ALL_LOCATION_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity — icon + name + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <MapPin className=\"h-8 w-8\" />\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n <div className=\"mt-6 flex items-center gap-3 shrink-0\">\n {hasActive && (\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n )}\n </div>\n </div>\n {hqField && (\n <label className=\"flex items-center gap-2.5 cursor-pointer text-sm\">\n <input\n type=\"checkbox\"\n checked={!!values.isHeadquarters}\n onChange={(e) => onChange('isHeadquarters', e.target.checked)}\n className=\"h-4 w-4 rounded border-input\"\n />\n Headquarters\n </label>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Address */}\n {addressFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Address</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {addressFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.key === 'address'} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Contact */}\n {contactFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Contact</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {contactFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className=\"pt-5\">\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { Search, Plus, X, User, Loader2, Check } from 'lucide-react'\nimport { Input } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../../org'\n\ninterface Person {\n id: string\n name: string\n email?: string\n phone?: string\n kind: string\n}\n\ninterface PersonPickerProps {\n value?: string | null\n onChange: (personId: string | null, person?: Person) => void\n personKind?: string\n label?: string\n placeholder?: string\n onPersonData?: (data: { name: string; phone?: string; email?: string }) => void\n}\n\nexport function PersonPicker({\n value,\n onChange,\n personKind = 'customer',\n label = 'Person',\n placeholder = 'Search or type a name to add...',\n onPersonData,\n}: PersonPickerProps) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<Person[]>([])\n const [searching, setSearching] = useState(false)\n const [selected, setSelected] = useState<Person | null>(null)\n const [showCreate, setShowCreate] = useState(false)\n const [creating, setCreating] = useState(false)\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // New person form\n const [newPhone, setNewPhone] = useState('')\n const [newEmail, setNewEmail] = useState('')\n\n const tenantId = useOrganizationStore((s) => s.currentOrg?.id)\n\n // Load selected person on mount\n useEffect(() => {\n if (value && !selected) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n supabase.schema('saas_core')\n .from('persons')\n .select('id, name, email, phone, kind')\n .eq('id', value)\n .single()\n .then(({ data }: any) => {\n if (data) setSelected(data as Person)\n })\n }\n }, [value])\n\n // Close on outside click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n setShowCreate(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n const doSearch = useCallback(async (term: string) => {\n if (!term.trim() || !tenantId) { setResults([]); return }\n setSearching(true)\n try {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { data } = await supabase.schema('saas_core')\n .from('persons')\n .select('id, name, email, phone, kind')\n .eq('tenant_id', tenantId)\n .ilike('name', `%${term}%`)\n .limit(6)\n setResults((data ?? []) as Person[])\n } finally {\n setSearching(false)\n }\n }, [tenantId])\n\n const handleInput = (val: string) => {\n setQuery(val)\n setShowCreate(false)\n if (!open) setOpen(true)\n if (searchTimer.current) clearTimeout(searchTimer.current)\n searchTimer.current = setTimeout(() => doSearch(val), 250)\n }\n\n const handleSelect = (person: Person) => {\n setSelected(person)\n onChange(person.id, person)\n onPersonData?.({ name: person.name, phone: person.phone, email: person.email })\n setOpen(false)\n setQuery('')\n setResults([])\n setShowCreate(false)\n }\n\n const handleStartCreate = () => {\n setShowCreate(true)\n setNewPhone('')\n setNewEmail('')\n }\n\n const handleCreate = async () => {\n if (!query.trim() || !tenantId) return\n setCreating(true)\n try {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { data, error } = await supabase.schema('saas_core')\n .from('persons')\n .insert({\n tenant_id: tenantId,\n kind: personKind,\n name: query.trim(),\n phone: newPhone.trim() || null,\n email: newEmail.trim() || null,\n is_active: true,\n })\n .select('id, name, email, phone, kind')\n .single()\n if (error) throw error\n handleSelect(data as Person)\n } finally {\n setCreating(false)\n }\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setSelected(null)\n setQuery('')\n onChange(null)\n onPersonData?.({ name: '', phone: '', email: '' })\n setTimeout(() => inputRef.current?.focus(), 50)\n }\n\n const noResults = query.trim().length > 1 && !searching && results.length === 0\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Selected state */}\n {selected && !open ? (\n <button\n type=\"button\"\n onClick={() => { setOpen(true); setQuery(''); setTimeout(() => inputRef.current?.focus(), 50) }}\n className=\"flex items-center gap-3 w-full rounded-lg border px-3 py-2.5 text-left hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <User className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{selected.name}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {[selected.phone, selected.email].filter(Boolean).join(' · ') || 'No contact info'}\n </p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\" onClick={(e) => e.stopPropagation()}>\n <span className=\"text-[10px] text-muted-foreground\">Change</span>\n <button type=\"button\" onClick={handleClear} className=\"p-1 text-muted-foreground hover:text-destructive rounded\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </button>\n ) : (\n /* Search input */\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => handleInput(e.target.value)}\n onFocus={() => { if (query) setOpen(true) }}\n placeholder={placeholder}\n className=\"flex h-10 w-full rounded-lg border border-input bg-background pl-10 pr-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {searching && <Loader2 className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 animate-spin text-muted-foreground\" />}\n </div>\n )}\n\n {/* Dropdown */}\n {open && (query.trim().length > 0 || showCreate) && (\n <div className=\"fayz-glass-surface absolute z-50 mt-1 w-full rounded-lg border bg-popover shadow-lg overflow-hidden\">\n {/* Results */}\n {results.length > 0 && (\n <div className=\"max-h-52 overflow-y-auto\">\n {results.map((person) => (\n <button\n key={person.id}\n type=\"button\"\n onClick={() => handleSelect(person)}\n className=\"flex items-center gap-3 w-full px-3 py-2.5 text-left hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted\">\n <User className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium truncate\">{person.name}</p>\n <span className=\"inline-flex items-center rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground capitalize shrink-0\">\n {person.kind}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground truncate\">\n {[person.phone, person.email].filter(Boolean).join(' · ')}\n </p>\n </div>\n {person.id === value && <Check className=\"h-4 w-4 text-primary shrink-0\" />}\n </button>\n ))}\n </div>\n )}\n\n {/* No results — prompt to create */}\n {noResults && !showCreate && (\n <button\n type=\"button\"\n onClick={handleStartCreate}\n className=\"flex items-center gap-3 w-full px-3 py-3 text-left hover:bg-muted/50 transition-colors border-t border-dashed\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Plus className=\"h-4 w-4\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">Add \"<span className=\"text-primary\">{query.trim()}</span>\"</p>\n <p className=\"text-xs text-muted-foreground\">Create a new {label.toLowerCase()} with this name</p>\n </div>\n </button>\n )}\n\n {/* Also show create option when there ARE results */}\n {results.length > 0 && !showCreate && (\n <button\n type=\"button\"\n onClick={handleStartCreate}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted/50 transition-colors border-t text-xs text-muted-foreground\"\n >\n <Plus className=\"h-3 w-3\" />\n Add \"<span className=\"font-medium text-foreground\">{query.trim()}</span>\" as new {label.toLowerCase()}\n </button>\n )}\n\n {/* Inline create form */}\n {showCreate && (\n <div className=\"p-3 border-t space-y-3 bg-muted/20\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Plus className=\"h-3 w-3\" />\n </div>\n <p className=\"text-xs font-medium\">New {label}: <span className=\"text-primary\">{query.trim()}</span></p>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input\n value={newPhone}\n onChange={(e) => setNewPhone(e.target.value)}\n placeholder=\"Phone\"\n className=\"h-8 text-xs\"\n />\n <Input\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Email\"\n type=\"email\"\n className=\"h-8 text-xs\"\n />\n </div>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => setShowCreate(false)}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" className=\"h-7 text-xs\" onClick={handleCreate} disabled={creating}>\n {creating ? <Loader2 className=\"h-3 w-3 mr-1 animate-spin\" /> : <Check className=\"h-3 w-3 mr-1\" />}\n {creating ? 'Saving...' : 'Save & Select'}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport { PersonPicker } from './PersonPicker'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface SubjectFormLayoutProps {\n fields: FieldDef[]\n allFields?: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n entityIcon?: string\n}\n\nconst OWNER_FIELDS = new Set(['tutorName', 'tutorPhone', 'tutorId'])\nconst REFERRAL_FIELDS = new Set(['referringVetId', 'referringClinicId'])\nconst SKIP_FIELDS = new Set(['isActive', 'notes', 'tags', 'metadata'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: SubjectFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function SubjectFormLayout({ fields, allFields, fieldGroups, values, onChange, renderField, entityIcon }: SubjectFormLayoutProps) {\n const all = allFields ?? fields\n const nameField = fields.find((f) => f.key === 'name')\n const hasActive = fields.some((f) => f.key === 'isActive')\n const notesField = fields.find((f) => f.key === 'notes')\n const hasOwnerPicker = all.some((f) => f.key === 'tutorId' || f.key === 'tutorName')\n const referralFields = fields.filter((f) => REFERRAL_FIELDS.has(f.key))\n\n // Main subject fields = everything except name, owner, referral, skip\n const allSkip = new Set([...OWNER_FIELDS, ...REFERRAL_FIELDS, ...SKIP_FIELDS, 'name'])\n const subjectFields = fields.filter((f) => !allSkip.has(f.key))\n\n // Group subject fields\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungrouped: FieldDef[] = []\n for (const field of subjectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungrouped.push(field)\n }\n }\n\n const IconComponent = (LucideIcons as any)[entityIcon ?? 'Heart'] ?? LucideIcons.Heart\n\n return (\n <div className=\"space-y-6\">\n {/* Identity — icon + name + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n {React.createElement(IconComponent, { className: 'h-8 w-8' })}\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {hasActive && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n </div>\n )}\n </div>\n {/* Ungrouped fields inline */}\n {ungrouped.length > 0 && (\n <div className=\"grid gap-4 sm:grid-cols-3\">\n {ungrouped.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Grouped subject fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''} ${cols >= 3 ? 'lg:grid-cols-3' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Owner / Tutor — person picker */}\n {hasOwnerPicker && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Owner / Tutor</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <PersonPicker\n value={values.tutorId}\n onChange={(personId) => onChange('tutorId', personId)}\n personKind=\"customer\"\n label=\"Tutor\"\n placeholder=\"Search or type a name to add...\"\n />\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Referral */}\n {referralFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Referral</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {referralFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className=\"pt-5\">\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { ArrowLeft, ImagePlus, Loader2 } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { CurrencyInput } from '@fayz-ai/ui'\nimport { toast } from '@fayz-ai/ui'\nimport { useSaveBar, useBackHandler } from '@fayz-ai/ui'\nimport { PersonFormLayout } from './archetypes/PersonFormLayout'\nimport { ProductFormLayout } from './archetypes/ProductFormLayout'\nimport { ServiceFormLayout } from './archetypes/ServiceFormLayout'\nimport { LocationFormLayout } from './archetypes/LocationFormLayout'\nimport { SubjectFormLayout } from './archetypes/SubjectFormLayout'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FieldDef, FieldGroup, EntityDef } from '@fayz-ai/core'\nimport type { FormLayout } from '@fayz-ai/core'\n\ninterface CrudFormPageProps {\n entityDef: EntityDef\n mode: 'create' | 'edit'\n initialData?: Record<string, any>\n onSubmit: (data: Record<string, any>) => void | Promise<void>\n onCancel: () => void\n namePlural: string\n /** Embedded mode — no breadcrumb, compact layout. For use inside modals/panels. */\n embedded?: boolean\n /** Hide the internal breadcrumb while keeping the full-page SaveBar/Escape flow.\n * Use when a parent already renders its own header (e.g. SubpageHeader). */\n hideBreadcrumb?: boolean\n}\n\n/** Derive a currency symbol from an ISO code (e.g. USD → \"$\") when not given. */\nfunction currencySymbolFor(code: string | undefined, locale: string): string {\n if (!code) return 'R$'\n try {\n const parts = new Intl.NumberFormat(locale, { style: 'currency', currency: code }).formatToParts(0)\n return parts.find((p) => p.type === 'currency')?.value ?? code\n } catch {\n return code\n }\n}\n\nfunction getDefaultValues(fields: FieldDef[]): Record<string, any> {\n const values: Record<string, any> = {}\n for (const field of fields) {\n if (field.showInForm === false) continue\n // Computed fields are read-only and never part of the payload.\n if (field.type === 'computed') continue\n if (field.defaultValue != null) {\n values[field.key] = field.defaultValue\n } else {\n switch (field.type) {\n case 'boolean':\n values[field.key] = false\n break\n case 'number':\n case 'currency':\n values[field.key] = ''\n break\n default:\n values[field.key] = ''\n }\n }\n }\n return values\n}\n\nfunction renderField(field: FieldDef, value: any, onChange: (val: any) => void, allValues: Record<string, any> = {}) {\n const baseClass = 'flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n\n switch (field.type) {\n case 'currency': {\n const locale = field.currencyLocale ?? 'pt-BR'\n return (\n <CurrencyInput\n value={Number(value) || 0}\n onChange={(n) => onChange(n)}\n currencyCode={field.currency}\n locale={locale}\n symbol={field.currencySymbol ?? currencySymbolFor(field.currency, locale)}\n />\n )\n }\n case 'segmented': {\n const options = (field.options ?? []).map((o) =>\n typeof o === 'string' ? { label: o, value: o, description: undefined } : o,\n )\n return (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {options.map((o) => {\n const active = value === o.value\n return (\n <button\n key={o.value}\n type=\"button\"\n onClick={() => onChange(o.value)}\n className={`rounded-lg border-2 p-3 text-left transition-all ${\n active\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/20 hover:bg-muted/40'\n }`}\n >\n <p className={`text-sm font-medium ${active ? 'text-primary' : ''}`}>{o.label}</p>\n {'description' in o && o.description && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5 leading-tight\">{o.description}</p>\n )}\n </button>\n )\n })}\n </div>\n )\n }\n case 'computed': {\n const result = field.compute ? field.compute(allValues) : null\n const tone = result?.tone === 'positive' ? 'text-success'\n : result?.tone === 'negative' ? 'text-destructive'\n : 'text-foreground'\n return (\n <div className=\"mt-1 rounded-lg border bg-muted/20 px-3 py-2 text-sm tabular-nums text-right\">\n {result ? <span className={tone}>{result.display}</span> : <span className=\"text-muted-foreground\">—</span>}\n </div>\n )\n }\n case 'textarea':\n return (\n <textarea\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n rows={2}\n className={`${baseClass} min-h-[60px] py-1.5`}\n />\n )\n case 'select': {\n const options = (field.options ?? []).map((o) =>\n typeof o === 'string' ? { label: o, value: o } : o,\n )\n return (\n <select\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n required={field.required}\n className={baseClass}\n >\n <option value=\"\">{field.placeholder ?? `Select ${field.label.toLowerCase()}...`}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n )\n }\n case 'boolean':\n return (\n <label className=\"flex items-center gap-2.5 cursor-pointer\">\n <Checkbox\n checked={!!value}\n onChange={(checked) => onChange(checked)}\n />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n )\n case 'number':\n return (\n <Input\n type=\"number\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value === '' ? '' : Number(e.target.value))}\n placeholder={field.placeholder}\n required={field.required}\n min={field.min}\n max={field.max}\n />\n )\n case 'date':\n return <Input type=\"date\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'datetime':\n return <Input type=\"datetime-local\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'time':\n return <Input type=\"time\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'color':\n return (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={value || '#6b7280'}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-12 rounded-md border border-input cursor-pointer p-0.5\"\n />\n <Input\n type=\"text\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"#000000\"\n className=\"flex-1 font-mono text-xs\"\n />\n </div>\n )\n default:\n return (\n <Input\n type={field.type === 'email' ? 'email' : field.type === 'phone' ? 'tel' : field.type === 'url' ? 'url' : 'text'}\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n />\n )\n }\n}\n\nfunction FormFieldItem({ field, value, onChange, allValues }: { field: FieldDef; value: any; onChange: (val: any) => void; allValues?: Record<string, any> }) {\n return (\n <div className={`grid gap-1 ${field.span === 2 ? 'md:col-span-2' : ''}`}>\n {field.type !== 'boolean' && (\n <label className=\"text-sm font-medium text-foreground\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n )}\n {renderField(field, value, onChange, allValues)}\n {field.hint && <p className=\"text-[10px] text-muted-foreground mt-0.5\">{field.hint}</p>}\n </div>\n )\n}\n\nfunction FormGroup({\n group,\n fields,\n values,\n onChange,\n}: {\n group: FieldGroup\n fields: FieldDef[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n}) {\n const cols = group.columns ?? 2\n\n const grid = (\n <div className={`grid gap-3 ${cols >= 2 ? 'md:grid-cols-2' : ''} ${cols >= 3 ? 'lg:grid-cols-3' : ''}`}>\n {fields.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => onChange(field.key, val)}\n allValues={values}\n />\n ))}\n </div>\n )\n\n return (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n {group.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 mb-3\">{group.description}</p>\n )}\n <Card>\n <CardContent className=\"pt-4\">\n {group.imageSlot ? (\n <div className=\"flex gap-4\">\n {/* Decorative image slot — non-functional placeholder for now. */}\n <div className=\"shrink-0\">\n <div className=\"flex h-20 w-20 cursor-pointer items-center justify-center rounded-lg border-2 border-dashed border-muted text-muted-foreground transition-colors hover:border-primary/30 hover:text-primary/50\">\n <ImagePlus className=\"h-5 w-5\" />\n </div>\n </div>\n <div className=\"flex-1\">{grid}</div>\n </div>\n ) : (\n grid\n )}\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport function CrudFormPage({ entityDef, mode, initialData, onSubmit, onCancel, namePlural, embedded, hideBreadcrumb }: CrudFormPageProps) {\n const t = useTranslation()\n const formFields = entityDef.fields.filter((f) => f.showInForm !== false)\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const computeInit = () =>\n mode === 'edit' && initialData ? { ...getDefaultValues(formFields), ...initialData } : getDefaultValues(formFields)\n const [values, setValues] = useState<Record<string, any>>(computeInit)\n const [saving, setSaving] = useState(false)\n const initialRef = React.useRef<string>(JSON.stringify(values))\n\n useEffect(() => {\n const init = computeInit()\n setValues(init)\n initialRef.current = JSON.stringify(init)\n }, [mode, initialData])\n\n const computedKeys = new Set(formFields.filter((f) => f.type === 'computed').map((f) => f.key))\n\n const submit = async () => {\n setSaving(true)\n try {\n // Sanitize: convert empty strings to null so the DB doesn't choke on e.g. empty date fields.\n // Computed fields are read-only and never persisted.\n const sanitized: Record<string, any> = {}\n for (const [key, val] of Object.entries(values)) {\n if (computedKeys.has(key)) continue\n sanitized[key] = val === '' ? null : val\n }\n await onSubmit(sanitized)\n } catch (err: any) {\n const message = err?.message || 'Something went wrong'\n toast.error(t('crud.form.failedToSave', { entity: entityDef.name.toLowerCase() }), { description: message })\n } finally {\n setSaving(false)\n }\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n void submit()\n }\n\n const dirty = JSON.stringify(values) !== initialRef.current\n\n // Discard reverts the form to its pristine state and stays on the page (the\n // SaveBar then hides). Leaving the page is a separate action — the breadcrumb\n // link, or pressing Escape again once there's nothing left to discard.\n const discard = () => { setValues(computeInit()) }\n\n // Full-page CRUD forms surface Save/Discard via the app-wide floating SaveBar.\n // Embedded forms (rendered inside other widgets) keep their inline buttons.\n useSaveBar({\n dirty: !embedded && dirty,\n saving,\n onSave: () => { void submit() },\n onDiscard: discard,\n saveLabel: mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.saveChanges'),\n })\n\n // Register \"leave to parent\" with the app-wide Escape key. While the form is\n // dirty the SaveBar owns Escape (→ discard); once pristine, Escape navigates\n // back — giving the two-step \"discard, then leave\" flow for free.\n useBackHandler(embedded ? undefined : onCancel)\n\n const handleChange = (key: string, val: any) => {\n setValues((prev) => ({ ...prev, [key]: val }))\n }\n\n const title = mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.editTitle', { entity: entityDef.name })\n const breadcrumbLabel = mode === 'create'\n ? t('crud.form.newBreadcrumb', { entity: entityDef.name })\n : (values[displayField] || initialData?.[displayField] || t('common.edit'))\n\n // Organize fields by groups\n const groups = entityDef.fieldGroups ?? []\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedFields: FieldDef[] = []\n\n for (const field of formFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedFields.push(field)\n }\n }\n\n const hasGroups = groups.length > 0 || groupFieldMap.size > 0\n\n const archetypeLayoutProps = {\n fields: formFields,\n allFields: entityDef.fields,\n fieldGroups: groups,\n values,\n onChange: handleChange,\n renderField,\n entityIcon: entityDef.icon,\n compact: embedded,\n }\n\n function renderFormBody(layout?: FormLayout) {\n switch (layout) {\n case 'person':\n return <PersonFormLayout {...archetypeLayoutProps} />\n case 'product':\n return <ProductFormLayout {...archetypeLayoutProps} />\n case 'service':\n return <ServiceFormLayout {...archetypeLayoutProps} />\n case 'location':\n return <LocationFormLayout {...archetypeLayoutProps} />\n case 'subject':\n return <SubjectFormLayout {...archetypeLayoutProps} />\n default:\n // Generic layout — ungrouped + grouped fields\n return (\n <>\n {ungroupedFields.length > 0 && (\n <Card>\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${!hasGroups ? '' : 'md:grid-cols-2'}`}>\n {ungroupedFields.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => handleChange(field.key, val)}\n allValues={values}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n {groups.map((group) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return null\n return (\n <FormGroup\n key={group.id}\n group={group}\n fields={fields}\n values={values}\n onChange={handleChange}\n />\n )\n })}\n </>\n )\n }\n }\n\n return (\n <div className={`w-full flex flex-col items-center ${embedded ? 'text-sm' : ''}`}>\n <div className={`w-full ${embedded ? 'space-y-3' : 'max-w-3xl space-y-5'}`}>\n {/* Breadcrumb + subtitle — hidden in embedded mode or when a parent owns the header */}\n {!embedded && !hideBreadcrumb && (\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button type=\"button\" onClick={onCancel} className=\"inline-flex items-center gap-1 hover:text-foreground transition-colors\">\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {namePlural}\n </button>\n <span>/</span>\n <span className=\"text-foreground font-medium truncate max-w-[200px]\">{breadcrumbLabel}</span>\n </nav>\n )}\n\n {/* Form */}\n <form onSubmit={handleSubmit} className={embedded ? 'space-y-3' : 'space-y-5'}>\n {renderFormBody(entityDef.layout)}\n\n {/* Submit — embedded forms keep inline buttons; full-page forms use the floating SaveBar */}\n {embedded && (\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={saving}>{t('common.cancel')}</Button>\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving && <Loader2 className=\"animate-spin mr-1.5 h-3 w-3\" />}\n {saving ? t('common.saving') : mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.saveChanges')}\n </Button>\n </div>\n )}\n </form>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { FieldDef } from '@fayz-ai/core'\nimport { Badge } from '@fayz-ai/ui'\nimport {\n formatCurrency as formatCurrencyLocale,\n formatDate as formatDateLocale,\n formatDateTime as formatDateTimeLocale,\n} from '@fayz-ai/core'\n\nfunction formatCurrency(value: any, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return '—'\n return formatCurrencyLocale(num, currency)\n}\n\nfunction formatDate(value: any): string {\n if (!value) return '—'\n return formatDateLocale(value)\n}\n\nfunction formatDateTime(value: any): string {\n if (!value) return '—'\n return formatDateTimeLocale(value)\n}\n\nexport interface ColumnDef {\n key: string\n label: string\n sortable: boolean\n render: (value: any, row: any) => React.ReactNode\n}\n\nexport interface FieldToColumnsOptions {\n /** Callback for inline field updates (e.g. toggle active) */\n onInlineUpdate?: (id: string, field: string, value: any) => void\n}\n\nfunction InlineToggle({ checked, onChange }: { checked: boolean; onChange: (val: boolean) => void }) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n onClick={(e) => { e.stopPropagation(); onChange(!checked) }}\n className={`relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${\n checked ? 'bg-primary' : 'bg-muted'\n }`}\n >\n <span\n className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-lg ring-0 transition-transform ${\n checked ? 'translate-x-4' : 'translate-x-0'\n }`}\n />\n </button>\n )\n}\n\nexport function fieldToColumns(fields: FieldDef[], options?: FieldToColumnsOptions): ColumnDef[] {\n return fields\n .filter((f) => f.showInTable !== false)\n .map((field): ColumnDef => {\n const sortable = field.sortable ?? ['text', 'number', 'currency', 'date', 'datetime', 'email'].includes(field.type)\n\n const render = field.renderCell ?? ((value: any, row: any): React.ReactNode => {\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n\n switch (field.type) {\n case 'currency':\n return <span>{formatCurrency(value, field.currency)}</span>\n case 'date':\n return <span>{formatDate(value)}</span>\n case 'datetime':\n return <span>{formatDateTime(value)}</span>\n case 'boolean':\n if (field.inlineToggle && options?.onInlineUpdate) {\n const handler = options.onInlineUpdate\n return (\n <InlineToggle\n checked={!!value}\n onChange={(val) => handler(row.id, field.key, val)}\n />\n )\n }\n return value ? (\n <svg className=\"h-4 w-4 text-success\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )\n case 'color':\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"h-4 w-4 rounded-full border shrink-0\" style={{ backgroundColor: String(value) }} />\n <span className=\"text-xs text-muted-foreground\">{String(value)}</span>\n </span>\n )\n case 'select':\n return <Badge variant=\"secondary\">{String(value)}</Badge>\n case 'number':\n return <span>{typeof value === 'number' ? value.toLocaleString() : value}</span>\n default:\n return <span>{String(value)}</span>\n }\n })\n\n return { key: field.key, label: field.label, sortable, render }\n })\n}\n","import React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { Card } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport type { FieldDef, EntityDef } from '@fayz-ai/core'\nimport { formatCurrency, formatDate } from '@fayz-ai/core'\n\ninterface CrudCardGridProps<T> {\n items: T[]\n entityDef: EntityDef<T>\n onEdit: (item: T) => void\n onDelete: (item: T) => void\n}\n\nfunction formatValue(field: FieldDef, value: any): React.ReactNode {\n if (value == null || value === '') return null\n\n switch (field.type) {\n case 'currency': {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return null\n return formatCurrency(num, field.currency)\n }\n case 'date':\n try { return formatDate(value) }\n catch { return String(value) }\n case 'boolean':\n return value ? 'Yes' : 'No'\n case 'select':\n return <Badge variant=\"secondary\" className=\"text-[10px]\">{String(value)}</Badge>\n case 'image':\n return null\n default:\n return String(value)\n }\n}\n\nexport function CrudCardGrid<T extends { id: string }>({ items, entityDef, onEdit, onDelete }: CrudCardGridProps<T>) {\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const imageField = entityDef.imageField\n const entityIcon = entityDef.icon\n const IconComponent = (LucideIcons as any)[entityIcon] ?? LucideIcons.Package\n const visibleFields = entityDef.fields.filter(\n (f) => f.showInTable !== false && f.key !== displayField && f.key !== imageField && f.type !== 'image'\n )\n\n return (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {items.map((item) => {\n const record = item as any\n const imageUrl = imageField ? record[imageField] : null\n\n return (\n <Card\n key={record.id}\n className=\"flex items-center gap-4 p-3 cursor-pointer hover:bg-muted/30 transition-colors\"\n onClick={() => onEdit(item)}\n >\n {/* Thumbnail or icon */}\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={record[displayField] ?? ''}\n className=\"h-14 w-14 shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-lg bg-muted/50\">\n <IconComponent className=\"h-6 w-6 text-muted-foreground/40\" />\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold truncate\">{record[displayField] ?? record.id}</h3>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {visibleFields.slice(0, 3).map((field) => {\n const val = formatValue(field, record[field.key])\n if (val == null) return null\n return (\n <span key={field.key} className=\"text-xs text-muted-foreground\">\n {val}\n </span>\n )\n })}\n </div>\n </div>\n </Card>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport type { PermissionAction } from '@fayz-ai/core'\nimport { usePermissionOptional } from './context'\n\ninterface PermissionGateProps {\n feature: string\n action: PermissionAction\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\n/** Renders children only when the current user has the given feature+action. */\nexport function PermissionGate({ feature, action, children, fallback }: PermissionGateProps) {\n const can = usePermissionOptional()\n if (!can(feature, action)) return <>{fallback ?? null}</>\n return <>{children}</>\n}\n","import React, { useMemo } from 'react'\nimport { MoreVertical, Upload, Download } from 'lucide-react'\nimport type { ColumnDef as TanStackColumnDef } from '@tanstack/react-table'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Card } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { DataTable } from '@fayz-ai/ui'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from '@fayz-ai/ui'\nimport { fieldToColumns } from './fieldToColumn'\nimport { CrudCardGrid } from './CrudCardGrid'\nimport { PermissionGate } from '../permissions/PermissionGate'\n\n/** A resolved facet: a field plus the option pills to render. */\nexport interface CrudFacet {\n field: string\n options: { value: string; label: string }[]\n allLabel?: string\n}\n\nexport interface CrudListViewProps<T extends { id: string }> {\n entityDef: EntityDef<T>\n /** TanStack columns. When omitted, derived from entityDef.fields (no actions column). */\n columns?: TanStackColumnDef<T, any>[]\n /** null = initial load (skeleton); [] = empty state. */\n items: T[] | null\n total: number\n display?: 'table' | 'cards'\n /** Search box — rendered when onSearchChange is provided. */\n search?: string\n onSearchChange?: (value: string) => void\n searchPlaceholder?: string\n /** Facet pills below the search box. */\n facets?: CrudFacet[]\n activeFilters?: Record<string, string | undefined>\n onFacetChange?: (field: string, value: string | undefined) => void\n onNew?: () => void\n addLabel?: string\n onRowClick?: (row: T) => void\n /** Delete action for the card grid (table actions live in the columns). */\n onDelete?: (row: T) => void\n onImport?: () => void\n onExport?: () => void\n feature?: string\n readOnly?: boolean\n emptyMessage?: string\n}\n\nfunction pillClass(active: boolean): string {\n return [\n 'rounded-full px-3 py-1 text-sm font-medium transition-colors',\n active\n ? 'bg-foreground text-background'\n : 'bg-muted text-muted-foreground hover:bg-muted/70',\n ].join(' ')\n}\n\n/**\n * The canonical generic list — header (count + New + import/export), search,\n * faceted filter pills, and a DataTable/card grid. Decoupled from data and\n * routing: feed it `items` and callbacks. Used by CrudPage (store-backed) and by\n * plugins that own their data/routing (e.g. the inventory product list).\n */\nexport function CrudListView<T extends { id: string }>({\n entityDef,\n columns,\n items,\n total,\n display = 'table',\n search,\n onSearchChange,\n searchPlaceholder,\n facets,\n activeFilters,\n onFacetChange,\n onNew,\n addLabel,\n onRowClick,\n onDelete,\n onImport,\n onExport,\n feature,\n readOnly,\n emptyMessage,\n}: CrudListViewProps<T>) {\n const t = useTranslation()\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n\n const derivedColumns = useMemo<TanStackColumnDef<T, any>[]>(() => {\n return fieldToColumns(entityDef.fields).map((col) => ({\n accessorKey: col.key,\n header: col.label,\n enableSorting: col.sortable,\n cell: ({ row }: any) => {\n const value = row.original[col.key]\n const rendered = col.render(value, row.original)\n return col.key === displayField\n ? <span className=\"font-medium text-foreground\">{rendered}</span>\n : rendered\n },\n }))\n }, [entityDef.fields, displayField])\n\n const tanColumns = columns ?? derivedColumns\n\n const isInitialLoad = items === null\n const isEmpty = items !== null && items.length === 0\n const hasImportExport = Boolean(onImport || onExport)\n\n const newButton = onNew && !readOnly\n ? <Button onClick={onNew}>{addLabel ?? t('crud.list.addEntity', { entity: entityDef.name })}</Button>\n : null\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">{namePlural}</h1>\n {isInitialLoad ? (\n <div className=\"h-5 w-32 animate-pulse rounded bg-muted mt-1\" />\n ) : (\n <p className=\"text-muted-foreground\">{t('crud.list.totalCount', { count: String(total), entities: namePlural.toLowerCase() })}</p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {newButton && (feature ? <PermissionGate feature={feature} action=\"create\">{newButton}</PermissionGate> : newButton)}\n {hasImportExport && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" className=\"h-9 w-9 shrink-0\">\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n {onImport && (\n <DropdownItem onClick={onImport}>\n <Upload className=\"h-4 w-4 mr-2\" />\n {t('crud.import.action')}\n </DropdownItem>\n )}\n {onExport && (\n <DropdownItem onClick={onExport}>\n <Download className=\"h-4 w-4 mr-2\" />\n {t('crud.export.action')}\n </DropdownItem>\n )}\n </DropdownContent>\n </Dropdown>\n )}\n </div>\n </div>\n\n {onSearchChange && (\n <div className=\"relative max-w-sm\">\n <svg className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg>\n <input\n type=\"text\"\n placeholder={searchPlaceholder ?? t('crud.list.search', { entities: namePlural.toLowerCase() })}\n value={search ?? ''}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n\n {facets?.map((facet) => {\n const active = activeFilters?.[facet.field]\n return (\n <div key={facet.field} className=\"flex flex-wrap gap-2\">\n <button type=\"button\" onClick={() => onFacetChange?.(facet.field, undefined)} className={pillClass(active == null)}>\n {facet.allLabel ?? t('crud.list.allFacet')}\n </button>\n {facet.options.map((o) => (\n <button key={o.value} type=\"button\" onClick={() => onFacetChange?.(facet.field, o.value)} className={pillClass(active === o.value)}>\n {o.label}\n </button>\n ))}\n </div>\n )\n })}\n\n {isInitialLoad ? (\n display === 'cards' ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 2 }).map((_, i) => (\n <Card key={i} className=\"overflow-hidden\">\n <div className=\"p-5 space-y-3\">\n <div className=\"h-5 w-2/3 animate-pulse rounded bg-muted\" />\n <div className=\"space-y-2\">\n <div className=\"flex justify-between\"><div className=\"h-4 w-20 animate-pulse rounded bg-muted\" /><div className=\"h-4 w-16 animate-pulse rounded bg-muted\" /></div>\n <div className=\"flex justify-between\"><div className=\"h-4 w-24 animate-pulse rounded bg-muted\" /><div className=\"h-4 w-12 animate-pulse rounded bg-muted\" /></div>\n </div>\n </div>\n </Card>\n ))}\n </div>\n ) : (\n <DataTable columns={tanColumns} data={[]} loading skeletonRows={3} />\n )\n ) : isEmpty ? (\n <DataTable\n columns={tanColumns}\n data={[]}\n emptyMessage={emptyMessage ?? t('crud.list.empty', { entities: namePlural.toLowerCase() })}\n />\n ) : display === 'cards' ? (\n <CrudCardGrid\n items={items ?? []}\n entityDef={entityDef as EntityDef<any>}\n onEdit={(item) => onRowClick?.(item as T)}\n onDelete={(item) => onDelete?.(item as T)}\n />\n ) : (\n <DataTable\n columns={tanColumns}\n data={items ?? []}\n onRowClick={(row) => onRowClick?.(row as T)}\n />\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { usePluginRuntimeOptional, getWidgetsForZone, resolvePluginComponent } from '@fayz-ai/core'\n\n/** Renders all plugin widgets registered for a zone, in order. Plugins fill\n * these slots (detail-tab zones, page zones) without the host knowing them. */\nexport function WidgetSlot({\n zone,\n contextOverrides,\n ...props\n}: { zone: string; contextOverrides?: Record<string, unknown> } & Record<string, unknown>) {\n const runtime = usePluginRuntimeOptional()\n if (!runtime) return null\n const widgets = getWidgetsForZone(runtime, zone, contextOverrides as never)\n if (!widgets.length) return null\n return (\n <>\n {widgets.map((widget, i) => {\n const Component = resolvePluginComponent(widget) as React.ComponentType<Record<string, unknown>> | undefined\n if (!Component) return null\n const w = widget as unknown as { config?: unknown; plugin?: unknown; props?: Record<string, unknown> }\n // Pass BOTH contracts: the saas-core widget contract (config/runtime/\n // plugin/widget) the de-bridged plugins expect, AND the spread props\n // that native archetype zones use.\n return (\n <Component\n key={widget.id ?? `${zone}-${i}`}\n config={w.config}\n runtime={{ ...runtime.context, ...(contextOverrides ?? {}) }}\n plugin={w.plugin}\n widget={widget}\n {...(w.props ?? {})}\n {...props}\n />\n )\n })}\n </>\n )\n}\n","// ---------------------------------------------------------------------------\n// Standalone Schedule CRUD Service\n// Works outside the agenda plugin context — uses Supabase directly.\n// ---------------------------------------------------------------------------\n\nimport { getCoreSchemaClient as getCoreClient } from '../supabase/client'\nimport { useOrganizationStore } from '../org'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ScheduleRecord {\n id: string\n tenantId: string\n kind: string\n assigneeId: string | null\n locationId: string | null\n dayOfWeek: number | null\n specificDate: string | null\n startsAt: string\n endsAt: string\n isActive: boolean\n metadata: Record<string, unknown>\n}\n\nexport interface SaveScheduleInput {\n assigneeId: string\n locationId?: string\n dayOfWeek?: number\n specificDate?: string\n startsAt: string\n endsAt: string\n isActive?: boolean\n kind?: string\n}\n\n/** Advanced settings stored per schedule block in the metadata jsonb column. */\nexport interface BlockSettings {\n bufferMinutes?: number\n allowedServiceIds?: string[]\n maxConcurrent?: number\n minAdvanceHours?: number\n maxAdvanceDays?: number\n label?: string\n locationId?: string\n}\n\n/** Extract BlockSettings from a schedule record's metadata. */\nexport function parseBlockSettings(metadata: Record<string, unknown>): BlockSettings {\n return {\n bufferMinutes: typeof metadata.bufferMinutes === 'number' ? metadata.bufferMinutes : undefined,\n allowedServiceIds: Array.isArray(metadata.allowedServiceIds) ? metadata.allowedServiceIds : undefined,\n maxConcurrent: typeof metadata.maxConcurrent === 'number' ? metadata.maxConcurrent : undefined,\n minAdvanceHours: typeof metadata.minAdvanceHours === 'number' ? metadata.minAdvanceHours : undefined,\n maxAdvanceDays: typeof metadata.maxAdvanceDays === 'number' ? metadata.maxAdvanceDays : undefined,\n label: typeof metadata.label === 'string' ? metadata.label : undefined,\n locationId: typeof metadata.locationId === 'string' ? metadata.locationId : undefined,\n }\n}\n\n/** Merge BlockSettings into existing metadata object. */\nexport function mergeBlockSettings(metadata: Record<string, unknown>, settings: BlockSettings): Record<string, unknown> {\n const merged = { ...metadata }\n // Only set defined values, remove undefined ones to keep metadata clean\n for (const [key, value] of Object.entries(settings)) {\n if (value !== undefined && value !== null && !(Array.isArray(value) && value.length === 0)) {\n merged[key] = value\n } else {\n delete merged[key]\n }\n }\n return merged\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTenantId(): string {\n const id = useOrganizationStore.getState().currentOrg?.id\n if (!id) throw new Error('No active tenant')\n return id\n}\n\nfunction mapRow(row: Record<string, unknown>): ScheduleRecord {\n const r: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n r[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return r as unknown as ScheduleRecord\n}\n\n// ---------------------------------------------------------------------------\n// Service functions\n// ---------------------------------------------------------------------------\n\nexport async function getSchedules(\n assigneeId: string,\n kind = 'working_hours',\n): Promise<ScheduleRecord[]> {\n const core = getCoreClient()\n const { data, error } = await core\n .from('schedules')\n .select('*')\n .eq('kind', kind)\n .eq('assignee_id', assigneeId)\n .order('day_of_week')\n .order('starts_at')\n\n if (error) throw error\n return (data ?? []).map(mapRow)\n}\n\nexport async function saveSchedule(input: SaveScheduleInput): Promise<ScheduleRecord> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n\n const { data, error } = await core\n .from('schedules')\n .insert({\n tenant_id: tenantId,\n kind: input.kind ?? 'working_hours',\n assignee_id: input.assigneeId,\n location_id: input.locationId ?? null,\n day_of_week: input.dayOfWeek ?? null,\n specific_date: input.specificDate ?? null,\n starts_at: input.startsAt,\n ends_at: input.endsAt,\n is_active: input.isActive ?? true,\n })\n .select('*')\n .single()\n\n if (error) throw error\n return mapRow(data as Record<string, unknown>)\n}\n\nexport async function deleteSchedule(id: string): Promise<void> {\n const core = getCoreClient()\n const { error } = await core.from('schedules').delete().eq('id', id)\n if (error) throw error\n}\n\n/**\n * Replace all weekly schedules (day_of_week based) for an assignee.\n * Deletes existing weekly entries and creates new ones in a single flow.\n */\nexport async function replaceWeeklySchedules(\n assigneeId: string,\n week: Record<number, { enabled: boolean; periods: { startsAt: string; endsAt: string; settings?: BlockSettings }[] }>,\n kind = 'working_hours',\n): Promise<void> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n\n // Delete existing weekly schedules (day_of_week NOT NULL, specific_date IS NULL)\n const { error: delErr } = await core\n .from('schedules')\n .delete()\n .eq('assignee_id', assigneeId)\n .eq('kind', kind)\n .not('day_of_week', 'is', null)\n .is('specific_date', null)\n\n if (delErr) throw delErr\n\n // Build insert rows\n const rows: Record<string, unknown>[] = []\n for (const [dayStr, day] of Object.entries(week)) {\n if (!day.enabled) continue\n for (const period of day.periods) {\n const metadata = period.settings ? mergeBlockSettings({}, period.settings) : {}\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: assigneeId,\n day_of_week: Number(dayStr),\n specific_date: null,\n starts_at: period.startsAt,\n ends_at: period.endsAt,\n is_active: true,\n metadata,\n })\n }\n }\n\n if (rows.length > 0) {\n const { error: insErr } = await core.from('schedules').insert(rows)\n if (insErr) throw insErr\n }\n}\n\n/**\n * Enumerate all dates in a range (inclusive).\n */\nfunction eachDate(startDate: string, endDate: string): string[] {\n const dates: string[] = []\n const current = new Date(startDate + 'T00:00:00Z')\n const end = new Date(endDate + 'T00:00:00Z')\n while (current <= end) {\n dates.push(current.toISOString().slice(0, 10))\n current.setUTCDate(current.getUTCDate() + 1)\n }\n return dates\n}\n\n/**\n * Save a date-range exception.\n * type: 'unavailable' marks days off, 'available' sets custom hours.\n * Stores notes and range info in metadata for retrieval.\n */\nexport async function saveException(input: {\n assigneeId: string\n startDate: string\n endDate: string\n type: 'available' | 'unavailable'\n periods: { startsAt: string; endsAt: string }[]\n notes?: string\n settings?: BlockSettings\n kind?: string\n}): Promise<void> {\n const core = getCoreClient()\n const tenantId = getTenantId()\n const kind = input.kind ?? 'working_hours'\n const dates = eachDate(input.startDate, input.endDate)\n const isRange = dates.length > 1\n const meta = mergeBlockSettings(\n {\n ...(input.notes ? { notes: input.notes } : {}),\n ...(isRange ? { rangeStart: input.startDate, rangeEnd: input.endDate } : {}),\n exceptionType: input.type,\n },\n input.settings ?? {},\n )\n\n // Delete existing exceptions for all dates in range (single query)\n const { error: delErr } = await core\n .from('schedules')\n .delete()\n .eq('assignee_id', input.assigneeId)\n .eq('kind', kind)\n .in('specific_date', dates)\n if (delErr) throw delErr\n\n const rows: Record<string, unknown>[] = []\n\n if (input.type === 'unavailable') {\n // One sentinel row per date with is_active: false\n for (const date of dates) {\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: input.assigneeId,\n day_of_week: null,\n specific_date: date,\n starts_at: '00:00',\n ends_at: '00:00',\n is_active: false,\n metadata: meta,\n })\n }\n } else {\n // Custom available hours for each date\n for (const date of dates) {\n for (const p of input.periods) {\n rows.push({\n tenant_id: tenantId,\n kind,\n assignee_id: input.assigneeId,\n day_of_week: null,\n specific_date: date,\n starts_at: p.startsAt,\n ends_at: p.endsAt,\n is_active: true,\n metadata: meta,\n })\n }\n }\n }\n\n if (rows.length > 0) {\n const { error } = await core.from('schedules').insert(rows)\n if (error) throw error\n }\n}\n\n/**\n * Delete an exception by its start date.\n * If it was part of a range, deletes all dates in that range.\n */\nexport async function deleteException(\n assigneeId: string,\n startDate: string,\n endDate?: string,\n kind = 'working_hours',\n): Promise<void> {\n const core = getCoreClient()\n const dates = eachDate(startDate, endDate ?? startDate)\n const { error } = await core\n .from('schedules')\n .delete()\n .eq('assignee_id', assigneeId)\n .eq('kind', kind)\n .in('specific_date', dates)\n if (error) throw error\n}\n","// ---------------------------------------------------------------------------\n// Schedule Block Config Registry\n// Lightweight global config — set by the agenda plugin, read by ScheduleEditor.\n// No React context needed. Graceful degradation when not configured.\n// ---------------------------------------------------------------------------\n\nexport interface ScheduleBlockConfig {\n defaults: {\n bufferMinutes: number\n maxConcurrent: number\n minAdvanceHours: number\n maxAdvanceDays: number\n }\n /** Available services for the multi-select filter. */\n services?: { id: string; name: string }[]\n showServices?: boolean\n showConcurrent?: boolean\n showBookingWindow?: boolean\n /** Available locations for per-block assignment. */\n locations?: { id: string; name: string }[]\n showLocations?: boolean\n /** Lazy fetcher — called when locations are needed but not yet loaded. */\n fetchLocations?: () => Promise<{ id: string; name: string }[]>\n}\n\nlet globalConfig: ScheduleBlockConfig | null = null\nconst listeners = new Set<() => void>()\n\nexport function setScheduleBlockConfig(config: ScheduleBlockConfig): void {\n globalConfig = config\n listeners.forEach((fn) => fn())\n}\n\nexport function getScheduleBlockConfig(): ScheduleBlockConfig | null {\n return globalConfig\n}\n\n/** Subscribe to config changes. Returns unsubscribe function. */\nexport function subscribeScheduleBlockConfig(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n}\n","import React, { useRef, useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, ChevronDown } from 'lucide-react'\nimport type { BlockSettings } from '../../lib/schedule-service'\nimport type { ScheduleBlockConfig } from '../../lib/schedule-config'\nimport { useTranslation } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\ninterface BlockSettingsPopoverProps {\n settings: BlockSettings\n onChange: (settings: BlockSettings) => void\n config: ScheduleBlockConfig\n /** Ref to the trigger element for positioning */\n triggerRef: React.RefObject<HTMLElement | null>\n open: boolean\n onClose: () => void\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function BlockSettingsPopover({\n settings,\n onChange,\n config,\n triggerRef,\n open,\n onClose,\n}: BlockSettingsPopoverProps) {\n const t = useTranslation()\n const popoverRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState({ top: 0, left: 0 })\n\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const popW = 280\n let left = rect.left + rect.width / 2 - popW / 2\n if (left + popW > window.innerWidth - 12) left = window.innerWidth - popW - 12\n if (left < 8) left = 8\n setPos({ top: rect.bottom + 6, left })\n }, [open, triggerRef])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (popoverRef.current?.contains(e.target as Node)) return\n if (triggerRef.current?.contains(e.target as Node)) return\n onClose()\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open, onClose, triggerRef])\n\n if (!open) return null\n\n const showServices = config.showServices !== false && config.services && config.services.length > 0\n const showConcurrent = config.showConcurrent !== false\n const showBookingWindow = config.showBookingWindow !== false\n const showLocations = config.showLocations === true && config.locations && config.locations.length > 0\n\n function update(patch: Partial<BlockSettings>) {\n onChange({ ...settings, ...patch })\n }\n\n return createPortal(\n <div\n ref={popoverRef}\n style={{ position: 'fixed', top: pos.top, left: pos.left, zIndex: 9999 }}\n className=\"fayz-glass-surface w-[280px] rounded-xl border bg-popover shadow-xl\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-3 py-2.5 border-b\">\n <span className=\"text-xs font-semibold\">{t('schedule.blockSettings.title')}</span>\n <button type=\"button\" onClick={onClose} className=\"p-0.5 rounded text-muted-foreground hover:text-foreground\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n <div className=\"p-3 space-y-3\">\n {/* Location select */}\n {showLocations && (\n <LocationSelect\n locations={config.locations!}\n value={settings.locationId}\n onChange={(id) => update({ locationId: id || undefined })}\n />\n )}\n\n {/* Services multi-select */}\n {showServices && (\n <ServiceSelect\n services={config.services!}\n selected={settings.allowedServiceIds ?? []}\n onChange={(ids) => update({ allowedServiceIds: ids.length > 0 ? ids : undefined })}\n />\n )}\n\n {/* Max concurrent */}\n {showConcurrent && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.maxConcurrent')}</label>\n <div className=\"flex items-center gap-2 mt-1\">\n <button\n type=\"button\"\n onClick={() => update({ maxConcurrent: Math.max(1, (settings.maxConcurrent ?? config.defaults.maxConcurrent) - 1) })}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border text-sm hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n -\n </button>\n <span className=\"text-sm font-medium w-6 text-center\">\n {settings.maxConcurrent ?? config.defaults.maxConcurrent}\n </span>\n <button\n type=\"button\"\n onClick={() => update({ maxConcurrent: (settings.maxConcurrent ?? config.defaults.maxConcurrent) + 1 })}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border text-sm hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n +\n </button>\n </div>\n </div>\n )}\n\n {/* Booking window */}\n {showBookingWindow && (\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.minAdvance')}</label>\n <div className=\"flex items-center gap-1 mt-1\">\n <input\n type=\"number\"\n min={0}\n value={settings.minAdvanceHours ?? config.defaults.minAdvanceHours}\n onChange={(e) => update({ minAdvanceHours: Number(e.target.value) || 0 })}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1 text-xs tabular-nums\"\n />\n <span className=\"text-[10px] text-muted-foreground shrink-0\">{t('schedule.blockSettings.hrs')}</span>\n </div>\n </div>\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.maxAdvance')}</label>\n <div className=\"flex items-center gap-1 mt-1\">\n <input\n type=\"number\"\n min={1}\n value={settings.maxAdvanceDays ?? config.defaults.maxAdvanceDays}\n onChange={(e) => update({ maxAdvanceDays: Number(e.target.value) || 30 })}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1 text-xs tabular-nums\"\n />\n <span className=\"text-[10px] text-muted-foreground shrink-0\">{t('schedule.blockSettings.days')}</span>\n </div>\n </div>\n </div>\n )}\n\n {/* Label */}\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.label')}</label>\n <input\n type=\"text\"\n value={settings.label ?? ''}\n onChange={(e) => update({ label: e.target.value || undefined })}\n placeholder={t('schedule.blockSettings.labelPlaceholder')}\n className=\"mt-1 w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1 text-xs placeholder:text-muted-foreground/40\"\n />\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Service multi-select (simple dropdown with checkboxes)\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Location select (custom dropdown)\n// ---------------------------------------------------------------------------\n\nfunction LocationSelect({\n locations,\n value,\n onChange,\n}: {\n locations: { id: string; name: string }[]\n value: string | undefined\n onChange: (id: string) => void\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const current = value ? locations.find((l) => l.id === value) : null\n const label = current ? current.name : t('schedule.blockSettings.noLocation')\n\n return (\n <div ref={ref} className=\"relative\">\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.location')}</label>\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n className=\"mt-1 flex items-center justify-between w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1.5 text-xs hover:bg-muted/30 transition-colors\"\n >\n <span className={current ? '' : 'text-muted-foreground'}>{label}</span>\n <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 z-10 mt-1 w-full max-h-40 overflow-y-auto rounded-lg border bg-popover shadow-lg py-1\">\n <button\n type=\"button\"\n onClick={() => { onChange(''); setOpen(false) }}\n className={`block w-full px-2.5 py-1.5 text-xs text-left transition-colors ${!value ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'}`}\n >\n {t('schedule.blockSettings.noLocation')}\n </button>\n {locations.map((l) => (\n <button\n key={l.id}\n type=\"button\"\n onClick={() => { onChange(l.id); setOpen(false) }}\n className={`block w-full px-2.5 py-1.5 text-xs text-left transition-colors ${l.id === value ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'}`}\n >\n {l.name}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Service multi-select (simple dropdown with checkboxes)\n// ---------------------------------------------------------------------------\n\nfunction ServiceSelect({\n services,\n selected,\n onChange,\n}: {\n services: { id: string; name: string }[]\n selected: string[]\n onChange: (ids: string[]) => void\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const allSelected = selected.length === 0\n const label = allSelected\n ? t('schedule.blockSettings.allServices')\n : selected.length === 1\n ? services.find((s) => s.id === selected[0])?.name ?? t('schedule.blockSettings.oneService')\n : t('schedule.blockSettings.nServices', { count: selected.length })\n\n function toggle(id: string) {\n onChange(selected.includes(id) ? selected.filter((s) => s !== id) : [...selected, id])\n }\n\n return (\n <div ref={ref} className=\"relative\">\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('schedule.blockSettings.allowedServices')}</label>\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n className=\"mt-1 flex items-center justify-between w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 py-1.5 text-xs hover:bg-muted/30 transition-colors\"\n >\n <span className={allSelected ? 'text-muted-foreground' : ''}>{label}</span>\n <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 z-10 mt-1 w-full max-h-40 overflow-y-auto rounded-lg border bg-popover shadow-lg py-1\">\n <button\n type=\"button\"\n onClick={() => onChange([])}\n className={`block w-full px-2.5 py-1.5 text-xs text-left transition-colors ${allSelected ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'}`}\n >\n {t('schedule.blockSettings.allServices')}\n </button>\n {services.map((s) => {\n const checked = selected.includes(s.id)\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => toggle(s.id)}\n className={`flex items-center gap-2 w-full px-2.5 py-1.5 text-xs text-left transition-colors ${checked ? 'bg-primary/5' : 'hover:bg-muted/50'}`}\n >\n <span className={`flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-sm border ${\n checked ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground/30'\n }`}>\n {checked && <svg className=\"h-2.5 w-2.5\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className=\"truncate\">{s.name}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback, useRef, useSyncExternalStore } from 'react'\nimport { Clock, Plus, Trash2, Copy, Save, CalendarOff, CalendarPlus, Check, Settings, X } from 'lucide-react'\nimport { toast } from '@fayz-ai/ui'\nimport {\n getSchedules,\n replaceWeeklySchedules,\n saveException,\n deleteException,\n parseBlockSettings,\n} from '../../lib/schedule-service'\nimport type { ScheduleRecord, BlockSettings } from '../../lib/schedule-service'\nimport { getScheduleBlockConfig, subscribeScheduleBlockConfig } from '../../lib/schedule-config'\nimport type { ScheduleBlockConfig } from '../../lib/schedule-config'\nimport { useTranslation } from '@fayz-ai/core'\nimport { BlockSettingsPopover } from './BlockSettingsPopover'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { DatePicker } from '@fayz-ai/ui'\nimport { TimePicker } from '@fayz-ai/ui'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@fayz-ai/ui'\nimport { Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription } from '@fayz-ai/ui'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DAY_KEYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']\nconst WEEK_ORDER = [1, 2, 3, 4, 5, 6, 0] // Mon–Sun display order\n\ninterface Period {\n id?: string\n startsAt: string\n endsAt: string\n settings?: BlockSettings\n}\n\ninterface DaySchedule {\n enabled: boolean\n periods: Period[]\n}\n\ntype WeekSchedule = Record<number, DaySchedule>\n\ninterface ExceptionEntry {\n startDate: string\n endDate: string\n type: 'available' | 'unavailable'\n periods: { startsAt: string; endsAt: string }[]\n notes: string\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction schedulesToWeek(schedules: ScheduleRecord[]): WeekSchedule {\n const week: WeekSchedule = {}\n for (let i = 0; i < 7; i++) {\n week[i] = { enabled: false, periods: [] }\n }\n for (const s of schedules) {\n if (s.dayOfWeek == null || s.specificDate != null) continue\n const day = week[s.dayOfWeek]\n if (s.isActive) {\n day.enabled = true\n const settings = parseBlockSettings(s.metadata ?? {})\n const hasSettings = Object.values(settings).some((v) => v !== undefined)\n day.periods.push({\n id: s.id,\n startsAt: s.startsAt,\n endsAt: s.endsAt,\n settings: hasSettings ? settings : undefined,\n })\n }\n }\n for (const day of Object.values(week)) {\n day.periods.sort((a, b) => a.startsAt.localeCompare(b.startsAt))\n }\n return week\n}\n\nfunction schedulesToExceptions(schedules: ScheduleRecord[]): ExceptionEntry[] {\n // Group by range key (rangeStart–rangeEnd or single date)\n const map = new Map<string, ExceptionEntry>()\n for (const s of schedules) {\n if (!s.specificDate) continue\n const meta = (s.metadata ?? {}) as Record<string, unknown>\n const rangeStart = (meta.rangeStart as string) ?? s.specificDate\n const rangeEnd = (meta.rangeEnd as string) ?? s.specificDate\n const key = `${rangeStart}__${rangeEnd}`\n const exType = (meta.exceptionType as string) === 'available' ? 'available' : 'unavailable'\n const notes = (meta.notes as string) ?? ''\n\n const existing = map.get(key)\n if (!existing) {\n map.set(key, {\n startDate: rangeStart,\n endDate: rangeEnd,\n type: exType,\n periods: s.isActive ? [{ startsAt: s.startsAt, endsAt: s.endsAt }] : [],\n notes,\n })\n } else if (s.isActive && s.specificDate === rangeStart) {\n existing.periods.push({ startsAt: s.startsAt, endsAt: s.endsAt })\n }\n }\n return Array.from(map.values()).sort((a, b) => a.startDate.localeCompare(b.startDate))\n}\n\nfunction formatDate(dateStr: string): string {\n const d = new Date(dateStr + 'T00:00:00')\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// PeriodRow — single time block as a horizontal row\n// ---------------------------------------------------------------------------\n\ninterface PeriodRowProps {\n period: Period\n dayOfWeek: number\n blockConfig: ScheduleBlockConfig | null\n settingsOpen: boolean\n onUpdateTime: (field: 'startsAt' | 'endsAt', value: string) => void\n onUpdateBuffer: (value: number) => void\n onUpdateSettings: (settings: BlockSettings) => void\n onRemove: () => void\n onAddBlock: () => void\n onCopyToAll: () => void\n onToggleSettings: () => void\n onCloseSettings: () => void\n}\n\nfunction PeriodRow({\n period, blockConfig, dayOfWeek,\n settingsOpen, onUpdateTime, onUpdateBuffer, onUpdateSettings,\n onRemove, onCopyToAll, onToggleSettings, onCloseSettings,\n onAddBlock,\n}: PeriodRowProps) {\n const t = useTranslation()\n const gearRef = useRef<HTMLButtonElement>(null)\n const bufferValue = period.settings?.bufferMinutes ?? blockConfig?.defaults.bufferMinutes ?? 0\n const hasCustomSettings = period.settings && Object.entries(period.settings).some(\n ([k, v]) => k !== 'bufferMinutes' && v !== undefined,\n )\n const dayName = t(`schedule.days.${DAY_KEYS[dayOfWeek]}`)\n\n return (\n <TooltipProvider delayDuration={300}>\n <div className=\"flex items-center gap-1.5 group\">\n {/* Label */}\n {period.settings?.label && (\n <span className=\"text-[10px] font-medium text-primary bg-primary/10 rounded-full px-2 py-0.5 shrink-0\">\n {period.settings.label}\n </span>\n )}\n\n {/* Time range */}\n <TimePicker value={period.startsAt} onChange={(v) => onUpdateTime('startsAt', v)} interval={30} className=\"w-[90px]\" />\n <span className=\"text-xs text-muted-foreground/50\">-</span>\n <TimePicker value={period.endsAt} onChange={(v) => onUpdateTime('endsAt', v)} interval={30} min={period.startsAt} className=\"w-[90px]\" />\n\n {/* Buffer pill */}\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex items-center gap-1 rounded-full border bg-muted/30 px-2 py-1 shrink-0\">\n <input\n type=\"number\"\n min={0}\n max={120}\n value={bufferValue}\n onChange={(e) => onUpdateBuffer(Number(e.target.value) || 0)}\n className=\"w-8 bg-transparent text-xs text-center tabular-nums outline-none\"\n />\n <span className=\"text-[10px] text-muted-foreground\">{t('schedule.editor.min')}</span>\n </div>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.bufferTooltip')}</TooltipContent>\n </Tooltip>\n\n {/* Actions */}\n <div className=\"flex items-center gap-0.5 shrink-0 ml-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onRemove}\n className=\"p-1.5 rounded-md text-muted-foreground/30 hover:text-destructive hover:bg-destructive/5 transition-colors\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.removeInterval')}</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onAddBlock}\n className=\"p-1.5 rounded-md text-muted-foreground/30 hover:text-foreground hover:bg-muted transition-colors\">\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.newInterval', { day: dayName })}</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" onClick={onCopyToAll}\n className=\"p-1.5 rounded-md text-muted-foreground/30 hover:text-foreground hover:bg-muted transition-colors\">\n <Copy className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.copyToAll')}</TooltipContent>\n </Tooltip>\n\n {blockConfig && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button ref={gearRef} type=\"button\" onClick={onToggleSettings}\n className={`p-1.5 rounded-md transition-colors ${\n hasCustomSettings\n ? 'text-primary bg-primary/5'\n : 'text-muted-foreground/30 hover:text-foreground hover:bg-muted'\n }`}>\n <Settings className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.blockSettings.title')}</TooltipContent>\n </Tooltip>\n )}\n </div>\n\n {/* Settings popover */}\n {blockConfig && (\n <BlockSettingsPopover\n settings={period.settings ?? {}}\n onChange={onUpdateSettings}\n config={blockConfig}\n triggerRef={gearRef}\n open={settingsOpen}\n onClose={onCloseSettings}\n />\n )}\n </div>\n </TooltipProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\ninterface ScheduleEditorProps {\n assigneeId: string\n}\n\nexport function ScheduleEditor({ assigneeId }: ScheduleEditorProps) {\n const t = useTranslation()\n const [week, setWeek] = useState<WeekSchedule>({})\n const [exceptions, setExceptions] = useState<ExceptionEntry[]>([])\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [showAddException, setShowAddException] = useState(false)\n const blockConfig = useSyncExternalStore(subscribeScheduleBlockConfig, getScheduleBlockConfig)\n const [settingsPopover, setSettingsPopover] = useState<{ dayOfWeek: number; idx: number } | null>(null)\n const [weekDirty, setWeekDirty] = useState(false)\n\n // Lazy-fetch locations when showLocations is enabled but locations aren't loaded yet\n useEffect(() => {\n if (blockConfig?.showLocations && (!blockConfig.locations || blockConfig.locations.length === 0) && blockConfig.fetchLocations) {\n blockConfig.fetchLocations().catch(() => {})\n }\n }, [blockConfig?.showLocations, blockConfig?.locations?.length])\n\n // New exception form state\n const [newExStartDate, setNewExStartDate] = useState('')\n const [newExEndDate, setNewExEndDate] = useState('')\n const [newExType, setNewExType] = useState<'unavailable' | 'available'>('unavailable')\n const [newExPeriods, setNewExPeriods] = useState([{ startsAt: '09:00', endsAt: '17:00' }])\n const [newExNotes, setNewExNotes] = useState('')\n const [savingException, setSavingException] = useState(false)\n\n const loadData = useCallback(async () => {\n setLoading(true)\n try {\n const data = await getSchedules(assigneeId)\n setWeek(schedulesToWeek(data))\n setExceptions(schedulesToExceptions(data))\n setWeekDirty(false)\n } catch {\n toast.error(t('schedule.editor.failedToLoad'))\n }\n setLoading(false)\n }, [assigneeId])\n\n useEffect(() => {\n loadData()\n }, [loadData])\n\n // --- Weekly hours handlers ---\n\n function markDirty() { setWeekDirty(true) }\n\n function toggleDay(dayOfWeek: number) {\n markDirty()\n setWeek((prev) => ({\n ...prev,\n [dayOfWeek]: {\n ...prev[dayOfWeek],\n enabled: !prev[dayOfWeek]?.enabled,\n periods: prev[dayOfWeek]?.enabled ? [] : [{ startsAt: '09:00', endsAt: '18:00' }],\n },\n }))\n }\n\n function updatePeriod(dayOfWeek: number, idx: number, field: 'startsAt' | 'endsAt', value: string) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const periods = [...day.periods]\n periods[idx] = { ...periods[idx], [field]: value }\n return { ...prev, [dayOfWeek]: { ...day, periods } }\n })\n }\n\n function addPeriod(dayOfWeek: number) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const last = day.periods[day.periods.length - 1]\n day.periods = [...day.periods, { startsAt: last?.endsAt ?? '13:00', endsAt: '18:00' }]\n return { ...prev, [dayOfWeek]: day }\n })\n }\n\n function removePeriod(dayOfWeek: number, idx: number) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n day.periods = day.periods.filter((_, i) => i !== idx)\n if (day.periods.length === 0) day.enabled = false\n return { ...prev, [dayOfWeek]: day }\n })\n }\n\n function updatePeriodSettings(dayOfWeek: number, idx: number, settings: BlockSettings) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const periods = [...day.periods]\n periods[idx] = { ...periods[idx], settings }\n return { ...prev, [dayOfWeek]: { ...day, periods } }\n })\n }\n\n function updateBufferMinutes(dayOfWeek: number, idx: number, value: number) {\n markDirty()\n setWeek((prev) => {\n const day = { ...prev[dayOfWeek] }\n const periods = [...day.periods]\n const existing = periods[idx].settings ?? {}\n periods[idx] = { ...periods[idx], settings: { ...existing, bufferMinutes: value || undefined } }\n return { ...prev, [dayOfWeek]: { ...day, periods } }\n })\n }\n\n function copyToAll(sourceDayOfWeek: number) {\n markDirty()\n const source = week[sourceDayOfWeek]\n if (!source) return\n setWeek((prev) => {\n const next = { ...prev }\n for (let i = 0; i < 7; i++) {\n if (i === sourceDayOfWeek) continue\n next[i] = {\n enabled: source.enabled,\n periods: source.periods.map((p) => ({ startsAt: p.startsAt, endsAt: p.endsAt, settings: p.settings ? { ...p.settings } : undefined })),\n }\n }\n return next\n })\n }\n\n async function handleSaveWeekly() {\n setSaving(true)\n try {\n await replaceWeeklySchedules(assigneeId, week)\n toast.success(t('schedule.editor.saved'))\n loadData()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToSave'), { description: err?.message })\n }\n setSaving(false)\n }\n\n // --- Exception handlers ---\n\n async function handleAddException() {\n if (!newExStartDate) {\n toast.error(t('schedule.editor.selectStartDate'))\n return\n }\n const endDate = newExEndDate || newExStartDate\n if (endDate < newExStartDate) {\n toast.error(t('schedule.editor.endDateAfterStart'))\n return\n }\n setSavingException(true)\n try {\n await saveException({\n assigneeId,\n startDate: newExStartDate,\n endDate,\n type: newExType,\n periods: newExType === 'unavailable' ? [] : newExPeriods,\n notes: newExNotes || undefined,\n })\n toast.success(t('schedule.editor.exceptionAdded'))\n setShowAddException(false)\n setNewExStartDate('')\n setNewExEndDate('')\n setNewExType('unavailable')\n setNewExPeriods([{ startsAt: '09:00', endsAt: '17:00' }])\n setNewExNotes('')\n loadData()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToSaveException'), { description: err?.message })\n }\n setSavingException(false)\n }\n\n async function handleDeleteException(startDate: string, endDate: string) {\n try {\n await deleteException(assigneeId, startDate, endDate)\n toast.success(t('schedule.editor.exceptionRemoved'))\n loadData()\n } catch (err: any) {\n toast.error(t('schedule.editor.failedToDelete'), { description: err?.message })\n }\n }\n\n // --- Render ---\n\n if (loading) {\n return (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-9 w-9 rounded-lg\" />\n <div className=\"space-y-1.5\"><Skeleton className=\"h-4 w-36\" /><Skeleton className=\"h-3 w-48\" /></div>\n </div>\n <Skeleton className=\"h-8 w-20 rounded-md\" />\n </div>\n <Card>\n <CardContent className=\"p-0 divide-y\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-4 py-3\">\n <Skeleton className=\"h-5 w-5 rounded-full\" />\n <Skeleton className=\"h-4 w-8\" />\n {i < 5 ? (\n <>\n <Skeleton className=\"h-8 w-24 rounded-lg\" />\n <Skeleton className=\"h-3 w-3\" />\n <Skeleton className=\"h-8 w-24 rounded-lg\" />\n </>\n ) : (\n <Skeleton className=\"h-4 w-20\" />\n )}\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-9 w-9 rounded-lg\" />\n <div className=\"space-y-1.5\"><Skeleton className=\"h-4 w-32\" /><Skeleton className=\"h-3 w-44\" /></div>\n </div>\n <Skeleton className=\"h-8 w-32 rounded-md\" />\n </div>\n <Card><CardContent className=\"flex items-center justify-center py-8\"><Skeleton className=\"h-3 w-48\" /></CardContent></Card>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* ---- Weekly Working Hours ---- */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10\">\n <Clock className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">{t('schedule.editor.weeklyTitle')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('schedule.editor.weeklyDescription')}</p>\n </div>\n </div>\n {weekDirty && (\n <Button size=\"sm\" onClick={handleSaveWeekly} disabled={saving}>\n <Save className=\"h-4 w-4 mr-1.5\" />\n {saving ? t('common.saving') : t('common.save')}\n </Button>\n )}\n </div>\n\n {/* Day rows */}\n <Card>\n <CardContent className=\"p-0 divide-y\">\n {WEEK_ORDER.map((dayOfWeek) => {\n const day = week[dayOfWeek] ?? { enabled: false, periods: [] }\n return (\n <div\n key={dayOfWeek}\n className={`flex items-start gap-4 px-4 py-3 transition-colors ${day.enabled ? '' : 'bg-muted/20'}`}\n >\n {/* Day toggle checkbox + label */}\n <button\n type=\"button\"\n onClick={() => toggleDay(dayOfWeek)}\n className=\"flex items-center gap-2.5 w-20 shrink-0 pt-1.5\"\n >\n <span className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full transition-all ${\n day.enabled\n ? 'bg-primary text-primary-foreground shadow-sm'\n : 'border-2 border-muted-foreground/25 hover:border-muted-foreground/40'\n }`}>\n {day.enabled && <Check className=\"h-3 w-3\" strokeWidth={3} />}\n </span>\n <span className={`text-sm font-medium ${day.enabled ? '' : 'text-muted-foreground/40'}`}>\n {t(`schedule.days.${DAY_KEYS[dayOfWeek]}`)}\n </span>\n </button>\n\n {/* Content */}\n {day.enabled ? (\n <div className=\"flex-1 space-y-2\">\n {day.periods.map((period, idx) => (\n <PeriodRow\n key={idx}\n period={period}\n dayOfWeek={dayOfWeek}\n blockConfig={blockConfig}\n settingsOpen={settingsPopover?.dayOfWeek === dayOfWeek && settingsPopover?.idx === idx}\n onUpdateTime={(field, v) => updatePeriod(dayOfWeek, idx, field, v)}\n onUpdateBuffer={(v) => updateBufferMinutes(dayOfWeek, idx, v)}\n onUpdateSettings={(s) => updatePeriodSettings(dayOfWeek, idx, s)}\n onRemove={() => removePeriod(dayOfWeek, idx)}\n onAddBlock={() => addPeriod(dayOfWeek)}\n onCopyToAll={() => copyToAll(dayOfWeek)}\n onToggleSettings={() => setSettingsPopover(\n settingsPopover?.dayOfWeek === dayOfWeek && settingsPopover?.idx === idx ? null : { dayOfWeek, idx }\n )}\n onCloseSettings={() => setSettingsPopover(null)}\n />\n ))}\n </div>\n ) : (\n <TooltipProvider delayDuration={300}>\n <div className=\"flex items-center gap-2 pt-1.5\">\n <span className=\"text-sm text-muted-foreground/40\">{t('schedule.editor.unavailable')}</span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => toggleDay(dayOfWeek)}\n className=\"flex h-6 w-6 items-center justify-center rounded-full border border-muted-foreground/25 text-muted-foreground/40 hover:border-foreground/40 hover:text-foreground hover:bg-muted transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('schedule.editor.addHoursFor', { day: t(`schedule.days.${DAY_KEYS[dayOfWeek]}`) })}</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )}\n </div>\n )\n })}\n </CardContent>\n </Card>\n </div>\n\n {/* ---- Date Exceptions ---- */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-orange-500/10\">\n <CalendarOff className=\"h-4 w-4 text-orange-600\" />\n </div>\n <div>\n <h3 className=\"text-sm font-semibold\">{t('schedule.editor.exceptionsTitle')}</h3>\n <p className=\"text-xs text-muted-foreground\">{t('schedule.editor.exceptionsDescription')}</p>\n </div>\n </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setShowAddException(true)}\n >\n <CalendarPlus className=\"h-4 w-4 mr-1.5\" />\n {t('schedule.editor.addException')}\n </Button>\n </div>\n\n {/* Add exception modal */}\n <Modal open={showAddException} onOpenChange={setShowAddException}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle>{t('schedule.editor.addException')}</ModalTitle>\n <ModalDescription>{t('schedule.editor.exceptionsDescription')}</ModalDescription>\n </ModalHeader>\n\n <ModalBody className=\"space-y-5\">\n {/* Date range */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.startDate')}</label>\n <DatePicker\n value={newExStartDate}\n onChange={(v) => {\n setNewExStartDate(v)\n if (!newExEndDate || v > newExEndDate) setNewExEndDate(v)\n }}\n />\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.endDate')}</label>\n <DatePicker\n value={newExEndDate || newExStartDate}\n onChange={setNewExEndDate}\n />\n </div>\n </div>\n\n {/* Type — segmented tabs */}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.type')}</label>\n <Tabs value={newExType} onValueChange={(v) => setNewExType(v as 'unavailable' | 'available')}>\n <TabsList className=\"h-9 w-full\">\n <TabsTrigger value=\"unavailable\" className=\"text-xs gap-1.5 flex-1\">\n <CalendarOff className=\"h-3.5 w-3.5\" />\n {t('schedule.editor.unavailable')}\n </TabsTrigger>\n <TabsTrigger value=\"available\" className=\"text-xs gap-1.5 flex-1\">\n <Clock className=\"h-3.5 w-3.5\" />\n {t('schedule.editor.customHours')}\n </TabsTrigger>\n </TabsList>\n </Tabs>\n </div>\n\n {/* Custom hours — only when type=available */}\n {newExType === 'available' && (\n <div className=\"space-y-3\">\n <label className=\"text-xs font-medium text-muted-foreground\">{t('schedule.editor.workingHours')}</label>\n {newExPeriods.map((period, idx) => (\n <div key={idx} className=\"flex items-center gap-3\">\n <TimePicker\n value={period.startsAt}\n onChange={(v) => {\n const updated = [...newExPeriods]\n updated[idx] = { ...updated[idx], startsAt: v }\n setNewExPeriods(updated)\n }}\n interval={30}\n className=\"flex-1\"\n />\n <span className=\"text-xs text-muted-foreground shrink-0\">{t('schedule.editor.to')}</span>\n <TimePicker\n value={period.endsAt}\n onChange={(v) => {\n const updated = [...newExPeriods]\n updated[idx] = { ...updated[idx], endsAt: v }\n setNewExPeriods(updated)\n }}\n interval={30}\n min={period.startsAt}\n className=\"flex-1\"\n />\n {newExPeriods.length > 1 && (\n <button\n type=\"button\"\n onClick={() => setNewExPeriods(newExPeriods.filter((_, i) => i !== idx))}\n className=\"p-1.5 rounded-md text-muted-foreground hover:text-destructive hover:bg-destructive/5 transition-colors shrink-0\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const last = newExPeriods[newExPeriods.length - 1]\n setNewExPeriods([...newExPeriods, { startsAt: last?.endsAt ?? '13:00', endsAt: '18:00' }])\n }}\n className=\"flex items-center gap-1 text-xs text-primary hover:underline\"\n >\n <Plus className=\"h-3 w-3\" /> {t('schedule.editor.addTimeBlock')}\n </button>\n </div>\n )}\n\n {/* Notes */}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground mb-1.5 block\">{t('schedule.editor.notes')}</label>\n <input\n type=\"text\"\n value={newExNotes}\n onChange={(e) => setNewExNotes(e.target.value)}\n placeholder={t('schedule.editor.notesPlaceholder')}\n className=\"block w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm placeholder:text-muted-foreground/40 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\"\n />\n </div>\n </ModalBody>\n\n <ModalFooter>\n <Button variant=\"ghost\" onClick={() => setShowAddException(false)}>\n {t('common.cancel')}\n </Button>\n <Button onClick={handleAddException} disabled={savingException}>\n <Save className=\"h-3.5 w-3.5 mr-1.5\" />\n {savingException ? t('common.saving') : t('schedule.editor.saveException')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Exception list */}\n {exceptions.length > 0 ? (\n <Card>\n <CardContent className=\"p-0 divide-y\">\n {exceptions.map((ex) => {\n const isRange = ex.startDate !== ex.endDate\n const dateLabel = isRange\n ? `${formatDate(ex.startDate)} — ${formatDate(ex.endDate)}`\n : formatDate(ex.startDate)\n return (\n <div key={ex.startDate + ex.endDate} className=\"flex items-center justify-between px-4 py-3 group\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {/* Type indicator dot */}\n <span className={`h-2.5 w-2.5 shrink-0 rounded-full ${\n ex.type === 'unavailable' ? 'bg-destructive' : 'bg-success'\n }`} />\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-medium\">{dateLabel}</span>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {ex.type === 'unavailable' ? t('schedule.editor.unavailable') : t('schedule.editor.customHours')}\n </Badge>\n {ex.type === 'available' && ex.periods.length > 0 && (\n <span className=\"text-xs text-muted-foreground\">\n {ex.periods.map((p) => `${p.startsAt} — ${p.endsAt}`).join(', ')}\n </span>\n )}\n </div>\n {ex.notes && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">{ex.notes}</p>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleDeleteException(ex.startDate, ex.endDate)}\n className=\"p-1.5 rounded-md text-muted-foreground hover:text-destructive hover:bg-destructive/5 transition-colors shrink-0 ml-2\"\n title={t('schedule.editor.removeException')}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n })}\n </CardContent>\n </Card>\n ) : (\n !showAddException && (\n <Card>\n <CardContent className=\"flex items-center justify-center py-8 text-sm text-muted-foreground\">\n {t('schedule.editor.noExceptions')}\n </CardContent>\n </Card>\n )\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Clock, FileText, CalendarDays } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { ScheduleEditor } from './ScheduleEditor'\nimport { useTranslation } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional as usePluginsOptional } from '@fayz-ai/core'\nimport { getWidgetsForZone } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\n// AccessTab is imported from ./AccessTab\n\nexport function ActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.activity.title')}\n description={t('crud.archetype.activity.description')}\n />\n )\n}\n\nexport function DocumentsTab({ item }: { item?: any }) {\n const t = useTranslation()\n const runtime = usePluginsOptional()\n\n // Check if a plugin provides a documents widget (e.g., custom_forms)\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.documents') : []\n\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget\n item={item}\n config={w.config}\n runtime={runtime?.context}\n plugin={w.plugin}\n widget={w}\n />\n )\n }\n\n return (\n <ComingSoon\n icon={FileText}\n title={t('crud.archetype.documents.title')}\n description={t('crud.archetype.documents.description')}\n />\n )\n}\n\nexport function ScheduleTab({ item }: { item: any }) {\n const t = useTranslation()\n if (!item?.id) {\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.schedule.title')}\n description={t('crud.archetype.schedule.description')}\n />\n )\n }\n return <ScheduleEditor assigneeId={item.id} />\n}\n\nexport const PERSON_DETAIL_TABS = [\n { id: 'schedule', label: 'Schedule', icon: 'CalendarDays', component: ScheduleTab, visibleFor: ['staff'] },\n { id: 'documents', label: 'Documents', icon: 'FileText', component: DocumentsTab },\n { id: 'activity', label: 'Activity', icon: 'Clock', component: ActivityTab },\n]\n","import React from 'react'\nimport { BarChart3, Truck, Tag, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function InventoryTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={BarChart3}\n title={t('crud.archetype.inventory.title')}\n description={t('crud.archetype.inventory.description')}\n />\n )\n}\n\nexport function SuppliersTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Truck}\n title={t('crud.archetype.suppliers.title')}\n description={t('crud.archetype.suppliers.description')}\n />\n )\n}\n\nexport function PricingTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Tag}\n title={t('crud.archetype.pricing.title')}\n description={t('crud.archetype.pricing.description')}\n />\n )\n}\n\nexport function ProductActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.productActivity.title')}\n description={t('crud.archetype.productActivity.description')}\n />\n )\n}\n\nexport const PRODUCT_DETAIL_TABS = [\n { id: 'inventory', label: 'Inventory', component: InventoryTab },\n { id: 'suppliers', label: 'Suppliers', component: SuppliersTab },\n { id: 'pricing', label: 'Pricing', component: PricingTab },\n { id: 'activity', label: 'Activity', component: ProductActivityTab },\n]\n","import React from 'react'\nimport { CalendarDays, Tag, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function AvailabilityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.availability.title')}\n description={t('crud.archetype.availability.description')}\n />\n )\n}\n\nexport function ServicePricingTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Tag}\n title={t('crud.archetype.servicePricing.title')}\n description={t('crud.archetype.servicePricing.description')}\n />\n )\n}\n\nexport function ServiceActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.serviceActivity.title')}\n description={t('crud.archetype.serviceActivity.description')}\n />\n )\n}\n\nexport const SERVICE_DETAIL_TABS = [\n { id: 'availability', label: 'Availability', component: AvailabilityTab },\n { id: 'pricing', label: 'Pricing', component: ServicePricingTab },\n { id: 'activity', label: 'Activity', component: ServiceActivityTab },\n]\n","import React from 'react'\nimport { Users, CalendarDays, BarChart3, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function MembersTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Users}\n title={t('crud.archetype.members.title')}\n description={t('crud.archetype.members.description')}\n />\n )\n}\n\nexport function LocationScheduleTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.locationSchedule.title')}\n description={t('crud.archetype.locationSchedule.description')}\n />\n )\n}\n\nexport function LocationStatsTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={BarChart3}\n title={t('crud.archetype.locationStats.title')}\n description={t('crud.archetype.locationStats.description')}\n />\n )\n}\n\nexport function LocationActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.locationActivity.title')}\n description={t('crud.archetype.locationActivity.description')}\n />\n )\n}\n\nexport const LOCATION_DETAIL_TABS = [\n { id: 'members', label: 'Team', component: MembersTab },\n { id: 'schedule', label: 'Hours', component: LocationScheduleTab },\n { id: 'stats', label: 'Statistics', component: LocationStatsTab },\n { id: 'activity', label: 'Activity', component: LocationActivityTab },\n]\n","import React from 'react'\nimport { ExternalLink } from 'lucide-react'\n\ninterface EntityLinkProps {\n /** The entity ID to link to */\n entityId: string\n /** The base path of the CRUD page (e.g. '/registry/tutors') */\n basePath: string\n /** Display label */\n children: React.ReactNode\n /** Optional className */\n className?: string\n}\n\n/**\n * Reusable link to a CRUD entity detail page.\n * Uses hash-based routing: navigates to `#basePath/entityId`\n */\nexport function EntityLink({ entityId, basePath, children, className }: EntityLinkProps) {\n const href = `#${basePath}/${entityId}`\n\n return (\n <a\n href={href}\n className={`inline-flex items-center gap-1 text-primary hover:underline transition-colors ${className ?? ''}`}\n >\n {children}\n <ExternalLink className=\"h-3 w-3 opacity-50\" />\n </a>\n )\n}\n\n/**\n * Registry of known entity paths by person kind.\n * Projects can extend this via the `registerEntityPath` function.\n */\nconst ENTITY_PATHS: Record<string, string> = {\n customer: '/registry/tutors',\n professional: '/registry/veterinarians',\n organization: '/registry/clinics',\n supplier: '/registry/suppliers',\n staff: '/registry/staff',\n}\n\n/** Register a custom path for a person kind */\nexport function registerEntityPath(kind: string, basePath: string) {\n ENTITY_PATHS[kind] = basePath\n}\n\n/** Get the CRUD base path for a person kind */\nexport function getPersonPath(kind: string): string | null {\n return ENTITY_PATHS[kind] ?? null\n}\n\n/**\n * Smart link that auto-resolves the path based on person kind.\n * Falls back to non-linked text if no path is registered.\n */\nexport function PersonLink({ personId, kind, children, className }: {\n personId: string\n kind: string\n children: React.ReactNode\n className?: string\n}) {\n const basePath = getPersonPath(kind)\n if (!basePath) {\n return <span className={className}>{children}</span>\n }\n return (\n <EntityLink entityId={personId} basePath={basePath} className={className}>\n {children}\n </EntityLink>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { User, Clock, FileText } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { PersonLink } from './EntityLink'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function OwnerTab({ item }: { item: any }) {\n const t = useTranslation()\n const [person, setPerson] = useState<any>(null)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n const tutorId = item?.tutorId\n if (!tutorId) { setLoading(false); return }\n\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) { setLoading(false); return }\n\n supabase.schema('saas_core')\n .from('persons')\n .select('*')\n .eq('id', tutorId)\n .single()\n .then(({ data }: any) => {\n setPerson(data)\n setLoading(false)\n }, () => setLoading(false))\n }, [item?.tutorId])\n\n if (loading) {\n return (\n <Card>\n <CardContent className=\"py-8 flex justify-center\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-muted border-t-primary\" />\n </CardContent>\n </Card>\n )\n }\n\n if (!person) {\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <User className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.owner.noOwner')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('crud.archetype.owner.assignHint')}</p>\n </CardContent>\n </Card>\n )\n }\n\n const fields = [\n { label: t('crud.archetype.owner.name'), value: person.name },\n { label: t('crud.archetype.owner.phone'), value: person.phone, href: person.phone ? `tel:${person.phone}` : undefined },\n { label: t('crud.archetype.owner.email'), value: person.email, href: person.email ? `mailto:${person.email}` : undefined },\n { label: t('crud.archetype.owner.document'), value: person.document_number },\n { label: t('crud.archetype.owner.address'), value: [person.address, person.city, person.state].filter(Boolean).join(', ') },\n ].filter((f) => f.value)\n\n return (\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex items-start gap-4 mb-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <User className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1\">\n <PersonLink personId={person.id} kind={person.kind} className=\"text-base font-semibold\">\n {person.name}\n </PersonLink>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Badge variant=\"secondary\" className=\"text-[10px] capitalize\">{person.kind}</Badge>\n <Badge variant={person.is_active ? 'default' : 'secondary'} className=\"text-[10px]\">\n {person.is_active ? t('crud.archetype.owner.active') : t('crud.archetype.owner.inactive')}\n </Badge>\n </div>\n </div>\n </div>\n <dl className=\"divide-y\">\n {fields.map((f) => (\n <div key={f.label} className=\"grid grid-cols-3 gap-4 py-2.5\">\n <dt className=\"text-sm text-muted-foreground\">{f.label}</dt>\n <dd className=\"col-span-2 text-sm\">\n {f.href ? (\n <a href={f.href} className=\"text-primary hover:underline\">{f.value}</a>\n ) : f.value}\n </dd>\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n )\n}\n\nexport function SubjectHistoryTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.history.title')}\n description={t('crud.archetype.history.description')}\n />\n )\n}\n\nexport function SubjectDocumentsTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={FileText}\n title={t('crud.archetype.subjectDocuments.title')}\n description={t('crud.archetype.subjectDocuments.description')}\n />\n )\n}\n\nexport const SUBJECT_DETAIL_TABS = [\n { id: 'owner', label: 'Owner', component: OwnerTab },\n { id: 'history', label: 'History', component: SubjectHistoryTab },\n { id: 'documents', label: 'Documents', component: SubjectDocumentsTab },\n]\n","import React, { useCallback } from 'react'\nimport { Edit, Trash2, Eye, Shield, CalendarDays, FileText, Clock, Package, Users, DollarSign, MapPin, BarChart3, Briefcase, ShoppingBag } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Breadcrumb } from '@fayz-ai/ui'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@fayz-ai/ui'\nimport { Separator } from '@fayz-ai/ui'\nimport { WidgetSlot } from '../plugins/WidgetSlot'\nimport { formatCurrency } from '@fayz-ai/core'\nimport { PERSON_DETAIL_TABS } from './archetypes/PersonDetailTabs'\nimport { PRODUCT_DETAIL_TABS } from './archetypes/ProductDetailTabs'\nimport { SERVICE_DETAIL_TABS } from './archetypes/ServiceDetailTabs'\nimport { LOCATION_DETAIL_TABS } from './archetypes/LocationDetailTabs'\nimport { SUBJECT_DETAIL_TABS } from './archetypes/SubjectDetailTabs'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { EntityDef, FieldDef, FieldGroup, FormLayout, DetailTab } from '@fayz-ai/core'\n\ninterface CrudDetailPageProps {\n entityDef: EntityDef\n item: Record<string, any>\n namePlural: string\n basePath: string\n initialTab?: string\n onBack: () => void\n onEdit?: () => void\n onDelete?: () => void\n feature?: string\n /** Embedded mode — compact hero, no breadcrumb, no hash nav. For use inside modals/panels. */\n embedded?: boolean\n}\n\nfunction formatValue(field: FieldDef, value: any, t?: (key: string) => string): React.ReactNode {\n if (value == null || value === '') return <span className=\"text-muted-foreground/50\">—</span>\n\n if (field.renderCell) return field.renderCell(value, {})\n\n switch (field.type) {\n case 'boolean':\n return (\n <Badge variant={value ? 'default' : 'secondary'}>\n {value ? (t?.('common.yes') ?? 'Yes') : (t?.('common.no') ?? 'No')}\n </Badge>\n )\n case 'currency': {\n const num = typeof value === 'number' ? value : parseFloat(value)\n return isNaN(num) ? value : formatCurrency(num, field.currency)\n }\n case 'color':\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"h-5 w-5 rounded-full border shrink-0\" style={{ backgroundColor: String(value) }} />\n <span className=\"text-xs font-mono text-muted-foreground\">{String(value)}</span>\n </span>\n )\n case 'date':\n try { return new Date(value).toLocaleDateString() } catch { return value }\n case 'datetime':\n try { return new Date(value).toLocaleString() } catch { return value }\n case 'select': {\n const options = (field.options ?? []).map((o) => typeof o === 'string' ? { label: o, value: o } : o)\n const match = options.find((o) => o.value === value)\n return <Badge variant=\"secondary\">{match?.label ?? value}</Badge>\n }\n case 'image':\n return value ? (\n <img src={value} alt=\"\" className=\"h-16 w-16 rounded-lg object-cover\" />\n ) : null\n case 'email':\n return <a href={`mailto:${value}`} className=\"text-primary hover:underline\">{value}</a>\n case 'phone':\n return <a href={`tel:${value}`} className=\"text-primary hover:underline\">{value}</a>\n case 'url':\n return <a href={value} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-primary hover:underline\">{value}</a>\n case 'textarea':\n return <p className=\"whitespace-pre-wrap\">{value}</p>\n default:\n return String(value)\n }\n}\n\nfunction FieldRow({ field, value, t, compact }: { field: FieldDef; value: any; t?: (key: string) => string; compact?: boolean }) {\n return (\n <div className={`grid grid-cols-3 gap-4 ${compact ? 'py-1.5' : 'py-3'}`}>\n <dt className={`font-medium text-muted-foreground ${compact ? 'text-xs' : 'text-sm'}`}>{field.label}</dt>\n <dd className={`col-span-2 text-foreground ${compact ? 'text-xs' : 'text-sm'}`}>{formatValue(field, value, t)}</dd>\n </div>\n )\n}\n\nfunction FieldGroupSection({\n group,\n fields,\n item,\n compact,\n}: {\n group: FieldGroup\n fields: FieldDef[]\n item: Record<string, any>\n compact?: boolean\n}) {\n const tFn = useTranslation()\n const cols = group.columns ?? 2\n\n return (\n <div>\n <h3 className={`font-semibold text-foreground ${compact ? 'text-xs mb-0.5' : 'text-sm mb-1'}`}>{group.label}</h3>\n {group.description && (\n <p className={`text-muted-foreground ${compact ? 'text-[10px] mb-1.5' : 'text-xs mb-3'}`}>{group.description}</p>\n )}\n <Card>\n <CardContent className=\"p-0\">\n <dl className={`grid divide-y ${cols >= 2 ? 'md:grid-cols-2 md:divide-y-0' : ''}`}>\n {fields.map((field) => (\n <div key={field.key} className={compact ? 'px-3' : 'px-5'}>\n <FieldRow field={field} value={item[field.key]} t={tFn} compact={compact} />\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nfunction OverviewTab({\n entityDef,\n item,\n compact,\n}: {\n entityDef: EntityDef\n item: Record<string, any>\n compact?: boolean\n}) {\n const tFn = useTranslation()\n const detailFields = entityDef.fields.filter(\n (f) => f.showInDetail !== false && f.key !== 'id' && f.key !== entityDef.displayField && f.key !== entityDef.imageField\n )\n\n // Group fields\n const groups = entityDef.fieldGroups ?? []\n const ungroupedFields = detailFields.filter((f) => !f.group)\n\n // Build group → fields map\n const groupFieldMap = new Map<string, FieldDef[]>()\n for (const field of detailFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n }\n }\n\n return (\n <div className={compact ? 'space-y-3' : 'space-y-6'}>\n {/* Ungrouped fields */}\n {ungroupedFields.length > 0 && (\n <Card>\n <CardContent className=\"p-0\">\n <dl className=\"divide-y\">\n {ungroupedFields.map((field) => (\n <div key={field.key} className={compact ? 'px-3' : 'px-5'}>\n <FieldRow field={field} value={item[field.key]} t={tFn} compact={compact} />\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n )}\n\n {/* Grouped fields */}\n {groups.map((group) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return null\n return (\n <FieldGroupSection key={group.id} group={group} fields={fields} item={item} compact={compact} />\n )\n })}\n\n {/* Catch any grouped fields without a matching FieldGroup definition */}\n {Array.from(groupFieldMap.entries()).map(([groupId, fields]) => {\n if (groups.some((g) => g.id === groupId)) return null\n return (\n <FieldGroupSection\n key={groupId}\n group={{ id: groupId, label: groupId.charAt(0).toUpperCase() + groupId.slice(1) }}\n fields={fields}\n item={item}\n compact={compact}\n />\n )\n })}\n </div>\n )\n}\n\nfunction getArchetypeTabs(layout?: FormLayout, archetypeKind?: string): DetailTab[] {\n let tabs: DetailTab[]\n switch (layout) {\n case 'person':\n tabs = PERSON_DETAIL_TABS\n break\n case 'product':\n tabs = PRODUCT_DETAIL_TABS\n break\n case 'service':\n tabs = SERVICE_DETAIL_TABS\n break\n case 'location':\n tabs = LOCATION_DETAIL_TABS\n break\n case 'subject':\n tabs = SUBJECT_DETAIL_TABS\n break\n default:\n tabs = []\n }\n if (archetypeKind) {\n tabs = tabs.filter((tab) => !tab.visibleFor || tab.visibleFor.includes(archetypeKind))\n }\n return tabs\n}\n\nconst TAB_ICONS: Record<string, LucideIcon> = {\n Shield, CalendarDays, FileText, Clock, Package, Users, DollarSign, MapPin, BarChart3, Briefcase, ShoppingBag,\n}\n\nexport function CrudDetailPage({\n entityDef,\n item,\n namePlural,\n basePath,\n initialTab,\n onBack,\n onEdit,\n onDelete,\n feature,\n embedded,\n}: CrudDetailPageProps) {\n const t = useTranslation()\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const displayValue = item[displayField] ?? 'Untitled'\n const subtitleValue = entityDef.subtitleField ? item[entityDef.subtitleField] : null\n const imageValue = entityDef.imageField ? item[entityDef.imageField] : null\n const initial = typeof displayValue === 'string' ? displayValue.charAt(0).toUpperCase() : '?'\n\n // Merge archetype tabs + custom entity tabs\n const archetypeTabs = getArchetypeTabs(entityDef.layout, entityDef.data?.archetypeKind)\n const customTabs = [...archetypeTabs, ...(entityDef.detailTabs ?? [])]\n const entityId = entityDef.name.toLowerCase().replace(/\\s+/g, '-')\n const widgetZone = `${entityId}.detail.tabs`\n\n // Resolve initial tab — validate it exists, fallback to \"overview\"\n const validTabs = ['overview', ...customTabs.map((t) => t.id)]\n const activeTab = initialTab && validTabs.includes(initialTab) ? initialTab : 'overview'\n\n const handleTabChange = useCallback((value: string) => {\n if (embedded) return\n const detailPath = `${basePath}/${item.id}`\n const newHash = value === 'overview' ? detailPath : `${detailPath}/${value}`\n window.history.replaceState(null, '', `#${newHash}`)\n }, [basePath, item.id, embedded])\n\n return (\n <div className={embedded ? 'space-y-4' : 'space-y-6'}>\n {/* Breadcrumb — hidden in embedded mode */}\n {!embedded && <Breadcrumb parent={namePlural} current={displayValue} onBack={onBack} />}\n\n {/* Hero */}\n <div className={`flex items-start ${embedded ? 'gap-3' : 'gap-5'}`}>\n {/* Avatar / Image */}\n {imageValue ? (\n <img\n src={imageValue}\n alt={displayValue}\n className={`shrink-0 object-cover shadow-sm ${embedded ? 'h-10 w-10 rounded-xl' : 'h-20 w-20 rounded-2xl'}`}\n />\n ) : (\n <div className={`flex shrink-0 items-center justify-center bg-primary/10 text-primary font-bold shadow-sm ${embedded ? 'h-10 w-10 rounded-xl text-sm' : 'h-20 w-20 rounded-2xl text-2xl'}`}>\n {initial}\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h1 className={`font-bold text-foreground truncate ${embedded ? 'text-base' : 'text-2xl'}`}>{displayValue}</h1>\n {item.status && (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {typeof item.status === 'string' ? item.status.charAt(0).toUpperCase() + item.status.slice(1) : item.status}\n </Badge>\n )}\n {item.is_active !== undefined && (\n <Badge variant={item.is_active ? 'default' : 'secondary'} className=\"shrink-0\">\n {item.is_active ? t('common.active') : t('common.inactive')}\n </Badge>\n )}\n </div>\n {subtitleValue && (\n <p className={`text-muted-foreground mt-0.5 ${embedded ? 'text-xs' : ''}`}>{subtitleValue}</p>\n )}\n </div>\n\n {(onEdit || onDelete) && (\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {onEdit && (\n <Button variant=\"outline\" size={embedded ? 'xs' as any : 'sm'} onClick={onEdit} className={embedded ? 'h-7 px-2 text-xs gap-1' : ''}>\n <Edit className={embedded ? 'h-3 w-3' : 'h-4 w-4 mr-1.5'} />\n {t('common.edit')}\n </Button>\n )}\n {onDelete && (\n <Button variant=\"outline\" size={embedded ? 'xs' as any : 'sm'} className={`text-destructive hover:text-destructive ${embedded ? 'h-7 w-7 p-0' : ''}`} onClick={onDelete}>\n <Trash2 className={embedded ? 'h-3 w-3' : 'h-4 w-4'} />\n </Button>\n )}\n </div>\n )}\n </div>\n\n {!embedded && <Separator />}\n\n {/* Tabs */}\n <Tabs defaultValue={activeTab} onValueChange={handleTabChange}>\n <TabsList className={`max-w-full justify-start overflow-x-auto scrollbar-none${embedded ? ' h-8' : ''}`}>\n <TabsTrigger value=\"overview\" className={`gap-1.5 ${embedded ? 'text-xs px-2 py-1' : ''}`}>\n <Eye className={embedded ? 'h-3 w-3' : 'h-3.5 w-3.5'} />\n {t('common.overview')}\n </TabsTrigger>\n {customTabs.map((tab) => {\n const translated = t(`crud.tabs.${tab.id}`)\n const label = translated.startsWith('crud.tabs.') ? tab.label : translated\n const TabIcon = tab.icon ? (TAB_ICONS[tab.icon] ?? null) : null\n return (\n <TabsTrigger key={tab.id} value={tab.id} className={`gap-1.5 ${embedded ? 'text-xs px-2 py-1' : ''}`}>\n {TabIcon && <TabIcon className={embedded ? 'h-3 w-3' : 'h-3.5 w-3.5'} />}\n {label}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n <TabsContent value=\"overview\" className={embedded ? 'mt-2' : 'mt-4'}>\n <OverviewTab entityDef={entityDef} item={item} compact={embedded} />\n </TabsContent>\n\n {customTabs.map((tab) => (\n <TabsContent key={tab.id} value={tab.id} className=\"mt-4\">\n {tab.component ? (\n React.createElement(tab.component, { item, entityDef, ...(tab.props ?? {}) })\n ) : (\n <Card>\n <CardContent className=\"flex items-center justify-center py-12\">\n <p className=\"text-muted-foreground\">{t('common.noContent')}</p>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n ))}\n </Tabs>\n\n {/* Widget zone for plugin tab injection */}\n <WidgetSlot zone={widgetZone} />\n </div>\n )\n}\n","import React from 'react'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\ninterface DeleteConfirmDialogProps {\n open: boolean\n onClose: () => void\n onConfirm: () => void\n entityName: string\n displayValue?: string\n}\n\nexport function DeleteConfirmDialog({ open, onClose, onConfirm, entityName, displayValue }: DeleteConfirmDialogProps) {\n const t = useTranslation()\n return (\n <Modal open={open} onOpenChange={(isOpen) => { if (!isOpen) onClose() }}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('crud.delete.title', { entity: entityName })}</ModalTitle>\n <ModalDescription>\n {displayValue\n ? t('crud.delete.confirmNamed', { name: displayValue })\n : t('crud.delete.confirmGeneric', { entity: entityName.toLowerCase() })}\n </ModalDescription>\n </ModalHeader>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common.cancel')}</Button>\n <Button variant=\"destructive\" onClick={onConfirm}>{t('common.delete')}</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n Download, Upload, ArrowRight, ArrowLeft, Check, AlertCircle,\n Loader2, FileSpreadsheet, X, ChevronDown,\n} from 'lucide-react'\nimport {\n Modal, ModalContent, ModalHeader, ModalBody,\n ModalTitle,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FieldDef, EntityDef } from '@fayz-ai/core'\n\ntype ImportStep = 'download' | 'upload' | 'mapping' | 'importing' | 'done'\n\ninterface ImportWizardProps {\n open: boolean\n onClose: () => void\n entityDef: EntityDef\n onImport: (\n rows: Record<string, any>[],\n onProgress: (processed: number, total: number) => void,\n ) => Promise<{ success: number; errors: ImportRowError[] }>\n}\n\nexport interface ImportRowError {\n row: number\n message: string\n}\n\ninterface ParsedCSV {\n headers: string[]\n rows: string[][]\n}\n\n// ---------------------------------------------------------------------------\n// CSV utilities\n// ---------------------------------------------------------------------------\n\nfunction getImportableFields(entityDef: EntityDef): FieldDef[] {\n return entityDef.fields.filter(\n (f) => f.showInForm !== false && f.key !== 'id' && f.type !== 'image',\n )\n}\n\nfunction generateSampleCSV(fields: FieldDef[]): string {\n const headers = fields.map((f) => f.label)\n const sampleRow = fields.map((f) => {\n switch (f.type) {\n case 'email': return 'example@email.com'\n case 'phone': return '+5511999999999'\n case 'number': return '0'\n case 'currency': return '0.00'\n case 'date': return '2025-01-01'\n case 'datetime': return '2025-01-01T09:00'\n case 'time': return '09:00'\n case 'boolean': return 'true'\n case 'select': {\n const opts = f.options ?? []\n const first = typeof opts[0] === 'string' ? opts[0] : opts[0]?.value\n return first ?? ''\n }\n default: return ''\n }\n })\n return [headers.join(','), sampleRow.join(',')].join('\\n')\n}\n\nfunction downloadCSV(content: string, filename: string) {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + content], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nfunction parseCSV(text: string): ParsedCSV {\n const lines = text.split(/\\r?\\n/).filter((l) => l.trim().length > 0)\n if (lines.length === 0) return { headers: [], rows: [] }\n\n const parse = (line: string): string[] => {\n const result: string[] = []\n let current = ''\n let inQuotes = false\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]\n if (ch === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"'\n i++\n } else {\n inQuotes = !inQuotes\n }\n } else if (ch === ',' && !inQuotes) {\n result.push(current.trim())\n current = ''\n } else {\n current += ch\n }\n }\n result.push(current.trim())\n return result\n }\n\n const headers = parse(lines[0])\n const rows = lines.slice(1).map(parse)\n return { headers, rows }\n}\n\nfunction coerceValue(value: string, field: FieldDef): any {\n const trimmed = value.trim()\n if (trimmed === '') return null\n switch (field.type) {\n case 'number':\n case 'currency': {\n const num = Number(trimmed.replace(',', '.'))\n return isNaN(num) ? null : num\n }\n case 'boolean':\n return ['true', '1', 'yes', 'sim', 'verdadeiro'].includes(trimmed.toLowerCase())\n default:\n return trimmed\n }\n}\n\n// ---------------------------------------------------------------------------\n// Step indicator\n// ---------------------------------------------------------------------------\n\nconst STEPS: ImportStep[] = ['download', 'upload', 'mapping', 'importing']\n\nfunction StepIndicator({ current }: { current: ImportStep }) {\n const t = useTranslation()\n const labels: Record<ImportStep, string> = {\n download: t('crud.import.step.download'),\n upload: t('crud.import.step.upload'),\n mapping: t('crud.import.step.mapping'),\n importing: t('crud.import.step.importing'),\n done: '',\n }\n const currentIdx = STEPS.indexOf(current === 'done' ? 'importing' : current)\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {STEPS.map((step, i) => {\n const isDone = i < currentIdx || current === 'done'\n const isActive = step === current\n return (\n <React.Fragment key={step}>\n {i > 0 && <div className={cn('h-px w-6', isDone ? 'bg-primary' : 'bg-border')} />}\n <div className=\"flex items-center gap-1.5\">\n <div\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium',\n isDone\n ? 'bg-primary text-primary-foreground'\n : isActive\n ? 'border-2 border-primary text-primary'\n : 'border-2 border-muted-foreground/30 text-muted-foreground',\n )}\n >\n {isDone ? <Check className=\"h-3 w-3\" /> : i + 1}\n </div>\n <span className={cn('text-xs hidden sm:inline', isActive ? 'text-foreground font-medium' : 'text-muted-foreground')}>\n {labels[step]}\n </span>\n </div>\n </React.Fragment>\n )\n })}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 1: Download sample\n// ---------------------------------------------------------------------------\n\nfunction DownloadStep({\n entityDef,\n fields,\n onNext,\n}: {\n entityDef: EntityDef\n fields: FieldDef[]\n onNext: () => void\n}) {\n const t = useTranslation()\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n\n const handleDownload = () => {\n const csv = generateSampleCSV(fields)\n downloadCSV(csv, `${namePlural.toLowerCase().replace(/\\s+/g, '-')}-template.csv`)\n }\n\n return (\n <div className=\"flex flex-col items-center text-center gap-6 py-4\">\n <div className=\"h-16 w-16 rounded-2xl bg-primary/10 flex items-center justify-center\">\n <FileSpreadsheet className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"space-y-2 max-w-sm\">\n <h3 className=\"text-base font-semibold\">{t('crud.import.downloadTitle')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('crud.import.downloadDescription', { entity: namePlural.toLowerCase() })}\n </p>\n </div>\n <div className=\"flex flex-col gap-3 w-full max-w-xs\">\n <Button variant=\"outline\" onClick={handleDownload} className=\"w-full\">\n <Download className=\"h-4 w-4 mr-2\" />\n {t('crud.import.downloadTemplate')}\n </Button>\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.import.downloadHint', { count: String(fields.length) })}\n </p>\n </div>\n <Button onClick={onNext} className=\"mt-2\">\n {t('crud.import.alreadyHaveFile')}\n <ArrowRight className=\"h-4 w-4 ml-2\" />\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 2: Upload file\n// ---------------------------------------------------------------------------\n\nfunction UploadStep({\n onParsed,\n onBack,\n}: {\n onParsed: (csv: ParsedCSV, fileName: string) => void\n onBack: () => void\n}) {\n const t = useTranslation()\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const processFile = (file: File) => {\n setError(null)\n if (!file.name.endsWith('.csv')) {\n setError(t('crud.import.invalidFile'))\n return\n }\n const reader = new FileReader()\n reader.onload = (e) => {\n const text = e.target?.result as string\n const parsed = parseCSV(text)\n if (parsed.headers.length === 0) {\n setError(t('crud.import.emptyFile'))\n return\n }\n if (parsed.rows.length === 0) {\n setError(t('crud.import.noRows'))\n return\n }\n onParsed(parsed, file.name)\n }\n reader.readAsText(file)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const file = e.dataTransfer.files[0]\n if (file) processFile(file)\n }\n\n return (\n <div className=\"flex flex-col items-center gap-6 py-4\">\n <div\n onDragOver={(e) => { e.preventDefault(); setDragOver(true) }}\n onDragLeave={() => setDragOver(false)}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n className={cn(\n 'flex flex-col items-center justify-center gap-3 w-full max-w-sm rounded-xl border-2 border-dashed p-8 cursor-pointer transition-colors',\n dragOver ? 'border-primary bg-primary/5' : 'border-muted-foreground/25 hover:border-muted-foreground/50',\n )}\n >\n <Upload className=\"h-8 w-8 text-muted-foreground\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">{t('crud.import.uploadTitle')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('crud.import.uploadHint')}</p>\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\".csv\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) processFile(file)\n }}\n />\n </div>\n {error && (\n <div className=\"flex items-center gap-2 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n {error}\n </div>\n )}\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n {t('common.back')}\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 3: Column mapping\n// ---------------------------------------------------------------------------\n\nfunction MappingStep({\n csv,\n fileName,\n fields,\n onConfirm,\n onBack,\n}: {\n csv: ParsedCSV\n fileName: string\n fields: FieldDef[]\n onConfirm: (mapping: Map<number, FieldDef>) => void\n onBack: () => void\n}) {\n const t = useTranslation()\n\n // Auto-map by label match (case-insensitive)\n const initialMapping = useMemo(() => {\n const map = new Map<number, FieldDef | null>()\n for (let i = 0; i < csv.headers.length; i++) {\n const header = csv.headers[i].toLowerCase().trim()\n const match = fields.find(\n (f) => f.label.toLowerCase() === header || f.key.toLowerCase() === header,\n )\n map.set(i, match ?? null)\n }\n return map\n }, [csv.headers, fields])\n\n const [mapping, setMapping] = useState(initialMapping)\n\n const mappedCount = Array.from(mapping.values()).filter(Boolean).length\n const previewRows = csv.rows.slice(0, 3)\n\n const handleSelect = (colIdx: number, fieldKey: string) => {\n setMapping((prev) => {\n const next = new Map(prev)\n if (fieldKey === '__ignore__') {\n next.set(colIdx, null)\n } else {\n const field = fields.find((f) => f.key === fieldKey) ?? null\n // Remove this field from any other column\n for (const [idx, f] of next) {\n if (f?.key === fieldKey) next.set(idx, null)\n }\n next.set(colIdx, field)\n }\n return next\n })\n }\n\n const handleConfirm = () => {\n const validMapping = new Map<number, FieldDef>()\n for (const [idx, field] of mapping) {\n if (field) validMapping.set(idx, field)\n }\n onConfirm(validMapping)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium\">{t('crud.import.mappingTitle')}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {t('crud.import.mappingDescription', {\n file: fileName,\n columns: String(csv.headers.length),\n rows: String(csv.rows.length),\n })}\n </p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {t('crud.import.mappedCount', { count: String(mappedCount), total: String(csv.headers.length) })}\n </span>\n </div>\n\n <div className=\"overflow-x-auto border rounded-lg\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]\">\n {t('crud.import.csvColumn')}\n </th>\n <th className=\"text-center w-[10%] px-2\">\n <ArrowRight className=\"h-3.5 w-3.5 mx-auto text-muted-foreground\" />\n </th>\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]\">\n {t('crud.import.mapsTo')}\n </th>\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[20%]\">\n {t('crud.import.preview')}\n </th>\n </tr>\n </thead>\n <tbody>\n {csv.headers.map((header, idx) => {\n const mapped = mapping.get(idx)\n return (\n <tr key={idx} className=\"border-b last:border-0\">\n <td className=\"py-2 px-3\">\n <span className=\"font-mono text-xs bg-muted px-1.5 py-0.5 rounded\">{header}</span>\n </td>\n <td className=\"text-center px-2\">\n <ArrowRight className=\"h-3 w-3 mx-auto text-muted-foreground/50\" />\n </td>\n <td className=\"py-2 px-3\">\n <div className=\"relative\">\n <select\n value={mapped?.key ?? '__ignore__'}\n onChange={(e) => handleSelect(idx, e.target.value)}\n className={cn(\n 'w-full appearance-none rounded-md border bg-background px-2.5 py-1.5 pr-8 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-ring',\n mapped ? 'text-foreground' : 'text-muted-foreground',\n )}\n >\n <option value=\"__ignore__\">{t('crud.import.skip')}</option>\n {fields.map((f) => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n </div>\n </td>\n <td className=\"py-2 px-3\">\n <span className=\"text-xs text-muted-foreground truncate block max-w-[140px]\">\n {previewRows[0]?.[idx] ?? '—'}\n </span>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between pt-2\">\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n {t('common.back')}\n </Button>\n <Button onClick={handleConfirm} disabled={mappedCount === 0}>\n {t('crud.import.startImport')}\n <ArrowRight className=\"h-4 w-4 ml-2\" />\n </Button>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 4: Importing + Done\n// ---------------------------------------------------------------------------\n\nfunction ImportingStep({\n result,\n progress,\n totalRows,\n onClose,\n}: {\n result: { success: number; errors: ImportRowError[] } | null\n progress: { processed: number; total: number } | null\n totalRows: number\n onClose: () => void\n}) {\n const t = useTranslation()\n\n if (!result) {\n const processed = progress?.processed ?? 0\n const total = progress?.total ?? totalRows\n const percent = total > 0 ? Math.round((processed / total) * 100) : 0\n\n return (\n <div className=\"flex flex-col items-center gap-6 py-8\">\n <div className=\"relative h-16 w-16 flex items-center justify-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-primary\" />\n </div>\n\n <div className=\"text-center space-y-1\">\n <p className=\"text-sm font-medium\">{t('crud.import.importing')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.import.progressCount', { processed: String(processed), total: String(total) })}\n </p>\n </div>\n\n {/* Progress bar */}\n <div className=\"w-full max-w-xs space-y-2\">\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-500 ease-out\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-center tabular-nums\">\n {percent}%\n </p>\n </div>\n </div>\n )\n }\n\n const hasErrors = result.errors.length > 0\n\n return (\n <div className=\"flex flex-col items-center gap-5 py-4\">\n <div className={cn(\n 'h-16 w-16 rounded-2xl flex items-center justify-center',\n hasErrors ? 'bg-warning/10' : 'bg-success/10',\n )}>\n {hasErrors ? (\n <AlertCircle className=\"h-8 w-8 text-warning\" />\n ) : (\n <Check className=\"h-8 w-8 text-success\" />\n )}\n </div>\n\n <div className=\"text-center space-y-1\">\n <h3 className=\"text-base font-semibold\">\n {hasErrors ? t('crud.import.doneWithErrors') : t('crud.import.doneSuccess')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('crud.import.doneCount', {\n success: String(result.success),\n total: String(totalRows),\n })}\n </p>\n </div>\n\n {/* Completed progress bar */}\n <div className=\"w-full max-w-xs\">\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n hasErrors ? 'bg-warning' : 'bg-success',\n )}\n style={{ width: '100%' }}\n />\n </div>\n </div>\n\n {hasErrors && (\n <div className=\"w-full max-w-sm max-h-40 overflow-y-auto rounded-lg border\">\n <div className=\"divide-y\">\n {result.errors.slice(0, 20).map((err, i) => (\n <div key={i} className=\"flex items-start gap-2 px-3 py-2 text-xs\">\n <span className=\"text-muted-foreground shrink-0 tabular-nums\">\n {t('crud.import.rowNumber', { row: String(err.row) })}\n </span>\n <span className=\"text-destructive\">{err.message}</span>\n </div>\n ))}\n {result.errors.length > 20 && (\n <div className=\"px-3 py-2 text-xs text-muted-foreground text-center\">\n +{result.errors.length - 20} more\n </div>\n )}\n </div>\n </div>\n )}\n\n <Button onClick={onClose}>{t('common.done')}</Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main wizard\n// ---------------------------------------------------------------------------\n\nexport function ImportWizard({ open, onClose, entityDef, onImport }: ImportWizardProps) {\n const t = useTranslation()\n const [step, setStep] = useState<ImportStep>('download')\n const [csv, setCsv] = useState<ParsedCSV | null>(null)\n const [fileName, setFileName] = useState('')\n const [result, setResult] = useState<{ success: number; errors: ImportRowError[] } | null>(null)\n const [progress, setProgress] = useState<{ processed: number; total: number } | null>(null)\n\n const fields = useMemo(() => getImportableFields(entityDef), [entityDef])\n\n const handleClose = () => {\n setStep('download')\n setCsv(null)\n setFileName('')\n setResult(null)\n setProgress(null)\n onClose()\n }\n\n const handleParsed = (parsed: ParsedCSV, name: string) => {\n setCsv(parsed)\n setFileName(name)\n setStep('mapping')\n }\n\n const handleConfirmMapping = useCallback(async (mapping: Map<number, FieldDef>) => {\n if (!csv) return\n setStep('importing')\n setResult(null)\n setProgress(null)\n\n // Transform CSV rows → record objects using mapping\n const rows: Record<string, any>[] = csv.rows.map((row) => {\n const record: Record<string, any> = {}\n for (const [colIdx, field] of mapping) {\n const rawValue = row[colIdx] ?? ''\n record[field.key] = coerceValue(rawValue, field)\n }\n return record\n })\n\n try {\n const res = await onImport(rows, (processed, total) => {\n setProgress({ processed, total })\n })\n setResult(res)\n setStep('done')\n } catch (err: any) {\n setResult({ success: 0, errors: [{ row: 0, message: err?.message ?? 'Import failed' }] })\n setStep('done')\n }\n }, [csv, onImport])\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) handleClose() }}>\n <ModalContent size=\"xl\">\n <ModalHeader>\n <ModalTitle>{t('crud.import.title', { entity: namePlural })}</ModalTitle>\n <div className=\"pt-2\">\n <StepIndicator current={step} />\n </div>\n </ModalHeader>\n\n <ModalBody>\n {step === 'download' && (\n <DownloadStep\n entityDef={entityDef}\n fields={fields}\n onNext={() => setStep('upload')}\n />\n )}\n {step === 'upload' && (\n <UploadStep\n onParsed={handleParsed}\n onBack={() => setStep('download')}\n />\n )}\n {step === 'mapping' && csv && (\n <MappingStep\n csv={csv}\n fileName={fileName}\n fields={fields}\n onConfirm={handleConfirmMapping}\n onBack={() => setStep('upload')}\n />\n )}\n {(step === 'importing' || step === 'done') && (\n <ImportingStep\n result={result}\n progress={progress}\n totalRows={csv?.rows.length ?? 0}\n onClose={handleClose}\n />\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n","import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nexport function exportToCSV<T extends Record<string, any>>(\n items: T[],\n entityDef: EntityDef,\n): void {\n const columns: CSVColumn[] = entityDef.fields\n .filter((f) => f.showInTable !== false)\n .map((f) => ({ key: f.key, label: f.label }))\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const filename = `${namePlural.toLowerCase().replace(/\\s+/g, '-')}-export`\n\n exportCSV(columns, items, filename)\n}\n","import type { FieldDef } from '@fayz-ai/core'\n\n// Tenant field-rule overrides (required / visibility / custom fields). Currently\n// a permissive identity pass-through; tenant-level customization (blueprint\n// §4.11 \"Regras de Campos\") plugs in here later without changing call sites.\nexport function useFieldRules(_entityKey: string): {\n applyRules: (fields: FieldDef[]) => FieldDef[]\n} {\n return { applyRules: (fields) => fields }\n}\n","import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'\nimport { Pencil, Trash2 } from 'lucide-react'\nimport type { ColumnDef as TanStackColumnDef } from '@tanstack/react-table'\nimport { useOrganizationStore } from '../org'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Card } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { CrudFormPage } from './CrudFormPage'\nimport { CrudListView, type CrudFacet } from './CrudListView'\nimport { CrudDetailPage } from './CrudDetailPage'\nimport { DeleteConfirmDialog } from './DeleteConfirmDialog'\nimport { ImportWizard } from './ImportWizard'\nimport { exportToCSV } from './csv-export'\nimport { fieldToColumns } from './fieldToColumn'\nimport { PermissionGate } from '../permissions/PermissionGate'\nimport { useFieldRules } from '../hooks/useFieldRules'\nimport { deriveEntityKey } from '@fayz-ai/core'\nimport { toast } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { CrudStore } from '../stores/createCrudStore'\nimport type { ImportRowError } from './ImportWizard'\n\ntype CrudDisplay = 'table' | 'cards'\n\ninterface CrudPageProps<T extends { id: string }> {\n entityDef: EntityDef<T>\n useStore: () => CrudStore<T>\n basePath: string\n display: CrudDisplay\n feature?: string\n /** If true, hides create/edit/delete actions — list and detail view only */\n readOnly?: boolean\n}\n\nfunction getRouteDepth(sub: string): number {\n if (sub === '' || sub === '/') return 0 // list\n if (sub === '/new') return 1 // create\n if (sub.endsWith('/edit')) return 2 // edit\n return 1 // detail\n}\n\nfunction normalizeCrudBasePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/+/g, '/')\n return normalized.length > 1 ? normalized.replace(/\\/+$/, '') : normalized\n}\n\nfunction crudPath(basePath: string, ...parts: Array<string | undefined>): string {\n return normalizeCrudBasePath([basePath, ...parts.filter(Boolean)].join('/'))\n}\n\nfunction setCrudHash(basePath: string, ...parts: Array<string | undefined>): void {\n window.location.hash = crudPath(basePath, ...parts)\n}\n\nfunction useSubRoute(basePath: string) {\n const normalizedBasePath = normalizeCrudBasePath(basePath)\n const getSub = () => {\n const hash = normalizeCrudBasePath(window.location.hash.slice(1) || '/')\n if (hash === normalizedBasePath) return ''\n return hash.startsWith(`${normalizedBasePath}/`) ? hash.slice(normalizedBasePath.length) : ''\n }\n\n const [sub, setSub] = useState(getSub)\n const [direction, setDirection] = useState<'forward' | 'back'>('forward')\n const prevDepthRef = useRef(getRouteDepth(getSub()))\n\n useEffect(() => {\n const handler = () => {\n const next = getSub()\n const nextDepth = getRouteDepth(next)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setSub(next)\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [normalizedBasePath])\n\n return { sub, direction }\n}\n\n/** Convert our FieldDef-based columns to TanStack ColumnDef for DataTable */\nfunction useCrudColumns<T extends { id: string }>(\n entityDef: EntityDef<T>,\n options?: {\n basePath?: string\n onDelete?: (item: T) => void\n onInlineUpdate?: (id: string, field: string, value: any) => void\n feature?: string\n readOnly?: boolean\n },\n): TanStackColumnDef<T, any>[] {\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const cols = fieldToColumns(entityDef.fields, { onInlineUpdate: options?.onInlineUpdate })\n\n return useMemo(() => {\n const tanCols: TanStackColumnDef<T, any>[] = cols.map((col) => ({\n accessorKey: col.key,\n header: col.label,\n enableSorting: col.sortable,\n cell: ({ row }: any) => {\n const value = row.original[col.key]\n const rendered = col.render(value, row.original)\n return col.key === displayField\n ? <span className=\"font-medium text-foreground\">{rendered}</span>\n : rendered\n },\n }))\n\n // Actions column\n if (!options?.readOnly && options?.basePath) {\n tanCols.push({\n id: 'actions',\n header: '',\n enableSorting: false,\n cell: ({ row }: any) => {\n const id = row.original.id\n const editBtn = (\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\"\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); setCrudHash(options.basePath!, id, 'edit') }}>\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )\n const deleteBtn = options.onDelete ? (\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); options.onDelete!(row.original) }}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n ) : null\n return (\n <div className=\"flex items-center justify-end gap-1\">\n {options.feature ? (\n <>\n <PermissionGate feature={options.feature} action=\"edit\">{editBtn}</PermissionGate>\n {deleteBtn && <PermissionGate feature={options.feature} action=\"delete\">{deleteBtn}</PermissionGate>}\n </>\n ) : (\n <>{editBtn}{deleteBtn}</>\n )}\n </div>\n )\n },\n })\n }\n\n return tanCols\n }, [cols, displayField, options?.basePath, options?.onDelete, options?.feature, options?.readOnly])\n}\n\nexport function CrudPage<T extends { id: string }>({ entityDef: rawEntityDef, useStore, basePath, display, feature, readOnly }: CrudPageProps<T>) {\n const store = useStore()\n const t = useTranslation()\n const normalizedBasePath = normalizeCrudBasePath(basePath)\n const { sub, direction } = useSubRoute(normalizedBasePath)\n\n // Apply tenant field-rule overrides (required / visibility) before passing down\n const entityKey = deriveEntityKey(rawEntityDef)\n const { applyRules } = useFieldRules(entityKey)\n const entityDef = useMemo(() => ({\n ...rawEntityDef,\n fields: applyRules(rawEntityDef.fields),\n }), [rawEntityDef, applyRules]) as EntityDef<T>\n const [deleteItem, setDeleteItem] = useState<T | null>(null)\n const [searchInput, setSearchInput] = useState('')\n const [importOpen, setImportOpen] = useState(false)\n const [activeFilters, setActiveFilters] = useState<Record<string, string | undefined>>({})\n const activeFiltersRef = useRef<Record<string, string | undefined>>({})\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n\n // Resolve declared facets (entityDef.facets) into pill options from each field.\n const resolvedFacets = useMemo<CrudFacet[]>(() => {\n return (entityDef.facets ?? []).map((f) => {\n const field = entityDef.fields.find((x) => x.key === f.field)\n const options = (field?.options ?? []).map((o) =>\n typeof o === 'string' ? { value: o, label: o } : { value: o.value, label: o.label },\n )\n return { field: f.field, options, allLabel: f.allLabel }\n })\n }, [entityDef])\n\n const handleFacetChange = useCallback((field: string, value: string | undefined) => {\n const next = { ...activeFiltersRef.current }\n if (value == null) delete next[field]\n else next[field] = value\n activeFiltersRef.current = next\n setActiveFilters(next)\n store.setQuery({ filters: next })\n }, [store])\n\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const handleInlineUpdate = useCallback(async (id: string, field: string, value: any) => {\n await store.update(id, { [field]: value } as any)\n }, [store])\n const tanColumns = useCrudColumns(entityDef, { basePath: normalizedBasePath, onDelete: readOnly ? undefined : (item) => setDeleteItem(item), onInlineUpdate: handleInlineUpdate, feature, readOnly })\n const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id)\n\n useEffect(() => {\n if (currentOrgId) store.fetch()\n }, [currentOrgId])\n\n const navigateToList = () => { setCrudHash(normalizedBasePath) }\n const animClass = direction === 'forward' ? 'saas-nav-forward' : 'saas-nav-back'\n\n const handleImport = useCallback(async (\n rows: Record<string, any>[],\n onProgress: (processed: number, total: number) => void,\n ): Promise<{ success: number; errors: ImportRowError[] }> => {\n // Guard: refuse import if not connected to Supabase (would silently go to mock)\n if (!getSupabaseClientOptional() as any) {\n return {\n success: 0,\n errors: [{ row: 0, message: t('crud.import.noConnection') }],\n }\n }\n\n const { success, results } = await store.createMany(rows, {\n batchSize: 10,\n onProgress,\n })\n\n const errors: ImportRowError[] = []\n for (let i = 0; i < results.length; i++) {\n if (results[i].error) {\n errors.push({ row: i + 2, message: results[i].error! })\n }\n }\n\n if (success > 0) {\n toast.success(t('crud.import.toastSuccess', { count: String(success) }))\n }\n return { success, errors }\n }, [store, t])\n\n const handleExport = useCallback(() => {\n const items = store.items\n if (!items || items.length === 0) {\n toast.error(t('crud.export.noData'))\n return\n }\n exportToCSV(items as any, entityDef)\n toast.success(t('crud.export.toastSuccess', { count: String(items.length) }))\n }, [store.items, entityDef, t])\n\n // Determine which view to show\n let viewKey = 'list'\n let content: React.ReactNode = null\n\n if (sub === '/new' && !readOnly) {\n viewKey = 'new'\n content = (\n <CrudFormPage\n entityDef={entityDef}\n mode=\"create\"\n namePlural={namePlural}\n onCancel={navigateToList}\n onSubmit={async (data) => {\n await store.create(data)\n navigateToList()\n }}\n />\n )\n } else if (sub === '/new' && readOnly) {\n // readOnly — redirect back to list\n navigateToList()\n } else if (sub.endsWith('/edit') && !readOnly) {\n const id = sub.slice(1, -5)\n const item = store.getById(id)\n viewKey = `edit-${id}`\n\n if (!item && store.items === null) {\n content = (\n <div className=\"space-y-6 animate-pulse\">\n {/* Breadcrumb skeleton */}\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <span className=\"text-muted-foreground\">/</span>\n <div className=\"h-4 w-28 rounded bg-muted\" />\n </div>\n {/* Hero skeleton */}\n <div className=\"flex items-start gap-5\">\n <div className=\"h-20 w-20 shrink-0 rounded-2xl bg-muted\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-7 w-48 rounded bg-muted\" />\n <div className=\"h-4 w-32 rounded bg-muted\" />\n <div className=\"h-5 w-16 rounded-full bg-muted mt-1\" />\n </div>\n <div className=\"flex gap-2 shrink-0\">\n <div className=\"h-9 w-20 rounded-md bg-muted\" />\n <div className=\"h-9 w-9 rounded-md bg-muted\" />\n </div>\n </div>\n {/* Separator */}\n <div className=\"h-px bg-border\" />\n {/* Tabs skeleton */}\n <div className=\"flex gap-2\">\n <div className=\"h-8 w-20 rounded bg-muted\" />\n <div className=\"h-8 w-24 rounded bg-muted\" />\n </div>\n {/* Field rows skeleton */}\n <Card>\n <div className=\"divide-y\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"grid grid-cols-3 gap-4 px-5 py-3\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <div className=\"col-span-2 h-4 w-32 rounded bg-muted\" />\n </div>\n ))}\n </div>\n </Card>\n </div>\n )\n } else if (!item) {\n content = (\n <div className=\"space-y-6\">\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button type=\"button\" onClick={navigateToList} className=\"hover:text-foreground transition-colors\">{namePlural}</button>\n <span>/</span>\n <span className=\"text-foreground font-medium\">{t('common.notFound')}</span>\n </nav>\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground mb-4\">{t('crud.detail.notFound', { entity: entityDef.name })}</p>\n <Button onClick={navigateToList}>{t('crud.detail.backTo', { entities: namePlural })}</Button>\n </div>\n </div>\n )\n } else {\n content = (\n <CrudFormPage\n entityDef={entityDef}\n mode=\"edit\"\n initialData={item as any}\n namePlural={namePlural}\n onCancel={() => { setCrudHash(normalizedBasePath, id) }}\n onSubmit={async (data) => {\n await store.update(id, data as Partial<T>)\n setCrudHash(normalizedBasePath, id)\n }}\n />\n )\n }\n } else if (sub.endsWith('/edit') && readOnly) {\n // readOnly — redirect to detail view\n const id = sub.slice(1, -5)\n setCrudHash(normalizedBasePath, id)\n } else if (sub.startsWith('/') && sub.length > 1) {\n // Parse /uuid or /uuid/tab-name\n const subParts = sub.slice(1).split('/')\n const id = subParts[0]\n const initialTab = subParts[1] || undefined\n const item = store.getById(id)\n viewKey = `detail-${id}`\n\n if (!item && store.items === null) {\n content = (\n <div className=\"space-y-6 animate-pulse\">\n {/* Breadcrumb skeleton */}\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <span className=\"text-muted-foreground\">/</span>\n <div className=\"h-4 w-28 rounded bg-muted\" />\n </div>\n {/* Hero skeleton */}\n <div className=\"flex items-start gap-5\">\n <div className=\"h-20 w-20 shrink-0 rounded-2xl bg-muted\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-7 w-48 rounded bg-muted\" />\n <div className=\"h-4 w-32 rounded bg-muted\" />\n <div className=\"h-5 w-16 rounded-full bg-muted mt-1\" />\n </div>\n <div className=\"flex gap-2 shrink-0\">\n <div className=\"h-9 w-20 rounded-md bg-muted\" />\n <div className=\"h-9 w-9 rounded-md bg-muted\" />\n </div>\n </div>\n {/* Separator */}\n <div className=\"h-px bg-border\" />\n {/* Tabs skeleton */}\n <div className=\"flex gap-2\">\n <div className=\"h-8 w-20 rounded bg-muted\" />\n <div className=\"h-8 w-24 rounded bg-muted\" />\n </div>\n {/* Field rows skeleton */}\n <Card>\n <div className=\"divide-y\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"grid grid-cols-3 gap-4 px-5 py-3\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <div className=\"col-span-2 h-4 w-32 rounded bg-muted\" />\n </div>\n ))}\n </div>\n </Card>\n </div>\n )\n } else if (!item) {\n content = (\n <div className=\"space-y-6\">\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button type=\"button\" onClick={navigateToList} className=\"hover:text-foreground transition-colors\">{namePlural}</button>\n <span>/</span>\n <span className=\"text-foreground font-medium\">{t('common.notFound')}</span>\n </nav>\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground mb-4\">{t('crud.detail.notFound', { entity: entityDef.name })}</p>\n <Button onClick={navigateToList}>{t('crud.detail.backTo', { entities: namePlural })}</Button>\n </div>\n </div>\n )\n } else {\n content = (\n <CrudDetailPage\n entityDef={entityDef}\n item={item as any}\n namePlural={namePlural}\n basePath={normalizedBasePath}\n initialTab={initialTab}\n onBack={navigateToList}\n onEdit={readOnly ? undefined : () => { setCrudHash(normalizedBasePath, id, 'edit') }}\n onDelete={readOnly ? undefined : () => setDeleteItem(item)}\n feature={feature}\n />\n )\n }\n } else {\n // List view — delegated to the shared CrudListView (header, search, facet\n // pills, table/cards). Data + routing stay here (store-backed).\n const handleSearch = (value: string) => {\n setSearchInput(value)\n if (searchTimer.current) clearTimeout(searchTimer.current)\n searchTimer.current = setTimeout(() => {\n store.setQuery({ search: value || undefined })\n }, 350)\n }\n\n const hasSearch = entityDef.fields.some((f) => f.searchable)\n\n content = (\n <CrudListView\n entityDef={entityDef}\n columns={tanColumns}\n items={store.items}\n total={store.total}\n display={display}\n search={searchInput}\n onSearchChange={hasSearch ? handleSearch : undefined}\n facets={resolvedFacets}\n activeFilters={activeFilters}\n onFacetChange={handleFacetChange}\n onNew={() => setCrudHash(normalizedBasePath, 'new')}\n onRowClick={(row) => setCrudHash(normalizedBasePath, (row as any).id)}\n onDelete={(item) => setDeleteItem(item)}\n onImport={() => setImportOpen(true)}\n onExport={handleExport}\n feature={feature}\n readOnly={readOnly}\n />\n )\n }\n\n const handleDeleteConfirm = () => {\n if (deleteItem) {\n store.remove((deleteItem as any).id)\n setDeleteItem(null)\n navigateToList()\n }\n }\n\n return (\n <>\n <div key={viewKey} className={animClass}>\n {content}\n </div>\n <DeleteConfirmDialog\n open={deleteItem !== null}\n onClose={() => setDeleteItem(null)}\n onConfirm={handleDeleteConfirm}\n entityName={entityDef.name}\n displayValue={deleteItem ? (deleteItem as any)[displayField] : undefined}\n />\n <ImportWizard\n open={importOpen}\n onClose={() => setImportOpen(false)}\n entityDef={entityDef as EntityDef<any>}\n onImport={handleImport}\n />\n </>\n )\n}\n","import { create } from 'zustand'\nimport type { DataProvider, CrudQuery } from '@fayz-ai/core'\n\nexport interface CrudState<T> {\n items: T[] | null\n total: number\n loading: boolean\n query: CrudQuery\n}\n\nexport interface ImportBatchResult<T> {\n item?: T\n error?: string\n}\n\nexport interface CrudActions<T> {\n fetch: () => Promise<void>\n create: (data: any) => Promise<T>\n /** Batch create without per-item list refetch. Calls onProgress after each batch. Single fetch at the end. */\n createMany: (\n rows: any[],\n options?: { batchSize?: number; onProgress?: (processed: number, total: number) => void },\n ) => Promise<{ success: number; results: ImportBatchResult<T>[] }>\n update: (id: string, data: Partial<T>) => Promise<T>\n remove: (id: string) => Promise<void>\n setQuery: (query: Partial<CrudQuery>) => void\n getById: (id: string) => T | undefined\n}\n\nexport type CrudStore<T> = CrudState<T> & CrudActions<T>\n\nexport function createCrudStore<T extends { id: string }>(\n dataProvider: DataProvider<T>,\n) {\n // Dedup: track the current in-flight fetch to avoid duplicate requests\n let inflightFetch: Promise<void> | null = null\n let lastQueryKey = ''\n\n function queryKey(query: CrudQuery): string {\n return JSON.stringify(query)\n }\n\n return create<CrudStore<T>>((set, get) => ({\n items: null,\n total: 0,\n loading: false,\n query: {},\n\n async fetch() {\n const currentKey = queryKey(get().query)\n\n // If we already have an in-flight request for the same query, reuse it\n if (inflightFetch && currentKey === lastQueryKey) {\n return inflightFetch\n }\n\n lastQueryKey = currentKey\n set({ loading: true })\n\n const promise = (async () => {\n try {\n const result = await dataProvider.list(get().query)\n set({ items: result.data, total: result.total, loading: false })\n } catch {\n set({ items: get().items ?? [], loading: false })\n } finally {\n inflightFetch = null\n }\n })()\n\n inflightFetch = promise\n return promise\n },\n\n async create(data) {\n const item = await dataProvider.create(data)\n inflightFetch = null // invalidate dedup cache\n lastQueryKey = ''\n await get().fetch()\n return item\n },\n\n async createMany(rows, options) {\n const batchSize = options?.batchSize ?? 10\n let success = 0\n const results: ImportBatchResult<T>[] = new Array(rows.length)\n\n for (let i = 0; i < rows.length; i += batchSize) {\n const batch = rows.slice(i, i + batchSize)\n const settled = await Promise.allSettled(\n batch.map((row) => dataProvider.create(row)),\n )\n for (let j = 0; j < settled.length; j++) {\n const r = settled[j]\n if (r.status === 'fulfilled' && r.value?.id) {\n success++\n results[i + j] = { item: r.value }\n } else {\n const msg = r.status === 'rejected' ? (r.reason?.message ?? 'Error') : 'No record returned'\n results[i + j] = { error: msg }\n }\n }\n options?.onProgress?.(Math.min(i + batch.length, rows.length), rows.length)\n }\n\n // Single list refresh after all inserts\n inflightFetch = null\n lastQueryKey = ''\n await get().fetch()\n\n return { success, results }\n },\n\n async update(id, data) {\n const item = await dataProvider.update(id, data)\n inflightFetch = null\n lastQueryKey = ''\n await get().fetch()\n return item\n },\n\n async remove(id) {\n await dataProvider.remove(id)\n inflightFetch = null\n lastQueryKey = ''\n await get().fetch()\n },\n\n setQuery(partial) {\n set((s) => ({ query: { ...s.query, ...partial } }))\n queueMicrotask(() => get().fetch())\n },\n\n getById(id) {\n return (get().items ?? []).find((item) => item.id === id)\n },\n }))\n}\n","import React, { useMemo } from 'react'\nimport { CrudPage } from './CrudPage'\nimport { createCrudStore } from '../stores/createCrudStore'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport { registerEntity, deriveEntityKey } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { DataProvider } from '@fayz-ai/core'\n\ninterface CreateCrudPageOptions<T extends { id: string }> {\n mockData?: T[]\n dataProvider?: DataProvider<T>\n /** List display mode: 'table' (default) or 'cards' */\n display?: 'table' | 'cards'\n /** Feature ID for permission gating on CRUD actions */\n feature?: string\n}\n\nexport function createCrudPage<T extends { id: string }>(\n entityDef: EntityDef<T>,\n options?: CreateCrudPageOptions<T>,\n): React.ComponentType & { __crudBasePath?: string } {\n const display = options?.display ?? 'table'\n\n // If an explicit dataProvider was given, use it eagerly (no lazy resolution needed)\n let eagerStore: ReturnType<typeof createCrudStore<T>> | null = null\n if (options?.dataProvider) {\n eagerStore = createCrudStore(options.dataProvider)\n }\n\n const GeneratedCrudPage: React.FC & { __crudBasePath?: string } = () => {\n // Lazy provider resolution — runs at render time when Supabase is already initialized\n const useStore = useMemo(() => {\n if (eagerStore) return eagerStore\n const provider = resolveDataProvider(entityDef, options?.mockData)\n return createCrudStore(provider)\n }, [])\n\n const basePath = GeneratedCrudPage.__crudBasePath ?? '/'\n return (\n <CrudPage\n entityDef={entityDef as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={display}\n feature={options?.feature}\n />\n )\n }\n\n GeneratedCrudPage.displayName = `CrudPage(${entityDef.name})`\n ;(GeneratedCrudPage as any).__isCrudPage = true\n ;(GeneratedCrudPage as any).__entityDef = entityDef\n\n registerEntity({\n entityKey: deriveEntityKey(entityDef),\n label: entityDef.name,\n labelPlural: entityDef.namePlural ?? entityDef.name,\n icon: entityDef.icon,\n fields: entityDef.fields,\n source: 'app',\n archetype: entityDef.data?.archetype,\n })\n\n return GeneratedCrudPage\n}\n","import { createCrudPage } from '../../../crud/createCrudPage'\nimport type { EntityDef } from '../../types/crud'\n\nexport const locationEntityDef: EntityDef = {\n name: 'Location',\n namePlural: 'Locations',\n icon: 'MapPin',\n layout: 'location',\n displayField: 'name',\n subtitleField: 'city',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'phone', label: 'Phone', type: 'phone', showInTable: true },\n { key: 'city', label: 'City', type: 'text', showInTable: true },\n { key: 'state', label: 'State', type: 'text', showInTable: true },\n { key: 'address', label: 'Address', type: 'text' },\n { key: 'country', label: 'Country', type: 'text', defaultValue: 'BR' },\n { key: 'postalCode', label: 'Postal Code', type: 'text' },\n { key: 'email', label: 'Email', type: 'email' },\n { key: 'isHeadquarters', label: 'Headquarters', type: 'boolean', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n { key: 'notes', label: 'Notes', type: 'textarea' },\n ],\n data: {\n table: 'locations',\n schema: 'saas_core',\n tenantScoped: true,\n searchColumns: ['name', 'city', 'state'],\n defaults: { kind: 'branch' },\n },\n}\n\nexport const LocationsCrudPage = createCrudPage(locationEntityDef)\n// Set basePath for hash-based sub-routing inside settings tab\n;(LocationsCrudPage as any).__crudBasePath = '/settings/locations'\n","import * as React from 'react'\nimport { useState, useMemo, useCallback } from 'react'\nimport { ChevronDown, ChevronRight, RotateCcw, Loader2, Search, ChevronsUpDown } from 'lucide-react'\nimport * as LucideIcons from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { RegisteredEntity } from '../../lib/entity-registry'\nimport type { TenantFieldRules, EntityFieldRules, FieldRuleOverride, FieldDef } from '../../types/crud'\n\ninterface FieldRulesSettingsProps {\n entities: RegisteredEntity[]\n rules: TenantFieldRules\n onSave: (rules: TenantFieldRules) => Promise<void>\n}\n\ntype OverrideKey = keyof FieldRuleOverride\n\nconst RULE_COLUMNS: { key: OverrideKey; labelKey: string }[] = [\n { key: 'required', labelKey: 'settings.fieldRules.required' },\n { key: 'showInForm', labelKey: 'settings.fieldRules.inForm' },\n { key: 'showInTable', labelKey: 'settings.fieldRules.inTable' },\n { key: 'showInDetail', labelKey: 'settings.fieldRules.inDetail' },\n]\n\n/** Core SaaS archetypes — shown in the main section */\nconst CORE_ARCHETYPES = new Set([\n 'person', 'product', 'service', 'category', 'order', 'location',\n])\n\n/** Priority order for sorting core entities */\nconst ARCHETYPE_ORDER: Record<string, number> = {\n person: 0,\n service: 1,\n product: 2,\n category: 3,\n order: 4,\n location: 5,\n}\n\nfunction isCoreEntity(entity: RegisteredEntity): boolean {\n if (entity.archetype && CORE_ARCHETYPES.has(entity.archetype)) return true\n const prefix = entity.entityKey.split(':')[0]\n return CORE_ARCHETYPES.has(prefix)\n}\n\nfunction entitySortKey(entity: RegisteredEntity): number {\n const prefix = entity.archetype ?? entity.entityKey.split(':')[0]\n return ARCHETYPE_ORDER[prefix] ?? 99\n}\n\n/** Group structure for plugin entities */\ninterface PluginGroup {\n pluginId: string\n pluginName: string\n pluginIcon: string\n entities: RegisteredEntity[]\n}\n\n// ---------------------------------------------------------------------------\n// Field helpers\n// ---------------------------------------------------------------------------\n\nfunction getDefaultValue(field: FieldDef, key: OverrideKey): boolean {\n switch (key) {\n case 'required':\n return field.required ?? false\n case 'showInForm':\n return field.showInForm !== false\n case 'showInTable':\n return field.showInTable !== false\n case 'showInDetail':\n return field.showInDetail !== false\n }\n}\n\nfunction getEffectiveValue(\n field: FieldDef,\n key: OverrideKey,\n rules: EntityFieldRules | undefined,\n): boolean {\n const override = rules?.[field.key]?.[key]\n if (override != null) return override\n return getDefaultValue(field, key)\n}\n\nfunction isFieldModified(\n field: FieldDef,\n rules: EntityFieldRules | undefined,\n): boolean {\n if (!rules?.[field.key]) return false\n return RULE_COLUMNS.some((col) => {\n const override = rules[field.key]?.[col.key]\n return override != null && override !== getDefaultValue(field, col.key)\n })\n}\n\nfunction countModified(\n fields: FieldDef[],\n rules: EntityFieldRules | undefined,\n): number {\n if (!rules) return 0\n return fields.filter((f) => isFieldModified(f, rules)).length\n}\n\nfunction resolveIcon(iconName: string): React.ComponentType<any> | null {\n return (LucideIcons as any)[iconName] ?? null\n}\n\nfunction matchesSearch(entity: RegisteredEntity, q: string): boolean {\n return (\n entity.label.toLowerCase().includes(q) ||\n entity.labelPlural.toLowerCase().includes(q) ||\n entity.entityKey.toLowerCase().includes(q)\n )\n}\n\n// ---------------------------------------------------------------------------\n// EntityAccordion\n// ---------------------------------------------------------------------------\n\nfunction EntityAccordion({\n entity,\n rules,\n onToggle,\n onReset,\n}: {\n entity: RegisteredEntity\n rules: EntityFieldRules | undefined\n onToggle: (entityKey: string, fieldKey: string, ruleKey: OverrideKey, value: boolean) => void\n onReset: (entityKey: string) => void\n}) {\n const { t } = useTranslation()\n const [open, setOpen] = useState(false)\n const modified = countModified(entity.fields, rules)\n const Icon = resolveIcon(entity.icon)\n\n return (\n <Card>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-3 px-5 py-3.5 text-left\"\n >\n {open ? (\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n )}\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"text-sm font-semibold flex-1\">{entity.labelPlural || entity.label}</span>\n {modified > 0 && (\n <span className=\"text-xs text-primary font-medium tabular-nums\">\n {t('settings.fieldRules.modified', { count: String(modified) })}\n </span>\n )}\n </button>\n\n {open && (\n <CardContent className=\"pt-0 pb-4 px-5\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"text-left font-medium text-muted-foreground py-2 pr-4 w-[40%]\">\n {t('settings.fieldRules.field')}\n </th>\n {RULE_COLUMNS.map((col) => (\n <th\n key={col.key}\n className=\"text-center font-medium text-muted-foreground py-2 px-3 w-[15%]\"\n >\n {t(col.labelKey)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entity.fields.map((field) => {\n const fieldModified = isFieldModified(field, rules)\n return (\n <tr\n key={field.key}\n className={cn(\n 'border-b last:border-0',\n fieldModified && 'bg-primary/[0.03]',\n )}\n >\n <td className=\"py-2.5 pr-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-foreground\">{field.label}</span>\n {fieldModified && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" />\n )}\n </div>\n </td>\n {RULE_COLUMNS.map((col) => {\n const effective = getEffectiveValue(field, col.key, rules)\n const defaultVal = getDefaultValue(field, col.key)\n const overridden = rules?.[field.key]?.[col.key]\n const isModified = overridden != null && overridden !== defaultVal\n return (\n <td key={col.key} className=\"text-center py-2.5 px-3\">\n <div className=\"inline-flex items-center gap-1\">\n <Checkbox\n checked={effective}\n onChange={(val) =>\n onToggle(entity.entityKey, field.key, col.key, val)\n }\n />\n {isModified && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" />\n )}\n </div>\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n\n {modified > 0 && (\n <div className=\"flex justify-end pt-3\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n onReset(entity.entityKey)\n }}\n >\n <RotateCcw className=\"h-3.5 w-3.5 mr-1.5\" />\n {t('settings.fieldRules.resetDefaults')}\n </Button>\n </div>\n )}\n </CardContent>\n )}\n </Card>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Section components\n// ---------------------------------------------------------------------------\n\nfunction SectionHeader({ label }: { label: string }) {\n return (\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground px-1\">\n {label}\n </h3>\n )\n}\n\nfunction PluginSectionHeader({ name, iconName }: { name: string; iconName: string }) {\n const Icon = resolveIcon(iconName)\n return (\n <div className=\"flex items-center gap-2 px-1\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {name}\n </h3>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport function FieldRulesSettings({ entities, rules: initialRules, onSave }: FieldRulesSettingsProps) {\n const { t } = useTranslation()\n const [draft, setDraft] = useState<TenantFieldRules>(initialRules)\n const [saving, setSaving] = useState(false)\n const [search, setSearch] = useState('')\n const [showMore, setShowMore] = useState(false)\n\n React.useEffect(() => {\n setDraft(initialRules)\n }, [initialRules])\n\n const isDirty = useMemo(\n () => JSON.stringify(draft) !== JSON.stringify(initialRules),\n [draft, initialRules],\n )\n\n // Split entities: core standalone → standalone non-core → grouped by plugin\n const { coreEntities, standaloneEntities, pluginGroups } = useMemo(() => {\n const q = search.trim().toLowerCase()\n\n const core: RegisteredEntity[] = []\n const standalone: RegisteredEntity[] = []\n const pluginMap = new Map<string, PluginGroup>()\n\n for (const entity of entities) {\n if (q && !matchesSearch(entity, q)) continue\n\n if (entity.source === 'plugin' && entity.pluginId) {\n // Group under plugin\n let group = pluginMap.get(entity.pluginId)\n if (!group) {\n group = {\n pluginId: entity.pluginId,\n pluginName: entity.pluginName ?? entity.pluginId,\n pluginIcon: entity.pluginIcon ?? 'Puzzle',\n entities: [],\n }\n pluginMap.set(entity.pluginId, group)\n }\n group.entities.push(entity)\n } else if (isCoreEntity(entity)) {\n core.push(entity)\n } else {\n standalone.push(entity)\n }\n }\n\n // Sort core by archetype priority, then alphabetically\n core.sort((a, b) => {\n const orderDiff = entitySortKey(a) - entitySortKey(b)\n if (orderDiff !== 0) return orderDiff\n return (a.labelPlural || a.label).localeCompare(b.labelPlural || b.label)\n })\n\n standalone.sort((a, b) =>\n (a.labelPlural || a.label).localeCompare(b.labelPlural || b.label),\n )\n\n // Sort entities within each plugin group alphabetically\n const groups = Array.from(pluginMap.values())\n for (const group of groups) {\n group.entities.sort((a, b) =>\n (a.labelPlural || a.label).localeCompare(b.labelPlural || b.label),\n )\n }\n // Sort plugin groups by plugin name\n groups.sort((a, b) => a.pluginName.localeCompare(b.pluginName))\n\n return {\n coreEntities: core,\n standaloneEntities: standalone,\n pluginGroups: groups,\n }\n }, [entities, search])\n\n const isSearching = search.trim().length > 0\n const hasExtras = standaloneEntities.length > 0 || pluginGroups.length > 0\n const showExtras = hasExtras && (showMore || isSearching)\n const extraCount = standaloneEntities.length + pluginGroups.reduce((sum, g) => sum + g.entities.length, 0)\n const hasNoResults = coreEntities.length === 0 && !hasExtras\n\n const handleToggle = useCallback(\n (entityKey: string, fieldKey: string, ruleKey: OverrideKey, value: boolean) => {\n setDraft((prev) => {\n const entityRules = { ...prev[entityKey] }\n const fieldOverride = { ...entityRules[fieldKey] }\n fieldOverride[ruleKey] = value\n entityRules[fieldKey] = fieldOverride\n return { ...prev, [entityKey]: entityRules }\n })\n },\n [],\n )\n\n const handleReset = useCallback((entityKey: string) => {\n setDraft((prev) => {\n const next = { ...prev }\n delete next[entityKey]\n return next\n })\n }, [])\n\n const handleSave = async () => {\n setSaving(true)\n try {\n const cleaned: TenantFieldRules = {}\n for (const [entityKey, entityRules] of Object.entries(draft)) {\n const entity = entities.find((e) => e.entityKey === entityKey)\n if (!entity) continue\n\n const cleanedEntity: EntityFieldRules = {}\n for (const [fieldKey, override] of Object.entries(entityRules)) {\n const field = entity.fields.find((f) => f.key === fieldKey)\n if (!field) continue\n\n const cleanedOverride: FieldRuleOverride = {}\n let hasOverride = false\n for (const col of RULE_COLUMNS) {\n const val = override[col.key]\n if (val != null && val !== getDefaultValue(field, col.key)) {\n cleanedOverride[col.key] = val\n hasOverride = true\n }\n }\n if (hasOverride) {\n cleanedEntity[fieldKey] = cleanedOverride\n }\n }\n if (Object.keys(cleanedEntity).length > 0) {\n cleaned[entityKey] = cleanedEntity\n }\n }\n\n await onSave(cleaned)\n } finally {\n setSaving(false)\n }\n }\n\n const renderAccordions = (list: RegisteredEntity[]) =>\n list.map((entity) => (\n <EntityAccordion\n key={entity.entityKey}\n entity={entity}\n rules={draft[entity.entityKey]}\n onToggle={handleToggle}\n onReset={handleReset}\n />\n ))\n\n return (\n <div className=\"space-y-6\">\n {/* Header + Save */}\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-lg font-semibold\">{t('settings.fieldRules')}</h2>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n {t('settings.fieldRules.subtitle')}\n </p>\n </div>\n <Button onClick={handleSave} disabled={!isDirty || saving} className=\"shrink-0\">\n {saving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {t('common.save')}\n </Button>\n </div>\n\n {/* Search */}\n {entities.length > 4 && (\n <div className=\"relative max-w-sm\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder={t('settings.fieldRules.searchPlaceholder')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n\n {hasNoResults ? (\n <p className=\"text-sm text-muted-foreground py-8 text-center\">\n {t('settings.fieldRules.noEntities')}\n </p>\n ) : (\n <div className=\"space-y-6\">\n {/* Core register types — always visible */}\n {coreEntities.length > 0 && (\n <div className=\"space-y-2\">\n <SectionHeader label={t('settings.fieldRules.coreRegisters')} />\n {renderAccordions(coreEntities)}\n </div>\n )}\n\n {/* Extras: standalone + plugin groups — behind \"Load more\" */}\n {showExtras && (\n <>\n {/* Standalone non-core, non-plugin entities */}\n {standaloneEntities.length > 0 && (\n <div className=\"space-y-2\">\n <SectionHeader label={t('settings.fieldRules.otherRegisters')} />\n {renderAccordions(standaloneEntities)}\n </div>\n )}\n\n {/* Plugin groups — each with plugin name + icon header */}\n {pluginGroups.map((group) => (\n <div key={group.pluginId} className=\"space-y-2\">\n <PluginSectionHeader\n name={group.pluginName}\n iconName={group.pluginIcon}\n />\n {renderAccordions(group.entities)}\n </div>\n ))}\n </>\n )}\n\n {/* Load more / show less toggle */}\n {hasExtras && !isSearching && (\n <button\n type=\"button\"\n onClick={() => setShowMore(!showMore)}\n className=\"flex w-full items-center justify-center gap-2 rounded-lg border border-dashed py-3 text-sm text-muted-foreground hover:text-foreground hover:border-border transition-colors\"\n >\n <ChevronsUpDown className=\"h-4 w-4\" />\n {showMore\n ? t('settings.fieldRules.showLess')\n : t('settings.fieldRules.showMore', { count: String(extraCount) })}\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n","import type { FieldDef, EntityDef } from '../types/crud'\nimport type { EntityArchetype } from '../types/entities'\n\nexport interface RegisteredEntity {\n entityKey: string\n label: string\n labelPlural: string\n icon: string\n fields: FieldDef[]\n source: 'page' | 'plugin'\n archetype?: EntityArchetype\n pluginId?: string\n pluginName?: string\n pluginIcon?: string\n}\n\nconst registry = new Map<string, RegisteredEntity>()\n\nexport function deriveEntityKey(entityDef: EntityDef): string {\n if (entityDef.data?.archetypeKind) {\n return `${entityDef.data.archetype ?? ''}:${entityDef.data.archetypeKind}`\n }\n if (entityDef.data?.archetype) {\n return entityDef.data.archetype\n }\n return entityDef.data?.table ?? entityDef.name\n}\n\nexport function registerEntity(entity: RegisteredEntity): void {\n registry.set(entity.entityKey, entity)\n}\n\nexport function getRegisteredEntities(): RegisteredEntity[] {\n return Array.from(registry.values())\n}\n\nexport function getEntityByKey(key: string): RegisteredEntity | undefined {\n return registry.get(key)\n}\n","import { FieldRulesSettings } from './FieldRulesSettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { getRegisteredEntities } from '../../lib/entity-registry'\nimport { toast } from '../notifications/ToastProvider'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { TenantFieldRules, TenantSettings } from '../../types'\n\nfunction extractFieldRules(settings: unknown): TenantFieldRules {\n if (!settings || typeof settings !== 'object') return {}\n return (settings as Record<string, unknown>).fieldRules as TenantFieldRules ?? {}\n}\n\nexport function ConnectedFieldRulesSettings() {\n const { t } = useTranslation()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const adapter = useOrgAdapterOptional()\n const entities = getRegisteredEntities()\n const rules = extractFieldRules(currentOrg?.settings)\n\n const handleSave = async (newRules: TenantFieldRules) => {\n if (!adapter || !currentOrg) return\n\n try {\n const currentSettings = (currentOrg.settings ?? {}) as Record<string, unknown>\n const updated = await adapter.updateOrg(currentOrg.id, {\n settings: {\n ...currentSettings,\n fieldRules: newRules,\n },\n })\n setCurrentOrg(updated)\n toast.success(t('settings.fieldRules.saved'))\n } catch (err: any) {\n toast.error(t('settings.fieldRules.saveFailed'), { description: err?.message })\n }\n }\n\n return (\n <FieldRulesSettings\n entities={entities}\n rules={rules}\n onSave={handleSave}\n />\n )\n}\n","import * as React from 'react'\nimport {\n AppShell,\n type NavigationItem,\n ModuleLayoutProvider,\n PageTransition,\n type ModuleNavVariant,\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n Avatar,\n AvatarImage,\n AvatarFallback,\n} from '@fayz-ai/ui'\nimport { useOrganizationStore } from '../org/store'\nimport { useAuth } from '@fayz-ai/auth'\nimport { usePluginRuntime, resolvePluginComponent, useTranslation } from '@fayz-ai/core'\nimport type { PermissionAction, PluginNavigationEntry, PluginRouteDefinition, PluginSettingsTab } from '@fayz-ai/core'\nimport { useAdminPath, navigateTo, matchRoute, routeScore } from './routing'\nimport { LoginPage } from './LoginPage'\nimport type { CustomPage } from './config'\nimport type { AuthProvider } from '@fayz-ai/core'\nimport { setEntityRouteMap } from '../lib/entity-routes'\nimport { usePermissionOptional } from '../permissions/context'\nimport { SettingsPage } from '../shell/components/settings/SettingsPage'\nimport { TeamTab } from '../shell/components/organization/TeamTab'\nimport { PermissionProfilesTab } from '../shell/components/organization/PermissionProfilesTab'\nimport { LocationsCrudPage } from '../shell/components/settings/LocationsCrudPage'\nimport { ConnectedFieldRulesSettings } from '../shell/components/settings/ConnectedFieldRulesSettings'\nimport { MapPin, Puzzle, ShieldCheck, SlidersHorizontal, Users } from 'lucide-react'\nimport * as LucideIcons from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// AdminShell — the working admin surface. Mounted INSIDE the providers (see\n// AdminProviders). Reads the resolved plugin runtime for navigation + routes,\n// wires the @fayz-ai/ui AppShell, and switches the main content on the hash path.\n// Custom pages (config.pages / manifest pages already resolved to components)\n// are merged into the same nav + route table.\n// ---------------------------------------------------------------------------\n\nexport interface AdminShellProps {\n appName: string\n layout?: 'sidebar' | 'topbar' | 'minimal'\n logo?: React.ReactNode\n pages?: CustomPage[]\n requireAuth?: boolean\n loginTagline?: string\n loginDescription?: string\n loginLogo?: React.ReactNode\n loginLayout?: 'split' | 'centered'\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n showSettings?: boolean\n showOrgSettings?: boolean\n /** Wrap the main content in an inset \"framed\" card (default: true). The\n * sidebar is always flush/full-height. */\n contentFrame?: boolean\n /** How module-internal navigation renders. Defaults to 'tabs' for the\n * 'sidebar' layout and 'rail' for 'topbar'. */\n moduleNav?: ModuleNavVariant\n}\n\n// ---------------------------------------------------------------------------\n// WorkspaceSwitcher — sub-account / workspace selector at the sidebar top.\n// Reads the native org store (the one AdminProviders populates).\n// ---------------------------------------------------------------------------\n\nfunction WorkspaceSwitcher() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const userOrgs = useOrganizationStore((s) => s.userOrgs)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n if (!currentOrg) return null\n\n const Building = LucideIcons.Building2\n const Chevron = LucideIcons.ChevronsUpDown\n const Check = LucideIcons.Check\n const options = userOrgs.length\n ? userOrgs\n : [{ orgId: currentOrg.id, orgName: currentOrg.name, orgSlug: currentOrg.slug }]\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"flex w-full items-center gap-2 rounded-md border border-sidebar-border/60 bg-sidebar-accent/30 px-2 py-1.5 text-left transition-colors hover:bg-sidebar-accent\">\n <span className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded bg-sidebar-accent text-sidebar-accent-foreground\">\n <Building className=\"h-3.5 w-3.5\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-sidebar-foreground\">{currentOrg.name}</span>\n <Chevron className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-56 bg-sidebar text-sidebar-foreground border-sidebar-border\">\n <DropdownLabel className=\"text-sidebar-muted\">Workspaces</DropdownLabel>\n <DropdownSeparator className=\"bg-sidebar-border\" />\n {options.map((m) => (\n <DropdownItem\n key={m.orgId}\n onClick={() => setCurrentOrg({ id: m.orgId, name: m.orgName, slug: m.orgSlug, createdAt: '', updatedAt: '' })}\n className=\"flex items-center gap-2 focus:bg-sidebar-accent focus:text-sidebar-accent-foreground\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{m.orgName}</span>\n {currentOrg.id === m.orgId && <Check className=\"h-4 w-4 shrink-0\" />}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n )\n}\n\n// ---------------------------------------------------------------------------\n// AdminUserMenu — user dropdown rendered in the sidebar bottom row.\n// ---------------------------------------------------------------------------\n\nfunction AdminUserMenu({\n user,\n onProfile,\n onSettings,\n onSignOut,\n}: {\n user?: { fullName?: string; email: string; avatarUrl?: string }\n onProfile?: () => void\n onSettings?: () => void\n onSignOut?: () => void\n}) {\n if (!user) return null\n const name = user.fullName ?? user.email\n const initials = name.replace(/[^A-Za-z0-9]/g, ' ').trim().split(/\\s+/).map((w) => w[0]).slice(0, 2).join('').toUpperCase() || '?'\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"flex min-w-0 flex-1 items-center gap-2 rounded-md px-1.5 py-1 text-left transition-colors hover:bg-sidebar-accent/50\">\n <Avatar className=\"h-7 w-7 shrink-0\">\n {user.avatarUrl && <AvatarImage src={user.avatarUrl} alt={name} />}\n <AvatarFallback>{initials}</AvatarFallback>\n </Avatar>\n <span className=\"min-w-0 truncate text-xs font-medium text-sidebar-foreground\">{name}</span>\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-56 bg-sidebar text-sidebar-foreground border-sidebar-border\">\n <DropdownLabel className=\"truncate text-sidebar-muted\">{user.email}</DropdownLabel>\n <DropdownSeparator className=\"bg-sidebar-border\" />\n {onProfile && (\n <DropdownItem onClick={onProfile} className=\"focus:bg-sidebar-accent focus:text-sidebar-accent-foreground\">Profile</DropdownItem>\n )}\n {onSettings && (\n <DropdownItem onClick={onSettings} className=\"focus:bg-sidebar-accent focus:text-sidebar-accent-foreground\">Settings</DropdownItem>\n )}\n <DropdownSeparator className=\"bg-sidebar-border\" />\n {onSignOut && (\n <DropdownItem onClick={onSignOut} className=\"focus:bg-sidebar-accent focus:text-sidebar-accent-foreground\">Sign out</DropdownItem>\n )}\n </DropdownContent>\n </Dropdown>\n )\n}\n\nfunction navEntryToItem(entry: PluginNavigationEntry): NavigationItem {\n return {\n id: entry.id ?? `${entry.route}`,\n label: entry.label,\n icon: entry.icon ?? 'LayoutTemplate',\n route: entry.route,\n section: entry.section,\n badge: entry.badge,\n }\n}\n\ntype OrderedNavigationItem = NavigationItem & { position: number }\n\ninterface RouteEntry {\n path: string\n Component: React.ComponentType<Record<string, unknown>>\n /** Render edge-to-edge with no page padding wrapper (chat, kanban, canvas). */\n fullBleed?: boolean\n}\n\nfunction registerEntityRoute(\n component: unknown,\n path: string,\n entityRouteMap: Map<string, string>,\n): void {\n const entityDef = (component as any)?.__entityDef\n if (!entityDef?.data) return\n\n if (entityDef.data.archetypeKind) {\n entityRouteMap.set(`${entityDef.data.archetype ?? ''}:${entityDef.data.archetypeKind}`, path)\n } else if (entityDef.data.archetype) {\n entityRouteMap.set(entityDef.data.archetype, path)\n }\n}\n\nfunction sectionOrder(section: NavigationItem['section']): number {\n return section === 'main' ? 0 : section === 'secondary' ? 1 : 2\n}\n\nfunction compareNavigation(a: OrderedNavigationItem, b: OrderedNavigationItem): number {\n const sectionDelta = sectionOrder(a.section) - sectionOrder(b.section)\n if (sectionDelta !== 0) return sectionDelta\n return a.position - b.position\n}\n\nfunction pageToNavigationItem(page: CustomPage, fallbackPosition: number): OrderedNavigationItem | null {\n if (!page.label) return null\n return {\n id: `page:${page.path}`,\n label: page.label,\n icon: page.icon ?? 'FileText',\n route: page.path,\n section: page.section ?? 'main',\n badge: page.badge,\n permission: page.permission,\n position: page.position ?? fallbackPosition,\n children: page.children\n ?.map((child, index) => pageToNavigationItem(child, index))\n .filter((item): item is OrderedNavigationItem => Boolean(item)),\n }\n}\n\nfunction collectPageRoutes(\n pages: CustomPage[],\n out: RouteEntry[] = [],\n entityRouteMap: Map<string, string> = new Map(),\n): RouteEntry[] {\n for (const page of pages) {\n if (page.component && page.path !== '/settings') {\n if ((page.component as any).__isCrudPage) {\n ;(page.component as any).__crudBasePath = page.path\n registerEntityRoute(page.component, page.path, entityRouteMap)\n }\n out.push({ path: page.path, Component: page.component as React.ComponentType<Record<string, unknown>> })\n out.push({ path: `${page.path}/*`, Component: page.component as React.ComponentType<Record<string, unknown>> })\n }\n if (page.children?.length) collectPageRoutes(page.children, out, entityRouteMap)\n }\n return out\n}\n\nfunction buildSettingsTabs(\n pluginTabs: PluginSettingsTab[],\n can: (feature: string, action?: PermissionAction) => boolean,\n t: (key: string, params?: Record<string, string | number>) => string,\n showOrgSettings: boolean,\n): { id: string; label: string; icon?: React.ReactNode; component: React.ReactNode }[] {\n const settingsTabs: { id: string; label: string; icon?: React.ReactNode; component: React.ReactNode }[] = []\n\n if (showOrgSettings) {\n settingsTabs.push(\n { id: 'team', label: t('settings.team'), icon: <Users className=\"h-4 w-4\" />, component: <TeamTab /> },\n { id: 'permissions', label: t('settings.permissions'), icon: <ShieldCheck className=\"h-4 w-4\" />, component: <PermissionProfilesTab /> },\n { id: 'locations', label: t('settings.locations'), icon: <MapPin className=\"h-4 w-4\" />, component: <LocationsCrudPage /> },\n { id: 'field-rules', label: t('settings.fieldRules'), icon: <SlidersHorizontal className=\"h-4 w-4\" />, component: <ConnectedFieldRulesSettings /> },\n )\n }\n\n for (const tab of pluginTabs) {\n if (tab.permission && !can(tab.permission.feature, tab.permission.action)) continue\n if (!tab.component) continue\n\n const IconComp = tab.icon ? (LucideIcons as any)[tab.icon] ?? Puzzle : Puzzle\n const labelKey = `settings.plugin.${tab.id}`\n const translated = t(labelKey)\n settingsTabs.push({\n id: tab.id,\n label: translated === labelKey ? tab.label : translated,\n icon: React.createElement(IconComp as React.ComponentType<{ className?: string }>, { className: 'h-4 w-4' }),\n component: React.createElement(tab.component),\n // Flag plugin-contributed tabs so SettingsPage draws the core/plugins divider.\n isPlugin: true,\n } as any)\n }\n\n return settingsTabs\n}\n\nfunction AdminShellInner({ appName, layout = 'sidebar', logo, pages = [], showSettings = true, showOrgSettings = false, contentFrame = true, moduleNav }: AdminShellProps) {\n const runtime = usePluginRuntime()\n const t = useTranslation()\n const can = usePermissionOptional()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n const path = useAdminPath()\n const { user, signOut } = useAuth()\n\n // Navigation: plugin entries + custom pages (deduped, plugin order preserved).\n const navigation = React.useMemo<NavigationItem[]>(() => {\n const items: OrderedNavigationItem[] = runtime.navigation.map((entry) => ({\n ...navEntryToItem(entry),\n position: entry.position,\n }))\n for (const [index, page] of pages.entries()) {\n const item = pageToNavigationItem(page, index + 1000)\n if (item) items.push(item)\n }\n return items.sort(compareNavigation)\n }, [runtime.navigation, pages])\n\n // Route table: plugin routes + custom pages, most-specific-first.\n const routes = React.useMemo<RouteEntry[]>(() => {\n const list: RouteEntry[] = []\n const entityRouteMap = new Map<string, string>()\n for (const r of runtime.routes as PluginRouteDefinition[]) {\n const Component = resolvePluginComponent(r) as React.ComponentType<Record<string, unknown>> | undefined\n if (Component) {\n list.push({ path: r.path, Component, fullBleed: r.fullBleed })\n list.push({ path: `${r.path}/*`, Component, fullBleed: r.fullBleed })\n }\n }\n if (showSettings) list.push({ path: '/settings/*', Component: SettingsPage as React.ComponentType<Record<string, unknown>> })\n if (showSettings) list.push({ path: '/settings', Component: SettingsPage as React.ComponentType<Record<string, unknown>> })\n collectPageRoutes(pages, list, entityRouteMap)\n setEntityRouteMap(entityRouteMap)\n return list.sort((a, b) => routeScore(b.path) - routeScore(a.path))\n }, [runtime.routes, pages, showSettings])\n\n const match = React.useMemo(() => {\n for (const r of routes) {\n const params = matchRoute(r.path, path)\n if (params) return { route: r, params }\n }\n return null\n }, [routes, path])\n\n // Treat '/' as the index: redirect to the first nav entry once it's known.\n React.useEffect(() => {\n if (!match && (path === '/' || path === '') && navigation.length > 0) {\n navigateTo(navigation[0]!.route)\n }\n }, [match, path, navigation])\n\n const ActiveComponent = match?.route.Component\n const activeParams = match?.params ?? {}\n const settingsTabs = React.useMemo(\n () => buildSettingsTabs(runtime.settingsTabs as PluginSettingsTab[], can, t, showOrgSettings),\n [runtime.settingsTabs, can, t, showOrgSettings],\n )\n\n const shellUser = user\n ? { fullName: user.fullName ?? user.email, email: user.email, avatarUrl: user.avatarUrl }\n : undefined\n\n // Module-internal nav style: explicit override, else by layout (GHL-style\n // tabs for sidebar products, left rail for topbar products).\n const moduleVariant: ModuleNavVariant = moduleNav ?? (layout === 'sidebar' ? 'tabs' : 'rail')\n\n // The layout owns the page title (shown in the top header), derived from the\n // active navigation entry — individual pages don't render their own title.\n const activePageTitle = React.useMemo(() => {\n if (path === '/settings' || path.startsWith('/settings/')) return tr('common.settings', 'Settings')\n const candidates = navigation\n .filter((n) => n.route)\n .sort((a, b) => b.route.length - a.route.length)\n const hit = candidates.find((n) =>\n n.route === '/' ? path === '/' || path === '' : path === n.route || path.startsWith(n.route + '/') || path.startsWith(n.route),\n )\n return hit?.label ?? candidates.find((n) => n.route === '/')?.label ?? ''\n }, [navigation, path, tr])\n\n const activeContent = ActiveComponent ? (\n match.route.path === '/settings' || match.route.path === '/settings/*'\n ? <SettingsPage extraTabs={settingsTabs} />\n : <ActiveComponent {...activeParams} />\n ) : null\n\n return (\n <ModuleLayoutProvider variant={moduleVariant}>\n <AppShell\n variant={layout}\n contentFrame={contentFrame}\n navigation={navigation}\n logo={logo ?? <span className=\"text-lg font-bold\">{appName}</span>}\n user={shellUser}\n pageTitle={activePageTitle}\n currentPath={path}\n onNavigate={(route) => navigateTo(route)}\n onSignOut={() => { void signOut() }}\n onSettings={() => navigateTo('/settings')}\n sidebarTopContent={<WorkspaceSwitcher />}\n userMenuSlot={\n <AdminUserMenu\n user={shellUser}\n onSettings={() => navigateTo('/settings')}\n onSignOut={() => { void signOut() }}\n />\n }\n >\n {activeContent ? (\n <PageTransition\n transitionKey={match?.route.path ?? path}\n className={match?.route.fullBleed ? 'h-full min-h-0' : undefined}\n >\n {match?.route.fullBleed\n ? <div className=\"h-full min-h-0 overflow-hidden\">{activeContent}</div>\n : <div className=\"space-y-6 p-6\">{activeContent}</div>}\n </PageTransition>\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center p-12 text-center\">\n <p className=\"text-lg font-semibold text-foreground\">\n {navigation.length ? tr('common.notFound', 'Page not found') : tr('common.welcome', 'Welcome')}\n </p>\n {navigation.length > 0 && (\n <button\n className=\"mt-3 text-sm text-primary underline\"\n onClick={() => navigateTo(navigation[0]!.route)}\n >\n {navigation[0]!.label}\n </button>\n )}\n </div>\n )}\n </AppShell>\n </ModuleLayoutProvider>\n )\n}\n\n/** The shell + an auth gate in front of it. */\nexport function AdminShell(props: AdminShellProps) {\n const { isAuthenticated, isLoading } = useAuth()\n const requireAuth = props.requireAuth ?? true\n\n if (requireAuth && !isAuthenticated) {\n if (isLoading) {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background\">\n <span className=\"text-sm text-muted-foreground\">Loading…</span>\n </div>\n )\n }\n return (\n <LoginPage\n appName={props.appName}\n logo={props.logo}\n loginLogo={props.loginLogo}\n layout={props.loginLayout}\n tagline={props.loginTagline}\n description={props.loginDescription}\n showOAuth={props.showOAuth}\n oauthProviders={props.oauthProviders}\n />\n )\n }\n\n return <AdminShellInner {...props} />\n}\nAdminShell.displayName = 'AdminShell'\n","import * as React from 'react'\nimport type { AuthAdapter, OrgAdapter } from '@fayz-ai/core'\nimport {\n PluginRuntimeProvider,\n resolvePluginRuntime,\n I18nProvider,\n coreTranslations,\n mergeTranslations,\n setCurrentLocale,\n} from '@fayz-ai/core'\nimport { AuthProvider, createSupabaseAuthAdapter, createMockAuthAdapter } from '@fayz-ai/auth'\nimport { NavTransitionProvider } from '@fayz-ai/ui'\nimport { createFayzSupabaseClient, getFayzSupabaseClientOptional } from '../supabase/client'\nimport { OrgProvider } from '../org/context'\nimport { createSupabaseOrgAdapter } from '../org/adapters/supabase'\nimport { createMockOrgAdapter } from '../org/adapters/mock'\nimport { useOrganizationStore } from '../org/store'\nimport { PermissionsProvider } from '../permissions/context'\nimport { ToastProvider } from '../shell/components/notifications/ToastProvider'\nimport { ChatFab, ChatPanel } from '../shell/components/chat'\nimport { useBillingStore } from '../billing/store'\nimport type { Plan } from '@fayz-ai/core'\nimport type { PlanConfig } from '../shell/types/billing'\nimport { useThemeStore } from '../shell/stores/theme.store'\nimport { resolveTheme, type CreateThemeOptions } from '../shell/config/theme/utils'\nimport type { SaasTheme } from '../shell/config/theme/tokens'\nimport { AdminShell } from './AdminShell'\nimport { useAdminPath } from './routing'\nimport type { FayzAppConfig } from './config'\n\n// ---------------------------------------------------------------------------\n// Adapter resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveAuthAdapter(config: FayzAppConfig): AuthAdapter {\n const auth = config.auth\n if (auth?.adapter && typeof auth.adapter === 'object') return auth.adapter as AuthAdapter\n\n const strategy = auth?.adapter ?? (config.supabaseUrl ? 'supabase' : 'mock')\n if (strategy === 'supabase') {\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\n throw new Error(\n \"[@fayz-ai/saas] auth.adapter='supabase' requires supabaseUrl and supabaseAnonKey in FayzAppConfig.\",\n )\n }\n return createSupabaseAuthAdapter({\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n supabaseClient: getFayzSupabaseClientOptional() ?? undefined,\n })\n }\n return createMockAuthAdapter()\n}\n\nfunction resolveOrgAdapter(config: FayzAppConfig): OrgAdapter {\n const org = config.org\n if (org?.adapter && typeof org.adapter === 'object') return org.adapter as OrgAdapter\n\n const strategy = org?.adapter ?? (config.supabaseUrl ? 'supabase' : 'mock')\n if (strategy === 'supabase') return createSupabaseOrgAdapter()\n return createMockOrgAdapter(config.permissions?.defaultProfiles)\n}\n\nfunction buildI18nConfig(config: FayzAppConfig): {\n defaultLocale: string\n supported: string[]\n translations: Record<string, Record<string, string>>\n} {\n const defaultLocale = config.locale?.default ?? 'en'\n const supported = config.locale?.supported ?? [defaultLocale, 'pt-BR']\n\n const pluginTranslations: Array<Record<string, Record<string, string>>> = []\n for (const plugin of config.plugins ?? []) {\n if (plugin.locales) pluginTranslations.push(plugin.locales)\n }\n\n const translations = mergeTranslations(\n coreTranslations,\n ...pluginTranslations,\n config.locale?.translations,\n )\n\n return { defaultLocale, supported, translations }\n}\n\n// ---------------------------------------------------------------------------\n// BillingInitializer — seeds the billing store from config on mount\n// ---------------------------------------------------------------------------\n\nfunction BillingInitializer({ config }: { config: FayzAppConfig }) {\n const setPlans = useBillingStore((s) => s.setPlans)\n React.useEffect(() => {\n if (config.billing?.plans) setPlans(config.billing.plans.map(normalizeBillingPlan))\n }, [config.billing, setPlans])\n return null\n}\n\nfunction normalizeBillingPlan(plan: PlanConfig): Plan {\n return {\n id: plan.id,\n name: plan.name,\n description: plan.description,\n price: plan.priceMonthly ?? plan.prices?.monthly ?? 0,\n currency: plan.currency ?? 'USD',\n interval: 'month',\n features: plan.features,\n highlighted: plan.popular,\n stripePriceId: undefined,\n }\n}\n\nfunction ThemeInitializer({ config }: { config: FayzAppConfig }) {\n const initialize = useThemeStore((s) => s.initialize)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n const setMode = useThemeStore((s) => s.setMode)\n\n React.useEffect(() => {\n if (config.theme) {\n const isSaasTheme = 'brand' in config.theme && (\n 'radius' in config.theme || 'sidebar' in config.theme || 'font' in config.theme\n )\n const resolved = isSaasTheme\n ? resolveTheme(config.theme as SaasTheme)\n : config.theme as CreateThemeOptions\n setOverrides(resolved)\n }\n if (config.defaultThemeMode && typeof window !== 'undefined' && !localStorage.getItem('saas-core:theme-mode')) {\n setMode(config.defaultThemeMode)\n }\n initialize()\n }, [config.defaultThemeMode, config.theme, initialize, setMode, setOverrides])\n\n return null\n}\n\n// ---------------------------------------------------------------------------\n// AdminProviders — the provider stack shared by the createFayzApp/createSaasApp\n// sugar path AND the manifest-driven AdminScaffold. Resolves adapters + i18n\n// once (stable refs) and recomputes the plugin runtime reactively as the path\n// changes, so route-scoped widget visibility stays correct.\n//\n// AuthProvider → OrgProvider → PluginRuntimeProvider\n// → PermissionsProvider → I18nProvider → (BillingInitializer + children)\n// ---------------------------------------------------------------------------\n\nexport function AdminProviders({ config, children }: { config: FayzAppConfig; children: React.ReactNode }) {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n\n // Resolve adapters / i18n once per config identity.\n const resolved = React.useMemo(() => {\n if (config.supabaseUrl && config.supabaseAnonKey) {\n createFayzSupabaseClient(config.supabaseUrl, config.supabaseAnonKey)\n }\n const i18n = buildI18nConfig(config)\n setCurrentLocale(i18n.defaultLocale)\n return {\n authAdapter: resolveAuthAdapter(config),\n orgAdapter: resolveOrgAdapter(config),\n i18n,\n plugins: config.plugins ?? [],\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config])\n\n // Recompute the plugin runtime when the hash path or tenant changes\n // (route-scoped visibility + tenant-scoped plugin data providers).\n const path = useAdminPath()\n const runtime = React.useMemo(\n () =>\n resolvePluginRuntime({\n plugins: resolved.plugins,\n context: {\n tenant: currentOrg\n ? {\n id: currentOrg.id,\n slug: currentOrg.slug,\n verticalId: currentOrg.verticalId,\n plan: currentOrg.plan,\n }\n : null,\n user: null,\n currentPath: path,\n matchedPath: path,\n layout: config.layout ?? 'sidebar',\n },\n }),\n [resolved.plugins, path, config.layout, currentOrg],\n )\n\n return (\n <AuthProvider adapter={resolved.authAdapter}>\n <OrgProvider adapter={resolved.orgAdapter} autoCreate={config.org?.autoCreate ?? true}>\n <PluginRuntimeProvider value={runtime}>\n <PermissionsProvider config={config.permissions}>\n <I18nProvider value={resolved.i18n}>\n <ThemeInitializer config={config} />\n <BillingInitializer config={config} />\n <ToastProvider />\n <NavTransitionProvider value={config.navTransition ?? 'slide'}>\n {children}\n </NavTransitionProvider>\n {config.chat?.enabled !== false && config.chat ? (\n <>\n <ChatFab apiEndpoint={config.chat.apiEndpoint} systemPrompt={config.chat.systemPrompt} />\n <ChatPanel title={config.chat.title} apiEndpoint={config.chat.apiEndpoint} systemPrompt={config.chat.systemPrompt} />\n </>\n ) : null}\n </I18nProvider>\n </PermissionsProvider>\n </PluginRuntimeProvider>\n </OrgProvider>\n </AuthProvider>\n )\n}\nAdminProviders.displayName = 'AdminProviders'\n\n// ---------------------------------------------------------------------------\n// createFayzApp — declarative admin app factory (sugar over the manifest path;\n// equivalent to renderApp(defineSaas(config)), sharing AdminProviders +\n// AdminShell with the scaffold).\n//\n// const App = createFayzApp({ name: 'Glow Studio', plugins: [...] })\n// export default App\n// ---------------------------------------------------------------------------\n\nexport function createFayzApp(config: FayzAppConfig): React.ComponentType {\n function FayzApp({ children }: { children?: React.ReactNode }) {\n return (\n <AdminProviders config={config}>\n {children ?? (\n <AdminShell\n appName={config.name}\n logo={config.logo}\n layout={config.layout}\n contentFrame={config.contentFrame}\n moduleNav={config.moduleNav}\n pages={config.pages}\n requireAuth={config.auth?.requireAuth}\n loginTagline={config.auth?.loginTagline}\n loginDescription={config.auth?.loginDescription}\n loginLogo={config.auth?.loginLogo}\n loginLayout={config.auth?.loginLayout}\n showOAuth={config.auth?.showOAuth}\n oauthProviders={config.auth?.oauthProviders}\n showSettings\n showOrgSettings={Boolean(config.org)}\n />\n )}\n </AdminProviders>\n )\n }\n FayzApp.displayName = `FayzApp(${config.name})`\n return FayzApp\n}\n","/**\n * Global entity route registry.\n *\n * Populated once during buildNavigation() with mappings from\n * \"archetype:kind\" (e.g. \"person:staff\") to the registered route path\n * (e.g. \"/registry/staff\"). Used by PersonLink, command palette, and\n * any component that needs to resolve an entity detail URL.\n */\n\nlet routeMap = new Map<string, string>()\n\n/** Replace the entity route map (called once at app init by buildNavigation). */\nexport function setEntityRouteMap(map: Map<string, string>): void {\n routeMap = map\n}\n\n/**\n * Resolve the route path for an entity given its archetype and kind.\n * Returns the registered path (e.g. \"/registry/staff\") or null if not found.\n *\n * Tries \"archetype:kind\" first, then \"archetype\" alone.\n */\nexport function resolveEntityRoute(archetype?: string, kind?: string): string | null {\n if (archetype && kind) {\n const specific = routeMap.get(`${archetype}:${kind}`)\n if (specific) return specific\n }\n if (archetype) {\n const general = routeMap.get(archetype)\n if (general) return general\n }\n return null\n}\n\n/**\n * Build a full URL path for an entity detail page.\n * Returns e.g. \"/registry/staff/uuid\" or \"/registry/staff/uuid/schedule\".\n * Falls back to \"/kind/uuid\" if no route registered.\n */\nexport function resolveEntityHref(id: string, archetype?: string, kind?: string, tab?: string): string {\n const route = resolveEntityRoute(archetype, kind)\n let href: string\n if (route) {\n href = `${route}/${id}`\n } else if (kind) {\n const plural = kind.endsWith('s') ? kind : kind + 's'\n href = `/${plural}/${id}`\n } else {\n href = `/${id}`\n }\n if (tab) href += `/${tab}`\n return href\n}\n","import * as React from 'react'\n\nexport interface RouterAdapter {\n navigate: (path: string) => void\n usePathname: () => string\n}\n\nexport function windowRouterAdapter(): RouterAdapter {\n return {\n navigate: (path) => {\n window.location.href = path\n },\n usePathname: () => {\n const [pathname, setPathname] = React.useState(\n typeof window !== 'undefined' ? window.location.pathname : '/'\n )\n\n React.useEffect(() => {\n const handler = () => setPathname(window.location.pathname)\n window.addEventListener('popstate', handler)\n return () => window.removeEventListener('popstate', handler)\n }, [])\n\n return pathname\n },\n }\n}\n\nexport function hashRouterAdapter(): RouterAdapter {\n return {\n navigate: (path) => {\n window.location.hash = path\n },\n usePathname: () => {\n const [pathname, setPathname] = React.useState(\n typeof window !== 'undefined' ? window.location.hash.slice(1) || '/' : '/'\n )\n\n React.useEffect(() => {\n const handler = () => setPathname(window.location.hash.slice(1) || '/')\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n return pathname\n },\n }\n}\n\nexport function reactRouterAdapter(\n navigateFn: (path: string) => void,\n useLocationHook: () => { pathname: string }\n): RouterAdapter {\n return {\n navigate: navigateFn,\n usePathname: () => useLocationHook().pathname,\n }\n}\n\n// --- Module-level singleton (avoids React context issues with linked packages) ---\n\nlet _globalRouter: RouterAdapter | null = null\n\nexport function setGlobalRouter(adapter: RouterAdapter): void {\n _globalRouter = adapter\n}\n\nexport function getGlobalRouter(): RouterAdapter {\n return _globalRouter ?? windowRouterAdapter()\n}\n\n// --- React Context (still available, but useRouter prefers singleton) ---\n\nconst RouterContext = React.createContext<RouterAdapter | null>(null)\n\nexport const RouterProvider = RouterContext.Provider\n\nexport function useRouter(): RouterAdapter {\n // Prefer context if available\n const ctx = React.useContext(RouterContext)\n if (ctx) return ctx\n // Fall back to module singleton\n if (_globalRouter) return _globalRouter\n // Last resort\n return windowRouterAdapter()\n}\n","import React from 'react'\nimport { WifiOff } from 'lucide-react'\nimport { getSupabaseClientOptional } from '../../lib/supabase'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport function MockModeBanner() {\n const { t } = useTranslation()\n\n if (getSupabaseClientOptional()) return null\n\n return (\n <div className=\"bg-warning/10 border-b border-warning/30 px-4 py-1.5 flex items-center justify-center gap-2 text-xs text-warning\">\n <WifiOff className=\"h-3 w-3 shrink-0\" />\n <span>{t('app.mockMode.banner')}</span>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { Plan, PlanInterval } from '../../types'\n\ninterface PlanSelectorProps {\n plans: Plan[]\n currentPlanId?: string\n interval: PlanInterval\n onIntervalChange: (interval: PlanInterval) => void\n onSelectPlan: (planId: string) => void\n loading?: boolean\n}\n\nexport function PlanSelector({\n plans,\n currentPlanId,\n interval,\n onIntervalChange,\n onSelectPlan,\n loading,\n}: PlanSelectorProps) {\n const { t } = useTranslation()\n\n return (\n <div className=\"space-y-8\">\n <div className=\"flex items-center justify-center gap-3\">\n <button\n type=\"button\"\n className={cn(\n 'rounded-full px-4 py-2 text-sm font-medium transition-colors',\n interval === 'monthly'\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => onIntervalChange('monthly')}\n >\n {t('billing.monthly')}\n </button>\n <button\n type=\"button\"\n className={cn(\n 'rounded-full px-4 py-2 text-sm font-medium transition-colors',\n interval === 'yearly'\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => onIntervalChange('yearly')}\n >\n {t('billing.yearly')}\n <span className=\"ml-1.5 text-xs opacity-80\">{t('billing.yearlySave')}</span>\n </button>\n </div>\n\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {plans.map((plan) => {\n const isCurrent = plan.id === currentPlanId\n const price = interval === 'monthly' ? (plan.prices?.monthly ?? plan.priceMonthly) : (plan.prices?.yearly ?? plan.priceYearly)\n\n return (\n <Card\n key={plan.id}\n className={cn(\n 'relative flex flex-col',\n plan.popular && 'border-primary shadow-md'\n )}\n >\n {plan.popular && (\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <Badge>{t('billing.mostPopular')}</Badge>\n </div>\n )}\n\n <CardHeader>\n <CardTitle className=\"text-xl\">{plan.name}</CardTitle>\n <CardDescription>{plan.description}</CardDescription>\n </CardHeader>\n\n <CardContent className=\"flex-1\">\n <div className=\"mb-6\">\n <span className=\"text-4xl font-bold\">\n ${price}\n </span>\n <span className=\"text-muted-foreground\">\n /{interval === 'monthly' ? 'mo' : 'yr'}\n </span>\n </div>\n\n <ul className=\"space-y-3\">\n {plan.features.map((feature) => (\n <li key={feature} className=\"flex items-start gap-2 text-sm\">\n <Check className=\"mt-0.5 h-4 w-4 shrink-0 text-primary\" />\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n </CardContent>\n\n <CardFooter>\n {isCurrent ? (\n <Button variant=\"outline\" className=\"w-full\" disabled>\n {t('billing.currentPlan')}\n </Button>\n ) : (\n <Button\n className=\"w-full\"\n variant={plan.popular ? 'default' : 'outline'}\n disabled={loading}\n onClick={() => onSelectPlan(plan.id)}\n >\n {loading ? t('billing.processing') : t('billing.getStarted')}\n </Button>\n )}\n </CardFooter>\n </Card>\n )\n })}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Calendar, AlertCircle } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { Subscription, Plan } from '../../types'\n\ninterface SubscriptionCardProps {\n subscription: Subscription\n plan?: Plan\n onCancel?: () => void\n onResume?: () => void\n loading?: boolean\n}\n\nconst STATUS_KEYS: Record<string, { key: string; variant: 'default' | 'secondary' | 'destructive' | 'outline' }> = {\n active: { key: 'billing.status.active', variant: 'default' },\n trialing: { key: 'billing.status.trialing', variant: 'secondary' },\n past_due: { key: 'billing.status.pastDue', variant: 'destructive' },\n canceled: { key: 'billing.status.canceled', variant: 'outline' },\n paused: { key: 'billing.status.paused', variant: 'outline' },\n}\n\nfunction formatDate(dateString: string): string {\n return new Date(dateString).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\nexport function SubscriptionCard({\n subscription,\n plan,\n onCancel,\n onResume,\n loading,\n}: SubscriptionCardProps) {\n const { t } = useTranslation()\n const statusInfo = STATUS_KEYS[subscription.status] ?? STATUS_KEYS.active\n\n return (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-lg\">\n {plan?.name ?? t('billing.currentPlan')}\n </CardTitle>\n <Badge variant={statusInfo.variant}>{t(statusInfo.key)}</Badge>\n </div>\n {plan && <CardDescription>{plan.description}</CardDescription>}\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Calendar className=\"h-4 w-4\" />\n <span>\n {subscription.cancelAtPeriodEnd\n ? t('billing.cancelsOn', { date: formatDate(subscription.currentPeriodEnd) })\n : t('billing.nextBilling', { date: formatDate(subscription.currentPeriodEnd) })}\n </span>\n </div>\n\n {subscription.trialEnd && new Date(subscription.trialEnd) > new Date() && (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n <span>{t('billing.trialEnds', { date: formatDate(subscription.trialEnd) })}</span>\n </div>\n )}\n\n {plan && (\n <div className=\"text-sm\">\n <span className=\"text-2xl font-bold\">\n ${subscription.interval === 'monthly' ? (plan.prices?.monthly ?? plan.priceMonthly) : (plan.prices?.yearly ?? plan.priceYearly)}\n </span>\n <span className=\"text-muted-foreground\">\n /{subscription.interval === 'monthly' ? 'mo' : 'yr'}\n </span>\n </div>\n )}\n\n {subscription.status === 'past_due' && (\n <div className={cn(\n 'rounded-md border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive'\n )}>\n {t('billing.pastDueWarning')}\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"gap-2\">\n {subscription.cancelAtPeriodEnd && onResume ? (\n <Button variant=\"default\" onClick={onResume} disabled={loading}>\n {loading ? t('billing.resuming') : t('billing.resumeSubscription')}\n </Button>\n ) : (\n onCancel && subscription.status === 'active' && (\n <Button variant=\"outline\" onClick={onCancel} disabled={loading}>\n {loading ? t('billing.canceling') : t('billing.cancelSubscription')}\n </Button>\n )\n )}\n </CardFooter>\n </Card>\n )\n}\n","import { useCallback, useMemo } from 'react'\nimport { useBillingStore } from '../stores/billing.store'\nimport { getSupabaseClient } from '../lib/supabase'\nimport type { PlanInterval } from '../types'\n\nexport function useBilling() {\n const store = useBillingStore()\n\n const fetchPlans = useCallback(async () => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { data, error } = await supabase\n .from('plans')\n .select('*')\n .order('prices->monthly', { ascending: true })\n\n if (error) throw error\n store.setPlans(data ?? [])\n } catch (err) {\n console.error('Failed to fetch plans:', err)\n } finally {\n store.setLoading(false)\n }\n }, [store])\n\n const fetchSubscription = useCallback(async () => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { data, error } = await supabase\n .from('subscriptions')\n .select('*')\n .single()\n\n if (error && error.code !== 'PGRST116') throw error\n store.setSubscription(data ?? null)\n } catch (err) {\n console.error('Failed to fetch subscription:', err)\n } finally {\n store.setLoading(false)\n }\n }, [store])\n\n const fetchInvoices = useCallback(async () => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { data, error } = await supabase\n .from('invoices')\n .select('*')\n .order('created_at', { ascending: false })\n\n if (error) throw error\n store.setInvoices(data ?? [])\n } catch (err) {\n console.error('Failed to fetch invoices:', err)\n } finally {\n store.setLoading(false)\n }\n }, [store])\n\n const subscribe = useCallback(\n async (planId: string, interval: PlanInterval) => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { data, error } = await supabase.functions.invoke(\n 'create-checkout',\n { body: { planId, interval } }\n )\n\n if (error) throw error\n if (data?.url) {\n window.location.href = data.url\n }\n } catch (err) {\n console.error('Failed to create checkout session:', err)\n throw err\n } finally {\n store.setLoading(false)\n }\n },\n [store]\n )\n\n const cancelSubscription = useCallback(async () => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { error } = await supabase.functions.invoke(\n 'cancel-subscription',\n { body: {} }\n )\n\n if (error) throw error\n await fetchSubscription()\n } catch (err) {\n console.error('Failed to cancel subscription:', err)\n throw err\n } finally {\n store.setLoading(false)\n }\n }, [store, fetchSubscription])\n\n const resumeSubscription = useCallback(async () => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { error } = await supabase.functions.invoke(\n 'resume-subscription',\n { body: {} }\n )\n\n if (error) throw error\n await fetchSubscription()\n } catch (err) {\n console.error('Failed to resume subscription:', err)\n throw err\n } finally {\n store.setLoading(false)\n }\n }, [store, fetchSubscription])\n\n return useMemo(\n () => ({\n subscription: store.subscription,\n invoices: store.invoices,\n plans: store.plans,\n loading: store.loading,\n fetchPlans,\n fetchSubscription,\n fetchInvoices,\n subscribe,\n cancelSubscription,\n resumeSubscription,\n }),\n [\n store.subscription,\n store.invoices,\n store.plans,\n store.loading,\n fetchPlans,\n fetchSubscription,\n fetchInvoices,\n subscribe,\n cancelSubscription,\n resumeSubscription,\n ]\n )\n}\n","import * as React from 'react'\nimport { PlanSelector } from './PlanSelector'\nimport { SubscriptionCard } from './SubscriptionCard'\nimport { useBillingStore } from '../../stores/billing.store'\nimport { useBilling } from '../../hooks/useBilling'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { PlanInterval } from '../../types'\n\ninterface BillingPageProps {\n className?: string\n}\n\nexport function BillingPage({ className }: BillingPageProps) {\n const { plans, subscription, loading } = useBillingStore()\n const billing = useBilling()\n const { t } = useTranslation()\n const [interval, setInterval] = React.useState<PlanInterval>('monthly')\n\n // Fetch subscription on mount\n React.useEffect(() => {\n billing.fetchSubscription()\n }, [])\n\n const currentPlan = plans.find((p) => p.id === subscription?.planId)\n\n return (\n <div className={className ?? 'mx-auto max-w-5xl space-y-8'}>\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('billing.title')}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('billing.subtitle')}\n </p>\n </div>\n\n {subscription && (\n <SubscriptionCard\n subscription={subscription as any}\n plan={currentPlan as any}\n onCancel={billing.cancelSubscription}\n loading={loading}\n />\n )}\n\n {plans.length > 0 && (\n <PlanSelector\n plans={plans as any}\n currentPlanId={subscription?.planId}\n interval={interval}\n onIntervalChange={setInterval}\n onSelectPlan={(planId) => billing.subscribe(planId, interval)}\n loading={loading}\n />\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useEffect, useRef, useState, useCallback } from 'react'\nimport { Command } from 'cmdk'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport {\n Home, Users, Settings, CreditCard, Bell, Calendar, Package, BarChart3,\n FileText, Mail, Search, DollarSign, Megaphone, ShoppingCart, Target,\n Wrench, ClipboardList, Briefcase, UserCog, BookOpen, MessageCircle,\n Globe, Percent, Tag, Camera, UtensilsCrossed, MapPin, Handshake,\n Contact, Building2, Filter, Plus, List, User, Box, Sparkles, Loader2,\n type LucideIcon,\n} from 'lucide-react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport interface CommandItem {\n id: string\n label: string\n icon?: string\n action: () => void\n group?: string\n keywords?: string\n subtitle?: string\n}\n\nexport interface EntitySearchResult {\n id: string\n label: string\n subtitle?: string\n group: string\n icon?: string\n data?: Record<string, unknown>\n}\n\nexport type EntitySearchFn = (query: string) => Promise<EntitySearchResult[]>\n\ninterface CommandPaletteProps {\n commands?: CommandItem[]\n open: boolean\n onOpenChange: (open: boolean) => void\n onEntitySearch?: EntitySearchFn\n onEntitySelect?: (result: EntitySearchResult) => void\n}\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, Package, BarChart3,\n FileText, Mail, Search, DollarSign, Megaphone, ShoppingCart, Target,\n Wrench, ClipboardList, Briefcase, UserCog, BookOpen, MessageCircle,\n Globe, Percent, Tag, Camera, UtensilsCrossed, MapPin, Handshake,\n Contact, Building2, Filter, Plus, List, User, Box, Sparkles,\n}\n\nconst ENTITY_ICON: Record<string, LucideIcon> = {\n person: User,\n persons: User,\n product: Box,\n products: Box,\n service: Sparkles,\n services: Sparkles,\n}\n\n// ---------------------------------------------------------------------------\n// Debounced entity search hook\n// ---------------------------------------------------------------------------\n\nfunction useEntitySearch(searchFn: EntitySearchFn | undefined, query: string, open: boolean) {\n const [results, setResults] = useState<EntitySearchResult[]>([])\n const [loading, setLoading] = useState(false)\n const abortRef = useRef(0)\n\n useEffect(() => {\n if (!open) {\n setResults([])\n setLoading(false)\n return\n }\n\n const trimmed = query.trim()\n if (!searchFn || trimmed.length < 2) {\n setResults([])\n setLoading(false)\n return\n }\n\n setLoading(true)\n const id = ++abortRef.current\n\n const timer = setTimeout(async () => {\n try {\n const data = await searchFn(trimmed)\n if (abortRef.current === id) {\n setResults(data)\n setLoading(false)\n }\n } catch {\n if (abortRef.current === id) {\n setResults([])\n setLoading(false)\n }\n }\n }, 250)\n\n return () => clearTimeout(timer)\n }, [query, searchFn, open])\n\n return { results, loading }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onEntitySelect }: CommandPaletteProps) {\n const { t } = useTranslation()\n const [search, setSearch] = useState('')\n const { results: entityResults, loading: entityLoading } = useEntitySearch(onEntitySearch, search, open)\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n onOpenChange(!open)\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, onOpenChange])\n\n // Reset search when closed\n useEffect(() => {\n if (!open) setSearch('')\n }, [open])\n\n const grouped = commands.reduce<Record<string, CommandItem[]>>((acc, cmd) => {\n const group = cmd.group ?? 'Actions'\n if (!acc[group]) acc[group] = []\n acc[group].push(cmd)\n return acc\n }, {})\n\n // Group entity results\n const entityGrouped = entityResults.reduce<Record<string, EntitySearchResult[]>>((acc, r) => {\n const group = r.group || 'Results'\n if (!acc[group]) acc[group] = []\n acc[group].push(r)\n return acc\n }, {})\n\n const hasSearch = search.trim().length >= 2\n const totalResults = commands.length + entityResults.length\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"saas-overlay fixed inset-0 z-50 bg-black/40 backdrop-blur-sm\" />\n <Dialog.Content className=\"fayz-glass-surface saas-cmd-palette fixed left-1/2 top-[15%] z-50 w-full max-w-xl -translate-x-1/2 overflow-hidden rounded-2xl border border-border/50 bg-popover shadow-2xl\">\n <Dialog.Title className=\"sr-only\">{t('layout.commandPalette.title')}</Dialog.Title>\n <Dialog.Description className=\"sr-only\">{t('layout.commandPalette.description')}</Dialog.Description>\n\n <Command className=\"flex flex-col\" label=\"Command palette\" shouldFilter={true}>\n <div className=\"flex items-center gap-3 border-b border-border/50 px-4\">\n <Search className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <Command.Input\n placeholder={t('layout.commandPalette.placeholder')}\n className=\"flex h-12 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n autoFocus\n value={search}\n onValueChange={setSearch}\n />\n {entityLoading && <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground\" />}\n <kbd className=\"hidden shrink-0 rounded-md border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground sm:inline-block\">ESC</kbd>\n </div>\n\n <Command.List className=\"max-h-[360px] overflow-y-auto p-1.5\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n {entityLoading ? t('layout.commandPalette.searching') : t('layout.commandPalette.noResults')}\n </Command.Empty>\n\n {/* Static commands (pages, actions) */}\n {Object.entries(grouped).map(([group, items]) => (\n <Command.Group\n key={group}\n heading={group}\n className=\"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground\"\n >\n {items.map((cmd) => {\n const Icon = cmd.icon ? (ICON_MAP[cmd.icon] ?? null) : null\n return (\n <Command.Item\n key={cmd.id}\n value={`${cmd.label} ${cmd.keywords ?? ''}`}\n onSelect={() => { cmd.action(); onOpenChange(false) }}\n className=\"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm outline-none transition-colors aria-selected:bg-muted\"\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"flex-1\">{cmd.label}</span>\n <span className=\"text-[11px] text-muted-foreground/40\">{cmd.group}</span>\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n\n {/* Entity search results */}\n {hasSearch && Object.entries(entityGrouped).map(([group, items]) => {\n const GroupIcon = ENTITY_ICON[group.toLowerCase()] ?? User\n return (\n <Command.Group\n key={`entity:${group}`}\n heading={group}\n className=\"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground\"\n >\n {items.map((result) => {\n const Icon = result.icon ? (ICON_MAP[result.icon] ?? GroupIcon) : GroupIcon\n return (\n <Command.Item\n key={`entity:${result.id}`}\n value={`${result.label} ${result.subtitle ?? ''} ${result.group}`}\n onSelect={() => { onEntitySelect?.(result); onOpenChange(false) }}\n className=\"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm outline-none transition-colors aria-selected:bg-muted\"\n >\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate\">{result.label}</span>\n {result.subtitle && (\n <span className=\"block truncate text-[11px] text-muted-foreground\">{result.subtitle}</span>\n )}\n </div>\n <span className=\"text-[11px] text-muted-foreground/40 shrink-0\">{result.group}</span>\n </Command.Item>\n )\n })}\n </Command.Group>\n )\n })}\n </Command.List>\n\n <div className=\"flex items-center justify-between border-t border-border/50 px-4 py-2\">\n <span className=\"text-xs text-muted-foreground\">\n {entityLoading\n ? t('layout.commandPalette.searching')\n : hasSearch\n ? t('layout.commandPalette.resultCount', { count: String(totalResults), plural: totalResults !== 1 ? 's' : '' })\n : t('layout.commandPalette.commandCount', { count: String(commands.length), plural: commands.length !== 1 ? 's' : '' })}\n </span>\n <div className=\"flex items-center gap-2 text-[10px] text-muted-foreground\">\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">&uarr;&darr;</kbd>\n <span>{t('layout.commandPalette.navigate')}</span>\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">&crarr;</kbd>\n <span>{t('layout.commandPalette.open')}</span>\n </div>\n </div>\n </Command>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import { useEffect, useCallback } from 'react'\nimport { useAuthStore } from '../stores/auth.store'\nimport { useAuthAdapterOptional } from '../lib/auth-context'\nimport type { AuthProvider } from '../types'\n\nexport function useAuth() {\n const store = useAuthStore()\n const adapter = useAuthAdapterOptional()\n\n useEffect(() => {\n if (!adapter) {\n // No adapter configured — mark as initialized (no auth flow)\n store.setInitialized(true)\n store.setLoading(false)\n return\n }\n\n adapter.getSession().then((result) => {\n if (result) {\n store.setSession(result.session)\n } else {\n store.setPendingEmailVerification(false)\n }\n store.setInitialized(true)\n store.setLoading(false)\n })\n\n const unsubscribe = adapter.onAuthStateChange((user) => {\n if (user) {\n store.setUser(user)\n store.setPendingEmailVerification(false)\n } else {\n store.setUser(null)\n store.setSession(null)\n }\n store.setLoading(false)\n })\n\n return unsubscribe\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const signIn = useCallback(async (email: string, password: string) => {\n if (!adapter) throw new Error('No auth adapter configured')\n store.setLoading(true)\n try {\n const session = await adapter.signIn(email, password)\n store.setSession(session)\n store.setPendingEmailVerification(false)\n } finally {\n store.setLoading(false)\n }\n }, [adapter, store])\n\n const signUp = useCallback(async (email: string, password: string, fullName: string) => {\n if (!adapter) throw new Error('No auth adapter configured')\n store.setLoading(true)\n try {\n const session = await adapter.signUp(email, password, fullName)\n const requiresEmailVerification = !session.accessToken\n if (requiresEmailVerification) {\n store.setSession(null)\n store.setPendingEmailVerification(true)\n return { requiresEmailVerification: true }\n }\n\n store.setSession(session)\n store.setPendingEmailVerification(false)\n return { requiresEmailVerification: false }\n } finally {\n store.setLoading(false)\n }\n }, [adapter, store])\n\n const signOut = useCallback(async () => {\n if (!adapter) throw new Error('No auth adapter configured')\n store.setLoading(true)\n try {\n await adapter.signOut()\n store.reset()\n store.setInitialized(true)\n } finally {\n store.setLoading(false)\n }\n }, [adapter, store])\n\n const signInWithOAuth = useCallback(async (provider: AuthProvider) => {\n if (!adapter) throw new Error('No auth adapter configured')\n await adapter.signInWithOAuth(provider)\n }, [adapter])\n\n const resetPassword = useCallback(async (email: string) => {\n if (!adapter) throw new Error('No auth adapter configured')\n await adapter.resetPassword(email)\n }, [adapter])\n\n return {\n user: store.user,\n session: store.session,\n loading: store.loading,\n initialized: store.initialized,\n pendingEmailVerification: store.pendingEmailVerification,\n signIn,\n signUp,\n signOut,\n signInWithOAuth,\n resetPassword,\n }\n}\n","import React from 'react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthProvider } from '../../types'\n\ninterface OAuthButtonsProps {\n providers: Exclude<AuthProvider, 'email'>[]\n onProviderClick?: (provider: AuthProvider) => void\n className?: string\n}\n\nfunction GoogleIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n )\n}\n\nfunction GitHubIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" />\n </svg>\n )\n}\n\nfunction AppleIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </svg>\n )\n}\n\nconst providerConfig: Record<Exclude<AuthProvider, 'email'>, { label: string; icon: React.FC<{ className?: string }> }> = {\n google: { label: 'Google', icon: GoogleIcon },\n github: { label: 'GitHub', icon: GitHubIcon },\n apple: { label: 'Apple', icon: AppleIcon },\n}\n\nexport function OAuthButtons({ providers, onProviderClick, className }: OAuthButtonsProps) {\n const { t } = useTranslation()\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n {providers.map((provider) => {\n const config = providerConfig[provider]\n const Icon = config.icon\n return (\n <button\n key={provider}\n type=\"button\"\n onClick={() => onProviderClick?.(provider)}\n className=\"inline-flex items-center justify-center gap-2 h-10 px-4 py-2 rounded-md border border-input bg-background text-sm font-medium hover:bg-accent hover:text-accent-foreground transition-colors\"\n >\n <Icon className=\"h-4 w-4\" />\n {t('auth.oauth.continueWith', { provider: config.label })}\n </button>\n )\n })}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { useAuth } from '../../hooks/useAuth'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { OAuthButtons } from './OAuthButtons'\nimport type { AuthProvider } from '../../types'\n\ninterface LoginFormProps {\n onSuccess?: () => void\n onForgotPassword?: () => void\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n className?: string\n}\n\nexport function LoginForm({\n onSuccess,\n onForgotPassword,\n showOAuth = false,\n oauthProviders = ['google', 'github'],\n className,\n}: LoginFormProps) {\n const { signIn, signInWithOAuth, loading } = useAuth()\n const { t } = useTranslation()\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError(null)\n\n try {\n await signIn(email, password)\n onSuccess?.()\n } catch (err: any) {\n setError(err.message ?? t('auth.login.failedDefault'))\n }\n }\n\n const handleOAuthClick = async (provider: AuthProvider) => {\n setError(null)\n try {\n await signInWithOAuth(provider)\n } catch (err: any) {\n setError(err.message ?? t('auth.login.failedWithProvider', { provider }))\n }\n }\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn('flex flex-col gap-4 w-full max-w-sm', className)}\n >\n {error && (\n <div className=\"rounded-md bg-destructive/10 border border-destructive/20 px-4 py-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"login-email\" className=\"text-sm font-medium text-foreground\">\n {t('auth.email')}\n </label>\n <input\n id=\"login-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={t('auth.login.placeholder.email')}\n required\n autoComplete=\"email\"\n className=\"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"login-password\" className=\"text-sm font-medium text-foreground\">\n {t('auth.password')}\n </label>\n <input\n id=\"login-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder={t('auth.login.placeholder.password')}\n required\n autoComplete=\"current-password\"\n className=\"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n\n {onForgotPassword && (\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-sm text-muted-foreground hover:text-foreground self-end -mt-2 transition-colors\"\n >\n {t('auth.forgotPassword')}\n </button>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"inline-flex items-center justify-center h-10 px-4 py-2 rounded-md bg-primary border border-primary text-primary-foreground font-medium text-sm hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n >\n {loading ? t('auth.login.signingIn') : t('auth.signIn')}\n </button>\n\n {showOAuth && oauthProviders.length > 0 && (\n <>\n <div className=\"relative my-2\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-border\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">{t('auth.login.orContinueWith')}</span>\n </div>\n </div>\n <OAuthButtons\n providers={oauthProviders}\n onProviderClick={handleOAuthClick}\n />\n </>\n )}\n </form>\n )\n}\n","import React, { useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { useAuth } from '../../hooks/useAuth'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface SignupFormProps {\n onSuccess?: () => void\n termsUrl?: string\n privacyUrl?: string\n className?: string\n}\n\nexport function SignupForm({\n onSuccess,\n termsUrl,\n privacyUrl,\n className,\n}: SignupFormProps) {\n const { signUp, loading } = useAuth()\n const { t } = useTranslation()\n const [fullName, setFullName] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [success, setSuccess] = useState<string | null>(null)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError(null)\n setSuccess(null)\n\n if (password !== confirmPassword) {\n setError(t('auth.signup.passwordsMismatch'))\n return\n }\n\n if (password.length < 8) {\n setError(t('auth.signup.passwordMinLength'))\n return\n }\n\n try {\n const result = await signUp(email, password, fullName)\n if (result.requiresEmailVerification) {\n setSuccess(t('auth.signup.emailVerification', { email }))\n setPassword('')\n setConfirmPassword('')\n return\n }\n onSuccess?.()\n } catch (err: any) {\n setError(err.message ?? t('auth.signup.failedDefault'))\n }\n }\n\n const inputClass =\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn('flex flex-col gap-4 w-full max-w-sm', className)}\n >\n {error && (\n <div className=\"rounded-md bg-destructive/10 border border-destructive/20 px-4 py-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n {success && (\n <div className=\"rounded-md border border-success/20 bg-success/10 px-4 py-3 text-sm text-success\">\n {success}\n </div>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"signup-name\" className=\"text-sm font-medium text-foreground\">\n {t('auth.signup.fullName')}\n </label>\n <input\n id=\"signup-name\"\n type=\"text\"\n value={fullName}\n onChange={(e) => setFullName(e.target.value)}\n placeholder={t('auth.signup.placeholder.name')}\n required\n autoComplete=\"name\"\n className={inputClass}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"signup-email\" className=\"text-sm font-medium text-foreground\">\n {t('auth.email')}\n </label>\n <input\n id=\"signup-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={t('auth.login.placeholder.email')}\n required\n autoComplete=\"email\"\n className={inputClass}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"signup-password\" className=\"text-sm font-medium text-foreground\">\n {t('auth.password')}\n </label>\n <input\n id=\"signup-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder={t('auth.signup.placeholder.password')}\n required\n minLength={8}\n autoComplete=\"new-password\"\n className={inputClass}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"signup-confirm\" className=\"text-sm font-medium text-foreground\">\n {t('auth.signup.confirmPassword')}\n </label>\n <input\n id=\"signup-confirm\"\n type=\"password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n placeholder={t('auth.signup.placeholder.confirm')}\n required\n minLength={8}\n autoComplete=\"new-password\"\n className={inputClass}\n />\n </div>\n\n {(termsUrl || privacyUrl) && (\n <p className=\"text-xs text-muted-foreground\">\n {t('auth.signup.termsAgreement')}{' '}\n {termsUrl && (\n <a href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline hover:text-foreground\">\n {t('auth.signup.termsOfService')}\n </a>\n )}\n {termsUrl && privacyUrl && ' and '}\n {privacyUrl && (\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline hover:text-foreground\">\n {t('auth.signup.privacyPolicy')}\n </a>\n )}\n .\n </p>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"inline-flex items-center justify-center h-10 px-4 py-2 rounded-md bg-primary border border-primary text-primary-foreground font-medium text-sm hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n >\n {loading ? t('auth.signup.creating') : t('auth.signup.title')}\n </button>\n </form>\n )\n}\n","import React, { useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { useAuth } from '../../hooks/useAuth'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface RecoveryFormProps {\n onSuccess?: () => void\n onBackToLogin?: () => void\n className?: string\n}\n\nexport function RecoveryForm({\n onSuccess,\n onBackToLogin,\n className,\n}: RecoveryFormProps) {\n const { resetPassword, loading } = useAuth()\n const { t } = useTranslation()\n const [email, setEmail] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [submitted, setSubmitted] = useState(false)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError(null)\n\n try {\n await resetPassword(email)\n setSubmitted(true)\n onSuccess?.()\n } catch (err: any) {\n setError(err.message ?? t('auth.recovery.failedDefault'))\n }\n }\n\n if (submitted) {\n return (\n <div className={cn('flex flex-col gap-4 w-full max-w-sm text-center', className)}>\n <div className=\"rounded-md bg-success/10 border border-success/30 px-4 py-6\">\n <h3 className=\"text-sm font-medium text-success mb-1\">\n {t('auth.recovery.checkEmail')}\n </h3>\n <p className=\"text-sm text-success\">\n {t('auth.recovery.resetLinkSent', { email })}\n </p>\n </div>\n {onBackToLogin && (\n <button\n type=\"button\"\n onClick={onBackToLogin}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {t('auth.recovery.backToLogin')}\n </button>\n )}\n </div>\n )\n }\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn('flex flex-col gap-4 w-full max-w-sm', className)}\n >\n <p className=\"text-sm text-muted-foreground\">\n {t('auth.recovery.description')}\n </p>\n\n {error && (\n <div className=\"rounded-md bg-destructive/10 border border-destructive/20 px-4 py-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"recovery-email\" className=\"text-sm font-medium text-foreground\">\n {t('auth.email')}\n </label>\n <input\n id=\"recovery-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={t('auth.login.placeholder.email')}\n required\n autoComplete=\"email\"\n className=\"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"inline-flex items-center justify-center h-10 px-4 py-2 rounded-md bg-primary border border-primary text-primary-foreground font-medium text-sm hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n >\n {loading ? t('auth.recovery.sending') : t('auth.recovery.sendResetLink')}\n </button>\n\n {onBackToLogin && (\n <button\n type=\"button\"\n onClick={onBackToLogin}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {t('auth.recovery.backToLogin')}\n </button>\n )}\n </form>\n )\n}\n","import React, { useState } from 'react'\nimport { LoginForm } from './LoginForm'\nimport { SignupForm } from './SignupForm'\nimport { RecoveryForm } from './RecoveryForm'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthProvider } from '../../types'\n\ninterface SplitLoginProps {\n appName: string\n logo?: React.ReactNode\n tagline?: string\n description?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n onSuccess?: () => void\n}\n\ntype View = 'login' | 'signup' | 'recovery'\n\nexport function SplitLogin({ appName, logo, tagline, description, showOAuth, oauthProviders, onSuccess }: SplitLoginProps) {\n const [view, setView] = useState<View>('login')\n const { t } = useTranslation()\n\n const heading = view === 'login' ? t('auth.login.title') : view === 'signup' ? t('auth.signup.title') : t('auth.recovery.title')\n const subtitle = view === 'login'\n ? t('auth.login.enterCredentials')\n : view === 'signup'\n ? t('auth.signup.getStarted')\n : t('auth.recovery.resetSubtitle')\n\n return (\n <div className=\"flex min-h-screen bg-sidebar\">\n {/* Left — Brand Panel (hidden on mobile) */}\n <div className=\"relative hidden w-1/2 overflow-hidden lg:block\">\n {/* Gradient overlay */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-sidebar-accent/50 via-transparent to-sidebar/80\" />\n\n {/* Decorative circles */}\n <div className=\"absolute -left-20 -top-20 h-80 w-80 rounded-full bg-primary/10\" />\n <div className=\"absolute -bottom-10 -right-10 h-60 w-60 rounded-full bg-primary/5\" />\n <div className=\"absolute right-1/4 top-1/3 h-40 w-40 rounded-full bg-primary/5\" />\n\n {/* Content */}\n <div className=\"relative flex h-full flex-col justify-end p-12\">\n <div className=\"space-y-4\">\n <p className=\"text-sm font-medium text-sidebar-muted\">{appName}</p>\n <h2 className=\"text-3xl font-bold text-sidebar-foreground\">\n {tagline ?? t('auth.login.welcomeTo', { appName })}\n </h2>\n {description && (\n <p className=\"max-w-md text-sm leading-relaxed text-sidebar-muted\">\n {description}\n </p>\n )}\n\n {/* Social proof */}\n <div className=\"mt-8 flex items-center gap-3 rounded-xl bg-sidebar-accent/40 p-4\">\n <div className=\"flex -space-x-2\">\n {['bg-primary', 'bg-success', 'bg-warning'].map((bg, i) => (\n <div key={i} className={`h-8 w-8 rounded-full ${bg} border-2 border-sidebar`} />\n ))}\n </div>\n <p className=\"text-xs text-sidebar-foreground/80\">\n {t('auth.login.socialProof', { appName })}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Right — Form in rounded frame */}\n <div className=\"flex flex-1 flex-col p-3 pl-0 lg:pl-3\">\n <div className=\"flex flex-1 flex-col justify-center rounded-[1.25rem] bg-background px-6 py-12 lg:px-16\">\n <div className=\"mx-auto w-full max-w-sm\">\n {/* Logo */}\n <div className=\"mb-8\">\n {logo}\n </div>\n\n {/* Heading */}\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n\n {/* Form */}\n {view === 'login' && (\n <div className=\"space-y-6\">\n <LoginForm\n onSuccess={onSuccess}\n onForgotPassword={() => setView('recovery')}\n showOAuth={showOAuth}\n oauthProviders={oauthProviders}\n />\n <p className=\"text-center text-sm text-muted-foreground\">\n {t('auth.login.noAccount')}{' '}\n <button type=\"button\" onClick={() => setView('signup')} className=\"font-medium text-primary hover:underline\">\n {t('auth.signUp')}\n </button>\n </p>\n </div>\n )}\n\n {view === 'signup' && (\n <div className=\"space-y-6\">\n <SignupForm onSuccess={onSuccess} />\n <p className=\"text-center text-sm text-muted-foreground\">\n {t('auth.signup.hasAccount')}{' '}\n <button type=\"button\" onClick={() => setView('login')} className=\"font-medium text-primary hover:underline\">\n {t('auth.signIn')}\n </button>\n </p>\n </div>\n )}\n\n {view === 'recovery' && (\n <RecoveryForm onBackToLogin={() => setView('login')} />\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { LoginForm } from './LoginForm'\nimport { SignupForm } from './SignupForm'\nimport { RecoveryForm } from './RecoveryForm'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthProvider } from '../../types'\n\ninterface CenteredLoginProps {\n appName: string\n logo?: React.ReactNode\n tagline?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n onSuccess?: () => void\n}\n\ntype View = 'login' | 'signup' | 'recovery'\n\nexport function CenteredLogin({ appName, logo, tagline, showOAuth, oauthProviders, onSuccess }: CenteredLoginProps) {\n const [view, setView] = useState<View>('login')\n const { t } = useTranslation()\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n {/* Decorative background */}\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n <div className=\"absolute -left-40 top-1/4 h-96 w-96 rounded-full bg-primary/5 blur-3xl\" />\n <div className=\"absolute -right-40 bottom-1/4 h-96 w-96 rounded-full bg-primary/5 blur-3xl\" />\n </div>\n\n {/* Card — light */}\n <div className=\"relative w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n {/* Logo + heading */}\n <div className=\"mb-8 text-center\">\n <div className=\"mb-4 flex justify-center\">{logo}</div>\n <h1 className=\"text-2xl font-bold text-foreground\">\n {view === 'login' ? t('auth.login.welcomeBack') : view === 'signup' ? t('auth.signup.title') : t('auth.recovery.title')}\n </h1>\n {view === 'login' && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {tagline ?? (\n <>\n {t('auth.login.noAccountYet')}{' '}\n <button type=\"button\" onClick={() => setView('signup')} className=\"font-medium text-primary hover:underline\">\n {t('auth.signUp')}\n </button>\n </>\n )}\n </p>\n )}\n {view === 'signup' && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {t('auth.signup.hasAccount')}{' '}\n <button type=\"button\" onClick={() => setView('login')} className=\"font-medium text-primary hover:underline\">\n {t('auth.signIn')}\n </button>\n </p>\n )}\n {view === 'recovery' && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{t('auth.recovery.resetSubtitle')}</p>\n )}\n </div>\n\n {/* Form — override text colors for dark card */}\n <div>\n {view === 'login' && (\n <LoginForm\n onSuccess={onSuccess}\n onForgotPassword={() => setView('recovery')}\n showOAuth={showOAuth}\n oauthProviders={oauthProviders}\n />\n )}\n\n {view === 'signup' && (\n <SignupForm onSuccess={onSuccess} />\n )}\n\n {view === 'recovery' && (\n <RecoveryForm onBackToLogin={() => setView('login')} />\n )}\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { SplitLogin } from './SplitLogin'\nimport { CenteredLogin } from './CenteredLogin'\nimport type { AuthProvider } from '../../types'\n\ninterface LoginPageProps {\n appName: string\n logo?: React.ReactNode\n layout?: 'split' | 'centered'\n tagline?: string\n description?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n onSuccess?: () => void\n}\n\nexport function LoginPage({ layout = 'split', ...props }: LoginPageProps) {\n if (layout === 'centered') {\n return <CenteredLogin {...props} />\n }\n return <SplitLogin {...props} />\n}\n","import React from 'react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { usePermission } from '../../hooks/usePermission'\nimport type { MemberRole } from '../../types'\n\ninterface ProtectedRouteProps {\n children?: React.ReactNode\n requiredRole?: MemberRole\n fallback?: React.ReactNode\n onUnauthenticated?: () => void\n}\n\nfunction LoadingSkeleton() {\n return <div className=\"min-h-screen\" />\n}\n\nexport function ProtectedRoute({ children, requiredRole, fallback, onUnauthenticated }: ProtectedRouteProps) {\n const { user, loading, initialized } = useAuth()\n const { requireRole } = usePermission()\n\n React.useEffect(() => {\n if (initialized && !loading && !user && onUnauthenticated) {\n onUnauthenticated()\n }\n }, [initialized, loading, user, onUnauthenticated])\n\n if (!initialized || loading) {\n return <LoadingSkeleton />\n }\n\n if (!user) {\n return <LoadingSkeleton />\n }\n\n if (requiredRole && !requireRole(requiredRole)) {\n if (fallback) {\n return <>{fallback}</>\n }\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-center\">\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">Access Denied</h2>\n <p className=\"text-sm text-muted-foreground\">\n You do not have permission to access this page.\n </p>\n </div>\n </div>\n )\n }\n\n return <>{children}</>\n}\n","import type { AuthAdapter } from '../../types/auth-adapter'\nimport type { AuthUser, AuthSession } from '../../types/auth'\n\nconst STORAGE_KEY = 'saas-core:mock-auth'\n\nfunction createMockUser(email: string, fullName?: string): AuthUser {\n return {\n id: crypto.randomUUID(),\n email,\n fullName: fullName || email.split('@')[0],\n providers: ['email'],\n emailVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n}\n\nfunction createMockSession(user: AuthUser): AuthSession {\n return {\n accessToken: `mock-token-${user.id}`,\n refreshToken: `mock-refresh-${user.id}`,\n expiresAt: Math.floor(Date.now() / 1000) + 3600,\n user,\n }\n}\n\nexport function createMockAuthAdapter(): AuthAdapter {\n const listeners = new Set<(user: AuthUser | null) => void>()\n\n function notifyListeners(user: AuthUser | null) {\n for (const cb of listeners) cb(user)\n }\n\n function getStored(): { user: AuthUser; session: AuthSession } | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (!raw) return null\n return JSON.parse(raw)\n } catch {\n return null\n }\n }\n\n function setStored(data: { user: AuthUser; session: AuthSession } | null) {\n if (data) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n }\n\n return {\n async getSession() {\n return getStored()\n },\n\n onAuthStateChange(cb) {\n listeners.add(cb)\n return () => { listeners.delete(cb) }\n },\n\n async signIn(email, password) {\n void password // mock accepts any password\n const user = createMockUser(email)\n const session = createMockSession(user)\n setStored({ user, session })\n notifyListeners(user)\n return session\n },\n\n async signUp(email, password, fullName) {\n void password\n const user = createMockUser(email, fullName)\n const session = createMockSession(user)\n setStored({ user, session })\n notifyListeners(user)\n return session\n },\n\n async signOut() {\n setStored(null)\n notifyListeners(null)\n },\n\n async signInWithOAuth(_provider) {\n // Mock OAuth just signs in with a fake user\n const user = createMockUser('oauth@example.com', 'OAuth User')\n const session = createMockSession(user)\n setStored({ user, session })\n notifyListeners(user)\n },\n\n async resetPassword(_email) {\n // No-op in mock\n },\n }\n}\n","import type { AuthAdapter } from '../../types/auth-adapter'\nimport type { AuthUser, AuthSession, AuthProvider } from '../../types/auth'\nimport { getSupabaseClient } from '../supabase'\n\nfunction mapSupabaseUser(supabaseUser: any): AuthUser {\n return {\n id: supabaseUser.id,\n email: supabaseUser.email ?? '',\n fullName: supabaseUser.user_metadata?.full_name ?? supabaseUser.user_metadata?.name ?? '',\n avatarUrl: supabaseUser.user_metadata?.avatar_url,\n providers: (supabaseUser.app_metadata?.providers ?? [supabaseUser.app_metadata?.provider]).filter(Boolean) as AuthProvider[],\n emailVerified: !!supabaseUser.email_confirmed_at,\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at ?? supabaseUser.created_at,\n }\n}\n\nfunction mapSupabaseSession(session: any): AuthSession {\n return {\n accessToken: session.access_token,\n refreshToken: session.refresh_token,\n expiresAt: session.expires_at ?? Math.floor(Date.now() / 1000) + (session.expires_in ?? 3600),\n user: mapSupabaseUser(session.user),\n }\n}\n\nexport function createSupabaseAuthAdapter(): AuthAdapter {\n const supabase = getSupabaseClient()\n\n return {\n async getSession() {\n const { data: { session } } = await supabase.auth.getSession()\n if (!session) return null\n const mapped = mapSupabaseSession(session)\n return { user: mapped.user, session: mapped }\n },\n\n onAuthStateChange(cb) {\n const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => {\n cb(session ? mapSupabaseUser(session.user) : null)\n })\n return () => subscription.unsubscribe()\n },\n\n async signIn(email, password) {\n const { data, error } = await supabase.auth.signInWithPassword({ email, password })\n if (error) throw error\n return mapSupabaseSession(data.session)\n },\n\n async signUp(email, password, fullName) {\n const { data, error } = await supabase.auth.signUp({\n email,\n password,\n options: { data: { full_name: fullName } },\n })\n if (error) throw error\n\n // When email confirmation is enabled, session is null\n if (!data.session) {\n if (!data.user) throw new Error('Signup failed: no user returned')\n // Return a partial session so the UI can show \"check your email\"\n return {\n accessToken: '',\n refreshToken: '',\n expiresAt: 0,\n user: mapSupabaseUser(data.user),\n }\n }\n\n return mapSupabaseSession(data.session)\n },\n\n async signOut() {\n const { error } = await supabase.auth.signOut()\n if (error) throw error\n },\n\n async signInWithOAuth(provider: AuthProvider) {\n const { error } = await supabase.auth.signInWithOAuth({\n provider: provider as 'google' | 'github' | 'apple',\n options: {\n redirectTo: typeof window !== 'undefined' ? `${window.location.origin}/auth/callback` : undefined,\n },\n })\n if (error) throw error\n },\n\n async resetPassword(email) {\n const { error } = await supabase.auth.resetPasswordForEmail(email, {\n redirectTo: typeof window !== 'undefined' ? `${window.location.origin}/auth/reset-password` : undefined,\n })\n if (error) throw error\n },\n }\n}\n","import type { OrgAdapter, Organization, OrgMember, OrgMembership, CreateOrgOptions } from '../../types/org-adapter'\nimport type { PermissionProfile } from '../../types/permissions'\nimport type { Invite } from '../../types/invite'\nimport type { TenantSettings, Location } from '../../types/tenant'\n\nconst STORAGE_KEY = 'saas-core:mock-orgs'\n\ninterface MockOrgData {\n orgs: Organization[]\n members: OrgMember[]\n profiles: Record<string, PermissionProfile[]> // orgId → profiles\n invites: Record<string, Invite[]> // orgId → invites\n userOrgMap: Record<string, string[]> // userId → orgIds\n}\n\nfunction getStored(): MockOrgData {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) return JSON.parse(raw)\n } catch {\n // ignore\n }\n return { orgs: [], members: [], profiles: {}, invites: {}, userOrgMap: {} }\n}\n\nfunction setStored(data: MockOrgData) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n}\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction createDefaultSettings(options?: CreateOrgOptions): TenantSettings {\n return {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n branding: {},\n }\n}\n\nexport function createMockOrgAdapter(defaultProfiles?: PermissionProfile[]): OrgAdapter {\n function seedOrgForUser(userId: string, userName?: string): MockOrgData {\n const data = getStored()\n if (data.userOrgMap[userId]?.length) return data\n\n const orgId = crypto.randomUUID()\n const memberId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name: 'My Organization',\n slug: 'my-organization',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: memberId,\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: userName ? `${userName.toLowerCase().replace(/\\s/g, '.')}@example.com` : 'user@example.com',\n fullName: userName ?? 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n data.userOrgMap[userId] = [orgId]\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return data\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n const data = seedOrgForUser(userId)\n const orgIds = data.userOrgMap[userId] ?? []\n return orgIds.map((orgId) => {\n const org = data.orgs.find((o) => o.id === orgId)!\n const member = data.members.find((m) => m.orgId === orgId && m.userId === userId)\n return {\n orgId,\n orgName: org.name,\n orgSlug: org.slug,\n orgLogoUrl: org.logoUrl,\n profileId: member?.profileId ?? 'owner',\n profileName: member?.profileName ?? 'Owner',\n }\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const data = getStored()\n const org = data.orgs.find((o) => o.id === orgId)\n if (!org) throw new Error(`Org not found: ${orgId}`)\n return org\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const data = getStored()\n const orgId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name,\n slug: slugify(name),\n verticalId: options?.verticalId,\n plan: 'free',\n settings: createDefaultSettings(options) as unknown as Record<string, unknown>,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: crypto.randomUUID(),\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: 'user@example.com',\n fullName: 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n if (!data.userOrgMap[userId]) data.userOrgMap[userId] = []\n data.userOrgMap[userId].push(orgId)\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return org\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const data = getStored()\n const idx = data.orgs.findIndex((o) => o.id === orgId)\n if (idx === -1) throw new Error(`Org not found: ${orgId}`)\n data.orgs[idx] = { ...data.orgs[idx], ...updates, updatedAt: new Date().toISOString() }\n setStored(data)\n return data.orgs[idx]\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const data = getStored()\n return data.members.filter((m) => m.orgId === orgId)\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const data = getStored()\n const member = data.members.find((m) => m.id === memberId && m.orgId === orgId)\n if (!member) throw new Error(`Member not found: ${memberId}`)\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n member.profileId = profileId\n member.profileName = profile?.name ?? profileId\n setStored(data)\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const data = getStored()\n const memberIdx = data.members.findIndex((m) => m.id === memberId && m.orgId === orgId)\n if (memberIdx === -1) return\n const member = data.members[memberIdx]\n data.members.splice(memberIdx, 1)\n // Remove org from user's org map\n const userOrgs = data.userOrgMap[member.userId]\n if (userOrgs) {\n const orgIdx = userOrgs.indexOf(orgId)\n if (orgIdx !== -1) userOrgs.splice(orgIdx, 1)\n }\n setStored(data)\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const data = getStored()\n return data.profiles[orgId] ?? defaultProfiles ?? []\n },\n\n async createProfile(orgId: string, profile: Omit<PermissionProfile, 'id' | 'isSystem'>): Promise<PermissionProfile> {\n const data = getStored()\n const newProfile: PermissionProfile = {\n ...profile,\n id: crypto.randomUUID(),\n isSystem: false,\n }\n if (!data.profiles[orgId]) data.profiles[orgId] = defaultProfiles ? [...defaultProfiles] : []\n data.profiles[orgId].push(newProfile)\n setStored(data)\n return newProfile\n },\n\n async updateProfile(orgId: string, profileId: string, updates: Partial<PermissionProfile>): Promise<PermissionProfile> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const idx = profiles.findIndex((p) => p.id === profileId)\n if (idx === -1) throw new Error(`Profile not found: ${profileId}`)\n profiles[idx] = { ...profiles[idx], ...updates }\n data.profiles[orgId] = profiles\n setStored(data)\n return profiles[idx]\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n if (profile?.isSystem) throw new Error('Cannot delete system profile')\n data.profiles[orgId] = profiles.filter((p) => p.id !== profileId)\n setStored(data)\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const data = getStored()\n return data.invites[orgId] ?? []\n },\n\n async createInvite(orgId: string, email: string, profileId: string, invitedBy: string): Promise<Invite> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? defaultProfiles ?? []\n const profile = profiles.find((p) => p.id === profileId)\n const inviter = data.members.find((m) => m.userId === invitedBy)\n\n const invite: Invite = {\n id: crypto.randomUUID(),\n tenantId: orgId,\n orgId,\n email,\n role: 'staff',\n token: crypto.randomUUID(),\n profileId,\n profileName: profile?.name ?? profileId,\n invitedBy,\n invitedByName: inviter?.user.fullName ?? 'Unknown',\n status: 'pending',\n createdAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n }\n\n if (!data.invites[orgId]) data.invites[orgId] = []\n data.invites[orgId].push(invite)\n setStored(data)\n return invite\n },\n\n async bulkInvite(orgId: string, emails: string[], profileId: string, invitedBy: string): Promise<Invite[]> {\n const results: Invite[] = []\n for (const email of emails) {\n results.push(await this.createInvite(orgId, email, profileId, invitedBy))\n }\n return results\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (invite) {\n invite.status = 'revoked'\n setStored(data)\n }\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (!invite) throw new Error(`Invite not found: ${inviteId}`)\n invite.expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n invite.status = 'pending'\n setStored(data)\n return invite\n },\n\n async listLocations(_orgId: string): Promise<Location[]> {\n return []\n },\n\n async createLocation(_orgId: string, data: any): Promise<Location> {\n return {\n id: crypto.randomUUID(),\n tenantId: _orgId,\n kind: 'branch',\n name: data.name,\n address: data.address,\n city: data.city,\n state: data.state,\n country: data.country ?? 'BR',\n phone: data.phone,\n isHeadquarters: data.isHeadquarters ?? false,\n isActive: true,\n tags: [],\n metadata: {},\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n },\n }\n}\n","import type { OrgAdapter, Organization, OrgMember, OrgMembership, CreateOrgOptions } from '../../types/org-adapter'\nimport type { Location } from '../../types/tenant'\nimport type { PermissionProfile, SystemPermission, PermissionAction } from '../../types/permissions'\nimport type { Invite } from '../../types/invite'\nimport { getSupabaseClient, getCoreClient, CORE_SCHEMA } from '../supabase'\n\n// ---------------------------------------------------------------------------\n// Request dedup — prevents duplicate in-flight requests (React StrictMode, etc.)\n// ---------------------------------------------------------------------------\nconst inflightRequests = new Map<string, Promise<any>>()\n\nfunction dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflightRequests.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflightRequests.delete(key)\n })\n inflightRequests.set(key, promise)\n return promise\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction mapTenantToOrg(row: any): Organization {\n return {\n id: row.id,\n name: row.name,\n slug: row.slug,\n logoUrl: row.logo_url ?? undefined,\n verticalId: row.vertical_id ?? undefined,\n plan: row.plan ?? undefined,\n settings: row.settings ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction mapMemberRow(row: any): OrgMember {\n const profile = row.profile ?? {}\n return {\n id: row.id,\n userId: row.user_id,\n orgId: row.tenant_id,\n profileId: row.role,\n profileName: capitalize(row.role),\n user: {\n id: row.user_id,\n email: profile.email ?? '',\n fullName: profile.full_name ?? '',\n avatarUrl: profile.avatar_url ?? undefined,\n },\n joinedAt: row.joined_at,\n }\n}\n\nfunction mapLocationRow(row: any): Location {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n kind: row.kind ?? 'branch',\n name: row.name,\n email: row.email ?? undefined,\n phone: row.phone ?? undefined,\n address: row.address ?? undefined,\n city: row.city ?? undefined,\n state: row.state ?? undefined,\n country: row.country ?? 'BR',\n postalCode: row.postal_code ?? undefined,\n isHeadquarters: row.is_headquarters ?? false,\n isActive: row.is_active ?? true,\n tags: row.tags ?? [],\n notes: row.notes ?? undefined,\n metadata: row.metadata ?? row.settings ?? {},\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction mapInviteRow(row: any): Invite {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n email: row.email,\n role: row.role,\n locationIds: row.location_ids ?? undefined,\n invitedBy: row.invited_by,\n token: row.token,\n status: row.status ?? 'pending',\n expiresAt: row.expires_at,\n acceptedAt: row.accepted_at ?? undefined,\n createdAt: row.created_at,\n orgId: row.tenant_id,\n profileId: row.role,\n profileName: capitalize(row.role),\n invitedByName: '',\n }\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nconst SYSTEM_ROLES = ['owner', 'admin', 'manager', 'staff', 'viewer'] as const\n\nconst SYSTEM_PERMISSION_MAP: Record<string, SystemPermission> = {\n 'team.read': 'manage_team',\n 'team.invite': 'manage_team',\n 'team.manage': 'manage_team',\n 'team.manage_roles': 'manage_team',\n 'billing.read': 'manage_billing',\n 'billing.manage': 'manage_billing',\n 'settings.read': 'manage_settings',\n 'settings.update': 'manage_settings',\n}\n\nconst SYSTEM_CATEGORIES = new Set(['team', 'billing', 'settings'])\n\n/**\n * Build PermissionProfile[] from DB permission data.\n * Owner gets all permissions implicitly (matches the authorize() RPC).\n */\nfunction buildPermissionProfiles(\n permissions: { id: string; category: string }[],\n rolePerms: { role: string; permission_id: string }[],\n overrides: { role: string; permission_id: string; granted: boolean }[],\n): PermissionProfile[] {\n // Build override lookup: `role:permissionId` → granted\n const overrideMap = new Map<string, boolean>()\n for (const o of overrides) {\n overrideMap.set(`${o.role}:${o.permission_id}`, o.granted)\n }\n\n // Build role → permission set (from defaults)\n const rolePermMap = new Map<string, Set<string>>()\n for (const role of SYSTEM_ROLES) {\n rolePermMap.set(role, new Set())\n }\n // Owner gets everything\n for (const p of permissions) {\n rolePermMap.get('owner')!.add(p.id)\n }\n for (const rp of rolePerms) {\n rolePermMap.get(rp.role)?.add(rp.permission_id)\n }\n\n // Apply overrides\n for (const [key, granted] of overrideMap) {\n const [role, permId] = key.split(':')\n const perms = rolePermMap.get(role)\n if (!perms) continue\n if (granted) {\n perms.add(permId)\n } else {\n perms.delete(permId)\n }\n }\n\n return SYSTEM_ROLES.map((role) => {\n const permIds = rolePermMap.get(role)!\n\n // System permissions (team/billing/settings management)\n const systemPermissions: SystemPermission[] = []\n const seenSystem = new Set<SystemPermission>()\n for (const permId of permIds) {\n const sp = SYSTEM_PERMISSION_MAP[permId]\n if (sp && !seenSystem.has(sp)) {\n seenSystem.add(sp)\n systemPermissions.push(sp)\n }\n }\n // Owner always gets all system permissions\n if (role === 'owner') {\n const allSystem: SystemPermission[] = ['manage_team', 'manage_billing', 'manage_settings', 'manage_permissions']\n for (const sp of allSystem) {\n if (!seenSystem.has(sp)) {\n seenSystem.add(sp)\n systemPermissions.push(sp)\n }\n }\n }\n\n // Grants: group non-system permissions by category → actions\n const grants: Record<string, PermissionAction[]> = {}\n for (const permId of permIds) {\n const perm = permissions.find((p) => p.id === permId)\n if (!perm || SYSTEM_CATEGORIES.has(perm.category)) continue\n\n // permId format: \"category.action\" e.g. \"locations.read\"\n const dotIdx = permId.indexOf('.')\n if (dotIdx === -1) continue\n const category = permId.slice(0, dotIdx)\n const action = permId.slice(dotIdx + 1)\n\n // Map DB actions to PermissionAction\n const actionMap: Record<string, PermissionAction> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'edit',\n delete: 'delete',\n configure: 'edit',\n invite: 'create',\n }\n const mappedAction = actionMap[action]\n if (!mappedAction) continue\n\n if (!grants[category]) grants[category] = []\n if (!grants[category].includes(mappedAction)) {\n grants[category].push(mappedAction)\n }\n }\n\n return {\n id: role,\n name: capitalize(role),\n isSystem: true,\n systemPermissions,\n grants,\n }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport function createSupabaseOrgAdapter(): OrgAdapter {\n const supabase = getSupabaseClient()\n /** Core-schema scoped queries */\n const core = () => supabase.schema(CORE_SCHEMA)\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('tenant_members')\n .select('tenant_id, role, tenant:tenants(id, name, slug, logo_url)')\n .eq('user_id', userId)\n\n if (error) throw error\n\n return (data ?? []).map((row: any) => ({\n orgId: row.tenant_id,\n orgName: row.tenant?.name ?? '',\n orgSlug: row.tenant?.slug ?? '',\n orgLogoUrl: row.tenant?.logo_url ?? undefined,\n profileId: row.role,\n profileName: capitalize(row.role),\n }))\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const { data, error } = await core()\n .from('tenants')\n .select('*')\n .eq('id', orgId)\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data)\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n // Use SECURITY DEFINER RPC to create tenant + owner in one atomic operation\n // This bypasses RLS chicken-and-egg: can't SELECT tenant without membership, can't add membership without tenant ID\n const { data: tenant, error } = await supabase\n .rpc('create_tenant_with_owner', {\n p_name: name,\n p_slug: slugify(name),\n p_user_id: userId,\n p_vertical_id: options?.verticalId ?? null,\n p_plan: 'free',\n p_settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n teamSize: options?.teamSize ?? undefined,\n branding: {},\n },\n })\n\n if (error) throw error\n\n // Plugin provisioning handled by Fayz platform — not per-SaaS\n\n return mapTenantToOrg(tenant)\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const row: Record<string, unknown> = {}\n if (updates.name !== undefined) row.name = updates.name\n if (updates.slug !== undefined) row.slug = updates.slug\n if (updates.logoUrl !== undefined) row.logo_url = updates.logoUrl\n if (updates.verticalId !== undefined) row.vertical_id = updates.verticalId\n if (updates.plan !== undefined) row.plan = updates.plan\n if (updates.settings !== undefined) row.settings = updates.settings\n\n const { data, error } = await core()\n .from('tenants')\n .update(row)\n .eq('id', orgId)\n .select()\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data)\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const { data, error } = await core()\n .from('tenant_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n // Fetch profiles separately (no direct FK between tenant_members and profiles)\n const userIds = (data ?? []).map((m: any) => m.user_id)\n const { data: profiles } = userIds.length > 0\n ? await core().from('profiles').select('id, full_name, avatar_url, email').in('id', userIds)\n : { data: [] }\n\n const profileMap = new Map((profiles ?? []).map((p: any) => [p.id, p]))\n\n return (data ?? []).map((row: any) => {\n const profile = profileMap.get(row.user_id) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .update({ role: profileId })\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .delete()\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n // Fetch all permissions, default role mappings, and tenant overrides in parallel\n const [permsResult, rolePermsResult, overridesResult] = await Promise.all([\n core().from('permissions').select('id, category'),\n core().from('role_permissions').select('role, permission_id'),\n core().from('tenant_role_overrides').select('role, permission_id, granted').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolePermsResult.error) throw rolePermsResult.error\n if (overridesResult.error) throw overridesResult.error\n\n return buildPermissionProfiles(\n permsResult.data ?? [],\n rolePermsResult.data ?? [],\n overridesResult.data ?? [],\n )\n },\n\n async createProfile(_orgId: string, _profile: Omit<PermissionProfile, 'id' | 'isSystem'>): Promise<PermissionProfile> {\n throw new Error('Custom roles are not supported. Roles are system-defined (owner, admin, manager, staff, viewer).')\n },\n\n async updateProfile(orgId: string, profileId: string, data: Partial<PermissionProfile>): Promise<PermissionProfile> {\n // profileId is a role name — update overrides for this role\n if (data.grants) {\n // Delete existing overrides for this role, then re-insert\n await core()\n .from('tenant_role_overrides')\n .delete()\n .eq('tenant_id', orgId)\n .eq('role', profileId)\n\n const overrides: { tenant_id: string; role: string; permission_id: string; granted: boolean }[] = []\n for (const [category, actions] of Object.entries(data.grants)) {\n for (const action of actions) {\n const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n edit: 'update',\n delete: 'delete',\n }\n const dbAction = actionMap[action] ?? action\n overrides.push({\n tenant_id: orgId,\n role: profileId,\n permission_id: `${category}.${dbAction}`,\n granted: true,\n })\n }\n }\n\n if (overrides.length > 0) {\n const { error } = await core()\n .from('tenant_role_overrides')\n .insert(overrides)\n\n if (error) throw error\n }\n }\n\n // Re-fetch the updated profile\n const profiles = await this.listProfiles(orgId)\n const updated = profiles.find((p) => p.id === profileId)\n if (!updated) throw new Error(`Profile not found: ${profileId}`)\n return updated\n },\n\n async deleteProfile(_orgId: string, _profileId: string): Promise<void> {\n throw new Error('System roles cannot be deleted.')\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const { data, error } = await core()\n .from('invitations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('created_at', { ascending: false })\n\n if (error) throw error\n return (data ?? []).map(mapInviteRow)\n },\n\n async createInvite(orgId: string, email: string, profileId: string, invitedBy: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .insert({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n })\n .select()\n .single()\n\n if (error) throw error\n return mapInviteRow(data)\n },\n\n async bulkInvite(orgId: string, emails: string[], profileId: string, invitedBy: string): Promise<Invite[]> {\n const rows = emails.map((email) => ({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n }))\n\n const { data, error } = await core()\n .from('invitations')\n .insert(rows)\n .select()\n\n if (error) throw error\n return (data ?? []).map(mapInviteRow)\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const { error } = await core()\n .from('invitations')\n .update({ status: 'revoked' })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .update({\n status: 'pending',\n expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n .select()\n .single()\n\n if (error) throw error\n return mapInviteRow(data)\n },\n\n async listLocations(orgId: string): Promise<Location[]> {\n const { data, error } = await core()\n .from('locations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('is_headquarters', { ascending: false })\n .order('name')\n\n if (error) throw error\n return (data ?? []).map(mapLocationRow)\n },\n\n async createLocation(orgId: string, input: { name: string; address?: string; city?: string; state?: string; country?: string; phone?: string; isHeadquarters?: boolean }): Promise<Location> {\n const { data, error } = await core()\n .from('locations')\n .insert({\n tenant_id: orgId,\n name: input.name,\n address: input.address || null,\n city: input.city || null,\n state: input.state || null,\n country: input.country || 'BR',\n phone: input.phone || null,\n is_headquarters: input.isHeadquarters ?? false,\n })\n .select()\n .single()\n\n if (error) throw error\n return mapLocationRow(data)\n },\n }\n}\n","import * as React from 'react'\nimport { Building2, Check, ChevronDown, Plus } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n} from '@fayz-ai/ui'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface OrgSwitcherProps {\n collapsed?: boolean\n}\n\nexport function OrgSwitcher({ collapsed }: OrgSwitcherProps) {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const userOrgs = useOrganizationStore((s) => s.userOrgs)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const setUserOrgs = useOrganizationStore((s) => s.setUserOrgs)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const user = useAuthStore((s) => s.user)\n\n const [createOpen, setCreateOpen] = React.useState(false)\n const [newOrgName, setNewOrgName] = React.useState('')\n const [creating, setCreating] = React.useState(false)\n\n const { t } = useTranslation()\n\n if (!adapter || !currentOrg) return null\n\n const initial = currentOrg.name.charAt(0).toUpperCase()\n\n const handleSwitch = async (orgId: string) => {\n if (orgId === currentOrg.id || !adapter || !user) return\n try {\n const org = await adapter.getOrg(orgId)\n setCurrentOrg(org)\n const members = await adapter.listMembers(orgId)\n setMembers(members)\n const profiles = await adapter.listProfiles(orgId)\n setProfiles(profiles)\n const myMembership = members.find((m) => m.userId === user.id)\n if (myMembership) {\n const profile = profiles.find((p) => p.id === myMembership.profileId)\n setCurrentProfile(profile ?? null)\n }\n } catch {\n // ignore\n }\n }\n\n const handleCreate = async () => {\n if (!newOrgName.trim() || !adapter || !user) return\n setCreating(true)\n try {\n const org = await adapter.createOrg(newOrgName.trim(), user.id)\n const orgs = await adapter.listUserOrgs(user.id)\n setUserOrgs(orgs)\n setCurrentOrg(org)\n const members = await adapter.listMembers(org.id)\n setMembers(members)\n const profiles = await adapter.listProfiles(org.id)\n setProfiles(profiles)\n const myMembership = members.find((m) => m.userId === user.id)\n if (myMembership) {\n const profile = profiles.find((p) => p.id === myMembership.profileId)\n setCurrentProfile(profile ?? null)\n }\n setCreateOpen(false)\n setNewOrgName('')\n } catch {\n // ignore\n } finally {\n setCreating(false)\n }\n }\n\n return (\n <>\n <div className={cn(collapsed ? 'px-1 py-2' : 'px-3 py-2')}>\n <Dropdown>\n <DropdownTrigger asChild>\n <button\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm font-medium transition-colors hover:bg-sidebar-accent',\n collapsed && 'justify-center px-0'\n )}\n >\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-sidebar-accent text-sidebar-accent-foreground text-xs font-bold\">\n {currentOrg.logoUrl ? (\n <img src={currentOrg.logoUrl} alt=\"\" className=\"h-full w-full rounded-md object-cover\" />\n ) : (\n initial\n )}\n </div>\n {!collapsed && (\n <>\n <span className=\"flex-1 truncate text-left\">{currentOrg.name}</span>\n <ChevronDown className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n </>\n )}\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-56 bg-sidebar text-sidebar-foreground border-sidebar-border\">\n {userOrgs.map((org) => (\n <DropdownItem\n key={org.orgId}\n onClick={() => handleSwitch(org.orgId)}\n className=\"flex items-center gap-2 focus:bg-sidebar-accent focus:text-sidebar-accent-foreground\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded bg-sidebar-accent text-sidebar-accent-foreground text-xs font-bold\">\n {org.orgLogoUrl ? (\n <img src={org.orgLogoUrl} alt=\"\" className=\"h-full w-full rounded object-cover\" />\n ) : (\n org.orgName.charAt(0).toUpperCase()\n )}\n </div>\n <span className=\"flex-1 truncate\">{org.orgName}</span>\n {org.orgId === currentOrg.id && (\n <Check className=\"h-4 w-4 text-primary\" />\n )}\n </DropdownItem>\n ))}\n <DropdownSeparator className=\"bg-sidebar-border\" />\n <DropdownItem onClick={() => setCreateOpen(true)} className=\"flex items-center gap-2 focus:bg-sidebar-accent focus:text-sidebar-accent-foreground\">\n <Plus className=\"h-4 w-4\" />\n <span>{t('organization.createOrg')}</span>\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n </div>\n\n <Modal open={createOpen} onOpenChange={setCreateOpen}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('organization.createOrgTitle')}</ModalTitle>\n <ModalDescription>{t('organization.createOrgDescription')}</ModalDescription>\n </ModalHeader>\n <div className=\"py-4\">\n <Input\n placeholder={t('organization.orgNamePlaceholder')}\n value={newOrgName}\n onChange={(e) => setNewOrgName(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') handleCreate() }}\n autoFocus\n />\n </div>\n <ModalFooter>\n <Button variant=\"outline\" onClick={() => setCreateOpen(false)}>{t('common.cancel')}</Button>\n <Button onClick={handleCreate} disabled={!newOrgName.trim() || creating}>\n {creating ? t('organization.creating') : t('common.create')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n )\n}\n","import { create } from 'zustand'\nimport type { Location } from '../types/tenant'\n\nconst STORAGE_KEY = 'saas-core:current-location'\n\ninterface LocationStore {\n /** All org locations (active + inactive) */\n locations: Location[]\n /** Currently selected location (session-scoped) */\n currentLocation: Location | null\n loading: boolean\n /** True while the full-page switch overlay is visible */\n switching: boolean\n\n setLocations: (locations: Location[]) => void\n setCurrentLocation: (location: Location | null) => void\n /** Switch with full-page overlay + page reload */\n switchLocation: (location: Location) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nfunction getPersistedLocationId(): string | null {\n try {\n return localStorage.getItem(STORAGE_KEY)\n } catch {\n return null\n }\n}\n\nfunction persistLocationId(id: string | null) {\n try {\n if (id) {\n localStorage.setItem(STORAGE_KEY, id)\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n } catch {\n // ignore\n }\n}\n\nexport const useLocationStore = create<LocationStore>((set, get) => ({\n locations: [],\n currentLocation: null,\n loading: false,\n switching: false,\n\n setLocations: (locations) => {\n const persistedId = getPersistedLocationId()\n const active = locations.filter((l) => l.isActive)\n\n // Auto-select: persisted → HQ → first active\n let selected: Location | null = null\n if (persistedId) {\n selected = active.find((l) => l.id === persistedId) ?? null\n }\n if (!selected) {\n selected = active.find((l) => l.isHeadquarters) ?? active[0] ?? null\n }\n\n set({ locations, currentLocation: selected })\n if (selected) persistLocationId(selected.id)\n },\n\n setCurrentLocation: (location) => {\n persistLocationId(location?.id ?? null)\n set({ currentLocation: location })\n },\n\n switchLocation: (location) => {\n if (location.id === get().currentLocation?.id) return\n set({ switching: true })\n persistLocationId(location.id)\n // Let the overlay animate in, then reload\n setTimeout(() => {\n window.location.reload()\n }, 900)\n },\n\n setLoading: (loading) => set({ loading }),\n\n reset: () => {\n persistLocationId(null)\n set({ locations: [], currentLocation: null, loading: false, switching: false })\n },\n}))\n\nexport { getPersistedLocationId }\n","import * as React from 'react'\nimport { Building2, ArrowRight, Check, Loader2 } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useOrgAdapter } from '../../lib/org-context'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport type { CreateOrgOptions } from '../../types/org-adapter'\n\nconst TIMEZONES = [\n { value: 'America/Sao_Paulo', label: 'Brasilia (BRT)' },\n { value: 'America/New_York', label: 'Eastern (US)' },\n { value: 'America/Chicago', label: 'Central (US)' },\n { value: 'America/Los_Angeles', label: 'Pacific (US)' },\n { value: 'Europe/London', label: 'London (GMT)' },\n { value: 'Europe/Paris', label: 'Paris (CET)' },\n { value: 'UTC', label: 'UTC' },\n]\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'BRL - Real' },\n { value: 'USD', label: 'USD - Dollar' },\n { value: 'EUR', label: 'EUR - Euro' },\n { value: 'GBP', label: 'GBP - Pound' },\n]\n\ninterface TenantOnboardingProps {\n verticalId?: string\n appName?: string\n logo?: React.ReactNode\n}\n\nexport function TenantOnboarding({ verticalId, appName, logo }: TenantOnboardingProps) {\n const { t } = useTranslation()\n const adapter = useOrgAdapter()\n const user = useAuthStore((s) => s.user)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const setUserOrgs = useOrganizationStore((s) => s.setUserOrgs)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n\n const [step, setStep] = React.useState(0) // 0 = company, 1 = preferences, 2 = creating\n const [error, setError] = React.useState('')\n const [companyName, setCompanyName] = React.useState('')\n const [timezone, setTimezone] = React.useState('America/Sao_Paulo')\n const [currency, setCurrency] = React.useState('BRL')\n\n const handleCreate = async () => {\n if (!user || !companyName.trim()) return\n\n setStep(2) // Show \"Creating...\" state\n setError('')\n\n try {\n const options: CreateOrgOptions = {\n verticalId: verticalId ?? undefined,\n timezone,\n currency,\n }\n\n const org = await adapter.createOrg(companyName.trim(), user.id, options)\n setCurrentOrg(org)\n\n const [orgs, members, profiles] = await Promise.all([\n adapter.listUserOrgs(user.id),\n adapter.listMembers(org.id),\n adapter.listProfiles(org.id),\n ])\n\n setUserOrgs(orgs)\n setMembers(members)\n setProfiles(profiles)\n\n const myMembership = members.find((m) => m.userId === user.id)\n if (myMembership) {\n const profile = profiles.find((p) => p.id === myMembership.profileId)\n setCurrentProfile(profile ?? null)\n }\n } catch (err: any) {\n setError(err?.message ?? 'Failed to create workspace')\n setStep(1) // Go back to last form step\n }\n }\n\n // Creating state — animated loading inside the same frame\n if (step === 2) {\n return (\n <div className=\"saas-page-enter space-y-6 text-center\">\n <Loader2 className=\"mx-auto h-8 w-8 animate-spin text-primary\" />\n <div>\n <h2 className=\"text-lg font-semibold\">{t('organization.onboarding.settingUp')}</h2>\n <p className=\"text-sm text-muted-foreground mt-1\">{t('organization.onboarding.oneMoment')}</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"saas-page-enter space-y-6\">\n {/* Header */}\n <div className=\"text-center\">\n <div className=\"mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-xl bg-primary/10\">\n <Building2 className=\"h-5 w-5 text-primary\" />\n </div>\n <h2 className=\"text-xl font-bold\">{t('organization.onboarding.setupWorkspace')}</h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {step === 0 ? t('organization.onboarding.whatName') : t('organization.onboarding.preferences')}\n </p>\n </div>\n\n {/* Step 0: Company name */}\n {step === 0 && (\n <div className=\"saas-nav-forward space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">{t('organization.onboarding.workspaceName')}</label>\n <Input\n value={companyName}\n onChange={(e) => { setCompanyName(e.target.value); setError('') }}\n placeholder=\"My Company\"\n autoFocus\n onKeyDown={(e) => { if (e.key === 'Enter' && companyName.trim()) setStep(1) }}\n />\n </div>\n <Button className=\"w-full\" onClick={() => setStep(1)} disabled={!companyName.trim()}>\n {t('common.continue')} <ArrowRight className=\"ml-2 h-4 w-4\" />\n </Button>\n </div>\n )}\n\n {/* Step 1: Regional preferences */}\n {step === 1 && (\n <div className=\"saas-nav-forward space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">{t('organization.onboarding.timezone')}</label>\n <Select value={timezone} onValueChange={setTimezone}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {TIMEZONES.map((tz) => (\n <SelectItem key={tz.value} value={tz.value}>{tz.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label className=\"text-sm font-medium\">{t('organization.onboarding.currency')}</label>\n <Select value={currency} onValueChange={setCurrency}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {CURRENCIES.map((c) => (\n <SelectItem key={c.value} value={c.value}>{c.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n <div className=\"flex gap-3\">\n <Button variant=\"outline\" className=\"flex-1\" onClick={() => setStep(0)}>{t('common.back')}</Button>\n <Button className=\"flex-1\" onClick={handleCreate}>\n {t('organization.onboarding.createWorkspace')} <Check className=\"ml-2 h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Loader2, WifiOff, RefreshCw } from 'lucide-react'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { useOrganizationStore, getPersistedOrgId } from '../../stores/organization.store'\nimport { useLocationStore } from '../../stores/location.store'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useOrgAdapterOptional } from '../../lib/org-context'\nimport { TenantOnboarding } from './TenantOnboarding'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface OrgInitializerProps {\n verticalId?: string\n}\n\nexport function OrgInitializer({ verticalId }: OrgInitializerProps) {\n const adapter = useOrgAdapterOptional()\n const user = useAuthStore((s) => s.user)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const setUserOrgs = useOrganizationStore((s) => s.setUserOrgs)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const setLoading = useOrganizationStore((s) => s.setLoading)\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n const [needsOnboarding, setNeedsOnboarding] = useState(false)\n const [initialized, setInitialized] = useState(false)\n const [connectionError, setConnectionError] = useState(false)\n\n useEffect(() => {\n if (!adapter || !user) return\n let cancelled = false\n\n async function init() {\n setLoading(true)\n setConnectionError(false)\n try {\n const orgs = await adapter!.listUserOrgs(user!.id)\n if (cancelled) return\n setUserOrgs(orgs)\n\n if (orgs.length === 0) {\n setNeedsOnboarding(true)\n setInitialized(true)\n return\n }\n\n setNeedsOnboarding(false)\n const persistedId = getPersistedOrgId()\n const targetOrg = orgs.find((o) => o.orgId === persistedId) ?? orgs[0]\n\n const org = await adapter!.getOrg(targetOrg.orgId)\n if (cancelled) return\n setCurrentOrg(org)\n\n const [members, profiles] = await Promise.all([\n adapter!.listMembers(org.id),\n adapter!.listProfiles(org.id),\n ])\n if (cancelled) return\n setMembers(members)\n setProfiles(profiles)\n\n const myMembership = members.find((m) => m.userId === user!.id)\n if (myMembership) {\n const profile = profiles.find((p) => p.id === myMembership.profileId)\n setCurrentProfile(profile ?? null)\n }\n\n // Load locations for location picker\n try {\n const locations = await adapter!.listLocations(org.id)\n if (!cancelled) useLocationStore.getState().setLocations(locations)\n } catch {\n // Locations are optional — don't block init\n }\n } catch (err) {\n console.error('[saas-core] OrgInitializer error:', err)\n if (!cancelled) setConnectionError(true)\n } finally {\n if (!cancelled) { setLoading(false); setInitialized(true) }\n }\n }\n\n init()\n return () => { cancelled = true }\n }, [adapter, user?.id])\n\n useEffect(() => {\n if (currentOrg && needsOnboarding) setNeedsOnboarding(false)\n }, [currentOrg])\n\n const { t } = useTranslation()\n\n const handleRetry = () => {\n setConnectionError(false)\n setInitialized(false)\n // Re-trigger the init effect by forcing a state change\n setLoading(true)\n if (adapter && user) {\n const retryInit = async () => {\n setConnectionError(false)\n try {\n const orgs = await adapter.listUserOrgs(user.id)\n setUserOrgs(orgs)\n if (orgs.length === 0) {\n setNeedsOnboarding(true)\n setInitialized(true)\n return\n }\n setNeedsOnboarding(false)\n const persistedId = getPersistedOrgId()\n const targetOrg = orgs.find((o) => o.orgId === persistedId) ?? orgs[0]\n const org = await adapter.getOrg(targetOrg.orgId)\n setCurrentOrg(org)\n const [members, profiles] = await Promise.all([\n adapter.listMembers(org.id),\n adapter.listProfiles(org.id),\n ])\n setMembers(members)\n setProfiles(profiles)\n const myMembership = members.find((m) => m.userId === user.id)\n if (myMembership) {\n const profile = profiles.find((p) => p.id === myMembership.profileId)\n setCurrentProfile(profile ?? null)\n }\n // Load locations for location picker\n try {\n const locations = await adapter.listLocations(org.id)\n useLocationStore.getState().setLocations(locations)\n } catch {\n // Locations are optional\n }\n } catch (err) {\n console.error('[saas-core] OrgInitializer retry error:', err)\n setConnectionError(true)\n } finally {\n setLoading(false)\n setInitialized(true)\n }\n }\n retryInit()\n }\n }\n\n if (!initialized || !user) return null\n\n if (connectionError) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-background/95 backdrop-blur-sm\">\n <div className=\"saas-page-enter w-full max-w-sm px-6 text-center\">\n <div className=\"flex h-14 w-14 mx-auto items-center justify-center rounded-full bg-destructive/10 mb-4\">\n <WifiOff className=\"h-6 w-6 text-destructive\" />\n </div>\n <h2 className=\"text-lg font-semibold\">{t('org.connectionError.title')}</h2>\n <p className=\"text-sm text-muted-foreground mt-2\">{t('org.connectionError.description')}</p>\n <button\n onClick={handleRetry}\n className=\"mt-6 inline-flex items-center gap-2 rounded-lg bg-primary border border-primary px-5 py-2.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-colors\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n {t('org.connectionError.retry')}\n </button>\n </div>\n </div>\n )\n }\n\n if (needsOnboarding) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-background/95 backdrop-blur-sm\">\n <div className=\"saas-page-enter w-full max-w-md px-6\">\n <TenantOnboarding verticalId={verticalId} />\n </div>\n </div>\n )\n }\n\n return null\n}\n","import * as React from 'react'\nimport { Eye, X } from 'lucide-react'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport function ImpersonationBanner() {\n const isImpersonating = usePermissionsStore((s) => s.isImpersonating)\n const impersonatedProfile = usePermissionsStore((s) => s.impersonatedProfile)\n const stopImpersonation = usePermissionsStore((s) => s.stopImpersonation)\n const { t } = useTranslation()\n\n if (!isImpersonating || !impersonatedProfile) return null\n\n return (\n <div className=\"fixed top-0 left-0 right-0 z-[90] flex items-center justify-center gap-3 bg-warning px-4 py-1.5 text-sm font-medium text-amber-950 shadow-sm\">\n <Eye className=\"h-3.5 w-3.5\" />\n <span>\n {t('organization.permissions.previewingAs')}: <strong>{impersonatedProfile.name}</strong>\n </span>\n <button\n onClick={stopImpersonation}\n className=\"ml-2 inline-flex items-center gap-1 rounded-md bg-warning/30 px-2 py-0.5 text-xs font-semibold hover:bg-warning/50 transition-colors\"\n >\n <X className=\"h-3 w-3\" />\n {t('organization.permissions.exitPreview')}\n </button>\n </div>\n )\n}\n","import * as React from 'react'\nimport { MapPin } from 'lucide-react'\nimport { useLocationStore } from '../../stores/location.store'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport function LocationSwitchOverlay() {\n const switching = useLocationStore((s) => s.switching)\n const { t } = useTranslation()\n\n if (!switching) return null\n\n return (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-background/95 backdrop-blur-sm animate-[locSwitch-in_350ms_ease-out_both]\">\n <style>{`\n @keyframes locSwitch-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes locSwitch-icon {\n 0% { transform: scale(0.7) rotate(-10deg); opacity: 0; }\n 50% { transform: scale(1.1) rotate(3deg); opacity: 1; }\n 100% { transform: scale(1) rotate(0deg); opacity: 1; }\n }\n @keyframes locSwitch-text {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes locSwitch-dots {\n 0%, 20% { opacity: 0.3; }\n 50% { opacity: 1; }\n 80%, 100% { opacity: 0.3; }\n }\n `}</style>\n <div className=\"text-center\">\n <div\n className=\"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10\"\n style={{ animation: 'locSwitch-icon 500ms ease-out both' }}\n >\n <MapPin className=\"h-8 w-8 text-primary\" />\n </div>\n <p\n className=\"text-lg font-semibold text-foreground\"\n style={{ animation: 'locSwitch-text 400ms ease-out 200ms both' }}\n >\n {t('layout.switchingLocation')}\n </p>\n <div\n className=\"mt-2 flex items-center justify-center gap-1\"\n style={{ animation: 'locSwitch-text 400ms ease-out 350ms both' }}\n >\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className=\"h-1.5 w-1.5 rounded-full bg-primary\"\n style={{\n animation: `locSwitch-dots 1s ease-in-out ${i * 200}ms infinite`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )\n}\n","export type PlanInterval = 'monthly' | 'yearly'\nexport type SubscriptionStatus = 'active' | 'trialing' | 'past_due' | 'canceled' | 'paused'\n\nexport interface Plan {\n id: string\n verticalId?: string\n name: string\n description?: string\n tier: number\n priceMonthly: number\n priceYearly: number\n currency: string\n features: string[]\n limits: Record<string, number>\n isActive: boolean\n createdAt: string\n /** @deprecated Use priceMonthly/priceYearly */\n prices?: { monthly: number; yearly: number }\n popular?: boolean\n}\n\n/**\n * Config-friendly plan shape for createSaasApp({ billing: { plans } }).\n * Infrastructure fields (tier, currency, isActive, createdAt, limits) are\n * optional and filled in by normalizePlanConfig.\n */\nexport interface PlanConfig {\n id: string\n name: string\n description?: string\n features: string[]\n prices?: { monthly: number; yearly: number }\n priceMonthly?: number\n priceYearly?: number\n tier?: number\n currency?: string\n limits?: Record<string, number>\n popular?: boolean\n verticalId?: string\n}\n\nexport function normalizePlanConfig(plan: PlanConfig, index?: number): Plan {\n return {\n id: plan.id,\n verticalId: plan.verticalId,\n name: plan.name,\n description: plan.description,\n tier: plan.tier ?? (index !== undefined ? index + 1 : 1),\n priceMonthly: plan.priceMonthly ?? plan.prices?.monthly ?? 0,\n priceYearly: plan.priceYearly ?? plan.prices?.yearly ?? 0,\n currency: plan.currency ?? 'USD',\n features: plan.features,\n limits: plan.limits ?? {},\n isActive: true,\n createdAt: new Date().toISOString(),\n prices: plan.prices,\n popular: plan.popular,\n }\n}\n\nexport interface Subscription {\n id: string\n tenantId: string\n planId: string\n status: SubscriptionStatus\n interval: PlanInterval\n currentPeriodStart: string\n currentPeriodEnd: string\n cancelAtPeriodEnd: boolean\n trialEnd?: string\n stripeSubscriptionId?: string\n}\n\nexport interface Invoice {\n id: string\n tenantId: string\n amount: number\n currency: string\n status: 'draft' | 'open' | 'paid' | 'void' | 'uncollectible'\n pdfUrl?: string\n createdAt: string\n paidAt?: string\n}\n\nexport interface BillingState {\n subscription: Subscription | null\n invoices: Invoice[]\n plans: Plan[]\n loading: boolean\n}\n","import { create } from 'zustand'\nimport type { TenantPluginBinding } from '../types/plugins'\n\nexport interface ActiveTenantPluginRecord {\n pluginId: string\n name?: string\n version?: string\n scope?: string\n manifest?: Record<string, unknown>\n config: Record<string, unknown>\n enabledAt?: string\n}\n\ninterface PluginStore {\n tenantId: string | null\n tenantPlugins: TenantPluginBinding[]\n activePlugins: ActiveTenantPluginRecord[]\n loading: boolean\n error: string | null\n setTenantPlugins: (tenantId: string, activePlugins: ActiveTenantPluginRecord[]) => void\n setLoading: (loading: boolean) => void\n setError: (error: string | null) => void\n reset: () => void\n}\n\nconst initialState = {\n tenantId: null,\n tenantPlugins: [],\n activePlugins: [],\n loading: false,\n error: null,\n}\n\nexport const usePluginStore = create<PluginStore>((set) => ({\n ...initialState,\n setTenantPlugins: (tenantId, activePlugins) => set({\n tenantId,\n activePlugins,\n tenantPlugins: activePlugins.map((plugin) => ({\n pluginId: plugin.pluginId,\n status: 'active',\n tenantId,\n config: plugin.config,\n })),\n error: null,\n }),\n setLoading: (loading) => set({ loading }),\n setError: (error) => set({ error }),\n reset: () => set(initialState),\n}))\n","import { useEffect } from 'react'\nimport { getSupabaseClientOptional } from '../lib/supabase'\nimport { useOrganizationStore } from '../stores/organization.store'\nimport { usePluginStore } from '../stores/plugin.store'\n\ntype TenantActivePluginRow = {\n plugin_id: string\n name?: string\n version?: string\n scope?: string\n manifest?: Record<string, unknown>\n config?: Record<string, unknown>\n enabled_at?: string\n}\n\nexport function useTenantPlugins(options?: { enabled?: boolean }) {\n const enabled = options?.enabled === true\n const currentOrg = useOrganizationStore((state) => state.currentOrg)\n const tenantId = usePluginStore((state) => state.tenantId)\n const tenantPlugins = usePluginStore((state) => state.tenantPlugins)\n const activePlugins = usePluginStore((state) => state.activePlugins)\n const loading = usePluginStore((state) => state.loading)\n const error = usePluginStore((state) => state.error)\n const setTenantPlugins = usePluginStore((state) => state.setTenantPlugins)\n const setLoading = usePluginStore((state) => state.setLoading)\n const setError = usePluginStore((state) => state.setError)\n const reset = usePluginStore((state) => state.reset)\n\n useEffect(() => {\n if (!enabled) {\n reset()\n return\n }\n\n if (!currentOrg?.id) {\n reset()\n return\n }\n const orgId = currentOrg.id\n\n const supabase = getSupabaseClientOptional()\n if (!supabase) {\n reset()\n return\n }\n const supabaseClient = supabase\n\n let cancelled = false\n\n async function load() {\n setLoading(true)\n setError(null)\n\n try {\n const { data, error } = await supabaseClient.rpc('get_tenant_active_plugins', {\n p_tenant_id: orgId,\n })\n\n if (error) {\n // Plugin system not available in this project — skip silently\n if (!cancelled) { setLoading(false) }\n return\n }\n if (cancelled) return\n\n setTenantPlugins(\n orgId,\n (data ?? []).map((plugin: TenantActivePluginRow) => ({\n pluginId: plugin.plugin_id,\n name: plugin.name,\n version: plugin.version,\n scope: plugin.scope,\n manifest: plugin.manifest,\n config: plugin.config ?? {},\n enabledAt: plugin.enabled_at,\n })),\n )\n } catch (error: any) {\n if (!cancelled) {\n setError(error?.message ?? 'Failed to load tenant plugins')\n }\n } finally {\n if (!cancelled) {\n setLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [currentOrg?.id, enabled, reset, setError, setLoading, setTenantPlugins])\n\n return {\n tenantId,\n tenantPlugins,\n activePlugins,\n loading,\n error,\n }\n}\n","// Provider + config hook now come from @fayz-ai/core (unified i18n). This file\n// keeps only the locale DATA (defaultTranslations + builtInLocales), which the\n// native createSaasApp registers into @fayz-ai/core via registerTranslations.\nexport { I18nProvider, useI18nConfig } from '@fayz-ai/core'\n\n// Default EN translations for saas-core components\nexport const defaultTranslations: Record<string, string> = {\n // ---------------------------------------------------------------------------\n // common.*\n // ---------------------------------------------------------------------------\n 'common.save': 'Save',\n 'common.saveChanges': 'Save Changes',\n 'common.saving': 'Saving...',\n 'common.cancel': 'Cancel',\n 'common.delete': 'Delete',\n 'common.edit': 'Edit',\n 'common.close': 'Close',\n 'common.confirm': 'Confirm',\n 'common.back': 'Back',\n 'common.add': 'Add',\n 'common.loading': 'Loading...',\n 'common.error': 'Something went wrong',\n 'common.noResults': 'No results found.',\n 'common.search': 'Search',\n 'common.actions': 'Actions',\n 'common.continue': 'Continue',\n 'common.done': 'Done',\n 'common.yes': 'Yes',\n 'common.no': 'No',\n 'common.active': 'Active',\n 'common.inactive': 'Inactive',\n 'common.overview': 'Overview',\n 'common.notFound': 'Not Found',\n 'common.untitled': 'Untitled',\n 'common.noContentYet': 'No content yet',\n 'common.selectDate': 'Select date',\n 'common.plugins': 'Plugins',\n\n // ---------------------------------------------------------------------------\n // auth.login.*\n // ---------------------------------------------------------------------------\n 'auth.login.title': 'Sign in',\n 'auth.login.titleCentered': 'Welcome Back',\n 'auth.login.subtitle': 'Enter your credentials to access your account',\n 'auth.login.emailLabel': 'Email',\n 'auth.login.emailPlaceholder': 'you@example.com',\n 'auth.login.passwordLabel': 'Password',\n 'auth.login.passwordPlaceholder': 'Enter your password',\n 'auth.login.forgotPassword': 'Forgot password?',\n 'auth.login.submit': 'Sign in',\n 'auth.login.submitting': 'Signing in...',\n 'auth.login.error': 'Failed to sign in. Please try again.',\n 'auth.login.oauthDivider': 'or continue with',\n 'auth.login.noAccount': \"Don't have an account?\",\n 'auth.login.noAccountCentered': \"Don't have an account yet?\",\n 'auth.login.signUpLink': 'Sign up',\n 'auth.login.socialProof': 'Join thousands of businesses already using {{appName}}',\n\n // ---------------------------------------------------------------------------\n // auth.signup.*\n // ---------------------------------------------------------------------------\n 'auth.signup.title': 'Create account',\n 'auth.signup.titleCentered': 'Create Account',\n 'auth.signup.subtitle': 'Get started with your new account',\n 'auth.signup.nameLabel': 'Full name',\n 'auth.signup.namePlaceholder': 'John Doe',\n 'auth.signup.emailLabel': 'Email',\n 'auth.signup.emailPlaceholder': 'you@example.com',\n 'auth.signup.passwordLabel': 'Password',\n 'auth.signup.passwordPlaceholder': 'At least 8 characters',\n 'auth.signup.confirmPasswordLabel': 'Confirm password',\n 'auth.signup.confirmPasswordPlaceholder': 'Repeat your password',\n 'auth.signup.termsPrefix': 'By creating an account, you agree to our',\n 'auth.signup.termsOfService': 'Terms of Service',\n 'auth.signup.privacyPolicy': 'Privacy Policy',\n 'auth.signup.submit': 'Create account',\n 'auth.signup.submitting': 'Creating account...',\n 'auth.signup.error': 'Failed to create account. Please try again.',\n 'auth.signup.passwordMismatch': 'Passwords do not match.',\n 'auth.signup.passwordTooShort': 'Password must be at least 8 characters.',\n 'auth.signup.success': 'Account created for {{email}}. Check your inbox to confirm your email before signing in.',\n 'auth.signup.hasAccount': 'Already have an account?',\n 'auth.signup.signInLink': 'Sign in',\n\n // ---------------------------------------------------------------------------\n // auth.recovery.*\n // ---------------------------------------------------------------------------\n 'auth.recovery.title': 'Reset password',\n 'auth.recovery.titleCentered': 'Reset Password',\n 'auth.recovery.instruction': 'Enter your email address and we will send you a link to reset your password.',\n 'auth.recovery.subtitle': \"We'll send you a reset link\",\n 'auth.recovery.emailLabel': 'Email',\n 'auth.recovery.emailPlaceholder': 'you@example.com',\n 'auth.recovery.submit': 'Send reset link',\n 'auth.recovery.submitting': 'Sending...',\n 'auth.recovery.error': 'Failed to send reset email. Please try again.',\n 'auth.recovery.successHeading': 'Check your email',\n 'auth.recovery.successMessage': 'We sent a password reset link to {{email}}. Please check your inbox and follow the instructions.',\n 'auth.recovery.backToLogin': 'Back to login',\n\n // ---------------------------------------------------------------------------\n // auth.oauth.*\n // ---------------------------------------------------------------------------\n 'auth.oauth.continueWith': 'Continue with {{provider}}',\n\n // ---------------------------------------------------------------------------\n // auth (legacy — kept for backward compat)\n // ---------------------------------------------------------------------------\n 'auth.signIn': 'Sign In',\n 'auth.signUp': 'Sign Up',\n 'auth.signOut': 'Sign Out',\n 'auth.email': 'Email',\n 'auth.password': 'Password',\n 'auth.forgotPassword': 'Forgot Password?',\n\n // ---------------------------------------------------------------------------\n // crud.list.*\n // ---------------------------------------------------------------------------\n 'crud.list.empty': 'No {{entities}} yet',\n 'crud.list.addFirst': 'Add your first {{entity}}',\n 'crud.list.totalCount': '{{count}} total {{entities}}',\n 'crud.list.searchPlaceholder': 'Search {{entities}}...',\n 'crud.list.addButton': '+ Add {{entity}}',\n\n // ---------------------------------------------------------------------------\n // crud.detail.*\n // ---------------------------------------------------------------------------\n 'crud.detail.notFound': '{{entity}} not found.',\n 'crud.detail.backTo': 'Back to {{entities}}',\n\n // ---------------------------------------------------------------------------\n // crud.form.*\n // ---------------------------------------------------------------------------\n 'crud.form.addTitle': 'Add {{entity}}',\n 'crud.form.editTitle': 'Edit {{entity}}',\n 'crud.form.createSubtitle': 'Create a new {{entity}}.',\n 'crud.form.editSubtitle': 'Update {{entity}} details.',\n 'crud.form.newBreadcrumb': 'New {{entity}}',\n 'crud.form.selectPlaceholder': 'Select {{label}}...',\n 'crud.form.saveError': 'Failed to save {{entity}}',\n 'crud.form.saving': 'Saving...',\n 'crud.form.requiredIndicator': '*',\n\n // ---------------------------------------------------------------------------\n // crud.import.*\n // ---------------------------------------------------------------------------\n 'crud.import.action': 'Import',\n 'crud.import.title': 'Import {{entity}}',\n 'crud.import.step.download': 'Template',\n 'crud.import.step.upload': 'Upload',\n 'crud.import.step.mapping': 'Mapping',\n 'crud.import.step.importing': 'Import',\n 'crud.import.downloadTitle': 'Download the template',\n 'crud.import.downloadDescription': 'Download a CSV template with all available fields for {{entity}}. Fill it in and upload it in the next step.',\n 'crud.import.downloadTemplate': 'Download CSV template',\n 'crud.import.downloadHint': '{{count}} fields available',\n 'crud.import.alreadyHaveFile': 'I already have a file',\n 'crud.import.uploadTitle': 'Drop your CSV file here or click to browse',\n 'crud.import.uploadHint': 'Only .csv files are accepted',\n 'crud.import.invalidFile': 'Please upload a .csv file.',\n 'crud.import.emptyFile': 'The file appears to be empty.',\n 'crud.import.noRows': 'The file has headers but no data rows.',\n 'crud.import.mappingTitle': 'Map your columns',\n 'crud.import.mappingDescription': '{{file}} — {{columns}} columns, {{rows}} rows',\n 'crud.import.mappedCount': '{{count}} of {{total}} mapped',\n 'crud.import.csvColumn': 'CSV Column',\n 'crud.import.mapsTo': 'Maps to',\n 'crud.import.preview': 'Preview',\n 'crud.import.skip': '— Skip this column',\n 'crud.import.startImport': 'Start import',\n 'crud.import.importing': 'Importing...',\n 'crud.import.importingHint': 'Processing {{count}} rows',\n 'crud.import.progressCount': '{{processed}} of {{total}} rows processed',\n 'crud.import.doneSuccess': 'Import complete!',\n 'crud.import.doneWithErrors': 'Import completed with errors',\n 'crud.import.doneCount': '{{success}} of {{total}} rows imported successfully',\n 'crud.import.rowNumber': 'Row {{row}}:',\n 'crud.import.toastSuccess': '{{count}} records imported',\n 'crud.import.noConnection': 'Not connected to the database. Import requires an active connection.',\n\n // ---------------------------------------------------------------------------\n // crud.export.*\n // ---------------------------------------------------------------------------\n 'crud.export.action': 'Export',\n 'crud.export.noData': 'No data to export.',\n 'crud.export.toastSuccess': '{{count}} records exported',\n\n // ---------------------------------------------------------------------------\n // crud.delete.*\n // ---------------------------------------------------------------------------\n 'crud.delete.title': 'Delete {{entity}}?',\n 'crud.delete.confirmNamed': 'Are you sure you want to delete \"{{displayValue}}\"? This action cannot be undone.',\n 'crud.delete.confirmGeneric': 'Are you sure you want to delete this {{entity}}? This action cannot be undone.',\n 'crud.delete.cancel': 'Cancel',\n 'crud.delete.delete': 'Delete',\n\n // ---------------------------------------------------------------------------\n // crud.tabs.*\n // ---------------------------------------------------------------------------\n 'crud.tabs.access': 'Access',\n 'crud.tabs.schedule': 'Schedule',\n 'crud.tabs.documents': 'Documents',\n 'crud.tabs.activity': 'Activity',\n 'crud.tabs.inventory': 'Inventory',\n 'crud.tabs.suppliers': 'Suppliers',\n 'crud.tabs.pricing': 'Pricing',\n 'crud.tabs.members': 'Team',\n 'crud.tabs.stats': 'Statistics',\n 'crud.tabs.availability': 'Availability',\n 'crud.tabs.orders': 'Orders',\n\n // crud.orders.* — Client orders/documents tab (stage-based)\n 'crud.orders.all': 'All',\n 'crud.orders.columnDate': 'Date',\n 'crud.orders.columnStage': 'Stage',\n 'crud.orders.columnDescription': 'Description',\n 'crud.orders.columnAmount': 'Amount',\n 'crud.orders.searchPlaceholder': 'Search orders...',\n 'crud.orders.noDocuments': 'No orders yet',\n // Stage labels\n 'crud.orders.stage.draft': 'Draft',\n 'crud.orders.stage.quoted': 'Quoted',\n 'crud.orders.stage.booked': 'Booked',\n 'crud.orders.stage.invoiced': 'Invoiced',\n 'crud.orders.stage.paid': 'Paid',\n 'crud.orders.stage.partial': 'Partial',\n 'crud.orders.stage.overdue': 'Overdue',\n 'crud.orders.stage.cancelled': 'Cancelled',\n 'crud.orders.stage.no_show': 'No Show',\n 'crud.orders.stage.completed': 'Completed',\n\n // ---------------------------------------------------------------------------\n // layout.userMenu.*\n // ---------------------------------------------------------------------------\n 'layout.userMenu.profile': 'Profile',\n 'layout.userMenu.settings': 'Settings',\n 'layout.userMenu.billing': 'Billing',\n 'layout.userMenu.help': 'Help',\n 'layout.userMenu.lightMode': 'Light mode',\n 'layout.userMenu.darkMode': 'Dark mode',\n 'layout.userMenu.systemMode': 'System',\n 'layout.userMenu.language': 'Language',\n 'layout.userMenu.selectLocation': 'Select location',\n 'layout.switchingLocation': 'Switching location…',\n 'layout.userMenu.signOut': 'Sign out',\n\n // ---------------------------------------------------------------------------\n // layout.topbar.*\n // ---------------------------------------------------------------------------\n 'layout.topbar.searchPlaceholder': 'Search...',\n 'layout.topbar.keyboardShortcut': '\\u2318K',\n\n // ---------------------------------------------------------------------------\n // layout.sidebar.*\n // ---------------------------------------------------------------------------\n 'layout.sidebar.collapse': 'Collapse sidebar',\n 'layout.sidebar.expand': 'Expand sidebar',\n\n // ---------------------------------------------------------------------------\n // layout.commandPalette.*\n // ---------------------------------------------------------------------------\n 'layout.commandPalette.placeholder': 'Search pages, people, products, services...',\n 'layout.commandPalette.resultsCount': '{{count}} result{{plural}}',\n 'layout.commandPalette.commandsCount': '{{count}} command{{plural}}',\n 'layout.commandPalette.noResults': 'No results found.',\n 'layout.commandPalette.searching': 'Searching\\u2026',\n 'layout.commandPalette.navigate': 'navigate',\n 'layout.commandPalette.open': 'open',\n\n // ---------------------------------------------------------------------------\n // billing.*\n // ---------------------------------------------------------------------------\n 'billing.title': 'Billing',\n 'billing.subtitle': 'Manage your subscription and billing.',\n 'billing.currentPlan': 'Current Plan',\n 'billing.upgrade': 'Upgrade',\n 'billing.downgrade': 'Downgrade',\n 'billing.monthly': 'Monthly',\n 'billing.yearly': 'Yearly',\n 'billing.yearlySave': 'Save 20%',\n 'billing.free': 'Free',\n 'billing.cancelSubscription': 'Cancel Subscription',\n 'billing.canceling': 'Canceling...',\n 'billing.resumeSubscription': 'Resume Subscription',\n 'billing.resuming': 'Resuming...',\n 'billing.features': 'Features',\n 'billing.perMonth': '/mo',\n 'billing.perYear': '/yr',\n 'billing.getStarted': 'Get Started',\n 'billing.processing': 'Processing...',\n 'billing.mostPopular': 'Most Popular',\n 'billing.nextBilling': 'Next billing: {{date}}',\n 'billing.cancelsOn': 'Cancels on {{date}}',\n 'billing.trialEnds': 'Trial ends {{date}}',\n 'billing.pastDueWarning': 'Your payment is past due. Please update your payment method to avoid service interruption.',\n 'billing.status.active': 'Active',\n 'billing.status.trialing': 'Trial',\n 'billing.status.pastDue': 'Past Due',\n 'billing.status.canceled': 'Canceled',\n 'billing.status.paused': 'Paused',\n\n // ---------------------------------------------------------------------------\n // organization.*\n // ---------------------------------------------------------------------------\n 'organization.invite': 'Invite',\n 'organization.members': 'Members',\n 'organization.memberCount': '{{count}} member{{plural}} in this organization.',\n 'organization.role': 'Role',\n 'organization.emailPlaceholder': 'team@example.com',\n 'organization.sendInvites': 'Send Invites',\n 'organization.sending': 'Sending...',\n 'organization.pending': 'Pending Invites',\n 'organization.remove': 'Remove member',\n 'organization.resend': 'Resend',\n 'organization.revoke': 'Revoke',\n 'organization.inviteTitle': 'Invite Team Members',\n 'organization.inviteDescription': 'Send invites to join your organization.',\n 'organization.inviteSent': 'Invitations sent',\n 'organization.inviteSentDescription': 'Your team members will receive an email with instructions to join.',\n 'organization.emailAddresses': 'Email addresses',\n 'organization.addAnother': 'Add another',\n 'organization.selectRole': 'Select a role',\n 'organization.sent': 'Sent {{date}}',\n 'organization.you': '(you)',\n 'organization.joined': 'Joined',\n 'organization.failedInvites': 'Failed to send invites',\n 'organization.onboarding.title': 'Set up your workspace',\n 'organization.onboarding.namePrompt': 'What should we call your workspace?',\n 'organization.onboarding.preferencesPrompt': 'Regional preferences',\n 'organization.onboarding.workspaceName': 'Workspace name',\n 'organization.onboarding.workspaceNamePlaceholder': 'My Company',\n 'organization.onboarding.timezone': 'Timezone',\n 'organization.onboarding.currency': 'Currency',\n 'organization.onboarding.creating': 'Setting up your workspace',\n 'organization.onboarding.creatingDescription': 'This will only take a moment...',\n 'organization.onboarding.createWorkspace': 'Create Workspace',\n 'organization.onboarding.failedCreate': 'Failed to create workspace',\n\n // ---------------------------------------------------------------------------\n // settings.*\n // ---------------------------------------------------------------------------\n 'settings.title': 'Settings',\n 'settings.subtitle': 'Manage your account and organization preferences.',\n 'settings.general': 'General',\n 'settings.profile': 'Profile',\n 'settings.branding': 'Branding',\n 'settings.security': 'Security',\n 'settings.team': 'Team',\n 'settings.permissions': 'Permissions',\n 'settings.locations': 'Locations',\n 'settings.holidays': 'Holidays',\n 'settings.notifications': 'Notifications',\n 'settings.save': 'Save Changes',\n 'settings.saving': 'Saving...',\n 'settings.companyInfo': 'Company Information',\n 'settings.companyInfoDescription': 'Update your organization details and regional preferences.',\n 'settings.companyName': 'Company Name',\n 'settings.companyNamePlaceholder': 'Acme Inc.',\n 'settings.timezone': 'Timezone',\n 'settings.timezonePlaceholder': 'Select timezone',\n 'settings.currency': 'Currency',\n 'settings.currencyPlaceholder': 'Select currency',\n 'settings.locale': 'Locale',\n 'settings.localePlaceholder': 'Select locale',\n 'settings.uploadLogo': 'Upload Logo',\n 'settings.uiLanguage': 'Interface Language',\n 'settings.uiLanguageDescription': 'Choose the language for the user interface. This applies to your session only.',\n\n // ---------------------------------------------------------------------------\n // notifications.*\n // ---------------------------------------------------------------------------\n 'notifications.title': 'Notifications',\n 'notifications.markAllRead': 'Mark all read',\n 'notifications.empty': 'No notifications',\n 'notifications.whatsNew': \"What's New\",\n 'notifications.inbox': 'Inbox',\n\n // ---------------------------------------------------------------------------\n // user.* (legacy — kept for backward compat)\n // ---------------------------------------------------------------------------\n 'user.profile': 'Profile',\n 'user.settings': 'Settings',\n 'user.help': 'Help',\n 'user.shortcuts': 'Keyboard Shortcuts',\n 'user.theme': 'Theme',\n 'user.themeLight': 'Light',\n 'user.themeDark': 'Dark',\n 'user.themeSystem': 'System',\n\n // ---------------------------------------------------------------------------\n // app.*\n // ---------------------------------------------------------------------------\n 'app.notFound.title': '404',\n 'app.notFound.heading': 'Page not found',\n 'app.notFound.message': \"The page you're looking for doesn't exist or has been moved.\",\n 'app.notFound.goToDashboard': 'Go to Dashboard',\n 'app.accessDenied.heading': 'Access Denied',\n 'app.accessDenied.message': \"You don't have permission to view this page.\",\n\n // ---------------------------------------------------------------------------\n // Additional keys from component/plugin extraction\n // ---------------------------------------------------------------------------\n 'agenda.appointment.addDescription': 'Add description...',\n 'agenda.appointment.addService': 'Add service',\n 'agenda.appointment.cancel': 'Cancel',\n 'agenda.appointment.clientTab': 'Client',\n 'agenda.appointment.noClientData': 'No client data available',\n 'agenda.appointment.client': 'Client',\n 'agenda.appointment.conflict': 'Time conflict — this professional is already booked at this time.',\n 'agenda.appointment.create': 'Create',\n 'agenda.appointment.createClientFailed': 'Failed to create client',\n 'agenda.appointment.creating': 'Creating...',\n 'agenda.appointment.delete': 'Delete',\n 'agenda.appointment.deleteConfirm': 'Delete this appointment?',\n 'agenda.appointment.confirmDelete': 'Delete',\n 'agenda.appointment.deleting': 'Deleting…',\n 'agenda.appointment.edit': 'Edit Appointment',\n 'agenda.appointment.emailOptional': 'Email (optional)',\n 'agenda.appointment.location': 'Location',\n 'agenda.appointment.name': 'Name',\n 'agenda.appointment.new': 'New Appointment',\n 'agenda.appointment.newClient': 'New client',\n 'agenda.appointment.notes': 'Notes',\n 'agenda.appointment.phone': 'Phone',\n 'agenda.appointment.professional': 'Professional',\n 'agenda.appointment.save': 'Save',\n 'agenda.appointment.saving': 'Saving...',\n 'agenda.appointment.searchClient': 'Search client...',\n 'agenda.appointment.searchService': 'Search service to add...',\n 'agenda.appointment.selectLocation': 'Select location...',\n 'agenda.appointment.selectProfessional': 'Select professional...',\n 'agenda.appointment.services': 'Services',\n 'agenda.appointment.status': 'Status',\n 'agenda.appointment.to': 'to',\n 'agenda.appointment.total': 'Total',\n 'agenda.appointment.update': 'Update',\n 'agenda.payment.title': 'Payment',\n 'agenda.payment.generateInvoice': 'Generate invoice',\n 'agenda.payment.generating': 'Generating…',\n 'agenda.payment.pending': 'Pending',\n 'agenda.payment.partial': 'Partial',\n 'agenda.payment.paid': 'Paid',\n 'agenda.payment.collect': 'Collect',\n 'agenda.payment.overdue': 'Overdue',\n 'agenda.payment.cancelled': 'Cancelled',\n 'agenda.payment.none': 'Payment',\n 'agenda.payment.pay': 'Pay',\n 'agenda.payment.paying': 'Paying…',\n 'agenda.payment.remaining': 'Remaining',\n 'agenda.payment.installment': 'Installment',\n 'agenda.payment.total': 'Total',\n 'agenda.payment.noInvoice': 'No invoice generated',\n 'agenda.payment.selectAccount': 'Select account',\n 'agenda.payment.registerPayment': 'Register payment',\n 'agenda.payment.registerPaymentHint': 'Record a payment for this appointment',\n 'agenda.payment.pendingHint': 'Invoice generated, awaiting payment',\n 'agenda.payment.partialHint': 'Partially paid, tap to complete',\n 'agenda.payment.paidHint': 'Payment completed',\n 'agenda.payment.overdueHint': 'Payment overdue',\n 'agenda.payment.backToAppointment': 'Back to appointment',\n 'agenda.payment.checkout': 'Confirm',\n 'agenda.payment.checkingOut': 'Processing…',\n 'agenda.payment.serviceSummary': 'Service summary',\n 'agenda.payment.paymentMethod': 'Payment method',\n 'agenda.payment.checkoutComplete': 'Payment confirmed',\n 'agenda.payment.card': 'Card',\n 'agenda.payment.method': 'Method',\n 'agenda.payment.select': 'Select…',\n 'agenda.payment.cardBrand': 'Brand',\n 'agenda.payment.selectBrand': 'Select brand…',\n 'agenda.payment.cardInstallments': 'Installments',\n 'agenda.payment.bankAccount': 'Account',\n 'agenda.payment.viewInvoice': 'View invoice details',\n 'agenda.calendar.agendas': 'Agendas',\n 'agenda.calendar.create': 'Create',\n 'agenda.calendar.next': 'Next',\n 'agenda.calendar.previous': 'Previous',\n 'agenda.calendar.status': 'Status',\n 'agenda.calendar.today': 'Today',\n 'agenda.calendar.viewAgenda': 'Agenda',\n 'agenda.calendar.viewDay': 'Day',\n 'agenda.calendar.viewMonth': 'Month',\n 'agenda.calendar.viewWeek': 'Week',\n 'agenda.confirmations.confirmed': 'Confirmed:',\n 'agenda.confirmations.empty': 'No pending confirmations',\n 'agenda.confirmations.emptySubtitle': 'All upcoming appointments have been confirmed',\n 'agenda.confirmations.loading': 'Loading...',\n 'agenda.confirmations.subtitle': 'Upcoming appointments pending confirmation',\n 'agenda.confirmations.unknownClient': 'Unknown client',\n 'agenda.confirmations.sendWhatsApp': 'Send WhatsApp',\n 'agenda.confirmations.call': 'Call',\n 'agenda.confirmations.markConfirmed': 'Mark Confirmed',\n 'agenda.confirmations.markCancelled': 'Mark Cancelled',\n 'agenda.contextMenu.changeStatus': 'Change status',\n 'agenda.contextMenu.delete': 'Delete',\n 'agenda.contextMenu.edit': 'Edit',\n 'agenda.contextMenu.notAvailable': '(not available)',\n 'agenda.index.settingsSubtitle': 'Working hours, scheduling preferences, and confirmations',\n 'agenda.index.settingsTitle': 'Agenda Settings',\n 'agenda.popover.unknown': 'Unknown',\n 'agenda.settings.autoConfirm': 'Auto-confirm new bookings',\n 'agenda.settings.autoConfirmDesc': 'Automatically mark new appointments as confirmed',\n 'agenda.settings.autoCreateOrder': 'Auto-create service order',\n 'agenda.settings.autoCreateOrderDesc': 'Create a financial record when booking is completed',\n 'agenda.settings.blockOutside': 'Block outside hours',\n 'agenda.settings.blockOutsideDesc': 'Prevent booking outside of defined working hours',\n 'agenda.settings.calendarDisplay': 'Calendar Display',\n 'agenda.settings.calendarDisplayDesc': 'Visual preferences for the agenda view',\n 'agenda.settings.cancelAlerts': 'Cancellation alerts',\n 'agenda.settings.cancelAlertsDesc': 'Alert when a client cancels an appointment',\n 'agenda.settings.compact': 'Compact time slots',\n 'agenda.settings.compactDesc': 'Use smaller time slots for a denser calendar view',\n 'agenda.settings.confirmations': 'Confirmations',\n 'agenda.settings.confirmationsDesc': 'Appointment reminders and confirmations',\n 'agenda.settings.conflictDetection': 'Conflict detection',\n 'agenda.settings.conflictDetectionDesc': 'Warn when appointments overlap for the same professional',\n 'agenda.settings.dragDrop': 'Drag and drop rescheduling',\n 'agenda.settings.dragDropDesc': 'Allow dragging appointments to reschedule on the calendar',\n 'agenda.settings.enableConfirmations': 'Enable confirmations',\n 'agenda.settings.enableConfirmationsDesc': 'Send reminders and track confirmation status',\n 'agenda.settings.enableLocation': 'Enable location selection',\n 'agenda.settings.enableLocationDesc': 'Assign locations to schedules and bookings',\n 'agenda.settings.enableWorkingHours': 'Enable working hours',\n 'agenda.settings.enableWorkingHoursDesc': 'Manage staff availability and show non-working hours on calendar',\n 'agenda.settings.locations': 'Locations',\n 'agenda.settings.locationsDesc': 'Room and location assignment for schedules and bookings',\n 'agenda.settings.newBookingNotif': 'New booking notification',\n 'agenda.settings.newBookingNotifDesc': 'Notify when a new appointment is created',\n 'agenda.settings.noShowTracking': 'No-show tracking',\n 'agenda.settings.noShowTrackingDesc': 'Flag clients who frequently miss appointments',\n 'agenda.settings.notifications': 'Notifications',\n 'agenda.settings.notificationsDesc': 'Alerts for staff and management',\n 'agenda.settings.reminder': 'Reminder before appointment',\n 'agenda.settings.reminderDesc': 'Send a reminder notification before the appointment',\n 'agenda.settings.scheduling': 'Scheduling',\n 'agenda.settings.schedulingDesc': 'Calendar behavior and booking preferences',\n 'agenda.settings.showCancelled': 'Show cancelled appointments',\n 'agenda.settings.showCancelledDesc': 'Display cancelled bookings on the calendar (dimmed)',\n 'agenda.settings.showNoShow': 'Show no-show appointments',\n 'agenda.settings.showNoShowDesc': 'Display no-show bookings on the calendar',\n 'agenda.settings.workingHours': 'Working Hours',\n 'agenda.settings.workingHoursDesc': 'Staff schedule and availability',\n 'agenda.sidebar.agendas': 'Agendas',\n 'agenda.sidebar.allLocations': 'All locations',\n 'agenda.sidebar.create': 'Create',\n 'agenda.sidebar.location': 'Location',\n 'agenda.sidebar.status': 'Status',\n 'agenda.toolbar.next': 'Next',\n 'agenda.toolbar.previous': 'Previous',\n 'agenda.toolbar.today': 'Today',\n 'agenda.workingHours.addBreak': 'Add break',\n 'agenda.workingHours.copyToAll': 'Copy to all',\n 'agenda.workingHours.dayOff': 'Day off',\n 'agenda.workingHours.removePeriod': 'Remove period',\n 'agenda.workingHours.professional': 'Professional',\n 'agenda.workingHours.save': 'Save',\n 'agenda.workingHours.saveFailed': 'Failed to save',\n 'agenda.workingHours.saved': 'Working hours saved',\n 'agenda.workingHours.saving': 'Saving...',\n 'agenda.workingHours.subtitle': 'Manage working hours per professional',\n 'agenda.workingHours.to': 'to',\n 'auth.login.enterCredentials': 'Enter your credentials to access your account',\n 'auth.login.failedDefault': 'Failed to sign in. Please try again.',\n 'auth.login.failedWithProvider': 'Failed to sign in with {{provider}}.',\n 'auth.login.orContinueWith': 'or continue with',\n 'auth.login.placeholder.email': 'you@example.com',\n 'auth.login.placeholder.password': 'Enter your password',\n 'auth.login.signingIn': 'Signing in...',\n 'auth.login.welcomeBack': 'Welcome Back',\n 'auth.login.welcomeTo': 'Welcome to {{appName}}',\n 'auth.recovery.checkEmail': 'Check your email',\n 'auth.recovery.description': 'Enter your email address and we will send you a link to reset your password.',\n 'auth.recovery.failedDefault': 'Failed to send reset email. Please try again.',\n 'auth.recovery.resetLinkSent': 'We sent a password reset link to <strong>{{email}}</strong>. Please check your inbox and follow the instructions.',\n 'auth.recovery.sendResetLink': 'Send reset link',\n 'auth.recovery.sending': 'Sending...',\n 'auth.signup.confirmPassword': 'Confirm password',\n 'auth.signup.creating': 'Creating account...',\n 'auth.signup.emailVerification': 'Account created for {{email}}. Check your inbox to confirm your email before signing in.',\n 'auth.signup.failedDefault': 'Failed to create account. Please try again.',\n 'auth.signup.fullName': 'Full name',\n 'auth.signup.getStarted': 'Get started with your new account',\n 'auth.signup.passwordMinLength': 'Password must be at least 8 characters.',\n 'auth.signup.passwordsMismatch': 'Passwords do not match.',\n 'auth.signup.placeholder.confirm': 'Repeat your password',\n 'auth.signup.placeholder.name': 'John Doe',\n 'auth.signup.placeholder.password': 'At least 8 characters',\n 'auth.signup.termsAgreement': 'By creating an account, you agree to our',\n 'billing.invoice.amount': 'Amount',\n 'billing.invoice.date': 'Date',\n 'billing.invoice.invoice': 'Invoice',\n 'billing.invoice.noInvoices': 'No invoices yet',\n 'billing.invoice.status': 'Status',\n 'billing.paywall.notAvailable': 'This feature is not available on your current plan.',\n 'billing.paywall.requiresPlan': 'This feature requires the {{plan}} plan or higher.',\n 'billing.paywall.upgradeRequired': 'Upgrade Required',\n 'billing.paywall.viewPlans': 'View Plans',\n 'chat.defaultTitle': 'Assistant',\n 'chat.tryAsking': 'Try asking',\n 'chat.fab.tryIt': 'Try it',\n 'chat.messagePlaceholder': 'Message...',\n 'chat.toolsAvailable': '{{count}} tools available',\n // Dashboard\n 'chat.suggestion.dashboard.kpi-summary.0': 'How is my business doing today?',\n 'chat.suggestion.dashboard.kpi-summary.1': \"What's my revenue today?\",\n 'chat.suggestion.dashboard.kpi-summary.2': 'Give me a summary of today',\n // Agenda\n 'chat.suggestion.agenda.list-appointments.0': \"What's on the agenda today?\",\n 'chat.suggestion.agenda.list-appointments.1': \"Show me tomorrow's appointments\",\n 'chat.suggestion.agenda.list-appointments.2': 'Who has the most bookings this week?',\n 'chat.suggestion.agenda.create-appointment.0': 'Book a haircut for Sarah tomorrow at 10am',\n 'chat.suggestion.agenda.check-availability.0': 'When is Ana available tomorrow?',\n 'chat.suggestion.agenda.check-availability.1': 'Find a 90-minute slot for Carlos this week',\n // Financial\n 'chat.suggestion.financial.get-revenue.0': 'How much did we make today?',\n 'chat.suggestion.financial.get-revenue.1': \"What's this month's revenue?\",\n 'chat.suggestion.financial.get-revenue.2': \"Compare this week's revenue to last week\",\n 'chat.suggestion.financial.create-invoice.0': 'Create an invoice for a new client',\n 'chat.suggestion.financial.list-payables.0': 'Show me overdue bills',\n 'chat.suggestion.financial.list-payables.1': 'What bills are due this week?',\n // Inventory\n 'chat.suggestion.inventory.low-stock.0': 'Which products are running low?',\n 'chat.suggestion.inventory.low-stock.1': 'Show me a stock summary',\n 'chat.suggestion.inventory.low-stock.2': 'What are my most used products?',\n // CRM\n 'chat.suggestion.crm.count-customers.0': 'How many customers do we have?',\n 'chat.suggestion.crm.count-customers.1': 'Who are my top customers?',\n 'chat.suggestion.crm.list-leads.0': 'Show new leads from this week',\n 'chat.suggestion.crm.list-leads.1': 'Which leads need follow-up?',\n 'chat.suggestion.crm.list-leads.2': \"What's our conversion rate?\",\n // Custom Forms\n 'chat.suggestion.custom_forms.list-templates.0': 'What forms do we have?',\n 'chat.suggestion.custom_forms.list-templates.1': 'Show me anamnesis templates',\n 'chat.suggestion.custom_forms.list-documents.0': \"Show this client's documents\",\n 'common.create': 'Create',\n 'common.feature': 'Feature',\n 'common.message': 'Message...',\n 'common.more': 'More',\n 'common.noContent': 'No content yet',\n 'crm.activities.activitiesLogged': 'Activities are logged from lead and deal interactions',\n 'crm.activities.all': 'All',\n 'crm.activities.completedFilter': 'Completed',\n 'crm.activities.done': 'Done',\n 'crm.activities.noActivities': 'No activities',\n 'crm.activities.noActivitiesOfType': 'No activities of type \"{{type}}\"',\n 'crm.activities.overdue': 'overdue',\n 'crm.activities.overdueLabel': 'Overdue',\n 'crm.activities.pending': 'pending',\n 'crm.activities.pendingFilter': 'Pending',\n 'crm.activities.title': 'Activities',\n 'crm.dashboard.activeDeals': '{{count}} active deals',\n 'crm.dashboard.avgDealValue': 'Avg deal value',\n 'crm.dashboard.leadsCount': '{{count}} leads',\n 'crm.dashboard.quotesCount': '{{count}} quotes',\n 'crm.dashboard.conversionRate': 'Conversion Rate',\n 'crm.dashboard.conversionRateLabel': 'Conversion rate',\n 'crm.dashboard.createFirstLead': 'Create your first lead to see the funnel',\n 'crm.dashboard.dealsWon': 'Deals won this month',\n 'crm.dashboard.leadToDeal': 'Lead to deal',\n 'crm.dashboard.newThisMonth': '{{count}} new this month',\n 'crm.dashboard.noLeadsYet': 'No leads yet. Capture your first lead to get started.',\n 'crm.dashboard.noPipelineData': 'No pipeline data yet',\n 'crm.dashboard.noQuotesYet': 'No quotes yet.',\n 'crm.dashboard.openPipeline': 'Open Pipeline',\n 'crm.dashboard.overdueCount': '{{count}} overdue',\n 'crm.dashboard.pendingTasks': 'Pending Tasks',\n 'crm.dashboard.performance': 'Performance',\n 'crm.dashboard.pipelineOverview': 'Pipeline Overview',\n 'crm.dashboard.pipelineValue': 'Pipeline Value',\n 'crm.dashboard.recentLeads': 'Recent Leads',\n 'crm.dashboard.recentQuotes': 'Recent Quotes',\n 'crm.dashboard.revenueWon': 'Revenue won',\n 'crm.dashboard.totalDeals': '{{count}} total deals',\n 'crm.dashboard.totalLeads': 'Total Leads',\n 'crm.dealSidebar.activitiesAppear': 'Activities will appear here as they are logged',\n 'crm.dealSidebar.activity': 'Activity',\n 'crm.dealSidebar.assignedTo': 'Assigned to',\n 'crm.dealSidebar.contact': 'Contact',\n 'crm.dealSidebar.created': 'Created',\n 'crm.dealSidebar.deal': 'Deal',\n 'crm.dealSidebar.dealNotFound': 'Deal not found',\n 'crm.dealSidebar.expectedClose': 'Expected close',\n 'crm.dealSidebar.noActivities': 'No activities yet',\n 'crm.dealSidebar.noQuotes': 'No quotes linked',\n 'crm.dealSidebar.notes': 'Notes',\n 'crm.dealSidebar.overview': 'Overview',\n 'crm.dealSidebar.probability': 'Probability',\n 'crm.dealSidebar.quotes': 'Quotes',\n 'crm.dealSidebar.quotesAppear': 'Quotes created for this lead will appear here',\n 'crm.dealSidebar.stage': 'Stage',\n 'crm.dealSidebar.tags': 'Tags',\n 'crm.dealSidebar.updated': 'Updated',\n 'crm.dealSidebar.value': 'Value',\n 'crm.dealSidebar.viewLeadProfile': 'View Full Lead Profile',\n 'crm.leadDetail.assignedTo': 'Assigned to',\n 'crm.leadDetail.backToList': 'Back to list',\n 'crm.leadDetail.company': 'Company',\n 'crm.leadDetail.contactInfo': 'Contact Information',\n 'crm.leadDetail.createQuote': 'Create Quote',\n 'crm.leadDetail.created': 'Created',\n 'crm.leadDetail.dealStatus': 'Deal status',\n 'crm.leadDetail.dealValue': 'Deal value',\n 'crm.leadDetail.details': 'Details',\n 'crm.leadDetail.email': 'Email',\n 'crm.leadDetail.leadNotFound': 'Lead not found',\n 'crm.leadDetail.leads': 'Leads',\n 'crm.leadDetail.loading': 'Loading...',\n 'crm.leadDetail.notFound': 'Not found',\n 'crm.leadDetail.notes': 'Notes',\n 'crm.leadDetail.phone': 'Phone',\n 'crm.leadDetail.pipeline': 'Pipeline',\n 'crm.leadDetail.probability': 'Probability',\n 'crm.leadDetail.quotes': 'Quotes',\n 'crm.leadDetail.source': 'Source',\n 'crm.leadDetail.stage': 'Stage',\n 'crm.leadDetail.tags': 'Tags',\n 'crm.leadDetail.updated': 'Updated',\n 'crm.leadDetail.value': 'Value',\n 'crm.leadForm.cancel': 'Cancel',\n 'crm.leadForm.company': 'Company',\n 'crm.leadForm.companyPlaceholder': 'Company name',\n 'crm.leadForm.email': 'Email',\n 'crm.leadForm.emailPlaceholder': 'email@example.com',\n 'crm.leadForm.name': 'Name *',\n 'crm.leadForm.namePlaceholder': 'Contact name',\n 'crm.leadForm.notes': 'Notes',\n 'crm.leadForm.notesPlaceholder': 'Additional notes...',\n 'crm.leadForm.phone': 'Phone',\n 'crm.leadForm.phonePlaceholder': '+55 11 99999-9999',\n 'crm.leadForm.save': 'Save',\n 'crm.leadForm.saving': 'Saving...',\n 'crm.leadForm.subtitle': 'Capture a new lead',\n 'crm.leadForm.title': 'New Lead',\n 'crm.leads.captureFirst': 'Capture your first lead',\n 'crm.leads.contactCol': 'Contact',\n 'crm.leads.name': 'Name',\n 'crm.leads.newLead': 'New Lead',\n 'crm.leads.noLeads': 'No leads yet',\n 'crm.leads.searchPlaceholder': 'Search leads...',\n 'crm.leads.source': 'Source',\n 'crm.leads.statusCol': 'Status',\n 'crm.leads.title': 'Leads',\n 'crm.page.logActivity': 'Log Activity',\n 'crm.page.logActivityDesc': 'Record a call, email, or note',\n 'crm.page.newDeal': 'New Deal',\n 'crm.page.newDealDesc': 'Create a deal from pipeline',\n 'crm.page.newLead': 'New Lead',\n 'crm.page.newLeadDesc': 'Capture a new lead',\n 'crm.page.newQuote': 'New Quote',\n 'crm.page.newQuoteDesc': 'Send a proposal',\n 'crm.page.settingsSubtitle': 'Configure pipeline, lead management, and registries',\n 'crm.page.settingsTitle': 'Sales & CRM Settings',\n 'crm.pipeline.dropHere': 'Drop here',\n 'crm.pipeline.moveFailed': 'Failed to move deal',\n 'crm.pipeline.movedTo': 'Moved to {{stage}}',\n 'crm.pipeline.noDeals': 'No deals',\n 'crm.pipeline.subtitle': 'Drag deals between stages',\n 'crm.pipeline.title': 'Pipeline',\n 'crm.quoteDetail.backToList': 'Back to list',\n 'crm.quoteDetail.client': 'Client',\n 'crm.quoteDetail.date': 'Date',\n 'crm.quoteDetail.description': 'Description',\n 'crm.quoteDetail.discount': 'Discount',\n 'crm.quoteDetail.edit': 'Edit',\n 'crm.quoteDetail.send': 'Send',\n 'crm.quoteDetail.sending': 'Sending...',\n 'crm.quoteDetail.sendPrint': 'Print',\n 'crm.quoteDetail.sendEmail': 'Send by E-mail',\n 'crm.quoteDetail.sendWhatsApp': 'Send by WhatsApp',\n 'crm.quoteDetail.approve': 'Approve',\n 'crm.quoteDetail.approving': 'Approving...',\n 'crm.quoteDetail.reject': 'Reject',\n 'crm.quoteDetail.rejecting': 'Rejecting...',\n 'crm.quoteDetail.confirmReject': 'Confirm Rejection',\n 'crm.quoteDetail.rejectDescription': 'Provide a reason for rejecting this quote.',\n 'crm.quoteDetail.rejectReasonPlaceholder': 'Reason for rejection...',\n 'crm.quoteDetail.invoiceCreated': 'Invoice created from this quote',\n 'crm.quoteDetail.items': 'Items',\n 'crm.quoteDetail.loading': 'Loading...',\n 'crm.quoteDetail.notFound': 'Quote not found',\n 'crm.quoteDetail.notes': 'Notes',\n 'crm.quoteDetail.paymentConditions': 'Payment Conditions',\n 'crm.quoteDetail.qty': 'Qty',\n 'crm.quoteDetail.quoteNumber': 'Quote {{number}}',\n 'crm.quoteDetail.rejectionReason': 'Rejection reason',\n 'crm.quoteDetail.subtotal': 'Subtotal',\n 'crm.quoteDetail.title': 'Quotes',\n 'crm.quoteDetail.total': 'Total',\n 'crm.quoteDetail.unitPrice': 'Unit Price',\n 'crm.quoteDetail.validUntil': 'Valid Until',\n 'crm.quoteDetail.viewInvoice': 'View Invoice',\n 'crm.quoteForm.addFirstItem': 'Add your first item',\n 'crm.quoteForm.addItem': 'Add Item',\n 'crm.quoteForm.cancel': 'Cancel',\n 'crm.quoteForm.client': 'Client',\n 'crm.quoteForm.description': 'Description',\n 'crm.quoteForm.discount': 'Discount',\n 'crm.quoteForm.done': 'Done',\n 'crm.quoteForm.editSubtitle': 'Update this proposal',\n 'crm.quoteForm.editTitle': 'Edit Quote',\n 'crm.quoteForm.itemCount': '{{count}} items',\n 'crm.quoteForm.itemDescriptionPlaceholder': 'Item description',\n 'crm.quoteForm.loading': 'Loading...',\n 'crm.quoteForm.newSubtitle': 'Create a proposal for your client',\n 'crm.quoteForm.newTitle': 'New Quote',\n 'crm.quoteForm.noDescription': 'No description',\n 'crm.quoteForm.noItems': 'No items added',\n 'crm.quoteForm.notes': 'Notes',\n 'crm.quoteForm.notesPlaceholder': 'Internal observations...',\n 'crm.quoteForm.paymentConditions': 'Payment Conditions',\n 'crm.quoteForm.paymentConditionsPlaceholder': 'e.g. 50% upfront, 50% on delivery',\n 'crm.quoteForm.qty': 'Qty',\n 'crm.quoteForm.quoteDate': 'Quote Date',\n 'crm.quoteForm.quoteDetails': 'Quote Details',\n 'crm.quoteForm.quoteItems': 'Quote Items',\n 'crm.quoteForm.saveChanges': 'Save Changes',\n 'crm.quoteForm.saveQuote': 'Save Quote',\n 'crm.quoteForm.saving': 'Saving...',\n 'crm.quoteForm.searchClient': 'Search client...',\n 'crm.quoteForm.addAsLead': 'Add as lead',\n 'crm.quoteForm.selectItemType': 'Select item type:',\n 'crm.quoteForm.statusApproved': 'Approved',\n 'crm.quoteForm.statusDraft': 'Draft',\n 'crm.quoteForm.statusExpired': 'Expired',\n 'crm.quoteForm.statusRejected': 'Rejected',\n 'crm.quoteForm.statusSent': 'Sent',\n 'crm.quoteForm.total': 'Total',\n 'crm.quoteForm.unitPrice': 'Unit Price',\n 'crm.quoteForm.validUntil': 'Valid Until',\n 'crm.quotes.amount': 'Amount',\n 'crm.quotes.contact': 'Contact',\n 'crm.quotes.createFirst': 'Create your first quote',\n 'crm.quotes.date': 'Date',\n 'crm.quotes.newQuote': 'New Quote',\n 'crm.quotes.noQuotes': 'No quotes yet',\n 'crm.quotes.quotesCount': '{{count}} quotes',\n 'crm.quotes.status': 'Status',\n 'crm.quotes.title': 'Quotes',\n 'crud.form.createDescription': 'Create a new {{entity}}.',\n 'crud.form.editDescription': 'Update {{entity}} details.',\n 'crud.form.failedToSave': 'Failed to save {{entity}}',\n 'crud.form.saveChanges': 'Save Changes',\n 'crud.form.select': 'Select {{field}}...',\n 'crud.list.addEntity': '+ Add {{entity}}',\n 'crud.list.search': 'Search {{entities}}...',\n 'financial.cards.installment': 'Installment {{current}}/{{total}}',\n 'financial.cards.noTransactions': 'No card transactions',\n 'financial.cards.pending': 'Pending',\n 'financial.cards.received': 'Received',\n 'financial.cards.subtitle': 'Credit and debit card transactions',\n 'financial.cards.title': 'Cards',\n 'financial.cards.transactions': '({{count}} transactions)',\n 'financial.cards.transactionsAppear': 'Card transactions will appear here when payments are made via credit/debit cards',\n 'financial.cashRegisters.addNotes': 'Add notes',\n 'financial.cashRegisters.back': 'Back',\n 'financial.cashRegisters.bills': 'Bills',\n 'financial.cashRegisters.closeSession': 'Close Session',\n 'financial.cashRegisters.closeThisSession': 'Close this session',\n 'financial.cashRegisters.closing': 'Closing...',\n 'financial.cashRegisters.closingBalance': 'Closing Balance',\n 'financial.cashRegisters.closingNotes': 'Closing Notes',\n 'financial.cashRegisters.coins': 'Coins',\n 'financial.cashRegisters.confirmOpen': 'Confirm & Open',\n 'financial.cashRegisters.confirmOpening': 'Confirm Cash Opening',\n 'financial.cashRegisters.count': 'Count',\n 'financial.cashRegisters.countBills': 'Count Bills & Coins',\n 'financial.cashRegisters.countedTotal': 'Counted Total',\n 'financial.cashRegisters.denominationCount': 'Denomination count',\n 'financial.cashRegisters.differenceFromOpening': 'Difference from opening',\n 'financial.cashRegisters.method': 'Method',\n 'financial.cashRegisters.noCashAccounts': 'No cash register accounts found. Create a bank account with type \"Cash Register\" first.',\n 'financial.cashRegisters.noClosedSessions': 'No closed sessions yet',\n 'financial.cashRegisters.openAnother': 'Open another register',\n 'financial.cashRegisters.openSession': 'Open Session',\n 'financial.cashRegisters.openSessions': 'Open Sessions',\n 'financial.cashRegisters.opened': 'Opened',\n 'financial.cashRegisters.opening': 'Opening...',\n 'financial.cashRegisters.openingBalance': 'Opening Balance',\n 'financial.cashRegisters.quickAmount': 'Quick Amount',\n 'financial.cashRegisters.register': 'Register',\n 'financial.cashRegisters.sessionHistory': 'Session History',\n 'financial.cashRegisters.subtitle': 'Open, count and close cash sessions',\n 'financial.commissions.comingSoon': 'Coming soon',\n 'financial.commissions.subtitle': 'Team commissions',\n 'financial.invoice.accountsPayable': 'Accounts Payable',\n 'financial.invoice.accountsReceivable': 'Accounts Receivable',\n 'financial.invoice.cancelConfirm': 'This action cannot be undone.',\n 'financial.invoice.cancelDesc': 'The invoice will be marked as cancelled. All pending installments will also be cancelled. This invoice will no longer count towards totals.',\n 'financial.invoice.cancelInvoice': 'Cancel Invoice',\n 'financial.invoice.cancelling': 'Cancelling...',\n 'financial.invoice.contact': 'Contact',\n 'financial.invoice.createFirst': 'Create your first invoice',\n 'financial.invoice.date': 'Date',\n 'financial.invoice.booking': 'Booking',\n 'financial.invoice.discount': 'Discount',\n 'financial.invoice.due': 'Due:',\n 'financial.invoice.edit': 'Edit',\n 'financial.invoice.fullyPaid': 'Fully paid',\n 'financial.invoice.installments': 'Installments',\n 'financial.invoice.invoices': '{{count}} invoices',\n 'financial.invoice.items': 'Items',\n 'financial.invoice.keepInvoice': 'Keep Invoice',\n 'financial.invoice.new': 'New',\n 'financial.invoice.noDetails': 'No additional details recorded',\n 'financial.invoice.noInstallments': 'No installments',\n 'financial.invoice.noInvoices': 'No invoices yet',\n 'financial.invoice.summaryTotal': 'Total',\n 'financial.invoice.summaryReceived': 'Received',\n 'financial.invoice.summaryReceivable': 'Receivable',\n 'financial.invoice.summaryPaid': 'Paid',\n 'financial.invoice.summaryPayable': 'Payable',\n 'financial.invoice.notFound': 'Invoice not found',\n 'financial.invoice.notFoundDesc': 'This invoice could not be loaded.',\n 'financial.invoice.notes': 'Notes',\n 'financial.invoice.paidLabel': 'Paid:',\n 'financial.invoice.paidOn': 'Paid on:',\n 'financial.invoice.pay': 'Pay',\n 'financial.invoice.paymentSchedule': 'Payment Schedule',\n 'financial.invoice.remaining': 'Remaining:',\n 'financial.invoice.searchPlaceholder': 'Search by contact or description...',\n 'financial.invoice.showing': 'Showing {{shown}} of {{total}}',\n 'financial.invoice.subtotal': 'Subtotal',\n 'financial.invoice.surcharge': 'Surcharge',\n 'financial.invoice.total': 'Total',\n 'financial.invoice.yesCancel': 'Yes, Cancel',\n 'financial.invoiceForm.addFirstItem': 'Add your first item',\n 'financial.invoiceForm.addItem': 'Add Item',\n 'financial.invoiceForm.addItemsFirst': 'Add items first',\n 'financial.invoiceForm.additionalNotes': 'Additional notes...',\n 'financial.invoiceForm.cancel': 'Cancel',\n 'financial.invoiceForm.close': 'Close',\n 'financial.invoiceForm.creating': 'Creating new invoice',\n 'financial.invoiceForm.date': 'Date',\n 'financial.invoiceForm.description': 'Description',\n 'financial.invoiceForm.discountSurcharge': 'Discount / Surcharge',\n 'financial.invoiceForm.done': 'Done',\n 'financial.invoiceForm.editing': 'Editing invoice',\n 'financial.invoiceForm.fiscalNumber': 'Fiscal Number (optional)',\n 'financial.invoiceForm.headquarters': 'Headquarters',\n 'financial.invoiceForm.installments': 'Installments',\n 'financial.invoiceForm.item': 'Item',\n 'financial.invoiceForm.itemDescription': 'Item description',\n 'financial.invoiceForm.items': 'Items',\n 'financial.invoiceForm.noDescription': 'No description',\n 'financial.invoiceForm.noItems': 'No items added yet',\n 'financial.invoiceForm.noUnitsFound': 'No units found',\n 'financial.invoiceForm.observations': 'Observations',\n 'financial.invoiceForm.payTo': 'Pay to',\n 'financial.invoiceForm.qty': 'Qty',\n 'financial.invoiceForm.receiveFrom': 'Receive from',\n 'financial.invoiceForm.save': 'Save',\n 'financial.invoiceForm.saving': 'Saving...',\n 'financial.invoiceForm.searchType': 'Type to search...',\n 'financial.invoiceForm.searchUnit': 'Search unit...',\n 'financial.invoiceForm.selectInstallments': 'Select installment count above',\n 'financial.invoiceForm.selectItemType': 'Select item type:',\n 'financial.invoiceForm.selectUnit': 'Select unit',\n 'financial.invoiceForm.selectUnitTitle': 'Select Unit',\n 'financial.invoiceForm.unit': 'Unit',\n 'financial.invoiceForm.unitPrice': 'Unit Price',\n 'financial.nav.cards': 'Cards',\n 'financial.nav.cashRegisters': 'Cash Registers',\n 'financial.nav.commissions': 'Commissions',\n 'financial.nav.list': 'List',\n 'financial.nav.new': 'New',\n 'financial.nav.overview': 'Overview',\n 'financial.nav.payables': 'Accounts Payable',\n 'financial.nav.receivables': 'Accounts Receivable',\n 'financial.nav.reconciliation': 'Reconciliation',\n 'financial.nav.recurringExpenses': 'Recurring Expenses',\n 'financial.nav.rules': 'Rules',\n 'financial.nav.statements': 'Statements',\n 'financial.nav.summary': 'Summary',\n 'financial.onboarding.back': 'Back',\n 'financial.onboarding.configureHint': 'You can configure this in detail from the Settings gear icon inside the Financial module.',\n 'financial.onboarding.getStarted': 'Get Started',\n 'financial.onboarding.next': 'Next',\n 'financial.onboarding.startUsing': 'Start using Financial',\n 'financial.onboarding.skip': 'Skip setup',\n 'financial.onboarding.welcome': 'Welcome to Financial',\n 'financial.onboarding.description': \"Let's set up your financial module. This quick wizard will help you configure the essentials.\",\n 'financial.onboarding.accounts.title': 'Bank Accounts',\n 'financial.onboarding.accounts.description': 'Add your bank accounts, cash registers, and credit cards. You can always add more later from Settings.',\n 'financial.onboarding.payments.title': 'Payment Methods',\n 'financial.onboarding.payments.description': 'Review which payment types you accept. Default types (Cash, PIX, Credit Card, etc.) are already set up.',\n 'financial.onboarding.chart.title': 'Chart of Accounts',\n 'financial.onboarding.chart.description': 'A default chart of accounts template has been created. You can customize it anytime from Settings.',\n 'financial.page.newPayable': 'New Payable',\n 'financial.page.newPayableDesc': 'Record an expense or bill to pay',\n 'financial.page.newReceivable': 'New Receivable',\n 'financial.page.newReceivableDesc': 'Record income or amount to receive',\n 'financial.page.openCash': 'Open Cash Register',\n 'financial.page.openCashDesc': 'Start a new cash session',\n 'financial.page.settingsSubtitle': 'Preferences, payment methods, and accounts',\n 'financial.page.settingsTitle': 'Financial Settings',\n 'financial.payment.amount': 'Amount',\n 'financial.payment.bankAccount': 'Bank Account',\n 'financial.payment.cancel': 'Cancel',\n 'financial.payment.card': 'Card',\n 'financial.payment.cardBrand': 'Card Brand',\n 'financial.payment.cardInstallments': 'Installments',\n 'financial.payment.date': 'Date',\n 'financial.payment.installment': 'Installment #{{number}}',\n 'financial.payment.method': 'Payment Method',\n 'financial.payment.notes': 'Notes',\n 'financial.payment.optionalNotes': 'Optional notes...',\n 'financial.payment.payAmount': 'Pay {{amount}}',\n 'financial.payment.processing': 'Processing...',\n 'financial.payment.remaining': '{{amount}} remaining',\n 'financial.payment.select': 'Select...',\n 'financial.payment.selectAccount': 'Select account...',\n 'financial.payment.selectBrand': 'Select brand...',\n 'financial.payment.title': 'Record Payment',\n 'financial.settings.allowPartial': 'Allow partial payments',\n 'financial.settings.allowPartialDesc': 'Accept payments less than the full installment amount',\n 'financial.settings.autoClose': 'Auto-close at end of day',\n 'financial.settings.autoCloseDesc': 'Remind to close open sessions at the end of business hours',\n 'financial.settings.autoInstallments': 'Auto-generate installments',\n 'financial.settings.autoInstallmentsDesc': 'Automatically split invoice total into equal installments',\n 'financial.settings.cashRegister': 'Cash Register',\n 'financial.settings.cashRegisterDesc': 'Cash session behavior',\n 'financial.settings.dailySummary': 'Daily financial summary',\n 'financial.settings.dailySummaryDesc': 'Send a daily email summary of receivables and payables',\n 'financial.settings.invoices': 'Invoices',\n 'financial.settings.invoicesDesc': 'How invoices and payments are handled',\n 'financial.settings.notifications': 'Notifications',\n 'financial.settings.notificationsDesc': 'Alerts and reminders',\n 'financial.settings.overdueAlerts': 'Overdue payment alerts',\n 'financial.settings.overdueAlertsDesc': 'Notify when invoices pass their due date',\n 'financial.settings.requireDoc': 'Require document number',\n 'financial.settings.requireDocDesc': 'Make document/invoice number mandatory on payments',\n 'financial.settings.requireOpening': 'Require opening balance',\n 'financial.settings.requireOpeningDesc': 'Opening balance must be confirmed before starting a session',\n 'financial.settingsPage.subtitle': 'Manage payment methods, accounts, and configurations',\n 'financial.settingsPage.title': 'Financial Settings',\n 'financial.statements.account': 'Account',\n 'financial.statements.from': 'From',\n 'financial.statements.noTransactions': 'No transactions in this period',\n 'financial.statements.selectAccount': 'Select account',\n 'financial.statements.selectToView': 'Select an account to view statement',\n 'financial.statements.subtitle': 'Bank account transactions and balances',\n 'financial.statements.title': 'Statements',\n 'financial.statements.to': 'To',\n 'financial.summary.allAccounts': 'All accounts',\n 'financial.summary.cashFlow': 'Cash Flow',\n 'financial.summary.cashFlowBreakdown': 'Cash Flow Breakdown',\n 'financial.summary.cashFlowBreakdownSubtitle': 'Receivables vs. payables this month',\n 'financial.summary.cashFlowSubtitle': 'Monthly income vs expenses',\n 'financial.summary.expenses': 'Expenses',\n 'financial.summary.income': 'Income',\n 'financial.summary.monthlyFlow': 'Monthly Flow',\n 'financial.summary.negativeBalance': 'Negative balance',\n 'financial.summary.net': 'Net',\n 'financial.summary.noOverdue': 'No overdue transactions',\n 'financial.summary.noTransactions': 'No transactions yet',\n 'financial.summary.overdue': '{{count}} overdue',\n 'financial.summary.overduePayable': 'Overdue payable',\n 'financial.summary.overdueReceivable': 'Overdue receivable',\n 'financial.summary.overdueTitle': 'Overdue',\n 'financial.summary.paid': 'Paid',\n 'financial.summary.payable': 'Payable',\n 'financial.summary.positiveBalance': 'Positive balance',\n 'financial.summary.receivable': 'Receivable',\n 'financial.summary.received': 'Received',\n 'financial.summary.recentTransactions': 'Recent Transactions',\n 'financial.summary.totalBalance': 'Total Balance',\n 'financial.summary.transactionsAppear': 'Transactions will appear here once recorded',\n 'financial.summary.viewAll': 'View all',\n 'inventory.dashboard.activeItems': 'Active items',\n 'inventory.dashboard.belowMinimum': 'Below minimum',\n 'inventory.dashboard.entries': 'Entries:',\n 'inventory.dashboard.exits': 'Exits:',\n 'inventory.dashboard.last7Days': 'Last 7 days',\n 'inventory.dashboard.lowStock': 'Low Stock',\n 'inventory.dashboard.needRestocking': 'Need restocking',\n 'inventory.dashboard.outOfStock': 'Out of Stock',\n 'inventory.dashboard.quickActions': 'Quick Actions',\n 'inventory.dashboard.quickActionsDesc': 'Use the sidebar to record stock entries, exits, or manage products.',\n 'inventory.dashboard.recentActivity': 'Recent Activity',\n 'inventory.dashboard.stockValue': 'Stock Value',\n 'inventory.dashboard.totalProducts': 'Total Products',\n 'inventory.dashboard.totalValue': 'Total inventory value',\n 'inventory.history.noMovements': 'No movements recorded',\n 'inventory.history.searchPlaceholder': 'Search movements...',\n 'inventory.history.subtitle': 'All stock movements',\n 'inventory.history.title': 'Stock History',\n 'inventory.nav.dashboard': 'Dashboard',\n 'inventory.nav.entry': 'Entry',\n 'inventory.nav.exit': 'Exit',\n 'inventory.nav.history': 'History',\n 'inventory.nav.list': 'List',\n 'inventory.nav.new': 'New',\n 'inventory.nav.products': 'Products',\n 'inventory.nav.stock': 'Stock',\n 'inventory.page.newProduct': 'New Product',\n 'inventory.page.newProductDesc': 'Add a product to your catalog',\n 'inventory.page.settingsSubtitle': 'Preferences, suppliers, categories, and units',\n 'inventory.page.settingsTitle': 'Inventory Settings',\n 'inventory.page.stockEntry': 'Stock Entry',\n 'inventory.page.stockEntryDesc': 'Record goods received',\n 'inventory.page.stockExit': 'Stock Exit',\n 'inventory.page.stockExitDesc': 'Record goods used or sold',\n 'inventory.recipeDetail.active': 'Active',\n 'inventory.recipeDetail.backToList': 'Back to list',\n 'inventory.recipeDetail.inactive': 'Inactive',\n 'inventory.recipeDetail.ingredientCount': 'Ingredients',\n 'inventory.recipeDetail.ingredientsTitle': 'Ingredients',\n 'inventory.recipeDetail.instructions': 'Instructions',\n 'inventory.recipeDetail.noIngredients': 'No ingredients defined',\n 'inventory.recipeDetail.notFound': 'Recipe not found',\n 'inventory.recipeDetail.prepTime': 'Prep time',\n 'inventory.recipeDetail.produces': 'Produces',\n 'inventory.recipeDetail.recipes': 'Recipes',\n 'inventory.recipeDetail.yield': 'Yield',\n 'inventory.recipes.createFirst': 'Create your first recipe',\n 'inventory.recipes.ingredients': '{{count}} ingredients',\n 'inventory.recipes.newRecipe': 'New Recipe',\n 'inventory.recipes.noRecipes': 'No recipes yet',\n 'inventory.recipes.produces': 'Produces:',\n 'inventory.recipes.productionFormulas': '{{count}} production formulas',\n 'inventory.recipes.recipesDesc': 'Recipes define how to produce products from ingredients',\n 'inventory.recipes.title': 'Recipes',\n 'inventory.recipes.yield': 'Yield:',\n 'inventory.stock.additionalDetails': 'Additional details (optional)',\n 'inventory.stock.adjustmentDesc': 'Count correction',\n 'inventory.stock.adjustmentLabel': 'Adjustment',\n 'inventory.stock.back': 'Back',\n 'inventory.stock.batchNumber': 'Batch Number',\n 'inventory.stock.currentStock': 'Current stock:',\n 'inventory.stock.destination': 'Destination',\n 'inventory.stock.document': 'Document',\n 'inventory.stock.documentNumber': 'Document Number',\n 'inventory.stock.entry': 'Stock Entry',\n 'inventory.stock.entryDesc': 'Receiving goods',\n 'inventory.stock.entryLabel': 'Entry',\n 'inventory.stock.exit': 'Stock Exit',\n 'inventory.stock.exitDesc': 'Using or selling',\n 'inventory.stock.exitLabel': 'Exit',\n 'inventory.stock.expirationDate': 'Expiration Date',\n 'inventory.stock.fromLocation': 'From Location',\n 'inventory.stock.locationLabel': 'Location',\n 'inventory.stock.lossDesc': 'Waste or damage',\n 'inventory.stock.lossLabel': 'Loss',\n 'inventory.stock.movement': 'Stock Movement',\n 'inventory.stock.movementDetails': 'Movement Details',\n 'inventory.stock.movementType': 'Movement type',\n 'inventory.stock.next': 'Next',\n 'inventory.stock.notes': 'Notes',\n 'inventory.stock.product': 'Product',\n 'inventory.stock.quantity': 'Quantity *',\n 'inventory.stock.quantityLabel': 'Quantity',\n 'inventory.stock.reason': 'Reason *',\n 'inventory.stock.reasonLabel': 'Reason',\n 'inventory.stock.recordMovement': 'Record Movement',\n 'inventory.stock.recorded': 'Recorded',\n 'inventory.stock.recording': 'Recording...',\n 'inventory.stock.searchProduct': 'Search by name, SKU, or barcode...',\n 'inventory.stock.stepOf': 'Step {{step}} of 3',\n 'inventory.stock.supplier': 'Supplier',\n 'inventory.stock.toLocation': 'To Location *',\n 'inventory.stock.total': 'Total',\n 'inventory.stock.totalCost': 'Total Cost',\n 'inventory.stock.transferDesc': 'Between locations',\n 'inventory.stock.transferLabel': 'Transfer',\n 'inventory.stock.unitCost': 'Unit Cost',\n 'inventory.stock.unitCostLabel': 'Unit Cost',\n 'inventory.onboarding.welcome': 'Welcome to Inventory',\n 'inventory.onboarding.description': 'Track products, manage stock levels, and monitor movements across your business.',\n 'inventory.onboarding.skip': 'Skip setup',\n 'inventory.onboarding.getStarted': 'Get Started',\n 'inventory.onboarding.units.title': 'Measurement Units',\n 'inventory.onboarding.units.description': 'Default units (Unit, Box, Kg, L, etc.) are ready. Customize them anytime in Settings.',\n 'inventory.onboarding.locations.title': 'Stock Locations',\n 'inventory.onboarding.locations.description': 'A default storage location has been created. Add more for multi-location tracking.',\n 'inventory.onboarding.start': 'Start using Inventory',\n 'layout.bottomNav.chat': 'Chat',\n 'layout.commandPalette.commandCount': '{{count}} command{{plural}}',\n 'layout.commandPalette.description': 'Search for pages, actions, people, products and services',\n 'layout.commandPalette.resultCount': '{{count}} result{{plural}}',\n 'layout.commandPalette.title': 'Command palette',\n 'layout.mobileDrawer.description': 'Application navigation links',\n 'layout.mobileDrawer.title': 'Navigation menu',\n 'layout.topbar.search': 'Search...',\n 'notifications.noUpdates': 'No updates yet',\n 'organization.createOrg': 'Create organization',\n 'organization.createOrgDescription': 'Create a new workspace for your team.',\n 'organization.createOrgTitle': 'Create Organization',\n 'organization.creating': 'Creating...',\n 'organization.invite.addAnother': 'Add another',\n 'organization.invite.description': 'Send invites to join your organization.',\n 'organization.invite.emailLabel': 'Email addresses',\n 'organization.invite.roleLabel': 'Role',\n 'organization.invite.rolePlaceholder': 'Select a role',\n 'organization.invite.sendInvites': 'Send Invites',\n 'organization.invite.sending': 'Sending...',\n 'organization.invite.sent': 'Invitations sent',\n 'organization.invite.sentDescription': 'Your team members will receive an email with instructions to join.',\n 'organization.invite.title': 'Invite Team Members',\n 'organization.onboarding.oneMoment': 'This will only take a moment...',\n 'organization.onboarding.preferences': 'Regional preferences',\n 'organization.onboarding.settingUp': 'Setting up your workspace',\n 'organization.onboarding.setupWorkspace': 'Set up your workspace',\n 'organization.onboarding.whatName': 'What should we call your workspace?',\n 'organization.orgNamePlaceholder': 'Organization name',\n 'organization.permissions.createCustom': 'Create Custom Profile',\n 'organization.permissions.createProfile': 'Create Profile',\n 'organization.permissions.description': 'Description',\n 'organization.permissions.descriptionPlaceholder': 'Optional description',\n 'organization.permissions.editProfile': 'Edit: {{name}}',\n 'organization.permissions.manageBilling': 'Manage Billing',\n 'organization.permissions.managePermissions': 'Manage Permissions',\n 'organization.permissions.manageSettings': 'Manage Settings',\n 'organization.permissions.manageTeam': 'Manage Team',\n 'organization.permissions.memberCount': '{{count}} member{{plural}}',\n 'organization.permissions.previewAs': 'Preview as',\n 'organization.permissions.previewingAs': 'Previewing as',\n 'organization.permissions.exitPreview': 'Exit Preview',\n 'organization.permissions.searchFeatures': 'Search features...',\n 'organization.permissions.profileName': 'Profile Name',\n 'organization.permissions.profileNamePlaceholder': 'e.g. Custom Role',\n 'organization.permissions.subtitle': 'Manage roles and their permissions.',\n 'organization.permissions.system': 'System',\n 'organization.permissions.systemPermissions': 'System Permissions',\n 'organization.permissions.title': 'Permission Profiles',\n 'organization.permissions.updateProfile': 'Update Profile',\n 'organization.team.invite': 'Invite',\n 'organization.team.joined': 'Joined',\n 'organization.team.member': 'Member',\n 'organization.team.memberCount': '{{count}} member{{plural}} in this organization.',\n 'organization.team.pendingInvites': 'Pending Invites',\n 'organization.team.removeMember': 'Remove member',\n 'organization.team.resend': 'Resend',\n 'organization.team.revoke': 'Revoke',\n 'organization.team.role': 'Role',\n 'organization.team.sent': 'Sent {{date}}',\n 'organization.team.title': 'Members',\n 'organization.team.you': '(you)',\n 'settings.branding.accentColor': 'Accent Color',\n 'settings.branding.chooseFile': 'Choose File',\n 'settings.branding.favicon': 'Favicon',\n 'settings.branding.faviconHint': 'Recommended: 32x32px, PNG or ICO',\n 'settings.branding.logo': 'Logo',\n 'settings.branding.logoHint': 'Recommended: 200x50px, PNG or SVG',\n 'settings.branding.preview': 'Preview',\n 'settings.branding.primaryColor': 'Primary Color',\n 'settings.branding.saveBranding': 'Save Branding',\n 'settings.branding.subtitle': 'Customize the look and feel of your workspace.',\n 'settings.branding.title': 'Branding',\n 'settings.company.currency': 'Currency',\n 'settings.company.currencyPlaceholder': 'Select currency',\n 'settings.company.locale': 'Locale',\n 'settings.company.localePlaceholder': 'Select locale',\n 'settings.company.name': 'Company Name',\n 'settings.company.subtitle': 'Update your organization details and regional preferences.',\n 'settings.company.timezone': 'Timezone',\n 'settings.company.timezonePlaceholder': 'Select timezone',\n 'settings.company.title': 'Company Information',\n 'settings.holidays.addHoliday': 'Add Holiday',\n 'settings.holidays.annual': 'Annual',\n 'settings.holidays.descriptionPlaceholder': 'Description (optional)',\n 'settings.holidays.empty': 'No holidays configured yet.',\n 'settings.holidays.namePlaceholder': 'Holiday name *',\n 'settings.holidays.newHoliday': 'New Holiday',\n 'settings.holidays.recurringAnnually': 'Recurring annually',\n 'settings.holidays.subtitle': 'Non-working days and recurring holidays.',\n 'settings.holidays.title': 'Holidays',\n // settings.fieldRules\n 'settings.fieldRules': 'Field Rules',\n 'settings.fieldRules.subtitle': 'Configure which fields are required or visible for each register type.',\n 'settings.fieldRules.required': 'Required',\n 'settings.fieldRules.inForm': 'Form',\n 'settings.fieldRules.inTable': 'Table',\n 'settings.fieldRules.inDetail': 'Detail',\n 'settings.fieldRules.field': 'Field',\n 'settings.fieldRules.resetDefaults': 'Reset to Defaults',\n 'settings.fieldRules.resetConfirm': 'Reset all field rules for {{entity}} to their defaults?',\n 'settings.fieldRules.saved': 'Field rules saved',\n 'settings.fieldRules.saveFailed': 'Failed to save field rules',\n 'settings.fieldRules.modified': '{{count}} modified',\n 'settings.fieldRules.searchPlaceholder': 'Search register types...',\n 'settings.fieldRules.noEntities': 'No register types available.',\n 'settings.fieldRules.coreRegisters': 'Register Types',\n 'settings.fieldRules.otherRegisters': 'Other',\n 'settings.fieldRules.showMore': '{{count}} more register types...',\n 'settings.fieldRules.showLess': 'Show less',\n 'settings.locations.addFirst': 'Add your first location',\n 'settings.locations.addLocation': 'Add Location',\n 'settings.locations.adding': 'Adding...',\n 'settings.locations.addressPlaceholder': 'Address',\n 'settings.locations.cityPlaceholder': 'City',\n 'settings.locations.countDescription': '{{count}} location{{plural}} registered.',\n 'settings.locations.countryPlaceholder': 'Country',\n 'settings.locations.empty': 'No locations have been added to this organization yet.',\n 'settings.locations.headquarters': 'Headquarters',\n 'settings.locations.namePlaceholder': 'Location name *',\n 'settings.locations.newLocation': 'New Location',\n 'settings.locations.noLocations': 'No locations configured yet.',\n 'settings.locations.phonePlaceholder': 'Phone',\n 'settings.locations.statePlaceholder': 'State',\n 'settings.locations.title': 'Locations',\n 'settings.profile.email': 'Email',\n 'settings.profile.emailHelp': 'Email cannot be changed directly. Contact support for assistance.',\n 'settings.profile.fullName': 'Full Name',\n 'settings.profile.saveProfile': 'Save Profile',\n 'settings.profile.subtitle': 'Manage your personal information and account settings.',\n 'settings.profile.title': 'Profile',\n 'settings.security.inviteOnly': 'Invite-Only Access',\n 'settings.security.inviteOnlyDescription': 'New users can only join this organization via invite.',\n 'settings.security.linkSent': 'Link Sent',\n 'settings.security.orgSecuritySubtitle': 'Security policies applied to all members of this organization.',\n 'settings.security.orgSecurityTitle': 'Organization Security',\n 'settings.security.passwordSubtitle': 'Manage your account password. A reset link will be sent to your email.',\n 'settings.security.passwordTitle': 'Password',\n 'settings.security.require2FA': 'Require Two-Factor Authentication',\n 'settings.security.require2FADescription': 'All members must enable 2FA to access this organization.',\n 'settings.security.resetLinkDescription': 'Send a password reset link to your email address.',\n 'settings.security.resetLinkSent': 'Reset link sent \\u2014 check your inbox.',\n 'settings.security.resetPassword': 'Reset Password',\n 'settings.security.sessionTimeout': 'Session Timeout',\n 'settings.security.sessionTimeoutDescription': 'Automatically sign out inactive users after this period.',\n\n // ---------------------------------------------------------------------------\n // financial.quickActions / cash / invoice\n // ---------------------------------------------------------------------------\n 'financial.quickActions.newPayable': 'New Payable',\n 'financial.quickActions.newPayableDesc': 'Record an expense or bill to pay',\n 'financial.quickActions.newReceivable': 'New Receivable',\n 'financial.quickActions.newReceivableDesc': 'Record income or amount to receive',\n 'financial.quickActions.openCashRegister': 'Open Cash Register',\n 'financial.quickActions.openCashRegisterDesc': 'Start a new cash session',\n\n 'financial.cash.title': 'Cash Registers',\n 'financial.cash.subtitle': 'Open, count and close cash sessions',\n 'financial.cash.bills': 'Bills',\n 'financial.cash.coins': 'Coins',\n 'financial.cash.noAccounts': 'No cash register accounts found. Create a bank account with type \"Cash Register\" first.',\n 'financial.cash.confirmOpening': 'Confirm Cash Opening',\n 'financial.cash.register': 'Register',\n 'financial.cash.openingBalance': 'Opening Balance',\n 'financial.cash.method': 'Method',\n 'financial.cash.denominationCount': 'Denomination count',\n 'financial.cash.notes': 'Notes',\n 'financial.cash.opening': 'Opening...',\n 'financial.cash.confirmAndOpen': 'Confirm & Open',\n 'financial.cash.quickAmount': 'Quick Amount',\n 'financial.cash.countBillsCoins': 'Count Bills & Coins',\n 'financial.cash.count': 'Count',\n 'financial.cash.countedTotal': 'Counted Total',\n 'financial.cash.addNotes': 'Add notes',\n 'financial.cash.openingObservations': 'Opening observations...',\n 'financial.cash.openSession': 'Open Session',\n 'financial.cash.closingBalance': 'Closing Balance',\n 'financial.cash.differenceFromOpening': 'Difference from opening',\n 'financial.cash.closingNotes': 'Closing Notes',\n 'financial.cash.closingObservations': 'Closing observations...',\n 'financial.cash.closing': 'Closing...',\n 'financial.cash.closeSession': 'Close Session',\n 'financial.cash.openSessions': 'Open Sessions',\n 'financial.cash.opened': 'Opened',\n 'financial.cash.by': 'by',\n 'financial.cash.closeThisSession': 'Close this session',\n 'financial.cash.sessionHistory': 'Session History',\n 'financial.cash.noClosedSessions': 'No closed sessions yet',\n 'financial.cash.openLabel': 'Open',\n 'financial.cash.closeLabel': 'Close',\n 'financial.cash.diff': 'Diff',\n 'financial.cash.openAnother': 'Open another register',\n\n // ---------------------------------------------------------------------------\n // crm.quickActions / settings / onboarding\n // ---------------------------------------------------------------------------\n 'crm.quickActions.newLead': 'New Lead',\n 'crm.quickActions.newLeadDesc': 'Capture a new lead',\n 'crm.quickActions.newDeal': 'New Deal',\n 'crm.quickActions.newDealDesc': 'Create a deal from pipeline',\n 'crm.quickActions.newQuote': 'New Quote',\n 'crm.quickActions.newQuoteDesc': 'Send a proposal',\n 'crm.quickActions.logActivity': 'Log Activity',\n 'crm.quickActions.logActivityDesc': 'Record a call, email, or note',\n\n 'crm.settingsPage.title': 'Sales & CRM Settings',\n 'crm.settingsPage.subtitle': 'Configure pipeline, lead management, and registries',\n 'crm.settingsPage.pipeline': 'Pipeline',\n\n 'crm.onboarding.welcome': 'Welcome to Sales & CRM',\n 'crm.onboarding.description': 'Track leads, manage your sales pipeline, and close more deals.',\n 'crm.onboarding.sources.title': 'Lead Sources',\n 'crm.onboarding.sources.description': 'Default sources (Instagram, WhatsApp, Google, etc.) are ready. Customize them in Settings.',\n 'crm.onboarding.pipeline.title': 'Sales Pipeline',\n 'crm.onboarding.pipeline.description': 'Your default pipeline with 7 stages is set up. Customize stages and probabilities anytime.',\n 'crm.onboarding.startSelling': 'Start selling',\n 'crm.onboarding.getStarted': 'Get Started',\n 'crm.onboarding.next': 'Next',\n 'crm.onboarding.skip': 'Skip setup',\n\n 'crm.settings.leadManagement': 'Lead Management',\n 'crm.settings.leadManagementDesc': 'How leads are captured and handled',\n 'crm.settings.autoAssign': 'Auto-assign leads',\n 'crm.settings.autoAssignDesc': 'Automatically assign new leads to available team members',\n 'crm.settings.requireSource': 'Require lead source',\n 'crm.settings.requireSourceDesc': 'Make source selection mandatory when capturing leads',\n 'crm.settings.leadScoring': 'Lead scoring',\n 'crm.settings.leadScoringDesc': 'Automatically score leads based on engagement signals',\n 'crm.settings.duplicateDetection': 'Duplicate detection',\n 'crm.settings.duplicateDetectionDesc': 'Warn when a lead with the same email or phone already exists',\n 'crm.settings.deals': 'Deals',\n 'crm.settings.dealsDesc': 'Deal pipeline behavior',\n 'crm.settings.autoCreateDeal': 'Auto-create deal on conversion',\n 'crm.settings.autoCreateDealDesc': 'Create a deal automatically when a lead is qualified',\n 'crm.settings.requireCloseDate': 'Require expected close date',\n 'crm.settings.requireCloseDateDesc': 'Make expected close date mandatory on deals',\n 'crm.settings.rottingDeals': 'Rotting deals warning',\n 'crm.settings.rottingDealsDesc': \"Highlight deals that haven't been updated in X days\",\n 'crm.settings.weightedPipeline': 'Weighted pipeline value',\n 'crm.settings.weightedPipelineDesc': 'Calculate pipeline value using stage probability',\n 'crm.settings.quotes': 'Quotes',\n 'crm.settings.quotesDesc': 'Quote and proposal behavior',\n 'crm.settings.autoNumberQuotes': 'Auto-number quotes',\n 'crm.settings.autoNumberQuotesDesc': 'Automatically generate sequential quote numbers',\n 'crm.settings.defaultValidity': 'Default validity (30 days)',\n 'crm.settings.defaultValidityDesc': 'New quotes expire after 30 days by default',\n 'crm.settings.requireApproval': 'Require approval',\n 'crm.settings.requireApprovalDesc': 'Quotes need manager approval before sending',\n 'crm.settings.notifications': 'Notifications',\n 'crm.settings.notificationsDesc': 'Alerts and reminders',\n 'crm.settings.overdueAlerts': 'Overdue activity alerts',\n 'crm.settings.overdueAlertsDesc': 'Notify when activities pass their due date',\n 'crm.settings.stageChangeAlerts': 'Deal stage change alerts',\n 'crm.settings.stageChangeAlertsDesc': 'Notify when deals move to a new stage',\n 'crm.settings.newLeadNotif': 'New lead notification',\n 'crm.settings.newLeadNotifDesc': 'Alert team when a new lead is captured',\n\n 'crm.pipelineSettings.title': 'Pipeline Stages',\n 'crm.pipelineSettings.description': 'Define stages that deals move through. Drag to reorder.',\n 'crm.pipelineSettings.probability': 'Probability',\n 'crm.pipelineSettings.winStage': 'Win stage',\n 'crm.pipelineSettings.lossStage': 'Loss stage',\n 'crm.pipelineSettings.customizationNote': 'Pipeline stage customization (add, remove, reorder, edit colors and probabilities) will be available when connected to the database.',\n\n // ---------------------------------------------------------------------------\n // inventory.quickActions / settings\n // ---------------------------------------------------------------------------\n 'inventory.quickActions.newProduct': 'New Product',\n 'inventory.quickActions.newProductDesc': 'Add a product to your catalog',\n 'inventory.quickActions.stockEntry': 'Stock Entry',\n 'inventory.quickActions.stockEntryDesc': 'Record goods received',\n 'inventory.quickActions.stockExit': 'Stock Exit',\n 'inventory.quickActions.stockExitDesc': 'Record goods used or sold',\n\n 'inventory.settingsPage.title': 'Inventory Settings',\n 'inventory.settingsPage.subtitle': 'Manage units, categories, and stock locations',\n\n 'inventory.settings.stockManagement': 'Stock Management',\n 'inventory.settings.stockManagementDesc': 'How stock levels are tracked',\n 'inventory.settings.lowStockAlerts': 'Low stock alerts',\n 'inventory.settings.lowStockAlertsDesc': 'Show warnings when products fall below minimum quantity',\n 'inventory.settings.requireReason': 'Require reason for adjustments',\n 'inventory.settings.requireReasonDesc': 'Make reason mandatory for stock adjustments and losses',\n 'inventory.settings.autoDeduct': 'Auto-deduct on service',\n 'inventory.settings.autoDeductDesc': 'Automatically deduct products when a service is executed',\n 'inventory.settings.products': 'Products',\n 'inventory.settings.productsDesc': 'Product catalog behavior',\n 'inventory.settings.requireSku': 'Require SKU',\n 'inventory.settings.requireSkuDesc': 'Make SKU mandatory when creating products',\n 'inventory.settings.allowNegative': 'Allow negative stock',\n 'inventory.settings.allowNegativeDesc': 'Allow stock quantities to go below zero',\n 'inventory.settings.notifications': 'Notifications',\n 'inventory.settings.notificationsDesc': 'Alerts and reminders',\n 'inventory.settings.lowStockEmail': 'Low stock email alerts',\n 'inventory.settings.lowStockEmailDesc': 'Send email when products reach minimum quantity',\n 'inventory.settings.expiryWarnings': 'Expiry date warnings',\n 'inventory.settings.expiryWarningsDesc': 'Alert before products expire (batch tracking)',\n\n // ---------------------------------------------------------------------------\n // inventory.productForm\n // ---------------------------------------------------------------------------\n 'inventory.productForm.newProduct': 'New Product',\n 'inventory.productForm.editProduct': 'Edit Product',\n 'inventory.productForm.updateDetails': 'Update product details',\n 'inventory.productForm.addToCatalog': 'Add a product to your catalog',\n 'inventory.productForm.cancel': 'Cancel',\n 'inventory.productForm.save': 'Save',\n 'inventory.productForm.saving': 'Saving...',\n 'inventory.productForm.generalInfo': 'General Information',\n 'inventory.productForm.name': 'Name',\n 'inventory.productForm.namePlaceholder': 'Product name',\n 'inventory.productForm.brand': 'Brand',\n 'inventory.productForm.brandPlaceholder': 'Brand name',\n 'inventory.productForm.sku': 'SKU',\n 'inventory.productForm.skuPlaceholder': 'Internal code',\n 'inventory.productForm.barcode': 'Barcode',\n 'inventory.productForm.barcodePlaceholder': 'EAN / UPC',\n 'inventory.productForm.description': 'Description',\n 'inventory.productForm.descriptionPlaceholder': 'Additional information about the product',\n 'inventory.productForm.classification': 'Classification',\n 'inventory.productForm.classificationDesc': 'How this product is used in your business',\n 'inventory.productForm.typeIngredient': 'Raw material used in production or services',\n 'inventory.productForm.typeSale': 'Sold directly to customers',\n 'inventory.productForm.typeIntermediate': 'Produced internally from other items',\n 'inventory.productForm.typeAsset': 'Fixed asset for patrimony tracking',\n 'inventory.productForm.pricing': 'Pricing',\n 'inventory.productForm.costPrice': 'Cost Price',\n 'inventory.productForm.salePrice': 'Sale Price',\n 'inventory.productForm.margin': 'Margin',\n 'inventory.productForm.stockLevels': 'Stock Levels',\n 'inventory.productForm.stockLevelsDesc': 'Minimum and maximum thresholds for alerts',\n 'inventory.productForm.minQuantity': 'Minimum Quantity',\n 'inventory.productForm.minQuantityHint': 'Alert when stock falls below this',\n 'inventory.productForm.maxQuantity': 'Maximum Quantity',\n 'inventory.productForm.maxQuantityHint': 'Max capacity for this product',\n 'inventory.productForm.optional': 'Optional',\n\n // ---------------------------------------------------------------------------\n // inventory.productList\n // ---------------------------------------------------------------------------\n 'inventory.productList.title': 'Products',\n 'inventory.productList.subtitle': '{{count}} products',\n 'inventory.productList.product': 'Product',\n 'inventory.productList.type': 'Type',\n 'inventory.productList.stock': 'Stock',\n 'inventory.productList.cost': 'Cost',\n 'inventory.productList.value': 'Value',\n 'inventory.productList.searchPlaceholder': 'Search products...',\n 'inventory.productList.newProduct': 'New Product',\n 'inventory.productList.empty': 'No products yet',\n 'inventory.productList.createFirst': 'Create your first product',\n\n // ---------------------------------------------------------------------------\n // inventory.stock (additional keys)\n // ---------------------------------------------------------------------------\n 'inventory.stock.unknownProduct': 'Unknown Product',\n 'inventory.stock.reasonLossPlaceholder': 'e.g. Expired, damaged',\n 'inventory.stock.reasonAdjustPlaceholder': 'e.g. Physical count correction',\n 'inventory.stock.documentPlaceholder': 'Invoice, receipt, PO...',\n 'inventory.stock.batchPlaceholder': 'e.g. LOT001',\n 'inventory.stock.notesPlaceholder': 'Additional notes...',\n\n // ---------------------------------------------------------------------------\n // inventory.recipeDetail (additional keys)\n // ---------------------------------------------------------------------------\n 'inventory.recipeDetail.loading': 'Loading...',\n 'inventory.recipeDetail.ingredient': 'Ingredient',\n 'inventory.recipeDetail.quantity': 'Quantity',\n 'inventory.recipeDetail.unit': 'Unit',\n 'inventory.recipeDetail.notes': 'Notes',\n 'inventory.recipeDetail.created': 'Created',\n 'inventory.recipeDetail.updated': 'Updated',\n\n // ---------------------------------------------------------------------------\n // inventory.recipeForm\n // ---------------------------------------------------------------------------\n 'inventory.recipeForm.newRecipe': 'New Recipe',\n 'inventory.recipeForm.subtitle': 'Define a production formula',\n 'inventory.recipeForm.cancel': 'Cancel',\n 'inventory.recipeForm.saveRecipe': 'Save Recipe',\n 'inventory.recipeForm.saving': 'Saving...',\n 'inventory.recipeForm.recipeDetails': 'Recipe Details',\n 'inventory.recipeForm.recipeName': 'Recipe Name',\n 'inventory.recipeForm.recipeNamePlaceholder': 'e.g. Tomato Sauce',\n 'inventory.recipeForm.description': 'Description',\n 'inventory.recipeForm.descriptionPlaceholder': 'Brief description...',\n 'inventory.recipeForm.produces': 'Produces (Product)',\n 'inventory.recipeForm.searchProduct': 'Search product...',\n 'inventory.recipeForm.createProduct': 'Create product',\n 'inventory.recipeForm.yieldQuantity': 'Yield Quantity',\n 'inventory.recipeForm.prepTime': 'Prep Time (min)',\n 'inventory.recipeForm.instructions': 'Instructions',\n 'inventory.recipeForm.instructionsPlaceholder': 'Step-by-step preparation instructions...',\n 'inventory.recipeForm.ingredients': 'Ingredients',\n 'inventory.recipeForm.addIngredient': 'Add Ingredient',\n 'inventory.recipeForm.noIngredients': 'No ingredients added',\n 'inventory.recipeForm.addFirstIngredient': 'Add your first ingredient',\n 'inventory.recipeForm.ingredient': 'Ingredient',\n 'inventory.recipeForm.quantity': 'Quantity',\n 'inventory.recipeForm.notes': 'Notes',\n 'inventory.recipeForm.searchIngredient': 'Search ingredient...',\n 'inventory.recipeForm.createIngredient': 'Create ingredient',\n 'inventory.recipeForm.notesPlaceholder': 'e.g. diced, fresh',\n 'inventory.recipeForm.ingredientsConfigured': '{{configured}} of {{total}} ingredients configured',\n\n // ---------------------------------------------------------------------------\n // settings.plugin.*\n // ---------------------------------------------------------------------------\n 'settings.plugin.agenda': 'Agenda',\n 'settings.plugin.financial': 'Financial',\n 'settings.plugin.inventory': 'Inventory',\n 'settings.plugin.crm': 'Sales & CRM',\n\n // ---------------------------------------------------------------------------\n // financial.invoice status labels\n // ---------------------------------------------------------------------------\n 'financial.invoice.statusOpen': 'Open',\n 'financial.invoice.statusPartial': 'Partial',\n 'financial.invoice.statusPaid': 'Paid',\n 'financial.invoice.statusOverdue': 'Overdue',\n 'financial.invoice.statusCancelled': 'Cancelled',\n 'financial.invoice.statusPending': 'Pending',\n 'financial.invoice.statusDraft': 'Draft',\n\n // ---------------------------------------------------------------------------\n // financial.invoice column / detail labels\n // ---------------------------------------------------------------------------\n 'financial.invoice.columnDate': 'Date',\n 'financial.invoice.columnDescription': 'Description',\n 'financial.invoice.columnAmount': 'Amount',\n 'financial.invoice.columnPaid': 'Paid',\n 'financial.invoice.columnStatus': 'Status',\n 'financial.invoice.columnInst': 'Inst.',\n 'financial.invoice.columnQty': 'Qty',\n 'financial.invoice.columnUnitPrice': 'Unit Price',\n 'financial.invoice.columnTotal': 'Total',\n 'financial.invoice.columnNumber': '#',\n 'financial.invoice.invoice': 'Invoice',\n 'financial.invoice.loading': 'Loading...',\n\n // ---------------------------------------------------------------------------\n // financial.invoiceForm extra labels\n // ---------------------------------------------------------------------------\n 'financial.invoiceForm.cancelInvoice': 'Cancel Invoice',\n 'financial.invoiceForm.cancelConfirm': 'This action cannot be undone.',\n 'financial.invoiceForm.cancelDesc': 'The invoice will be marked as cancelled. All pending installments will also be cancelled.',\n 'financial.invoiceForm.keepInvoice': 'Keep Invoice',\n 'financial.invoiceForm.yesCancel': 'Yes, Cancel',\n 'financial.invoiceForm.cancelling': 'Cancelling...',\n 'financial.invoiceForm.removeAdjustments': 'Remove adjustments',\n 'financial.invoiceForm.discount': 'Discount',\n 'financial.invoiceForm.surcharge': 'Surcharge',\n 'financial.invoiceForm.total': 'Total:',\n 'financial.invoiceForm.itemCount': '{{count}} item{{plural}}',\n\n // ---------------------------------------------------------------------------\n // financial.payment extra labels\n // ---------------------------------------------------------------------------\n 'financial.payment.account': 'Account',\n 'financial.payment.due': 'Due:',\n 'financial.payment.paidAmount': 'Paid:',\n 'financial.payment.paidOn': 'Paid on:',\n\n // ---------------------------------------------------------------------------\n // crud.archetype — detail tab strings\n // ---------------------------------------------------------------------------\n 'crud.archetype.comingSoon': 'Coming Soon',\n\n // Person tabs\n 'crud.archetype.access.title': 'Access & Permissions',\n 'crud.archetype.access.description': 'Manage login credentials, assign permission roles, and control what this person can access in the system.',\n 'crud.access.accountStatus': 'Account Status',\n 'crud.access.statusLinked': 'Active',\n 'crud.access.statusPending': 'Invite pending',\n 'crud.access.statusAccepted': 'Accepted',\n 'crud.access.statusExpired': 'Invite expired',\n 'crud.access.statusRevoked': 'Revoked',\n 'crud.access.acceptedAt': 'Accepted {{date}}',\n 'crud.access.revokedDesc': 'Access was revoked. You can send a new invite.',\n 'crud.access.grantAccess': 'Grant Access',\n 'crud.access.account': 'Account',\n 'crud.access.accountDesc': 'Login credentials and account status for this person.',\n 'crud.access.resetPassword': 'Reset Password',\n 'crud.access.passwordResetSent': 'Password reset email sent.',\n 'crud.access.profileUpdated': 'Permission profile updated.',\n 'crud.access.inviteResent': 'Invite resent.',\n 'crud.access.inviteRevoked': 'Invite revoked.',\n 'crud.access.accessRemoved': 'Access removed.',\n 'crud.access.dangerZone': 'Danger Zone',\n 'crud.access.dangerZoneDesc': 'Irreversible actions that affect this person\\'s access to the system.',\n 'crud.access.removeAccess': 'Remove Access',\n 'crud.access.revokeInvite': 'Revoke Invite',\n 'crud.access.confirmRemoveTitle': 'Are you sure?',\n 'crud.access.confirmRemoveDesc': 'This person will lose all system access immediately. This action cannot be undone.',\n 'crud.access.accountLinked': 'Account linked',\n 'crud.access.noAccount': 'No account linked',\n 'crud.access.noAccountDesc': 'This person does not have a login account and cannot access the system.',\n 'crud.access.setupDesc': 'Set up system access for this person by entering their email and choosing a permission profile.',\n 'crud.access.emailPlaceholder': 'person@example.com',\n 'crud.access.sendInvite': 'Send Invite',\n 'crud.access.invitePending': 'Invite pending',\n 'crud.access.inviteSent': 'Invite sent {{date}}',\n 'crud.access.permissionProfile': 'Permission Profile',\n 'crud.access.profileDesc': 'Define what this person can access and do in the system.',\n 'crud.access.systemAccess': 'System Access',\n 'crud.access.effectivePermissions': 'Effective Permissions',\n 'crud.access.effectiveDesc': 'What this person can do based on their assigned profile.',\n 'crud.access.feature': 'Feature',\n 'crud.access.joined': 'Joined {{date}}',\n 'crud.access.noEmail': 'No email address',\n 'crud.access.noEmailDesc': 'Add an email address to this person to link them to a system account.',\n 'crud.access.manageTeam': 'Manage Team',\n 'crud.access.manageBilling': 'Manage Billing',\n 'crud.access.manageSettings': 'Manage Settings',\n 'crud.access.managePermissions': 'Manage Permissions',\n 'crud.archetype.activity.title': 'Activity Timeline',\n 'crud.archetype.activity.description': 'View a chronological log of all actions, changes, and events related to this person.',\n 'crud.archetype.documents.title': 'Documents',\n 'crud.archetype.documents.description': 'Attach and manage files, contracts, certifications, and other documents for this person.',\n 'crud.archetype.schedule.title': 'Schedule',\n 'crud.archetype.schedule.description': 'View and manage appointments, shifts, and availability for this person.',\n\n // Product tabs\n 'crud.archetype.inventory.title': 'Inventory & Stock',\n 'crud.archetype.inventory.description': 'Track stock levels, view movement history, set reorder alerts, and manage inventory across locations.',\n 'crud.archetype.suppliers.title': 'Suppliers',\n 'crud.archetype.suppliers.description': 'View and manage which suppliers provide this product, compare costs, and track purchase orders.',\n 'crud.archetype.pricing.title': 'Pricing History',\n 'crud.archetype.pricing.description': 'View price changes over time, manage promotional pricing, and set location-specific prices.',\n 'crud.archetype.productActivity.title': 'Activity',\n 'crud.archetype.productActivity.description': 'View a log of all changes, stock adjustments, and events related to this product.',\n\n // Service tabs\n 'crud.archetype.availability.title': 'Availability',\n 'crud.archetype.availability.description': 'Configure when this service can be booked, set duration rules, and manage capacity limits.',\n 'crud.archetype.servicePricing.title': 'Pricing Tiers',\n 'crud.archetype.servicePricing.description': 'Manage pricing tiers, member discounts, and location-specific pricing for this service.',\n 'crud.archetype.serviceActivity.title': 'Activity',\n 'crud.archetype.serviceActivity.description': 'View a log of all bookings, changes, and events related to this service.',\n\n // Location tabs\n 'crud.archetype.members.title': 'Team Members',\n 'crud.archetype.members.description': 'View and manage staff assigned to this location, their roles and schedules.',\n 'crud.archetype.locationSchedule.title': 'Operating Hours',\n 'crud.archetype.locationSchedule.description': 'Set business hours, holidays, and special schedules for this location.',\n 'crud.archetype.locationStats.title': 'Statistics',\n 'crud.archetype.locationStats.description': 'View performance metrics, revenue, and activity for this location.',\n 'crud.archetype.locationActivity.title': 'Activity',\n 'crud.archetype.locationActivity.description': 'View a log of all events, changes, and operations at this location.',\n\n // Subject tabs\n 'crud.archetype.owner.noOwner': 'No owner assigned',\n 'crud.archetype.owner.assignHint': 'Edit this record to assign an owner.',\n 'crud.archetype.owner.name': 'Name',\n 'crud.archetype.owner.phone': 'Phone',\n 'crud.archetype.owner.email': 'Email',\n 'crud.archetype.owner.document': 'Document',\n 'crud.archetype.owner.address': 'Address',\n 'crud.archetype.owner.active': 'Active',\n 'crud.archetype.owner.inactive': 'Inactive',\n 'crud.archetype.history.title': 'History',\n 'crud.archetype.history.description': 'View visit history, past reports, treatments, and timeline of events.',\n 'crud.archetype.subjectDocuments.title': 'Documents',\n 'crud.archetype.subjectDocuments.description': 'Attach and manage files, lab results, images, and certificates.',\n\n // ---------------------------------------------------------------------------\n // schedule.days.*\n // ---------------------------------------------------------------------------\n 'schedule.days.sun': 'Sun',\n 'schedule.days.mon': 'Mon',\n 'schedule.days.tue': 'Tue',\n 'schedule.days.wed': 'Wed',\n 'schedule.days.thu': 'Thu',\n 'schedule.days.fri': 'Fri',\n 'schedule.days.sat': 'Sat',\n\n // ---------------------------------------------------------------------------\n // schedule.editor.*\n // ---------------------------------------------------------------------------\n 'schedule.editor.weeklyTitle': 'Weekly Working Hours',\n 'schedule.editor.weeklyDescription': 'Set when this professional is regularly available',\n 'schedule.editor.unavailable': 'Unavailable',\n 'schedule.editor.newInterval': 'New interval for {{day}}',\n 'schedule.editor.addHoursFor': 'Add hours for {{day}}',\n 'schedule.editor.removeInterval': 'Remove interval',\n 'schedule.editor.copyToAll': 'Copy to all days',\n 'schedule.editor.bufferTooltip': 'Buffer time between appointments',\n 'schedule.editor.min': 'min',\n 'schedule.editor.exceptionsTitle': 'Date Exceptions',\n 'schedule.editor.exceptionsDescription': 'Override working hours for specific dates',\n 'schedule.editor.addException': 'Add Exception',\n 'schedule.editor.noExceptions': 'No date exceptions configured',\n 'schedule.editor.startDate': 'Start date',\n 'schedule.editor.endDate': 'End date',\n 'schedule.editor.type': 'Type',\n 'schedule.editor.customHours': 'Custom hours',\n 'schedule.editor.workingHours': 'Working hours',\n 'schedule.editor.to': 'to',\n 'schedule.editor.addTimeBlock': 'Add time block',\n 'schedule.editor.notes': 'Notes',\n 'schedule.editor.notesPlaceholder': 'e.g. Vacation, Holiday, Training...',\n 'schedule.editor.saveException': 'Save Exception',\n 'schedule.editor.removeException': 'Remove exception',\n 'schedule.editor.failedToLoad': 'Failed to load schedule',\n 'schedule.editor.saved': 'Working hours saved',\n 'schedule.editor.failedToSave': 'Failed to save',\n 'schedule.editor.selectStartDate': 'Please select a start date',\n 'schedule.editor.endDateAfterStart': 'End date must be after start date',\n 'schedule.editor.exceptionAdded': 'Exception added',\n 'schedule.editor.failedToSaveException': 'Failed to save exception',\n 'schedule.editor.exceptionRemoved': 'Exception removed',\n 'schedule.editor.failedToDelete': 'Failed to delete',\n\n // ---------------------------------------------------------------------------\n // schedule.blockSettings.*\n // ---------------------------------------------------------------------------\n 'schedule.blockSettings.title': 'Block Settings',\n 'schedule.blockSettings.location': 'Location',\n 'schedule.blockSettings.noLocation': 'No location',\n 'schedule.blockSettings.maxConcurrent': 'Max concurrent',\n 'schedule.blockSettings.minAdvance': 'Min advance',\n 'schedule.blockSettings.maxAdvance': 'Max advance',\n 'schedule.blockSettings.hrs': 'hrs',\n 'schedule.blockSettings.days': 'days',\n 'schedule.blockSettings.label': 'Label',\n 'schedule.blockSettings.labelPlaceholder': 'e.g. Morning - Cuts only',\n 'schedule.blockSettings.allowedServices': 'Allowed services',\n 'schedule.blockSettings.allServices': 'All services',\n 'schedule.blockSettings.oneService': '1 service',\n 'schedule.blockSettings.nServices': '{{count}} services',\n\n // registry — inventory\n 'registry.suppliers': 'Supplier',\n 'registry.suppliers.description': 'Manage your product and material suppliers',\n 'registry.product-categories': 'Product Category',\n 'registry.product-categories.description': 'Product categories for organization',\n 'registry.stock-locations': 'Stock Location',\n 'registry.stock-locations.description': 'Physical storage locations for inventory',\n 'registry.measurement-units': 'Measurement Unit',\n 'registry.measurement-units.description': 'Standard units of measure',\n\n // registry — financial\n 'registry.payment-methods': 'Payment Method',\n 'registry.chart-of-accounts': 'Chart of Accounts',\n 'registry.cost-centers': 'Cost Center',\n 'registry.bank-accounts': 'Bank Account',\n 'registry.commission-rules': 'Commission Rule',\n 'registry.price-tables': 'Price Table',\n 'registry.price-variations': 'Price Variation',\n 'registry.payment-method-types': 'Payment Type',\n 'registry.card-brands': 'Card Brand',\n\n // registry — crm\n 'registry.lead-sources': 'Lead Source',\n 'registry.tags': 'Tag',\n 'registry.activity-types': 'Activity Type',\n\n // ---------------------------------------------------------------------------\n // org.connectionError.*\n // ---------------------------------------------------------------------------\n 'org.connectionError.title': 'Connection failed',\n 'org.connectionError.description': 'Unable to connect to the server. Please check your internet connection and try again.',\n 'org.connectionError.retry': 'Try again',\n\n // ---------------------------------------------------------------------------\n // app.mockMode.*\n // ---------------------------------------------------------------------------\n 'app.mockMode.banner': 'You are in offline mode. Data shown may not be up to date.',\n}\n\n// ---------------------------------------------------------------------------\n// Built-in locale packs\n// ---------------------------------------------------------------------------\n\nexport const builtInLocales: Record<string, Record<string, string>> = {\n 'pt-BR': {\n // common\n 'common.save': 'Salvar',\n 'common.saveChanges': 'Salvar Alterações',\n 'common.saving': 'Salvando...',\n 'common.cancel': 'Cancelar',\n 'common.delete': 'Excluir',\n 'common.edit': 'Editar',\n 'common.close': 'Fechar',\n 'common.confirm': 'Confirmar',\n 'common.back': 'Voltar',\n 'common.add': 'Adicionar',\n 'common.loading': 'Carregando...',\n 'common.error': 'Algo deu errado',\n 'common.noResults': 'Nenhum resultado encontrado.',\n 'common.search': 'Buscar',\n 'common.actions': 'Ações',\n 'common.continue': 'Continuar',\n 'common.done': 'Pronto',\n 'common.yes': 'Sim',\n 'common.no': 'Não',\n 'common.active': 'Ativo',\n 'common.inactive': 'Inativo',\n 'common.overview': 'Visão Geral',\n 'common.notFound': 'Não Encontrado',\n 'common.untitled': 'Sem título',\n 'common.noContentYet': 'Nenhum conteúdo ainda',\n 'common.selectDate': 'Selecionar data',\n 'common.plugins': 'Plugins',\n\n // auth.login\n 'auth.login.title': 'Entrar',\n 'auth.login.titleCentered': 'Bem-vindo de Volta',\n 'auth.login.subtitle': 'Insira suas credenciais para acessar sua conta',\n 'auth.login.emailLabel': 'E-mail',\n 'auth.login.emailPlaceholder': 'voce@exemplo.com',\n 'auth.login.passwordLabel': 'Senha',\n 'auth.login.passwordPlaceholder': 'Digite sua senha',\n 'auth.login.forgotPassword': 'Esqueceu a senha?',\n 'auth.login.submit': 'Entrar',\n 'auth.login.submitting': 'Entrando...',\n 'auth.login.error': 'Falha ao entrar. Tente novamente.',\n 'auth.login.oauthDivider': 'ou continue com',\n 'auth.login.noAccount': 'Não tem uma conta?',\n 'auth.login.noAccountCentered': 'Ainda não tem uma conta?',\n 'auth.login.signUpLink': 'Cadastre-se',\n 'auth.login.socialProof': 'Junte-se a milhares de empresas que já usam {{appName}}',\n\n // auth.signup\n 'auth.signup.title': 'Criar conta',\n 'auth.signup.titleCentered': 'Criar Conta',\n 'auth.signup.subtitle': 'Comece com sua nova conta',\n 'auth.signup.nameLabel': 'Nome completo',\n 'auth.signup.namePlaceholder': 'João Silva',\n 'auth.signup.emailLabel': 'E-mail',\n 'auth.signup.emailPlaceholder': 'voce@exemplo.com',\n 'auth.signup.passwordLabel': 'Senha',\n 'auth.signup.passwordPlaceholder': 'Pelo menos 8 caracteres',\n 'auth.signup.confirmPasswordLabel': 'Confirmar senha',\n 'auth.signup.confirmPasswordPlaceholder': 'Repita sua senha',\n 'auth.signup.termsPrefix': 'Ao criar uma conta, você concorda com nossos',\n 'auth.signup.termsOfService': 'Termos de Serviço',\n 'auth.signup.privacyPolicy': 'Política de Privacidade',\n 'auth.signup.submit': 'Criar conta',\n 'auth.signup.submitting': 'Criando conta...',\n 'auth.signup.error': 'Falha ao criar conta. Tente novamente.',\n 'auth.signup.passwordMismatch': 'As senhas não conferem.',\n 'auth.signup.passwordTooShort': 'A senha deve ter pelo menos 8 caracteres.',\n 'auth.signup.success': 'Conta criada para {{email}}. Verifique sua caixa de entrada para confirmar seu e-mail.',\n 'auth.signup.hasAccount': 'Já tem uma conta?',\n 'auth.signup.signInLink': 'Entrar',\n\n // auth.recovery\n 'auth.recovery.title': 'Redefinir senha',\n 'auth.recovery.titleCentered': 'Redefinir Senha',\n 'auth.recovery.instruction': 'Insira seu e-mail e enviaremos um link para redefinir sua senha.',\n 'auth.recovery.subtitle': 'Enviaremos um link de redefinição',\n 'auth.recovery.emailLabel': 'E-mail',\n 'auth.recovery.emailPlaceholder': 'voce@exemplo.com',\n 'auth.recovery.submit': 'Enviar link',\n 'auth.recovery.submitting': 'Enviando...',\n 'auth.recovery.error': 'Falha ao enviar e-mail. Tente novamente.',\n 'auth.recovery.successHeading': 'Verifique seu e-mail',\n 'auth.recovery.successMessage': 'Enviamos um link de redefinição para {{email}}. Verifique sua caixa de entrada e siga as instruções.',\n 'auth.recovery.backToLogin': 'Voltar ao login',\n\n // auth.oauth\n 'auth.oauth.continueWith': 'Continuar com {{provider}}',\n\n // auth legacy\n 'auth.signIn': 'Entrar',\n 'auth.signUp': 'Cadastrar',\n 'auth.signOut': 'Sair',\n 'auth.email': 'E-mail',\n 'auth.password': 'Senha',\n 'auth.forgotPassword': 'Esqueceu a Senha?',\n\n // crud.list\n 'crud.list.empty': 'Nenhum(a) {{entities}} ainda',\n 'crud.list.addFirst': 'Adicione seu(sua) primeiro(a) {{entity}}',\n 'crud.list.totalCount': '{{count}} {{entities}} no total',\n 'crud.list.searchPlaceholder': 'Buscar {{entities}}...',\n 'crud.list.addButton': '+ Adicionar {{entity}}',\n\n // crud.detail\n 'crud.detail.notFound': '{{entity}} não encontrado(a).',\n 'crud.detail.backTo': 'Voltar para {{entities}}',\n\n // crud.form\n 'crud.form.addTitle': 'Adicionar {{entity}}',\n 'crud.form.editTitle': 'Editar {{entity}}',\n 'crud.form.createSubtitle': 'Criar um(a) novo(a) {{entity}}.',\n 'crud.form.editSubtitle': 'Atualizar detalhes de {{entity}}.',\n 'crud.form.newBreadcrumb': 'Novo(a) {{entity}}',\n 'crud.form.selectPlaceholder': 'Selecione {{label}}...',\n 'crud.form.saveError': 'Falha ao salvar {{entity}}',\n 'crud.form.saving': 'Salvando...',\n\n // crud.delete\n 'crud.delete.title': 'Excluir {{entity}}?',\n 'crud.delete.confirmNamed': 'Tem certeza que deseja excluir \"{{displayValue}}\"? Esta ação não pode ser desfeita.',\n 'crud.delete.confirmGeneric': 'Tem certeza que deseja excluir este(a) {{entity}}? Esta ação não pode ser desfeita.',\n 'crud.delete.cancel': 'Cancelar',\n 'crud.delete.delete': 'Excluir',\n\n // crud.tabs\n 'crud.tabs.access': 'Acesso',\n 'crud.tabs.schedule': 'Agenda',\n 'crud.tabs.documents': 'Documentos',\n 'crud.tabs.activity': 'Atividade',\n 'crud.tabs.inventory': 'Estoque',\n 'crud.tabs.suppliers': 'Fornecedores',\n 'crud.tabs.pricing': 'Preços',\n 'crud.tabs.members': 'Equipe',\n 'crud.tabs.stats': 'Estatísticas',\n 'crud.tabs.availability': 'Disponibilidade',\n 'crud.tabs.orders': 'Pedidos',\n\n // crud.orders.*\n 'crud.orders.all': 'Todos',\n 'crud.orders.columnDate': 'Data',\n 'crud.orders.columnStage': 'Etapa',\n 'crud.orders.columnDescription': 'Descrição',\n 'crud.orders.columnAmount': 'Valor',\n 'crud.orders.searchPlaceholder': 'Buscar pedidos...',\n 'crud.orders.noDocuments': 'Nenhum pedido ainda',\n 'crud.orders.stage.draft': 'Rascunho',\n 'crud.orders.stage.quoted': 'Orçado',\n 'crud.orders.stage.booked': 'Agendado',\n 'crud.orders.stage.invoiced': 'Faturado',\n 'crud.orders.stage.paid': 'Pago',\n 'crud.orders.stage.partial': 'Parcial',\n 'crud.orders.stage.overdue': 'Vencido',\n 'crud.orders.stage.cancelled': 'Cancelado',\n 'crud.orders.stage.no_show': 'Não Compareceu',\n 'crud.orders.stage.completed': 'Concluído',\n\n // layout.userMenu\n 'layout.userMenu.profile': 'Perfil',\n 'layout.userMenu.settings': 'Configurações',\n 'layout.userMenu.billing': 'Faturamento',\n 'layout.userMenu.help': 'Ajuda',\n 'layout.userMenu.lightMode': 'Modo claro',\n 'layout.userMenu.darkMode': 'Modo escuro',\n 'layout.userMenu.systemMode': 'Sistema',\n 'layout.userMenu.language': 'Idioma',\n 'layout.userMenu.selectLocation': 'Selecionar local',\n 'layout.switchingLocation': 'Trocando de local…',\n 'layout.userMenu.signOut': 'Sair',\n\n // layout.topbar\n 'layout.topbar.searchPlaceholder': 'Buscar...',\n\n // layout.sidebar\n 'layout.sidebar.collapse': 'Recolher barra lateral',\n 'layout.sidebar.expand': 'Expandir barra lateral',\n\n // layout.commandPalette\n 'layout.commandPalette.placeholder': 'Buscar páginas, pessoas, produtos, serviços...',\n 'layout.commandPalette.resultsCount': '{{count}} resultado{{plural}}',\n 'layout.commandPalette.noResults': 'Nenhum resultado encontrado.',\n 'layout.commandPalette.searching': 'Buscando\\u2026',\n\n // billing\n 'billing.title': 'Faturamento',\n 'billing.subtitle': 'Gerencie sua assinatura e faturamento.',\n 'billing.currentPlan': 'Plano Atual',\n 'billing.upgrade': 'Fazer Upgrade',\n 'billing.downgrade': 'Fazer Downgrade',\n 'billing.monthly': 'Mensal',\n 'billing.yearly': 'Anual',\n 'billing.yearlySave': 'Economize 20%',\n 'billing.free': 'Gratuito',\n 'billing.cancelSubscription': 'Cancelar Assinatura',\n 'billing.canceling': 'Cancelando...',\n 'billing.resumeSubscription': 'Retomar Assinatura',\n 'billing.resuming': 'Retomando...',\n 'billing.features': 'Recursos',\n 'billing.perMonth': '/mês',\n 'billing.perYear': '/ano',\n 'billing.getStarted': 'Começar',\n 'billing.processing': 'Processando...',\n 'billing.mostPopular': 'Mais Popular',\n 'billing.nextBilling': 'Próxima cobrança: {{date}}',\n 'billing.cancelsOn': 'Cancela em {{date}}',\n 'billing.trialEnds': 'Período de teste termina em {{date}}',\n 'billing.pastDueWarning': 'Seu pagamento está atrasado. Atualize seu método de pagamento para evitar interrupção do serviço.',\n 'billing.status.active': 'Ativo',\n 'billing.status.trialing': 'Período de Teste',\n 'billing.status.pastDue': 'Atrasado',\n 'billing.status.canceled': 'Cancelado',\n 'billing.status.paused': 'Pausado',\n\n // organization\n 'organization.invite': 'Convidar',\n 'organization.members': 'Membros',\n 'organization.memberCount': '{{count}} membro{{plural}} nesta organização.',\n 'organization.role': 'Função',\n 'organization.emailPlaceholder': 'equipe@exemplo.com',\n 'organization.sendInvites': 'Enviar Convites',\n 'organization.sending': 'Enviando...',\n 'organization.pending': 'Convites Pendentes',\n 'organization.remove': 'Remover membro',\n 'organization.resend': 'Reenviar',\n 'organization.revoke': 'Revogar',\n 'organization.inviteTitle': 'Convidar Membros da Equipe',\n 'organization.inviteDescription': 'Envie convites para entrar na sua organização.',\n 'organization.inviteSent': 'Convites enviados',\n 'organization.inviteSentDescription': 'Seus membros receberão um e-mail com instruções para entrar.',\n 'organization.emailAddresses': 'Endereços de e-mail',\n 'organization.addAnother': 'Adicionar outro',\n 'organization.selectRole': 'Selecione uma função',\n 'organization.you': '(você)',\n 'organization.joined': 'Entrou',\n 'organization.onboarding.title': 'Configure seu espaço de trabalho',\n 'organization.onboarding.namePrompt': 'Como devemos chamar seu espaço de trabalho?',\n 'organization.onboarding.preferencesPrompt': 'Preferências regionais',\n 'organization.onboarding.workspaceName': 'Nome do espaço de trabalho',\n 'organization.onboarding.workspaceNamePlaceholder': 'Minha Empresa',\n 'organization.onboarding.timezone': 'Fuso horário',\n 'organization.onboarding.currency': 'Moeda',\n 'organization.onboarding.creating': 'Configurando seu espaço de trabalho',\n 'organization.onboarding.creatingDescription': 'Isso levará apenas um momento...',\n 'organization.onboarding.createWorkspace': 'Criar Espaço de Trabalho',\n\n // settings\n 'settings.title': 'Configurações',\n 'settings.subtitle': 'Gerencie sua conta e preferências da organização.',\n 'settings.general': 'Geral',\n 'settings.profile': 'Perfil',\n 'settings.branding': 'Marca',\n 'settings.security': 'Segurança',\n 'settings.team': 'Equipe',\n 'settings.permissions': 'Permissões',\n 'settings.locations': 'Locais',\n 'settings.holidays': 'Feriados',\n 'settings.fieldRules': 'Regras de Campos',\n 'settings.notifications': 'Notificações',\n 'settings.save': 'Salvar Alterações',\n 'settings.saving': 'Salvando...',\n 'settings.companyInfo': 'Informações da Empresa',\n 'settings.companyInfoDescription': 'Atualize os dados da sua organização e preferências regionais.',\n 'settings.companyName': 'Nome da Empresa',\n 'settings.companyNamePlaceholder': 'Minha Empresa LTDA',\n 'settings.timezone': 'Fuso Horário',\n 'settings.timezonePlaceholder': 'Selecione o fuso horário',\n 'settings.currency': 'Moeda',\n 'settings.currencyPlaceholder': 'Selecione a moeda',\n 'settings.locale': 'Idioma',\n 'settings.localePlaceholder': 'Selecione o idioma',\n 'settings.uploadLogo': 'Enviar Logo',\n 'settings.uiLanguage': 'Idioma da Interface',\n 'settings.uiLanguageDescription': 'Escolha o idioma da interface. Aplica-se apenas à sua sessão.',\n\n // notifications\n 'notifications.title': 'Notificações',\n 'notifications.markAllRead': 'Marcar todas como lidas',\n 'notifications.empty': 'Sem notificações',\n 'notifications.whatsNew': 'Novidades',\n 'notifications.inbox': 'Caixa de Entrada',\n\n // app\n 'app.notFound.title': '404',\n 'app.notFound.heading': 'Página não encontrada',\n 'app.notFound.message': 'A página que você procura não existe ou foi movida.',\n 'app.notFound.goToDashboard': 'Ir para o Painel',\n 'app.accessDenied.heading': 'Acesso Negado',\n 'app.accessDenied.message': 'Você não tem permissão para acessar esta página.',\n\n // crud.form (additional)\n 'crud.form.requiredIndicator': '*',\n 'crud.form.createDescription': 'Criar um(a) novo(a) {{entity}}.',\n 'crud.form.editDescription': 'Atualizar detalhes de {{entity}}.',\n 'crud.form.failedToSave': 'Falha ao salvar {{entity}}',\n 'crud.form.saveChanges': 'Salvar Alterações',\n 'crud.form.select': 'Selecione {{field}}...',\n\n // crud.list (additional)\n 'crud.list.addEntity': '+ Adicionar {{entity}}',\n 'crud.list.search': 'Buscar {{entities}}...',\n\n // crud.import\n 'crud.import.action': 'Importar',\n 'crud.import.title': 'Importar {{entity}}',\n 'crud.import.step.download': 'Modelo',\n 'crud.import.step.upload': 'Upload',\n 'crud.import.step.mapping': 'Mapeamento',\n 'crud.import.step.importing': 'Importar',\n 'crud.import.downloadTitle': 'Baixe o modelo',\n 'crud.import.downloadDescription': 'Baixe um modelo CSV com todos os campos disponíveis para {{entity}}. Preencha e envie no próximo passo.',\n 'crud.import.downloadTemplate': 'Baixar modelo CSV',\n 'crud.import.downloadHint': '{{count}} campos disponíveis',\n 'crud.import.alreadyHaveFile': 'Já tenho um arquivo',\n 'crud.import.uploadTitle': 'Arraste seu arquivo CSV aqui ou clique para buscar',\n 'crud.import.uploadHint': 'Apenas arquivos .csv são aceitos',\n 'crud.import.invalidFile': 'Envie um arquivo .csv.',\n 'crud.import.emptyFile': 'O arquivo parece estar vazio.',\n 'crud.import.noRows': 'O arquivo tem cabeçalho mas nenhuma linha de dados.',\n 'crud.import.mappingTitle': 'Mapeie suas colunas',\n 'crud.import.mappingDescription': '{{file}} — {{columns}} colunas, {{rows}} linhas',\n 'crud.import.mappedCount': '{{count}} de {{total}} mapeados',\n 'crud.import.csvColumn': 'Coluna CSV',\n 'crud.import.mapsTo': 'Mapeia para',\n 'crud.import.preview': 'Prévia',\n 'crud.import.skip': '— Ignorar esta coluna',\n 'crud.import.startImport': 'Iniciar importação',\n 'crud.import.importing': 'Importando...',\n 'crud.import.importingHint': 'Processando {{count}} linhas',\n 'crud.import.progressCount': '{{processed}} de {{total}} linhas processadas',\n 'crud.import.doneSuccess': 'Importação concluída!',\n 'crud.import.doneWithErrors': 'Importação concluída com erros',\n 'crud.import.doneCount': '{{success}} de {{total}} linhas importadas com sucesso',\n 'crud.import.rowNumber': 'Linha {{row}}:',\n 'crud.import.toastSuccess': '{{count}} registros importados',\n 'crud.import.noConnection': 'Sem conexão com o banco de dados. A importação requer uma conexão ativa.',\n\n // crud.export\n 'crud.export.action': 'Exportar',\n 'crud.export.noData': 'Sem dados para exportar.',\n 'crud.export.toastSuccess': '{{count}} registros exportados',\n\n // layout.topbar (additional)\n 'layout.topbar.keyboardShortcut': '\\u2318K',\n 'layout.topbar.search': 'Buscar...',\n\n // layout.commandPalette (additional)\n 'layout.commandPalette.commandsCount': '{{count}} comando{{plural}}',\n 'layout.commandPalette.navigate': 'navegar',\n 'layout.commandPalette.open': 'abrir',\n 'layout.commandPalette.commandCount': '{{count}} comando{{plural}}',\n 'layout.commandPalette.description': 'Buscar páginas, ações, pessoas, produtos e serviços',\n 'layout.commandPalette.resultCount': '{{count}} resultado{{plural}}',\n 'layout.commandPalette.title': 'Paleta de comandos',\n\n // layout.bottomNav\n 'layout.bottomNav.chat': 'Chat',\n\n // layout.mobileDrawer\n 'layout.mobileDrawer.description': 'Links de navegação do aplicativo',\n 'layout.mobileDrawer.title': 'Menu de navegação',\n\n // organization (additional)\n 'organization.sent': 'Enviado {{date}}',\n 'organization.failedInvites': 'Falha ao enviar convites',\n 'organization.onboarding.failedCreate': 'Falha ao criar espaço de trabalho',\n 'organization.createOrg': 'Criar organização',\n 'organization.createOrgDescription': 'Crie um novo espaço de trabalho para sua equipe.',\n 'organization.createOrgTitle': 'Criar Organização',\n 'organization.creating': 'Criando...',\n 'organization.orgNamePlaceholder': 'Nome da organização',\n 'organization.onboarding.oneMoment': 'Isso levará apenas um momento...',\n 'organization.onboarding.preferences': 'Preferências regionais',\n 'organization.onboarding.settingUp': 'Configurando seu espaço de trabalho',\n 'organization.onboarding.setupWorkspace': 'Configure seu espaço de trabalho',\n 'organization.onboarding.whatName': 'Como devemos chamar seu espaço de trabalho?',\n\n // organization.invite (additional)\n 'organization.invite.addAnother': 'Adicionar outro',\n 'organization.invite.description': 'Envie convites para entrar na sua organização.',\n 'organization.invite.emailLabel': 'Endereços de e-mail',\n 'organization.invite.roleLabel': 'Função',\n 'organization.invite.rolePlaceholder': 'Selecione uma função',\n 'organization.invite.sendInvites': 'Enviar Convites',\n 'organization.invite.sending': 'Enviando...',\n 'organization.invite.sent': 'Convites enviados',\n 'organization.invite.sentDescription': 'Seus membros receberão um e-mail com instruções para entrar.',\n 'organization.invite.title': 'Convidar Membros da Equipe',\n\n // organization.permissions\n 'organization.permissions.createCustom': 'Criar Perfil Personalizado',\n 'organization.permissions.createProfile': 'Criar Perfil',\n 'organization.permissions.description': 'Descrição',\n 'organization.permissions.descriptionPlaceholder': 'Descrição opcional',\n 'organization.permissions.editProfile': 'Editar: {{name}}',\n 'organization.permissions.manageBilling': 'Gerenciar Faturamento',\n 'organization.permissions.managePermissions': 'Gerenciar Permissões',\n 'organization.permissions.manageSettings': 'Gerenciar Configurações',\n 'organization.permissions.manageTeam': 'Gerenciar Equipe',\n 'organization.permissions.memberCount': '{{count}} membro{{plural}}',\n 'organization.permissions.previewAs': 'Visualizar como',\n 'organization.permissions.previewingAs': 'Visualizando como',\n 'organization.permissions.exitPreview': 'Sair da Visualização',\n 'organization.permissions.searchFeatures': 'Buscar recursos...',\n 'organization.permissions.profileName': 'Nome do Perfil',\n 'organization.permissions.profileNamePlaceholder': 'ex.: Função Personalizada',\n 'organization.permissions.subtitle': 'Gerencie funções e suas permissões.',\n 'organization.permissions.system': 'Sistema',\n 'organization.permissions.systemPermissions': 'Permissões do Sistema',\n 'organization.permissions.title': 'Perfis de Permissão',\n 'organization.permissions.updateProfile': 'Atualizar Perfil',\n\n // organization.team\n 'organization.team.invite': 'Convidar',\n 'organization.team.joined': 'Entrou',\n 'organization.team.member': 'Membro',\n 'organization.team.memberCount': '{{count}} membro{{plural}} nesta organização.',\n 'organization.team.pendingInvites': 'Convites Pendentes',\n 'organization.team.removeMember': 'Remover membro',\n 'organization.team.resend': 'Reenviar',\n 'organization.team.revoke': 'Revogar',\n 'organization.team.role': 'Função',\n 'organization.team.sent': 'Enviado {{date}}',\n 'organization.team.title': 'Membros',\n 'organization.team.you': '(você)',\n\n // user (legacy)\n 'user.profile': 'Perfil',\n 'user.settings': 'Configurações',\n 'user.help': 'Ajuda',\n 'user.shortcuts': 'Atalhos de Teclado',\n 'user.theme': 'Tema',\n 'user.themeLight': 'Claro',\n 'user.themeDark': 'Escuro',\n 'user.themeSystem': 'Sistema',\n\n // notifications (additional)\n 'notifications.noUpdates': 'Nenhuma atualização ainda',\n\n // common (additional)\n 'common.create': 'Criar',\n 'common.feature': 'Recurso',\n 'common.message': 'Mensagem...',\n 'common.more': 'Mais',\n 'common.noContent': 'Nenhum conteúdo ainda',\n\n // chat\n 'chat.defaultTitle': 'Assistente',\n 'chat.tryAsking': 'Experimente perguntar',\n 'chat.fab.tryIt': 'Experimente',\n 'chat.messagePlaceholder': 'Mensagem...',\n 'chat.toolsAvailable': '{{count}} ferramentas disponíveis',\n // Dashboard\n 'chat.suggestion.dashboard.kpi-summary.0': 'Como está meu negócio hoje?',\n 'chat.suggestion.dashboard.kpi-summary.1': 'Qual o faturamento de hoje?',\n 'chat.suggestion.dashboard.kpi-summary.2': 'Me dê um resumo do dia',\n // Agenda\n 'chat.suggestion.agenda.list-appointments.0': 'O que tem na agenda hoje?',\n 'chat.suggestion.agenda.list-appointments.1': 'Mostre os agendamentos de amanhã',\n 'chat.suggestion.agenda.list-appointments.2': 'Quem tem mais atendimentos esta semana?',\n 'chat.suggestion.agenda.create-appointment.0': 'Agende um corte para Sarah amanhã às 10h',\n 'chat.suggestion.agenda.check-availability.0': 'Quando Ana está disponível amanhã?',\n 'chat.suggestion.agenda.check-availability.1': 'Encontre um horário de 90 minutos para Carlos esta semana',\n // Financial\n 'chat.suggestion.financial.get-revenue.0': 'Quanto faturamos hoje?',\n 'chat.suggestion.financial.get-revenue.1': 'Qual o faturamento deste mês?',\n 'chat.suggestion.financial.get-revenue.2': 'Compare o faturamento desta semana com a anterior',\n 'chat.suggestion.financial.create-invoice.0': 'Crie uma fatura para um novo cliente',\n 'chat.suggestion.financial.list-payables.0': 'Mostre as contas em atraso',\n 'chat.suggestion.financial.list-payables.1': 'Quais contas vencem esta semana?',\n // Inventory\n 'chat.suggestion.inventory.low-stock.0': 'Quais produtos estão com estoque baixo?',\n 'chat.suggestion.inventory.low-stock.1': 'Mostre um resumo do estoque',\n 'chat.suggestion.inventory.low-stock.2': 'Quais são os produtos mais usados?',\n // CRM\n 'chat.suggestion.crm.count-customers.0': 'Quantos clientes temos?',\n 'chat.suggestion.crm.count-customers.1': 'Quem são meus melhores clientes?',\n 'chat.suggestion.crm.list-leads.0': 'Mostre os leads novos desta semana',\n 'chat.suggestion.crm.list-leads.1': 'Quais leads precisam de follow-up?',\n 'chat.suggestion.crm.list-leads.2': 'Qual nossa taxa de conversão?',\n // Custom Forms\n 'chat.suggestion.custom_forms.list-templates.0': 'Quais formulários temos?',\n 'chat.suggestion.custom_forms.list-templates.1': 'Mostre os modelos de anamnese',\n 'chat.suggestion.custom_forms.list-documents.0': 'Mostre os documentos deste cliente',\n\n // billing (additional)\n 'billing.invoice.amount': 'Valor',\n 'billing.invoice.date': 'Data',\n 'billing.invoice.invoice': 'Fatura',\n 'billing.invoice.noInvoices': 'Nenhuma fatura ainda',\n 'billing.invoice.status': 'Status',\n 'billing.paywall.notAvailable': 'Este recurso não está disponível no seu plano atual.',\n 'billing.paywall.requiresPlan': 'Este recurso requer o plano {{plan}} ou superior.',\n 'billing.paywall.upgradeRequired': 'Upgrade Necessário',\n 'billing.paywall.viewPlans': 'Ver Planos',\n\n // auth (additional duplicates/variants)\n 'auth.login.enterCredentials': 'Insira suas credenciais para acessar sua conta',\n 'auth.login.failedDefault': 'Falha ao entrar. Tente novamente.',\n 'auth.login.failedWithProvider': 'Falha ao entrar com {{provider}}.',\n 'auth.login.orContinueWith': 'ou continue com',\n 'auth.login.placeholder.email': 'voce@exemplo.com',\n 'auth.login.placeholder.password': 'Digite sua senha',\n 'auth.login.signingIn': 'Entrando...',\n 'auth.login.welcomeBack': 'Bem-vindo de Volta',\n 'auth.login.welcomeTo': 'Bem-vindo ao {{appName}}',\n 'auth.recovery.checkEmail': 'Verifique seu e-mail',\n 'auth.recovery.description': 'Insira seu e-mail e enviaremos um link para redefinir sua senha.',\n 'auth.recovery.failedDefault': 'Falha ao enviar e-mail. Tente novamente.',\n 'auth.recovery.resetLinkSent': 'Enviamos um link de redefinição para <strong>{{email}}</strong>. Verifique sua caixa de entrada e siga as instruções.',\n 'auth.recovery.sendResetLink': 'Enviar link de redefinição',\n 'auth.recovery.sending': 'Enviando...',\n 'auth.signup.confirmPassword': 'Confirmar senha',\n 'auth.signup.creating': 'Criando conta...',\n 'auth.signup.emailVerification': 'Conta criada para {{email}}. Verifique sua caixa de entrada para confirmar seu e-mail.',\n 'auth.signup.failedDefault': 'Falha ao criar conta. Tente novamente.',\n 'auth.signup.fullName': 'Nome completo',\n 'auth.signup.getStarted': 'Comece com sua nova conta',\n 'auth.signup.passwordMinLength': 'A senha deve ter pelo menos 8 caracteres.',\n 'auth.signup.passwordsMismatch': 'As senhas não conferem.',\n 'auth.signup.placeholder.confirm': 'Repita sua senha',\n 'auth.signup.placeholder.name': 'João Silva',\n 'auth.signup.placeholder.password': 'Pelo menos 8 caracteres',\n 'auth.signup.termsAgreement': 'Ao criar uma conta, você concorda com nossos',\n\n // settings.branding\n 'settings.branding.accentColor': 'Cor de Destaque',\n 'settings.branding.chooseFile': 'Escolher Arquivo',\n 'settings.branding.favicon': 'Favicon',\n 'settings.branding.faviconHint': 'Recomendado: 32x32px, PNG ou ICO',\n 'settings.branding.logo': 'Logo',\n 'settings.branding.logoHint': 'Recomendado: 200x50px, PNG ou SVG',\n 'settings.branding.preview': 'Pré-visualização',\n 'settings.branding.primaryColor': 'Cor Primária',\n 'settings.branding.saveBranding': 'Salvar Marca',\n 'settings.branding.subtitle': 'Personalize a aparência do seu espaço de trabalho.',\n 'settings.branding.title': 'Marca',\n\n // settings.company\n 'settings.company.currency': 'Moeda',\n 'settings.company.currencyPlaceholder': 'Selecione a moeda',\n 'settings.company.locale': 'Idioma',\n 'settings.company.localePlaceholder': 'Selecione o idioma',\n 'settings.company.name': 'Nome da Empresa',\n 'settings.company.subtitle': 'Atualize os dados da sua organização e preferências regionais.',\n 'settings.company.timezone': 'Fuso Horário',\n 'settings.company.timezonePlaceholder': 'Selecione o fuso horário',\n 'settings.company.title': 'Informações da Empresa',\n\n // settings.holidays\n 'settings.holidays.addHoliday': 'Adicionar Feriado',\n 'settings.holidays.annual': 'Anual',\n 'settings.holidays.descriptionPlaceholder': 'Descrição (opcional)',\n 'settings.holidays.empty': 'Nenhum feriado configurado ainda.',\n 'settings.holidays.namePlaceholder': 'Nome do feriado *',\n 'settings.holidays.newHoliday': 'Novo Feriado',\n 'settings.holidays.recurringAnnually': 'Recorrente anualmente',\n 'settings.holidays.subtitle': 'Dias não úteis e feriados recorrentes.',\n 'settings.holidays.title': 'Feriados',\n\n // settings.fieldRules\n 'settings.fieldRules.subtitle': 'Configure quais campos são obrigatórios ou visíveis para cada tipo de cadastro.',\n 'settings.fieldRules.required': 'Obrigatório',\n 'settings.fieldRules.inForm': 'Formulário',\n 'settings.fieldRules.inTable': 'Tabela',\n 'settings.fieldRules.inDetail': 'Detalhe',\n 'settings.fieldRules.field': 'Campo',\n 'settings.fieldRules.resetDefaults': 'Restaurar Padrões',\n 'settings.fieldRules.resetConfirm': 'Restaurar todas as regras de campos de {{entity}} para seus padrões?',\n 'settings.fieldRules.saved': 'Regras de campos salvas',\n 'settings.fieldRules.saveFailed': 'Falha ao salvar regras de campos',\n 'settings.fieldRules.modified': '{{count}} modificado(s)',\n 'settings.fieldRules.searchPlaceholder': 'Buscar tipos de cadastro...',\n 'settings.fieldRules.noEntities': 'Nenhum tipo de cadastro disponível.',\n 'settings.fieldRules.coreRegisters': 'Tipos de Cadastro',\n 'settings.fieldRules.otherRegisters': 'Outros',\n 'settings.fieldRules.showMore': '{{count}} tipos de cadastro a mais...',\n 'settings.fieldRules.showLess': 'Mostrar menos',\n\n // settings.locations\n 'settings.locations.addFirst': 'Adicione seu primeiro local',\n 'settings.locations.addLocation': 'Adicionar Local',\n 'settings.locations.adding': 'Adicionando...',\n 'settings.locations.addressPlaceholder': 'Endereço',\n 'settings.locations.cityPlaceholder': 'Cidade',\n 'settings.locations.countDescription': '{{count}} local{{plural}} cadastrado(s).',\n 'settings.locations.countryPlaceholder': 'País',\n 'settings.locations.empty': 'Nenhum local foi adicionado a esta organização ainda.',\n 'settings.locations.headquarters': 'Sede',\n 'settings.locations.namePlaceholder': 'Nome do local *',\n 'settings.locations.newLocation': 'Novo Local',\n 'settings.locations.noLocations': 'Nenhum local configurado ainda.',\n 'settings.locations.phonePlaceholder': 'Telefone',\n 'settings.locations.statePlaceholder': 'Estado',\n 'settings.locations.title': 'Locais',\n\n // settings.profile\n 'settings.profile.email': 'E-mail',\n 'settings.profile.emailHelp': 'O e-mail não pode ser alterado diretamente. Entre em contato com o suporte.',\n 'settings.profile.fullName': 'Nome Completo',\n 'settings.profile.saveProfile': 'Salvar Perfil',\n 'settings.profile.subtitle': 'Gerencie suas informações pessoais e configurações da conta.',\n 'settings.profile.title': 'Perfil',\n\n // settings.security\n 'settings.security.inviteOnly': 'Acesso Apenas por Convite',\n 'settings.security.inviteOnlyDescription': 'Novos usuários só podem entrar nesta organização via convite.',\n 'settings.security.linkSent': 'Link Enviado',\n 'settings.security.orgSecuritySubtitle': 'Políticas de segurança aplicadas a todos os membros desta organização.',\n 'settings.security.orgSecurityTitle': 'Segurança da Organização',\n 'settings.security.passwordSubtitle': 'Gerencie a senha da sua conta. Um link de redefinição será enviado para seu e-mail.',\n 'settings.security.passwordTitle': 'Senha',\n 'settings.security.require2FA': 'Exigir Autenticação de Dois Fatores',\n 'settings.security.require2FADescription': 'Todos os membros devem ativar 2FA para acessar esta organização.',\n 'settings.security.resetLinkDescription': 'Enviar um link de redefinição de senha para seu e-mail.',\n 'settings.security.resetLinkSent': 'Link de redefinição enviado — verifique sua caixa de entrada.',\n 'settings.security.resetPassword': 'Redefinir Senha',\n 'settings.security.sessionTimeout': 'Tempo Limite da Sessão',\n 'settings.security.sessionTimeoutDescription': 'Desconectar automaticamente usuários inativos após este período.',\n\n // agenda.appointment\n 'agenda.appointment.addDescription': 'Adicionar descrição...',\n 'agenda.appointment.addService': 'Adicionar serviço',\n 'agenda.appointment.cancel': 'Cancelar',\n 'agenda.appointment.clientTab': 'Cliente',\n 'agenda.appointment.noClientData': 'Dados do cliente não disponíveis',\n 'agenda.appointment.client': 'Cliente',\n 'agenda.appointment.conflict': 'Conflito de horário — este profissional já está reservado neste horário.',\n 'agenda.appointment.create': 'Criar',\n 'agenda.appointment.createClientFailed': 'Falha ao criar cliente',\n 'agenda.appointment.creating': 'Criando...',\n 'agenda.appointment.delete': 'Excluir',\n 'agenda.appointment.deleteConfirm': 'Excluir este agendamento?',\n 'agenda.appointment.confirmDelete': 'Excluir',\n 'agenda.appointment.deleting': 'Excluindo…',\n 'agenda.appointment.edit': 'Editar Agendamento',\n 'agenda.appointment.emailOptional': 'E-mail (opcional)',\n 'agenda.appointment.location': 'Local',\n 'agenda.appointment.name': 'Nome',\n 'agenda.appointment.new': 'Novo Agendamento',\n 'agenda.appointment.newClient': 'Novo cliente',\n 'agenda.appointment.notes': 'Observações',\n 'agenda.appointment.phone': 'Telefone',\n 'agenda.appointment.professional': 'Profissional',\n 'agenda.appointment.save': 'Salvar',\n 'agenda.appointment.saving': 'Salvando...',\n 'agenda.appointment.searchClient': 'Buscar cliente...',\n 'agenda.appointment.searchService': 'Buscar serviço para adicionar...',\n 'agenda.appointment.selectLocation': 'Selecionar local...',\n 'agenda.appointment.selectProfessional': 'Selecionar profissional...',\n 'agenda.appointment.services': 'Serviços',\n 'agenda.appointment.status': 'Status',\n 'agenda.appointment.to': 'até',\n 'agenda.appointment.total': 'Total',\n 'agenda.appointment.update': 'Atualizar',\n\n // agenda.payment\n 'agenda.payment.title': 'Recebimento',\n 'agenda.payment.generateInvoice': 'Gerar recebimento',\n 'agenda.payment.generating': 'Gerando…',\n 'agenda.payment.pending': 'Pendente',\n 'agenda.payment.partial': 'Parcial',\n 'agenda.payment.paid': 'Pago',\n 'agenda.payment.collect': 'Receber',\n 'agenda.payment.overdue': 'Vencido',\n 'agenda.payment.cancelled': 'Cancelado',\n 'agenda.payment.none': 'Recebimento',\n 'agenda.payment.pay': 'Pagar',\n 'agenda.payment.paying': 'Pagando…',\n 'agenda.payment.remaining': 'Restante',\n 'agenda.payment.installment': 'Parcela',\n 'agenda.payment.total': 'Total',\n 'agenda.payment.noInvoice': 'Sem recebimento gerado',\n 'agenda.payment.selectAccount': 'Selecionar conta',\n 'agenda.payment.registerPayment': 'Registrar recebimento',\n 'agenda.payment.registerPaymentHint': 'Registrar pagamento deste agendamento',\n 'agenda.payment.pendingHint': 'Fatura gerada, aguardando pagamento',\n 'agenda.payment.partialHint': 'Parcialmente pago, toque para completar',\n 'agenda.payment.paidHint': 'Pagamento realizado',\n 'agenda.payment.overdueHint': 'Pagamento vencido',\n 'agenda.payment.backToAppointment': 'Voltar ao agendamento',\n 'agenda.payment.checkout': 'Confirmar',\n 'agenda.payment.checkingOut': 'Processando…',\n 'agenda.payment.serviceSummary': 'Resumo do atendimento',\n 'agenda.payment.paymentMethod': 'Forma de pagamento',\n 'agenda.payment.checkoutComplete': 'Pagamento confirmado',\n 'agenda.payment.card': 'Cartão',\n 'agenda.payment.method': 'Método',\n 'agenda.payment.select': 'Selecionar…',\n 'agenda.payment.cardBrand': 'Bandeira',\n 'agenda.payment.selectBrand': 'Selecionar bandeira…',\n 'agenda.payment.cardInstallments': 'Parcelas',\n 'agenda.payment.bankAccount': 'Conta',\n 'agenda.payment.viewInvoice': 'Ver detalhes da fatura',\n\n // agenda.calendar\n 'agenda.calendar.agendas': 'Agendas',\n 'agenda.calendar.create': 'Criar',\n 'agenda.calendar.next': 'Próximo',\n 'agenda.calendar.previous': 'Anterior',\n 'agenda.calendar.status': 'Status',\n 'agenda.calendar.today': 'Hoje',\n 'agenda.calendar.viewAgenda': 'Agenda',\n 'agenda.calendar.viewDay': 'Dia',\n 'agenda.calendar.viewMonth': 'Mês',\n 'agenda.calendar.viewWeek': 'Semana',\n\n // agenda.confirmations\n 'agenda.confirmations.confirmed': 'Confirmado:',\n 'agenda.confirmations.empty': 'Nenhuma confirmação pendente',\n 'agenda.confirmations.emptySubtitle': 'Todos os agendamentos futuros foram confirmados',\n 'agenda.confirmations.loading': 'Carregando...',\n 'agenda.confirmations.subtitle': 'Agendamentos futuros pendentes de confirmação',\n 'agenda.confirmations.unknownClient': 'Cliente desconhecido',\n 'agenda.confirmations.sendWhatsApp': 'Enviar WhatsApp',\n 'agenda.confirmations.call': 'Ligar',\n 'agenda.confirmations.markConfirmed': 'Marcar Confirmado',\n 'agenda.confirmations.markCancelled': 'Marcar Cancelado',\n\n // agenda.contextMenu\n 'agenda.contextMenu.changeStatus': 'Alterar status',\n 'agenda.contextMenu.delete': 'Excluir',\n 'agenda.contextMenu.edit': 'Editar',\n 'agenda.contextMenu.notAvailable': '(indisponível)',\n\n // agenda.index\n 'agenda.index.settingsSubtitle': 'Horários de funcionamento, preferências de agendamento e confirmações',\n 'agenda.index.settingsTitle': 'Configurações da Agenda',\n\n // agenda.popover\n 'agenda.popover.unknown': 'Desconhecido',\n\n // agenda.settings\n 'agenda.settings.autoConfirm': 'Auto-confirmar novos agendamentos',\n 'agenda.settings.autoConfirmDesc': 'Marcar automaticamente novos agendamentos como confirmados',\n 'agenda.settings.autoCreateOrder': 'Criar ordem de serviço automaticamente',\n 'agenda.settings.autoCreateOrderDesc': 'Criar um registro financeiro quando o agendamento for concluído',\n 'agenda.settings.blockOutside': 'Bloquear fora do horário',\n 'agenda.settings.blockOutsideDesc': 'Impedir agendamento fora do horário de funcionamento definido',\n 'agenda.settings.calendarDisplay': 'Exibição do Calendário',\n 'agenda.settings.calendarDisplayDesc': 'Preferências visuais para a visualização da agenda',\n 'agenda.settings.cancelAlerts': 'Alertas de cancelamento',\n 'agenda.settings.cancelAlertsDesc': 'Alertar quando um cliente cancelar um agendamento',\n 'agenda.settings.compact': 'Intervalos de tempo compactos',\n 'agenda.settings.compactDesc': 'Usar intervalos menores para uma visualização mais densa do calendário',\n 'agenda.settings.confirmations': 'Confirmações',\n 'agenda.settings.confirmationsDesc': 'Lembretes e confirmações de agendamentos',\n 'agenda.settings.conflictDetection': 'Detecção de conflitos',\n 'agenda.settings.conflictDetectionDesc': 'Avisar quando agendamentos se sobrepõem para o mesmo profissional',\n 'agenda.settings.dragDrop': 'Reagendamento por arrastar e soltar',\n 'agenda.settings.dragDropDesc': 'Permitir arrastar agendamentos para reagendar no calendário',\n 'agenda.settings.enableConfirmations': 'Habilitar confirmações',\n 'agenda.settings.enableConfirmationsDesc': 'Enviar lembretes e acompanhar status de confirmação',\n 'agenda.settings.enableLocation': 'Habilitar seleção de local',\n 'agenda.settings.enableLocationDesc': 'Atribuir locais a agendas e agendamentos',\n 'agenda.settings.enableWorkingHours': 'Habilitar horário de trabalho',\n 'agenda.settings.enableWorkingHoursDesc': 'Gerenciar disponibilidade da equipe e exibir horários não úteis no calendário',\n 'agenda.settings.locations': 'Locais',\n 'agenda.settings.locationsDesc': 'Atribuição de salas e locais para agendas e agendamentos',\n 'agenda.settings.newBookingNotif': 'Notificação de novo agendamento',\n 'agenda.settings.newBookingNotifDesc': 'Notificar quando um novo agendamento for criado',\n 'agenda.settings.noShowTracking': 'Rastreamento de ausências',\n 'agenda.settings.noShowTrackingDesc': 'Sinalizar clientes que frequentemente faltam a agendamentos',\n 'agenda.settings.notifications': 'Notificações',\n 'agenda.settings.notificationsDesc': 'Alertas para equipe e gerência',\n 'agenda.settings.reminder': 'Lembrete antes do agendamento',\n 'agenda.settings.reminderDesc': 'Enviar uma notificação de lembrete antes do agendamento',\n 'agenda.settings.scheduling': 'Agendamento',\n 'agenda.settings.schedulingDesc': 'Comportamento do calendário e preferências de reserva',\n 'agenda.settings.showCancelled': 'Mostrar agendamentos cancelados',\n 'agenda.settings.showCancelledDesc': 'Exibir agendamentos cancelados no calendário (esmaecidos)',\n 'agenda.settings.showNoShow': 'Mostrar agendamentos com ausência',\n 'agenda.settings.showNoShowDesc': 'Exibir agendamentos com ausência no calendário',\n 'agenda.settings.workingHours': 'Horário de Trabalho',\n 'agenda.settings.workingHoursDesc': 'Horário da equipe e disponibilidade',\n\n // agenda.sidebar\n 'agenda.sidebar.agendas': 'Agendas',\n 'agenda.sidebar.allLocations': 'Todos os locais',\n 'agenda.sidebar.create': 'Criar',\n 'agenda.sidebar.location': 'Local',\n 'agenda.sidebar.status': 'Status',\n\n // agenda.toolbar\n 'agenda.toolbar.next': 'Próximo',\n 'agenda.toolbar.previous': 'Anterior',\n 'agenda.toolbar.today': 'Hoje',\n\n // agenda.workingHours\n 'agenda.workingHours.addBreak': 'Adicionar intervalo',\n 'agenda.workingHours.copyToAll': 'Copiar para todos',\n 'agenda.workingHours.dayOff': 'Folga',\n 'agenda.workingHours.removePeriod': 'Remover período',\n 'agenda.workingHours.professional': 'Profissional',\n 'agenda.workingHours.save': 'Salvar',\n 'agenda.workingHours.saveFailed': 'Falha ao salvar',\n 'agenda.workingHours.saved': 'Horários de trabalho salvos',\n 'agenda.workingHours.saving': 'Salvando...',\n 'agenda.workingHours.subtitle': 'Gerenciar horários de trabalho por profissional',\n 'agenda.workingHours.to': 'até',\n\n // crm.activities\n 'crm.activities.activitiesLogged': 'Atividades são registradas a partir de interações com leads e negócios',\n 'crm.activities.all': 'Todas',\n 'crm.activities.completedFilter': 'Concluídas',\n 'crm.activities.done': 'Concluído',\n 'crm.activities.noActivities': 'Nenhuma atividade',\n 'crm.activities.noActivitiesOfType': 'Nenhuma atividade do tipo \"{{type}}\"',\n 'crm.activities.overdue': 'atrasada',\n 'crm.activities.overdueLabel': 'Atrasada',\n 'crm.activities.pending': 'pendente',\n 'crm.activities.pendingFilter': 'Pendentes',\n 'crm.activities.title': 'Atividades',\n\n // crm.dashboard\n 'crm.dashboard.activeDeals': '{{count}} negócios ativos',\n 'crm.dashboard.avgDealValue': 'Valor médio do negócio',\n 'crm.dashboard.leadsCount': '{{count}} leads',\n 'crm.dashboard.quotesCount': '{{count}} orçamentos',\n 'crm.dashboard.conversionRate': 'Taxa de Conversão',\n 'crm.dashboard.conversionRateLabel': 'Taxa de conversão',\n 'crm.dashboard.createFirstLead': 'Crie seu primeiro lead para ver o funil',\n 'crm.dashboard.dealsWon': 'Negócios fechados neste mês',\n 'crm.dashboard.leadToDeal': 'Lead para negócio',\n 'crm.dashboard.newThisMonth': '{{count}} novos neste mês',\n 'crm.dashboard.noLeadsYet': 'Nenhum lead ainda. Capture seu primeiro lead para começar.',\n 'crm.dashboard.noPipelineData': 'Nenhum dado de pipeline ainda',\n 'crm.dashboard.noQuotesYet': 'Nenhum orçamento ainda.',\n 'crm.dashboard.openPipeline': 'Pipeline Aberto',\n 'crm.dashboard.overdueCount': '{{count}} atrasados',\n 'crm.dashboard.pendingTasks': 'Tarefas Pendentes',\n 'crm.dashboard.performance': 'Desempenho',\n 'crm.dashboard.pipelineOverview': 'Visão Geral do Pipeline',\n 'crm.dashboard.pipelineValue': 'Valor do Pipeline',\n 'crm.dashboard.recentLeads': 'Leads Recentes',\n 'crm.dashboard.recentQuotes': 'Orçamentos Recentes',\n 'crm.dashboard.revenueWon': 'Receita ganha',\n 'crm.dashboard.totalDeals': '{{count}} negócios no total',\n 'crm.dashboard.totalLeads': 'Total de Leads',\n\n // crm.dealSidebar\n 'crm.dealSidebar.activitiesAppear': 'As atividades aparecerão aqui conforme forem registradas',\n 'crm.dealSidebar.activity': 'Atividade',\n 'crm.dealSidebar.assignedTo': 'Atribuído a',\n 'crm.dealSidebar.contact': 'Contato',\n 'crm.dealSidebar.created': 'Criado',\n 'crm.dealSidebar.deal': 'Negócio',\n 'crm.dealSidebar.dealNotFound': 'Negócio não encontrado',\n 'crm.dealSidebar.expectedClose': 'Fechamento previsto',\n 'crm.dealSidebar.noActivities': 'Nenhuma atividade ainda',\n 'crm.dealSidebar.noQuotes': 'Nenhum orçamento vinculado',\n 'crm.dealSidebar.notes': 'Observações',\n 'crm.dealSidebar.overview': 'Visão Geral',\n 'crm.dealSidebar.probability': 'Probabilidade',\n 'crm.dealSidebar.quotes': 'Orçamentos',\n 'crm.dealSidebar.quotesAppear': 'Orçamentos criados para este lead aparecerão aqui',\n 'crm.dealSidebar.stage': 'Etapa',\n 'crm.dealSidebar.tags': 'Tags',\n 'crm.dealSidebar.updated': 'Atualizado',\n 'crm.dealSidebar.value': 'Valor',\n 'crm.dealSidebar.viewLeadProfile': 'Ver Perfil Completo do Lead',\n\n // crm.leadDetail\n 'crm.leadDetail.assignedTo': 'Atribuído a',\n 'crm.leadDetail.backToList': 'Voltar à lista',\n 'crm.leadDetail.company': 'Empresa',\n 'crm.leadDetail.contactInfo': 'Informações de Contato',\n 'crm.leadDetail.createQuote': 'Criar Orçamento',\n 'crm.leadDetail.created': 'Criado',\n 'crm.leadDetail.dealStatus': 'Status do negócio',\n 'crm.leadDetail.dealValue': 'Valor do negócio',\n 'crm.leadDetail.details': 'Detalhes',\n 'crm.leadDetail.email': 'E-mail',\n 'crm.leadDetail.leadNotFound': 'Lead não encontrado',\n 'crm.leadDetail.leads': 'Leads',\n 'crm.leadDetail.loading': 'Carregando...',\n 'crm.leadDetail.notFound': 'Não encontrado',\n 'crm.leadDetail.notes': 'Observações',\n 'crm.leadDetail.phone': 'Telefone',\n 'crm.leadDetail.pipeline': 'Pipeline',\n 'crm.leadDetail.probability': 'Probabilidade',\n 'crm.leadDetail.quotes': 'Orçamentos',\n 'crm.leadDetail.source': 'Origem',\n 'crm.leadDetail.stage': 'Etapa',\n 'crm.leadDetail.tags': 'Tags',\n 'crm.leadDetail.updated': 'Atualizado',\n 'crm.leadDetail.value': 'Valor',\n\n // crm.leadForm\n 'crm.leadForm.cancel': 'Cancelar',\n 'crm.leadForm.company': 'Empresa',\n 'crm.leadForm.companyPlaceholder': 'Nome da empresa',\n 'crm.leadForm.email': 'E-mail',\n 'crm.leadForm.emailPlaceholder': 'email@exemplo.com',\n 'crm.leadForm.name': 'Nome *',\n 'crm.leadForm.namePlaceholder': 'Nome do contato',\n 'crm.leadForm.notes': 'Observações',\n 'crm.leadForm.notesPlaceholder': 'Observações adicionais...',\n 'crm.leadForm.phone': 'Telefone',\n 'crm.leadForm.phonePlaceholder': '+55 11 99999-9999',\n 'crm.leadForm.save': 'Salvar',\n 'crm.leadForm.saving': 'Salvando...',\n 'crm.leadForm.subtitle': 'Capturar um novo lead',\n 'crm.leadForm.title': 'Novo Lead',\n\n // crm.leads\n 'crm.leads.captureFirst': 'Capture seu primeiro lead',\n 'crm.leads.contactCol': 'Contato',\n 'crm.leads.name': 'Nome',\n 'crm.leads.newLead': 'Novo Lead',\n 'crm.leads.noLeads': 'Nenhum lead ainda',\n 'crm.leads.searchPlaceholder': 'Buscar leads...',\n 'crm.leads.source': 'Origem',\n 'crm.leads.statusCol': 'Status',\n 'crm.leads.title': 'Leads',\n\n // crm.page\n 'crm.page.logActivity': 'Registrar Atividade',\n 'crm.page.logActivityDesc': 'Registrar uma ligação, e-mail ou nota',\n 'crm.page.newDeal': 'Novo Negócio',\n 'crm.page.newDealDesc': 'Criar um negócio a partir do pipeline',\n 'crm.page.newLead': 'Novo Lead',\n 'crm.page.newLeadDesc': 'Capturar um novo lead',\n 'crm.page.newQuote': 'Novo Orçamento',\n 'crm.page.newQuoteDesc': 'Enviar uma proposta',\n 'crm.page.settingsSubtitle': 'Configure pipeline, gestão de leads e cadastros',\n 'crm.page.settingsTitle': 'Configurações de Vendas e CRM',\n\n // crm.pipeline\n 'crm.pipeline.dropHere': 'Solte aqui',\n 'crm.pipeline.moveFailed': 'Falha ao mover negócio',\n 'crm.pipeline.movedTo': 'Movido para {{stage}}',\n 'crm.pipeline.noDeals': 'Nenhum negócio',\n 'crm.pipeline.subtitle': 'Arraste negócios entre etapas',\n 'crm.pipeline.title': 'Pipeline',\n\n // crm.quoteDetail\n 'crm.quoteDetail.backToList': 'Voltar à lista',\n 'crm.quoteDetail.client': 'Cliente',\n 'crm.quoteDetail.date': 'Data',\n 'crm.quoteDetail.description': 'Descrição',\n 'crm.quoteDetail.discount': 'Desconto',\n 'crm.quoteDetail.edit': 'Editar',\n 'crm.quoteDetail.send': 'Enviar',\n 'crm.quoteDetail.sending': 'Enviando...',\n 'crm.quoteDetail.sendPrint': 'Imprimir',\n 'crm.quoteDetail.sendEmail': 'Enviar por E-mail',\n 'crm.quoteDetail.sendWhatsApp': 'Enviar por WhatsApp',\n 'crm.quoteDetail.approve': 'Aprovar',\n 'crm.quoteDetail.approving': 'Aprovando...',\n 'crm.quoteDetail.reject': 'Rejeitar',\n 'crm.quoteDetail.rejecting': 'Rejeitando...',\n 'crm.quoteDetail.confirmReject': 'Confirmar Rejeição',\n 'crm.quoteDetail.rejectDescription': 'Informe o motivo da rejeição deste orçamento.',\n 'crm.quoteDetail.rejectReasonPlaceholder': 'Motivo da rejeição...',\n 'crm.quoteDetail.invoiceCreated': 'Fatura criada a partir deste orçamento',\n 'crm.quoteDetail.items': 'Itens',\n 'crm.quoteDetail.loading': 'Carregando...',\n 'crm.quoteDetail.notFound': 'Orçamento não encontrado',\n 'crm.quoteDetail.notes': 'Observações',\n 'crm.quoteDetail.paymentConditions': 'Condições de Pagamento',\n 'crm.quoteDetail.qty': 'Qtd',\n 'crm.quoteDetail.quoteNumber': 'Orçamento {{number}}',\n 'crm.quoteDetail.rejectionReason': 'Motivo da rejeição',\n 'crm.quoteDetail.subtotal': 'Subtotal',\n 'crm.quoteDetail.title': 'Orçamentos',\n 'crm.quoteDetail.total': 'Total',\n 'crm.quoteDetail.unitPrice': 'Preço Unitário',\n 'crm.quoteDetail.validUntil': 'Válido Até',\n 'crm.quoteDetail.viewInvoice': 'Ver Fatura',\n\n // crm.quoteForm\n 'crm.quoteForm.addFirstItem': 'Adicione seu primeiro item',\n 'crm.quoteForm.addItem': 'Adicionar Item',\n 'crm.quoteForm.cancel': 'Cancelar',\n 'crm.quoteForm.client': 'Cliente',\n 'crm.quoteForm.description': 'Descrição',\n 'crm.quoteForm.discount': 'Desconto',\n 'crm.quoteForm.done': 'Concluído',\n 'crm.quoteForm.editSubtitle': 'Atualizar esta proposta',\n 'crm.quoteForm.editTitle': 'Editar Orçamento',\n 'crm.quoteForm.itemCount': '{{count}} itens',\n 'crm.quoteForm.itemDescriptionPlaceholder': 'Descrição do item',\n 'crm.quoteForm.loading': 'Carregando...',\n 'crm.quoteForm.newSubtitle': 'Criar uma proposta para seu cliente',\n 'crm.quoteForm.newTitle': 'Novo Orçamento',\n 'crm.quoteForm.noDescription': 'Sem descrição',\n 'crm.quoteForm.noItems': 'Nenhum item adicionado',\n 'crm.quoteForm.notes': 'Observações',\n 'crm.quoteForm.notesPlaceholder': 'Observações internas...',\n 'crm.quoteForm.paymentConditions': 'Condições de Pagamento',\n 'crm.quoteForm.paymentConditionsPlaceholder': 'ex. 50% antecipado, 50% na entrega',\n 'crm.quoteForm.qty': 'Qtd',\n 'crm.quoteForm.quoteDate': 'Data do Orçamento',\n 'crm.quoteForm.quoteDetails': 'Detalhes do Orçamento',\n 'crm.quoteForm.quoteItems': 'Itens do Orçamento',\n 'crm.quoteForm.saveChanges': 'Salvar Alterações',\n 'crm.quoteForm.saveQuote': 'Salvar Orçamento',\n 'crm.quoteForm.saving': 'Salvando...',\n 'crm.quoteForm.searchClient': 'Buscar cliente...',\n 'crm.quoteForm.addAsLead': 'Adicionar como lead',\n 'crm.quoteForm.selectItemType': 'Selecione o tipo de item:',\n 'crm.quoteForm.statusApproved': 'Aprovado',\n 'crm.quoteForm.statusDraft': 'Rascunho',\n 'crm.quoteForm.statusExpired': 'Expirado',\n 'crm.quoteForm.statusRejected': 'Rejeitado',\n 'crm.quoteForm.statusSent': 'Enviado',\n 'crm.quoteForm.total': 'Total',\n 'crm.quoteForm.unitPrice': 'Preço Unitário',\n 'crm.quoteForm.validUntil': 'Válido Até',\n\n // crm.quotes\n 'crm.quotes.amount': 'Valor',\n 'crm.quotes.contact': 'Contato',\n 'crm.quotes.createFirst': 'Crie seu primeiro orçamento',\n 'crm.quotes.date': 'Data',\n 'crm.quotes.newQuote': 'Novo Orçamento',\n 'crm.quotes.noQuotes': 'Nenhum orçamento ainda',\n 'crm.quotes.quotesCount': '{{count}} orçamentos',\n 'crm.quotes.status': 'Status',\n 'crm.quotes.title': 'Orçamentos',\n\n // financial.cards\n 'financial.cards.installment': 'Parcela {{current}}/{{total}}',\n 'financial.cards.noTransactions': 'Nenhuma transação com cartão',\n 'financial.cards.pending': 'Pendente',\n 'financial.cards.received': 'Recebido',\n 'financial.cards.subtitle': 'Transações com cartão de crédito e débito',\n 'financial.cards.title': 'Cartões',\n 'financial.cards.transactions': '({{count}} transações)',\n 'financial.cards.transactionsAppear': 'As transações com cartão aparecerão aqui quando pagamentos forem feitos via cartão de crédito/débito',\n\n // financial.cashRegisters\n 'financial.cashRegisters.addNotes': 'Adicionar observações',\n 'financial.cashRegisters.back': 'Voltar',\n 'financial.cashRegisters.bills': 'Notas',\n 'financial.cashRegisters.closeSession': 'Fechar Sessão',\n 'financial.cashRegisters.closeThisSession': 'Fechar esta sessão',\n 'financial.cashRegisters.closing': 'Fechando...',\n 'financial.cashRegisters.closingBalance': 'Saldo de Fechamento',\n 'financial.cashRegisters.closingNotes': 'Observações de Fechamento',\n 'financial.cashRegisters.coins': 'Moedas',\n 'financial.cashRegisters.confirmOpen': 'Confirmar e Abrir',\n 'financial.cashRegisters.confirmOpening': 'Confirmar Abertura do Caixa',\n 'financial.cashRegisters.count': 'Contagem',\n 'financial.cashRegisters.countBills': 'Contar Notas e Moedas',\n 'financial.cashRegisters.countedTotal': 'Total Contado',\n 'financial.cashRegisters.denominationCount': 'Contagem por denominação',\n 'financial.cashRegisters.differenceFromOpening': 'Diferença em relação à abertura',\n 'financial.cashRegisters.method': 'Método',\n 'financial.cashRegisters.noCashAccounts': 'Nenhuma conta de caixa encontrada. Crie uma conta bancária do tipo \"Caixa Registradora\" primeiro.',\n 'financial.cashRegisters.noClosedSessions': 'Nenhuma sessão encerrada ainda',\n 'financial.cashRegisters.openAnother': 'Abrir outro caixa',\n 'financial.cashRegisters.openSession': 'Abrir Sessão',\n 'financial.cashRegisters.openSessions': 'Sessões Abertas',\n 'financial.cashRegisters.opened': 'Aberto',\n 'financial.cashRegisters.opening': 'Abrindo...',\n 'financial.cashRegisters.openingBalance': 'Saldo de Abertura',\n 'financial.cashRegisters.quickAmount': 'Valor Rápido',\n 'financial.cashRegisters.register': 'Caixa',\n 'financial.cashRegisters.sessionHistory': 'Histórico de Sessões',\n 'financial.cashRegisters.subtitle': 'Abrir, contar e fechar sessões de caixa',\n\n // financial.commissions\n 'financial.commissions.comingSoon': 'Em breve',\n 'financial.commissions.subtitle': 'Comissões da equipe',\n\n // financial.invoice\n 'financial.invoice.accountsPayable': 'Contas a Pagar',\n 'financial.invoice.accountsReceivable': 'Contas a Receber',\n 'financial.invoice.cancelConfirm': 'Esta ação não pode ser desfeita.',\n 'financial.invoice.cancelDesc': 'A fatura será marcada como cancelada. Todas as parcelas pendentes também serão canceladas. Esta fatura não contará mais nos totais.',\n 'financial.invoice.cancelInvoice': 'Cancelar Fatura',\n 'financial.invoice.cancelling': 'Cancelando...',\n 'financial.invoice.contact': 'Contato',\n 'financial.invoice.createFirst': 'Crie sua primeira fatura',\n 'financial.invoice.date': 'Data',\n 'financial.invoice.booking': 'Agendamento',\n 'financial.invoice.discount': 'Desconto',\n 'financial.invoice.due': 'Vencimento:',\n 'financial.invoice.edit': 'Editar',\n 'financial.invoice.fullyPaid': 'Totalmente pago',\n 'financial.invoice.installments': 'Parcelas',\n 'financial.invoice.invoices': '{{count}} faturas',\n 'financial.invoice.items': 'Itens',\n 'financial.invoice.keepInvoice': 'Manter Fatura',\n 'financial.invoice.new': 'Nova',\n 'financial.invoice.noDetails': 'Nenhum detalhe adicional registrado',\n 'financial.invoice.noInstallments': 'Sem parcelas',\n 'financial.invoice.noInvoices': 'Nenhuma fatura ainda',\n 'financial.invoice.summaryTotal': 'Total',\n 'financial.invoice.summaryReceived': 'Recebido',\n 'financial.invoice.summaryReceivable': 'A Receber',\n 'financial.invoice.summaryPaid': 'Pago',\n 'financial.invoice.summaryPayable': 'A Pagar',\n 'financial.invoice.notFound': 'Fatura não encontrada',\n 'financial.invoice.notFoundDesc': 'Esta fatura não pôde ser carregada.',\n 'financial.invoice.notes': 'Observações',\n 'financial.invoice.paidLabel': 'Pago:',\n 'financial.invoice.paidOn': 'Pago em:',\n 'financial.invoice.pay': 'Pagar',\n 'financial.invoice.paymentSchedule': 'Cronograma de Pagamento',\n 'financial.invoice.remaining': 'Restante:',\n 'financial.invoice.searchPlaceholder': 'Buscar por contato ou descrição...',\n 'financial.invoice.showing': 'Exibindo {{shown}} de {{total}}',\n 'financial.invoice.subtotal': 'Subtotal',\n 'financial.invoice.surcharge': 'Acréscimo',\n 'financial.invoice.total': 'Total',\n 'financial.invoice.yesCancel': 'Sim, Cancelar',\n\n // financial.invoiceForm\n 'financial.invoiceForm.addFirstItem': 'Adicione seu primeiro item',\n 'financial.invoiceForm.addItem': 'Adicionar Item',\n 'financial.invoiceForm.addItemsFirst': 'Adicione itens primeiro',\n 'financial.invoiceForm.additionalNotes': 'Observações adicionais...',\n 'financial.invoiceForm.cancel': 'Cancelar',\n 'financial.invoiceForm.close': 'Fechar',\n 'financial.invoiceForm.creating': 'Criando nova fatura',\n 'financial.invoiceForm.date': 'Data',\n 'financial.invoiceForm.description': 'Descrição',\n 'financial.invoiceForm.discountSurcharge': 'Desconto / Acréscimo',\n 'financial.invoiceForm.done': 'Pronto',\n 'financial.invoiceForm.editing': 'Editando fatura',\n 'financial.invoiceForm.fiscalNumber': 'Número Fiscal (opcional)',\n 'financial.invoiceForm.headquarters': 'Sede',\n 'financial.invoiceForm.installments': 'Parcelas',\n 'financial.invoiceForm.item': 'Item',\n 'financial.invoiceForm.itemDescription': 'Descrição do item',\n 'financial.invoiceForm.items': 'Itens',\n 'financial.invoiceForm.noDescription': 'Sem descrição',\n 'financial.invoiceForm.noItems': 'Nenhum item adicionado ainda',\n 'financial.invoiceForm.noUnitsFound': 'Nenhuma unidade encontrada',\n 'financial.invoiceForm.observations': 'Observações',\n 'financial.invoiceForm.payTo': 'Pagar para',\n 'financial.invoiceForm.qty': 'Qtd',\n 'financial.invoiceForm.receiveFrom': 'Receber de',\n 'financial.invoiceForm.save': 'Salvar',\n 'financial.invoiceForm.saving': 'Salvando...',\n 'financial.invoiceForm.searchType': 'Digite para buscar...',\n 'financial.invoiceForm.searchUnit': 'Buscar unidade...',\n 'financial.invoiceForm.selectInstallments': 'Selecione a quantidade de parcelas acima',\n 'financial.invoiceForm.selectItemType': 'Selecione o tipo do item:',\n 'financial.invoiceForm.selectUnit': 'Selecionar unidade',\n 'financial.invoiceForm.selectUnitTitle': 'Selecionar Unidade',\n 'financial.invoiceForm.unit': 'Unidade',\n 'financial.invoiceForm.unitPrice': 'Preço Unitário',\n 'financial.nav.cards': 'Cartões',\n 'financial.nav.cashRegisters': 'Caixas',\n 'financial.nav.commissions': 'Comissões',\n 'financial.nav.list': 'Lista',\n 'financial.nav.new': 'Novo',\n 'financial.nav.overview': 'Visão Geral',\n 'financial.nav.payables': 'Contas a Pagar',\n 'financial.nav.receivables': 'Contas a Receber',\n 'financial.nav.reconciliation': 'Conciliação',\n 'financial.nav.recurringExpenses': 'Despesas Recorrentes',\n 'financial.nav.rules': 'Regras',\n 'financial.nav.statements': 'Extratos',\n 'financial.nav.summary': 'Resumo',\n\n // financial.onboarding\n 'financial.onboarding.back': 'Voltar',\n 'financial.onboarding.configureHint': 'Você pode configurar isso em detalhes pelo ícone de Configurações dentro do módulo Financeiro.',\n 'financial.onboarding.getStarted': 'Começar',\n 'financial.onboarding.next': 'Próximo',\n 'financial.onboarding.startUsing': 'Começar a usar o Financeiro',\n 'financial.onboarding.skip': 'Pular configuração',\n 'financial.onboarding.welcome': 'Bem-vindo ao Financeiro',\n 'financial.onboarding.description': 'Vamos configurar seu módulo financeiro. Este assistente rápido ajudará a configurar o essencial.',\n 'financial.onboarding.accounts.title': 'Contas Bancárias',\n 'financial.onboarding.accounts.description': 'Adicione suas contas bancárias, caixas registradoras e cartões de crédito. Você pode adicionar mais depois em Configurações.',\n 'financial.onboarding.payments.title': 'Métodos de Pagamento',\n 'financial.onboarding.payments.description': 'Revise os tipos de pagamento que você aceita. Os tipos padrão (Dinheiro, PIX, Cartão de Crédito, etc.) já estão configurados.',\n 'financial.onboarding.chart.title': 'Plano de Contas',\n 'financial.onboarding.chart.description': 'Um modelo padrão de plano de contas foi criado. Você pode personalizá-lo a qualquer momento em Configurações.',\n\n // financial.page\n 'financial.page.newPayable': 'Nova Conta a Pagar',\n 'financial.page.newPayableDesc': 'Registrar uma despesa ou conta a pagar',\n 'financial.page.newReceivable': 'Nova Conta a Receber',\n 'financial.page.newReceivableDesc': 'Registrar receita ou valor a receber',\n 'financial.page.openCash': 'Abrir Caixa',\n 'financial.page.openCashDesc': 'Iniciar uma nova sessão de caixa',\n 'financial.page.settingsSubtitle': 'Preferências, métodos de pagamento e contas',\n 'financial.page.settingsTitle': 'Configurações Financeiras',\n\n // financial.payment\n 'financial.payment.amount': 'Valor',\n 'financial.payment.bankAccount': 'Conta Bancária',\n 'financial.payment.cancel': 'Cancelar',\n 'financial.payment.card': 'Cartão',\n 'financial.payment.cardBrand': 'Bandeira do Cartão',\n 'financial.payment.cardInstallments': 'Parcelas',\n 'financial.payment.date': 'Data',\n 'financial.payment.installment': 'Parcela #{{number}}',\n 'financial.payment.method': 'Método de Pagamento',\n 'financial.payment.notes': 'Observações',\n 'financial.payment.optionalNotes': 'Observações opcionais...',\n 'financial.payment.payAmount': 'Pagar {{amount}}',\n 'financial.payment.processing': 'Processando...',\n 'financial.payment.remaining': '{{amount}} restante',\n 'financial.payment.select': 'Selecionar...',\n 'financial.payment.selectAccount': 'Selecionar conta...',\n 'financial.payment.selectBrand': 'Selecionar bandeira...',\n 'financial.payment.title': 'Registrar Pagamento',\n\n // financial.settings\n 'financial.settings.allowPartial': 'Permitir pagamentos parciais',\n 'financial.settings.allowPartialDesc': 'Aceitar pagamentos menores que o valor total da parcela',\n 'financial.settings.autoClose': 'Fechamento automático no fim do dia',\n 'financial.settings.autoCloseDesc': 'Lembrar de fechar sessões abertas no fim do expediente',\n 'financial.settings.autoInstallments': 'Gerar parcelas automaticamente',\n 'financial.settings.autoInstallmentsDesc': 'Dividir automaticamente o total da fatura em parcelas iguais',\n 'financial.settings.cashRegister': 'Caixa Registradora',\n 'financial.settings.cashRegisterDesc': 'Comportamento da sessão de caixa',\n 'financial.settings.dailySummary': 'Resumo financeiro diário',\n 'financial.settings.dailySummaryDesc': 'Enviar um resumo diário por e-mail de contas a receber e a pagar',\n 'financial.settings.invoices': 'Faturas',\n 'financial.settings.invoicesDesc': 'Como faturas e pagamentos são processados',\n 'financial.settings.notifications': 'Notificações',\n 'financial.settings.notificationsDesc': 'Alertas e lembretes',\n 'financial.settings.overdueAlerts': 'Alertas de pagamento atrasado',\n 'financial.settings.overdueAlertsDesc': 'Notificar quando faturas passarem da data de vencimento',\n 'financial.settings.requireDoc': 'Exigir número do documento',\n 'financial.settings.requireDocDesc': 'Tornar obrigatório o número do documento/fatura nos pagamentos',\n 'financial.settings.requireOpening': 'Exigir saldo de abertura',\n 'financial.settings.requireOpeningDesc': 'O saldo de abertura deve ser confirmado antes de iniciar uma sessão',\n\n // financial.settingsPage\n 'financial.settingsPage.subtitle': 'Gerenciar métodos de pagamento, contas e configurações',\n 'financial.settingsPage.title': 'Configurações Financeiras',\n\n // financial.statements\n 'financial.statements.account': 'Conta',\n 'financial.statements.from': 'De',\n 'financial.statements.noTransactions': 'Nenhuma transação neste período',\n 'financial.statements.selectAccount': 'Selecionar conta',\n 'financial.statements.selectToView': 'Selecione uma conta para ver o extrato',\n 'financial.statements.subtitle': 'Transações e saldos de contas bancárias',\n 'financial.statements.title': 'Extratos',\n 'financial.statements.to': 'Até',\n\n // financial.summary\n 'financial.summary.allAccounts': 'Todas as contas',\n 'financial.summary.cashFlow': 'Fluxo de Caixa',\n 'financial.summary.cashFlowBreakdown': 'Detalhamento do Fluxo de Caixa',\n 'financial.summary.cashFlowBreakdownSubtitle': 'Contas a receber vs. contas a pagar neste mês',\n 'financial.summary.cashFlowSubtitle': 'Receitas vs despesas mensais',\n 'financial.summary.expenses': 'Despesas',\n 'financial.summary.income': 'Receita',\n 'financial.summary.monthlyFlow': 'Fluxo Mensal',\n 'financial.summary.negativeBalance': 'Saldo negativo',\n 'financial.summary.net': 'Líquido',\n 'financial.summary.noOverdue': 'Nenhuma transação atrasada',\n 'financial.summary.noTransactions': 'Nenhuma transação ainda',\n 'financial.summary.overdue': '{{count}} atrasados',\n 'financial.summary.overduePayable': 'Conta a pagar atrasada',\n 'financial.summary.overdueReceivable': 'Conta a receber atrasada',\n 'financial.summary.overdueTitle': 'Atrasados',\n 'financial.summary.paid': 'Pago',\n 'financial.summary.payable': 'A Pagar',\n 'financial.summary.positiveBalance': 'Saldo positivo',\n 'financial.summary.receivable': 'A Receber',\n 'financial.summary.received': 'Recebido',\n 'financial.summary.recentTransactions': 'Transações Recentes',\n 'financial.summary.totalBalance': 'Saldo Total',\n 'financial.summary.transactionsAppear': 'As transações aparecerão aqui após serem registradas',\n 'financial.summary.viewAll': 'Ver todos',\n\n // inventory.dashboard\n 'inventory.dashboard.activeItems': 'Itens ativos',\n 'inventory.dashboard.belowMinimum': 'Abaixo do mínimo',\n 'inventory.dashboard.entries': 'Entradas:',\n 'inventory.dashboard.exits': 'Saídas:',\n 'inventory.dashboard.last7Days': 'Últimos 7 dias',\n 'inventory.dashboard.lowStock': 'Estoque Baixo',\n 'inventory.dashboard.needRestocking': 'Precisam reposição',\n 'inventory.dashboard.outOfStock': 'Sem Estoque',\n 'inventory.dashboard.quickActions': 'Ações Rápidas',\n 'inventory.dashboard.quickActionsDesc': 'Use a barra lateral para registrar entradas, saídas ou gerenciar produtos.',\n 'inventory.dashboard.recentActivity': 'Atividade Recente',\n 'inventory.dashboard.stockValue': 'Valor do Estoque',\n 'inventory.dashboard.totalProducts': 'Total de Produtos',\n 'inventory.dashboard.totalValue': 'Valor total do estoque',\n\n // inventory.history\n 'inventory.history.noMovements': 'Nenhuma movimentação registrada',\n 'inventory.history.searchPlaceholder': 'Buscar movimentações...',\n 'inventory.history.subtitle': 'Todas as movimentações de estoque',\n 'inventory.history.title': 'Histórico de Estoque',\n 'inventory.nav.dashboard': 'Painel',\n 'inventory.nav.entry': 'Entrada',\n 'inventory.nav.exit': 'Saída',\n 'inventory.nav.history': 'Histórico',\n 'inventory.nav.list': 'Lista',\n 'inventory.nav.new': 'Novo',\n 'inventory.nav.products': 'Produtos',\n 'inventory.nav.stock': 'Estoque',\n\n // inventory.page\n 'inventory.page.newProduct': 'Novo Produto',\n 'inventory.page.newProductDesc': 'Adicionar um produto ao seu catálogo',\n 'inventory.page.settingsSubtitle': 'Preferências, fornecedores, categorias e unidades',\n 'inventory.page.settingsTitle': 'Configurações de Estoque',\n 'inventory.page.stockEntry': 'Entrada de Estoque',\n 'inventory.page.stockEntryDesc': 'Registrar mercadorias recebidas',\n 'inventory.page.stockExit': 'Saída de Estoque',\n 'inventory.page.stockExitDesc': 'Registrar mercadorias usadas ou vendidas',\n\n // inventory.recipeDetail\n 'inventory.recipeDetail.active': 'Ativa',\n 'inventory.recipeDetail.backToList': 'Voltar à lista',\n 'inventory.recipeDetail.inactive': 'Inativa',\n 'inventory.recipeDetail.ingredientCount': 'Ingredientes',\n 'inventory.recipeDetail.ingredientsTitle': 'Ingredientes',\n 'inventory.recipeDetail.instructions': 'Instruções',\n 'inventory.recipeDetail.noIngredients': 'Nenhum ingrediente definido',\n 'inventory.recipeDetail.notFound': 'Receita não encontrada',\n 'inventory.recipeDetail.prepTime': 'Tempo de preparo',\n 'inventory.recipeDetail.produces': 'Produz',\n 'inventory.recipeDetail.recipes': 'Receitas',\n 'inventory.recipeDetail.yield': 'Rendimento',\n\n // inventory.recipes\n 'inventory.recipes.createFirst': 'Crie sua primeira receita',\n 'inventory.recipes.ingredients': '{{count}} ingredientes',\n 'inventory.recipes.newRecipe': 'Nova Receita',\n 'inventory.recipes.noRecipes': 'Nenhuma receita ainda',\n 'inventory.recipes.produces': 'Produz:',\n 'inventory.recipes.productionFormulas': '{{count}} fórmulas de produção',\n 'inventory.recipes.recipesDesc': 'Receitas definem como produzir produtos a partir de ingredientes',\n 'inventory.recipes.title': 'Receitas',\n 'inventory.recipes.yield': 'Rendimento:',\n\n // inventory.stock\n 'inventory.stock.additionalDetails': 'Detalhes adicionais (opcional)',\n 'inventory.stock.adjustmentDesc': 'Correção de contagem',\n 'inventory.stock.adjustmentLabel': 'Ajuste',\n 'inventory.stock.back': 'Voltar',\n 'inventory.stock.batchNumber': 'Número do Lote',\n 'inventory.stock.currentStock': 'Estoque atual:',\n 'inventory.stock.destination': 'Destino',\n 'inventory.stock.document': 'Documento',\n 'inventory.stock.documentNumber': 'Número do Documento',\n 'inventory.stock.entry': 'Entrada de Estoque',\n 'inventory.stock.entryDesc': 'Recebimento de mercadorias',\n 'inventory.stock.entryLabel': 'Entrada',\n 'inventory.stock.exit': 'Saída de Estoque',\n 'inventory.stock.exitDesc': 'Uso ou venda',\n 'inventory.stock.exitLabel': 'Saída',\n 'inventory.stock.expirationDate': 'Data de Validade',\n 'inventory.stock.fromLocation': 'Local de Origem',\n 'inventory.stock.locationLabel': 'Local',\n 'inventory.stock.lossDesc': 'Desperdício ou dano',\n 'inventory.stock.lossLabel': 'Perda',\n 'inventory.stock.movement': 'Movimentação de Estoque',\n 'inventory.stock.movementDetails': 'Detalhes da Movimentação',\n 'inventory.stock.movementType': 'Tipo de movimentação',\n 'inventory.stock.next': 'Próximo',\n 'inventory.stock.notes': 'Observações',\n 'inventory.stock.product': 'Produto',\n 'inventory.stock.quantity': 'Quantidade *',\n 'inventory.stock.quantityLabel': 'Quantidade',\n 'inventory.stock.reason': 'Motivo *',\n 'inventory.stock.reasonLabel': 'Motivo',\n 'inventory.stock.recordMovement': 'Registrar Movimentação',\n 'inventory.stock.recorded': 'Registrado',\n 'inventory.stock.recording': 'Registrando...',\n 'inventory.stock.searchProduct': 'Buscar por nome, SKU ou código de barras...',\n 'inventory.stock.stepOf': 'Etapa {{step}} de 3',\n 'inventory.stock.supplier': 'Fornecedor',\n 'inventory.stock.toLocation': 'Local de Destino *',\n 'inventory.stock.total': 'Total',\n 'inventory.stock.totalCost': 'Custo Total',\n 'inventory.stock.transferDesc': 'Entre locais',\n 'inventory.stock.transferLabel': 'Transferência',\n 'inventory.stock.unitCost': 'Custo Unitário',\n 'inventory.stock.unitCostLabel': 'Custo Unitário',\n 'inventory.onboarding.welcome': 'Bem-vindo ao Estoque',\n 'inventory.onboarding.description': 'Acompanhe produtos, gerencie níveis de estoque e monitore movimentações do seu negócio.',\n 'inventory.onboarding.skip': 'Pular configuração',\n 'inventory.onboarding.getStarted': 'Começar',\n 'inventory.onboarding.units.title': 'Unidades de Medida',\n 'inventory.onboarding.units.description': 'Unidades padrão (Unidade, Caixa, Kg, L, etc.) estão prontas. Personalize-as a qualquer momento em Configurações.',\n 'inventory.onboarding.locations.title': 'Locais de Estoque',\n 'inventory.onboarding.locations.description': 'Um local de armazenamento padrão foi criado. Adicione mais para controle multi-local.',\n 'inventory.onboarding.start': 'Começar a usar Estoque',\n\n // financial.quickActions / cash\n 'financial.quickActions.newPayable': 'Nova Conta a Pagar',\n 'financial.quickActions.newPayableDesc': 'Registrar uma despesa ou conta a pagar',\n 'financial.quickActions.newReceivable': 'Nova Conta a Receber',\n 'financial.quickActions.newReceivableDesc': 'Registrar receita ou valor a receber',\n 'financial.quickActions.openCashRegister': 'Abrir Caixa',\n 'financial.quickActions.openCashRegisterDesc': 'Iniciar uma nova sessão de caixa',\n\n 'financial.cash.title': 'Caixa Registradora',\n 'financial.cash.subtitle': 'Abrir, contar e fechar sessões de caixa',\n 'financial.cash.bills': 'Notas',\n 'financial.cash.coins': 'Moedas',\n 'financial.cash.noAccounts': 'Nenhuma conta de caixa encontrada. Crie uma conta bancária do tipo \"Caixa Registradora\" primeiro.',\n 'financial.cash.confirmOpening': 'Confirmar Abertura de Caixa',\n 'financial.cash.register': 'Caixa',\n 'financial.cash.openingBalance': 'Saldo de Abertura',\n 'financial.cash.method': 'Método',\n 'financial.cash.denominationCount': 'Contagem de cédulas',\n 'financial.cash.notes': 'Observações',\n 'financial.cash.opening': 'Abrindo...',\n 'financial.cash.confirmAndOpen': 'Confirmar e Abrir',\n 'financial.cash.quickAmount': 'Valor Rápido',\n 'financial.cash.countBillsCoins': 'Contar Cédulas e Moedas',\n 'financial.cash.count': 'Contar',\n 'financial.cash.countedTotal': 'Total Contado',\n 'financial.cash.addNotes': 'Adicionar observações',\n 'financial.cash.openingObservations': 'Observações de abertura...',\n 'financial.cash.openSession': 'Abrir Sessão',\n 'financial.cash.closingBalance': 'Saldo de Fechamento',\n 'financial.cash.differenceFromOpening': 'Diferença da abertura',\n 'financial.cash.closingNotes': 'Observações de Fechamento',\n 'financial.cash.closingObservations': 'Observações de fechamento...',\n 'financial.cash.closing': 'Fechando...',\n 'financial.cash.closeSession': 'Fechar Sessão',\n 'financial.cash.openSessions': 'Sessões Abertas',\n 'financial.cash.opened': 'Aberto',\n 'financial.cash.by': 'por',\n 'financial.cash.closeThisSession': 'Fechar esta sessão',\n 'financial.cash.sessionHistory': 'Histórico de Sessões',\n 'financial.cash.noClosedSessions': 'Nenhuma sessão fechada ainda',\n 'financial.cash.openLabel': 'Abertura',\n 'financial.cash.closeLabel': 'Fechamento',\n 'financial.cash.diff': 'Dif',\n 'financial.cash.openAnother': 'Abrir outro caixa',\n\n // crm.quickActions / settings / onboarding\n 'crm.quickActions.newLead': 'Novo Lead',\n 'crm.quickActions.newLeadDesc': 'Capturar um novo lead',\n 'crm.quickActions.newDeal': 'Novo Negócio',\n 'crm.quickActions.newDealDesc': 'Criar um negócio no pipeline',\n 'crm.quickActions.newQuote': 'Novo Orçamento',\n 'crm.quickActions.newQuoteDesc': 'Enviar uma proposta',\n 'crm.quickActions.logActivity': 'Registrar Atividade',\n 'crm.quickActions.logActivityDesc': 'Registrar ligação, e-mail ou nota',\n\n 'crm.settingsPage.title': 'Configurações de Vendas e CRM',\n 'crm.settingsPage.subtitle': 'Configurar pipeline, gestão de leads e registros',\n 'crm.settingsPage.pipeline': 'Pipeline',\n\n 'crm.onboarding.welcome': 'Bem-vindo ao Vendas e CRM',\n 'crm.onboarding.description': 'Acompanhe leads, gerencie seu pipeline de vendas e feche mais negócios.',\n 'crm.onboarding.sources.title': 'Fontes de Leads',\n 'crm.onboarding.sources.description': 'Fontes padrão (Instagram, WhatsApp, Google, etc.) estão prontas. Personalize-as em Configurações.',\n 'crm.onboarding.pipeline.title': 'Pipeline de Vendas',\n 'crm.onboarding.pipeline.description': 'Seu pipeline padrão com 7 estágios está configurado. Personalize estágios e probabilidades a qualquer momento.',\n 'crm.onboarding.startSelling': 'Começar a vender',\n 'crm.onboarding.getStarted': 'Começar',\n 'crm.onboarding.next': 'Próximo',\n 'crm.onboarding.skip': 'Pular configuração',\n\n 'crm.settings.leadManagement': 'Gestão de Leads',\n 'crm.settings.leadManagementDesc': 'Como leads são capturados e gerenciados',\n 'crm.settings.autoAssign': 'Auto-atribuir leads',\n 'crm.settings.autoAssignDesc': 'Atribuir automaticamente novos leads a membros disponíveis da equipe',\n 'crm.settings.requireSource': 'Exigir fonte do lead',\n 'crm.settings.requireSourceDesc': 'Tornar obrigatória a seleção de fonte ao capturar leads',\n 'crm.settings.leadScoring': 'Pontuação de leads',\n 'crm.settings.leadScoringDesc': 'Pontuar automaticamente leads com base em sinais de engajamento',\n 'crm.settings.duplicateDetection': 'Detecção de duplicatas',\n 'crm.settings.duplicateDetectionDesc': 'Avisar quando um lead com o mesmo e-mail ou telefone já existir',\n 'crm.settings.deals': 'Negócios',\n 'crm.settings.dealsDesc': 'Comportamento do pipeline de negócios',\n 'crm.settings.autoCreateDeal': 'Auto-criar negócio na conversão',\n 'crm.settings.autoCreateDealDesc': 'Criar um negócio automaticamente quando um lead é qualificado',\n 'crm.settings.requireCloseDate': 'Exigir data de fechamento prevista',\n 'crm.settings.requireCloseDateDesc': 'Tornar obrigatória a data de fechamento prevista nos negócios',\n 'crm.settings.rottingDeals': 'Aviso de negócios parados',\n 'crm.settings.rottingDealsDesc': 'Destacar negócios que não foram atualizados há X dias',\n 'crm.settings.weightedPipeline': 'Valor ponderado do pipeline',\n 'crm.settings.weightedPipelineDesc': 'Calcular valor do pipeline usando probabilidade do estágio',\n 'crm.settings.quotes': 'Orçamentos',\n 'crm.settings.quotesDesc': 'Comportamento de orçamentos e propostas',\n 'crm.settings.autoNumberQuotes': 'Numeração automática de orçamentos',\n 'crm.settings.autoNumberQuotesDesc': 'Gerar automaticamente números sequenciais de orçamentos',\n 'crm.settings.defaultValidity': 'Validade padrão (30 dias)',\n 'crm.settings.defaultValidityDesc': 'Novos orçamentos expiram após 30 dias por padrão',\n 'crm.settings.requireApproval': 'Exigir aprovação',\n 'crm.settings.requireApprovalDesc': 'Orçamentos precisam de aprovação do gerente antes do envio',\n 'crm.settings.notifications': 'Notificações',\n 'crm.settings.notificationsDesc': 'Alertas e lembretes',\n 'crm.settings.overdueAlerts': 'Alertas de atividades atrasadas',\n 'crm.settings.overdueAlertsDesc': 'Notificar quando atividades passarem da data de vencimento',\n 'crm.settings.stageChangeAlerts': 'Alertas de mudança de estágio',\n 'crm.settings.stageChangeAlertsDesc': 'Notificar quando negócios mudarem de estágio',\n 'crm.settings.newLeadNotif': 'Notificação de novo lead',\n 'crm.settings.newLeadNotifDesc': 'Alertar equipe quando um novo lead é capturado',\n\n 'crm.pipelineSettings.title': 'Estágios do Pipeline',\n 'crm.pipelineSettings.description': 'Defina os estágios pelos quais os negócios passam. Arraste para reordenar.',\n 'crm.pipelineSettings.probability': 'Probabilidade',\n 'crm.pipelineSettings.winStage': 'Estágio de ganho',\n 'crm.pipelineSettings.lossStage': 'Estágio de perda',\n 'crm.pipelineSettings.customizationNote': 'A personalização dos estágios do pipeline (adicionar, remover, reordenar, editar cores e probabilidades) estará disponível quando conectado ao banco de dados.',\n\n // inventory.quickActions / settings\n 'inventory.quickActions.newProduct': 'Novo Produto',\n 'inventory.quickActions.newProductDesc': 'Adicionar um produto ao catálogo',\n 'inventory.quickActions.stockEntry': 'Entrada de Estoque',\n 'inventory.quickActions.stockEntryDesc': 'Registrar mercadorias recebidas',\n 'inventory.quickActions.stockExit': 'Saída de Estoque',\n 'inventory.quickActions.stockExitDesc': 'Registrar mercadorias usadas ou vendidas',\n\n 'inventory.settingsPage.title': 'Configurações de Estoque',\n 'inventory.settingsPage.subtitle': 'Gerenciar unidades, categorias e locais de estoque',\n\n 'inventory.settings.stockManagement': 'Gestão de Estoque',\n 'inventory.settings.stockManagementDesc': 'Como os níveis de estoque são rastreados',\n 'inventory.settings.lowStockAlerts': 'Alertas de estoque baixo',\n 'inventory.settings.lowStockAlertsDesc': 'Mostrar avisos quando produtos ficarem abaixo da quantidade mínima',\n 'inventory.settings.requireReason': 'Exigir motivo para ajustes',\n 'inventory.settings.requireReasonDesc': 'Tornar obrigatório o motivo para ajustes e perdas de estoque',\n 'inventory.settings.autoDeduct': 'Auto-deduzir no serviço',\n 'inventory.settings.autoDeductDesc': 'Deduzir automaticamente produtos quando um serviço é executado',\n 'inventory.settings.products': 'Produtos',\n 'inventory.settings.productsDesc': 'Comportamento do catálogo de produtos',\n 'inventory.settings.requireSku': 'Exigir SKU',\n 'inventory.settings.requireSkuDesc': 'Tornar SKU obrigatório ao criar produtos',\n 'inventory.settings.allowNegative': 'Permitir estoque negativo',\n 'inventory.settings.allowNegativeDesc': 'Permitir que quantidades de estoque fiquem abaixo de zero',\n 'inventory.settings.notifications': 'Notificações',\n 'inventory.settings.notificationsDesc': 'Alertas e lembretes',\n 'inventory.settings.lowStockEmail': 'Alertas de estoque baixo por e-mail',\n 'inventory.settings.lowStockEmailDesc': 'Enviar e-mail quando produtos atingirem a quantidade mínima',\n 'inventory.settings.expiryWarnings': 'Avisos de validade',\n 'inventory.settings.expiryWarningsDesc': 'Alertar antes de produtos vencerem (rastreamento de lotes)',\n\n // inventory.productForm\n 'inventory.productForm.newProduct': 'Novo Produto',\n 'inventory.productForm.editProduct': 'Editar Produto',\n 'inventory.productForm.updateDetails': 'Atualizar detalhes do produto',\n 'inventory.productForm.addToCatalog': 'Adicionar um produto ao seu catálogo',\n 'inventory.productForm.cancel': 'Cancelar',\n 'inventory.productForm.save': 'Salvar',\n 'inventory.productForm.saving': 'Salvando...',\n 'inventory.productForm.generalInfo': 'Informações Gerais',\n 'inventory.productForm.name': 'Nome',\n 'inventory.productForm.namePlaceholder': 'Nome do produto',\n 'inventory.productForm.brand': 'Marca',\n 'inventory.productForm.brandPlaceholder': 'Nome da marca',\n 'inventory.productForm.sku': 'SKU',\n 'inventory.productForm.skuPlaceholder': 'Código interno',\n 'inventory.productForm.barcode': 'Código de Barras',\n 'inventory.productForm.barcodePlaceholder': 'EAN / UPC',\n 'inventory.productForm.description': 'Descrição',\n 'inventory.productForm.descriptionPlaceholder': 'Informações adicionais sobre o produto',\n 'inventory.productForm.classification': 'Classificação',\n 'inventory.productForm.classificationDesc': 'Como este produto é usado no seu negócio',\n 'inventory.productForm.typeIngredient': 'Matéria-prima usada na produção ou serviços',\n 'inventory.productForm.typeSale': 'Vendido diretamente aos clientes',\n 'inventory.productForm.typeIntermediate': 'Produzido internamente a partir de outros itens',\n 'inventory.productForm.typeAsset': 'Ativo fixo para controle patrimonial',\n 'inventory.productForm.pricing': 'Preços',\n 'inventory.productForm.costPrice': 'Preço de Custo',\n 'inventory.productForm.salePrice': 'Preço de Venda',\n 'inventory.productForm.margin': 'Margem',\n 'inventory.productForm.stockLevels': 'Níveis de Estoque',\n 'inventory.productForm.stockLevelsDesc': 'Limites mínimo e máximo para alertas',\n 'inventory.productForm.minQuantity': 'Quantidade Mínima',\n 'inventory.productForm.minQuantityHint': 'Alertar quando o estoque ficar abaixo deste valor',\n 'inventory.productForm.maxQuantity': 'Quantidade Máxima',\n 'inventory.productForm.maxQuantityHint': 'Capacidade máxima para este produto',\n 'inventory.productForm.optional': 'Opcional',\n\n // inventory.productList\n 'inventory.productList.title': 'Produtos',\n 'inventory.productList.subtitle': '{{count}} produtos',\n 'inventory.productList.product': 'Produto',\n 'inventory.productList.type': 'Tipo',\n 'inventory.productList.stock': 'Estoque',\n 'inventory.productList.cost': 'Custo',\n 'inventory.productList.value': 'Valor',\n 'inventory.productList.searchPlaceholder': 'Buscar produtos...',\n 'inventory.productList.newProduct': 'Novo Produto',\n 'inventory.productList.empty': 'Nenhum produto ainda',\n 'inventory.productList.createFirst': 'Crie seu primeiro produto',\n\n // inventory.stock (additional keys)\n 'inventory.stock.unknownProduct': 'Produto Desconhecido',\n 'inventory.stock.reasonLossPlaceholder': 'ex. Vencido, danificado',\n 'inventory.stock.reasonAdjustPlaceholder': 'ex. Correção de contagem física',\n 'inventory.stock.documentPlaceholder': 'Nota fiscal, recibo, PO...',\n 'inventory.stock.batchPlaceholder': 'ex. LOT001',\n 'inventory.stock.notesPlaceholder': 'Observações adicionais...',\n\n // inventory.recipeDetail (additional keys)\n 'inventory.recipeDetail.loading': 'Carregando...',\n 'inventory.recipeDetail.ingredient': 'Ingrediente',\n 'inventory.recipeDetail.quantity': 'Quantidade',\n 'inventory.recipeDetail.unit': 'Unidade',\n 'inventory.recipeDetail.notes': 'Observações',\n 'inventory.recipeDetail.created': 'Criado',\n 'inventory.recipeDetail.updated': 'Atualizado',\n\n // inventory.recipeForm\n 'inventory.recipeForm.newRecipe': 'Nova Receita',\n 'inventory.recipeForm.subtitle': 'Definir uma fórmula de produção',\n 'inventory.recipeForm.cancel': 'Cancelar',\n 'inventory.recipeForm.saveRecipe': 'Salvar Receita',\n 'inventory.recipeForm.saving': 'Salvando...',\n 'inventory.recipeForm.recipeDetails': 'Detalhes da Receita',\n 'inventory.recipeForm.recipeName': 'Nome da Receita',\n 'inventory.recipeForm.recipeNamePlaceholder': 'ex. Molho de Tomate',\n 'inventory.recipeForm.description': 'Descrição',\n 'inventory.recipeForm.descriptionPlaceholder': 'Breve descrição...',\n 'inventory.recipeForm.produces': 'Produz (Produto)',\n 'inventory.recipeForm.searchProduct': 'Buscar produto...',\n 'inventory.recipeForm.createProduct': 'Criar produto',\n 'inventory.recipeForm.yieldQuantity': 'Quantidade de Rendimento',\n 'inventory.recipeForm.prepTime': 'Tempo de Preparo (min)',\n 'inventory.recipeForm.instructions': 'Instruções',\n 'inventory.recipeForm.instructionsPlaceholder': 'Instruções de preparo passo a passo...',\n 'inventory.recipeForm.ingredients': 'Ingredientes',\n 'inventory.recipeForm.addIngredient': 'Adicionar Ingrediente',\n 'inventory.recipeForm.noIngredients': 'Nenhum ingrediente adicionado',\n 'inventory.recipeForm.addFirstIngredient': 'Adicione seu primeiro ingrediente',\n 'inventory.recipeForm.ingredient': 'Ingrediente',\n 'inventory.recipeForm.quantity': 'Quantidade',\n 'inventory.recipeForm.notes': 'Observações',\n 'inventory.recipeForm.searchIngredient': 'Buscar ingrediente...',\n 'inventory.recipeForm.createIngredient': 'Criar ingrediente',\n 'inventory.recipeForm.notesPlaceholder': 'ex. picado, fresco',\n 'inventory.recipeForm.ingredientsConfigured': '{{configured}} de {{total}} ingredientes configurados',\n\n // settings.plugin\n 'settings.plugin.agenda': 'Agenda',\n 'settings.plugin.financial': 'Financeiro',\n 'settings.plugin.inventory': 'Estoque',\n 'settings.plugin.crm': 'Vendas & CRM',\n\n // financial.invoice status labels\n 'financial.invoice.statusOpen': 'Aberto',\n 'financial.invoice.statusPartial': 'Parcial',\n 'financial.invoice.statusPaid': 'Pago',\n 'financial.invoice.statusOverdue': 'Vencido',\n 'financial.invoice.statusCancelled': 'Cancelado',\n 'financial.invoice.statusPending': 'Pendente',\n 'financial.invoice.statusDraft': 'Rascunho',\n\n // financial.invoice column / detail labels\n 'financial.invoice.columnDate': 'Data',\n 'financial.invoice.columnDescription': 'Descrição',\n 'financial.invoice.columnAmount': 'Valor',\n 'financial.invoice.columnPaid': 'Pago',\n 'financial.invoice.columnStatus': 'Status',\n 'financial.invoice.columnInst': 'Parc.',\n 'financial.invoice.columnQty': 'Qtd',\n 'financial.invoice.columnUnitPrice': 'Preço Unit.',\n 'financial.invoice.columnTotal': 'Total',\n 'financial.invoice.columnNumber': '#',\n 'financial.invoice.invoice': 'Fatura',\n 'financial.invoice.loading': 'Carregando...',\n\n // financial.invoiceForm extra labels\n 'financial.invoiceForm.cancelInvoice': 'Cancelar Fatura',\n 'financial.invoiceForm.cancelConfirm': 'Esta ação não pode ser desfeita.',\n 'financial.invoiceForm.cancelDesc': 'A fatura será marcada como cancelada. Todas as parcelas pendentes também serão canceladas.',\n 'financial.invoiceForm.keepInvoice': 'Manter Fatura',\n 'financial.invoiceForm.yesCancel': 'Sim, Cancelar',\n 'financial.invoiceForm.cancelling': 'Cancelando...',\n 'financial.invoiceForm.removeAdjustments': 'Remover ajustes',\n 'financial.invoiceForm.discount': 'Desconto',\n 'financial.invoiceForm.surcharge': 'Acréscimo',\n 'financial.invoiceForm.total': 'Total:',\n 'financial.invoiceForm.itemCount': '{{count}} item{{plural}}',\n\n // financial.payment extra labels\n 'financial.payment.account': 'Conta',\n 'financial.payment.due': 'Venc.:',\n 'financial.payment.paidAmount': 'Pago:',\n 'financial.payment.paidOn': 'Pago em:',\n\n // crud.archetype — detail tab strings\n 'crud.archetype.comingSoon': 'Em Breve',\n\n // Person tabs\n 'crud.archetype.access.title': 'Acesso e Permissões',\n 'crud.archetype.access.description': 'Gerencie credenciais de login, atribua perfis de permissão e controle o que esta pessoa pode acessar no sistema.',\n 'crud.access.accountStatus': 'Status da Conta',\n 'crud.access.statusLinked': 'Ativo',\n 'crud.access.statusPending': 'Convite pendente',\n 'crud.access.statusAccepted': 'Aceito',\n 'crud.access.statusExpired': 'Convite expirado',\n 'crud.access.statusRevoked': 'Revogado',\n 'crud.access.acceptedAt': 'Aceito em {{date}}',\n 'crud.access.revokedDesc': 'O acesso foi revogado. Você pode enviar um novo convite.',\n 'crud.access.grantAccess': 'Conceder Acesso',\n 'crud.access.account': 'Conta',\n 'crud.access.accountDesc': 'Credenciais de login e status da conta desta pessoa.',\n 'crud.access.resetPassword': 'Redefinir Senha',\n 'crud.access.passwordResetSent': 'E-mail de redefinição de senha enviado.',\n 'crud.access.profileUpdated': 'Perfil de permissão atualizado.',\n 'crud.access.inviteResent': 'Convite reenviado.',\n 'crud.access.inviteRevoked': 'Convite revogado.',\n 'crud.access.accessRemoved': 'Acesso removido.',\n 'crud.access.dangerZone': 'Zona de Perigo',\n 'crud.access.dangerZoneDesc': 'Ações irreversíveis que afetam o acesso desta pessoa ao sistema.',\n 'crud.access.removeAccess': 'Remover Acesso',\n 'crud.access.revokeInvite': 'Revogar Convite',\n 'crud.access.confirmRemoveTitle': 'Tem certeza?',\n 'crud.access.confirmRemoveDesc': 'Esta pessoa perderá todo o acesso ao sistema imediatamente. Esta ação não pode ser desfeita.',\n 'crud.access.accountLinked': 'Conta vinculada',\n 'crud.access.noAccount': 'Nenhuma conta vinculada',\n 'crud.access.noAccountDesc': 'Esta pessoa não possui uma conta de acesso e não pode entrar no sistema.',\n 'crud.access.setupDesc': 'Configure o acesso ao sistema para esta pessoa informando o e-mail e escolhendo um perfil de permissão.',\n 'crud.access.emailPlaceholder': 'pessoa@exemplo.com',\n 'crud.access.sendInvite': 'Enviar Convite',\n 'crud.access.invitePending': 'Convite pendente',\n 'crud.access.inviteSent': 'Convite enviado em {{date}}',\n 'crud.access.permissionProfile': 'Perfil de Permissão',\n 'crud.access.profileDesc': 'Defina o que esta pessoa pode acessar e fazer no sistema.',\n 'crud.access.systemAccess': 'Acesso ao Sistema',\n 'crud.access.effectivePermissions': 'Permissões Efetivas',\n 'crud.access.effectiveDesc': 'O que esta pessoa pode fazer com base no perfil atribuído.',\n 'crud.access.feature': 'Funcionalidade',\n 'crud.access.joined': 'Entrou em {{date}}',\n 'crud.access.noEmail': 'Sem endereço de e-mail',\n 'crud.access.noEmailDesc': 'Adicione um endereço de e-mail a esta pessoa para vinculá-la a uma conta do sistema.',\n 'crud.access.manageTeam': 'Gerenciar Equipe',\n 'crud.access.manageBilling': 'Gerenciar Faturamento',\n 'crud.access.manageSettings': 'Gerenciar Configurações',\n 'crud.access.managePermissions': 'Gerenciar Permissões',\n 'crud.archetype.activity.title': 'Linha do Tempo',\n 'crud.archetype.activity.description': 'Veja um registro cronológico de todas as ações, alterações e eventos relacionados a esta pessoa.',\n 'crud.archetype.documents.title': 'Documentos',\n 'crud.archetype.documents.description': 'Anexe e gerencie arquivos, contratos, certificações e outros documentos desta pessoa.',\n 'crud.archetype.schedule.title': 'Agenda',\n 'crud.archetype.schedule.description': 'Visualize e gerencie compromissos, turnos e disponibilidade desta pessoa.',\n\n // Product tabs\n 'crud.archetype.inventory.title': 'Estoque',\n 'crud.archetype.inventory.description': 'Acompanhe níveis de estoque, histórico de movimentação, alertas de reposição e gerencie o inventário entre locais.',\n 'crud.archetype.suppliers.title': 'Fornecedores',\n 'crud.archetype.suppliers.description': 'Veja e gerencie quais fornecedores oferecem este produto, compare custos e acompanhe pedidos de compra.',\n 'crud.archetype.pricing.title': 'Histórico de Preços',\n 'crud.archetype.pricing.description': 'Veja alterações de preço ao longo do tempo, gerencie preços promocionais e defina preços por local.',\n 'crud.archetype.productActivity.title': 'Atividade',\n 'crud.archetype.productActivity.description': 'Veja um registro de todas as alterações, ajustes de estoque e eventos relacionados a este produto.',\n\n // Service tabs\n 'crud.archetype.availability.title': 'Disponibilidade',\n 'crud.archetype.availability.description': 'Configure quando este serviço pode ser agendado, defina regras de duração e gerencie limites de capacidade.',\n 'crud.archetype.servicePricing.title': 'Faixas de Preço',\n 'crud.archetype.servicePricing.description': 'Gerencie faixas de preço, descontos para membros e preços por local para este serviço.',\n 'crud.archetype.serviceActivity.title': 'Atividade',\n 'crud.archetype.serviceActivity.description': 'Veja um registro de todos os agendamentos, alterações e eventos relacionados a este serviço.',\n\n // Location tabs\n 'crud.archetype.members.title': 'Equipe',\n 'crud.archetype.members.description': 'Veja e gerencie a equipe atribuída a este local, seus cargos e horários.',\n 'crud.archetype.locationSchedule.title': 'Horário de Funcionamento',\n 'crud.archetype.locationSchedule.description': 'Defina horário comercial, feriados e horários especiais para este local.',\n 'crud.archetype.locationStats.title': 'Estatísticas',\n 'crud.archetype.locationStats.description': 'Veja métricas de desempenho, faturamento e atividade deste local.',\n 'crud.archetype.locationActivity.title': 'Atividade',\n 'crud.archetype.locationActivity.description': 'Veja um registro de todos os eventos, alterações e operações neste local.',\n\n // Subject tabs\n 'crud.archetype.owner.noOwner': 'Nenhum responsável atribuído',\n 'crud.archetype.owner.assignHint': 'Edite este registro para atribuir um responsável.',\n 'crud.archetype.owner.name': 'Nome',\n 'crud.archetype.owner.phone': 'Telefone',\n 'crud.archetype.owner.email': 'E-mail',\n 'crud.archetype.owner.document': 'Documento',\n 'crud.archetype.owner.address': 'Endereço',\n 'crud.archetype.owner.active': 'Ativo',\n 'crud.archetype.owner.inactive': 'Inativo',\n 'crud.archetype.history.title': 'Histórico',\n 'crud.archetype.history.description': 'Veja o histórico de visitas, relatórios anteriores, tratamentos e linha do tempo de eventos.',\n 'crud.archetype.subjectDocuments.title': 'Documentos',\n 'crud.archetype.subjectDocuments.description': 'Anexe e gerencie arquivos, resultados de exames, imagens e certificados.',\n\n // schedule.days\n 'schedule.days.sun': 'Dom',\n 'schedule.days.mon': 'Seg',\n 'schedule.days.tue': 'Ter',\n 'schedule.days.wed': 'Qua',\n 'schedule.days.thu': 'Qui',\n 'schedule.days.fri': 'Sex',\n 'schedule.days.sat': 'Sáb',\n\n // schedule.editor\n 'schedule.editor.weeklyTitle': 'Horário de Trabalho Semanal',\n 'schedule.editor.weeklyDescription': 'Defina quando este profissional está regularmente disponível',\n 'schedule.editor.unavailable': 'Indisponível',\n 'schedule.editor.newInterval': 'Novo intervalo para {{day}}',\n 'schedule.editor.addHoursFor': 'Adicionar horários para {{day}}',\n 'schedule.editor.removeInterval': 'Remover intervalo',\n 'schedule.editor.copyToAll': 'Copiar para todos os dias',\n 'schedule.editor.bufferTooltip': 'Tempo de intervalo entre atendimentos',\n 'schedule.editor.min': 'min',\n 'schedule.editor.exceptionsTitle': 'Exceções de Data',\n 'schedule.editor.exceptionsDescription': 'Substituir horário de trabalho para datas específicas',\n 'schedule.editor.addException': 'Adicionar Exceção',\n 'schedule.editor.noExceptions': 'Nenhuma exceção de data configurada',\n 'schedule.editor.startDate': 'Data de início',\n 'schedule.editor.endDate': 'Data de término',\n 'schedule.editor.type': 'Tipo',\n 'schedule.editor.customHours': 'Horário personalizado',\n 'schedule.editor.workingHours': 'Horário de trabalho',\n 'schedule.editor.to': 'até',\n 'schedule.editor.addTimeBlock': 'Adicionar bloco de horário',\n 'schedule.editor.notes': 'Observações',\n 'schedule.editor.notesPlaceholder': 'ex. Férias, Feriado, Treinamento...',\n 'schedule.editor.saveException': 'Salvar Exceção',\n 'schedule.editor.removeException': 'Remover exceção',\n 'schedule.editor.failedToLoad': 'Falha ao carregar agenda',\n 'schedule.editor.saved': 'Horário de trabalho salvo',\n 'schedule.editor.failedToSave': 'Falha ao salvar',\n 'schedule.editor.selectStartDate': 'Selecione uma data de início',\n 'schedule.editor.endDateAfterStart': 'A data de término deve ser posterior à data de início',\n 'schedule.editor.exceptionAdded': 'Exceção adicionada',\n 'schedule.editor.failedToSaveException': 'Falha ao salvar exceção',\n 'schedule.editor.exceptionRemoved': 'Exceção removida',\n 'schedule.editor.failedToDelete': 'Falha ao excluir',\n\n // schedule.blockSettings\n 'schedule.blockSettings.title': 'Configurações do Bloco',\n 'schedule.blockSettings.location': 'Local',\n 'schedule.blockSettings.noLocation': 'Sem local',\n 'schedule.blockSettings.maxConcurrent': 'Máx. simultâneos',\n 'schedule.blockSettings.minAdvance': 'Antecedência mín.',\n 'schedule.blockSettings.maxAdvance': 'Antecedência máx.',\n 'schedule.blockSettings.hrs': 'hrs',\n 'schedule.blockSettings.days': 'dias',\n 'schedule.blockSettings.label': 'Rótulo',\n 'schedule.blockSettings.labelPlaceholder': 'ex. Manhã – Apenas cortes',\n 'schedule.blockSettings.allowedServices': 'Serviços permitidos',\n 'schedule.blockSettings.allServices': 'Todos os serviços',\n 'schedule.blockSettings.oneService': '1 serviço',\n 'schedule.blockSettings.nServices': '{{count}} serviços',\n\n // registry — inventory\n 'registry.suppliers': 'Fornecedor',\n 'registry.suppliers.description': 'Gerencie seus fornecedores de produtos e materiais',\n 'registry.product-categories': 'Categoria de Produto',\n 'registry.product-categories.description': 'Categorias de produtos para organização',\n 'registry.stock-locations': 'Local de Estoque',\n 'registry.stock-locations.description': 'Locais físicos de armazenamento do estoque',\n 'registry.measurement-units': 'Unidade de Medida',\n 'registry.measurement-units.description': 'Unidades padrão de medida',\n\n // registry — financial\n 'registry.payment-methods': 'Método de Pagamento',\n 'registry.chart-of-accounts': 'Plano de Contas',\n 'registry.cost-centers': 'Centro de Custo',\n 'registry.bank-accounts': 'Conta Bancária',\n 'registry.commission-rules': 'Regra de Comissão',\n 'registry.price-tables': 'Tabela de Preços',\n 'registry.price-variations': 'Variação de Preço',\n 'registry.payment-method-types': 'Tipo de Pagamento',\n 'registry.card-brands': 'Bandeira de Cartão',\n\n // registry — crm\n 'registry.lead-sources': 'Origem de Lead',\n 'registry.tags': 'Tag',\n 'registry.activity-types': 'Tipo de Atividade',\n\n // org.connectionError\n 'org.connectionError.title': 'Falha na conexão',\n 'org.connectionError.description': 'Não foi possível conectar ao servidor. Verifique sua conexão com a internet e tente novamente.',\n 'org.connectionError.retry': 'Tentar novamente',\n\n // app.mockMode\n 'app.mockMode.banner': 'Você está no modo offline. Os dados exibidos podem não estar atualizados.',\n },\n}\n","import React from 'react'\nimport { useThemeStore } from './stores/theme.store'\nimport { useBillingStore } from './stores/billing.store'\nimport { useAuthStore } from './stores/auth.store'\nimport { usePermissionsStore } from './stores/permissions.store'\nimport { createSupabaseClient, getSupabaseClientOptional } from './lib/supabase'\nimport { setEntityRouteMap, resolveEntityHref } from './lib/entity-routes'\nimport { ToastProvider } from './components/notifications/ToastProvider'\nimport { RouterProvider, setGlobalRouter, hashRouterAdapter, type RouterAdapter } from './lib/router'\nimport { AppShell } from '@fayz-ai/ui'\nimport type { NavigationItem as UiNavigationItem } from '@fayz-ai/ui'\nimport { MockModeBanner } from './components/layout/MockModeBanner'\nimport { WidgetSlot } from '../plugins/WidgetSlot'\nimport { SettingsPage } from './components/settings/SettingsPage'\nimport { BillingPage } from './components/billing/BillingPage'\nimport { ChatFab } from './components/chat/ChatFab'\nimport { ChatPanel } from './components/chat/ChatPanel'\nimport { CommandPalette, type CommandItem, type EntitySearchResult, type EntitySearchFn } from './components/layout/CommandPalette'\nimport { useLayoutStore } from './stores/layout.store'\nimport { LoginPage } from './components/auth/LoginPage'\nimport { ProtectedRoute } from './components/auth/ProtectedRoute'\nimport { AuthAdapterProvider } from './lib/auth-context'\nimport { OrgAdapterProvider } from './lib/org-context'\nimport { createMockAuthAdapter } from './lib/auth-adapters/mock'\nimport { createSupabaseAuthAdapter } from './lib/auth-adapters/supabase'\nimport { createMockOrgAdapter } from './lib/org-adapters/mock'\nimport { createSupabaseOrgAdapter } from './lib/org-adapters/supabase'\nimport { OrgSwitcher } from './components/organization/OrgSwitcher'\nimport { OrgInitializer } from './components/organization/OrgInitializer'\nimport { PermissionGate } from '../permissions/PermissionGate'\nimport { ImpersonationBanner } from './components/organization/ImpersonationBanner'\nimport { TeamTab } from './components/organization/TeamTab'\nimport { PermissionProfilesTab } from './components/organization/PermissionProfilesTab'\nimport { ConnectedLocationsOverview } from './components/settings/ConnectedLocationsOverview'\nimport { LocationsCrudPage } from './components/settings/LocationsCrudPage'\nimport { LocationSwitchOverlay } from './components/layout/LocationSwitchOverlay'\nimport { ConnectedHolidaysSettings } from './components/settings/ConnectedHolidaysSettings'\nimport { ConnectedFieldRulesSettings } from './components/settings/ConnectedFieldRulesSettings'\nimport { Users, ShieldCheck, MapPin, CalendarOff, SlidersHorizontal, Puzzle } from 'lucide-react'\nimport * as LucideIcons from 'lucide-react'\nimport { resolvePluginRuntime, PluginRuntimeProvider } from './lib/plugins'\nimport type { AuthAdapter } from './types/auth-adapter'\nimport type { OrgAdapter } from './types/org-adapter'\nimport type { NavigationItem } from './types/layout'\nimport type { Plan, PlanConfig } from './types/billing'\nimport { normalizePlanConfig } from './types/billing'\nimport type { PluginManifest, TenantPluginBinding } from '@fayz-ai/core'\nimport type {\n PluginPermissionRequirement,\n ResolvedPluginManifest,\n PluginSettingsTab,\n} from './types/plugins'\nimport type { CreateThemeOptions } from './config/theme/utils'\nimport { resolveTheme } from './config/theme/utils'\nimport type { SaasTheme } from './config/theme/tokens'\nimport type { AuthProvider } from './types/auth'\nimport type { PermissionsConfig, PermissionAction } from './types/permissions'\nimport { useOrganizationStore } from './stores/organization.store'\nimport { usePermission } from './hooks/usePermission'\nimport { useTenantPlugins } from './hooks/useTenantPlugins'\nimport { I18nProvider, builtInLocales } from './lib/i18n'\nimport { useLocaleStore } from './stores/locale.store'\nimport { setDefaultCurrency, setCurrentLocale, registerTranslations } from '@fayz-ai/core'\nimport { useTranslation } from './hooks/useTranslation'\n\n// ---------------------------------------------------------------------------\n// Page config — unifies navigation + routing in one declaration\n// ---------------------------------------------------------------------------\nexport interface PageConfig {\n /** URL path, e.g. '/' or '/clients' */\n path: string\n /** Sidebar/nav label */\n label: string\n /** Lucide icon name */\n icon: string\n /** The page component to render */\n component: React.ComponentType\n /** Navigation section (default: 'main') */\n section?: 'main' | 'secondary' | 'settings'\n /** Sort order within section (auto-incremented if omitted) */\n position?: number\n /** Optional badge */\n badge?: string | number\n /** Permission required to access this page */\n permission?: { feature: string; action: PermissionAction }\n /** Child pages — renders as a dropdown in topbar, collapsible in sidebar.\n * Children can omit `component` to be navigation-only links (pointing to routes the parent handles). */\n children?: Array<Omit<PageConfig, 'component'> & { component?: React.ComponentType }>\n}\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\nexport interface SaasAppConfig {\n /** App display name (used in sidebar header) */\n name: string\n /** Logo — string renders as initial badge, ReactNode renders as-is */\n logo?: string | React.ReactNode\n /** Supabase project URL — one project per SaaS (core in saas_core schema, data in public) */\n supabaseUrl?: string\n /** Supabase anon key */\n supabaseAnonKey?: string\n /** Theme overrides — use SaasTheme (friendly) or CreateThemeOptions (granular) */\n theme?: CreateThemeOptions | SaasTheme\n /** Default theme mode: 'light' or 'dark'. User can toggle. Default: 'light' */\n defaultThemeMode?: 'light' | 'dark'\n /** Layout variant (default: 'sidebar') */\n layout?: 'sidebar' | 'topbar' | 'minimal'\n /** Content floats in a rounded frame over the sidebar background (default: true). Set false to disable. */\n sidebarFrame?: boolean\n /** Vertical-specific pages */\n pages: PageConfig[]\n /** Plugins to register */\n plugins?: PluginManifest[]\n /** Runtime plugin activation for tenant-aware apps */\n pluginRuntime?: {\n /** Opt into loading tenant plugin bindings from the backend RPC. Static apps should leave this off. */\n hydrateTenantPlugins?: boolean\n tenantPlugins?: TenantPluginBinding[]\n resolveTenantPlugins?: (context: {\n tenant: { id: string; slug: string; verticalId?: string; plan?: string } | null\n user: { id: string } | null\n }) => TenantPluginBinding[] | undefined\n }\n /** Router adapter (default: hashRouterAdapter) */\n router?: RouterAdapter\n /** Billing configuration */\n billing?: {\n plans: PlanConfig[]\n stripePublishableKey?: string\n }\n /** AI chat configuration */\n chat?: {\n enabled?: boolean\n systemPrompt?: string\n apiEndpoint?: string\n title?: string\n }\n /** Notification configuration */\n notifications?: {\n changelogUrl?: string\n }\n /** Locale / i18n configuration */\n locale?: {\n default?: string\n supported?: string[]\n translations?: Record<string, Record<string, string>>\n /** ISO 4217 currency code for all currency fields (e.g. 'BRL'). Inferred from locale when omitted. */\n currency?: string\n }\n /** Mock user for demo/dev (will be replaced by auth in production) */\n user?: {\n fullName: string\n email: string\n avatarUrl?: string\n }\n /** Auth configuration */\n auth?: {\n adapter?: AuthAdapter | 'mock' | 'supabase'\n requireAuth?: boolean\n loginLogo?: React.ReactNode\n loginLayout?: 'split' | 'centered'\n loginTagline?: string\n loginDescription?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n }\n /** Organization / multi-tenant configuration */\n organization?: {\n adapter?: OrgAdapter | 'mock' | 'supabase'\n multiOrg?: boolean\n }\n /** Vertical/niche ID — auto-set on tenant creation, skips niche selection in onboarding */\n verticalId?: string\n /** Permission profiles configuration */\n permissions?: PermissionsConfig\n /** Additional settings tabs to merge with built-in ones */\n settingsTabs?: { id: string; label: string; component: React.ReactNode }[]\n /** Set to false to hide built-in Settings page (default: true) */\n showSettings?: boolean\n /** Set to false to hide built-in Billing page (default: true when plans provided) */\n showBilling?: boolean\n /** Custom mobile bottom nav items (max 5). If omitted, auto-picks first main items. */\n bottomNav?: Array<{ label: string; icon: string; route: string }>\n}\n\n// ---------------------------------------------------------------------------\n// Internal: build NavigationItem[] from PageConfig[] + built-ins\n// ---------------------------------------------------------------------------\ntype RouteEntry = {\n component: React.ComponentType<any>\n permission?: PluginPermissionRequirement\n plugin?: ResolvedPluginManifest\n fullBleed?: boolean\n}\n\nfunction sortNavigation(\n navigation: (NavigationItem & { permission?: PluginPermissionRequirement })[],\n): (NavigationItem & { permission?: PluginPermissionRequirement })[] {\n return [...navigation].sort((a, b) => {\n const sectionOrder = { main: 0, secondary: 1, settings: 2 }\n const sa = sectionOrder[a.section] ?? 1\n const sb = sectionOrder[b.section] ?? 1\n if (sa !== sb) return sa - sb\n return a.position - b.position\n })\n}\n\nfunction buildNavigation(\n pages: PageConfig[],\n config: SaasAppConfig\n): { navigation: (NavigationItem & { permission?: PluginPermissionRequirement })[]; routes: Map<string, RouteEntry>; entityRouteMap: Map<string, string> } {\n const navigation: (NavigationItem & { permission?: PluginPermissionRequirement })[] = []\n const routes = new Map<string, RouteEntry>()\n // Maps \"archetype:kind\" (e.g. \"person:staff\") or \"archetype\" to route path\n const entityRouteMap = new Map<string, string>()\n\n // Vertical pages\n let mainPos = 0\n let secondaryPos = 0\n for (const page of pages) {\n const section = page.section ?? 'main'\n const position = page.position ?? (section === 'main' ? mainPos++ : secondaryPos++)\n\n // Build child navigation items + routes\n const childNavItems: NavigationItem[] = []\n if (page.children) {\n for (const child of page.children) {\n childNavItems.push({\n id: child.path.slice(1).replace(/\\//g, '-'),\n label: child.label,\n icon: child.icon,\n route: child.path,\n section,\n position: 0,\n badge: child.badge,\n })\n // Only register route if child has its own component and path isn't already handled\n if (child.component && !routes.has(child.path)) {\n if ((child.component as any)?.__isCrudPage) {\n ;(child.component as any).__crudBasePath = child.path\n const eDef = (child.component as any).__entityDef\n if (eDef?.data?.archetypeKind) {\n entityRouteMap.set(`${eDef.data.archetype ?? ''}:${eDef.data.archetypeKind}`, child.path)\n } else if (eDef?.data?.archetype) {\n entityRouteMap.set(eDef.data.archetype, child.path)\n }\n }\n routes.set(child.path, { component: child.component, permission: child.permission })\n }\n }\n }\n\n navigation.push({\n id: page.path === '/' ? 'home' : page.path.slice(1).replace(/\\//g, '-'),\n label: page.label,\n icon: page.icon,\n route: page.path,\n section,\n position,\n badge: page.badge,\n permission: page.permission,\n ...(childNavItems.length > 0 ? { children: childNavItems } : {}),\n })\n // Set basePath on CRUD pages so they know their mount point\n if ((page.component as any)?.__isCrudPage) {\n ;(page.component as any).__crudBasePath = page.path\n const eDef = (page.component as any).__entityDef\n if (eDef?.data?.archetypeKind) {\n entityRouteMap.set(`${eDef.data.archetype ?? ''}:${eDef.data.archetypeKind}`, page.path)\n } else if (eDef?.data?.archetype) {\n entityRouteMap.set(eDef.data.archetype, page.path)\n }\n }\n routes.set(page.path, { component: page.component, permission: page.permission })\n }\n\n // Built-in Billing page (route exists but no sidebar nav item — accessed via user dropdown)\n const showBilling = config.showBilling ?? (config.billing?.plans && config.billing.plans.length > 0)\n if (showBilling) {\n routes.set('/billing', { component: BillingPage })\n }\n\n // Built-in Settings page (route exists but no sidebar nav item — accessed via user dropdown)\n const showSettings = config.showSettings !== false\n if (showSettings) {\n routes.set('/settings', { component: SettingsPage })\n }\n\n return { navigation: sortNavigation(navigation), routes, entityRouteMap }\n}\n\n// ---------------------------------------------------------------------------\n// Internal: render logo from string or ReactNode\n// ---------------------------------------------------------------------------\n// ---------------------------------------------------------------------------\n// Global entity search — queries persons, products, services in parallel\n// ---------------------------------------------------------------------------\n\nfunction createGlobalEntitySearch(): EntitySearchFn {\n return async (query: string): Promise<EntitySearchResult[]> => {\n const supabase = getSupabaseClientOptional()\n if (!supabase) return []\n\n const term = `%${query}%`\n const limit = 8\n\n const [persons, products, services] = await Promise.all([\n supabase.schema('saas_core').from('persons')\n .select('id, name, email, phone, kind')\n .eq('is_active', true)\n .ilike('name', term)\n .limit(limit)\n .then((r: any) => r.data ?? []),\n supabase.schema('saas_core').from('products')\n .select('id, name, sku, price')\n .eq('is_active', true)\n .ilike('name', term)\n .limit(limit)\n .then((r: any) => r.data ?? []),\n supabase.schema('saas_core').from('services')\n .select('id, name, price, duration_minutes')\n .eq('is_active', true)\n .ilike('name', term)\n .limit(limit)\n .then((r: any) => r.data ?? []),\n ])\n\n const results: EntitySearchResult[] = []\n\n for (const p of persons) {\n const kind = p.kind ? String(p.kind) : 'person'\n const kindLabel = kind.charAt(0).toUpperCase() + kind.slice(1) + 's'\n results.push({\n id: p.id,\n label: p.name,\n subtitle: [p.email, p.phone].filter(Boolean).join(' · ') || undefined,\n group: kindLabel,\n icon: 'User',\n data: { ...p, archetype: 'person' },\n })\n }\n for (const p of products) {\n results.push({\n id: p.id,\n label: p.name,\n subtitle: [p.sku, p.price != null ? `$${p.price}` : null].filter(Boolean).join(' · ') || undefined,\n group: 'Products',\n icon: 'Box',\n data: { ...p, archetype: 'product' },\n })\n }\n for (const s of services) {\n results.push({\n id: s.id,\n label: s.name,\n subtitle: [\n s.duration_minutes ? `${s.duration_minutes}min` : null,\n s.price != null ? `$${s.price}` : null,\n ].filter(Boolean).join(' · ') || undefined,\n group: 'Services',\n icon: 'Sparkles',\n data: { ...s, archetype: 'service' },\n })\n }\n\n return results\n }\n}\n\nfunction CommandPaletteWrapper({ navigation, routerAdapter }: { navigation: NavigationItem[]; routerAdapter: RouterAdapter }) {\n const { commandPaletteOpen, setCommandPaletteOpen } = useLayoutStore()\n\n const entitySearch = React.useMemo(() => createGlobalEntitySearch(), [])\n\n const commands: CommandItem[] = React.useMemo(() => {\n const items: CommandItem[] = []\n for (const nav of navigation) {\n items.push({\n id: nav.id,\n label: nav.label,\n icon: nav.icon,\n group: 'Pages',\n action: () => routerAdapter.navigate(nav.route),\n })\n if ((nav as any).children) {\n for (const child of (nav as any).children) {\n items.push({\n id: child.id,\n label: child.label,\n icon: child.icon,\n group: nav.label,\n action: () => routerAdapter.navigate(child.route),\n })\n }\n }\n }\n // System actions\n items.push(\n { id: 'settings', label: 'Settings', icon: 'Settings', group: 'System', action: () => routerAdapter.navigate('/settings') },\n { id: 'billing', label: 'Billing', icon: 'CreditCard', group: 'System', action: () => routerAdapter.navigate('/billing') },\n )\n return items\n }, [navigation, routerAdapter])\n\n const handleEntitySelect = React.useCallback((result: EntitySearchResult) => {\n const archetype = result.data?.archetype ? String(result.data.archetype) : undefined\n const kind = result.data?.kind ? String(result.data.kind) : undefined\n const href = resolveEntityHref(result.id, archetype, kind)\n routerAdapter.navigate(href)\n }, [routerAdapter])\n\n return React.createElement(CommandPalette, {\n commands,\n open: commandPaletteOpen,\n onOpenChange: setCommandPaletteOpen,\n onEntitySearch: entitySearch,\n onEntitySelect: handleEntitySelect,\n })\n}\n\nfunction renderLogo(name: string, logo?: string | React.ReactNode): React.ReactNode {\n if (logo && typeof logo !== 'string') return logo\n const initial = typeof logo === 'string' ? logo : name.charAt(0).toUpperCase()\n return React.createElement('div', { className: 'flex items-center gap-3' },\n React.createElement('div', {\n className: 'w-8 h-8 rounded-lg bg-primary flex items-center justify-center text-primary-foreground font-bold text-sm',\n }, initial),\n React.createElement('span', { className: 'font-bold text-lg' }, name),\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal: resolve auth adapter from config\n// ---------------------------------------------------------------------------\nfunction resolveAuthAdapter(config: SaasAppConfig): AuthAdapter | null {\n if (!config.auth?.adapter) return null\n if (typeof config.auth.adapter === 'object') return config.auth.adapter\n if (config.auth.adapter === 'mock') return createMockAuthAdapter()\n if (config.auth.adapter === 'supabase') {\n if (!getSupabaseClientOptional()) return createMockAuthAdapter()\n return createSupabaseAuthAdapter()\n }\n return null\n}\n\n// ---------------------------------------------------------------------------\n// Internal: resolve org adapter from config\n// ---------------------------------------------------------------------------\nfunction resolveOrgAdapter(config: SaasAppConfig): OrgAdapter | null {\n if (!config.organization?.adapter) return null\n if (typeof config.organization.adapter === 'object') return config.organization.adapter\n if (config.organization.adapter === 'mock') {\n return createMockOrgAdapter(config.permissions?.defaultProfiles)\n }\n if (config.organization.adapter === 'supabase') {\n if (!getSupabaseClientOptional()) return createMockOrgAdapter(config.permissions?.defaultProfiles)\n return createSupabaseOrgAdapter()\n }\n return null\n}\n\nfunction buildSettingsTabs(\n config: SaasAppConfig,\n pluginTabs: PluginSettingsTab[],\n can: (feature: string, action: PermissionAction) => boolean,\n t: (key: string, params?: Record<string, string | number>) => string,\n): { id: string; label: string; icon?: React.ReactNode; component: React.ReactNode }[] {\n const settingsTabs: { id: string; label: string; icon?: React.ReactNode; component: React.ReactNode }[] = []\n\n if (config.organization) {\n settingsTabs.push(\n { id: 'team', label: t('settings.team'), icon: React.createElement(Users, { className: 'h-4 w-4' }), component: React.createElement(TeamTab) },\n { id: 'permissions', label: t('settings.permissions'), icon: React.createElement(ShieldCheck, { className: 'h-4 w-4' }), component: React.createElement(PermissionProfilesTab) },\n { id: 'locations', label: t('settings.locations'), icon: React.createElement(MapPin, { className: 'h-4 w-4' }), component: React.createElement(LocationsCrudPage) },\n { id: 'field-rules', label: t('settings.fieldRules'), icon: React.createElement(SlidersHorizontal, { className: 'h-4 w-4' }), component: React.createElement(ConnectedFieldRulesSettings) },\n )\n }\n\n if (config.settingsTabs) {\n settingsTabs.push(...config.settingsTabs)\n }\n\n for (const tab of pluginTabs) {\n if (tab.permission && !can(tab.permission.feature, tab.permission.action)) {\n continue\n }\n\n const IconComp = tab.icon ? (LucideIcons as any)[tab.icon] ?? Puzzle : Puzzle\n // Try to translate plugin settings tab label via t('settings.plugin.{id}'), fallback to raw label\n const pluginLabelKey = `settings.plugin.${tab.id}`\n const pluginLabel = t(pluginLabelKey)\n settingsTabs.push({\n id: tab.id,\n label: pluginLabel === pluginLabelKey ? tab.label : pluginLabel,\n icon: React.createElement(IconComp, { className: 'h-4 w-4' }),\n component: React.createElement(tab.component),\n isPlugin: true,\n } as any)\n }\n\n return settingsTabs\n}\n\n// ---------------------------------------------------------------------------\n// createSaasApp — returns a ready-to-render App component\n// ---------------------------------------------------------------------------\nexport function createSaasApp(config: SaasAppConfig): React.FC {\n // Initialize Supabase — single project, core tables in saas_core schema\n if (config.supabaseUrl && config.supabaseAnonKey) {\n createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey)\n }\n\n const routerAdapter = config.router ?? hashRouterAdapter()\n setGlobalRouter(routerAdapter)\n\n const { navigation: baseNavigation, routes: baseRoutes, entityRouteMap } = buildNavigation(config.pages, config)\n setEntityRouteMap(entityRouteMap)\n const layout = config.layout ?? 'sidebar'\n const logoNode = renderLogo(config.name, config.logo)\n\n // Resolve adapters at creation time\n const authAdapter = resolveAuthAdapter(config)\n const orgAdapter = resolveOrgAdapter(config)\n const requireAuth = config.auth?.requireAuth ?? !!authAdapter\n\n // Login page component\n const LoginPageWrapper: React.FC = () => {\n return React.createElement(LoginPage, {\n appName: config.name,\n logo: config.auth?.loginLogo ?? logoNode,\n layout: config.auth?.loginLayout ?? 'split',\n tagline: config.auth?.loginTagline,\n description: config.auth?.loginDescription,\n showOAuth: config.auth?.showOAuth,\n oauthProviders: config.auth?.oauthProviders,\n onSuccess: () => { routerAdapter.navigate('/') },\n })\n }\n\n // The inner app (authenticated content)\n const AppContent: React.FC = () => {\n const route = routerAdapter.usePathname()\n const authUser = useAuthStore((s) => s.user)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const currentProfile = usePermissionsStore((s) => s.currentProfile)\n const { can } = usePermission()\n const shouldHydrateTenantPlugins =\n config.pluginRuntime?.hydrateTenantPlugins === true &&\n !config.pluginRuntime?.resolveTenantPlugins &&\n !config.pluginRuntime?.tenantPlugins\n const { tenantPlugins: hydratedTenantPlugins } = useTenantPlugins({ enabled: shouldHydrateTenantPlugins })\n const { t } = useTranslation()\n\n // Derive display user from auth or config fallback\n const user = authUser\n ? { fullName: authUser.fullName, email: authUser.email, avatarUrl: authUser.avatarUrl }\n : config.user\n\n // Merge plugin-declared features into permission store (must be before any early return)\n React.useEffect(() => {\n const pf = config.plugins?.flatMap((p) => p.declaredFeatures ?? []) ?? []\n if (pf.length === 0) return\n const store = usePermissionsStore.getState()\n const existing = new Set(store.features.map((f) => f.id))\n const toAdd = pf.filter((f) => !existing.has(f.id))\n if (toAdd.length > 0) store.setFeatures([...store.features, ...toAdd])\n }, [])\n\n // If we're on the login route, render login page\n if (route === '/login') {\n return React.createElement(LoginPageWrapper)\n }\n\n const tenantPluginBindings = config.pluginRuntime?.resolveTenantPlugins?.({\n tenant: currentOrg\n ? {\n id: currentOrg.id,\n slug: currentOrg.slug,\n verticalId: currentOrg.verticalId,\n plan: currentOrg.plan,\n }\n : null,\n user: authUser ? { id: authUser.id } : null,\n }) ?? config.pluginRuntime?.tenantPlugins ?? hydratedTenantPlugins\n const usesHydratedTenantBindings = shouldHydrateTenantPlugins && !!currentOrg\n\n const initialPluginRuntime = resolvePluginRuntime({\n plugins: config.plugins as any,\n tenantPlugins: tenantPluginBindings as any,\n hasTenantBindings: usesHydratedTenantBindings ? true : undefined,\n context: {\n tenant: currentOrg\n ? {\n id: currentOrg.id,\n slug: currentOrg.slug,\n verticalId: currentOrg.verticalId,\n plan: currentOrg.plan,\n }\n : null,\n user: authUser\n ? {\n id: authUser.id,\n role: currentProfile?.id,\n }\n : null,\n currentPath: route,\n matchedPath: route,\n layout,\n hasPermission: (requirement) => can(requirement.feature, requirement.action),\n },\n })\n\n const navigation = sortNavigation([\n ...baseNavigation,\n ...initialPluginRuntime.navigation.map((item) => ({\n id: item.id ?? item.route,\n label: item.label,\n icon: item.icon ?? 'Package',\n route: item.route,\n section: item.section,\n position: item.position,\n badge: item.badge,\n permission: item.permission,\n })),\n ])\n const routes = new Map(baseRoutes)\n for (const pluginRoute of initialPluginRuntime.routes) {\n routes.set(pluginRoute.path, {\n component: pluginRoute.component as any,\n permission: pluginRoute.permission,\n plugin: pluginRoute.plugin as any,\n fullBleed: pluginRoute.fullBleed,\n })\n }\n\n // Resolve page: exact match first, then prefix match for CRUD sub-routes and plugin routes\n let matchedPath = route\n let routeEntry = routes.get(route)\n if (!routeEntry) {\n // Try prefix match (e.g. /services/new → /services, /financial/settings/... → /financial)\n for (const [path, entry] of routes) {\n if (path !== '/' && route.startsWith(path + '/')) {\n routeEntry = entry\n matchedPath = path\n break\n }\n }\n }\n const pluginRuntime = {\n ...initialPluginRuntime,\n context: {\n ...initialPluginRuntime.context,\n matchedPath,\n },\n }\n const NotFoundPage: React.FC = () => React.createElement('div', { className: 'flex flex-col items-center justify-center py-24 text-center' },\n React.createElement('h1', { className: 'text-6xl font-bold text-muted-foreground/20 mb-4' }, t('app.notFound.title')),\n React.createElement('h2', { className: 'text-xl font-semibold mb-2' }, t('app.notFound.heading')),\n React.createElement('p', { className: 'text-sm text-muted-foreground mb-6' }, t('app.notFound.message')),\n React.createElement('button', {\n className: 'rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors',\n onClick: () => routerAdapter.navigate('/'),\n }, t('app.notFound.goToDashboard')),\n )\n const PageComponent = routeEntry?.component ?? NotFoundPage\n const pagePermission = routeEntry?.permission\n const pageTitle = navigation.find((n) => n.route === matchedPath)?.label ?? navigation.find((n) => n.route === route)?.label ?? navigation[0]?.label ?? ''\n const settingsTabs = buildSettingsTabs(config, pluginRuntime.settingsTabs as any, can, t)\n\n const handleSignOut = async () => {\n if (authAdapter) {\n try {\n await authAdapter.signOut()\n useAuthStore.getState().reset()\n useAuthStore.getState().setInitialized(true)\n } catch {\n // ignore sign out errors\n }\n routerAdapter.navigate('/login')\n }\n }\n\n const renderedPage = matchedPath === '/settings' && config.showSettings !== false\n ? React.createElement(SettingsPage, {\n extraTabs: settingsTabs,\n beforeContent: React.createElement(WidgetSlot, {\n zone: 'settings.before',\n className: 'space-y-4',\n contextOverrides: { matchedPath },\n }),\n afterContent: React.createElement(WidgetSlot, {\n zone: 'settings.after',\n className: 'space-y-4',\n contextOverrides: { matchedPath },\n }),\n })\n : React.createElement(PageComponent, routeEntry?.plugin ? {\n plugin: routeEntry.plugin,\n runtime: pluginRuntime.context,\n config: routeEntry.plugin.config,\n } : undefined)\n\n // Build page element — wrap in PermissionGate if page has permission config.\n // Full-bleed routes (chat, kanban, canvas) opt out of the p-6 padding +\n // animation wrapper and fill the content region edge-to-edge.\n const fullBleed = Boolean(routeEntry?.fullBleed)\n const pageContent = fullBleed\n ? React.createElement('div', { key: matchedPath, className: 'h-full min-h-0 overflow-hidden' }, renderedPage)\n : React.createElement('div', { key: matchedPath, className: 'saas-page-enter space-y-6 p-6' },\n React.createElement(WidgetSlot, {\n zone: 'page.before',\n className: 'space-y-4',\n contextOverrides: { matchedPath },\n }),\n renderedPage,\n React.createElement(WidgetSlot, {\n zone: 'page.after',\n className: 'space-y-4',\n contextOverrides: { matchedPath },\n }),\n )\n const pageElement: React.ReactNode = pagePermission\n ? React.createElement(\n PermissionGate,\n {\n feature: pagePermission.feature,\n action: pagePermission.action,\n fallback: React.createElement('div', { className: 'flex items-center justify-center py-24' },\n React.createElement('div', { className: 'text-center' },\n React.createElement('h2', { className: 'text-xl font-semibold mb-2' }, t('app.accessDenied.heading')),\n React.createElement('p', { className: 'text-muted-foreground' }, t('app.accessDenied.message'))\n )\n ),\n children: pageContent,\n },\n )\n : pageContent\n\n // Build orgSwitcher if configured\n const orgSwitcherElement = orgAdapter\n ? React.createElement(OrgSwitcher)\n : undefined\n\n const content = React.createElement(\n PluginRuntimeProvider,\n { value: pluginRuntime },\n React.createElement(\n React.Fragment,\n null,\n React.createElement(MockModeBanner),\n React.createElement(ImpersonationBanner),\n React.createElement(\n AppShell,\n {\n variant: layout,\n contentFrame: config.sidebarFrame !== false,\n navigation: navigation as unknown as UiNavigationItem[],\n user,\n pageTitle: undefined,\n currentPath: matchedPath,\n onNavigate: (path: string) => { routerAdapter.navigate(path) },\n onSignOut: authAdapter ? handleSignOut : () => console.log('sign out'),\n onSettings: () => { routerAdapter.navigate('/settings') },\n onBilling: routes.has('/billing') ? () => { routerAdapter.navigate('/billing') } : undefined,\n logo: logoNode,\n orgSwitcher: orgSwitcherElement,\n topbarStart: React.createElement(WidgetSlot, {\n zone: 'shell.topbar.start',\n className: 'flex items-center gap-2',\n contextOverrides: { matchedPath },\n }),\n topbarEnd: React.createElement(WidgetSlot, {\n zone: 'shell.topbar.end',\n className: 'flex items-center gap-2',\n contextOverrides: { matchedPath },\n }),\n sidebarTopContent: React.createElement(WidgetSlot, {\n zone: 'shell.sidebar.before-nav',\n className: 'space-y-2',\n contextOverrides: { matchedPath },\n }),\n sidebarFooterContent: React.createElement(WidgetSlot, {\n zone: 'shell.sidebar.footer',\n className: 'space-y-2',\n contextOverrides: { matchedPath },\n }),\n bottomNav: config.bottomNav,\n },\n pageElement,\n ),\n // Org initializer\n orgAdapter ? React.createElement(OrgInitializer, { verticalId: config.verticalId }) : null,\n // Location switch overlay\n React.createElement(LocationSwitchOverlay),\n // Chat\n config.chat?.enabled !== false && config.chat\n ? React.createElement(React.Fragment, null,\n React.createElement(ChatFab, { apiEndpoint: config.chat.apiEndpoint, systemPrompt: config.chat.systemPrompt }),\n React.createElement(ChatPanel, { title: config.chat.title, apiEndpoint: config.chat.apiEndpoint, systemPrompt: config.chat.systemPrompt }),\n )\n : null,\n React.createElement(WidgetSlot, {\n zone: 'shell.floating',\n contextOverrides: { matchedPath },\n }),\n // Command palette\n React.createElement(CommandPaletteWrapper, { navigation, routerAdapter }),\n ),\n )\n\n // Wrap in ProtectedRoute if auth is required\n if (requireAuth && authAdapter) {\n return React.createElement(\n ProtectedRoute,\n { onUnauthenticated: () => { routerAdapter.navigate('/login') } },\n content,\n )\n }\n\n return content\n }\n\n // The full App component\n const SaasApp: React.FC = () => {\n const initialize = useThemeStore((s) => s.initialize)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n const setPlans = useBillingStore((s) => s.setPlans)\n const setFeatures = usePermissionsStore((s) => s.setFeatures)\n\n const setMode = useThemeStore((s) => s.setMode)\n\n React.useEffect(() => {\n if (config.theme) {\n const isSaasTheme = 'brand' in config.theme && ('radius' in config.theme || 'sidebar' in config.theme || 'font' in config.theme)\n const resolved = isSaasTheme ? resolveTheme(config.theme as SaasTheme) : config.theme as CreateThemeOptions\n setOverrides(resolved)\n }\n // Set default mode if no user preference saved\n if (config.defaultThemeMode && !localStorage.getItem('saas-core:theme-mode')) {\n setMode(config.defaultThemeMode)\n }\n initialize()\n }, [initialize, setOverrides, setMode])\n\n React.useEffect(() => {\n if (config.billing?.plans) {\n setPlans(config.billing.plans.map(normalizePlanConfig) as any)\n }\n }, [setPlans])\n\n // Initialize permissions config (consumer-declared only; plugin features merged in AppContent)\n React.useEffect(() => {\n if (config.permissions?.features) {\n setFeatures(config.permissions.features)\n }\n }, [setFeatures])\n\n // Initialize locale on the unified @fayz-ai/core i18n.\n React.useEffect(() => {\n setCurrentLocale(config.locale?.default ?? 'en')\n setDefaultCurrency(config.locale?.currency)\n }, [])\n\n let inner: React.ReactNode = React.createElement(\n RouterProvider,\n { value: routerAdapter },\n React.createElement(ToastProvider, null),\n React.createElement(AppContent),\n )\n\n // Wrap in OrgAdapterProvider if adapter is configured\n if (orgAdapter) {\n inner = React.createElement(\n OrgAdapterProvider,\n { value: orgAdapter, children: inner },\n )\n }\n\n // Wrap in AuthAdapterProvider if adapter is configured\n if (authAdapter) {\n inner = React.createElement(\n AuthAdapterProvider,\n { value: authAdapter, children: inner },\n )\n }\n\n // Merge built-in locale packs + plugin locales + consumer overrides\n const mergedTranslations: Record<string, Record<string, string>> = {}\n const supportedLocales = config.locale?.supported ?? ['en', 'pt-BR']\n for (const loc of supportedLocales) {\n // Layer 1: built-in core translations\n const layer: Record<string, string> = { ...(builtInLocales[loc] ?? {}) }\n // Layer 2: plugin translations (each plugin can ship its own locales)\n if (config.plugins) {\n for (const plugin of config.plugins) {\n if (plugin.locales?.[loc]) {\n Object.assign(layer, plugin.locales[loc])\n }\n }\n }\n // Layer 3: consumer app overrides (highest priority)\n Object.assign(layer, config.locale?.translations?.[loc] ?? {})\n mergedTranslations[loc] = layer\n }\n // Register into @fayz-ai/core so the shimmed useTranslation resolves these keys.\n registerTranslations(mergedTranslations)\n\n // Wrap in I18nProvider (outermost)\n inner = React.createElement(I18nProvider, {\n value: {\n defaultLocale: config.locale?.default ?? 'en',\n supported: supportedLocales,\n translations: mergedTranslations,\n }\n }, inner)\n\n return inner as React.JSX.Element\n }\n\n return SaasApp\n}\n","import * as React from 'react'\nimport {\n registerScaffold,\n defineApp,\n getPluginFactory,\n getComponent,\n} from '@fayz-ai/core'\nimport type {\n AppManifest,\n PluginManifest,\n LocaleConfig,\n PermissionsConfig,\n BillingConfig as ManifestBillingConfig,\n} from '@fayz-ai/core'\nimport { AdminProviders } from './createFayzApp'\nimport { AdminShell } from './AdminShell'\nimport type { FayzAppConfig, CustomPage } from './config'\nimport { createSaasApp, type SaasAppConfig } from '../shell/createSaasApp'\n\n// ---------------------------------------------------------------------------\n// Admin scaffold — renders an admin app from a pure-data AppManifest. Mirrors\n// the storefront scaffold's dual path: defineSaas turns a FayzAppConfig into a\n// manifest (the sugar→data direction), and AdminScaffold turns a manifest back\n// into the provider stack + shell (the data→render direction). Plugins live in\n// the manifest as PluginRefs (id + JSON config) and are resolved to live\n// PluginManifests through the plugin-factory registry, exactly the contract a\n// generated app's plugins.generated.ts populates.\n// ---------------------------------------------------------------------------\n\nfunction slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'app'\n}\n\nconst liveConfigOption = '__fayzLiveConfigRef'\nconst liveSaasConfigs = new Map<string, FayzAppConfig | SaasAppConfig>()\n\nfunction hasLegacyShellConfig(config: FayzAppConfig | SaasAppConfig): config is SaasAppConfig {\n return 'organization' in config || 'settingsTabs' in config || 'bottomNav' in config || 'pluginRuntime' in config\n}\n\nfunction getAuthRequireAuth(config: FayzAppConfig | SaasAppConfig): boolean {\n return config.auth?.requireAuth ?? true\n}\n\nfunction getLiveConfigRef(id: string): string {\n return `code:${id}`\n}\n\n/** Fayz/Saas config → AppManifest (sugar → data). During the Beauty/Resto\n * migration, config-authored apps keep a live config ref so renderApp can\n * preserve code-backed plugins and custom pages while the JSON manifest path\n * matures. Serialized manifests still resolve through plugin/page registries. */\nexport function defineSaas(config: FayzAppConfig | SaasAppConfig): AppManifest {\n const id = slug(config.name)\n const configRef = getLiveConfigRef(id)\n liveSaasConfigs.set(configRef, config)\n return defineApp({\n id,\n name: config.name,\n backend: config.supabaseUrl\n ? { provider: 'supabase', url: config.supabaseUrl }\n : { provider: 'mock' },\n locale: config.locale as LocaleConfig | undefined,\n theme: config.theme as Record<string, unknown> | undefined,\n permissions: config.permissions,\n billing: config.billing as ManifestBillingConfig | undefined,\n surfaces: {\n admin: {\n scaffold: 'admin',\n plugins: (config.plugins ?? []).map((p) => ({ id: p.id })),\n options: {\n [liveConfigOption]: configRef,\n layout: config.layout ?? 'sidebar',\n requireAuth: getAuthRequireAuth(config),\n },\n },\n },\n })\n}\n\n/** Resolve a manifest's PluginRefs into live PluginManifests via the\n * plugin-factory registry. Unknown ids are skipped with a console warning so a\n * partial install degrades instead of crashing. */\nfunction resolvePlugins(manifest: AppManifest, surfaceName: string): PluginManifest[] {\n const refs = manifest.surfaces[surfaceName]?.plugins ?? []\n const plugins: PluginManifest[] = []\n for (const ref of refs) {\n if (ref.enabled === false) continue\n const factory = getPluginFactory(ref.id)\n if (!factory) {\n // eslint-disable-next-line no-console\n console.warn(`[@fayz-ai/saas] No plugin factory registered for \"${ref.id}\". Did plugins.generated.ts run?`)\n continue\n }\n plugins.push(factory(ref.config) as PluginManifest)\n }\n return plugins\n}\n\n/** Resolve manifest pages that reference a registered component id into the\n * CustomPage shape the shell renders. (entity/blocks pages are handled by the\n * plugins that own them; component pages are the app-level escape hatch.) */\nfunction resolvePages(manifest: AppManifest, surfaceName: string): CustomPage[] {\n const pages = manifest.surfaces[surfaceName]?.pages ?? []\n const out: CustomPage[] = []\n for (const p of pages) {\n if (!p.component) continue\n const Component = getComponent(p.component) as React.ComponentType | undefined\n if (!Component) {\n // eslint-disable-next-line no-console\n console.warn(`[@fayz-ai/saas] Manifest page \"${p.path}\" references unregistered component \"${p.component}\".`)\n continue\n }\n out.push({ path: p.path, label: p.label, icon: p.icon, section: p.section, component: Component })\n }\n return out\n}\n\n/** AppManifest → FayzAppConfig (data → render). */\nfunction manifestToFayzConfig(manifest: AppManifest, surfaceName: string): FayzAppConfig {\n const options = (manifest.surfaces[surfaceName]?.options ?? {}) as Record<string, unknown>\n const liveConfigRef = options[liveConfigOption]\n const liveConfig = typeof liveConfigRef === 'string' ? liveSaasConfigs.get(liveConfigRef) : undefined\n if (liveConfig && !hasLegacyShellConfig(liveConfig)) return liveConfig\n\n return {\n name: manifest.name,\n supabaseUrl: manifest.backend?.provider === 'supabase' ? manifest.backend.url : undefined,\n plugins: resolvePlugins(manifest, surfaceName),\n pages: resolvePages(manifest, surfaceName),\n theme: manifest.theme as FayzAppConfig['theme'],\n layout: (options.layout as FayzAppConfig['layout']) ?? 'sidebar',\n locale: manifest.locale as LocaleConfig | undefined,\n permissions: manifest.permissions as PermissionsConfig | undefined,\n billing: manifest.billing as FayzAppConfig['billing'],\n auth: { requireAuth: (options.requireAuth as boolean) ?? true },\n }\n}\n\nexport function AdminScaffold({ manifest, surface }: { manifest: AppManifest; surface: string }) {\n const liveConfigRef = manifest.surfaces[surface]?.options?.[liveConfigOption]\n const liveConfig = typeof liveConfigRef === 'string' ? liveSaasConfigs.get(liveConfigRef) : undefined\n const LegacyApp = React.useMemo(() => {\n if (!liveConfig || !hasLegacyShellConfig(liveConfig)) return null\n return createSaasApp(liveConfig)\n }, [liveConfig])\n const config = React.useMemo(() => manifestToFayzConfig(manifest, surface), [manifest, surface])\n\n if (LegacyApp) return <LegacyApp />\n\n return (\n <AdminProviders config={config}>\n <AdminShell\n appName={config.name}\n logo={config.logo}\n layout={config.layout}\n pages={config.pages}\n requireAuth={config.auth?.requireAuth}\n loginTagline={config.auth?.loginTagline}\n loginDescription={config.auth?.loginDescription}\n loginLogo={config.auth?.loginLogo}\n loginLayout={config.auth?.loginLayout}\n showOAuth={config.auth?.showOAuth}\n oauthProviders={config.auth?.oauthProviders}\n showSettings\n showOrgSettings={Boolean(config.org)}\n />\n </AdminProviders>\n )\n}\nAdminScaffold.displayName = 'AdminScaffold'\n\n// Self-register so renderApp(manifest) can resolve the 'admin' scaffold once\n// this package is imported.\nregisterScaffold('admin', AdminScaffold, { source: 'sdk', label: 'Admin' })\n","import React, { useEffect, useState, useMemo, useCallback } from 'react'\nimport {\n CalendarDays, FileText, CircleDashed, CircleEllipsis, CircleCheckBig,\n CircleAlert, Ban, ShoppingBag, Clock, UserX, ExternalLink,\n} from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ListView } from '@fayz-ai/ui'\nimport { useTranslation } from '../../../hooks/useTranslation'\nimport type { EntityDef } from '../../../types/crud'\nimport type { ClientDocument, ClientDocumentStage, ClientOrdersProvider, ClientOrdersNavigator } from '../../../types/client-orders'\n\n// ---------------------------------------------------------------------------\n// Stage badge config\n// ---------------------------------------------------------------------------\n\ninterface StageDef {\n icon: React.ElementType\n color: string\n labelKey: string\n}\n\nconst STAGE_CONFIG: Record<string, StageDef> = {\n draft: { icon: CircleDashed, color: 'bg-muted text-muted-foreground', labelKey: 'crud.orders.stage.draft' },\n quoted: { icon: FileText, color: 'bg-info-soft text-info-soft-foreground', labelKey: 'crud.orders.stage.quoted' },\n booked: { icon: CalendarDays, color: 'bg-magic-soft text-magic-soft-foreground', labelKey: 'crud.orders.stage.booked' },\n invoiced: { icon: FileText, color: 'bg-warning-soft text-warning-soft-foreground', labelKey: 'crud.orders.stage.invoiced' },\n paid: { icon: CircleCheckBig, color: 'bg-success-soft text-success-soft-foreground', labelKey: 'crud.orders.stage.paid' },\n partial: { icon: CircleEllipsis, color: 'bg-warning-soft text-warning-soft-foreground', labelKey: 'crud.orders.stage.partial' },\n overdue: { icon: CircleAlert, color: 'bg-destructive-soft text-destructive-soft-foreground', labelKey: 'crud.orders.stage.overdue' },\n cancelled: { icon: Ban, color: 'bg-muted text-muted-foreground', labelKey: 'crud.orders.stage.cancelled' },\n no_show: { icon: UserX, color: 'bg-destructive-soft text-destructive-soft-foreground', labelKey: 'crud.orders.stage.no_show' },\n completed: { icon: CircleCheckBig, color: 'bg-success-soft text-success-soft-foreground', labelKey: 'crud.orders.stage.completed' },\n}\n\n// ---------------------------------------------------------------------------\n// Column definitions\n// ---------------------------------------------------------------------------\n\nfunction useColumns(\n currency: { code: string; locale: string },\n t: (key: string) => string,\n onBookingClick?: (orderId: string) => void,\n onInvoiceClick?: (orderId: string) => void,\n): ColumnDef<ClientDocument, any>[] {\n return useMemo(() => [\n {\n accessorKey: 'date',\n header: t('crud.orders.columnDate'),\n size: 140,\n cell: ({ row }) => {\n const doc = row.original\n const dateStr = new Date(doc.date).toLocaleDateString(currency.locale, { day: '2-digit', month: 'short', year: '2-digit' })\n // If this order has a booking time, make it a clickable link\n if (doc.startsAt && onBookingClick) {\n const time = new Date(doc.startsAt).toLocaleTimeString(currency.locale, { hour: '2-digit', minute: '2-digit' })\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onBookingClick(doc.id) }}\n className=\"inline-flex items-center gap-1 text-xs text-magic hover:underline whitespace-nowrap\"\n >\n <CalendarDays className=\"h-3 w-3\" />\n {dateStr} {time}\n </button>\n )\n }\n return <span className=\"text-xs text-muted-foreground whitespace-nowrap\">{dateStr}</span>\n },\n },\n {\n id: 'stage',\n header: t('crud.orders.columnStage'),\n size: 120,\n cell: ({ row }) => {\n const cfg = STAGE_CONFIG[row.original.stage] ?? STAGE_CONFIG.draft\n const Icon = cfg.icon\n const translated = t(cfg.labelKey)\n const label = translated.startsWith('crud.orders.stage.') ? row.original.stage : translated\n return (\n <span className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium ${cfg.color}`}>\n <Icon className=\"h-2.5 w-2.5\" />\n {label}\n </span>\n )\n },\n },\n {\n accessorKey: 'referenceNumber',\n header: '#',\n size: 100,\n cell: ({ getValue }) => {\n const num = getValue() as string | undefined\n return num\n ? <span className=\"text-xs font-mono text-muted-foreground\">#{num}</span>\n : <span className=\"text-muted-foreground\">—</span>\n },\n },\n {\n accessorKey: 'description',\n header: t('crud.orders.columnDescription'),\n cell: ({ getValue }) => (\n <span className=\"text-sm truncate max-w-[200px] block\">\n {(getValue() as string) || '—'}\n </span>\n ),\n },\n {\n accessorKey: 'total',\n header: t('crud.orders.columnAmount'),\n size: 120,\n cell: ({ row }) => {\n const doc = row.original\n const val = doc.total\n if (!val) return <span className=\"text-muted-foreground\">—</span>\n const formatted = new Intl.NumberFormat(currency.locale, { style: 'currency', currency: currency.code }).format(val)\n const isFinancial = ['invoiced', 'paid', 'partial', 'overdue'].includes(doc.stage)\n // If invoiced/paid and has a reference, link to invoice detail\n if (isFinancial && onInvoiceClick) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onInvoiceClick(doc.id) }}\n className={`inline-flex items-center gap-1 font-medium text-sm text-primary hover:underline ${doc.stage === 'cancelled' ? 'line-through text-muted-foreground' : ''}`}\n >\n {formatted}\n <ExternalLink className=\"h-2.5 w-2.5\" />\n </button>\n )\n }\n return (\n <span className={`font-medium text-sm ${doc.stage === 'cancelled' ? 'line-through text-muted-foreground' : ''}`}>\n {formatted}\n </span>\n )\n },\n },\n ], [currency, t, onBookingClick, onInvoiceClick])\n}\n\n// ---------------------------------------------------------------------------\n// Tab Component\n// ---------------------------------------------------------------------------\n\nexport function ClientOrdersTab({\n item,\n entityDef,\n provider,\n navigator,\n onBookingClick,\n onInvoiceClick,\n currency = { code: 'BRL', locale: 'pt-BR' },\n}: {\n item: any\n entityDef: EntityDef\n provider: ClientOrdersProvider\n navigator?: ClientOrdersNavigator\n onBookingClick?: (orderId: string) => void\n onInvoiceClick?: (orderId: string) => void\n currency?: { code: string; locale: string }\n}) {\n const { t } = useTranslation()\n const [docs, setDocs] = useState<ClientDocument[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(true)\n const [stageFilter, setStageFilter] = useState<string | undefined>()\n\n const clientId = item.id as string\n\n const fetchDocs = useCallback(async () => {\n setLoading(true)\n try {\n const result = await provider.getDocuments({\n clientId,\n stages: stageFilter ? [stageFilter] : undefined,\n })\n setDocs(result.data)\n setTotal(result.total)\n } catch {\n setDocs([])\n setTotal(0)\n } finally {\n setLoading(false)\n }\n }, [clientId, stageFilter, provider])\n\n useEffect(() => { fetchDocs() }, [fetchDocs])\n\n const columns = useColumns(currency, t, onBookingClick, onInvoiceClick)\n\n const tags = useMemo(() => [\n { value: 'booked', label: t('crud.orders.stage.booked') },\n { value: 'invoiced', label: t('crud.orders.stage.invoiced') },\n { value: 'paid', label: t('crud.orders.stage.paid') },\n { value: 'quoted', label: t('crud.orders.stage.quoted') },\n ], [t])\n\n return (\n <ListView<ClientDocument>\n columns={columns}\n data={docs}\n loading={loading}\n searchPlaceholder={t('crud.orders.searchPlaceholder')}\n tags={tags}\n allTagLabel={t('crud.orders.all')}\n activeTag={stageFilter}\n onTagChange={(v: any) => setStageFilter(v)}\n onRowClick={navigator ? (row: any) => navigator.onNavigate(row) : undefined}\n emptyIcon={ShoppingBag}\n emptyMessage={t('crud.orders.noDocuments')}\n />\n )\n}\n","// ---------------------------------------------------------------------------\n// Factory: creates a ClientOrdersProvider that queries saas_core.orders\n// for a given client (party_id). The UI keeps the historical \"stage\" language,\n// but current archetype schemas expose this lifecycle as orders.status.\n// ---------------------------------------------------------------------------\n\nimport type { ClientOrdersProvider, ClientOrdersQuery, ClientDocument, ClientDocumentStage } from '../types/client-orders'\nimport { getSupabaseClientOptional } from './supabase'\n\nconst STAGE_FILTER_MAP: Record<string, string[]> = {\n quoted: ['draft', 'quoted'],\n booked: ['booked', 'scheduled', 'confirmed', 'in_progress', 'completed'],\n invoiced: ['invoiced', 'partial', 'overdue'],\n paid: ['paid'],\n}\n\nfunction mapOrderStatusToStage(status: string | null | undefined): ClientDocumentStage {\n switch (status) {\n case 'scheduled':\n case 'confirmed':\n case 'in_progress':\n return 'booked'\n case 'completed':\n return 'completed'\n case 'invoiced':\n case 'paid':\n case 'partial':\n case 'overdue':\n case 'cancelled':\n case 'no_show':\n case 'quoted':\n case 'draft':\n return status\n default:\n return 'draft'\n }\n}\n\nexport function createClientOrdersProvider(): ClientOrdersProvider {\n return {\n async getDocuments(query: ClientOrdersQuery): Promise<{ data: ClientDocument[]; total: number }> {\n const supabase = getSupabaseClientOptional()\n if (!supabase) return { data: [], total: 0 }\n\n try {\n let qb = supabase\n .schema('saas_core')\n .from('orders')\n .select('id, kind, status, total, reference_number, notes, metadata, created_at', { count: 'exact' })\n .eq('party_id', query.clientId)\n\n // Filter by stage groups against the current schema's status column.\n if (query.stages && query.stages.length > 0) {\n const allStages = query.stages.flatMap((s) => STAGE_FILTER_MAP[s] ?? [s])\n qb = qb.in('status', allStages)\n }\n\n qb = qb.order('created_at', { ascending: false })\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1)\n\n const { data, count } = await qb\n const orderIds = (data ?? []).map((row: any) => row.id).filter(Boolean)\n\n const bookingStartsByOrderId = new Map<string, string>()\n if (orderIds.length > 0) {\n const { data: bookings } = await supabase\n .schema('saas_core')\n .from('bookings')\n .select('order_id, starts_at')\n .in('order_id', orderIds)\n\n for (const booking of bookings ?? []) {\n if (booking.order_id && booking.starts_at && !bookingStartsByOrderId.has(booking.order_id)) {\n bookingStartsByOrderId.set(booking.order_id, booking.starts_at)\n }\n }\n }\n\n const results: ClientDocument[] = (data ?? []).map((row: any) => {\n const meta = (row.metadata ?? {}) as Record<string, unknown>\n const startsAt = bookingStartsByOrderId.get(row.id)\n return {\n id: row.id,\n kind: row.kind as string,\n stage: mapOrderStatusToStage(row.status as string | null | undefined),\n referenceNumber: row.reference_number ?? undefined,\n date: startsAt?.slice(0, 10) ?? (row.created_at as string)?.slice(0, 10) ?? '',\n startsAt,\n total: Number(row.total) || 0,\n paidAmount: Number(meta.paidAmount) || 0,\n description: (meta.itemsSummary as string) ?? (meta.serviceNames as string) ?? row.notes ?? undefined,\n createdAt: row.created_at as string,\n }\n })\n\n return { data: results, total: count ?? results.length }\n } catch {\n return { data: [], total: 0 }\n }\n },\n }\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EntityLookupResult {\n id: string\n label: string\n subtitle?: string\n group?: string\n icon?: string\n price?: number\n data?: Record<string, unknown>\n}\n\nexport type EntityLookupMap = Record<string, EntityLookup>\n\nexport interface EntityLookup {\n search(query: string): Promise<EntityLookupResult[]>\n getById(id: string): Promise<EntityLookupResult | null>\n list?(): Promise<EntityLookupResult[]>\n}\n\nexport type ArchetypeType = 'person' | 'product' | 'service' | 'location'\n\n// ---------------------------------------------------------------------------\n// Archetype display config\n// ---------------------------------------------------------------------------\n\nconst ARCHETYPE_DISPLAY: Record<ArchetypeType, {\n table: string\n labelField: string\n subtitleFields: string[]\n priceField?: string\n groupField?: string\n}> = {\n person: { table: 'persons', labelField: 'name', subtitleFields: ['phone'], groupField: 'kind' },\n product: { table: 'products', labelField: 'name', subtitleFields: ['sku', 'description'], priceField: 'price' },\n service: { table: 'services', labelField: 'name', subtitleFields: ['duration_minutes', 'description'], priceField: 'price' },\n location: { table: 'locations', labelField: 'name', subtitleFields: ['city', 'address'], groupField: 'kind' },\n}\n\ninterface ArchetypeLookupConfig {\n archetype: ArchetypeType\n kind?: string | string[]\n kindLabels?: Record<string, string>\n limit?: number\n subtitleFields?: string[]\n}\n\nfunction toResult(\n row: Record<string, unknown>,\n display: typeof ARCHETYPE_DISPLAY[ArchetypeType],\n kindLabels?: Record<string, string>,\n): EntityLookupResult {\n const label = String(row[display.labelField] ?? row.name ?? '')\n const subtitleParts = display.subtitleFields\n .map((f) => row[f])\n .filter(Boolean)\n .map((v) => {\n if (typeof v === 'number') return `${v}min`\n return String(v)\n })\n\n let group: string | undefined\n if (display.groupField && row[display.groupField]) {\n const rawGroup = String(row[display.groupField])\n group = kindLabels?.[rawGroup] ?? rawGroup\n }\n\n return {\n id: String(row.id),\n label,\n subtitle: subtitleParts.length > 0 ? subtitleParts.join(' · ') : undefined,\n group,\n price: display.priceField ? Number(row[display.priceField]) || undefined : undefined,\n data: row,\n }\n}\n\n/**\n * Create an EntityLookup that queries a saas_core archetype table via Supabase.\n * Returns empty results if Supabase is not configured.\n */\nexport function createArchetypeLookup(config: ArchetypeLookupConfig): EntityLookup {\n const baseDisplay = ARCHETYPE_DISPLAY[config.archetype]\n const display = config.subtitleFields\n ? { ...baseDisplay, subtitleFields: config.subtitleFields }\n : baseDisplay\n const limit = config.limit ?? 20\n const kinds = config.kind\n ? Array.isArray(config.kind) ? config.kind : [config.kind]\n : undefined\n\n function applyKindFilter(qb: any) {\n if (kinds && kinds.length === 1) return qb.eq('kind', kinds[0])\n if (kinds && kinds.length > 1) return qb.in('kind', kinds)\n return qb\n }\n\n return {\n async search(query: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n\n let qb = supabase\n .schema('saas_core')\n .from(display.table)\n .select('*')\n .eq('is_active', true)\n .order(display.labelField, { ascending: true })\n .limit(limit)\n\n if (query) qb = qb.ilike(display.labelField, `%${query}%`)\n qb = applyKindFilter(qb)\n\n const { data } = await qb\n return (data ?? []).map((row: Record<string, unknown>) =>\n toResult(row, display, config.kindLabels),\n )\n },\n\n async list() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n\n let qb = supabase\n .schema('saas_core')\n .from(display.table)\n .select('*')\n .eq('is_active', true)\n .order(display.labelField, { ascending: true })\n .limit(limit)\n\n qb = applyKindFilter(qb)\n\n const { data } = await qb\n return (data ?? []).map((row: Record<string, unknown>) =>\n toResult(row, display, config.kindLabels),\n )\n },\n\n async getById(id: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n const { data } = await supabase\n .schema('saas_core')\n .from(display.table)\n .select('*')\n .eq('id', id)\n .single()\n\n return data\n ? toResult(data as Record<string, unknown>, display, config.kindLabels)\n : null\n },\n }\n}\n","import React from 'react'\n\n/**\n * Page stub for modules that are planned but not built yet.\n * Usage: { path: '/marketing', label: 'Marketing', icon: 'Megaphone', component: createPlaceholder('Marketing') }\n */\nexport function createPlaceholder(title: string, description?: string): React.FC {\n return function PlaceholderPage() {\n return React.createElement(\n 'div',\n { className: 'mx-auto max-w-4xl' },\n React.createElement('h1', { className: 'text-3xl font-bold text-foreground' }, title),\n description\n ? React.createElement('p', { className: 'mt-1 text-muted-foreground' }, description)\n : null,\n React.createElement(\n 'div',\n { className: 'mt-8 flex items-center justify-center rounded-card border border-dashed border-border bg-card p-16' },\n React.createElement(\n 'div',\n { className: 'text-center' },\n React.createElement('p', { className: 'text-lg font-medium text-muted-foreground' }, 'Coming Soon'),\n React.createElement(\n 'p',\n { className: 'mt-1 text-sm text-muted-foreground/70' },\n 'This module is being built as a plugin.',\n ),\n ),\n ),\n )\n }\n}\n","import React from 'react'\nimport { cn } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// ToggleRow — a single setting with label, description, and checkbox\n// ---------------------------------------------------------------------------\n\nexport function ToggleRow({ label, description, checked, onChange, disabled }: {\n label: string\n description?: string\n checked: boolean\n onChange: (checked: boolean) => void\n disabled?: boolean\n}) {\n return (\n <label className={cn(\n 'flex items-center justify-between gap-4 py-3 cursor-pointer',\n disabled && 'opacity-50 cursor-not-allowed',\n )}>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{label}</p>\n {description && <p className=\"text-xs text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => !disabled && onChange(!checked)}\n className={cn(\n 'relative inline-flex h-5 w-9 shrink-0 rounded-full transition-colors duration-200',\n checked ? 'bg-primary' : 'bg-muted',\n disabled && 'cursor-not-allowed',\n )}\n >\n <span className={cn(\n 'inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform duration-200 mt-0.5',\n checked ? 'translate-x-4 ml-0.5' : 'translate-x-0.5',\n )} />\n </button>\n </label>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SelectRow — a single setting with label, description, and select dropdown\n// ---------------------------------------------------------------------------\n\nexport function SelectRow({ label, description, value, options, onChange, disabled }: {\n label: string\n description?: string\n value: string\n options: { value: string; label: string }[]\n onChange: (value: string) => void\n disabled?: boolean\n}) {\n return (\n <label className={cn(\n 'flex items-center justify-between gap-4 py-3',\n disabled && 'opacity-50 cursor-not-allowed',\n )}>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{label}</p>\n {description && <p className=\"text-xs text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n className=\"h-8 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 text-sm\"\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </label>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SettingsGroup — a bordered section with title and children\n// ---------------------------------------------------------------------------\n\nexport function SettingsGroup({ title, description, children }: {\n title: string\n description?: string\n children: React.ReactNode\n}) {\n return (\n <div>\n <div className=\"px-1 pb-1 pt-4 first:pt-0\">\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {description && <p className=\"text-[10px] text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n <div className=\"rounded-lg border bg-card shadow-sm px-5 divide-y\">\n {children}\n </div>\n </div>\n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { cn } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { ICON_MAP } from '@fayz-ai/ui'\nimport { useModuleLayout } from '@fayz-ai/ui'\nimport type { PluginQuickAction } from '@fayz-ai/core'\n\n/**\n * Quick actions button for plugin modules.\n * Shows a \"+\" button that opens a popover with contextual insert actions.\n * Reusable by any plugin.\n */\nexport function QuickActionsButton({ actions, className }: {\n actions: PluginQuickAction[]\n className?: string\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n // Solid primary in sidebar/tabs products (GHL-style), outline in topbar products.\n const variant = useModuleLayout() === 'tabs' ? 'default' : 'outline'\n\n useEffect(() => {\n function handler(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n if (actions.length === 0) return null\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n <Button\n variant={variant}\n size=\"sm\"\n onClick={() => setOpen(!open)}\n className={cn(open && variant === 'outline' && 'bg-muted')}\n >\n <Plus className={cn('h-3.5 w-3.5 transition-transform duration-200', open && 'rotate-45')} />\n <span>New</span>\n </Button>\n\n {open && (\n <div className=\"fayz-glass-surface absolute top-full right-0 z-50 mt-2 w-64 rounded-xl border bg-popover shadow-lg overflow-hidden animate-in fade-in-0 zoom-in-95 origin-top-right\">\n <div className=\"p-1.5\">\n {actions.map((action) => {\n const Icon = action.icon ? (ICON_MAP[action.icon] ?? Plus) : Plus\n return (\n <button\n key={action.id}\n onClick={() => { action.action(); setOpen(false) }}\n className=\"w-full flex items-center gap-3 rounded-lg px-3 py-2.5 text-left hover:bg-muted/50 transition-colors group\"\n >\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-muted group-hover:bg-primary/10 transition-colors shrink-0\">\n <Icon className=\"h-4 w-4 text-muted-foreground group-hover:text-primary transition-colors\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{action.label}</p>\n {action.description && (\n <p className=\"text-[10px] text-muted-foreground leading-tight\">{action.description}</p>\n )}\n </div>\n </button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Settings } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport type { PluginQuickAction } from '@fayz-ai/core'\nimport { QuickActionsButton } from './QuickActionsButton'\n\n/**\n * ModuleActionBar — the single, standard top-right action area for every plugin\n * module page. Pass it straight to `ModulePage`'s `headerAction` prop.\n *\n * Owns the two things every module's header repeated by hand:\n * - a primary \"New\" action (rendered via QuickActionsButton, which adapts its\n * variant to the layout: solid in `tabs` products, outline in `rail`),\n * - a settings gear that deep-links into the central Settings area.\n *\n * Plugins stop hand-rolling `<div className=\"flex gap-2\">…gear…</div>` blocks:\n * headerAction={<ModuleActionBar quickActions={quickActions} settingsPath=\"/settings/crm\" />}\n */\nexport function ModuleActionBar({\n quickActions,\n settingsPath,\n settingsLabel,\n leading,\n trailing,\n}: {\n /** Primary insert actions. Omit (or empty) to hide the New button. */\n quickActions?: PluginQuickAction[]\n /** Hash route to the central settings tab, e.g. '/settings/crm'. Omit to hide the gear. */\n settingsPath?: string\n /** Accessible title for the gear button. */\n settingsLabel?: string\n /** Optional extra controls rendered before the New button (e.g. a filter). */\n leading?: React.ReactNode\n /** Optional extra controls rendered after the gear. */\n trailing?: React.ReactNode\n}) {\n const hasQuickActions = !!quickActions && quickActions.length > 0\n if (!hasQuickActions && !settingsPath && !leading && !trailing) return null\n\n return (\n <div className=\"flex items-center gap-2\">\n {leading}\n {hasQuickActions && <QuickActionsButton actions={quickActions} />}\n {settingsPath && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => { window.location.hash = settingsPath }}\n title={settingsLabel ?? 'Settings'}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n )}\n {trailing}\n </div>\n )\n}\n","import React from 'react'\nimport { useStore as useZustandStore, type StoreApi } from 'zustand'\n\n/**\n * createPluginContext — the standard config/provider/store React context trio that\n * every plugin re-implemented by hand (~100 lines each). One call returns the\n * provider component plus the three typed hooks:\n *\n * const ctx = createPluginContext<ResolvedCrmConfig, CrmDataProvider, CrmUIState>('CrmPage')\n * export const CrmContextProvider = ctx.ContextProvider\n * export const useCrmConfig = ctx.useConfig\n * export const useCrmProvider = ctx.useProvider\n * export const useCrmStore = ctx.useStore\n *\n * `displayName` is only used in the \"must be used within …\" error messages.\n */\nexport interface PluginContextApi<TConfig, TProvider, TUIState> {\n ContextProvider: React.FC<{\n config: TConfig\n provider: TProvider\n store: StoreApi<TUIState>\n children?: React.ReactNode\n }>\n useConfig: () => TConfig\n useProvider: () => TProvider\n useStore: <T>(selector: (state: TUIState) => T) => T\n}\n\nexport function createPluginContext<TConfig, TProvider, TUIState>(\n displayName: string,\n): PluginContextApi<TConfig, TProvider, TUIState> {\n const ConfigContext = React.createContext<TConfig | null>(null)\n const ProviderContext = React.createContext<TProvider | null>(null)\n const StoreContext = React.createContext<StoreApi<TUIState> | null>(null)\n\n const ContextProvider: PluginContextApi<TConfig, TProvider, TUIState>['ContextProvider'] = ({\n config, provider, store, children,\n }) => (\n <ConfigContext.Provider value={config}>\n <ProviderContext.Provider value={provider}>\n <StoreContext.Provider value={store}>\n {children}\n </StoreContext.Provider>\n </ProviderContext.Provider>\n </ConfigContext.Provider>\n )\n ContextProvider.displayName = `${displayName}ContextProvider`\n\n function useConfig(): TConfig {\n const ctx = React.useContext(ConfigContext)\n if (!ctx) throw new Error(`useConfig must be used within ${displayName}`)\n return ctx\n }\n\n function useProvider(): TProvider {\n const ctx = React.useContext(ProviderContext)\n if (!ctx) throw new Error(`useProvider must be used within ${displayName}`)\n return ctx\n }\n\n function useStore<T>(selector: (state: TUIState) => T): T {\n const store = React.useContext(StoreContext)\n if (!store) throw new Error(`useStore must be used within ${displayName}`)\n return useZustandStore(store, selector)\n }\n\n return { ContextProvider, useConfig, useProvider, useStore }\n}\n","import React from 'react'\n\n/**\n * parseViewId — the ONE canonical way to split a module view string into its base\n * and optional `:id` param. Replaces the per-plugin mix of `.slice('x-detail:'.length)`,\n * `.split(':')[1]`, and regex. `'leads-detail:42'` → `{ base: 'leads-detail', id: '42' }`,\n * `'channels'` → `{ base: 'channels' }`.\n */\nexport function parseViewId(view: string): { base: string; id?: string } {\n const i = view.indexOf(':')\n return i === -1 ? { base: view } : { base: view.slice(0, i), id: view.slice(i + 1) }\n}\n\nexport interface ViewRoute {\n /** view base id, e.g. 'channels' (exact) or 'channel-detail' (matches 'channel-detail:<id>') */\n id: string\n /** render the view; `id` is the parsed `:id` param for detail/edit routes */\n render: (params: { id?: string }) => React.ReactNode\n}\n\n/**\n * createViewRouter — declarative replacement for the hand-written `renderView()`\n * switch every plugin repeated. Maps a view's base id to a renderer and falls back\n * to `fallbackId` for unknown views. Define routes inside the component so their\n * `render` closures can capture `navigate`/handlers:\n *\n * const renderView = createViewRouter([\n * { id: 'channels', render: () => <ChannelsView onOpen={(id) => navigate(`channel-detail:${id}`)} /> },\n * { id: 'channel-detail', render: ({ id }) => <ChannelDetailView channelId={id!} onBack={() => navigate('channels')} /> },\n * { id: 'overview', render: () => <OverviewView /> },\n * ], 'overview')\n * ...\n * {renderView(view)}\n *\n * Not a fit for plugins that collapse detail/edit into a parent view + mode\n * (e.g. financial's `parseIntent`) — those should still use `parseViewId` directly.\n */\nexport function createViewRouter(routes: ViewRoute[], fallbackId: string): (view: string) => React.ReactNode {\n const map = new Map(routes.map((r) => [r.id, r]))\n return (view: string) => {\n const { base, id } = parseViewId(view)\n const route = map.get(base) ?? map.get(fallbackId)\n return route ? route.render({ id }) : null\n }\n}\n","/**\n * Shared currency config + formatter. Every vertical plugin (crm, financial,\n * inventory, orders, menu, marketing) copied this same Intl.NumberFormat wrapper;\n * they now import it from here. Plugins may still re-export it under a local alias\n * (e.g. `export { formatCurrency } from '@fayz-ai/saas'`) to keep call sites short.\n */\nexport interface CurrencyConfig {\n code: string\n locale: string\n symbol: string\n}\n\nexport function formatCurrency(value: number, currency: CurrencyConfig): string {\n return new Intl.NumberFormat(currency.locale, {\n style: 'currency',\n currency: currency.code,\n minimumFractionDigits: 2,\n }).format(value)\n}\n","import React, { useState, useMemo } from 'react'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { createCrudStore } from '../stores/createCrudStore'\nimport { createMockProvider } from '@fayz-ai/core'\nimport { CrudPage } from '../crud/CrudPage'\nimport { cn } from '@fayz-ai/ui'\nimport { ICON_MAP } from '@fayz-ai/ui'\n\n/**\n * Internal CRUD view for a single registry.\n * Manages its own store and uses a hash-based basePath for proper CRUD routing.\n */\nfunction RegistryCrudView({ registry, basePath }: { registry: PluginRegistryDef; basePath: string }) {\n const useStore = useMemo(() => {\n const data = (registry.mockData ?? registry.seedData ?? []) as any[]\n const provider = createMockProvider(registry.entity as EntityDef<any>, data)\n return createCrudStore(provider)\n }, [registry.id])\n\n return (\n <CrudPage\n entityDef={registry.entity as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={registry.display === 'cards' ? 'cards' : 'table'}\n readOnly={registry.readOnly}\n />\n )\n}\n\n/**\n * Reusable tabbed CRUD manager for plugin registries.\n * @param routeBase — hash route prefix for CRUD sub-routing (e.g. '/financial/settings')\n */\nexport function PluginRegistryManager({ registries, routeBase, className }: {\n registries: PluginRegistryDef[]\n /** Base route for CRUD navigation (e.g. '/financial/settings'). Each registry gets routeBase/registryId */\n routeBase?: string\n className?: string\n}) {\n // Derive active tab from hash if routeBase provided, otherwise use state\n const getTabFromHash = () => {\n if (!routeBase) return registries[0]?.id ?? ''\n const hash = window.location.hash.slice(1) || '/'\n if (hash.startsWith(routeBase + '/')) {\n const rest = hash.slice(routeBase.length + 1)\n const tabId = rest.split('/')[0]\n if (registries.find((r) => r.id === tabId)) return tabId\n }\n return registries[0]?.id ?? ''\n }\n\n const [activeTab, setActiveTab] = useState(getTabFromHash)\n\n // Sync tab from hash changes\n React.useEffect(() => {\n if (!routeBase) return\n const handler = () => setActiveTab(getTabFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [routeBase])\n\n function switchTab(tabId: string) {\n setActiveTab(tabId)\n if (routeBase) {\n window.location.hash = `${routeBase}/${tabId}`\n }\n }\n\n if (registries.length === 0) return null\n\n const activeRegistry = registries.find((r) => r.id === activeTab) ?? registries[0]\n const crudBasePath = routeBase ? `${routeBase}/${activeRegistry.id}` : `/__registry/${activeRegistry.id}`\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* Tabs */}\n <div className=\"flex gap-1 overflow-x-auto pb-1\">\n {registries.map((reg) => {\n const Icon = reg.icon ? (ICON_MAP[reg.icon] ?? null) : null\n const active = reg.id === activeTab\n return (\n <button\n key={reg.id}\n onClick={() => switchTab(reg.id)}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap rounded-lg px-3 py-2 text-sm font-medium transition-colors shrink-0',\n active\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {reg.entity.name}\n </button>\n )\n })}\n </div>\n\n {/* Description */}\n {activeRegistry?.description && (\n <p className=\"text-xs text-muted-foreground\">{activeRegistry.description}</p>\n )}\n\n {/* CRUD content — keyed so it remounts when switching tabs */}\n {activeRegistry && <RegistryCrudView key={activeRegistry.id} registry={activeRegistry} basePath={crudBasePath} />}\n </div>\n )\n}\n","import { useState, useRef, useCallback, useEffect } from 'react'\n\n/**\n * Navigation direction for transition animations.\n * 'forward' = deeper into content (list → detail → edit, or main → settings)\n * 'back' = returning to parent (edit → detail → list, or settings → main)\n */\nexport type NavDirection = 'forward' | 'back'\n\n/**\n * View depth mapping — used to determine animation direction.\n * Higher depth = deeper in the navigation hierarchy.\n */\nexport type DepthMap = Record<string, number>\n\nconst DEFAULT_DEPTHS: DepthMap = {\n summary: 0,\n list: 0,\n new: 1,\n edit: 2,\n detail: 1,\n settings: 1,\n}\n\n/**\n * Reusable module navigation hook for plugins.\n * Manages view state, hash synchronization, and animation direction.\n *\n * @param hashBase — the base hash path for this module (e.g. '/financial')\n * @param depthMap — optional custom depth mapping for views\n */\nexport function useModuleNavigation(hashBase: string, depthMap?: DepthMap, homeView = 'summary') {\n const depths = { ...DEFAULT_DEPTHS, ...depthMap }\n\n function getInitialView(): string {\n const rawHash = window.location.hash.slice(1) || '/'\n // Strip query string from hash before parsing segments\n const hash = rawHash.split('?')[0]\n if (hash === hashBase || hash === hashBase + '/') return homeView\n if (hash.startsWith(hashBase + '/settings')) return 'settings'\n if (hash.startsWith(hashBase + '/')) {\n const rest = hash.slice(hashBase.length + 1)\n const segments = rest.split('/')\n // '/inventory/dashboard' → treat as home view\n if (segments.length === 1 && segments[0] === homeView) return homeView\n // Detect action + ID patterns: '/products/edit/uuid' or '/stock/detail/uuid'\n const ACTION_KEYWORDS = ['edit', 'detail', 'view']\n if (segments.length >= 3) {\n const maybeAction = segments[segments.length - 2]\n if (ACTION_KEYWORDS.includes(maybeAction)) {\n return segments.slice(0, -2).join('-') + '-' + maybeAction + ':' + segments[segments.length - 1]\n }\n }\n return segments.join('-')\n }\n return homeView\n }\n\n const [view, setView] = useState(getInitialView)\n const [direction, setDirection] = useState<NavDirection>('forward')\n const prevDepthRef = useRef(getDepth(getInitialView()))\n\n // Sync view from external hash changes (e.g., topbar nav clicking the module link)\n useEffect(() => {\n function handler() {\n const hash = (window.location.hash.slice(1) || '/').split('?')[0]\n // Only react if the hash is within our module's base\n if (hash === hashBase || hash === hashBase + '/' || hash.startsWith(hashBase + '/')) {\n const newView = getInitialView()\n if (newView !== view) {\n const nextDepth = getDepth(newView)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setView(newView)\n }\n }\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [view, hashBase])\n\n function getDepth(v: string): number {\n // Check exact match first\n if (depths[v] !== undefined) return depths[v]\n // Check base view name (e.g. 'payables-list' → check 'list', 'payables-new' → check 'new')\n const parts = v.split('-')\n const suffix = parts[parts.length - 1]\n if (depths[suffix] !== undefined) return depths[suffix]\n // Edit with ID (e.g. 'payables-edit:123')\n if (v.includes('edit')) return depths.edit ?? 2\n return 0\n }\n\n const navigate = useCallback((nextView: string, hash?: string) => {\n const nextDepth = getDepth(nextView)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setView(nextView)\n\n // Sync hash — explicit hash takes priority, otherwise derive from view name\n if (hash) {\n window.location.hash = hash\n } else if (nextView === homeView || nextView === 'summary' || nextView === '') {\n window.location.hash = hashBase\n } else {\n // Convert view name to URL-friendly path: 'payables-list' → '/financial/payables/list'\n // 'payables-edit:uuid-with-dashes' → '/financial/payables/edit/uuid-with-dashes'\n const colonIdx = nextView.indexOf(':')\n if (colonIdx !== -1) {\n // Has an ID after colon — only convert dashes in the prefix, keep ID intact\n const prefix = nextView.slice(0, colonIdx).replace(/-/g, '/')\n const id = nextView.slice(colonIdx + 1)\n window.location.hash = `${hashBase}/${prefix}/${id}`\n } else {\n const path = nextView.replace(/-/g, '/')\n window.location.hash = `${hashBase}/${path}`\n }\n }\n }, [hashBase])\n\n const animationClass = direction === 'forward' ? 'saas-nav-forward' : 'saas-nav-back'\n\n return { view, direction, animationClass, navigate }\n}\n","import React, { useState, useCallback, useRef } from 'react'\nimport { Mail, Phone, ExternalLink, Cake, Calendar } from 'lucide-react'\nimport { Popover, PopoverTrigger, PopoverContent } from '@fayz-ai/ui'\nimport { createArchetypeLookup } from '../../archetype-lookup'\nimport type { EntityLookupResult } from '../../archetype-lookup'\nimport { cn } from '@fayz-ai/ui'\nimport { resolveEntityHref } from '../../lib/entity-routes'\n\n// Singleton person lookup — shared across all PersonLink instances\nconst personLookup = createArchetypeLookup({ archetype: 'person' })\n\ninterface PersonLinkProps {\n /** Person UUID — required for fetching details */\n personId?: string | null\n /** Display name (shown as the clickable text) */\n name: string\n /** Optional href to navigate to the person's profile */\n profileHref?: string\n /** Optional tab to open on the detail page (e.g. \"schedule\") */\n tab?: string\n /** Size variant */\n size?: 'sm' | 'default'\n /** Additional className for the trigger */\n className?: string\n}\n\nfunction formatAge(dob: string): string | null {\n try {\n const birth = new Date(dob)\n const now = new Date()\n let age = now.getFullYear() - birth.getFullYear()\n if (now.getMonth() < birth.getMonth() || (now.getMonth() === birth.getMonth() && now.getDate() < birth.getDate())) age--\n return `${age}y`\n } catch { return null }\n}\n\nexport function PersonLink({ personId, name, profileHref, tab, size = 'default', className }: PersonLinkProps) {\n const [person, setPerson] = useState<EntityLookupResult | null>(null)\n const [loading, setLoading] = useState(false)\n const [fetched, setFetched] = useState(false)\n const [open, setOpen] = useState(false)\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const fetchPerson = useCallback(() => {\n if (!fetched && personId) {\n setLoading(true)\n personLookup.getById(personId).then((result) => {\n setPerson(result)\n setFetched(true)\n setLoading(false)\n }).catch(() => {\n setFetched(true)\n setLoading(false)\n })\n }\n }, [personId, fetched])\n\n const handleOpenChange = useCallback((v: boolean) => {\n setOpen(v)\n if (v) fetchPerson()\n }, [fetchPerson])\n\n function handleMouseEnter() {\n hoverTimer.current = setTimeout(() => { setOpen(true); fetchPerson() }, 800)\n }\n\n function handleMouseLeave() {\n if (hoverTimer.current) { clearTimeout(hoverTimer.current); hoverTimer.current = null }\n }\n\n // If no personId, just render the name as plain text\n if (!personId) {\n return <span className={cn(size === 'sm' ? 'text-xs' : 'text-sm', className)}>{name}</span>\n }\n\n const data = person?.data as Record<string, unknown> | undefined\n const email = data?.email as string | undefined\n const phone = data?.phone as string | undefined\n const kind = data?.kind as string | undefined ?? person?.group\n const isActive = data?.is_active as boolean | undefined\n const dob = data?.date_of_birth as string | undefined\n const createdAt = data?.created_at as string | undefined\n const age = dob ? formatAge(dob) : null\n const initial = name.charAt(0).toUpperCase()\n\n // Auto-derive profile href from person kind if not explicitly provided\n const resolvedHref = profileHref ?? (personId ? '#' + resolveEntityHref(personId, 'person', kind ?? undefined, tab) : undefined)\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn(\n 'font-medium text-foreground underline decoration-dashed decoration-muted-foreground/40 underline-offset-2 hover:decoration-primary hover:text-primary transition-colors truncate text-left',\n size === 'sm' ? 'text-xs' : 'text-sm',\n className\n )}\n >\n {name}\n </button>\n </PopoverTrigger>\n <PopoverContent side=\"bottom\" align=\"start\" sideOffset={6}>\n {loading ? (\n <div className=\"p-4 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-10 w-10 rounded-full bg-muted/40 animate-pulse\" />\n <div className=\"space-y-1.5 flex-1\">\n <div className=\"h-3.5 w-24 rounded bg-muted/40 animate-pulse\" />\n <div className=\"h-2.5 w-16 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n <div className=\"space-y-2 pt-1\">\n <div className=\"h-3 w-36 rounded bg-muted/30 animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n ) : (\n <div>\n {/* Header with profile link */}\n <div className=\"flex items-start gap-3 p-4 pb-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary text-sm font-bold\">\n {initial}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">{name}</p>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n {kind && (\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground capitalize\">\n {kind}\n </span>\n )}\n {isActive !== undefined && (\n <span className={`inline-flex items-center gap-1 text-[10px] ${isActive ? 'text-success' : 'text-muted-foreground/50'}`}>\n <span className={`h-1.5 w-1.5 rounded-full ${isActive ? 'bg-success' : 'bg-muted-foreground/30'}`} />\n {isActive ? 'Active' : 'Inactive'}\n </span>\n )}\n </div>\n </div>\n {resolvedHref && (\n <a\n href={resolvedHref}\n onClick={(e) => { e.preventDefault(); window.location.hash = resolvedHref.replace(/^#/, '') }}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground transition-colors shrink-0\"\n title=\"View profile\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n\n {/* Contact details */}\n {(email || phone || age) && (\n <div className=\"px-4 pb-3 space-y-1.5\">\n {email && (\n <a href={`mailto:${email}`} className=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-primary transition-colors\">\n <Mail className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{email}</span>\n </a>\n )}\n {phone && (\n <a href={`tel:${phone}`} className=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-primary transition-colors\">\n <Phone className=\"h-3 w-3 shrink-0\" />\n <span>{phone}</span>\n </a>\n )}\n {dob && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Cake className=\"h-3 w-3 shrink-0\" />\n <span>{new Date(dob).toLocaleDateString()}{age ? ` (${age})` : ''}</span>\n </div>\n )}\n </div>\n )}\n\n {/* No details found */}\n {!person && fetched && (\n <div className=\"px-4 pb-3\">\n <p className=\"text-xs text-muted-foreground\">No additional details available</p>\n </div>\n )}\n\n {/* Footer — created at */}\n {createdAt && (\n <div className=\"border-t px-4 py-2 flex items-center gap-1.5 text-[10px] text-muted-foreground/50\">\n <Calendar className=\"h-2.5 w-2.5\" />\n <span>Added {new Date(createdAt).toLocaleDateString()}</span>\n </div>\n )}\n </div>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\n\n// ---------------------------------------------------------------------------\n// Plugin Preferences — localStorage-backed per-plugin user preferences\n//\n// Usage:\n// const prefs = usePluginPrefs('agenda', { calendarView: 'timeGridWeek', slotDuration: 30 })\n// prefs.get('calendarView') // 'timeGridWeek'\n// prefs.set('calendarView', 'dayGridMonth')\n// prefs.getAll() // { calendarView: 'dayGridMonth', slotDuration: 30 }\n// prefs.reset() // back to defaults\n//\n// Keys are namespaced: `saas:prefs:{pluginId}` in localStorage.\n// Each plugin gets its own isolated namespace.\n// ---------------------------------------------------------------------------\n\nconst STORAGE_PREFIX = 'saas:prefs:'\n\nfunction readStore<T extends Record<string, unknown>>(pluginId: string, defaults: T): T {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + pluginId)\n if (!raw) return { ...defaults }\n return { ...defaults, ...JSON.parse(raw) }\n } catch {\n return { ...defaults }\n }\n}\n\nfunction writeStore<T extends Record<string, unknown>>(pluginId: string, data: T): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + pluginId, JSON.stringify(data))\n } catch { /* quota exceeded or private browsing — silently ignore */ }\n}\n\nexport interface PluginPrefs<T extends Record<string, unknown>> {\n /** Get a single preference value */\n get<K extends keyof T>(key: K): T[K]\n /** Set a single preference value (persists immediately) */\n set<K extends keyof T>(key: K, value: T[K]): void\n /** Update multiple preferences at once */\n update(partial: Partial<T>): void\n /** Get all preferences as an object */\n getAll(): T\n /** Reset all preferences to defaults */\n reset(): void\n}\n\n/**\n * Hook for localStorage-backed plugin preferences.\n *\n * @param pluginId Unique plugin identifier (e.g. 'agenda', 'financial')\n * @param defaults Default values — also defines the shape of the prefs object\n * @returns PluginPrefs accessor with get/set/update/reset\n */\nexport function usePluginPrefs<T extends Record<string, unknown>>(\n pluginId: string,\n defaults: T,\n): PluginPrefs<T> {\n const [state, setState] = useState<T>(() => readStore(pluginId, defaults))\n\n const get = useCallback(<K extends keyof T>(key: K): T[K] => {\n return state[key]\n }, [state])\n\n const set = useCallback(<K extends keyof T>(key: K, value: T[K]): void => {\n setState((prev) => {\n const next = { ...prev, [key]: value }\n writeStore(pluginId, next)\n return next\n })\n }, [pluginId])\n\n const update = useCallback((partial: Partial<T>): void => {\n setState((prev) => {\n const next = { ...prev, ...partial }\n writeStore(pluginId, next)\n return next\n })\n }, [pluginId])\n\n const getAll = useCallback((): T => state, [state])\n\n const reset = useCallback((): void => {\n setState({ ...defaults })\n writeStore(pluginId, defaults)\n }, [pluginId, defaults])\n\n return useMemo(() => ({ get, set, update, getAll, reset }), [get, set, update, getAll, reset])\n}\n\n// ---------------------------------------------------------------------------\n// Non-hook utility for use outside React components (e.g. in store factories)\n// ---------------------------------------------------------------------------\n\nexport function getPluginPref<T>(pluginId: string, key: string, defaultValue: T): T {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + pluginId)\n if (!raw) return defaultValue\n const parsed = JSON.parse(raw)\n return parsed[key] ?? defaultValue\n } catch {\n return defaultValue\n }\n}\n\nexport function setPluginPref(pluginId: string, key: string, value: unknown): void {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + pluginId)\n const existing = raw ? JSON.parse(raw) : {}\n existing[key] = value\n localStorage.setItem(STORAGE_PREFIX + pluginId, JSON.stringify(existing))\n } catch { /* ignore */ }\n}\n","import React, { useState, useMemo } from 'react'\nimport { ChevronLeft, Settings } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ICON_MAP } from '@fayz-ai/ui'\nimport type { PluginRegistryDef } from '../../types/plugins'\nimport type { EntityDef } from '../../types/crud'\nimport { createCrudStore } from '../../../stores/createCrudStore'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport { CrudPage } from '../../../crud/CrudPage'\n\n// ---------------------------------------------------------------------------\n// Settings tab definition — General, custom tabs, and registry tabs all unified\n// ---------------------------------------------------------------------------\n\nexport interface SettingsPanelTab {\n id: string\n label: string\n icon?: string\n content: React.ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// Internal: CRUD view for a registry\n// ---------------------------------------------------------------------------\n\nfunction RegistryCrudView({ registry, basePath }: { registry: PluginRegistryDef; basePath: string }) {\n const useStore = useMemo(() => {\n const mockData = (registry.mockData ?? registry.seedData ?? []) as any[]\n const provider = resolveDataProvider(registry.entity as EntityDef<any>, mockData)\n return createCrudStore(provider)\n }, [registry.id])\n\n return (\n <CrudPage\n entityDef={registry.entity as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={registry.display === 'cards' ? 'cards' : 'table'}\n readOnly={registry.readOnly}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Plugin settings panel\n// ---------------------------------------------------------------------------\n\nexport function PluginSettingsPanel({ title, subtitle, generalSettings, registries, customTabs, routeBase, onClose }: {\n title: string\n subtitle?: string\n /** General preferences component */\n generalSettings?: React.ReactNode\n /** CRUD registries — each becomes its own tab */\n registries?: PluginRegistryDef[]\n /** Additional custom tabs (e.g., Pipeline config for CRM) */\n customTabs?: SettingsPanelTab[]\n /** Hash route base for CRUD sub-routing */\n routeBase: string\n /** Called when back button is clicked. If not provided, back button is hidden. */\n onClose?: () => void\n}) {\n const { t } = useTranslation()\n\n // Translate registry entity name: try t('registry.{id}'), fallback to raw name\n const regLabel = (id: string, fallback: string) => {\n const key = `registry.${id}`\n const translated = t(key)\n return translated === key ? fallback : translated\n }\n\n // Build unified tab list: General → custom tabs → registry tabs\n const tabs = useMemo(() => {\n const list: { id: string; label: string; icon?: string; type: 'general' | 'custom' | 'registry'; registryDef?: PluginRegistryDef }[] = []\n\n if (generalSettings) {\n list.push({ id: '_general', label: t('settings.general'), icon: 'Settings', type: 'general' })\n }\n\n if (customTabs) {\n for (const tab of customTabs) {\n list.push({ id: `_custom_${tab.id}`, label: tab.label, icon: tab.icon, type: 'custom' })\n }\n }\n\n if (registries) {\n for (const reg of registries) {\n list.push({ id: reg.id, label: regLabel(reg.id, reg.entity.name), icon: reg.icon, type: 'registry', registryDef: reg })\n }\n }\n\n return list\n }, [generalSettings, customTabs, registries, t])\n\n // Always use hash routing — the app router now prefix-matches /settings/*\n const useHashRouting = true\n\n function getActiveFromHash(): string {\n if (!useHashRouting) return tabs[0]?.id ?? ''\n const hash = window.location.hash.slice(1) || '/'\n if (hash.startsWith(routeBase + '/')) {\n const rest = hash.slice(routeBase.length + 1).split('/')[0]\n const match = tabs.find((t) => t.id === rest)\n if (match) return match.id\n }\n return tabs[0]?.id ?? ''\n }\n\n const [activeTab, setActiveTab] = useState(getActiveFromHash)\n\n React.useEffect(() => {\n if (!useHashRouting) return\n const handler = () => setActiveTab(getActiveFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [routeBase, tabs, useHashRouting])\n\n function switchTab(tabId: string) {\n setActiveTab(tabId)\n if (useHashRouting) {\n window.location.hash = `${routeBase}/${tabId}`\n }\n }\n\n const activeTabDef = tabs.find((t) => t.id === activeTab) ?? tabs[0]\n const customTabContent = customTabs?.find((t) => `_custom_${t.id}` === activeTab)\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n {onClose && (\n <button onClick={onClose} className=\"flex h-8 w-8 items-center justify-center rounded-lg border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div>\n <h2 className=\"text-lg font-bold\">{title}</h2>\n {subtitle && <p className=\"text-xs text-muted-foreground\">{subtitle}</p>}\n </div>\n </div>\n\n {/* Unified tabs — underline style */}\n <div className=\"flex gap-0.5 overflow-x-auto border-b scrollbar-none\" style={{ scrollbarWidth: 'none' }}>\n {tabs.map((tab) => {\n const Icon = tab.icon ? (ICON_MAP[tab.icon] ?? null) : null\n const active = tab.id === activeTab\n return (\n <button\n key={tab.id}\n onClick={() => switchTab(tab.id)}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap px-3 py-2 text-sm font-medium transition-colors shrink-0 border-b-2 -mb-px',\n active\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted',\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {tab.label}\n </button>\n )\n })}\n </div>\n\n {/* Description for registry tabs */}\n {activeTabDef?.type === 'registry' && activeTabDef.registryDef?.description && (\n <p className=\"text-xs text-muted-foreground\">{regLabel(activeTabDef.id + '.description', activeTabDef.registryDef.description)}</p>\n )}\n\n {/* Content */}\n {activeTabDef?.type === 'general' && generalSettings && (\n <div>{generalSettings}</div>\n )}\n\n {activeTabDef?.type === 'custom' && customTabContent && (\n <div>{customTabContent.content}</div>\n )}\n\n {activeTabDef?.type === 'registry' && activeTabDef.registryDef && (\n <RegistryCrudView\n key={activeTabDef.id}\n registry={activeTabDef.registryDef}\n basePath={`${routeBase}/${activeTabDef.id}`}\n />\n )}\n </div>\n )\n}\n"]}