@goplusvn/core 0.1.0 → 0.1.1

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 (369) hide show
  1. package/package.json +2 -1
  2. package/src/assets/erp_wallpaper.png +0 -0
  3. package/src/assets/goeat_logo.png +0 -0
  4. package/src/audit/audit-manager.ts +139 -0
  5. package/src/audit/index.ts +11 -0
  6. package/src/audit/memory-audit-logger.ts +86 -0
  7. package/src/audit/types.ts +50 -0
  8. package/src/auth/auth-service.ts +97 -0
  9. package/src/auth/index.ts +266 -0
  10. package/src/code-generation/index.ts +69 -0
  11. package/src/configs/auth-routes.ts +17 -0
  12. package/src/configs/crud.ts +136 -0
  13. package/src/configs/data/navigations.ts +781 -0
  14. package/src/configs/data/oauth-links.ts +10 -0
  15. package/src/configs/entities/material-categories.config.ts +125 -0
  16. package/src/configs/i18n.ts +12 -0
  17. package/src/configs/index.ts +26 -0
  18. package/src/configs/status.ts +25 -0
  19. package/src/configs/themes.ts +100 -0
  20. package/src/crud/components/crud-bulk-actions.tsx +91 -0
  21. package/src/crud/components/crud-card-view.tsx +241 -0
  22. package/src/crud/components/crud-context.tsx +122 -0
  23. package/src/crud/components/crud-delete-dialog.tsx +145 -0
  24. package/src/crud/components/crud-dialog.tsx +406 -0
  25. package/src/crud/components/crud-empty-state.tsx +104 -0
  26. package/src/crud/components/crud-export-button.tsx +170 -0
  27. package/src/crud/components/crud-field-renderer.tsx +653 -0
  28. package/src/crud/components/crud-filter-chips.tsx +102 -0
  29. package/src/crud/components/crud-filters/checkbox-filter.tsx +97 -0
  30. package/src/crud/components/crud-filters/datetime-filter.tsx +83 -0
  31. package/src/crud/components/crud-filters/filter-builder.tsx +66 -0
  32. package/src/crud/components/crud-filters/index.tsx +76 -0
  33. package/src/crud/components/crud-filters/radio-filter.tsx +86 -0
  34. package/src/crud/components/crud-filters/select-filter.tsx +141 -0
  35. package/src/crud/components/crud-filters/text-filter.tsx +86 -0
  36. package/src/crud/components/crud-form.tsx +642 -0
  37. package/src/crud/components/crud-import-dialog.tsx +440 -0
  38. package/src/crud/components/crud-infinite-scroll.tsx +116 -0
  39. package/src/crud/components/crud-page.tsx +1017 -0
  40. package/src/crud/components/crud-provider.tsx +277 -0
  41. package/src/crud/components/crud-row-actions.tsx +189 -0
  42. package/src/crud/components/crud-search.tsx +82 -0
  43. package/src/crud/components/crud-sheet.tsx +336 -0
  44. package/src/crud/components/crud-table-skeleton.tsx +26 -0
  45. package/src/crud/components/crud-table-toolbar.tsx +91 -0
  46. package/src/crud/components/crud-table.tsx +352 -0
  47. package/src/crud/components/crud-virtual-table.tsx +55 -0
  48. package/src/crud/components/index.tsx +20 -0
  49. package/src/crud/crud-filters/checkbox-filter.tsx +87 -0
  50. package/src/crud/crud-filters/datetime-filter.tsx +82 -0
  51. package/src/crud/crud-filters/filter-builder.tsx +64 -0
  52. package/src/crud/crud-filters/index.tsx +78 -0
  53. package/src/crud/crud-filters/radio-filter.tsx +79 -0
  54. package/src/crud/crud-filters/select-filter.tsx +148 -0
  55. package/src/crud/crud-filters/text-filter.tsx +81 -0
  56. package/src/crud/index.ts +43 -0
  57. package/src/crud/lib/crud-service.test.ts +334 -0
  58. package/src/crud/lib/crud-service.ts +358 -0
  59. package/src/crud/lib/crud-utils.test.ts +354 -0
  60. package/src/crud/lib/crud-utils.ts +299 -0
  61. package/src/crud/lib/crud-validator.ts +247 -0
  62. package/src/crud/lib/data-loader.ts +234 -0
  63. package/src/crud/lib/field-calculator.ts +241 -0
  64. package/src/crud/lib/field-formatter.ts +240 -0
  65. package/src/crud/lib/import-export-service.test.ts +290 -0
  66. package/src/crud/lib/import-export-service.ts +352 -0
  67. package/src/crud/lib/import-server-utils.ts +109 -0
  68. package/src/crud/lib/lazy-loader.ts +241 -0
  69. package/src/crud/lib/parse-filters.ts +85 -0
  70. package/src/crud/lib/permissions.ts +52 -0
  71. package/src/crud/lib/serialize-config.ts +60 -0
  72. package/src/crud/lib/stream-loader.ts +145 -0
  73. package/src/crud/lib/translate-config.ts +335 -0
  74. package/src/crud/lib/types.ts +11 -0
  75. package/src/crud/pages/entity-crud-page.tsx +144 -0
  76. package/src/crud/server.ts +8 -0
  77. package/src/home/constants.tsx +142 -0
  78. package/src/home/feature-showcase.tsx +171 -0
  79. package/src/home/home-page.tsx +191 -0
  80. package/src/home/hooks/index.ts +1 -0
  81. package/src/home/hooks/useWidgetPreferences.ts +167 -0
  82. package/src/home/index.ts +33 -0
  83. package/src/home/quick-access-dialog.tsx +271 -0
  84. package/src/home/quick-access-menu.tsx +267 -0
  85. package/src/home/types.ts +140 -0
  86. package/src/home/welcome-card.tsx +92 -0
  87. package/src/home/widget-container.tsx +258 -0
  88. package/src/home/widgets/base-widget.tsx +200 -0
  89. package/src/home/widgets/customers-widget.tsx +74 -0
  90. package/src/home/widgets/index.ts +6 -0
  91. package/src/home/widgets/orders-widget.tsx +87 -0
  92. package/src/home/widgets/revenue-widget.tsx +71 -0
  93. package/src/home/widgets/stock-widget.tsx +109 -0
  94. package/src/hooks/index.tsx +598 -0
  95. package/src/hooks/use-tenant.test.tsx +30 -0
  96. package/src/hooks/use-tenant.ts +5 -0
  97. package/src/index.ts +17 -0
  98. package/src/infrastructure/__tests__/architecture-verification.spec.ts +103 -0
  99. package/src/infrastructure/api-service.ts +317 -0
  100. package/src/infrastructure/cache/cache-manager.ts +107 -0
  101. package/src/infrastructure/cache/cache.ts +120 -0
  102. package/src/infrastructure/cache/index.ts +8 -0
  103. package/src/infrastructure/cache/types.ts +48 -0
  104. package/src/infrastructure/cron/cron-manager.ts +239 -0
  105. package/src/infrastructure/cron/index.ts +6 -0
  106. package/src/infrastructure/cron/types.ts +41 -0
  107. package/src/infrastructure/event-bus/event-bus.ts +145 -0
  108. package/src/infrastructure/event-bus/index.ts +2 -0
  109. package/src/infrastructure/event-bus/types.ts +22 -0
  110. package/src/infrastructure/index.ts +32 -0
  111. package/src/infrastructure/lock/decorators.ts +67 -0
  112. package/src/infrastructure/lock/index.ts +2 -0
  113. package/src/infrastructure/lock/lock-manager.ts +33 -0
  114. package/src/infrastructure/logger/index.ts +2 -0
  115. package/src/infrastructure/logger/logger.ts +96 -0
  116. package/src/infrastructure/logger/types.ts +25 -0
  117. package/src/layout/index.tsx +185 -0
  118. package/src/navigation/index.ts +91 -0
  119. package/src/notification/index.ts +14 -0
  120. package/src/notification/notification-service.ts +120 -0
  121. package/src/notification/storage/in-memory.ts +56 -0
  122. package/src/notification/storage/index.ts +1 -0
  123. package/src/notification/types.ts +51 -0
  124. package/src/organization/branch-service.ts +299 -0
  125. package/src/organization/branches.config.ts +154 -0
  126. package/src/organization/index.ts +5 -0
  127. package/src/plugin/apps-registry.ts +97 -0
  128. package/src/plugin/index.ts +5 -0
  129. package/src/plugin/types.ts +41 -0
  130. package/src/providers/index.tsx +109 -0
  131. package/src/providers/tenant-provider.tsx +45 -0
  132. package/src/rbac/components/roles/role-card.tsx +158 -0
  133. package/src/rbac/components/roles/role-stats-cards.tsx +29 -0
  134. package/src/rbac/components/roles/role-toolbar.tsx +123 -0
  135. package/src/rbac/hooks/use-role-operations.ts +159 -0
  136. package/src/rbac/hooks/use-roles-data.ts +59 -0
  137. package/src/rbac/index.ts +297 -0
  138. package/src/rbac/lib/permission-helpers.ts +63 -0
  139. package/src/rbac/pages/action-list-page.tsx +25 -0
  140. package/src/rbac/pages/resource-list-page.tsx +25 -0
  141. package/src/rbac/pages/role-list-page.tsx +378 -0
  142. package/src/rbac/permission-service.ts +140 -0
  143. package/src/rbac/permissions.ts +135 -0
  144. package/src/rbac/resource-service.ts +115 -0
  145. package/src/rbac/resource-validator.ts +119 -0
  146. package/src/rbac/role-service.ts +165 -0
  147. package/src/rbac/server.ts +16 -0
  148. package/src/rbac/types.ts +38 -0
  149. package/src/schemas/action.schema.ts +66 -0
  150. package/src/schemas/branch.schema.ts +52 -0
  151. package/src/schemas/coming-soon-schema.ts +9 -0
  152. package/src/schemas/company.schema.ts +44 -0
  153. package/src/schemas/forgot-passward-schema.ts +9 -0
  154. package/src/schemas/index.ts +30 -0
  155. package/src/schemas/material-category.schema.ts +43 -0
  156. package/src/schemas/material-pricing.schema.ts +74 -0
  157. package/src/schemas/material.schema.ts +76 -0
  158. package/src/schemas/materials.ts +52 -0
  159. package/src/schemas/new-passward-schema.ts +15 -0
  160. package/src/schemas/partner-company.schema.ts +149 -0
  161. package/src/schemas/register-schema.ts +36 -0
  162. package/src/schemas/resource.schema.ts +133 -0
  163. package/src/schemas/role.schema.ts +11 -0
  164. package/src/schemas/sign-in-schema.ts +24 -0
  165. package/src/schemas/supplier-pricing.schema.ts +15 -0
  166. package/src/schemas/supplier.schema.ts +120 -0
  167. package/src/schemas/system-category-group.schema.ts +67 -0
  168. package/src/schemas/system-category.schema.ts +77 -0
  169. package/src/schemas/system-config.schema.ts +118 -0
  170. package/src/schemas/uom.schema.ts +75 -0
  171. package/src/schemas/user-supplier.schema.ts +179 -0
  172. package/src/schemas/user.schema.ts +18 -0
  173. package/src/schemas/verify-email-schema.ts +9 -0
  174. package/src/schemas/warehouse.schema.ts +49 -0
  175. package/src/system/components/categories/category-list.tsx +529 -0
  176. package/src/system/components/categories/category-manager.tsx +89 -0
  177. package/src/system/components/categories/group-sidebar.tsx +308 -0
  178. package/src/system/components/settings/setting-dialogs.tsx +197 -0
  179. package/src/system/components/settings/setting-field.tsx +291 -0
  180. package/src/system/components/settings/setting-form-dialog.tsx +308 -0
  181. package/src/system/components/settings/settings-groups.ts +80 -0
  182. package/src/system/components/settings/settings-search.tsx +71 -0
  183. package/src/system/components/settings/settings-section.tsx +74 -0
  184. package/src/system/components/settings/settings-sidebar.tsx +81 -0
  185. package/src/system/constants.ts +3 -0
  186. package/src/system/index.ts +150 -0
  187. package/src/system/job-manager.ts +176 -0
  188. package/src/system/pages/components/categories/category-list.tsx +537 -0
  189. package/src/system/pages/components/categories/category-manager.tsx +90 -0
  190. package/src/system/pages/components/categories/group-sidebar.tsx +311 -0
  191. package/src/system/pages/components/settings/sales-rules-settings.tsx +222 -0
  192. package/src/system/pages/components/settings/setting-dialogs.tsx +197 -0
  193. package/src/system/pages/components/settings/setting-field.tsx +292 -0
  194. package/src/system/pages/components/settings/setting-form-dialog.tsx +308 -0
  195. package/src/system/pages/components/settings/settings-groups.ts +87 -0
  196. package/src/system/pages/components/settings/settings-page.tsx +372 -0
  197. package/src/system/pages/components/settings/settings-search.tsx +71 -0
  198. package/src/system/pages/components/settings/settings-section.tsx +74 -0
  199. package/src/system/pages/components/settings/settings-sidebar.tsx +81 -0
  200. package/src/system/pages/components/settings/system-settings.tsx +244 -0
  201. package/src/system/pages/system-category-page.tsx +15 -0
  202. package/src/system/pages/system-settings-page.tsx +380 -0
  203. package/src/system/schemas/system-category-group.schema.ts +46 -0
  204. package/src/system/schemas/system-category.schema.ts +56 -0
  205. package/src/system/services/settings-service.ts +127 -0
  206. package/src/system/services/system-category-service.ts +63 -0
  207. package/src/system/types.ts +45 -0
  208. package/src/types/index.ts +703 -0
  209. package/src/ui/auth/auth-layout.tsx +135 -0
  210. package/src/ui/auth/forgot-password-form.tsx +98 -0
  211. package/src/ui/auth/index.tsx +7 -0
  212. package/src/ui/auth/new-password-form.tsx +107 -0
  213. package/src/ui/auth/oauth-links.tsx +30 -0
  214. package/src/ui/auth/register-form.tsx +202 -0
  215. package/src/ui/auth/sign-in-form.tsx +238 -0
  216. package/src/ui/auth/verify-email-form.tsx +104 -0
  217. package/src/ui/crud/index.tsx +10 -0
  218. package/src/ui/data-display/accordion.tsx +65 -0
  219. package/src/ui/data-display/aspect-ratio.tsx +11 -0
  220. package/src/ui/data-display/avatar.tsx +163 -0
  221. package/src/ui/data-display/bento-grid.tsx +77 -0
  222. package/src/ui/data-display/carousel.tsx +249 -0
  223. package/src/ui/data-display/chart.tsx +363 -0
  224. package/src/ui/data-display/code-block-highlight.tsx +54 -0
  225. package/src/ui/data-display/collapsible.tsx +42 -0
  226. package/src/ui/data-display/compact-stat-bar.tsx +149 -0
  227. package/src/ui/data-display/data-table/data-table-context.tsx +255 -0
  228. package/src/ui/data-display/data-table/data-table-empty-state.tsx +133 -0
  229. package/src/ui/data-display/data-table/data-table-skeleton.tsx +145 -0
  230. package/src/ui/data-display/data-table/data-table-toolbar.tsx +353 -0
  231. package/src/ui/data-display/data-table/data-table.tsx +597 -0
  232. package/src/ui/data-display/data-table/index.ts +44 -0
  233. package/src/ui/data-display/data-table-column-header.tsx +75 -0
  234. package/src/ui/data-display/data-table-pagination.tsx +130 -0
  235. package/src/ui/data-display/data-table-view-options.tsx +59 -0
  236. package/src/ui/data-display/formatted-number-input.tsx +210 -0
  237. package/src/ui/data-display/highlight.tsx +20 -0
  238. package/src/ui/data-display/hover-card.tsx +48 -0
  239. package/src/ui/data-display/index.tsx +50 -0
  240. package/src/ui/data-display/iphone-15-pro.tsx +114 -0
  241. package/src/ui/data-display/kanban/index.ts +4 -0
  242. package/src/ui/data-display/kanban/kanban-board.tsx +192 -0
  243. package/src/ui/data-display/kanban/kanban-column.tsx +74 -0
  244. package/src/ui/data-display/kanban/kanban-item.tsx +50 -0
  245. package/src/ui/data-display/kanban/kanban-types.ts +21 -0
  246. package/src/ui/data-display/kpi-card.tsx +68 -0
  247. package/src/ui/data-display/media-grid.tsx +110 -0
  248. package/src/ui/data-display/safari.tsx +175 -0
  249. package/src/ui/data-display/show-more-text.tsx +55 -0
  250. package/src/ui/data-display/tabs.tsx +68 -0
  251. package/src/ui/data-display/timeline.tsx +256 -0
  252. package/src/ui/feedback/alert.tsx +60 -0
  253. package/src/ui/feedback/context-menu.tsx +245 -0
  254. package/src/ui/feedback/drawer.tsx +132 -0
  255. package/src/ui/feedback/error-dialog.tsx +273 -0
  256. package/src/ui/feedback/index.tsx +183 -0
  257. package/src/ui/feedback/progress.tsx +32 -0
  258. package/src/ui/feedback/sheet.tsx +148 -0
  259. package/src/ui/feedback/sonner.tsx +36 -0
  260. package/src/ui/forms/command.tsx +157 -0
  261. package/src/ui/forms/date-picker.tsx +73 -0
  262. package/src/ui/forms/date-range-picker.tsx +76 -0
  263. package/src/ui/forms/date-time-picker.tsx +109 -0
  264. package/src/ui/forms/editor/editor-menu-bar.tsx +394 -0
  265. package/src/ui/forms/editor/index.tsx +130 -0
  266. package/src/ui/forms/editor/multi-select-example.tsx +1234 -0
  267. package/src/ui/forms/emoji-picker.tsx +109 -0
  268. package/src/ui/forms/file-dropzone.tsx +169 -0
  269. package/src/ui/forms/file-thumbnail.tsx +29 -0
  270. package/src/ui/forms/index.tsx +201 -0
  271. package/src/ui/forms/input-file.tsx +99 -0
  272. package/src/ui/forms/input-group.tsx +46 -0
  273. package/src/ui/forms/input-otp.tsx +81 -0
  274. package/src/ui/forms/input-phone.tsx +172 -0
  275. package/src/ui/forms/input-spin.tsx +116 -0
  276. package/src/ui/forms/input-tags.tsx +219 -0
  277. package/src/ui/forms/input-time.tsx +42 -0
  278. package/src/ui/forms/multi-select.tsx +629 -0
  279. package/src/ui/forms/multiple-date-picker.tsx +74 -0
  280. package/src/ui/forms/radio-group.tsx +42 -0
  281. package/src/ui/forms/rating.tsx +158 -0
  282. package/src/ui/forms/time-picker.tsx +57 -0
  283. package/src/ui/index.tsx +17 -0
  284. package/src/ui/layout/animated-list.tsx +77 -0
  285. package/src/ui/layout/animated-sidebar.tsx +294 -0
  286. package/src/ui/layout/command-menu.tsx +355 -0
  287. package/src/ui/layout/customizer.tsx +324 -0
  288. package/src/ui/layout/footer.tsx +43 -0
  289. package/src/ui/layout/full-screen-toggle.tsx +52 -0
  290. package/src/ui/layout/header-breadcrumb.tsx +77 -0
  291. package/src/ui/layout/horizontal-layout-header.tsx +83 -0
  292. package/src/ui/layout/horizontal-layout.tsx +50 -0
  293. package/src/ui/layout/index.tsx +25 -0
  294. package/src/ui/layout/language-dropdown.tsx +103 -0
  295. package/src/ui/layout/logo.tsx +63 -0
  296. package/src/ui/layout/main-layout.tsx +57 -0
  297. package/src/ui/layout/mode-dropdown.tsx +58 -0
  298. package/src/ui/layout/notification-dropdown.tsx +127 -0
  299. package/src/ui/layout/page-tabs.tsx +306 -0
  300. package/src/ui/layout/route-cache.tsx +214 -0
  301. package/src/ui/layout/sidebar-group-icon-menu.tsx +195 -0
  302. package/src/ui/layout/sidebar.tsx +279 -0
  303. package/src/ui/layout/tab-content-cache.tsx +201 -0
  304. package/src/ui/layout/tab-navigation-provider.tsx +536 -0
  305. package/src/ui/layout/toggle-mobile-sidebar.tsx +33 -0
  306. package/src/ui/layout/top-bar-header-menubar.tsx +412 -0
  307. package/src/ui/layout/user-dropdown.tsx +188 -0
  308. package/src/ui/layout/vertical-layout-header.tsx +65 -0
  309. package/src/ui/layout/vertical-layout.tsx +47 -0
  310. package/src/ui/management/audit-log-page.tsx +209 -0
  311. package/src/ui/management/cache-management.tsx +349 -0
  312. package/src/ui/management/index.ts +3 -0
  313. package/src/ui/management/job-management.tsx +308 -0
  314. package/src/ui/pages/not-found.tsx +30 -0
  315. package/src/ui/primitives/badge.tsx +66 -0
  316. package/src/ui/primitives/breadcrumb.tsx +103 -0
  317. package/src/ui/primitives/button.tsx +129 -0
  318. package/src/ui/primitives/calendar.tsx +74 -0
  319. package/src/ui/primitives/card.tsx +86 -0
  320. package/src/ui/primitives/checkbox.tsx +31 -0
  321. package/src/ui/primitives/client.ts +30 -0
  322. package/src/ui/primitives/combobox.tsx +290 -0
  323. package/src/ui/primitives/dialog.tsx +121 -0
  324. package/src/ui/primitives/dropdown-menu.tsx +239 -0
  325. package/src/ui/primitives/dynamic-icon.tsx +24 -0
  326. package/src/ui/primitives/index.tsx +134 -0
  327. package/src/ui/primitives/input-number.tsx +131 -0
  328. package/src/ui/primitives/input.tsx +22 -0
  329. package/src/ui/primitives/keyboard.tsx +23 -0
  330. package/src/ui/primitives/label.tsx +24 -0
  331. package/src/ui/primitives/menubar.tsx +262 -0
  332. package/src/ui/primitives/navigation-menu.tsx +157 -0
  333. package/src/ui/primitives/pagination.tsx +118 -0
  334. package/src/ui/primitives/popover.tsx +56 -0
  335. package/src/ui/primitives/prefetch-link.tsx +60 -0
  336. package/src/ui/primitives/resizable.tsx +59 -0
  337. package/src/ui/primitives/scroll-area.tsx +63 -0
  338. package/src/ui/primitives/select.tsx +172 -0
  339. package/src/ui/primitives/separator.tsx +51 -0
  340. package/src/ui/primitives/sidebar.tsx +844 -0
  341. package/src/ui/primitives/slider.tsx +27 -0
  342. package/src/ui/primitives/status-badge.tsx +47 -0
  343. package/src/ui/primitives/sticky-layout.tsx +50 -0
  344. package/src/ui/primitives/switch.tsx +29 -0
  345. package/src/ui/primitives/table.tsx +116 -0
  346. package/src/ui/primitives/tabs.tsx +55 -0
  347. package/src/ui/primitives/toggle-group.tsx +70 -0
  348. package/src/ui/primitives/toggle.tsx +47 -0
  349. package/src/ui/primitives/tooltip.tsx +59 -0
  350. package/src/user/components/dangerous-zone.tsx +34 -0
  351. package/src/user/components/delete-account-form.tsx +40 -0
  352. package/src/user/components/index.ts +4 -0
  353. package/src/user/components/profile-info-form.tsx +390 -0
  354. package/src/user/components/profile-info.tsx +32 -0
  355. package/src/user/components/unified-profile-dialog.tsx +1019 -0
  356. package/src/user/components/user-stats.tsx +27 -0
  357. package/src/user/components/user-toolbar.tsx +137 -0
  358. package/src/user/components/users-card-view.tsx +253 -0
  359. package/src/user/index.ts +11 -0
  360. package/src/user/pages/user-list-page.tsx +234 -0
  361. package/src/user/pages/users-client-page.tsx +385 -0
  362. package/src/user/profile-page.tsx +19 -0
  363. package/src/user/schemas.ts +68 -0
  364. package/src/user/types.ts +34 -0
  365. package/src/user/user-service.ts +538 -0
  366. package/src/utils/index.ts +906 -0
  367. package/src/workflow/activity-timeline.tsx +412 -0
  368. package/src/workflow/approval-workflow.tsx +31 -0
  369. package/src/workflow/index.ts +2 -0
