@automa8e/ui 0.2.0

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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/_virtual/index.js +6 -0
  4. package/dist/_virtual/index.js.map +1 -0
  5. package/dist/_virtual/index2.js +5 -0
  6. package/dist/_virtual/index2.js.map +1 -0
  7. package/dist/_virtual/use-sync-external-store-shim.development.js +5 -0
  8. package/dist/_virtual/use-sync-external-store-shim.development.js.map +1 -0
  9. package/dist/_virtual/use-sync-external-store-shim.production.js +5 -0
  10. package/dist/_virtual/use-sync-external-store-shim.production.js.map +1 -0
  11. package/dist/automa8e-ui.css +226 -0
  12. package/dist/components/automation/metric-card.d.ts +19 -0
  13. package/dist/components/automation/metric-card.d.ts.map +1 -0
  14. package/dist/components/automation/metric-card.js +59 -0
  15. package/dist/components/automation/metric-card.js.map +1 -0
  16. package/dist/components/automation/status-badge.d.ts +27 -0
  17. package/dist/components/automation/status-badge.d.ts.map +1 -0
  18. package/dist/components/automation/status-badge.js +112 -0
  19. package/dist/components/automation/status-badge.js.map +1 -0
  20. package/dist/components/automation/task-card.d.ts +14 -0
  21. package/dist/components/automation/task-card.d.ts.map +1 -0
  22. package/dist/components/automation/task-card.js +114 -0
  23. package/dist/components/automation/task-card.js.map +1 -0
  24. package/dist/components/automation/workflow-node.d.ts +20 -0
  25. package/dist/components/automation/workflow-node.d.ts.map +1 -0
  26. package/dist/components/automation/workflow-node.js +132 -0
  27. package/dist/components/automation/workflow-node.js.map +1 -0
  28. package/dist/components/layout/app-shell.d.ts +21 -0
  29. package/dist/components/layout/app-shell.d.ts.map +1 -0
  30. package/dist/components/layout/app-shell.js +35 -0
  31. package/dist/components/layout/app-shell.js.map +1 -0
  32. package/dist/components/layout/header.d.ts +16 -0
  33. package/dist/components/layout/header.d.ts.map +1 -0
  34. package/dist/components/layout/header.js +30 -0
  35. package/dist/components/layout/header.js.map +1 -0
  36. package/dist/components/layout/page-header.d.ts +16 -0
  37. package/dist/components/layout/page-header.d.ts.map +1 -0
  38. package/dist/components/layout/page-header.js +29 -0
  39. package/dist/components/layout/page-header.js.map +1 -0
  40. package/dist/components/layout/sidebar.d.ts +35 -0
  41. package/dist/components/layout/sidebar.d.ts.map +1 -0
  42. package/dist/components/layout/sidebar.js +103 -0
  43. package/dist/components/layout/sidebar.js.map +1 -0
  44. package/dist/components/ui/accordion.d.ts +8 -0
  45. package/dist/components/ui/accordion.d.ts.map +1 -0
  46. package/dist/components/ui/accordion.js +51 -0
  47. package/dist/components/ui/accordion.js.map +1 -0
  48. package/dist/components/ui/alert.d.ts +18 -0
  49. package/dist/components/ui/alert.d.ts.map +1 -0
  50. package/dist/components/ui/alert.js +89 -0
  51. package/dist/components/ui/alert.js.map +1 -0
  52. package/dist/components/ui/avatar.d.ts +20 -0
  53. package/dist/components/ui/avatar.d.ts.map +1 -0
  54. package/dist/components/ui/avatar.js +72 -0
  55. package/dist/components/ui/avatar.js.map +1 -0
  56. package/dist/components/ui/badge.d.ts +13 -0
  57. package/dist/components/ui/badge.d.ts.map +1 -0
  58. package/dist/components/ui/badge.js +54 -0
  59. package/dist/components/ui/badge.js.map +1 -0
  60. package/dist/components/ui/button.d.ts +15 -0
  61. package/dist/components/ui/button.d.ts.map +1 -0
  62. package/dist/components/ui/button.js +96 -0
  63. package/dist/components/ui/button.js.map +1 -0
  64. package/dist/components/ui/card.d.ts +16 -0
  65. package/dist/components/ui/card.d.ts.map +1 -0
  66. package/dist/components/ui/card.js +96 -0
  67. package/dist/components/ui/card.js.map +1 -0
  68. package/dist/components/ui/checkbox.d.ts +9 -0
  69. package/dist/components/ui/checkbox.d.ts.map +1 -0
  70. package/dist/components/ui/checkbox.js +29 -0
  71. package/dist/components/ui/checkbox.js.map +1 -0
  72. package/dist/components/ui/dialog.d.ts +28 -0
  73. package/dist/components/ui/dialog.d.ts.map +1 -0
  74. package/dist/components/ui/dialog.js +105 -0
  75. package/dist/components/ui/dialog.js.map +1 -0
  76. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  77. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  78. package/dist/components/ui/dropdown-menu.js +160 -0
  79. package/dist/components/ui/dropdown-menu.js.map +1 -0
  80. package/dist/components/ui/input.d.ts +14 -0
  81. package/dist/components/ui/input.d.ts.map +1 -0
  82. package/dist/components/ui/input.js +60 -0
  83. package/dist/components/ui/input.js.map +1 -0
  84. package/dist/components/ui/label.d.ts +13 -0
  85. package/dist/components/ui/label.d.ts.map +1 -0
  86. package/dist/components/ui/label.js +26 -0
  87. package/dist/components/ui/label.js.map +1 -0
  88. package/dist/components/ui/popover.d.ts +8 -0
  89. package/dist/components/ui/popover.d.ts.map +1 -0
  90. package/dist/components/ui/popover.js +29 -0
  91. package/dist/components/ui/popover.js.map +1 -0
  92. package/dist/components/ui/progress.d.ts +17 -0
  93. package/dist/components/ui/progress.d.ts.map +1 -0
  94. package/dist/components/ui/progress.js +80 -0
  95. package/dist/components/ui/progress.js.map +1 -0
  96. package/dist/components/ui/scroll-area.d.ts +6 -0
  97. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  98. package/dist/components/ui/scroll-area.js +39 -0
  99. package/dist/components/ui/scroll-area.js.map +1 -0
  100. package/dist/components/ui/select.d.ts +16 -0
  101. package/dist/components/ui/select.d.ts.map +1 -0
  102. package/dist/components/ui/select.js +131 -0
  103. package/dist/components/ui/select.js.map +1 -0
  104. package/dist/components/ui/separator.d.ts +9 -0
  105. package/dist/components/ui/separator.d.ts.map +1 -0
  106. package/dist/components/ui/separator.js +50 -0
  107. package/dist/components/ui/separator.js.map +1 -0
  108. package/dist/components/ui/skeleton.d.ts +10 -0
  109. package/dist/components/ui/skeleton.d.ts.map +1 -0
  110. package/dist/components/ui/skeleton.js +30 -0
  111. package/dist/components/ui/skeleton.js.map +1 -0
  112. package/dist/components/ui/spinner.d.ts +14 -0
  113. package/dist/components/ui/spinner.d.ts.map +1 -0
  114. package/dist/components/ui/spinner.js +44 -0
  115. package/dist/components/ui/spinner.js.map +1 -0
  116. package/dist/components/ui/switch.d.ts +8 -0
  117. package/dist/components/ui/switch.d.ts.map +1 -0
  118. package/dist/components/ui/switch.js +43 -0
  119. package/dist/components/ui/switch.js.map +1 -0
  120. package/dist/components/ui/table.d.ts +11 -0
  121. package/dist/components/ui/table.d.ts.map +1 -0
  122. package/dist/components/ui/table.js +95 -0
  123. package/dist/components/ui/table.js.map +1 -0
  124. package/dist/components/ui/tabs.d.ts +20 -0
  125. package/dist/components/ui/tabs.d.ts.map +1 -0
  126. package/dist/components/ui/tabs.js +92 -0
  127. package/dist/components/ui/tabs.js.map +1 -0
  128. package/dist/components/ui/textarea.d.ts +12 -0
  129. package/dist/components/ui/textarea.d.ts.map +1 -0
  130. package/dist/components/ui/textarea.js +41 -0
  131. package/dist/components/ui/textarea.js.map +1 -0
  132. package/dist/components/ui/toast.d.ts +16 -0
  133. package/dist/components/ui/toast.d.ts.map +1 -0
  134. package/dist/components/ui/toast.js +113 -0
  135. package/dist/components/ui/toast.js.map +1 -0
  136. package/dist/components/ui/tooltip.d.ts +8 -0
  137. package/dist/components/ui/tooltip.d.ts.map +1 -0
  138. package/dist/components/ui/tooltip.js +28 -0
  139. package/dist/components/ui/tooltip.js.map +1 -0
  140. package/dist/hooks/use-debounce.d.ts +15 -0
  141. package/dist/hooks/use-debounce.d.ts.map +1 -0
  142. package/dist/hooks/use-debounce.js +15 -0
  143. package/dist/hooks/use-debounce.js.map +1 -0
  144. package/dist/hooks/use-local-storage.d.ts +9 -0
  145. package/dist/hooks/use-local-storage.d.ts.map +1 -0
  146. package/dist/hooks/use-local-storage.js +49 -0
  147. package/dist/hooks/use-local-storage.js.map +1 -0
  148. package/dist/hooks/use-media-query.d.ts +9 -0
  149. package/dist/hooks/use-media-query.d.ts.map +1 -0
  150. package/dist/hooks/use-media-query.js +20 -0
  151. package/dist/hooks/use-media-query.js.map +1 -0
  152. package/dist/index.d.ts +66 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +153 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/colors.d.ts +73 -0
  157. package/dist/lib/colors.d.ts.map +1 -0
  158. package/dist/lib/colors.js +64 -0
  159. package/dist/lib/colors.js.map +1 -0
  160. package/dist/lib/utils.d.ts +7 -0
  161. package/dist/lib/utils.d.ts.map +1 -0
  162. package/dist/lib/utils.js +9 -0
  163. package/dist/lib/utils.js.map +1 -0
  164. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js +729 -0
  165. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -0
  166. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +630 -0
  167. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  168. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js +325 -0
  169. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js.map +1 -0
  170. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +177 -0
  171. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  172. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +152 -0
  173. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  174. package/dist/node_modules/@radix-ui/number/dist/index.js +7 -0
  175. package/dist/node_modules/@radix-ui/number/dist/index.js.map +1 -0
  176. package/dist/node_modules/@radix-ui/primitive/dist/index.js +12 -0
  177. package/dist/node_modules/@radix-ui/primitive/dist/index.js.map +1 -0
  178. package/dist/node_modules/@radix-ui/react-accordion/dist/index.js +319 -0
  179. package/dist/node_modules/@radix-ui/react-accordion/dist/index.js.map +1 -0
  180. package/dist/node_modules/@radix-ui/react-arrow/dist/index.js +26 -0
  181. package/dist/node_modules/@radix-ui/react-arrow/dist/index.js.map +1 -0
  182. package/dist/node_modules/@radix-ui/react-avatar/dist/index.js +124 -0
  183. package/dist/node_modules/@radix-ui/react-avatar/dist/index.js.map +1 -0
  184. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.js +66 -0
  185. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  186. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  187. package/dist/node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  188. package/dist/node_modules/@radix-ui/react-checkbox/dist/index.js +280 -0
  189. package/dist/node_modules/@radix-ui/react-checkbox/dist/index.js.map +1 -0
  190. package/dist/node_modules/@radix-ui/react-collapsible/dist/index.js +152 -0
  191. package/dist/node_modules/@radix-ui/react-collapsible/dist/index.js.map +1 -0
  192. package/dist/node_modules/@radix-ui/react-collection/dist/index.js +71 -0
  193. package/dist/node_modules/@radix-ui/react-collection/dist/index.js.map +1 -0
  194. package/dist/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  195. package/dist/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  196. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.js +40 -0
  197. package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.js.map +1 -0
  198. package/dist/node_modules/@radix-ui/react-context/dist/index.js +82 -0
  199. package/dist/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  200. package/dist/node_modules/@radix-ui/react-dialog/dist/index.js +342 -0
  201. package/dist/node_modules/@radix-ui/react-dialog/dist/index.js.map +1 -0
  202. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  203. package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  204. package/dist/node_modules/@radix-ui/react-direction/dist/index.js +11 -0
  205. package/dist/node_modules/@radix-ui/react-direction/dist/index.js.map +1 -0
  206. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js +217 -0
  207. package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js.map +1 -0
  208. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +299 -0
  209. package/dist/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +1 -0
  210. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.js +30 -0
  211. package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.js.map +1 -0
  212. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.js +209 -0
  213. package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.js.map +1 -0
  214. package/dist/node_modules/@radix-ui/react-id/dist/index.js +15 -0
  215. package/dist/node_modules/@radix-ui/react-id/dist/index.js.map +1 -0
  216. package/dist/node_modules/@radix-ui/react-label/dist/index.js +27 -0
  217. package/dist/node_modules/@radix-ui/react-label/dist/index.js.map +1 -0
  218. package/dist/node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  219. package/dist/node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  220. package/dist/node_modules/@radix-ui/react-menu/dist/index.js +881 -0
  221. package/dist/node_modules/@radix-ui/react-menu/dist/index.js.map +1 -0
  222. package/dist/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  223. package/dist/node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  224. package/dist/node_modules/@radix-ui/react-popover/dist/index.js +314 -0
  225. package/dist/node_modules/@radix-ui/react-popover/dist/index.js.map +1 -0
  226. package/dist/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  227. package/dist/node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  228. package/dist/node_modules/@radix-ui/react-popper/dist/index.js +294 -0
  229. package/dist/node_modules/@radix-ui/react-popper/dist/index.js.map +1 -0
  230. package/dist/node_modules/@radix-ui/react-portal/dist/index.js +19 -0
  231. package/dist/node_modules/@radix-ui/react-portal/dist/index.js.map +1 -0
  232. package/dist/node_modules/@radix-ui/react-presence/dist/index.js +130 -0
  233. package/dist/node_modules/@radix-ui/react-presence/dist/index.js.map +1 -0
  234. package/dist/node_modules/@radix-ui/react-primitive/dist/index.js +44 -0
  235. package/dist/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  236. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  237. package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  238. package/dist/node_modules/@radix-ui/react-progress/dist/index.js +97 -0
  239. package/dist/node_modules/@radix-ui/react-progress/dist/index.js.map +1 -0
  240. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context/dist/index.js +66 -0
  241. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context/dist/index.js.map +1 -0
  242. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  243. package/dist/node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  244. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.js +228 -0
  245. package/dist/node_modules/@radix-ui/react-roving-focus/dist/index.js.map +1 -0
  246. package/dist/node_modules/@radix-ui/react-scroll-area/dist/index.js +728 -0
  247. package/dist/node_modules/@radix-ui/react-scroll-area/dist/index.js.map +1 -0
  248. package/dist/node_modules/@radix-ui/react-select/dist/index.js +1200 -0
  249. package/dist/node_modules/@radix-ui/react-select/dist/index.js.map +1 -0
  250. package/dist/node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot/dist/index.js +90 -0
  251. package/dist/node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  252. package/dist/node_modules/@radix-ui/react-separator/dist/index.js +31 -0
  253. package/dist/node_modules/@radix-ui/react-separator/dist/index.js.map +1 -0
  254. package/dist/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js +40 -0
  255. package/dist/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js.map +1 -0
  256. package/dist/node_modules/@radix-ui/react-slot/dist/index.js +107 -0
  257. package/dist/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  258. package/dist/node_modules/@radix-ui/react-switch/dist/index.js +156 -0
  259. package/dist/node_modules/@radix-ui/react-switch/dist/index.js.map +1 -0
  260. package/dist/node_modules/@radix-ui/react-tabs/dist/index.js +195 -0
  261. package/dist/node_modules/@radix-ui/react-tabs/dist/index.js.map +1 -0
  262. package/dist/node_modules/@radix-ui/react-toast/dist/index.js +645 -0
  263. package/dist/node_modules/@radix-ui/react-toast/dist/index.js.map +1 -0
  264. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.js +501 -0
  265. package/dist/node_modules/@radix-ui/react-tooltip/dist/index.js.map +1 -0
  266. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.js +16 -0
  267. package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.js.map +1 -0
  268. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js +15 -0
  269. package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js.map +1 -0
  270. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js +72 -0
  271. package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js.map +1 -0
  272. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js +18 -0
  273. package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js.map +1 -0
  274. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +16 -0
  275. package/dist/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js.map +1 -0
  276. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js +7 -0
  277. package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js.map +1 -0
  278. package/dist/node_modules/@radix-ui/react-use-previous/dist/index.js +15 -0
  279. package/dist/node_modules/@radix-ui/react-use-previous/dist/index.js.map +1 -0
  280. package/dist/node_modules/@radix-ui/react-use-size/dist/index.js +40 -0
  281. package/dist/node_modules/@radix-ui/react-use-size/dist/index.js.map +1 -0
  282. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.js +37 -0
  283. package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +1 -0
  284. package/dist/node_modules/aria-hidden/dist/es2015/index.js +123 -0
  285. package/dist/node_modules/aria-hidden/dist/es2015/index.js.map +1 -0
  286. package/dist/node_modules/class-variance-authority/dist/index.js +46 -0
  287. package/dist/node_modules/class-variance-authority/dist/index.js.map +1 -0
  288. package/dist/node_modules/clsx/dist/clsx.js +17 -0
  289. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  290. package/dist/node_modules/get-nonce/dist/es2015/index.js +10 -0
  291. package/dist/node_modules/get-nonce/dist/es2015/index.js.map +1 -0
  292. package/dist/node_modules/lucide-react/dist/esm/Icon.js +43 -0
  293. package/dist/node_modules/lucide-react/dist/esm/Icon.js.map +1 -0
  294. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js +25 -0
  295. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js.map +1 -0
  296. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js +21 -0
  297. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js.map +1 -0
  298. package/dist/node_modules/lucide-react/dist/esm/icons/ban.js +15 -0
  299. package/dist/node_modules/lucide-react/dist/esm/icons/ban.js.map +1 -0
  300. package/dist/node_modules/lucide-react/dist/esm/icons/calendar.js +17 -0
  301. package/dist/node_modules/lucide-react/dist/esm/icons/calendar.js.map +1 -0
  302. package/dist/node_modules/lucide-react/dist/esm/icons/check.js +12 -0
  303. package/dist/node_modules/lucide-react/dist/esm/icons/check.js.map +1 -0
  304. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js +14 -0
  305. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js.map +1 -0
  306. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.js +14 -0
  307. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.js.map +1 -0
  308. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js +14 -0
  309. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js.map +1 -0
  310. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +12 -0
  311. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +1 -0
  312. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +16 -0
  313. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  314. package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.js +15 -0
  315. package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.js.map +1 -0
  316. package/dist/node_modules/lucide-react/dist/esm/icons/circle-minus.js +15 -0
  317. package/dist/node_modules/lucide-react/dist/esm/icons/circle-minus.js.map +1 -0
  318. package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.js +16 -0
  319. package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.js.map +1 -0
  320. package/dist/node_modules/lucide-react/dist/esm/icons/circle.js +14 -0
  321. package/dist/node_modules/lucide-react/dist/esm/icons/circle.js.map +1 -0
  322. package/dist/node_modules/lucide-react/dist/esm/icons/clock.js +15 -0
  323. package/dist/node_modules/lucide-react/dist/esm/icons/clock.js.map +1 -0
  324. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +15 -0
  325. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  326. package/dist/node_modules/lucide-react/dist/esm/icons/git-branch.js +17 -0
  327. package/dist/node_modules/lucide-react/dist/esm/icons/git-branch.js.map +1 -0
  328. package/dist/node_modules/lucide-react/dist/esm/icons/info.js +16 -0
  329. package/dist/node_modules/lucide-react/dist/esm/icons/info.js.map +1 -0
  330. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js +14 -0
  331. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js.map +1 -0
  332. package/dist/node_modules/lucide-react/dist/esm/icons/minus.js +12 -0
  333. package/dist/node_modules/lucide-react/dist/esm/icons/minus.js.map +1 -0
  334. package/dist/node_modules/lucide-react/dist/esm/icons/pause.js +15 -0
  335. package/dist/node_modules/lucide-react/dist/esm/icons/pause.js.map +1 -0
  336. package/dist/node_modules/lucide-react/dist/esm/icons/play.js +14 -0
  337. package/dist/node_modules/lucide-react/dist/esm/icons/play.js.map +1 -0
  338. package/dist/node_modules/lucide-react/dist/esm/icons/send.js +21 -0
  339. package/dist/node_modules/lucide-react/dist/esm/icons/send.js.map +1 -0
  340. package/dist/node_modules/lucide-react/dist/esm/icons/tag.js +21 -0
  341. package/dist/node_modules/lucide-react/dist/esm/icons/tag.js.map +1 -0
  342. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js +16 -0
  343. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js.map +1 -0
  344. package/dist/node_modules/lucide-react/dist/esm/icons/trending-down.js +15 -0
  345. package/dist/node_modules/lucide-react/dist/esm/icons/trending-down.js.map +1 -0
  346. package/dist/node_modules/lucide-react/dist/esm/icons/trending-up.js +15 -0
  347. package/dist/node_modules/lucide-react/dist/esm/icons/trending-up.js.map +1 -0
  348. package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.js +22 -0
  349. package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.js.map +1 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/x.js +15 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/x.js.map +1 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +20 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  354. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js +15 -0
  355. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js.map +1 -0
  356. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.js +12 -0
  357. package/dist/node_modules/react-remove-scroll/dist/es2015/Combination.js.map +1 -0
  358. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js +181 -0
  359. package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js.map +1 -0
  360. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.js +39 -0
  361. package/dist/node_modules/react-remove-scroll/dist/es2015/UI.js.map +1 -0
  362. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js +20 -0
  363. package/dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js.map +1 -0
  364. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js +103 -0
  365. package/dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js.map +1 -0
  366. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.js +6 -0
  367. package/dist/node_modules/react-remove-scroll/dist/es2015/medium.js.map +1 -0
  368. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js +8 -0
  369. package/dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js.map +1 -0
  370. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js +48 -0
  371. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js.map +1 -0
  372. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js +11 -0
  373. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js.map +1 -0
  374. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js +38 -0
  375. package/dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js.map +1 -0
  376. package/dist/node_modules/react-style-singleton/dist/es2015/component.js +14 -0
  377. package/dist/node_modules/react-style-singleton/dist/es2015/component.js.map +1 -0
  378. package/dist/node_modules/react-style-singleton/dist/es2015/hook.js +17 -0
  379. package/dist/node_modules/react-style-singleton/dist/es2015/hook.js.map +1 -0
  380. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.js +49 -0
  381. package/dist/node_modules/react-style-singleton/dist/es2015/singleton.js.map +1 -0
  382. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +2467 -0
  383. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  384. package/dist/node_modules/tslib/tslib.es6.js +40 -0
  385. package/dist/node_modules/tslib/tslib.es6.js.map +1 -0
  386. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.js +12 -0
  387. package/dist/node_modules/use-callback-ref/dist/es2015/assignRef.js.map +1 -0
  388. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js +36 -0
  389. package/dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js.map +1 -0
  390. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.js +30 -0
  391. package/dist/node_modules/use-callback-ref/dist/es2015/useRef.js.map +1 -0
  392. package/dist/node_modules/use-sidecar/dist/es2015/exports.js +22 -0
  393. package/dist/node_modules/use-sidecar/dist/es2015/exports.js.map +1 -0
  394. package/dist/node_modules/use-sidecar/dist/es2015/medium.js +89 -0
  395. package/dist/node_modules/use-sidecar/dist/es2015/medium.js.map +1 -0
  396. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +78 -0
  397. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
  398. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +63 -0
  399. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
  400. package/dist/node_modules/use-sync-external-store/shim/index.js +18 -0
  401. package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
  402. package/dist/types/automation.d.ts +59 -0
  403. package/dist/types/automation.d.ts.map +1 -0
  404. package/dist/types/common.d.ts +38 -0
  405. package/dist/types/common.d.ts.map +1 -0
  406. package/package.json +119 -0
  407. package/registry/registry.json +218 -0
  408. package/src/components/automation/metric-card.tsx +113 -0
  409. package/src/components/automation/status-badge.tsx +136 -0
  410. package/src/components/automation/task-card.tsx +164 -0
  411. package/src/components/automation/workflow-node.tsx +186 -0
  412. package/src/components/layout/app-shell.tsx +58 -0
  413. package/src/components/layout/header.tsx +39 -0
  414. package/src/components/layout/page-header.tsx +42 -0
  415. package/src/components/layout/sidebar.tsx +190 -0
  416. package/src/components/ui/accordion.tsx +57 -0
  417. package/src/components/ui/alert.tsx +93 -0
  418. package/src/components/ui/avatar.tsx +94 -0
  419. package/src/components/ui/badge.tsx +69 -0
  420. package/src/components/ui/button.tsx +106 -0
  421. package/src/components/ui/card.tsx +96 -0
  422. package/src/components/ui/checkbox.tsx +40 -0
  423. package/src/components/ui/dialog.tsx +129 -0
  424. package/src/components/ui/dropdown-menu.tsx +194 -0
  425. package/src/components/ui/input.tsx +80 -0
  426. package/src/components/ui/label.tsx +37 -0
  427. package/src/components/ui/popover.tsx +29 -0
  428. package/src/components/ui/progress.tsx +92 -0
  429. package/src/components/ui/scroll-area.tsx +43 -0
  430. package/src/components/ui/select.tsx +157 -0
  431. package/src/components/ui/separator.tsx +56 -0
  432. package/src/components/ui/skeleton.tsx +41 -0
  433. package/src/components/ui/spinner.tsx +50 -0
  434. package/src/components/ui/switch.tsx +46 -0
  435. package/src/components/ui/table.tsx +117 -0
  436. package/src/components/ui/tabs.tsx +107 -0
  437. package/src/components/ui/textarea.tsx +50 -0
  438. package/src/components/ui/toast.tsx +139 -0
  439. package/src/components/ui/tooltip.tsx +28 -0
  440. package/src/hooks/use-debounce.ts +28 -0
  441. package/src/hooks/use-local-storage.ts +63 -0
  442. package/src/hooks/use-media-query.ts +29 -0
  443. package/src/index.ts +197 -0
  444. package/src/lib/colors.ts +102 -0
  445. package/src/lib/utils.ts +10 -0
  446. package/src/styles/globals.css +230 -0
  447. package/src/types/automation.ts +74 -0
  448. package/src/types/common.ts +48 -0
  449. package/tailwind/preset.cjs +98 -0
  450. package/tailwind/preset.css +5 -0
  451. package/tailwind/preset.ts +159 -0
