@licklist/design 0.78.5-dev.105 → 0.78.5-dev.107

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 (371) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/bitbucket-pipelines.yml +13 -4
  3. package/dist/index.js +1 -1
  4. package/dist/product-set/form/ProductsControl.d.ts +2 -1
  5. package/dist/product-set/form/ProductsControl.d.ts.map +1 -1
  6. package/dist/product-set/form/ProductsControl.js +0 -24
  7. package/dist/v2/components/DataTable/DataTable.d.ts.map +1 -1
  8. package/dist/v2/components/DataTable/DataTable.js +86 -2
  9. package/dist/v2/components/InputCheckbox/InputCheckbox.scss.js +1 -1
  10. package/dist/v2/components/Modal/DeleteModal.d.ts.map +1 -1
  11. package/dist/v2/components/Modal/DeleteModal.js +13 -11
  12. package/dist/v2/components/Toggle/Toggle.d.ts.map +1 -1
  13. package/dist/v2/components/Toggle/Toggle.js +8 -5
  14. package/dist/v2/components/ZoneCard/ZoneCard.scss.js +1 -1
  15. package/dist/v2/components/index.d.ts +1 -1
  16. package/dist/v2/components/index.d.ts.map +1 -1
  17. package/dist/v2/icons/index.d.ts +4 -0
  18. package/dist/v2/icons/index.d.ts.map +1 -1
  19. package/dist/v2/icons/index.js +47 -16
  20. package/dist/v2/index.d.ts +0 -4
  21. package/dist/v2/index.d.ts.map +1 -1
  22. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +0 -3
  23. package/dist/v2/pages/Settings/components/SidebarNavItem.js +0 -3
  24. package/package.json +6 -6
  25. package/rollup.config.js +16 -2
  26. package/src/iframe/payment/payment-status-page/PaymentStatusPage.tsx +1 -1
  27. package/src/product-set/form/ProductsControl.tsx +2 -1
  28. package/src/v2/components/DataTable/DataTable.tsx +23 -1
  29. package/src/v2/components/InputCheckbox/InputCheckbox.scss +6 -6
  30. package/src/v2/components/Modal/DeleteModal.tsx +12 -20
  31. package/src/v2/components/Toggle/Toggle.tsx +6 -5
  32. package/src/v2/components/ZoneCard/ZoneCard.scss +78 -0
  33. package/src/v2/components/index.ts +1 -0
  34. package/src/v2/icons/index.tsx +10 -0
  35. package/src/v2/index.ts +0 -73
  36. package/src/v2/navigation/Navigation/Navigation.stories.tsx +137 -0
  37. package/dist/v2/shadcn/components/ui/accordion.d.ts +0 -8
  38. package/dist/v2/shadcn/components/ui/accordion.d.ts.map +0 -1
  39. package/dist/v2/shadcn/components/ui/alert-dialog.d.ts +0 -21
  40. package/dist/v2/shadcn/components/ui/alert-dialog.d.ts.map +0 -1
  41. package/dist/v2/shadcn/components/ui/alert.d.ts +0 -9
  42. package/dist/v2/shadcn/components/ui/alert.d.ts.map +0 -1
  43. package/dist/v2/shadcn/components/ui/aspect-ratio.d.ts +0 -4
  44. package/dist/v2/shadcn/components/ui/aspect-ratio.d.ts.map +0 -1
  45. package/dist/v2/shadcn/components/ui/avatar.d.ts +0 -7
  46. package/dist/v2/shadcn/components/ui/avatar.d.ts.map +0 -1
  47. package/dist/v2/shadcn/components/ui/badge.d.ts +0 -10
  48. package/dist/v2/shadcn/components/ui/badge.d.ts.map +0 -1
  49. package/dist/v2/shadcn/components/ui/breadcrumb.d.ts +0 -20
  50. package/dist/v2/shadcn/components/ui/breadcrumb.d.ts.map +0 -1
  51. package/dist/v2/shadcn/components/ui/button.d.ts +0 -14
  52. package/dist/v2/shadcn/components/ui/button.d.ts.map +0 -1
  53. package/dist/v2/shadcn/components/ui/calendar.d.ts +0 -9
  54. package/dist/v2/shadcn/components/ui/calendar.d.ts.map +0 -1
  55. package/dist/v2/shadcn/components/ui/card.d.ts +0 -9
  56. package/dist/v2/shadcn/components/ui/card.d.ts.map +0 -1
  57. package/dist/v2/shadcn/components/ui/carousel.d.ts +0 -19
  58. package/dist/v2/shadcn/components/ui/carousel.d.ts.map +0 -1
  59. package/dist/v2/shadcn/components/ui/checkbox.d.ts +0 -6
  60. package/dist/v2/shadcn/components/ui/checkbox.d.ts.map +0 -1
  61. package/dist/v2/shadcn/components/ui/checkbox.js +0 -115
  62. package/dist/v2/shadcn/components/ui/checkbox.scss.js +0 -6
  63. package/dist/v2/shadcn/components/ui/collapsible.d.ts +0 -6
  64. package/dist/v2/shadcn/components/ui/collapsible.d.ts.map +0 -1
  65. package/dist/v2/shadcn/components/ui/command.d.ts +0 -83
  66. package/dist/v2/shadcn/components/ui/command.d.ts.map +0 -1
  67. package/dist/v2/shadcn/components/ui/context-menu.d.ts +0 -28
  68. package/dist/v2/shadcn/components/ui/context-menu.d.ts.map +0 -1
  69. package/dist/v2/shadcn/components/ui/dialog.d.ts +0 -20
  70. package/dist/v2/shadcn/components/ui/dialog.d.ts.map +0 -1
  71. package/dist/v2/shadcn/components/ui/dialog.js +0 -169
  72. package/dist/v2/shadcn/components/ui/drawer.d.ts +0 -23
  73. package/dist/v2/shadcn/components/ui/drawer.d.ts.map +0 -1
  74. package/dist/v2/shadcn/components/ui/dropdown-menu.d.ts +0 -28
  75. package/dist/v2/shadcn/components/ui/dropdown-menu.d.ts.map +0 -1
  76. package/dist/v2/shadcn/components/ui/form.d.ts +0 -24
  77. package/dist/v2/shadcn/components/ui/form.d.ts.map +0 -1
  78. package/dist/v2/shadcn/components/ui/hover-card.d.ts +0 -7
  79. package/dist/v2/shadcn/components/ui/hover-card.d.ts.map +0 -1
  80. package/dist/v2/shadcn/components/ui/input-otp.d.ts +0 -35
  81. package/dist/v2/shadcn/components/ui/input-otp.d.ts.map +0 -1
  82. package/dist/v2/shadcn/components/ui/input.d.ts +0 -6
  83. package/dist/v2/shadcn/components/ui/input.d.ts.map +0 -1
  84. package/dist/v2/shadcn/components/ui/label.d.ts +0 -6
  85. package/dist/v2/shadcn/components/ui/label.d.ts.map +0 -1
  86. package/dist/v2/shadcn/components/ui/menubar.d.ts +0 -34
  87. package/dist/v2/shadcn/components/ui/menubar.d.ts.map +0 -1
  88. package/dist/v2/shadcn/components/ui/navigation-menu.d.ts +0 -13
  89. package/dist/v2/shadcn/components/ui/navigation-menu.d.ts.map +0 -1
  90. package/dist/v2/shadcn/components/ui/pagination.d.ts +0 -29
  91. package/dist/v2/shadcn/components/ui/pagination.d.ts.map +0 -1
  92. package/dist/v2/shadcn/components/ui/popover.d.ts +0 -7
  93. package/dist/v2/shadcn/components/ui/popover.d.ts.map +0 -1
  94. package/dist/v2/shadcn/components/ui/progress.d.ts +0 -5
  95. package/dist/v2/shadcn/components/ui/progress.d.ts.map +0 -1
  96. package/dist/v2/shadcn/components/ui/radio-card.d.ts +0 -12
  97. package/dist/v2/shadcn/components/ui/radio-card.d.ts.map +0 -1
  98. package/dist/v2/shadcn/components/ui/radio-group.d.ts +0 -6
  99. package/dist/v2/shadcn/components/ui/radio-group.d.ts.map +0 -1
  100. package/dist/v2/shadcn/components/ui/scroll-area.d.ts +0 -6
  101. package/dist/v2/shadcn/components/ui/scroll-area.d.ts.map +0 -1
  102. package/dist/v2/shadcn/components/ui/select.d.ts +0 -14
  103. package/dist/v2/shadcn/components/ui/select.d.ts.map +0 -1
  104. package/dist/v2/shadcn/components/ui/separator.d.ts +0 -5
  105. package/dist/v2/shadcn/components/ui/separator.d.ts.map +0 -1
  106. package/dist/v2/shadcn/components/ui/sheet.d.ts +0 -26
  107. package/dist/v2/shadcn/components/ui/sheet.d.ts.map +0 -1
  108. package/dist/v2/shadcn/components/ui/sidebar.d.ts +0 -67
  109. package/dist/v2/shadcn/components/ui/sidebar.d.ts.map +0 -1
  110. package/dist/v2/shadcn/components/ui/skeleton.d.ts +0 -3
  111. package/dist/v2/shadcn/components/ui/skeleton.d.ts.map +0 -1
  112. package/dist/v2/shadcn/components/ui/slider.d.ts +0 -5
  113. package/dist/v2/shadcn/components/ui/slider.d.ts.map +0 -1
  114. package/dist/v2/shadcn/components/ui/switch.d.ts +0 -6
  115. package/dist/v2/shadcn/components/ui/switch.d.ts.map +0 -1
  116. package/dist/v2/shadcn/components/ui/switch.js +0 -115
  117. package/dist/v2/shadcn/components/ui/switch.scss.js +0 -6
  118. package/dist/v2/shadcn/components/ui/table-pagination.d.ts +0 -11
  119. package/dist/v2/shadcn/components/ui/table-pagination.d.ts.map +0 -1
  120. package/dist/v2/shadcn/components/ui/table.d.ts +0 -11
  121. package/dist/v2/shadcn/components/ui/table.d.ts.map +0 -1
  122. package/dist/v2/shadcn/components/ui/tabs.d.ts +0 -8
  123. package/dist/v2/shadcn/components/ui/tabs.d.ts.map +0 -1
  124. package/dist/v2/shadcn/components/ui/textarea.d.ts +0 -6
  125. package/dist/v2/shadcn/components/ui/textarea.d.ts.map +0 -1
  126. package/dist/v2/shadcn/components/ui/toast.d.ts +0 -16
  127. package/dist/v2/shadcn/components/ui/toast.d.ts.map +0 -1
  128. package/dist/v2/shadcn/components/ui/toaster.d.ts +0 -2
  129. package/dist/v2/shadcn/components/ui/toaster.d.ts.map +0 -1
  130. package/dist/v2/shadcn/components/ui/toggle-group.d.ts +0 -13
  131. package/dist/v2/shadcn/components/ui/toggle-group.d.ts.map +0 -1
  132. package/dist/v2/shadcn/components/ui/toggle.d.ts +0 -13
  133. package/dist/v2/shadcn/components/ui/toggle.d.ts.map +0 -1
  134. package/dist/v2/shadcn/components/ui/tooltip.d.ts +0 -8
  135. package/dist/v2/shadcn/components/ui/tooltip.d.ts.map +0 -1
  136. package/dist/v2/shadcn/components/ui/use-toast.d.ts +0 -3
  137. package/dist/v2/shadcn/components/ui/use-toast.d.ts.map +0 -1
  138. package/dist/v2/shadcn/hooks/use-mobile.d.ts +0 -2
  139. package/dist/v2/shadcn/hooks/use-mobile.d.ts.map +0 -1
  140. package/dist/v2/shadcn/hooks/use-toast.d.ts +0 -45
  141. package/dist/v2/shadcn/hooks/use-toast.d.ts.map +0 -1
  142. package/dist/v2/shadcn/index.d.ts +0 -20
  143. package/dist/v2/shadcn/index.d.ts.map +0 -1
  144. package/dist/v2/shadcn/lib/utils.d.ts +0 -3
  145. package/dist/v2/shadcn/lib/utils.d.ts.map +0 -1
  146. package/dist/v2/shadcn/lib/utils.js +0 -11
  147. package/dist/v2/shadcn/styles/globals.css +0 -112
  148. package/src/v2/shadcn/_reference/AccountManagerCard.tsx +0 -45
  149. package/src/v2/shadcn/_reference/AffiliatesTable.tsx +0 -178
  150. package/src/v2/shadcn/_reference/AuditArchive.tsx +0 -165
  151. package/src/v2/shadcn/_reference/AuditContent.tsx +0 -270
  152. package/src/v2/shadcn/_reference/AutomationsGeneralSettings.tsx +0 -251
  153. package/src/v2/shadcn/_reference/AvatarUpload.tsx +0 -150
  154. package/src/v2/shadcn/_reference/BookingsSummaryCard.tsx +0 -268
  155. package/src/v2/shadcn/_reference/CodeCleanUpAudit.tsx +0 -274
  156. package/src/v2/shadcn/_reference/CompaniesTable.tsx +0 -387
  157. package/src/v2/shadcn/_reference/ComponentAudit.tsx +0 -239
  158. package/src/v2/shadcn/_reference/ConfigureSettingsCard.tsx +0 -95
  159. package/src/v2/shadcn/_reference/CustomerCard.tsx +0 -155
  160. package/src/v2/shadcn/_reference/DashboardCards.tsx +0 -50
  161. package/src/v2/shadcn/_reference/DashboardFooter.tsx +0 -18
  162. package/src/v2/shadcn/_reference/DiarySettings.tsx +0 -187
  163. package/src/v2/shadcn/_reference/DiaryView.tsx +0 -998
  164. package/src/v2/shadcn/_reference/EmptyState.tsx +0 -76
  165. package/src/v2/shadcn/_reference/EntityInfoCard.tsx +0 -48
  166. package/src/v2/shadcn/_reference/ExistingUserAssignments.tsx +0 -131
  167. package/src/v2/shadcn/_reference/FeatureToggle.tsx +0 -72
  168. package/src/v2/shadcn/_reference/FlowCard.tsx +0 -170
  169. package/src/v2/shadcn/_reference/FlowsContent.tsx +0 -688
  170. package/src/v2/shadcn/_reference/FlowsGeneralSettings.tsx +0 -27
  171. package/src/v2/shadcn/_reference/GeneralSettings.tsx +0 -33
  172. package/src/v2/shadcn/_reference/InventoryGeneralSettings.tsx +0 -82
  173. package/src/v2/shadcn/_reference/LanguageSelector.tsx +0 -97
  174. package/src/v2/shadcn/_reference/LoadingScreen.tsx +0 -25
  175. package/src/v2/shadcn/_reference/LoadingSpinner.tsx +0 -41
  176. package/src/v2/shadcn/_reference/ManagedClientsList.tsx +0 -121
  177. package/src/v2/shadcn/_reference/NPSScore.tsx +0 -379
  178. package/src/v2/shadcn/_reference/NPSSummaryCard.tsx +0 -181
  179. package/src/v2/shadcn/_reference/NotificationBanner.tsx +0 -129
  180. package/src/v2/shadcn/_reference/NotificationPanel.tsx +0 -208
  181. package/src/v2/shadcn/_reference/OnlineUsersCard.tsx +0 -73
  182. package/src/v2/shadcn/_reference/ProtectedRoute.tsx +0 -39
  183. package/src/v2/shadcn/_reference/ProvidersTable.tsx +0 -353
  184. package/src/v2/shadcn/_reference/QuickAddPanel.tsx +0 -1057
  185. package/src/v2/shadcn/_reference/QuickFilters.tsx +0 -112
  186. package/src/v2/shadcn/_reference/ScheduleView.tsx +0 -410
  187. package/src/v2/shadcn/_reference/ScrollToTop.tsx +0 -14
  188. package/src/v2/shadcn/_reference/SecondaryNav.tsx +0 -50
  189. package/src/v2/shadcn/_reference/SecuritySettings.tsx +0 -258
  190. package/src/v2/shadcn/_reference/SessionDetailView.tsx +0 -294
  191. package/src/v2/shadcn/_reference/Sidebar.tsx +0 -14
  192. package/src/v2/shadcn/_reference/SidebarAwareLayout.tsx +0 -30
  193. package/src/v2/shadcn/_reference/SidebarLabelCustomization.tsx +0 -285
  194. package/src/v2/shadcn/_reference/SimulationBanner.tsx +0 -57
  195. package/src/v2/shadcn/_reference/SortControls.tsx +0 -65
  196. package/src/v2/shadcn/_reference/StatusBadge.tsx +0 -49
  197. package/src/v2/shadcn/_reference/StyleGuideContent.tsx +0 -331
  198. package/src/v2/shadcn/_reference/TableActionMenu.tsx +0 -126
  199. package/src/v2/shadcn/_reference/ThemeProvider.tsx +0 -119
  200. package/src/v2/shadcn/_reference/ThemeSettings.tsx +0 -73
  201. package/src/v2/shadcn/_reference/TopNavigation.tsx +0 -332
  202. package/src/v2/shadcn/_reference/UserActivityHistory.tsx +0 -209
  203. package/src/v2/shadcn/_reference/UserLanguageSettings.tsx +0 -94
  204. package/src/v2/shadcn/_reference/UserPanel.tsx +0 -472
  205. package/src/v2/shadcn/_reference/UsersTable.tsx +0 -1023
  206. package/src/v2/shadcn/_reference/WaiverForm.tsx +0 -301
  207. package/src/v2/shadcn/_reference/WaiversGeneralSettings.tsx +0 -46
  208. package/src/v2/shadcn/_reference/WaiversTable.tsx +0 -290
  209. package/src/v2/shadcn/_reference/WaiversTemplatesSettings.tsx +0 -416
  210. package/src/v2/shadcn/_reference/ai/AIChatPanel.tsx +0 -313
  211. package/src/v2/shadcn/_reference/ai/AIChatSearchBar.tsx +0 -36
  212. package/src/v2/shadcn/_reference/ai/ChatInteractiveBlock.tsx +0 -298
  213. package/src/v2/shadcn/_reference/ai/ChatMessageContent.tsx +0 -40
  214. package/src/v2/shadcn/_reference/ai/parseInteractiveBlocks.ts +0 -142
  215. package/src/v2/shadcn/_reference/auth/AuthLayout.tsx +0 -55
  216. package/src/v2/shadcn/_reference/auth/CreatePasswordForm.tsx +0 -285
  217. package/src/v2/shadcn/_reference/auth/CreatePasswordPanel.tsx +0 -20
  218. package/src/v2/shadcn/_reference/auth/LoginFooter.tsx +0 -14
  219. package/src/v2/shadcn/_reference/auth/LoginForm.tsx +0 -205
  220. package/src/v2/shadcn/_reference/auth/LoginPanel.tsx +0 -41
  221. package/src/v2/shadcn/_reference/auth/ResetPasswordForm.tsx +0 -102
  222. package/src/v2/shadcn/_reference/auth/ResetPasswordPanel.tsx +0 -20
  223. package/src/v2/shadcn/_reference/auth/VerifyEmailForm.tsx +0 -95
  224. package/src/v2/shadcn/_reference/auth/VerifyEmailPanel.tsx +0 -20
  225. package/src/v2/shadcn/_reference/email/EmailAttachment.tsx +0 -119
  226. package/src/v2/shadcn/_reference/email/EmailAutomation.tsx +0 -92
  227. package/src/v2/shadcn/_reference/email/EmailPlaceholders.tsx +0 -64
  228. package/src/v2/shadcn/_reference/email/UnlayerEmailEditor.tsx +0 -41
  229. package/src/v2/shadcn/_reference/email/emailTemplateData.ts +0 -53
  230. package/src/v2/shadcn/_reference/emptyStateIcons.tsx +0 -103
  231. package/src/v2/shadcn/_reference/games/MazeGame.tsx +0 -394
  232. package/src/v2/shadcn/_reference/games/RunnerGame.tsx +0 -497
  233. package/src/v2/shadcn/_reference/logos/BookedLogoFull.tsx +0 -36
  234. package/src/v2/shadcn/_reference/logos/BookedLogoMark.tsx +0 -31
  235. package/src/v2/shadcn/_reference/logos/BookedLogoNew.tsx +0 -36
  236. package/src/v2/shadcn/_reference/pricing/DynamicPricingRulesEditor.tsx +0 -401
  237. package/src/v2/shadcn/_reference/pricing/DynamicPricingTierCard.tsx +0 -77
  238. package/src/v2/shadcn/_reference/pricing/DynamicPricingTiersList.tsx +0 -218
  239. package/src/v2/shadcn/_reference/pricing/PricingCalendar.tsx +0 -810
  240. package/src/v2/shadcn/_reference/pricing/PricingPeriodCard.tsx +0 -152
  241. package/src/v2/shadcn/_reference/pricing/PricingPeriodForm.tsx +0 -377
  242. package/src/v2/shadcn/_reference/pricing/PricingPeriodsList.tsx +0 -213
  243. package/src/v2/shadcn/_reference/pricing/getRuleSummary.ts +0 -39
  244. package/src/v2/shadcn/_reference/products/AvailabilityRulesSection.tsx +0 -184
  245. package/src/v2/shadcn/_reference/products/AvailabilitySection.tsx +0 -677
  246. package/src/v2/shadcn/_reference/products/BookingTypeConfigOptions.tsx +0 -40
  247. package/src/v2/shadcn/_reference/products/CapacityPeriodsSection.tsx +0 -238
  248. package/src/v2/shadcn/_reference/products/DynamicPricingTiersSection.tsx +0 -131
  249. package/src/v2/shadcn/_reference/products/GiftCardOrdersTab.tsx +0 -192
  250. package/src/v2/shadcn/_reference/products/GiftCardSettings.tsx +0 -342
  251. package/src/v2/shadcn/_reference/products/PackageProductsSection.tsx +0 -322
  252. package/src/v2/shadcn/_reference/products/PricingSection.tsx +0 -173
  253. package/src/v2/shadcn/_reference/products/ProductTypeFields.tsx +0 -353
  254. package/src/v2/shadcn/_reference/products/ProductTypeIcon.tsx +0 -95
  255. package/src/v2/shadcn/_reference/products/VariablePricingSection.tsx +0 -140
  256. package/src/v2/shadcn/_reference/products/productTypeConfig.ts +0 -182
  257. package/src/v2/shadcn/_reference/shared/BackButton.tsx +0 -50
  258. package/src/v2/shadcn/_reference/shared/CancelConfirmationDialog.tsx +0 -18
  259. package/src/v2/shadcn/_reference/shared/ConfirmationDialog.tsx +0 -136
  260. package/src/v2/shadcn/_reference/shared/DeleteConfirmationDialog.tsx +0 -18
  261. package/src/v2/shadcn/_reference/shared/DeleteEntityPage.tsx +0 -221
  262. package/src/v2/shadcn/_reference/shared/SidebarIcons.tsx +0 -108
  263. package/src/v2/shadcn/_reference/shared/UnifiedSidebar.tsx +0 -722
  264. package/src/v2/shadcn/_reference/tables/BulkActionsBar.tsx +0 -68
  265. package/src/v2/shadcn/_reference/tables/DataTable.tsx +0 -221
  266. package/src/v2/shadcn/_reference/tables/TableControls.tsx +0 -94
  267. package/src/v2/shadcn/_reference/tables/index.ts +0 -3
  268. package/src/v2/shadcn/_reference/tables/types.ts +0 -79
  269. package/src/v2/shadcn/_reference/zones/LegacyZoneSettings.tsx +0 -299
  270. package/src/v2/shadcn/components/ui/accordion.stories.tsx +0 -63
  271. package/src/v2/shadcn/components/ui/accordion.tsx +0 -52
  272. package/src/v2/shadcn/components/ui/alert-dialog.stories.tsx +0 -44
  273. package/src/v2/shadcn/components/ui/alert-dialog.tsx +0 -104
  274. package/src/v2/shadcn/components/ui/alert.stories.tsx +0 -44
  275. package/src/v2/shadcn/components/ui/alert.tsx +0 -43
  276. package/src/v2/shadcn/components/ui/aspect-ratio.stories.tsx +0 -46
  277. package/src/v2/shadcn/components/ui/aspect-ratio.tsx +0 -5
  278. package/src/v2/shadcn/components/ui/avatar.stories.tsx +0 -39
  279. package/src/v2/shadcn/components/ui/avatar.tsx +0 -38
  280. package/src/v2/shadcn/components/ui/badge.stories.tsx +0 -17
  281. package/src/v2/shadcn/components/ui/badge.tsx +0 -30
  282. package/src/v2/shadcn/components/ui/breadcrumb.stories.tsx +0 -91
  283. package/src/v2/shadcn/components/ui/breadcrumb.tsx +0 -90
  284. package/src/v2/shadcn/components/ui/button.stories.tsx +0 -20
  285. package/src/v2/shadcn/components/ui/button.tsx +0 -60
  286. package/src/v2/shadcn/components/ui/calendar.stories.tsx +0 -61
  287. package/src/v2/shadcn/components/ui/calendar.tsx +0 -54
  288. package/src/v2/shadcn/components/ui/card.stories.tsx +0 -37
  289. package/src/v2/shadcn/components/ui/card.tsx +0 -43
  290. package/src/v2/shadcn/components/ui/carousel.stories.tsx +0 -92
  291. package/src/v2/shadcn/components/ui/carousel.tsx +0 -224
  292. package/src/v2/shadcn/components/ui/checkbox.scss +0 -38
  293. package/src/v2/shadcn/components/ui/checkbox.stories.tsx +0 -23
  294. package/src/v2/shadcn/components/ui/checkbox.tsx +0 -24
  295. package/src/v2/shadcn/components/ui/collapsible.stories.tsx +0 -59
  296. package/src/v2/shadcn/components/ui/collapsible.tsx +0 -9
  297. package/src/v2/shadcn/components/ui/command.stories.tsx +0 -70
  298. package/src/v2/shadcn/components/ui/command.tsx +0 -132
  299. package/src/v2/shadcn/components/ui/context-menu.stories.tsx +0 -72
  300. package/src/v2/shadcn/components/ui/context-menu.tsx +0 -178
  301. package/src/v2/shadcn/components/ui/dialog.stories.tsx +0 -67
  302. package/src/v2/shadcn/components/ui/dialog.tsx +0 -95
  303. package/src/v2/shadcn/components/ui/drawer.stories.tsx +0 -50
  304. package/src/v2/shadcn/components/ui/drawer.tsx +0 -87
  305. package/src/v2/shadcn/components/ui/dropdown-menu.stories.tsx +0 -73
  306. package/src/v2/shadcn/components/ui/dropdown-menu.tsx +0 -179
  307. package/src/v2/shadcn/components/ui/form.stories.tsx +0 -105
  308. package/src/v2/shadcn/components/ui/form.tsx +0 -129
  309. package/src/v2/shadcn/components/ui/hover-card.stories.tsx +0 -35
  310. package/src/v2/shadcn/components/ui/hover-card.tsx +0 -27
  311. package/src/v2/shadcn/components/ui/input-otp.stories.tsx +0 -72
  312. package/src/v2/shadcn/components/ui/input-otp.tsx +0 -61
  313. package/src/v2/shadcn/components/ui/input.stories.tsx +0 -16
  314. package/src/v2/shadcn/components/ui/input.tsx +0 -25
  315. package/src/v2/shadcn/components/ui/label.stories.tsx +0 -13
  316. package/src/v2/shadcn/components/ui/label.tsx +0 -17
  317. package/src/v2/shadcn/components/ui/menubar.stories.tsx +0 -86
  318. package/src/v2/shadcn/components/ui/menubar.tsx +0 -207
  319. package/src/v2/shadcn/components/ui/navigation-menu.stories.tsx +0 -68
  320. package/src/v2/shadcn/components/ui/navigation-menu.tsx +0 -120
  321. package/src/v2/shadcn/components/ui/pagination.stories.tsx +0 -78
  322. package/src/v2/shadcn/components/ui/pagination.tsx +0 -81
  323. package/src/v2/shadcn/components/ui/popover.stories.tsx +0 -44
  324. package/src/v2/shadcn/components/ui/popover.tsx +0 -29
  325. package/src/v2/shadcn/components/ui/progress.stories.tsx +0 -17
  326. package/src/v2/shadcn/components/ui/progress.tsx +0 -23
  327. package/src/v2/shadcn/components/ui/radio-card.stories.tsx +0 -68
  328. package/src/v2/shadcn/components/ui/radio-card.tsx +0 -52
  329. package/src/v2/shadcn/components/ui/radio-group.stories.tsx +0 -77
  330. package/src/v2/shadcn/components/ui/radio-group.tsx +0 -35
  331. package/src/v2/shadcn/components/ui/scroll-area.stories.tsx +0 -56
  332. package/src/v2/shadcn/components/ui/scroll-area.tsx +0 -38
  333. package/src/v2/shadcn/components/ui/select.stories.tsx +0 -60
  334. package/src/v2/shadcn/components/ui/select.tsx +0 -148
  335. package/src/v2/shadcn/components/ui/separator.stories.tsx +0 -30
  336. package/src/v2/shadcn/components/ui/separator.tsx +0 -20
  337. package/src/v2/shadcn/components/ui/sheet.stories.tsx +0 -115
  338. package/src/v2/shadcn/components/ui/sheet.tsx +0 -107
  339. package/src/v2/shadcn/components/ui/sidebar.stories.tsx +0 -167
  340. package/src/v2/shadcn/components/ui/sidebar.tsx +0 -637
  341. package/src/v2/shadcn/components/ui/skeleton.stories.tsx +0 -36
  342. package/src/v2/shadcn/components/ui/skeleton.tsx +0 -7
  343. package/src/v2/shadcn/components/ui/slider.stories.tsx +0 -16
  344. package/src/v2/shadcn/components/ui/slider.tsx +0 -23
  345. package/src/v2/shadcn/components/ui/switch.scss +0 -63
  346. package/src/v2/shadcn/components/ui/switch.stories.tsx +0 -23
  347. package/src/v2/shadcn/components/ui/switch.tsx +0 -24
  348. package/src/v2/shadcn/components/ui/table-pagination.stories.tsx +0 -81
  349. package/src/v2/shadcn/components/ui/table-pagination.tsx +0 -61
  350. package/src/v2/shadcn/components/ui/table.stories.tsx +0 -40
  351. package/src/v2/shadcn/components/ui/table.tsx +0 -72
  352. package/src/v2/shadcn/components/ui/tabs.stories.tsx +0 -85
  353. package/src/v2/shadcn/components/ui/tabs.tsx +0 -53
  354. package/src/v2/shadcn/components/ui/textarea.stories.tsx +0 -15
  355. package/src/v2/shadcn/components/ui/textarea.tsx +0 -21
  356. package/src/v2/shadcn/components/ui/toast.stories.tsx +0 -77
  357. package/src/v2/shadcn/components/ui/toast.tsx +0 -111
  358. package/src/v2/shadcn/components/ui/toaster.stories.tsx +0 -46
  359. package/src/v2/shadcn/components/ui/toaster.tsx +0 -24
  360. package/src/v2/shadcn/components/ui/toggle-group.stories.tsx +0 -95
  361. package/src/v2/shadcn/components/ui/toggle-group.tsx +0 -49
  362. package/src/v2/shadcn/components/ui/toggle.stories.tsx +0 -18
  363. package/src/v2/shadcn/components/ui/toggle.tsx +0 -37
  364. package/src/v2/shadcn/components/ui/tooltip.stories.tsx +0 -57
  365. package/src/v2/shadcn/components/ui/tooltip.tsx +0 -28
  366. package/src/v2/shadcn/components/ui/use-toast.ts +0 -3
  367. package/src/v2/shadcn/hooks/use-mobile.tsx +0 -19
  368. package/src/v2/shadcn/hooks/use-toast.ts +0 -184
  369. package/src/v2/shadcn/index.ts +0 -76
  370. package/src/v2/shadcn/lib/utils.ts +0 -6
  371. package/src/v2/shadcn/styles/globals.css +0 -112