@@ -0,0 +1,183 @@
1
+ // @goerp/core/ui/feedback
2
+ // Feedback components (Toast, Dialog, Loading, etc.)
3
+
4
+ // ============================================================================
5
+ // Dialog (Re-exported from primitives)
6
+ // ============================================================================
7
+
8
+ export {
9
+ Dialog,
10
+ DialogTrigger,
11
+ DialogPortal,
12
+ DialogClose,
13
+ DialogOverlay,
14
+ DialogContent,
15
+ DialogHeader,
16
+ DialogFooter,
17
+ DialogTitle,
18
+ DialogDescription,
19
+ } from "../primitives";
20
+
21
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
22
+
23
+ import type { ComponentProps } from "react";
24
+
25
+ import { cn } from "../../utils";
26
+ import { buttonVariants } from "../primitives";
27
+
28
+ export * from "./progress";
29
+ export * from "./sheet";
30
+ export * from "./alert";
31
+ export * from "./context-menu";
32
+ export * from "./drawer";
33
+ export * from "./sonner";
34
+
35
+ export * from "./error-dialog";
36
+
37
+ export function AlertDialog({
38
+ ...props
39
+ }: ComponentProps<typeof AlertDialogPrimitive.Root>) {
40
+ return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />;
41
+ }
42
+
43
+ export function AlertDialogTrigger({
44
+ className,
45
+ ...props
46
+ }: ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
47
+ return (
48
+ <AlertDialogPrimitive.Trigger
49
+ data-slot="alert-dialog-trigger"
50
+ className={cn("cursor-pointer", className)}
51
+ {...props}
52
+ />
53
+ );
54
+ }
55
+
56
+ export function AlertDialogPortal({
57
+ ...props
58
+ }: ComponentProps<typeof AlertDialogPrimitive.Portal>) {
59
+ return (
60
+ <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
61
+ );
62
+ }
63
+
64
+ export function AlertDialogOverlay({
65
+ className,
66
+ ...props
67
+ }: ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
68
+ return (
69
+ <AlertDialogPrimitive.Overlay
70
+ data-slot="alert-dialog-overlay"
71
+ className={cn(
72
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
73
+ className,
74
+ )}
75
+ {...props}
76
+ />
77
+ );
78
+ }
79
+
80
+ export function AlertDialogContent({
81
+ className,
82
+ ...props
83
+ }: ComponentProps<typeof AlertDialogPrimitive.Content>) {
84
+ return (
85
+ <AlertDialogPortal>
86
+ <AlertDialogOverlay />
87
+ <AlertDialogPrimitive.Content
88
+ data-slot="alert-dialog-content"
89
+ className={cn(
90
+ "fixed top-[50%] left-[50%] z-50 w-full max-w-[calc(100%-2rem)] grid bg-background translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:max-w-lg",
91
+ className,
92
+ )}
93
+ {...props}
94
+ />
95
+ </AlertDialogPortal>
96
+ );
97
+ }
98
+
99
+ export function AlertDialogHeader({
100
+ className,
101
+ ...props
102
+ }: ComponentProps<"div">) {
103
+ return (
104
+ <div
105
+ data-slot="alert-dialog-header"
106
+ className={cn(
107
+ "flex flex-col space-y-2 text-center sm:text-left",
108
+ className,
109
+ )}
110
+ {...props}
111
+ />
112
+ );
113
+ }
114
+
115
+ export function AlertDialogFooter({
116
+ className,
117
+ ...props
118
+ }: ComponentProps<"div">) {
119
+ return (
120
+ <div
121
+ data-slot="alert-dialog-footer"
122
+ className={cn(
123
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2",
124
+ className,
125
+ )}
126
+ {...props}
127
+ />
128
+ );
129
+ }
130
+
131
+ export function AlertDialogTitle({
132
+ className,
133
+ ...props
134
+ }: ComponentProps<typeof AlertDialogPrimitive.Title>) {
135
+ return (
136
+ <AlertDialogPrimitive.Title
137
+ data-slot="alert-dialog-title"
138
+ className={cn("text-lg font-semibold", className)}
139
+ {...props}
140
+ />
141
+ );
142
+ }
143
+
144
+ export function AlertDialogDescription({
145
+ className,
146
+ ...props
147
+ }: ComponentProps<typeof AlertDialogPrimitive.Description>) {
148
+ return (
149
+ <AlertDialogPrimitive.Description
150
+ data-slot="alert-dialog-description"
151
+ className={cn("text-sm text-muted-foreground", className)}
152
+ {...props}
153
+ />
154
+ );
155
+ }
156
+
157
+ export function AlertDialogAction({
158
+ className,
159
+ ...props
160
+ }: ComponentProps<typeof AlertDialogPrimitive.Action>) {
161
+ return (
162
+ <AlertDialogPrimitive.Action
163
+ className={cn(buttonVariants(), className)}
164
+ {...props}
165
+ />
166
+ );
167
+ }
168
+
169
+ export function AlertDialogCancel({
170
+ className,
171
+ ...props
172
+ }: ComponentProps<typeof AlertDialogPrimitive.Cancel>) {
173
+ return (
174
+ <AlertDialogPrimitive.Cancel
175
+ className={cn(
176
+ buttonVariants({ variant: "outline" }),
177
+ "mt-2 sm:mt-0",
178
+ className,
179
+ )}
180
+ {...props}
181
+ />
182
+ );
183
+ }
@@ -0,0 +1,32 @@
1
+ "use client";
2
+
3
+ import * as ProgressPrimitive from "@radix-ui/react-progress";
4
+ import type { ComponentProps } from "react";
5
+ import { cn } from "../../utils";
6
+
7
+ export function Progress({
8
+ className,
9
+ value,
10
+ max,
11
+ ...props
12
+ }: ComponentProps<typeof ProgressPrimitive.Root>) {
13
+ return (
14
+ <ProgressPrimitive.Root
15
+ data-slot="progress"
16
+ className={cn(
17
+ "relative h-2 w-full overflow-hidden rounded-lg bg-primary/20",
18
+ className,
19
+ )}
20
+ max={max}
21
+ {...props}
22
+ >
23
+ <ProgressPrimitive.Indicator
24
+ data-slot="progress-indicator"
25
+ className="h-full w-full flex-1 bg-primary transition-all"
26
+ style={{
27
+ transform: `translateX(-${100 - ((value || 0) / (max || 100)) * 100}%)`,
28
+ }}
29
+ />
30
+ </ProgressPrimitive.Root>
31
+ );
32
+ }
@@ -0,0 +1,148 @@
1
+ "use client";
2
+
3
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
4
+ import { cva } from "class-variance-authority";
5
+ import type { ComponentProps } from "react";
6
+ import { cn } from "../../utils";
7
+
8
+ export function Sheet({
9
+ ...props
10
+ }: ComponentProps<typeof SheetPrimitive.Root>) {
11
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />;
12
+ }
13
+
14
+ export function SheetTrigger({
15
+ className,
16
+ ...props
17
+ }: ComponentProps<typeof SheetPrimitive.Trigger>) {
18
+ return (
19
+ <SheetPrimitive.Trigger
20
+ data-slot="sheet-trigger"
21
+ className={cn("cursor-pointer", className)}
22
+ {...props}
23
+ />
24
+ );
25
+ }
26
+
27
+ export function SheetClose({
28
+ ...props
29
+ }: ComponentProps<typeof SheetPrimitive.Close>) {
30
+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />;
31
+ }
32
+
33
+ export function SheetPortal({
34
+ ...props
35
+ }: ComponentProps<typeof SheetPrimitive.Portal>) {
36
+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />;
37
+ }
38
+
39
+ export function SheetOverlay({
40
+ className,
41
+ ...props
42
+ }: ComponentProps<typeof SheetPrimitive.Overlay>) {
43
+ return (
44
+ <SheetPrimitive.Overlay
45
+ data-slot="sheet-overlay"
46
+ className={cn(
47
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ );
53
+ }
54
+
55
+ export const sheetVariants = cva(
56
+ "fixed z-50 gap-4 bg-background p-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
57
+ {
58
+ variants: {
59
+ side: {
60
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
61
+ bottom:
62
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
63
+ left: "inset-y-0 left-0 h-full w-72 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
64
+ right:
65
+ "inset-y-0 right-0 h-full w-72 border-s data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
66
+ start:
67
+ "inset-y-0 start-0 h-full w-72 border-e data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:rtl:slide-in-from-right sm:max-w-sm",
68
+ end: "inset-y-0 end-0 h-full w-72 border-s data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:rtl:slide-in-from-left sm:max-w-sm",
69
+ },
70
+ },
71
+ defaultVariants: {
72
+ side: "right",
73
+ },
74
+ },
75
+ );
76
+
77
+ type SheetContentProps = ComponentProps<typeof SheetPrimitive.Content> & {
78
+ side?: "top" | "right" | "bottom" | "left" | "start" | "end";
79
+ };
80
+
81
+ export function SheetContent({
82
+ className,
83
+ children,
84
+ side = "right",
85
+ ...props
86
+ }: SheetContentProps) {
87
+ return (
88
+ <SheetPortal>
89
+ <SheetOverlay />
90
+ <SheetPrimitive.Content
91
+ data-slot="sheet-content"
92
+ className={cn(sheetVariants({ side }), className)}
93
+ {...props}
94
+ >
95
+ {children}
96
+ </SheetPrimitive.Content>
97
+ </SheetPortal>
98
+ );
99
+ }
100
+
101
+ export function SheetHeader({ className, ...props }: ComponentProps<"div">) {
102
+ return (
103
+ <div
104
+ data-slot="sheet-header"
105
+ className={cn("flex flex-col space-y-1", className)}
106
+ {...props}
107
+ />
108
+ );
109
+ }
110
+
111
+ export function SheetFooter({ className, ...props }: ComponentProps<"div">) {
112
+ return (
113
+ <div
114
+ data-slot="sheet-footer"
115
+ className={cn(
116
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2",
117
+ className,
118
+ )}
119
+ {...props}
120
+ />
121
+ );
122
+ }
123
+
124
+ export function SheetTitle({
125
+ className,
126
+ ...props
127
+ }: ComponentProps<typeof SheetPrimitive.Title>) {
128
+ return (
129
+ <SheetPrimitive.Title
130
+ data-slot="sheet-title"
131
+ className={cn("text-lg font-semibold text-foreground", className)}
132
+ {...props}
133
+ />
134
+ );
135
+ }
136
+
137
+ export function SheetDescription({
138
+ className,
139
+ ...props
140
+ }: ComponentProps<typeof SheetPrimitive.Description>) {
141
+ return (
142
+ <SheetPrimitive.Description
143
+ data-slot="sheet-description"
144
+ className={cn("text-sm text-muted-foreground", className)}
145
+ {...props}
146
+ />
147
+ );
148
+ }
@@ -0,0 +1,36 @@
1
+ "use client";
2
+
3
+ import { Toaster as Sonner } from "sonner";
4
+
5
+ import type { ComponentProps } from "react";
6
+
7
+ import { useSettings } from "../../hooks";
8
+
9
+ type ToasterProps = ComponentProps<typeof Sonner>;
10
+
11
+ export function Toaster({ ...props }: ToasterProps) {
12
+ const { settings } = useSettings();
13
+
14
+ const mode = settings.mode;
15
+
16
+ return (
17
+ <Sonner
18
+ theme={mode as ToasterProps["theme"]}
19
+ className="toaster group"
20
+ toastOptions={{
21
+ classNames: {
22
+ toast:
23
+ "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
24
+ description: "group-[.toast]:text-muted-foreground",
25
+ actionButton:
26
+ "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
27
+ cancelButton:
28
+ "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
29
+ },
30
+ }}
31
+ richColors
32
+ closeButton
33
+ {...props}
34
+ />
35
+ );
36
+ }
@@ -0,0 +1,157 @@
1
+ "use client";
2
+
3
+ import { Command as CommandPrimitive } from "cmdk";
4
+ import { Search } from "lucide-react";
5
+ import type { ComponentProps } from "react";
6
+ import { cn } from "../../utils";
7
+ import { Dialog, DialogContent } from "../feedback";
8
+
9
+ export function Command({
10
+ className,
11
+ ...props
12
+ }: ComponentProps<typeof CommandPrimitive>) {
13
+ return (
14
+ <CommandPrimitive
15
+ data-slot="command"
16
+ className={cn(
17
+ "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
18
+ className,
19
+ )}
20
+ {...props}
21
+ />
22
+ );
23
+ }
24
+
25
+ interface CommandDialogProps extends ComponentProps<typeof Dialog> {
26
+ commandProps?: ComponentProps<typeof Command>;
27
+ }
28
+
29
+ export function CommandDialog({
30
+ children,
31
+ commandProps,
32
+ ...props
33
+ }: CommandDialogProps) {
34
+ return (
35
+ <Dialog {...props}>
36
+ <DialogContent className="overflow-hidden p-0 shadow-lg">
37
+ <Command
38
+ className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5"
39
+ {...commandProps}
40
+ >
41
+ {children as any}
42
+ </Command>
43
+ </DialogContent>
44
+ </Dialog>
45
+ );
46
+ }
47
+
48
+ export function CommandInput({
49
+ className,
50
+ ...props
51
+ }: ComponentProps<typeof CommandPrimitive.Input>) {
52
+ return (
53
+ <div
54
+ data-slot="command-input-wrapper"
55
+ className="flex items-center border-b px-3"
56
+ >
57
+ <Search className="me-2 size-4 shrink-0 opacity-50" />
58
+ <CommandPrimitive.Input
59
+ data-slot="command-input"
60
+ className={cn(
61
+ "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
62
+ className,
63
+ )}
64
+ {...props}
65
+ />
66
+ </div>
67
+ );
68
+ }
69
+
70
+ export function CommandList({
71
+ className,
72
+ ...props
73
+ }: ComponentProps<typeof CommandPrimitive.List>) {
74
+ return (
75
+ <CommandPrimitive.List
76
+ data-slot="command-list"
77
+ className={cn(
78
+ "max-h-[300px] overflow-y-auto overflow-x-hidden",
79
+ className,
80
+ )}
81
+ {...props}
82
+ />
83
+ );
84
+ }
85
+
86
+ export function CommandEmpty({
87
+ ...props
88
+ }: ComponentProps<typeof CommandPrimitive.Empty>) {
89
+ return (
90
+ <CommandPrimitive.Empty
91
+ data-slot="command-empty"
92
+ className="py-6 text-center text-sm"
93
+ {...props}
94
+ />
95
+ );
96
+ }
97
+
98
+ export function CommandGroup({
99
+ className,
100
+ ...props
101
+ }: ComponentProps<typeof CommandPrimitive.Group>) {
102
+ return (
103
+ <CommandPrimitive.Group
104
+ data-slot="command-group"
105
+ className={cn(
106
+ "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-sm [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
107
+ className,
108
+ )}
109
+ {...props}
110
+ />
111
+ );
112
+ }
113
+
114
+ export function CommandSeparator({
115
+ className,
116
+ ...props
117
+ }: ComponentProps<typeof CommandPrimitive.Separator>) {
118
+ return (
119
+ <CommandPrimitive.Separator
120
+ data-slot="command-separator"
121
+ className={cn("-mx-1 h-px bg-border", className)}
122
+ {...props}
123
+ />
124
+ );
125
+ }
126
+
127
+ export function CommandItem({
128
+ className,
129
+ ...props
130
+ }: ComponentProps<typeof CommandPrimitive.Item>) {
131
+ return (
132
+ <CommandPrimitive.Item
133
+ data-slot="command-item"
134
+ className={cn(
135
+ "cursor-pointer relative flex gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
136
+ className,
137
+ )}
138
+ {...props}
139
+ />
140
+ );
141
+ }
142
+
143
+ export function CommandShortcut({
144
+ className,
145
+ ...props
146
+ }: ComponentProps<"span">) {
147
+ return (
148
+ <span
149
+ data-slot="command-shortcut"
150
+ className={cn(
151
+ "ms-auto text-sm tracking-widest text-muted-foreground",
152
+ className,
153
+ )}
154
+ {...props}
155
+ />
156
+ );
157
+ }
@@ -0,0 +1,73 @@
1
+ "use client";
2
+
3
+ import { format } from "date-fns";
4
+ import { CalendarIcon } from "lucide-react";
5
+
6
+ import type { ComponentProps } from "react";
7
+
8
+ import { cn } from "../../utils";
9
+
10
+ import { Button } from "../primitives";
11
+ import {
12
+ Calendar,
13
+ Popover,
14
+ PopoverContent,
15
+ PopoverTrigger,
16
+ } from "../primitives/client";
17
+
18
+ type DatePickerProps = Omit<
19
+ ComponentProps<typeof Calendar>,
20
+ "mode" | "selected" | "onSelect"
21
+ > & {
22
+ value?: Date;
23
+ onValueChange?: (date?: Date) => void;
24
+ formatStr?: string;
25
+ popoverContentClassName?: string;
26
+ popoverContentOptions?: ComponentProps<typeof PopoverContent>;
27
+ buttonClassName?: string;
28
+ buttonOptions?: ComponentProps<typeof Button>;
29
+ placeholder?: string;
30
+ };
31
+
32
+ export function DatePicker({
33
+ value,
34
+ onValueChange,
35
+ formatStr = "yyyy-MM-dd",
36
+ popoverContentClassName,
37
+ popoverContentOptions,
38
+ buttonClassName,
39
+ buttonOptions,
40
+ placeholder = "Pick date",
41
+ ...props
42
+ }: DatePickerProps) {
43
+ return (
44
+ <Popover modal>
45
+ <PopoverTrigger asChild>
46
+ <Button
47
+ variant="outline"
48
+ className={cn("w-full px-3 text-start font-normal", buttonClassName)}
49
+ {...buttonOptions}
50
+ >
51
+ {value ? (
52
+ <span>{format(value, formatStr)}</span>
53
+ ) : (
54
+ <span className="text-muted-foreground">{placeholder}</span>
55
+ )}
56
+ <CalendarIcon className="shrink-0 h-4 w-4 ms-auto text-muted-foreground" />
57
+ </Button>
58
+ </PopoverTrigger>
59
+ <PopoverContent
60
+ className={cn("w-auto p-0", popoverContentClassName)}
61
+ align="start"
62
+ {...popoverContentOptions}
63
+ >
64
+ <Calendar
65
+ mode="single"
66
+ selected={value}
67
+ onSelect={onValueChange}
68
+ {...props}
69
+ />
70
+ </PopoverContent>
71
+ </Popover>
72
+ );
73
+ }
@@ -0,0 +1,76 @@
1
+ "use client";
2
+
3
+ import { format } from "date-fns";
4
+ import { CalendarIcon } from "lucide-react";
5
+
6
+ import type { ComponentProps } from "react";
7
+ import type { DateRange } from "react-day-picker";
8
+
9
+ import { cn } from "../../utils";
10
+
11
+ import { Button } from "../primitives";
12
+ import { Calendar } from "../primitives/client";
13
+ import { Popover, PopoverContent, PopoverTrigger } from "../primitives/client";
14
+
15
+ type DateRangePickerProps = Omit<
16
+ ComponentProps<typeof Calendar>,
17
+ "mode" | "selected" | "onSelect"
18
+ > & {
19
+ value?: DateRange;
20
+ onValueChange?: (date?: DateRange) => void;
21
+ formatStr?: string;
22
+ popoverContentClassName?: string;
23
+ popoverContentOptions?: ComponentProps<typeof PopoverContent>;
24
+ buttonClassName?: string;
25
+ buttonOptions?: ComponentProps<typeof Button>;
26
+ placeholder?: string;
27
+ };
28
+
29
+ export function DateRangePicker({
30
+ value,
31
+ onValueChange,
32
+ formatStr = "yyyy-MM-dd",
33
+ popoverContentClassName,
34
+ popoverContentOptions,
35
+ buttonClassName,
36
+ buttonOptions,
37
+ placeholder = "Pick date",
38
+ ...props
39
+ }: DateRangePickerProps) {
40
+ return (
41
+ <Popover modal>
42
+ <PopoverTrigger asChild>
43
+ <Button
44
+ variant="outline"
45
+ className={cn("w-full px-3 text-start font-normal", buttonClassName)}
46
+ {...buttonOptions}
47
+ >
48
+ {value?.from ? (
49
+ value.to ? (
50
+ <span>
51
+ {format(value.from, formatStr)} to {format(value.to, formatStr)}
52
+ </span>
53
+ ) : (
54
+ <span>{format(value.from, formatStr)}</span>
55
+ )
56
+ ) : (
57
+ <span className="text-muted-foreground">{placeholder}</span>
58
+ )}
59
+ <CalendarIcon className="ms-auto h-4 w-4 text-muted-foreground" />
60
+ </Button>
61
+ </PopoverTrigger>
62
+ <PopoverContent
63
+ className={cn("w-auto p-0", popoverContentClassName)}
64
+ align="start"
65
+ {...popoverContentOptions}
66
+ >
67
+ <Calendar
68
+ mode="range"
69
+ selected={value}
70
+ onSelect={onValueChange}
71
+ {...props}
72
+ />
73
+ </PopoverContent>
74
+ </Popover>
75
+ );
76
+ }