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

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 (414) hide show
  1. package/bitbucket-pipelines.yml +4 -13
  2. package/dist/Maintenance/Maintenance.scss.js +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/product-set/form/ProductsControl.d.ts +1 -2
  5. package/dist/product-set/form/ProductsControl.d.ts.map +1 -1
  6. package/dist/product-set/form/ProductsControl.js +24 -0
  7. package/dist/v2/components/ActionMenu/ActionMenu.scss.js +1 -1
  8. package/dist/v2/components/Badge/Badge.scss.js +1 -1
  9. package/dist/v2/components/Button/Button.scss.js +1 -1
  10. package/dist/v2/components/Button/GhostButton.scss.js +1 -1
  11. package/dist/v2/components/Checkbox/Checkbox.scss.js +1 -1
  12. package/dist/v2/components/DataTable/DataTable.d.ts.map +1 -1
  13. package/dist/v2/components/DataTable/DataTable.js +2 -86
  14. package/dist/v2/components/IconButton/IconButton.scss.js +1 -1
  15. package/dist/v2/components/Modal/DeleteModal.d.ts.map +1 -1
  16. package/dist/v2/components/Modal/DeleteModal.js +11 -13
  17. package/dist/v2/components/Modal/DeleteModal.scss.js +1 -1
  18. package/dist/v2/components/NPSScore/NPSScore.scss.js +1 -1
  19. package/dist/v2/components/NewTabs/NewTabs.scss.js +1 -1
  20. package/dist/v2/components/PeriodCard/PeriodCard.d.ts +66 -0
  21. package/dist/v2/components/PeriodCard/PeriodCard.d.ts.map +1 -0
  22. package/dist/v2/components/PeriodCard/PeriodCard.js +351 -0
  23. package/dist/v2/components/PeriodCard/PeriodCard.scss.js +6 -0
  24. package/dist/v2/components/PeriodCard/index.d.ts +3 -0
  25. package/dist/v2/components/PeriodCard/index.d.ts.map +1 -0
  26. package/dist/v2/components/ReorderRow/ReorderRow.d.ts +24 -0
  27. package/dist/v2/components/ReorderRow/ReorderRow.d.ts.map +1 -0
  28. package/dist/v2/components/ReorderRow/ReorderRow.js +109 -0
  29. package/dist/v2/components/ReorderRow/ReorderRow.scss.js +6 -0
  30. package/dist/v2/components/ReorderRow/index.d.ts +3 -0
  31. package/dist/v2/components/ReorderRow/index.d.ts.map +1 -0
  32. package/dist/v2/components/Select/Select.scss.js +1 -1
  33. package/dist/v2/components/StatusBadge/StatusBadge.scss.js +1 -1
  34. package/dist/v2/components/StepIndicator/StepIndicator.scss.js +1 -1
  35. package/dist/v2/components/Tabs/Tabs.scss.js +1 -1
  36. package/dist/v2/components/Toggle/Toggle.d.ts.map +1 -1
  37. package/dist/v2/components/Toggle/Toggle.js +5 -8
  38. package/dist/v2/components/Tooltip/Tooltip.scss.js +1 -1
  39. package/dist/v2/components/UserAvatar/UserAvatar.scss.js +1 -1
  40. package/dist/v2/components/UserPanel/UserPanel.scss.js +1 -1
  41. package/dist/v2/components/WYSIWYGEditor/WYSIWYGEditor.scss.js +1 -1
  42. package/dist/v2/components/ZoneCard/ZoneCard.scss.js +1 -1
  43. package/dist/v2/components/index.d.ts +4 -0
  44. package/dist/v2/components/index.d.ts.map +1 -1
  45. package/dist/v2/dashboard-analytics/chart/Chart.scss.js +1 -1
  46. package/dist/v2/dashboard-analytics/metric-card/MetricCard.scss.js +1 -1
  47. package/dist/v2/dashboard-analytics/venue-card/VenueCard.scss.js +1 -1
  48. package/dist/v2/dashboard-analytics/venue-closed-card/VenueClosedCard.scss.js +1 -1
  49. package/dist/v2/icons/index.js +16 -1
  50. package/dist/v2/index.d.ts +8 -0
  51. package/dist/v2/index.d.ts.map +1 -1
  52. package/dist/v2/navigation/DashboardLayout/AdminSidebar.scss.js +1 -1
  53. package/dist/v2/navigation/DashboardLayout/DashboardLayout.scss.js +1 -1
  54. package/dist/v2/navigation/DashboardLayout/ProviderSidebar.scss.js +1 -1
  55. package/dist/v2/navigation/DashboardLayout/TopNavigation.scss.js +1 -1
  56. package/dist/v2/pages/Settings/SettingsTabs.scss.js +1 -1
  57. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +5 -0
  58. package/dist/v2/pages/Settings/components/SidebarCustomisation.scss.js +1 -1
  59. package/dist/v2/pages/Settings/components/SidebarNavItem.js +5 -0
  60. package/dist/v2/pages/auth/AuthLayout/AuthLayout.scss.js +1 -1
  61. package/dist/v2/shadcn/components/ui/accordion.d.ts +8 -0
  62. package/dist/v2/shadcn/components/ui/accordion.d.ts.map +1 -0
  63. package/dist/v2/shadcn/components/ui/alert-dialog.d.ts +21 -0
  64. package/dist/v2/shadcn/components/ui/alert-dialog.d.ts.map +1 -0
  65. package/dist/v2/shadcn/components/ui/alert.d.ts +9 -0
  66. package/dist/v2/shadcn/components/ui/alert.d.ts.map +1 -0
  67. package/dist/v2/shadcn/components/ui/aspect-ratio.d.ts +4 -0
  68. package/dist/v2/shadcn/components/ui/aspect-ratio.d.ts.map +1 -0
  69. package/dist/v2/shadcn/components/ui/avatar.d.ts +7 -0
  70. package/dist/v2/shadcn/components/ui/avatar.d.ts.map +1 -0
  71. package/dist/v2/shadcn/components/ui/badge.d.ts +10 -0
  72. package/dist/v2/shadcn/components/ui/badge.d.ts.map +1 -0
  73. package/dist/v2/shadcn/components/ui/breadcrumb.d.ts +20 -0
  74. package/dist/v2/shadcn/components/ui/breadcrumb.d.ts.map +1 -0
  75. package/dist/v2/shadcn/components/ui/button.d.ts +14 -0
  76. package/dist/v2/shadcn/components/ui/button.d.ts.map +1 -0
  77. package/dist/v2/shadcn/components/ui/calendar.d.ts +9 -0
  78. package/dist/v2/shadcn/components/ui/calendar.d.ts.map +1 -0
  79. package/dist/v2/shadcn/components/ui/card.d.ts +9 -0
  80. package/dist/v2/shadcn/components/ui/card.d.ts.map +1 -0
  81. package/dist/v2/shadcn/components/ui/carousel.d.ts +19 -0
  82. package/dist/v2/shadcn/components/ui/carousel.d.ts.map +1 -0
  83. package/dist/v2/shadcn/components/ui/checkbox.d.ts +6 -0
  84. package/dist/v2/shadcn/components/ui/checkbox.d.ts.map +1 -0
  85. package/dist/v2/shadcn/components/ui/checkbox.js +115 -0
  86. package/dist/v2/shadcn/components/ui/checkbox.scss.js +6 -0
  87. package/dist/v2/shadcn/components/ui/collapsible.d.ts +6 -0
  88. package/dist/v2/shadcn/components/ui/collapsible.d.ts.map +1 -0
  89. package/dist/v2/shadcn/components/ui/command.d.ts +83 -0
  90. package/dist/v2/shadcn/components/ui/command.d.ts.map +1 -0
  91. package/dist/v2/shadcn/components/ui/context-menu.d.ts +28 -0
  92. package/dist/v2/shadcn/components/ui/context-menu.d.ts.map +1 -0
  93. package/dist/v2/shadcn/components/ui/dialog.d.ts +20 -0
  94. package/dist/v2/shadcn/components/ui/dialog.d.ts.map +1 -0
  95. package/dist/v2/shadcn/components/ui/dialog.js +169 -0
  96. package/dist/v2/shadcn/components/ui/drawer.d.ts +23 -0
  97. package/dist/v2/shadcn/components/ui/drawer.d.ts.map +1 -0
  98. package/dist/v2/shadcn/components/ui/dropdown-menu.d.ts +28 -0
  99. package/dist/v2/shadcn/components/ui/dropdown-menu.d.ts.map +1 -0
  100. package/dist/v2/shadcn/components/ui/form.d.ts +24 -0
  101. package/dist/v2/shadcn/components/ui/form.d.ts.map +1 -0
  102. package/dist/v2/shadcn/components/ui/hover-card.d.ts +7 -0
  103. package/dist/v2/shadcn/components/ui/hover-card.d.ts.map +1 -0
  104. package/dist/v2/shadcn/components/ui/input-otp.d.ts +35 -0
  105. package/dist/v2/shadcn/components/ui/input-otp.d.ts.map +1 -0
  106. package/dist/v2/shadcn/components/ui/input.d.ts +6 -0
  107. package/dist/v2/shadcn/components/ui/input.d.ts.map +1 -0
  108. package/dist/v2/shadcn/components/ui/label.d.ts +6 -0
  109. package/dist/v2/shadcn/components/ui/label.d.ts.map +1 -0
  110. package/dist/v2/shadcn/components/ui/menubar.d.ts +34 -0
  111. package/dist/v2/shadcn/components/ui/menubar.d.ts.map +1 -0
  112. package/dist/v2/shadcn/components/ui/navigation-menu.d.ts +13 -0
  113. package/dist/v2/shadcn/components/ui/navigation-menu.d.ts.map +1 -0
  114. package/dist/v2/shadcn/components/ui/pagination.d.ts +29 -0
  115. package/dist/v2/shadcn/components/ui/pagination.d.ts.map +1 -0
  116. package/dist/v2/shadcn/components/ui/popover.d.ts +7 -0
  117. package/dist/v2/shadcn/components/ui/popover.d.ts.map +1 -0
  118. package/dist/v2/shadcn/components/ui/progress.d.ts +5 -0
  119. package/dist/v2/shadcn/components/ui/progress.d.ts.map +1 -0
  120. package/dist/v2/shadcn/components/ui/radio-card.d.ts +12 -0
  121. package/dist/v2/shadcn/components/ui/radio-card.d.ts.map +1 -0
  122. package/dist/v2/shadcn/components/ui/radio-group.d.ts +6 -0
  123. package/dist/v2/shadcn/components/ui/radio-group.d.ts.map +1 -0
  124. package/dist/v2/shadcn/components/ui/scroll-area.d.ts +6 -0
  125. package/dist/v2/shadcn/components/ui/scroll-area.d.ts.map +1 -0
  126. package/dist/v2/shadcn/components/ui/select.d.ts +14 -0
  127. package/dist/v2/shadcn/components/ui/select.d.ts.map +1 -0
  128. package/dist/v2/shadcn/components/ui/separator.d.ts +5 -0
  129. package/dist/v2/shadcn/components/ui/separator.d.ts.map +1 -0
  130. package/dist/v2/shadcn/components/ui/sheet.d.ts +26 -0
  131. package/dist/v2/shadcn/components/ui/sheet.d.ts.map +1 -0
  132. package/dist/v2/shadcn/components/ui/sidebar.d.ts +67 -0
  133. package/dist/v2/shadcn/components/ui/sidebar.d.ts.map +1 -0
  134. package/dist/v2/shadcn/components/ui/skeleton.d.ts +3 -0
  135. package/dist/v2/shadcn/components/ui/skeleton.d.ts.map +1 -0
  136. package/dist/v2/shadcn/components/ui/slider.d.ts +5 -0
  137. package/dist/v2/shadcn/components/ui/slider.d.ts.map +1 -0
  138. package/dist/v2/shadcn/components/ui/switch.d.ts +6 -0
  139. package/dist/v2/shadcn/components/ui/switch.d.ts.map +1 -0
  140. package/dist/v2/shadcn/components/ui/switch.js +115 -0
  141. package/dist/v2/shadcn/components/ui/switch.scss.js +6 -0
  142. package/dist/v2/shadcn/components/ui/table-pagination.d.ts +11 -0
  143. package/dist/v2/shadcn/components/ui/table-pagination.d.ts.map +1 -0
  144. package/dist/v2/shadcn/components/ui/table.d.ts +11 -0
  145. package/dist/v2/shadcn/components/ui/table.d.ts.map +1 -0
  146. package/dist/v2/shadcn/components/ui/tabs.d.ts +8 -0
  147. package/dist/v2/shadcn/components/ui/tabs.d.ts.map +1 -0
  148. package/dist/v2/shadcn/components/ui/textarea.d.ts +6 -0
  149. package/dist/v2/shadcn/components/ui/textarea.d.ts.map +1 -0
  150. package/dist/v2/shadcn/components/ui/toast.d.ts +16 -0
  151. package/dist/v2/shadcn/components/ui/toast.d.ts.map +1 -0
  152. package/dist/v2/shadcn/components/ui/toaster.d.ts +2 -0
  153. package/dist/v2/shadcn/components/ui/toaster.d.ts.map +1 -0
  154. package/dist/v2/shadcn/components/ui/toggle-group.d.ts +13 -0
  155. package/dist/v2/shadcn/components/ui/toggle-group.d.ts.map +1 -0
  156. package/dist/v2/shadcn/components/ui/toggle.d.ts +13 -0
  157. package/dist/v2/shadcn/components/ui/toggle.d.ts.map +1 -0
  158. package/dist/v2/shadcn/components/ui/tooltip.d.ts +8 -0
  159. package/dist/v2/shadcn/components/ui/tooltip.d.ts.map +1 -0
  160. package/dist/v2/shadcn/components/ui/use-toast.d.ts +3 -0
  161. package/dist/v2/shadcn/components/ui/use-toast.d.ts.map +1 -0
  162. package/dist/v2/shadcn/hooks/use-mobile.d.ts +2 -0
  163. package/dist/v2/shadcn/hooks/use-mobile.d.ts.map +1 -0
  164. package/dist/v2/shadcn/hooks/use-toast.d.ts +45 -0
  165. package/dist/v2/shadcn/hooks/use-toast.d.ts.map +1 -0
  166. package/dist/v2/shadcn/index.d.ts +20 -0
  167. package/dist/v2/shadcn/index.d.ts.map +1 -0
  168. package/dist/v2/shadcn/lib/utils.d.ts +3 -0
  169. package/dist/v2/shadcn/lib/utils.d.ts.map +1 -0
  170. package/dist/v2/shadcn/lib/utils.js +11 -0
  171. package/dist/v2/shadcn/styles/globals.css +112 -0
  172. package/dist/v2/styles/form/NewInput.scss.js +1 -1
  173. package/package.json +6 -6
  174. package/rollup.config.js +2 -16
  175. package/src/iframe/payment/payment-status-page/PaymentStatusPage.tsx +1 -1
  176. package/src/product-set/form/ProductsControl.tsx +1 -2
  177. package/src/v2/components/DataTable/DataTable.tsx +1 -23
  178. package/src/v2/components/Modal/DeleteModal.tsx +20 -12
  179. package/src/v2/components/PeriodCard/PeriodCard.scss +157 -0
  180. package/src/v2/components/PeriodCard/PeriodCard.stories.tsx +245 -0
  181. package/src/v2/components/PeriodCard/PeriodCard.tsx +350 -0
  182. package/src/v2/components/PeriodCard/index.ts +8 -0
  183. package/src/v2/components/ReorderRow/ReorderRow.scss +68 -0
  184. package/src/v2/components/ReorderRow/ReorderRow.stories.tsx +124 -0
  185. package/src/v2/components/ReorderRow/ReorderRow.tsx +88 -0
  186. package/src/v2/components/ReorderRow/index.ts +2 -0
  187. package/src/v2/components/Toggle/Toggle.tsx +5 -6
  188. package/src/v2/components/index.ts +6 -0
  189. package/src/v2/index.ts +82 -0
  190. package/src/v2/shadcn/_reference/AccountManagerCard.tsx +45 -0
  191. package/src/v2/shadcn/_reference/AffiliatesTable.tsx +178 -0
  192. package/src/v2/shadcn/_reference/AuditArchive.tsx +165 -0
  193. package/src/v2/shadcn/_reference/AuditContent.tsx +270 -0
  194. package/src/v2/shadcn/_reference/AutomationsGeneralSettings.tsx +251 -0
  195. package/src/v2/shadcn/_reference/AvatarUpload.tsx +150 -0
  196. package/src/v2/shadcn/_reference/BookingsSummaryCard.tsx +268 -0
  197. package/src/v2/shadcn/_reference/CodeCleanUpAudit.tsx +274 -0
  198. package/src/v2/shadcn/_reference/CompaniesTable.tsx +387 -0
  199. package/src/v2/shadcn/_reference/ComponentAudit.tsx +239 -0
  200. package/src/v2/shadcn/_reference/ConfigureSettingsCard.tsx +95 -0
  201. package/src/v2/shadcn/_reference/CustomerCard.tsx +155 -0
  202. package/src/v2/shadcn/_reference/DashboardCards.tsx +50 -0
  203. package/src/v2/shadcn/_reference/DashboardFooter.tsx +18 -0
  204. package/src/v2/shadcn/_reference/DiarySettings.tsx +187 -0
  205. package/src/v2/shadcn/_reference/DiaryView.tsx +998 -0
  206. package/src/v2/shadcn/_reference/EmptyState.tsx +76 -0
  207. package/src/v2/shadcn/_reference/EntityInfoCard.tsx +48 -0
  208. package/src/v2/shadcn/_reference/ExistingUserAssignments.tsx +131 -0
  209. package/src/v2/shadcn/_reference/FeatureToggle.tsx +72 -0
  210. package/src/v2/shadcn/_reference/FlowCard.tsx +170 -0
  211. package/src/v2/shadcn/_reference/FlowsContent.tsx +688 -0
  212. package/src/v2/shadcn/_reference/FlowsGeneralSettings.tsx +27 -0
  213. package/src/v2/shadcn/_reference/GeneralSettings.tsx +33 -0
  214. package/src/v2/shadcn/_reference/InventoryGeneralSettings.tsx +82 -0
  215. package/src/v2/shadcn/_reference/LanguageSelector.tsx +97 -0
  216. package/src/v2/shadcn/_reference/LoadingScreen.tsx +25 -0
  217. package/src/v2/shadcn/_reference/LoadingSpinner.tsx +41 -0
  218. package/src/v2/shadcn/_reference/ManagedClientsList.tsx +121 -0
  219. package/src/v2/shadcn/_reference/NPSScore.tsx +379 -0
  220. package/src/v2/shadcn/_reference/NPSSummaryCard.tsx +181 -0
  221. package/src/v2/shadcn/_reference/NotificationBanner.tsx +129 -0
  222. package/src/v2/shadcn/_reference/NotificationPanel.tsx +208 -0
  223. package/src/v2/shadcn/_reference/OnlineUsersCard.tsx +73 -0
  224. package/src/v2/shadcn/_reference/ProtectedRoute.tsx +39 -0
  225. package/src/v2/shadcn/_reference/ProvidersTable.tsx +353 -0
  226. package/src/v2/shadcn/_reference/QuickAddPanel.tsx +1057 -0
  227. package/src/v2/shadcn/_reference/QuickFilters.tsx +112 -0
  228. package/src/v2/shadcn/_reference/ScheduleView.tsx +410 -0
  229. package/src/v2/shadcn/_reference/ScrollToTop.tsx +14 -0
  230. package/src/v2/shadcn/_reference/SecondaryNav.tsx +50 -0
  231. package/src/v2/shadcn/_reference/SecuritySettings.tsx +258 -0
  232. package/src/v2/shadcn/_reference/SessionDetailView.tsx +294 -0
  233. package/src/v2/shadcn/_reference/Sidebar.tsx +14 -0
  234. package/src/v2/shadcn/_reference/SidebarAwareLayout.tsx +30 -0
  235. package/src/v2/shadcn/_reference/SidebarLabelCustomization.tsx +285 -0
  236. package/src/v2/shadcn/_reference/SimulationBanner.tsx +57 -0
  237. package/src/v2/shadcn/_reference/SortControls.tsx +65 -0
  238. package/src/v2/shadcn/_reference/StatusBadge.tsx +49 -0
  239. package/src/v2/shadcn/_reference/StyleGuideContent.tsx +331 -0
  240. package/src/v2/shadcn/_reference/TableActionMenu.tsx +126 -0
  241. package/src/v2/shadcn/_reference/ThemeProvider.tsx +119 -0
  242. package/src/v2/shadcn/_reference/ThemeSettings.tsx +73 -0
  243. package/src/v2/shadcn/_reference/TopNavigation.tsx +332 -0
  244. package/src/v2/shadcn/_reference/UserActivityHistory.tsx +209 -0
  245. package/src/v2/shadcn/_reference/UserLanguageSettings.tsx +94 -0
  246. package/src/v2/shadcn/_reference/UserPanel.tsx +472 -0
  247. package/src/v2/shadcn/_reference/UsersTable.tsx +1023 -0
  248. package/src/v2/shadcn/_reference/WaiverForm.tsx +301 -0
  249. package/src/v2/shadcn/_reference/WaiversGeneralSettings.tsx +46 -0
  250. package/src/v2/shadcn/_reference/WaiversTable.tsx +290 -0
  251. package/src/v2/shadcn/_reference/WaiversTemplatesSettings.tsx +416 -0
  252. package/src/v2/shadcn/_reference/ai/AIChatPanel.tsx +313 -0
  253. package/src/v2/shadcn/_reference/ai/AIChatSearchBar.tsx +36 -0
  254. package/src/v2/shadcn/_reference/ai/ChatInteractiveBlock.tsx +298 -0
  255. package/src/v2/shadcn/_reference/ai/ChatMessageContent.tsx +40 -0
  256. package/src/v2/shadcn/_reference/ai/parseInteractiveBlocks.ts +142 -0
  257. package/src/v2/shadcn/_reference/auth/AuthLayout.tsx +55 -0
  258. package/src/v2/shadcn/_reference/auth/CreatePasswordForm.tsx +285 -0
  259. package/src/v2/shadcn/_reference/auth/CreatePasswordPanel.tsx +20 -0
  260. package/src/v2/shadcn/_reference/auth/LoginFooter.tsx +14 -0
  261. package/src/v2/shadcn/_reference/auth/LoginForm.tsx +205 -0
  262. package/src/v2/shadcn/_reference/auth/LoginPanel.tsx +41 -0
  263. package/src/v2/shadcn/_reference/auth/ResetPasswordForm.tsx +102 -0
  264. package/src/v2/shadcn/_reference/auth/ResetPasswordPanel.tsx +20 -0
  265. package/src/v2/shadcn/_reference/auth/VerifyEmailForm.tsx +95 -0
  266. package/src/v2/shadcn/_reference/auth/VerifyEmailPanel.tsx +20 -0
  267. package/src/v2/shadcn/_reference/email/EmailAttachment.tsx +119 -0
  268. package/src/v2/shadcn/_reference/email/EmailAutomation.tsx +92 -0
  269. package/src/v2/shadcn/_reference/email/EmailPlaceholders.tsx +64 -0
  270. package/src/v2/shadcn/_reference/email/UnlayerEmailEditor.tsx +41 -0
  271. package/src/v2/shadcn/_reference/email/emailTemplateData.ts +53 -0
  272. package/src/v2/shadcn/_reference/emptyStateIcons.tsx +103 -0
  273. package/src/v2/shadcn/_reference/games/MazeGame.tsx +394 -0
  274. package/src/v2/shadcn/_reference/games/RunnerGame.tsx +497 -0
  275. package/src/v2/shadcn/_reference/logos/BookedLogoFull.tsx +36 -0
  276. package/src/v2/shadcn/_reference/logos/BookedLogoMark.tsx +31 -0
  277. package/src/v2/shadcn/_reference/logos/BookedLogoNew.tsx +36 -0
  278. package/src/v2/shadcn/_reference/pricing/DynamicPricingRulesEditor.tsx +401 -0
  279. package/src/v2/shadcn/_reference/pricing/DynamicPricingTierCard.tsx +77 -0
  280. package/src/v2/shadcn/_reference/pricing/DynamicPricingTiersList.tsx +218 -0
  281. package/src/v2/shadcn/_reference/pricing/PricingCalendar.tsx +810 -0
  282. package/src/v2/shadcn/_reference/pricing/PricingPeriodCard.tsx +152 -0
  283. package/src/v2/shadcn/_reference/pricing/PricingPeriodForm.tsx +377 -0
  284. package/src/v2/shadcn/_reference/pricing/PricingPeriodsList.tsx +213 -0
  285. package/src/v2/shadcn/_reference/pricing/getRuleSummary.ts +39 -0
  286. package/src/v2/shadcn/_reference/products/AvailabilityRulesSection.tsx +184 -0
  287. package/src/v2/shadcn/_reference/products/AvailabilitySection.tsx +677 -0
  288. package/src/v2/shadcn/_reference/products/BookingTypeConfigOptions.tsx +40 -0
  289. package/src/v2/shadcn/_reference/products/CapacityPeriodsSection.tsx +238 -0
  290. package/src/v2/shadcn/_reference/products/DynamicPricingTiersSection.tsx +131 -0
  291. package/src/v2/shadcn/_reference/products/GiftCardOrdersTab.tsx +192 -0
  292. package/src/v2/shadcn/_reference/products/GiftCardSettings.tsx +342 -0
  293. package/src/v2/shadcn/_reference/products/PackageProductsSection.tsx +322 -0
  294. package/src/v2/shadcn/_reference/products/PricingSection.tsx +173 -0
  295. package/src/v2/shadcn/_reference/products/ProductTypeFields.tsx +353 -0
  296. package/src/v2/shadcn/_reference/products/ProductTypeIcon.tsx +95 -0
  297. package/src/v2/shadcn/_reference/products/VariablePricingSection.tsx +140 -0
  298. package/src/v2/shadcn/_reference/products/productTypeConfig.ts +182 -0
  299. package/src/v2/shadcn/_reference/shared/BackButton.tsx +50 -0
  300. package/src/v2/shadcn/_reference/shared/CancelConfirmationDialog.tsx +18 -0
  301. package/src/v2/shadcn/_reference/shared/ConfirmationDialog.tsx +136 -0
  302. package/src/v2/shadcn/_reference/shared/DeleteConfirmationDialog.tsx +18 -0
  303. package/src/v2/shadcn/_reference/shared/DeleteEntityPage.tsx +221 -0
  304. package/src/v2/shadcn/_reference/shared/SidebarIcons.tsx +108 -0
  305. package/src/v2/shadcn/_reference/shared/UnifiedSidebar.tsx +722 -0
  306. package/src/v2/shadcn/_reference/tables/BulkActionsBar.tsx +68 -0
  307. package/src/v2/shadcn/_reference/tables/DataTable.tsx +221 -0
  308. package/src/v2/shadcn/_reference/tables/TableControls.tsx +94 -0
  309. package/src/v2/shadcn/_reference/tables/index.ts +3 -0
  310. package/src/v2/shadcn/_reference/tables/types.ts +79 -0
  311. package/src/v2/shadcn/_reference/zones/LegacyZoneSettings.tsx +299 -0
  312. package/src/v2/shadcn/components/ui/accordion.stories.tsx +63 -0
  313. package/src/v2/shadcn/components/ui/accordion.tsx +52 -0
  314. package/src/v2/shadcn/components/ui/alert-dialog.stories.tsx +44 -0
  315. package/src/v2/shadcn/components/ui/alert-dialog.tsx +104 -0
  316. package/src/v2/shadcn/components/ui/alert.stories.tsx +44 -0
  317. package/src/v2/shadcn/components/ui/alert.tsx +43 -0
  318. package/src/v2/shadcn/components/ui/aspect-ratio.stories.tsx +46 -0
  319. package/src/v2/shadcn/components/ui/aspect-ratio.tsx +5 -0
  320. package/src/v2/shadcn/components/ui/avatar.stories.tsx +39 -0
  321. package/src/v2/shadcn/components/ui/avatar.tsx +38 -0
  322. package/src/v2/shadcn/components/ui/badge.stories.tsx +17 -0
  323. package/src/v2/shadcn/components/ui/badge.tsx +30 -0
  324. package/src/v2/shadcn/components/ui/breadcrumb.stories.tsx +91 -0
  325. package/src/v2/shadcn/components/ui/breadcrumb.tsx +90 -0
  326. package/src/v2/shadcn/components/ui/button.stories.tsx +20 -0
  327. package/src/v2/shadcn/components/ui/button.tsx +60 -0
  328. package/src/v2/shadcn/components/ui/calendar.stories.tsx +61 -0
  329. package/src/v2/shadcn/components/ui/calendar.tsx +54 -0
  330. package/src/v2/shadcn/components/ui/card.stories.tsx +37 -0
  331. package/src/v2/shadcn/components/ui/card.tsx +43 -0
  332. package/src/v2/shadcn/components/ui/carousel.stories.tsx +92 -0
  333. package/src/v2/shadcn/components/ui/carousel.tsx +224 -0
  334. package/src/v2/shadcn/components/ui/checkbox.scss +38 -0
  335. package/src/v2/shadcn/components/ui/checkbox.stories.tsx +23 -0
  336. package/src/v2/shadcn/components/ui/checkbox.tsx +24 -0
  337. package/src/v2/shadcn/components/ui/collapsible.stories.tsx +59 -0
  338. package/src/v2/shadcn/components/ui/collapsible.tsx +9 -0
  339. package/src/v2/shadcn/components/ui/command.stories.tsx +70 -0
  340. package/src/v2/shadcn/components/ui/command.tsx +132 -0
  341. package/src/v2/shadcn/components/ui/context-menu.stories.tsx +72 -0
  342. package/src/v2/shadcn/components/ui/context-menu.tsx +178 -0
  343. package/src/v2/shadcn/components/ui/dialog.stories.tsx +67 -0
  344. package/src/v2/shadcn/components/ui/dialog.tsx +95 -0
  345. package/src/v2/shadcn/components/ui/drawer.stories.tsx +50 -0
  346. package/src/v2/shadcn/components/ui/drawer.tsx +87 -0
  347. package/src/v2/shadcn/components/ui/dropdown-menu.stories.tsx +73 -0
  348. package/src/v2/shadcn/components/ui/dropdown-menu.tsx +179 -0
  349. package/src/v2/shadcn/components/ui/form.stories.tsx +105 -0
  350. package/src/v2/shadcn/components/ui/form.tsx +129 -0
  351. package/src/v2/shadcn/components/ui/hover-card.stories.tsx +35 -0
  352. package/src/v2/shadcn/components/ui/hover-card.tsx +27 -0
  353. package/src/v2/shadcn/components/ui/input-otp.stories.tsx +72 -0
  354. package/src/v2/shadcn/components/ui/input-otp.tsx +61 -0
  355. package/src/v2/shadcn/components/ui/input.stories.tsx +16 -0
  356. package/src/v2/shadcn/components/ui/input.tsx +25 -0
  357. package/src/v2/shadcn/components/ui/label.stories.tsx +13 -0
  358. package/src/v2/shadcn/components/ui/label.tsx +17 -0
  359. package/src/v2/shadcn/components/ui/menubar.stories.tsx +86 -0
  360. package/src/v2/shadcn/components/ui/menubar.tsx +207 -0
  361. package/src/v2/shadcn/components/ui/navigation-menu.stories.tsx +68 -0
  362. package/src/v2/shadcn/components/ui/navigation-menu.tsx +120 -0
  363. package/src/v2/shadcn/components/ui/pagination.stories.tsx +78 -0
  364. package/src/v2/shadcn/components/ui/pagination.tsx +81 -0
  365. package/src/v2/shadcn/components/ui/popover.stories.tsx +44 -0
  366. package/src/v2/shadcn/components/ui/popover.tsx +29 -0
  367. package/src/v2/shadcn/components/ui/progress.stories.tsx +17 -0
  368. package/src/v2/shadcn/components/ui/progress.tsx +23 -0
  369. package/src/v2/shadcn/components/ui/radio-card.stories.tsx +68 -0
  370. package/src/v2/shadcn/components/ui/radio-card.tsx +52 -0
  371. package/src/v2/shadcn/components/ui/radio-group.stories.tsx +77 -0
  372. package/src/v2/shadcn/components/ui/radio-group.tsx +35 -0
  373. package/src/v2/shadcn/components/ui/scroll-area.stories.tsx +56 -0
  374. package/src/v2/shadcn/components/ui/scroll-area.tsx +38 -0
  375. package/src/v2/shadcn/components/ui/select.stories.tsx +60 -0
  376. package/src/v2/shadcn/components/ui/select.tsx +148 -0
  377. package/src/v2/shadcn/components/ui/separator.stories.tsx +30 -0
  378. package/src/v2/shadcn/components/ui/separator.tsx +20 -0
  379. package/src/v2/shadcn/components/ui/sheet.stories.tsx +115 -0
  380. package/src/v2/shadcn/components/ui/sheet.tsx +107 -0
  381. package/src/v2/shadcn/components/ui/sidebar.stories.tsx +167 -0
  382. package/src/v2/shadcn/components/ui/sidebar.tsx +637 -0
  383. package/src/v2/shadcn/components/ui/skeleton.stories.tsx +36 -0
  384. package/src/v2/shadcn/components/ui/skeleton.tsx +7 -0
  385. package/src/v2/shadcn/components/ui/slider.stories.tsx +16 -0
  386. package/src/v2/shadcn/components/ui/slider.tsx +23 -0
  387. package/src/v2/shadcn/components/ui/switch.scss +63 -0
  388. package/src/v2/shadcn/components/ui/switch.stories.tsx +23 -0
  389. package/src/v2/shadcn/components/ui/switch.tsx +24 -0
  390. package/src/v2/shadcn/components/ui/table-pagination.stories.tsx +81 -0
  391. package/src/v2/shadcn/components/ui/table-pagination.tsx +61 -0
  392. package/src/v2/shadcn/components/ui/table.stories.tsx +40 -0
  393. package/src/v2/shadcn/components/ui/table.tsx +72 -0
  394. package/src/v2/shadcn/components/ui/tabs.stories.tsx +85 -0
  395. package/src/v2/shadcn/components/ui/tabs.tsx +53 -0
  396. package/src/v2/shadcn/components/ui/textarea.stories.tsx +15 -0
  397. package/src/v2/shadcn/components/ui/textarea.tsx +21 -0
  398. package/src/v2/shadcn/components/ui/toast.stories.tsx +77 -0
  399. package/src/v2/shadcn/components/ui/toast.tsx +111 -0
  400. package/src/v2/shadcn/components/ui/toaster.stories.tsx +46 -0
  401. package/src/v2/shadcn/components/ui/toaster.tsx +24 -0
  402. package/src/v2/shadcn/components/ui/toggle-group.stories.tsx +95 -0
  403. package/src/v2/shadcn/components/ui/toggle-group.tsx +49 -0
  404. package/src/v2/shadcn/components/ui/toggle.stories.tsx +18 -0
  405. package/src/v2/shadcn/components/ui/toggle.tsx +37 -0
  406. package/src/v2/shadcn/components/ui/tooltip.stories.tsx +57 -0
  407. package/src/v2/shadcn/components/ui/tooltip.tsx +28 -0
  408. package/src/v2/shadcn/components/ui/use-toast.ts +3 -0
  409. package/src/v2/shadcn/hooks/use-mobile.tsx +19 -0
  410. package/src/v2/shadcn/hooks/use-toast.ts +184 -0
  411. package/src/v2/shadcn/index.ts +76 -0
  412. package/src/v2/shadcn/lib/utils.ts +6 -0
  413. package/src/v2/shadcn/styles/globals.css +112 -0
  414. package/.vscode/settings.json +0 -3