@@ -0,0 +1,186 @@
1
+ import * as React from 'react'
2
+ import {
3
+ Zap,
4
+ Play,
5
+ GitBranch,
6
+ Timer,
7
+ Send,
8
+ AlertCircle,
9
+ CheckCircle2,
10
+ Loader2,
11
+ Clock,
12
+ Pause,
13
+ } from 'lucide-react'
14
+ import { cn } from '@/lib/utils'
15
+ import type { WorkflowNodeData } from '@/types/automation'
16
+
17
+ const NODE_TYPE_CONFIG = {
18
+ trigger: {
19
+ icon: Zap,
20
+ label: 'Trigger',
21
+ className: 'border-primary/50 bg-primary/10 text-primary',
22
+ headerClass: 'bg-primary/10',
23
+ },
24
+ action: {
25
+ icon: Play,
26
+ label: 'Action',
27
+ className: 'border-border bg-card text-foreground',
28
+ headerClass: 'bg-muted',
29
+ },
30
+ condition: {
31
+ icon: GitBranch,
32
+ label: 'Condition',
33
+ className: 'border-info/50 bg-info/10 text-foreground',
34
+ headerClass: 'bg-info/10',
35
+ },
36
+ delay: {
37
+ icon: Timer,
38
+ label: 'Delay',
39
+ className: 'border-warning/50 bg-warning/10 text-foreground',
40
+ headerClass: 'bg-warning/10',
41
+ },
42
+ output: {
43
+ icon: Send,
44
+ label: 'Output',
45
+ className: 'border-success/50 bg-success/10 text-foreground',
46
+ headerClass: 'bg-success/10',
47
+ },
48
+ }
49
+
50
+ const STATUS_INDICATOR = {
51
+ running: { icon: Loader2, className: 'text-workflow-running animate-spin' },
52
+ completed: { icon: CheckCircle2, className: 'text-workflow-completed' },
53
+ failed: { icon: AlertCircle, className: 'text-workflow-failed' },
54
+ pending: { icon: Clock, className: 'text-workflow-pending' },
55
+ paused: { icon: Pause, className: 'text-workflow-paused' },
56
+ cancelled: { icon: AlertCircle, className: 'text-workflow-cancelled' },
57
+ idle: { icon: Clock, className: 'text-muted-foreground' },
58
+ scheduled: { icon: Clock, className: 'text-info' },
59
+ }
60
+
61
+ export interface WorkflowNodeProps extends React.HTMLAttributes<HTMLDivElement> {
62
+ node: WorkflowNodeData
63
+ /** Show as a compact inline node */
64
+ compact?: boolean
65
+ /** Whether to show the connector line below */
66
+ showConnector?: boolean
67
+ /** Whether this is the last node in the chain */
68
+ isLast?: boolean
69
+ }
70
+
71
+ function WorkflowNode({
72
+ className,
73
+ node,
74
+ compact = false,
75
+ showConnector = false,
76
+ isLast = false,
77
+ ...props
78
+ }: WorkflowNodeProps) {
79
+ const typeConfig = NODE_TYPE_CONFIG[node.type]
80
+ const statusIndicator = STATUS_INDICATOR[node.status]
81
+ const TypeIcon = typeConfig.icon
82
+ const StatusIcon = statusIndicator.icon
83
+
84
+ const formatDuration = (ms: number) => {
85
+ if (ms < 1000) return `${ms}ms`
86
+ if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`
87
+ return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`
88
+ }
89
+
90
+ return (
91
+ <div className="relative flex flex-col items-center">
92
+ <div
93
+ className={cn(
94
+ 'w-full rounded-lg border transition-all duration-200',
95
+ typeConfig.className,
96
+ node.status === 'running' && 'shadow-glow-primary animate-workflow-pulse',
97
+ node.status === 'failed' && 'border-workflow-failed/60',
98
+ compact ? 'p-3' : 'overflow-hidden',
99
+ className
100
+ )}
101
+ {...props}
102
+ >
103
+ {compact ? (
104
+ <div className="flex items-center gap-2">
105
+ <div className={cn('flex h-6 w-6 shrink-0 items-center justify-center rounded', typeConfig.headerClass)}>
106
+ <TypeIcon className="h-3.5 w-3.5" />
107
+ </div>
108
+ <span className="flex-1 text-sm font-medium truncate">{node.label}</span>
109
+ <StatusIcon className={cn('h-4 w-4 shrink-0', statusIndicator.className)} />
110
+ </div>
111
+ ) : (
112
+ <>
113
+ {/* Node header */}
114
+ <div className={cn('flex items-center gap-2.5 px-3 py-2.5', typeConfig.headerClass)}>
115
+ <div className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-background/50">
116
+ <TypeIcon className="h-4 w-4" />
117
+ </div>
118
+ <div className="flex-1 min-w-0">
119
+ <div className="flex items-center gap-1.5">
120
+ <span className="text-[10px] font-semibold uppercase tracking-wider opacity-70">
121
+ {typeConfig.label}
122
+ </span>
123
+ </div>
124
+ <p className="text-sm font-semibold leading-tight truncate">{node.label}</p>
125
+ </div>
126
+ <StatusIcon className={cn('h-4 w-4 shrink-0', statusIndicator.className)} />
127
+ </div>
128
+
129
+ {/* Node body */}
130
+ {(node.description || node.error || node.duration !== undefined) && (
131
+ <div className="px-3 py-2.5 space-y-1.5">
132
+ {node.description && (
133
+ <p className="text-xs text-muted-foreground">{node.description}</p>
134
+ )}
135
+ {node.error && (
136
+ <p className="text-xs text-destructive font-mono bg-destructive/5 rounded px-2 py-1">
137
+ {node.error}
138
+ </p>
139
+ )}
140
+ {node.duration !== undefined && (
141
+ <div className="flex items-center gap-1 text-[10px] text-muted-foreground">
142
+ <Clock className="h-3 w-3" />
143
+ <span>{formatDuration(node.duration)}</span>
144
+ </div>
145
+ )}
146
+ </div>
147
+ )}
148
+ </>
149
+ )}
150
+ </div>
151
+
152
+ {/* Connector line */}
153
+ {showConnector && !isLast && (
154
+ <div className="flex flex-col items-center my-1">
155
+ <div className="w-px h-4 bg-border" />
156
+ <div className="w-1.5 h-1.5 rounded-full bg-border" />
157
+ <div className="w-px h-4 bg-border" />
158
+ </div>
159
+ )}
160
+ </div>
161
+ )
162
+ }
163
+
164
+ /** Renders a vertical workflow pipeline from an array of nodes */
165
+ export interface WorkflowPipelineProps extends React.HTMLAttributes<HTMLDivElement> {
166
+ nodes: WorkflowNodeData[]
167
+ compact?: boolean
168
+ }
169
+
170
+ function WorkflowPipeline({ className, nodes, compact = false, ...props }: WorkflowPipelineProps) {
171
+ return (
172
+ <div className={cn('flex flex-col', className)} {...props}>
173
+ {nodes.map((node, i) => (
174
+ <WorkflowNode
175
+ key={node.id}
176
+ node={node}
177
+ compact={compact}
178
+ showConnector
179
+ isLast={i === nodes.length - 1}
180
+ />
181
+ ))}
182
+ </div>
183
+ )
184
+ }
185
+
186
+ export { WorkflowNode, WorkflowPipeline }
@@ -0,0 +1,58 @@
1
+ import * as React from 'react'
2
+ import { cn } from '@/lib/utils'
3
+
4
+ export interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ /** The sidebar component */
6
+ sidebar?: React.ReactNode
7
+ /** The top header component */
8
+ header?: React.ReactNode
9
+ /** Main content */
10
+ children: React.ReactNode
11
+ /** Whether the sidebar is currently shown (for mobile overlay handling) */
12
+ sidebarOpen?: boolean
13
+ }
14
+
15
+ /**
16
+ * AppShell provides the top-level layout structure:
17
+ * - Sidebar (left)
18
+ * - Main area (header + content)
19
+ */
20
+ function AppShell({ className, sidebar, header, children, sidebarOpen = true, ...props }: AppShellProps) {
21
+ return (
22
+ <div
23
+ className={cn('flex h-screen w-full overflow-hidden bg-background', className)}
24
+ {...props}
25
+ >
26
+ {/* Sidebar */}
27
+ {sidebar && (
28
+ <div
29
+ className={cn(
30
+ 'shrink-0 h-full transition-all duration-200',
31
+ !sidebarOpen && 'hidden md:flex'
32
+ )}
33
+ >
34
+ {sidebar}
35
+ </div>
36
+ )}
37
+
38
+ {/* Main column */}
39
+ <div className="flex flex-1 flex-col overflow-hidden min-w-0">
40
+ {header}
41
+ <main className="flex-1 overflow-y-auto">
42
+ {children}
43
+ </main>
44
+ </div>
45
+ </div>
46
+ )
47
+ }
48
+
49
+ /** Content wrapper with standard page padding */
50
+ function PageContent({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>) {
51
+ return (
52
+ <div className={cn('p-6', className)} {...props}>
53
+ {children}
54
+ </div>
55
+ )
56
+ }
57
+
58
+ export { AppShell, PageContent }
@@ -0,0 +1,39 @@
1
+ import * as React from 'react'
2
+ import { cn } from '@/lib/utils'
3
+
4
+ export interface HeaderProps extends React.HTMLAttributes<HTMLElement> {
5
+ /** Left slot — typically logo + nav */
6
+ left?: React.ReactNode
7
+ /** Center slot — search, breadcrumbs */
8
+ center?: React.ReactNode
9
+ /** Right slot — user menu, notifications, settings */
10
+ right?: React.ReactNode
11
+ /** Makes header sticky at top */
12
+ sticky?: boolean
13
+ /** Adds a bottom border */
14
+ bordered?: boolean
15
+ }
16
+
17
+ const Header = React.forwardRef<HTMLElement, HeaderProps>(
18
+ ({ className, left, center, right, sticky = false, bordered = true, children, ...props }, ref) => (
19
+ <header
20
+ ref={ref}
21
+ className={cn(
22
+ 'z-40 flex h-14 w-full items-center gap-4 bg-background px-4',
23
+ sticky && 'sticky top-0',
24
+ bordered && 'border-b border-border',
25
+ className
26
+ )}
27
+ {...props}
28
+ >
29
+ {left && <div className="flex items-center gap-3">{left}</div>}
30
+ {center && <div className="flex flex-1 items-center justify-center">{center}</div>}
31
+ {!center && <div className="flex-1" />}
32
+ {right && <div className="flex items-center gap-2">{right}</div>}
33
+ {children}
34
+ </header>
35
+ )
36
+ )
37
+ Header.displayName = 'Header'
38
+
39
+ export { Header }
@@ -0,0 +1,42 @@
1
+ import * as React from 'react'
2
+ import { cn } from '@/lib/utils'
3
+
4
+ export interface PageHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ /** Page title */
6
+ title: string
7
+ /** Subtitle / description */
8
+ description?: string
9
+ /** Slot for breadcrumbs above the title */
10
+ breadcrumbs?: React.ReactNode
11
+ /** Slot for action buttons (top-right) */
12
+ actions?: React.ReactNode
13
+ /** Optional decorative badge next to the title */
14
+ badge?: React.ReactNode
15
+ }
16
+
17
+ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
18
+ ({ className, title, description, breadcrumbs, actions, badge, ...props }, ref) => (
19
+ <div
20
+ ref={ref}
21
+ className={cn('flex flex-col gap-1 pb-6 md:flex-row md:items-start md:justify-between', className)}
22
+ {...props}
23
+ >
24
+ <div className="space-y-1.5">
25
+ {breadcrumbs && <div className="mb-2">{breadcrumbs}</div>}
26
+ <div className="flex items-center gap-3 flex-wrap">
27
+ <h1 className="text-2xl font-bold tracking-tight font-display">{title}</h1>
28
+ {badge}
29
+ </div>
30
+ {description && (
31
+ <p className="text-sm text-muted-foreground max-w-2xl">{description}</p>
32
+ )}
33
+ </div>
34
+ {actions && (
35
+ <div className="flex items-center gap-2 shrink-0 mt-2 md:mt-0">{actions}</div>
36
+ )}
37
+ </div>
38
+ )
39
+ )
40
+ PageHeader.displayName = 'PageHeader'
41
+
42
+ export { PageHeader }
@@ -0,0 +1,190 @@
1
+ import * as React from 'react'
2
+ import { ChevronLeft, ChevronRight } from 'lucide-react'
3
+ import { cn } from '@/lib/utils'
4
+ import { Button } from '@/components/ui/button'
5
+ import { Separator } from '@/components/ui/separator'
6
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
7
+
8
+ export interface SidebarNavItem {
9
+ id: string
10
+ label: string
11
+ icon?: React.ReactNode
12
+ href?: string
13
+ badge?: string | number
14
+ active?: boolean
15
+ disabled?: boolean
16
+ onClick?: () => void
17
+ children?: SidebarNavItem[]
18
+ }
19
+
20
+ export interface SidebarSection {
21
+ id: string
22
+ label?: string
23
+ items: SidebarNavItem[]
24
+ }
25
+
26
+ export interface SidebarProps extends React.HTMLAttributes<HTMLDivElement> {
27
+ sections?: SidebarSection[]
28
+ /** Whether sidebar is collapsed to icon-only mode */
29
+ collapsed?: boolean
30
+ /** Called when collapse toggle is pressed */
31
+ onCollapsedChange?: (collapsed: boolean) => void
32
+ /** Show collapse toggle button */
33
+ collapsible?: boolean
34
+ /** Width when expanded */
35
+ width?: string
36
+ /** Slot for logo/brand area */
37
+ header?: React.ReactNode
38
+ /** Slot for footer content (user menu, etc.) */
39
+ footer?: React.ReactNode
40
+ }
41
+
42
+ function SidebarNavItemComponent({
43
+ item,
44
+ collapsed,
45
+ }: {
46
+ item: SidebarNavItem
47
+ collapsed: boolean
48
+ }) {
49
+ const content = (
50
+ <button
51
+ onClick={item.onClick}
52
+ disabled={item.disabled}
53
+ className={cn(
54
+ 'flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-sm font-medium transition-colors duration-150',
55
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
56
+ item.active
57
+ ? 'bg-primary/15 text-primary border border-primary/20'
58
+ : 'text-muted-foreground hover:bg-muted hover:text-foreground border border-transparent',
59
+ item.disabled && 'pointer-events-none opacity-50',
60
+ collapsed && 'justify-center px-2'
61
+ )}
62
+ >
63
+ {item.icon && (
64
+ <span className={cn('shrink-0 [&>svg]:h-4 [&>svg]:w-4', item.active && 'text-primary')}>
65
+ {item.icon}
66
+ </span>
67
+ )}
68
+ {!collapsed && (
69
+ <>
70
+ <span className="flex-1 truncate text-left">{item.label}</span>
71
+ {item.badge !== undefined && (
72
+ <span className={cn(
73
+ 'ml-auto flex h-5 min-w-5 items-center justify-center rounded-full px-1.5 text-[10px] font-semibold',
74
+ item.active ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'
75
+ )}>
76
+ {item.badge}
77
+ </span>
78
+ )}
79
+ </>
80
+ )}
81
+ </button>
82
+ )
83
+
84
+ if (collapsed && item.label) {
85
+ return (
86
+ <Tooltip>
87
+ <TooltipTrigger asChild>{content}</TooltipTrigger>
88
+ <TooltipContent side="right">{item.label}</TooltipContent>
89
+ </Tooltip>
90
+ )
91
+ }
92
+
93
+ return content
94
+ }
95
+
96
+ const Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(
97
+ (
98
+ {
99
+ className,
100
+ sections = [],
101
+ collapsed = false,
102
+ onCollapsedChange,
103
+ collapsible = true,
104
+ width = '240px',
105
+ header,
106
+ footer,
107
+ ...props
108
+ },
109
+ ref
110
+ ) => {
111
+ return (
112
+ <TooltipProvider delayDuration={0}>
113
+ <div
114
+ ref={ref}
115
+ style={{ width: collapsed ? '56px' : width }}
116
+ className={cn(
117
+ 'flex h-full flex-col border-r border-border bg-background transition-all duration-200',
118
+ className
119
+ )}
120
+ {...props}
121
+ >
122
+ {/* Header slot */}
123
+ {header && (
124
+ <>
125
+ <div className={cn('flex items-center px-3 py-4', collapsed && 'justify-center')}>
126
+ {header}
127
+ </div>
128
+ <Separator />
129
+ </>
130
+ )}
131
+
132
+ {/* Nav sections */}
133
+ <div className="flex-1 overflow-y-auto py-2 px-2 space-y-4">
134
+ {sections.map((section, idx) => (
135
+ <div key={section.id}>
136
+ {section.label && !collapsed && (
137
+ <p className="mb-1 px-2.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground">
138
+ {section.label}
139
+ </p>
140
+ )}
141
+ {section.label && collapsed && idx > 0 && (
142
+ <Separator className="my-2" />
143
+ )}
144
+ <div className="space-y-0.5">
145
+ {section.items.map((item) => (
146
+ <SidebarNavItemComponent key={item.id} item={item} collapsed={collapsed} />
147
+ ))}
148
+ </div>
149
+ </div>
150
+ ))}
151
+ </div>
152
+
153
+ {/* Footer slot */}
154
+ {footer && (
155
+ <>
156
+ <Separator />
157
+ <div className={cn('p-3', collapsed && 'flex justify-center')}>
158
+ {footer}
159
+ </div>
160
+ </>
161
+ )}
162
+
163
+ {/* Collapse toggle */}
164
+ {collapsible && (
165
+ <>
166
+ <Separator />
167
+ <div className="p-2 flex justify-end">
168
+ <Button
169
+ variant="ghost"
170
+ size="icon-sm"
171
+ onClick={() => onCollapsedChange?.(!collapsed)}
172
+ aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
173
+ >
174
+ {collapsed ? (
175
+ <ChevronRight className="h-4 w-4" />
176
+ ) : (
177
+ <ChevronLeft className="h-4 w-4" />
178
+ )}
179
+ </Button>
180
+ </div>
181
+ </>
182
+ )}
183
+ </div>
184
+ </TooltipProvider>
185
+ )
186
+ }
187
+ )
188
+ Sidebar.displayName = 'Sidebar'
189
+
190
+ export { Sidebar }
@@ -0,0 +1,57 @@
1
+ import * as React from 'react'
2
+ import * as AccordionPrimitive from '@radix-ui/react-accordion'
3
+ import { ChevronDown } from 'lucide-react'
4
+ import { cn } from '@/lib/utils'
5
+
6
+ const Accordion = AccordionPrimitive.Root
7
+
8
+ const AccordionItem = React.forwardRef<
9
+ React.ElementRef<typeof AccordionPrimitive.Item>,
10
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
11
+ >(({ className, ...props }, ref) => (
12
+ <AccordionPrimitive.Item
13
+ ref={ref}
14
+ className={cn('border-b border-border', className)}
15
+ {...props}
16
+ />
17
+ ))
18
+ AccordionItem.displayName = 'AccordionItem'
19
+
20
+ const AccordionTrigger = React.forwardRef<
21
+ React.ElementRef<typeof AccordionPrimitive.Trigger>,
22
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
23
+ >(({ className, children, ...props }, ref) => (
24
+ <AccordionPrimitive.Header className="flex">
25
+ <AccordionPrimitive.Trigger
26
+ ref={ref}
27
+ className={cn(
28
+ 'flex flex-1 items-center justify-between py-4 text-sm font-medium',
29
+ 'transition-all hover:underline',
30
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 rounded',
31
+ '[&[data-state=open]>svg]:rotate-180',
32
+ className
33
+ )}
34
+ {...props}
35
+ >
36
+ {children}
37
+ <ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" />
38
+ </AccordionPrimitive.Trigger>
39
+ </AccordionPrimitive.Header>
40
+ ))
41
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
42
+
43
+ const AccordionContent = React.forwardRef<
44
+ React.ElementRef<typeof AccordionPrimitive.Content>,
45
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
46
+ >(({ className, children, ...props }, ref) => (
47
+ <AccordionPrimitive.Content
48
+ ref={ref}
49
+ className="overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
50
+ {...props}
51
+ >
52
+ <div className={cn('pb-4 pt-0', className)}>{children}</div>
53
+ </AccordionPrimitive.Content>
54
+ ))
55
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName
56
+
57
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
@@ -0,0 +1,93 @@
1
+ import * as React from 'react'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+ import { AlertCircle, CheckCircle2, Info, TriangleAlert, X } from 'lucide-react'
4
+ import { cn } from '@/lib/utils'
5
+
6
+ const alertVariants = cva(
7
+ 'relative w-full rounded-lg border p-4 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:pl-7',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'border-border bg-background text-foreground',
12
+ info: 'border-info/30 bg-info/10 text-foreground [&>svg]:text-info',
13
+ success: 'border-success/30 bg-success/10 text-foreground [&>svg]:text-success',
14
+ warning: 'border-warning/30 bg-warning/10 text-foreground [&>svg]:text-warning',
15
+ destructive: 'border-destructive/30 bg-destructive/10 text-foreground [&>svg]:text-destructive',
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ variant: 'default',
20
+ },
21
+ }
22
+ )
23
+
24
+ const ALERT_ICONS = {
25
+ default: AlertCircle,
26
+ info: Info,
27
+ success: CheckCircle2,
28
+ warning: TriangleAlert,
29
+ destructive: AlertCircle,
30
+ } as const
31
+
32
+ export interface AlertProps
33
+ extends React.HTMLAttributes<HTMLDivElement>,
34
+ VariantProps<typeof alertVariants> {
35
+ /** Whether the alert can be dismissed */
36
+ dismissible?: boolean
37
+ /** Called when the dismiss button is clicked */
38
+ onDismiss?: () => void
39
+ /** Hide the auto-icon */
40
+ hideIcon?: boolean
41
+ }
42
+
43
+ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
44
+ ({ className, variant = 'default', dismissible = false, onDismiss, hideIcon = false, children, ...props }, ref) => {
45
+ const Icon = ALERT_ICONS[variant ?? 'default']
46
+
47
+ return (
48
+ <div
49
+ ref={ref}
50
+ role="alert"
51
+ className={cn(alertVariants({ variant }), className)}
52
+ {...props}
53
+ >
54
+ {!hideIcon && <Icon className="h-4 w-4" />}
55
+ <div>{children}</div>
56
+ {dismissible && (
57
+ <button
58
+ onClick={onDismiss}
59
+ className="absolute right-3 top-3 rounded p-0.5 opacity-60 hover:opacity-100 transition-opacity"
60
+ aria-label="Dismiss alert"
61
+ >
62
+ <X className="h-4 w-4" />
63
+ </button>
64
+ )}
65
+ </div>
66
+ )
67
+ }
68
+ )
69
+ Alert.displayName = 'Alert'
70
+
71
+ const AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
72
+ ({ className, ...props }, ref) => (
73
+ <h5
74
+ ref={ref}
75
+ className={cn('mb-1 font-medium leading-none tracking-tight', className)}
76
+ {...props}
77
+ />
78
+ )
79
+ )
80
+ AlertTitle.displayName = 'AlertTitle'
81
+
82
+ const AlertDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
83
+ ({ className, ...props }, ref) => (
84
+ <div
85
+ ref={ref}
86
+ className={cn('text-sm [&_p]:leading-relaxed text-muted-foreground', className)}
87
+ {...props}
88
+ />
89
+ )
90
+ )
91
+ AlertDescription.displayName = 'AlertDescription'
92
+
93
+ export { Alert, AlertTitle, AlertDescription }