@@ -1,313 +0,0 @@
1
- import React, { useState, useRef, useEffect } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
- import { ScrollArea } from '../ui/scroll-area';
4
- import { IconCross, IconNew, IconArrowUp } from '../../../icons';
5
- import { ChatMessageContent } from './ChatMessageContent';
6
- import { supabase } from '@/integrations/supabase/client';
7
- import { useAIChatPanel } from '@/contexts/AIChatPanelContext';
8
- import { useUser } from '@/contexts/UserContext';
9
- import { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';
10
-
11
- interface AIChatPanelProps {
12
- isOpen: boolean;
13
- onClose: () => void;
14
- }
15
-
16
- export const AIChatPanel: React.FC<AIChatPanelProps> = ({ isOpen, onClose }) => {
17
- const [inputValue, setInputValue] = useState('');
18
- const { messages, isLoading, sendMessage, addBotMessage, clearMessages, consumePendingMessage } = useAIChatPanel();
19
- const messagesEndRef = useRef<HTMLDivElement>(null);
20
- const inputRef = useRef<HTMLInputElement>(null);
21
- const panelRef = useRef<HTMLDivElement>(null);
22
- const scrollYRef = useRef(0);
23
- const navigate = useNavigate();
24
- const { profile } = useUser();
25
- const hasSentPending = useRef(false);
26
-
27
- // Send pending message from search bar when panel opens
28
- useEffect(() => {
29
- if (isOpen && !hasSentPending.current) {
30
- const pending = consumePendingMessage();
31
- if (pending) {
32
- sendMessage(pending);
33
- }
34
- hasSentPending.current = true;
35
- }
36
- if (!isOpen) {
37
- hasSentPending.current = false;
38
- }
39
- }, [isOpen, consumePendingMessage, sendMessage]);
40
-
41
- useEffect(() => {
42
- messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
43
- }, [messages]);
44
-
45
- useEffect(() => {
46
- if (isOpen) {
47
- // Capture current scroll position and lock body in place
48
- // This prevents iOS from scrolling the layout viewport when keyboard opens
49
- scrollYRef.current = window.scrollY;
50
- document.body.style.position = 'fixed';
51
- document.body.style.top = `-${scrollYRef.current}px`;
52
- document.body.style.left = '0';
53
- document.body.style.right = '0';
54
- document.body.style.overflow = 'hidden';
55
- setTimeout(() => inputRef.current?.focus(), 300);
56
- } else {
57
- // Restore body and scroll position
58
- document.body.style.position = '';
59
- document.body.style.top = '';
60
- document.body.style.left = '';
61
- document.body.style.right = '';
62
- document.body.style.overflow = '';
63
- window.scrollTo(0, scrollYRef.current);
64
- }
65
- return () => {
66
- document.body.style.position = '';
67
- document.body.style.top = '';
68
- document.body.style.left = '';
69
- document.body.style.right = '';
70
- document.body.style.overflow = '';
71
- };
72
- }, [isOpen]);
73
-
74
- // Prevent any touch-driven scrolling from leaking to the background
75
- useEffect(() => {
76
- if (!isOpen) return;
77
-
78
- const preventScroll = (e: TouchEvent) => {
79
- // Allow scrolling inside the ScrollArea, block everything else
80
- const target = e.target as HTMLElement;
81
- const scrollArea = panelRef.current?.querySelector('[data-radix-scroll-area-viewport]');
82
- if (scrollArea && scrollArea.contains(target)) return;
83
- e.preventDefault();
84
- };
85
-
86
- document.addEventListener('touchmove', preventScroll, { passive: false });
87
- return () => document.removeEventListener('touchmove', preventScroll);
88
- }, [isOpen]);
89
-
90
- if (!isOpen) return null;
91
-
92
- const handleSubmit = (e: React.FormEvent) => {
93
- e.preventDefault();
94
- if (!inputValue.trim() || isLoading) return;
95
- sendMessage(inputValue.trim());
96
- setInputValue('');
97
- // Re-focus input after submission so user can keep typing
98
- setTimeout(() => inputRef.current?.focus(), 0);
99
- };
100
-
101
- const handleClose = () => {
102
- onClose();
103
- };
104
-
105
- const handleNewChat = () => {
106
- clearMessages();
107
- };
108
-
109
- const handleInteractiveSelect = (value: string) => {
110
- sendMessage(value);
111
- };
112
-
113
- const handleNavigate = (path: string) => {
114
- onClose();
115
- navigate(path);
116
- };
117
-
118
- const handleInteractiveAction = async (action: string, data?: Record<string, any>) => {
119
- if (action === 'cancel') {
120
- sendMessage('Cancel this action.');
121
- return;
122
- }
123
- if (action === 'edit') {
124
- sendMessage('I want to edit the details.');
125
- return;
126
- }
127
- if (action === 'create_user' && data) {
128
- // Show a short user action message
129
- sendMessage(`Create ${data.firstName} ${data.lastName}`);
130
- try {
131
- const { data: sessionData } = await supabase.auth.getSession();
132
- if (!sessionData.session) {
133
- addBotMessage('❌ Not authenticated. Please log in first.');
134
- return;
135
- }
136
-
137
- const providers: any[] = [];
138
- if (data.providerId) {
139
- providers.push({ id: data.providerId, type: 'provider', role: data.role, companyId: data.companyId });
140
- }
141
- if (data.companyId) {
142
- providers.push({ id: data.companyId, type: 'company', role: data.role });
143
- }
144
-
145
- const response = await fetch(`${import.meta.env.VITE_SUPABASE_URL}/functions/v1/create-admin-user`, {
146
- method: 'POST',
147
- headers: {
148
- Authorization: `Bearer ${sessionData.session.access_token}`,
149
- 'Content-Type': 'application/json',
150
- },
151
- body: JSON.stringify({
152
- firstName: data.firstName,
153
- lastName: data.lastName,
154
- email: data.email,
155
- role: data.role,
156
- providers: providers.length > 0 ? providers : undefined,
157
- }),
158
- });
159
-
160
- const result = await response.json();
161
- if (!response.ok) throw new Error(result.error || 'Failed to create user');
162
-
163
- const roleName = (data.role || '').replace(/_/g, ' ');
164
- addBotMessage(`✅ **${data.firstName} ${data.lastName}** has been created as **${roleName}**. Their temporary password has been generated.`);
165
- } catch (err: any) {
166
- addBotMessage(`❌ Failed to create user: ${err.message}`);
167
- }
168
- return;
169
- }
170
- // Default: send the action as a message
171
- sendMessage(action);
172
- };
173
-
174
- return (
175
- <>
176
- {/* Overlay */}
177
- <div
178
- className="fixed inset-0 z-40 animate-fade-in touch-none"
179
- style={{ backgroundColor: 'var(--overlay-curtain)' }}
180
- onClick={handleClose}
181
- onTouchMove={(e) => e.preventDefault()}
182
- />
183
-
184
- {/* Panel — uses inset-0 so it always fills the available viewport,
185
- even when the mobile keyboard shrinks the visual viewport */}
186
- <div
187
- ref={panelRef}
188
- className="fixed inset-0 sm:left-auto sm:w-[420px] bg-surface-primary shadow-xl z-50 animate-slide-in-right flex flex-col overscroll-none"
189
- onClick={(e) => e.stopPropagation()}
190
- >
191
- {/* Header */}
192
- <div className="flex items-center justify-between p-4 border-b border-border-primary flex-shrink-0">
193
- <div className="flex items-center gap-2">
194
- <div className="bkit-icon-glow"><IconNew size={32} /></div>
195
- <h2 className="text-lg font-semibold text-label-primary">Brad Bot</h2>
196
- </div>
197
- <div className="flex items-center gap-1">
198
- {messages.length > 0 && (
199
- <button
200
- onClick={handleNewChat}
201
- className="text-xs font-medium text-label-secondary hover:text-label-primary transition-colors px-2 py-1.5 rounded-lg hover:bg-surface-primary-hover"
202
- >
203
- Clear
204
- </button>
205
- )}
206
- <button
207
- onClick={handleClose}
208
- className="p-2 rounded-lg hover:bg-surface-primary-hover transition-colors flex items-center justify-center"
209
- aria-label="Close assistant"
210
- >
211
- <IconCross className="w-5 h-5 text-label-secondary" />
212
- </button>
213
- </div>
214
- </div>
215
-
216
- {/* Messages */}
217
- <ScrollArea className="flex-1 min-h-0">
218
- <div className="p-4 space-y-3">
219
- {messages.length === 0 && (
220
- <div className="flex flex-col items-center justify-center py-16 text-center">
221
- <div className="mb-4 opacity-50 text-fill-secondary"><IconNew size={48} /></div>
222
- <h3 className="text-sm font-semibold text-label-primary mb-1">Brad Bot</h3>
223
- <p className="text-xs text-label-secondary max-w-[260px]">
224
- Search, query data, or make changes across your dashboard.
225
- </p>
226
- </div>
227
- )}
228
- {messages.map((msg) => (
229
- <div
230
- key={msg.id}
231
- className={`flex flex-col ${msg.role === 'user' ? 'items-end' : 'items-start'}`}
232
- >
233
- {/* Identity row */}
234
- <div className={`flex items-center gap-1.5 mb-1 ${msg.role === 'user' ? 'flex-row-reverse' : ''}`}>
235
- {msg.role === 'user' ? (
236
- <>
237
- <Avatar className="h-5 w-5">
238
- {profile?.avatarUrl && <AvatarImage src={profile.avatarUrl} alt={profile.fullName} />}
239
- <AvatarFallback className="text-[10px] bg-surface-tertiary text-label-secondary">
240
- {profile?.initials || '?'}
241
- </AvatarFallback>
242
- </Avatar>
243
- <span className="text-xs font-semibold text-label-secondary">{profile?.firstName || 'You'}</span>
244
- </>
245
- ) : (
246
- <>
247
- <div className="text-fill-secondary"><IconNew size={16} /></div>
248
- <span className="text-xs font-semibold text-label-secondary">Brad Bot</span>
249
- </>
250
- )}
251
- </div>
252
- <div className={`max-w-[90%] rounded-lg px-4 py-2.5 text-sm ${
253
- msg.role === 'user'
254
- ? 'bg-surface-primary border border-border-primary text-label-primary'
255
- : 'bg-surface-tertiary text-label-primary'
256
- }`}>
257
- {msg.role === 'assistant' ? (
258
- <ChatMessageContent
259
- content={msg.content}
260
- onSelect={handleInteractiveSelect}
261
- onAction={handleInteractiveAction}
262
- onNavigate={handleNavigate}
263
- disabled={isLoading}
264
- />
265
- ) : (
266
- <div className="whitespace-pre-wrap">{msg.content}</div>
267
- )}
268
- </div>
269
- </div>
270
- ))}
271
- {isLoading && messages[messages.length - 1]?.role === 'user' && (
272
- <div className="flex justify-start">
273
- <div className="bg-surface-tertiary rounded-lg px-4 py-2.5">
274
- <div className="flex items-center gap-1.5 mb-1">
275
- <div className="bkit-icon-glow"><IconNew size={16} /></div>
276
- <span className="text-xs font-semibold text-label-secondary">Brad Bot</span>
277
- </div>
278
- <div className="flex gap-1.5">
279
- <span className="w-2 h-2 rounded-full bkit-thinking-dot" />
280
- <span className="w-2 h-2 rounded-full bkit-thinking-dot [animation-delay:0.2s]" />
281
- <span className="w-2 h-2 rounded-full bkit-thinking-dot [animation-delay:0.4s]" />
282
- </div>
283
- </div>
284
- </div>
285
- )}
286
- <div ref={messagesEndRef} />
287
- </div>
288
- </ScrollArea>
289
-
290
- {/* Input */}
291
- <div className="border-t border-border-primary p-4 pb-[max(1rem,env(safe-area-inset-bottom))] flex-shrink-0">
292
- <form onSubmit={handleSubmit} className="flex items-center gap-2">
293
- <input
294
- ref={inputRef}
295
- type="text"
296
- value={inputValue}
297
- onChange={(e) => setInputValue(e.target.value)}
298
- className="flex-1 h-10 rounded-lg border border-border-primary bg-surface-primary px-3 text-base text-label-primary focus:outline-none focus:border-border-selected"
299
- placeholder="Ask Brad Bot anything..."
300
- />
301
- <button
302
- type="submit"
303
- className="h-10 w-10 flex-shrink-0 flex items-center justify-center rounded-lg bg-fill-action transition-opacity"
304
- aria-label="Send message"
305
- >
306
- <IconArrowUp size={24} className="[&_path]:!fill-white" />
307
- </button>
308
- </form>
309
- </div>
310
- </div>
311
- </>
312
- );
313
- };
@@ -1,36 +0,0 @@
1
- import React, { useState, useRef } from 'react';
2
- import { IconNew } from '../../../icons';
3
- import { useAIChatPanel } from '@/contexts/AIChatPanelContext';
4
-
5
- const AIChatSearchBar: React.FC = () => {
6
- const [inputValue, setInputValue] = useState('');
7
- const inputRef = useRef<HTMLInputElement>(null);
8
- const { openPanelWithMessage } = useAIChatPanel();
9
-
10
- const handleSubmit = (e: React.FormEvent) => {
11
- e.preventDefault();
12
- if (!inputValue.trim()) return;
13
- openPanelWithMessage(inputValue.trim());
14
- setInputValue('');
15
- };
16
-
17
- return (
18
- <div className="w-full pt-6">
19
- <div className="w-full rounded-xl border border-border-primary bg-surface-secondary">
20
- <form onSubmit={handleSubmit} className="flex items-center gap-3 p-3">
21
- <div className="w-8 h-8 flex-shrink-0 bkit-icon-glow"><IconNew size={32} /></div>
22
- <input
23
- ref={inputRef}
24
- type="text"
25
- value={inputValue}
26
- onChange={(e) => setInputValue(e.target.value)}
27
- className="flex-1 bg-transparent text-[16px] text-label-primary focus:outline-none"
28
- placeholder="Ask Brad Bot anything..."
29
- />
30
- </form>
31
- </div>
32
- </div>
33
- );
34
- };
35
-
36
- export default AIChatSearchBar;
@@ -1,298 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
- import { format } from 'date-fns';
4
- import { Button } from '../ui/button';
5
- import { Calendar } from '../ui/calendar';
6
- import { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';
7
- import type {
8
- InteractiveBlock,
9
- RadioSelectBlock,
10
- UserCardBlock,
11
- ActionButtonsBlock,
12
- QuickActionsBlock,
13
- EntityCardBlock,
14
- } from './parseInteractiveBlocks';
15
-
16
- interface ChatInteractiveBlockProps {
17
- block: InteractiveBlock;
18
- onSelect?: (value: string) => void;
19
- onAction?: (action: string, data?: Record<string, any>) => void;
20
- onNavigate?: (path: string) => void;
21
- disabled?: boolean;
22
- }
23
-
24
- const RadioSelect: React.FC<{
25
- block: RadioSelectBlock;
26
- onSelect?: (value: string) => void;
27
- disabled?: boolean;
28
- }> = ({ block, onSelect, disabled }) => {
29
- const [selected, setSelected] = useState<string | null>(null);
30
-
31
- const handleSelect = (value: string) => {
32
- if (disabled || selected) return;
33
- setSelected(value);
34
- onSelect?.(value);
35
- };
36
-
37
- return (
38
- <div className="flex flex-col gap-1.5 mt-2">
39
- {block.options.map((opt) => (
40
- <button
41
- key={opt.value}
42
- onClick={() => handleSelect(opt.value)}
43
- disabled={disabled || !!selected}
44
- className={`flex flex-col items-start gap-0.5 px-3 py-2 rounded-lg border text-left transition-colors ${
45
- selected === opt.value
46
- ? 'border-border-selected bg-surface-action-soft'
47
- : selected
48
- ? 'border-border-primary bg-surface-secondary opacity-50'
49
- : 'border-border-primary bg-surface-secondary hover:bg-surface-primary-hover'
50
- } ${disabled || selected ? 'cursor-default' : 'cursor-pointer'}`}
51
- >
52
- <span className="text-sm font-medium text-label-primary">{opt.label}</span>
53
- {opt.description && (
54
- <span className="text-xs text-label-secondary">{opt.description}</span>
55
- )}
56
- </button>
57
- ))}
58
- </div>
59
- );
60
- };
61
-
62
- const UserCard: React.FC<{ block: UserCardBlock }> = ({ block }) => {
63
- const initials = `${block.firstName.charAt(0)}${block.lastName.charAt(0)}`.toUpperCase();
64
- const roleName = (block.roleLabel || block.role || '').replace(/_/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase());
65
- const assignmentName = block.providerName || block.companyName;
66
-
67
- return (
68
- <div className="flex items-start gap-3 p-3 bg-surface-primary border border-border-primary rounded-lg mt-2 min-w-[320px]">
69
- <div className="w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 bg-surface-tertiary border border-border-primary">
70
- <span className="text-label-secondary font-bold text-sm">{initials}</span>
71
- </div>
72
- <div className="flex flex-col gap-1 flex-1 min-w-0">
73
- <span className="text-label-primary font-medium text-sm">{block.firstName} {block.lastName}</span>
74
- <span className="text-label-secondary text-xs truncate">{block.email}</span>
75
- <div className="flex flex-wrap items-center gap-1.5 mt-0.5">
76
- {roleName && (
77
- <div className="flex justify-center items-center gap-2 bg-surface-tertiary px-2 py-1 rounded-lg w-fit">
78
- <span className="text-label-secondary text-[10px] leading-3 font-mono font-semibold whitespace-nowrap">
79
- {roleName}
80
- </span>
81
- </div>
82
- )}
83
- {assignmentName && (
84
- <div className="flex justify-center items-center gap-2 bg-surface-tertiary px-2 py-1 rounded-lg w-fit">
85
- <span className="text-label-secondary text-[10px] leading-3 font-mono font-semibold whitespace-nowrap">
86
- {assignmentName}
87
- </span>
88
- </div>
89
- )}
90
- </div>
91
- </div>
92
- </div>
93
- );
94
- };
95
-
96
- const ActionButtons: React.FC<{
97
- block: ActionButtonsBlock;
98
- onAction?: (action: string, data?: Record<string, any>) => void;
99
- disabled?: boolean;
100
- }> = ({ block, onAction, disabled }) => {
101
- const [clicked, setClicked] = useState<string | null>(null);
102
-
103
- const handleClick = (btn: typeof block.buttons[0]) => {
104
- if (disabled || clicked) return;
105
- setClicked(btn.action);
106
- onAction?.(btn.action, btn.data);
107
- };
108
-
109
- const variantMap: Record<string, any> = {
110
- primary: 'default',
111
- ghost: 'ghost',
112
- cancel: 'cancel',
113
- destructive: 'destructive',
114
- };
115
-
116
- return (
117
- <div className="flex flex-col gap-1.5 mt-2">
118
- {block.buttons.map((btn) => (
119
- <Button
120
- key={btn.action}
121
- variant={variantMap[btn.variant] || 'default'}
122
- size="sm"
123
- onClick={() => handleClick(btn)}
124
- disabled={disabled || !!clicked}
125
- className={`w-full ${btn.variant === 'ghost' ? 'bg-surface-primary' : ''} ${clicked && clicked !== btn.action ? 'opacity-50' : ''}`}
126
- >
127
- {clicked === btn.action ? 'Processing...' : btn.label}
128
- </Button>
129
- ))}
130
- </div>
131
- );
132
- };
133
-
134
- const QuickActions: React.FC<{
135
- block: QuickActionsBlock;
136
- onSelect?: (value: string) => void;
137
- disabled?: boolean;
138
- }> = ({ block, onSelect, disabled }) => {
139
- const [clicked, setClicked] = useState<string | null>(null);
140
- const [datePickerAction, setDatePickerAction] = useState<string | null>(null);
141
- const [selectedDate, setSelectedDate] = useState<Date>();
142
-
143
- const handleClick = (action: typeof block.actions[0]) => {
144
- if (disabled || clicked) return;
145
-
146
- if (action.type === 'date-picker') {
147
- setDatePickerAction(action.action);
148
- return;
149
- }
150
-
151
- setClicked(action.action);
152
- onSelect?.(action.action);
153
- };
154
-
155
- const handleDateSelect = (date: Date | undefined) => {
156
- if (!date || !datePickerAction) return;
157
- setSelectedDate(date);
158
- const formatted = format(date, 'do MMMM yyyy');
159
- setClicked(datePickerAction);
160
- setDatePickerAction(null);
161
- onSelect?.(`Show bookings for ${formatted}`);
162
- };
163
-
164
- return (
165
- <div className="flex flex-col gap-1.5 mt-2">
166
- {block.actions.map((action) => (
167
- action.type === 'date-picker' ? (
168
- <Popover key={action.action} open={datePickerAction === action.action} onOpenChange={(open) => !open && setDatePickerAction(null)}>
169
- <PopoverTrigger asChild>
170
- <button
171
- onClick={() => handleClick(action)}
172
- disabled={disabled || !!clicked}
173
- className={`flex items-center gap-2 px-3 py-2.5 rounded-lg border text-left transition-colors ${
174
- clicked === action.action
175
- ? 'border-border-selected bg-surface-action-soft'
176
- : clicked
177
- ? 'border-border-primary bg-surface-secondary opacity-50'
178
- : 'border-border-primary bg-surface-secondary hover:bg-surface-primary-hover'
179
- } ${disabled || clicked ? 'cursor-default' : 'cursor-pointer'}`}
180
- >
181
- <span className="text-sm font-medium text-label-primary">{action.label}</span>
182
- </button>
183
- </PopoverTrigger>
184
- <PopoverContent className="w-auto p-0" align="start" side="top">
185
- <Calendar
186
- mode="single"
187
- selected={selectedDate}
188
- onSelect={handleDateSelect}
189
- className="p-3 pointer-events-auto"
190
- />
191
- </PopoverContent>
192
- </Popover>
193
- ) : (
194
- <button
195
- key={action.action}
196
- onClick={() => handleClick(action)}
197
- disabled={disabled || !!clicked}
198
- className={`flex items-center gap-2 px-3 py-2.5 rounded-lg border text-left transition-colors ${
199
- clicked === action.action
200
- ? 'border-border-selected bg-surface-action-soft'
201
- : clicked
202
- ? 'border-border-primary bg-surface-secondary opacity-50'
203
- : 'border-border-primary bg-surface-secondary hover:bg-surface-primary-hover'
204
- } ${disabled || clicked ? 'cursor-default' : 'cursor-pointer'}`}
205
- >
206
- <span className="text-sm font-medium text-label-primary">{action.label}</span>
207
- </button>
208
- )
209
- ))}
210
- </div>
211
- );
212
- };
213
-
214
- const EntityCards: React.FC<{
215
- block: EntityCardBlock;
216
- onNavigate?: (path: string) => void;
217
- }> = ({ block, onNavigate }) => {
218
- const getEntityPath = (item: typeof block.items[0]): string | null => {
219
- const providerPrefix = item.providerType === 'promoter' ? 'promoter' : 'venue';
220
-
221
- switch (item.entityType) {
222
- case 'customer':
223
- if (item.providerId) return `/${providerPrefix}/${item.providerId}/customers/${item.id}`;
224
- return `/admin/customers/${item.id}`;
225
- case 'user':
226
- if (item.providerId) return `/${providerPrefix}/${item.providerId}/users/${item.id}`;
227
- return `/admin/users/${item.id}`;
228
- case 'provider':
229
- return `/admin/providers/${item.id}`;
230
- case 'company':
231
- return `/admin/companies/${item.id}`;
232
- default:
233
- return null;
234
- }
235
- };
236
-
237
- const getInitials = (name: string): string => {
238
- return name
239
- .split(' ')
240
- .map((w) => w.charAt(0))
241
- .slice(0, 2)
242
- .join('')
243
- .toUpperCase();
244
- };
245
-
246
- return (
247
- <div className="flex flex-col gap-1.5 mt-2">
248
- {block.items.map((item) => {
249
- const path = getEntityPath(item);
250
- return (
251
- <button
252
- key={item.id}
253
- onClick={() => path && onNavigate?.(path)}
254
- className="flex items-center gap-3 p-3 bg-surface-secondary border border-border-primary rounded-lg text-left transition-colors hover:bg-surface-primary-hover cursor-pointer"
255
- >
256
- <div className="w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 bg-surface-tertiary border border-border-primary">
257
- <span className="text-label-secondary font-semibold text-xs">{getInitials(item.name)}</span>
258
- </div>
259
- <div className="flex flex-col gap-0.5 flex-1 min-w-0">
260
- <span className="text-sm font-medium text-label-primary">{item.name}</span>
261
- {item.subtitle && (
262
- <span className="text-xs text-label-secondary truncate">{item.subtitle}</span>
263
- )}
264
- </div>
265
- {item.badge && (
266
- <span className="text-xs font-medium text-label-secondary bg-surface-tertiary px-2 py-0.5 rounded flex-shrink-0">
267
- {item.badge}
268
- </span>
269
- )}
270
- </button>
271
- );
272
- })}
273
- </div>
274
- );
275
- };
276
-
277
- export const ChatInteractiveBlock: React.FC<ChatInteractiveBlockProps> = ({
278
- block,
279
- onSelect,
280
- onAction,
281
- onNavigate,
282
- disabled,
283
- }) => {
284
- switch (block.type) {
285
- case 'radio-select':
286
- return <RadioSelect block={block} onSelect={onSelect} disabled={disabled} />;
287
- case 'user-card':
288
- return <UserCard block={block} />;
289
- case 'action-buttons':
290
- return <ActionButtons block={block} onAction={onAction} disabled={disabled} />;
291
- case 'quick-actions':
292
- return <QuickActions block={block} onSelect={onSelect} disabled={disabled} />;
293
- case 'entity-card':
294
- return <EntityCards block={block} onNavigate={onNavigate} />;
295
- default:
296
- return null;
297
- }
298
- };
@@ -1,40 +0,0 @@
1
- import React from 'react';
2
- import { parseMessageContent } from './parseInteractiveBlocks';
3
- import { ChatInteractiveBlock } from './ChatInteractiveBlock';
4
-
5
- interface ChatMessageContentProps {
6
- content: string;
7
- onSelect?: (value: string) => void;
8
- onAction?: (action: string, data?: Record<string, any>) => void;
9
- onNavigate?: (path: string) => void;
10
- disabled?: boolean;
11
- }
12
-
13
- export const ChatMessageContent: React.FC<ChatMessageContentProps> = ({
14
- content,
15
- onSelect,
16
- onAction,
17
- onNavigate,
18
- disabled,
19
- }) => {
20
- const segments = parseMessageContent(content);
21
-
22
- return (
23
- <>
24
- {segments.map((seg, i) =>
25
- seg.kind === 'text' ? (
26
- <div key={i} className="whitespace-pre-wrap">{seg.content}</div>
27
- ) : (
28
- <ChatInteractiveBlock
29
- key={i}
30
- block={seg.block}
31
- onSelect={onSelect}
32
- onAction={onAction}
33
- onNavigate={onNavigate}
34
- disabled={disabled}
35
- />
36
- )
37
- )}
38
- </>
39
- );
40
- };