@@ -0,0 +1,331 @@
1
+ import React from 'react';
2
+
3
+ interface StyleGuideContentProps {
4
+ typographyScale: Array<{
5
+ name: string;
6
+ size: string;
7
+ weight: string;
8
+ lineHeight: string;
9
+ letterSpacing: string;
10
+ fontFamily: string;
11
+ class: string;
12
+ }>;
13
+ baseColors: Array<{
14
+ name: string;
15
+ prefix: string;
16
+ shades: Array<{ value: string; hex: string }>;
17
+ }>;
18
+ mainColors: Array<{
19
+ category: string;
20
+ tokens: Array<{ name: string; maps: string; hex: string }>;
21
+ }>;
22
+ semanticColors: Array<{
23
+ name: string;
24
+ tokens: Array<{ name: string; maps: string; hex: string }>;
25
+ }>;
26
+ mappedColors: {
27
+ label: string[];
28
+ surface: string[];
29
+ border: string[];
30
+ fill: string[];
31
+ gradient: string[];
32
+ };
33
+ gradientInfo: {
34
+ light: Array<{ stop: string; maps: string; hex: string }>;
35
+ dark: Array<{ stop: string; maps: string; hex: string }>;
36
+ };
37
+ customIcons?: {
38
+ navigation: Array<{ name: string; file: string; usage: string }>;
39
+ user: Array<{ name: string; file: string; usage: string }>;
40
+ interface: Array<{ name: string; file: string; usage: string }>;
41
+ theme: Array<{ name: string; file: string; usage: string }>;
42
+ branding: Array<{ name: string; file: string; usage: string }>;
43
+ };
44
+ }
45
+
46
+ const StyleGuideContent: React.FC<StyleGuideContentProps> = ({
47
+ typographyScale,
48
+ baseColors,
49
+ mainColors,
50
+ semanticColors,
51
+ mappedColors,
52
+ gradientInfo,
53
+ customIcons,
54
+ }) => {
55
+ return (
56
+ <>
57
+ {/* Anchor Navigation */}
58
+ <div className="flex items-start gap-4 self-stretch py-4 px-4 bg-surface-secondary rounded-lg sticky top-14 z-10">
59
+ <a href="#icons" className="text-[13px] font-semibold text-label-secondary hover:text-label-primary transition-colors">
60
+ Icons
61
+ </a>
62
+ <span className="text-label-secondary">•</span>
63
+ <a href="#typography" className="text-[13px] font-semibold text-label-secondary hover:text-label-primary transition-colors">
64
+ Typography
65
+ </a>
66
+ <span className="text-label-secondary">•</span>
67
+ <a href="#base-colors" className="text-[13px] font-semibold text-label-secondary hover:text-label-primary transition-colors">
68
+ Base Colors
69
+ </a>
70
+ <span className="text-label-secondary">•</span>
71
+ <a href="#main-colors" className="text-[13px] font-semibold text-label-secondary hover:text-label-primary transition-colors">
72
+ Main Colors
73
+ </a>
74
+ <span className="text-label-secondary">•</span>
75
+ <a href="#semantic-colors" className="text-[13px] font-semibold text-label-secondary hover:text-label-primary transition-colors">
76
+ Semantic Colors
77
+ </a>
78
+ <span className="text-label-secondary">•</span>
79
+ <a href="#mapped-colors" className="text-[13px] font-semibold text-label-secondary hover:text-label-primary transition-colors">
80
+ Mapped Colors
81
+ </a>
82
+ </div>
83
+
84
+ {/* Icons Section */}
85
+ {customIcons && (
86
+ <div id="icons" className="flex flex-col gap-4 self-stretch">
87
+ <h2 className="text-label-primary text-xl font-semibold leading-6">Custom Icon System</h2>
88
+ <p className="text-label-secondary text-sm">
89
+ Custom SVG icons designed specifically for this application. These icons maintain consistent sizing and styling across the interface.
90
+ </p>
91
+
92
+ {Object.entries(customIcons).map(([category, icons]) => (
93
+ <div key={category} className="flex flex-col gap-3">
94
+ <h3 className="text-label-primary text-base font-semibold capitalize">{category} Icons</h3>
95
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3">
96
+ {icons.map((icon) => (
97
+ <div key={icon.name} className="flex items-center gap-4 p-4 bg-surface-secondary rounded-lg">
98
+ <div className="w-12 h-12 flex items-center justify-center bg-surface-primary rounded-lg">
99
+ <img
100
+ src={`/src/assets/${icon.file}`}
101
+ alt={icon.name}
102
+ className="w-8 h-8"
103
+ />
104
+ </div>
105
+ <div className="flex-1">
106
+ <div className="text-label-primary font-semibold text-sm">{icon.name}</div>
107
+ <div className="text-label-secondary text-xs mt-1">{icon.usage}</div>
108
+ <div className="text-label-tertiary text-xs font-mono mt-1">{icon.file}</div>
109
+ </div>
110
+ </div>
111
+ ))}
112
+ </div>
113
+ </div>
114
+ ))}
115
+ </div>
116
+ )}
117
+
118
+ {/* Typography Section */}
119
+ <div id="typography" className="flex flex-col gap-4 self-stretch">
120
+ <h2 className="text-label-primary text-xl font-semibold leading-6">Typography Scale</h2>
121
+ <div className="flex flex-col gap-3">
122
+ {typographyScale.map((type) => (
123
+ <div key={type.name} className="flex items-center gap-4 p-4 bg-surface-secondary rounded-lg">
124
+ <div className="flex-1 min-w-[200px]">
125
+ <div className="text-label-primary font-semibold text-sm">{type.name}</div>
126
+ <div className="text-label-secondary text-xs mt-1">
127
+ {type.size} / {type.weight} / {type.lineHeight}
128
+ </div>
129
+ <div className="text-label-secondary text-xs mt-1">
130
+ <strong>Family:</strong> {type.fontFamily}
131
+ </div>
132
+ <div className="text-label-secondary text-xs">
133
+ <strong>Style:</strong> normal / <strong>Spacing:</strong> {type.letterSpacing}
134
+ </div>
135
+ </div>
136
+ <div className="flex-1">
137
+ <div className={type.class}>The quick brown fox</div>
138
+ </div>
139
+ </div>
140
+ ))}
141
+ </div>
142
+ </div>
143
+
144
+ {/* Base Colors Section */}
145
+ <div id="base-colors" className="flex flex-col gap-4 self-stretch">
146
+ <h2 className="text-label-primary text-xl font-semibold leading-6">Base Colors</h2>
147
+ <div className="grid grid-cols-1 gap-4">
148
+ {baseColors.map((color) => (
149
+ <div key={color.name} className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
150
+ <h3 className="text-label-primary font-semibold text-sm mb-2">{color.name}</h3>
151
+ <div className="grid grid-cols-5 gap-2 max-sm:grid-cols-2">
152
+ {color.shades.map((shade) => (
153
+ <div key={shade.value} className="flex flex-col gap-2">
154
+ <div
155
+ className="h-16 rounded border border-border-primary"
156
+ style={{ backgroundColor: shade.hex }}
157
+ />
158
+ <div className="text-label-secondary text-xs">
159
+ <div className="font-semibold">{color.prefix}-{shade.value}</div>
160
+ <code className="text-[10px] text-label-secondary font-mono">
161
+ {shade.hex}
162
+ </code>
163
+ </div>
164
+ </div>
165
+ ))}
166
+ </div>
167
+ </div>
168
+ ))}
169
+ </div>
170
+ </div>
171
+
172
+ {/* Main Colors Section */}
173
+ <div id="main-colors" className="flex flex-col gap-4 self-stretch">
174
+ <h2 className="text-label-primary text-xl font-semibold leading-6">Main Colors (Semantic Names)</h2>
175
+
176
+ {mainColors.map((colorGroup) => (
177
+ <div key={colorGroup.category} className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
178
+ <h3 className="text-label-primary font-semibold text-sm mb-2">{colorGroup.category}</h3>
179
+ <div className="grid grid-cols-4 gap-2 max-sm:grid-cols-2">
180
+ {colorGroup.tokens.map((token) => (
181
+ <div key={token.name} className="flex flex-col gap-2">
182
+ <div
183
+ className="h-16 rounded border border-border-primary"
184
+ style={{ backgroundColor: token.hex }}
185
+ />
186
+ <div className="text-label-secondary text-xs">
187
+ <div className="font-semibold">{colorGroup.category.toLowerCase()}-{token.name}</div>
188
+ <div className="text-[10px]">→ {token.maps}</div>
189
+ <code className="text-[10px] text-label-secondary font-mono">
190
+ {token.hex}
191
+ </code>
192
+ </div>
193
+ </div>
194
+ ))}
195
+ </div>
196
+ </div>
197
+ ))}
198
+ </div>
199
+
200
+ {/* Semantic Colors Section */}
201
+ <div id="semantic-colors" className="flex flex-col gap-4 self-stretch">
202
+ <h2 className="text-label-primary text-xl font-semibold leading-6">Semantic Theme Colors</h2>
203
+ {semanticColors.map((semantic) => (
204
+ <div key={semantic.name} className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
205
+ <h3 className="text-label-primary font-semibold text-sm mb-2">{semantic.name}</h3>
206
+ <div className="grid grid-cols-4 gap-2 max-sm:grid-cols-2">
207
+ {semantic.tokens.map((token) => (
208
+ <div key={token.name} className="flex flex-col gap-2">
209
+ <div
210
+ className="h-16 rounded border border-border-primary"
211
+ style={{ backgroundColor: token.hex }}
212
+ />
213
+ <div className="text-label-secondary text-xs">
214
+ <div className="font-semibold">{semantic.name.toLowerCase()}-{token.name}</div>
215
+ <div className="text-[10px]">→ {token.maps}</div>
216
+ <code className="text-[10px] text-label-secondary font-mono">
217
+ {token.hex}
218
+ </code>
219
+ </div>
220
+ </div>
221
+ ))}
222
+ </div>
223
+ </div>
224
+ ))}
225
+ </div>
226
+
227
+ {/* Mapped Colors Section */}
228
+ <div id="mapped-colors" className="flex flex-col gap-4 self-stretch">
229
+ <h2 className="text-label-primary text-xl font-semibold leading-6">Mapped Colors</h2>
230
+
231
+ {/* Label Tokens */}
232
+ <div className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
233
+ <h3 className="text-label-primary font-semibold text-sm mb-2">Label Tokens</h3>
234
+ <div className="grid grid-cols-3 gap-2 max-sm:grid-cols-1">
235
+ {mappedColors.label.map((token) => (
236
+ <div key={token} className="flex items-center gap-2 p-2 bg-surface-primary rounded border border-border-primary">
237
+ <div className={`w-6 h-6 rounded border border-border-primary flex-shrink-0`} style={{ backgroundColor: `var(--label-${token})` }} />
238
+ <code className="text-xs text-label-primary font-mono">label-{token}</code>
239
+ </div>
240
+ ))}
241
+ </div>
242
+ </div>
243
+
244
+ {/* Surface Tokens */}
245
+ <div className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
246
+ <h3 className="text-label-primary font-semibold text-sm mb-2">Surface Tokens</h3>
247
+ <div className="grid grid-cols-3 gap-2 max-sm:grid-cols-1">
248
+ {mappedColors.surface.map((token) => (
249
+ <div key={token} className="flex items-center gap-2 p-2 bg-surface-primary rounded border border-border-primary">
250
+ <div className={`w-6 h-6 rounded border border-border-primary flex-shrink-0 bg-surface-${token}`} />
251
+ <code className="text-xs text-label-primary font-mono">surface-{token}</code>
252
+ </div>
253
+ ))}
254
+ </div>
255
+ </div>
256
+
257
+ {/* Border Tokens */}
258
+ <div className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
259
+ <h3 className="text-label-primary font-semibold text-sm mb-2">Border Tokens</h3>
260
+ <div className="grid grid-cols-3 gap-2 max-sm:grid-cols-1">
261
+ {mappedColors.border.map((token) => (
262
+ <div key={token} className="flex items-center gap-2 p-2 bg-surface-primary rounded border border-border-primary">
263
+ <div className={`w-6 h-6 rounded flex-shrink-0 border-2`} style={{ borderColor: `var(--border-${token})` }} />
264
+ <code className="text-xs text-label-primary font-mono">border-{token}</code>
265
+ </div>
266
+ ))}
267
+ </div>
268
+ </div>
269
+
270
+ {/* Fill Tokens */}
271
+ <div className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
272
+ <h3 className="text-label-primary font-semibold text-sm mb-2">Fill Tokens</h3>
273
+ <div className="grid grid-cols-3 gap-2 max-sm:grid-cols-1">
274
+ {mappedColors.fill.map((token) => (
275
+ <div key={token} className="flex items-center gap-2 p-2 bg-surface-primary rounded border border-border-primary">
276
+ <div className={`w-6 h-6 rounded border border-border-primary flex-shrink-0`} style={{ backgroundColor: `var(--fill-${token})` }} />
277
+ <code className="text-xs text-label-primary font-mono">fill-{token}</code>
278
+ </div>
279
+ ))}
280
+ </div>
281
+ </div>
282
+
283
+ {/* Gradients - Light Mode */}
284
+ <div className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
285
+ <h3 className="text-label-primary font-semibold text-sm mb-2">Gradient Stops (Light Mode)</h3>
286
+ <div className="grid grid-cols-3 gap-3 max-sm:grid-cols-1">
287
+ {gradientInfo.light.map((info) => (
288
+ <div key={info.stop} className="flex items-center gap-3 p-3 bg-surface-primary rounded border border-border-primary">
289
+ <div
290
+ className="w-12 h-12 rounded border border-border-primary flex-shrink-0"
291
+ style={{ backgroundColor: info.hex }}
292
+ />
293
+ <div className="flex-1 min-w-0">
294
+ <div className="text-label-primary font-semibold text-xs truncate">gradient-{info.stop}</div>
295
+ <div className="text-label-secondary text-[10px] truncate">→ {info.maps}</div>
296
+ <code className="text-[10px] text-label-secondary font-mono">
297
+ {info.hex}
298
+ </code>
299
+ </div>
300
+ </div>
301
+ ))}
302
+ </div>
303
+ </div>
304
+
305
+ {/* Gradients - Dark Mode */}
306
+ <div className="flex flex-col gap-2 p-4 bg-surface-secondary rounded-lg">
307
+ <h3 className="text-label-primary font-semibold text-sm mb-2">Gradient Stops (Dark Mode)</h3>
308
+ <div className="grid grid-cols-3 gap-3 max-sm:grid-cols-1">
309
+ {gradientInfo.dark.map((info) => (
310
+ <div key={info.stop} className="flex items-center gap-3 p-3 bg-surface-primary rounded border border-border-primary">
311
+ <div
312
+ className="w-12 h-12 rounded border border-border-primary flex-shrink-0"
313
+ style={{ backgroundColor: info.hex }}
314
+ />
315
+ <div className="flex-1 min-w-0">
316
+ <div className="text-label-primary font-semibold text-xs truncate">gradient-{info.stop}</div>
317
+ <div className="text-label-secondary text-[10px] truncate">→ {info.maps}</div>
318
+ <code className="text-[10px] text-label-secondary font-mono">
319
+ {info.hex}
320
+ </code>
321
+ </div>
322
+ </div>
323
+ ))}
324
+ </div>
325
+ </div>
326
+ </div>
327
+ </>
328
+ );
329
+ };
330
+
331
+ export default StyleGuideContent;
@@ -0,0 +1,126 @@
1
+ import React, { useState } from 'react';
2
+ import { IconCross } from '../../icons';
3
+
4
+ export interface MenuItem {
5
+ label: string;
6
+ onClick: () => void;
7
+ variant?: 'default' | 'danger';
8
+ }
9
+
10
+ interface TableActionMenuProps {
11
+ items: MenuItem[];
12
+ }
13
+
14
+ /**
15
+ * Reusable circular action button with the soft-action surface and fill-action icon tint.
16
+ * Used standalone (with `icon` + `onClick`) or as the trigger for TableActionMenu.
17
+ */
18
+ export const ActionButton: React.FC<{
19
+ icon: React.ReactNode;
20
+ onClick: () => void;
21
+ className?: string;
22
+ }> = ({ icon, onClick, className = '' }) => (
23
+ <button
24
+ onClick={onClick}
25
+ className={`w-8 h-8 relative flex items-center justify-center hover:opacity-80 transition-opacity flex-shrink-0 ${className}`}
26
+ >
27
+ <svg width="32" height="32" viewBox="0 0 32 32" fill="none" className="absolute inset-0">
28
+ <circle cx="16" cy="16" r="16" className="fill-surface-action-soft" />
29
+ </svg>
30
+ <span className="relative z-10 text-fill-action flex items-center justify-center">
31
+ {icon}
32
+ </span>
33
+ </button>
34
+ );
35
+
36
+ const ThreeDotsIcon = () => (
37
+ <svg width="18" height="4" viewBox="0 0 18 4" fill="none">
38
+ <path d="M2 0C3.10457 0 4 0.895431 4 2C4 3.10457 3.10457 4 2 4C0.895431 4 0 3.10457 0 2C0 0.895431 0.895431 0 2 0ZM9 0C10.1046 0 11 0.895431 11 2C11 3.10457 10.1046 4 9 4C7.89543 4 7 3.10457 7 2C7 0.895431 7.89543 0 9 0ZM16 0C17.1046 0 18 0.895431 18 2C18 3.10457 17.1046 4 16 4C14.8954 4 14 3.10457 14 2C14 0.895431 14.8954 0 16 0Z" className="fill-fill-action" />
39
+ </svg>
40
+ );
41
+
42
+ const TableActionMenu: React.FC<TableActionMenuProps> = ({ items }) => {
43
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
44
+ const [menuPosition, setMenuPosition] = useState({ top: 0, right: 0, openUpward: false });
45
+ const buttonRef = React.useRef<HTMLButtonElement>(null);
46
+
47
+ const handleToggle = () => {
48
+ if (!isMenuOpen && buttonRef.current) {
49
+ const rect = buttonRef.current.getBoundingClientRect();
50
+ const spacing = 8;
51
+
52
+ const estimatedMenuHeight = items.length * 40 + 16;
53
+ const spaceBelow = window.innerHeight - rect.bottom;
54
+ const spaceAbove = rect.top;
55
+
56
+ const shouldOpenUpward = spaceBelow < estimatedMenuHeight && spaceAbove > spaceBelow;
57
+
58
+ setMenuPosition({
59
+ top: shouldOpenUpward ? rect.top - spacing : rect.bottom + spacing,
60
+ right: window.innerWidth - rect.right,
61
+ openUpward: shouldOpenUpward
62
+ });
63
+ }
64
+ setIsMenuOpen(!isMenuOpen);
65
+ };
66
+
67
+ return (
68
+ <div className="relative">
69
+ <button
70
+ ref={buttonRef}
71
+ onClick={handleToggle}
72
+ className="w-8 h-8 relative flex items-center justify-center hover:opacity-80 transition-opacity flex-shrink-0"
73
+ >
74
+ <svg width="32" height="32" viewBox="0 0 32 32" fill="none" className="absolute inset-0">
75
+ <circle cx="16" cy="16" r="16" className="fill-surface-action-soft" />
76
+ </svg>
77
+ {isMenuOpen ? (
78
+ <IconCross size={16} className="relative z-10 text-fill-action" />
79
+ ) : (
80
+ <span className="relative z-10">
81
+ <ThreeDotsIcon />
82
+ </span>
83
+ )}
84
+ </button>
85
+
86
+ {/* Dropdown Menu */}
87
+ {isMenuOpen && (
88
+ <>
89
+ <div
90
+ className="fixed inset-0 z-40"
91
+ onClick={() => setIsMenuOpen(false)}
92
+ />
93
+ <div
94
+ className="fixed min-w-[160px] max-w-[240px] w-auto bg-surface-primary rounded-[16px] overflow-hidden z-50 animate-scale-in"
95
+ style={{
96
+ boxShadow: '0 4px 12px rgba(20, 33, 90, 0.2)',
97
+ [menuPosition.openUpward ? 'bottom' : 'top']: menuPosition.openUpward
98
+ ? `${window.innerHeight - menuPosition.top}px`
99
+ : `${menuPosition.top}px`,
100
+ right: `${menuPosition.right}px`
101
+ }}
102
+ >
103
+ {items.map((item, index) => (
104
+ <button
105
+ key={index}
106
+ onClick={() => {
107
+ item.onClick();
108
+ setIsMenuOpen(false);
109
+ }}
110
+ className={`w-full text-left px-4 py-3 text-[13px] font-medium transition-colors whitespace-nowrap ${
111
+ item.variant === 'danger'
112
+ ? 'text-label-danger hover:bg-surface-danger-soft-hover'
113
+ : 'text-label-primary hover:bg-surface-primary-hover'
114
+ }`}
115
+ >
116
+ {item.label}
117
+ </button>
118
+ ))}
119
+ </div>
120
+ </>
121
+ )}
122
+ </div>
123
+ );
124
+ };
125
+
126
+ export default TableActionMenu;
@@ -0,0 +1,119 @@
1
+ import { createContext, useContext, useEffect, useState, useCallback } from "react"
2
+ import { supabase } from "@/integrations/supabase/client"
3
+
4
+ type Theme = "light" | "dark" | "system"
5
+
6
+ type ThemeProviderProps = {
7
+ children: React.ReactNode
8
+ defaultTheme?: Theme
9
+ storageKey?: string
10
+ }
11
+
12
+ type ThemeProviderState = {
13
+ theme: Theme
14
+ setTheme: (theme: Theme) => void
15
+ }
16
+
17
+ const initialState: ThemeProviderState = {
18
+ theme: "system",
19
+ setTheme: () => null,
20
+ }
21
+
22
+ const ThemeProviderContext = createContext<ThemeProviderState>(initialState)
23
+
24
+ export function ThemeProvider({
25
+ children,
26
+ defaultTheme = "system",
27
+ storageKey = "ui-theme",
28
+ ...props
29
+ }: ThemeProviderProps) {
30
+ const [theme, setThemeState] = useState<Theme>(
31
+ () => (localStorage.getItem(storageKey) as Theme) || defaultTheme
32
+ )
33
+
34
+ // Sync theme from database on auth
35
+ useEffect(() => {
36
+ const loadThemeFromDb = async () => {
37
+ const { data: { user } } = await supabase.auth.getUser()
38
+ if (!user) return
39
+
40
+ const { data } = await supabase
41
+ .from('profiles')
42
+ .select('theme_preference')
43
+ .eq('id', user.id)
44
+ .single()
45
+
46
+ if (data?.theme_preference && data.theme_preference !== theme) {
47
+ const dbTheme = data.theme_preference as Theme
48
+ localStorage.setItem(storageKey, dbTheme)
49
+ setThemeState(dbTheme)
50
+ }
51
+ }
52
+
53
+ loadThemeFromDb()
54
+
55
+ const { data: { subscription } } = supabase.auth.onAuthStateChange((event) => {
56
+ if (event === 'SIGNED_IN') {
57
+ loadThemeFromDb()
58
+ }
59
+ })
60
+
61
+ return () => subscription.unsubscribe()
62
+ }, [])
63
+
64
+ // Apply theme to DOM
65
+ useEffect(() => {
66
+ const root = window.document.documentElement
67
+
68
+ const applyTheme = (resolvedTheme: "light" | "dark") => {
69
+ root.classList.remove("light", "dark")
70
+ root.classList.add(resolvedTheme)
71
+ }
72
+
73
+ if (theme === "system") {
74
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)")
75
+ const systemTheme = mediaQuery.matches ? "dark" : "light"
76
+ applyTheme(systemTheme)
77
+
78
+ const handleChange = (e: MediaQueryListEvent) => {
79
+ applyTheme(e.matches ? "dark" : "light")
80
+ }
81
+
82
+ mediaQuery.addEventListener("change", handleChange)
83
+ return () => mediaQuery.removeEventListener("change", handleChange)
84
+ } else {
85
+ applyTheme(theme)
86
+ }
87
+ }, [theme])
88
+
89
+ const setTheme = useCallback(async (newTheme: Theme) => {
90
+ localStorage.setItem(storageKey, newTheme)
91
+ setThemeState(newTheme)
92
+
93
+ // Persist to database
94
+ const { data: { user } } = await supabase.auth.getUser()
95
+ if (user) {
96
+ await supabase
97
+ .from('profiles')
98
+ .update({ theme_preference: newTheme })
99
+ .eq('id', user.id)
100
+ }
101
+ }, [storageKey])
102
+
103
+ const value = { theme, setTheme }
104
+
105
+ return (
106
+ <ThemeProviderContext.Provider {...props} value={value}>
107
+ {children}
108
+ </ThemeProviderContext.Provider>
109
+ )
110
+ }
111
+
112
+ export const useTheme = () => {
113
+ const context = useContext(ThemeProviderContext)
114
+
115
+ if (context === undefined)
116
+ throw new Error("useTheme must be used within a ThemeProvider")
117
+
118
+ return context
119
+ }
@@ -0,0 +1,73 @@
1
+ import React from 'react';
2
+ import { useTheme } from './ThemeProvider';
3
+ import { RadioGroup, RadioGroupItem } from './ui/radio-group';
4
+ import { Label } from './ui/label';
5
+ import { LightModeIcon, DarkModeIcon, SystemModeIcon } from './icons/ThemeIcons';
6
+
7
+ const ThemeSettings: React.FC = () => {
8
+ const { theme, setTheme } = useTheme();
9
+
10
+ return (
11
+ <div className="flex flex-col gap-4 p-2 self-stretch bg-surface-primary rounded-lg">
12
+ <h3 className="text-label-primary text-xl font-semibold px-2">Theme</h3>
13
+
14
+ <RadioGroup value={theme} onValueChange={(value) => setTheme(value as "light" | "dark" | "system")} className="flex flex-col gap-2">
15
+ <Label
16
+ htmlFor="light"
17
+ className="flex p-2 items-center gap-3 rounded-lg cursor-pointer hover:bg-surface-primary-hover transition-colors"
18
+ >
19
+ <div className="flex flex-col items-center justify-center gap-2 px-2 pb-2 pt-1 bg-surface-secondary rounded flex-shrink-0 w-[60px]">
20
+ <LightModeIcon />
21
+ <div className="flex items-center justify-center w-full">
22
+ <RadioGroupItem value="light" id="light" />
23
+ </div>
24
+ </div>
25
+ <div className="flex flex-col flex-1 min-w-0">
26
+ <span className="text-label-primary text-base font-semibold leading-tight">Light Mode</span>
27
+ <p className="text-label-secondary text-sm font-normal leading-normal">
28
+ Adopt a brighter, lighter theme.
29
+ </p>
30
+ </div>
31
+ </Label>
32
+
33
+ <Label
34
+ htmlFor="dark"
35
+ className="flex p-2 items-center gap-3 rounded-lg cursor-pointer hover:bg-surface-primary-hover transition-colors"
36
+ >
37
+ <div className="flex flex-col items-center justify-center gap-2 px-2 pb-2 pt-1 bg-surface-secondary rounded flex-shrink-0 w-[60px]">
38
+ <DarkModeIcon />
39
+ <div className="flex items-center justify-center w-full">
40
+ <RadioGroupItem value="dark" id="dark" />
41
+ </div>
42
+ </div>
43
+ <div className="flex flex-col flex-1 min-w-0">
44
+ <span className="text-label-primary text-base font-semibold leading-tight">Dark Mode</span>
45
+ <p className="text-label-secondary text-sm font-normal leading-normal">
46
+ Adopt a darker, richer theme.
47
+ </p>
48
+ </div>
49
+ </Label>
50
+
51
+ <Label
52
+ htmlFor="system"
53
+ className="flex p-2 items-center gap-3 rounded-lg cursor-pointer hover:bg-surface-primary-hover transition-colors"
54
+ >
55
+ <div className="flex flex-col items-center justify-center gap-2 px-2 pb-2 pt-1 bg-surface-secondary rounded flex-shrink-0 w-[60px]">
56
+ <SystemModeIcon />
57
+ <div className="flex items-center justify-center w-full">
58
+ <RadioGroupItem value="system" id="system" />
59
+ </div>
60
+ </div>
61
+ <div className="flex flex-col flex-1 min-w-0">
62
+ <span className="text-label-primary text-base font-semibold leading-tight">System</span>
63
+ <p className="text-label-secondary text-sm font-normal leading-normal">
64
+ Switch theme based on device settings.
65
+ </p>
66
+ </div>
67
+ </Label>
68
+ </RadioGroup>
69
+ </div>
70
+ );
71
+ };
72
+
73
+ export default ThemeSettings;