@alneas/appkit-react 0.1.0 → 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 (659) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +85 -15
  3. package/consumer-ai/SKILL.md +12 -0
  4. package/consumer-ai/api-index.json +103754 -0
  5. package/consumer-ai/package-context.json +409 -0
  6. package/dist/ai/action/ExecutionHistory.cjs.map +1 -1
  7. package/dist/ai/action/ExecutionHistory.d.cts +32 -2
  8. package/dist/ai/action/ExecutionHistory.d.ts +32 -2
  9. package/dist/ai/action/ExecutionHistory.js.map +1 -1
  10. package/dist/ai/action/ScreenActionContext.cjs.map +1 -1
  11. package/dist/ai/action/ScreenActionContext.d.cts +15 -2
  12. package/dist/ai/action/ScreenActionContext.d.ts +15 -2
  13. package/dist/ai/action/ScreenActionContext.js.map +1 -1
  14. package/dist/ai/action/context.cjs.map +1 -1
  15. package/dist/ai/action/context.d.cts +19 -3
  16. package/dist/ai/action/context.d.ts +19 -3
  17. package/dist/ai/action/context.js.map +1 -1
  18. package/dist/ai/action/types.d.cts +35 -3
  19. package/dist/ai/action/types.d.ts +35 -3
  20. package/dist/ai/action/use-execution-session.cjs.map +1 -1
  21. package/dist/ai/action/use-execution-session.d.cts +17 -1
  22. package/dist/ai/action/use-execution-session.d.ts +17 -1
  23. package/dist/ai/action/use-execution-session.js.map +1 -1
  24. package/dist/ai/action/use-screen-action-registry.cjs.map +1 -1
  25. package/dist/ai/action/use-screen-action-registry.d.cts +77 -8
  26. package/dist/ai/action/use-screen-action-registry.d.ts +77 -8
  27. package/dist/ai/action/use-screen-action-registry.js.map +1 -1
  28. package/dist/ai/action/use-screen-action.cjs.map +1 -1
  29. package/dist/ai/action/use-screen-action.d.cts +23 -6
  30. package/dist/ai/action/use-screen-action.d.ts +23 -6
  31. package/dist/ai/action/use-screen-action.js.map +1 -1
  32. package/dist/ai/action/use-screen-context.cjs.map +1 -1
  33. package/dist/ai/action/use-screen-context.d.cts +42 -5
  34. package/dist/ai/action/use-screen-context.d.ts +42 -5
  35. package/dist/ai/action/use-screen-context.js.map +1 -1
  36. package/dist/ai/ai-chat/transport.cjs.map +1 -1
  37. package/dist/ai/ai-chat/transport.d.cts +35 -8
  38. package/dist/ai/ai-chat/transport.d.ts +35 -8
  39. package/dist/ai/ai-chat/transport.js.map +1 -1
  40. package/dist/ai/generative-ui/GenerativeUIRenderer.cjs.map +1 -1
  41. package/dist/ai/generative-ui/GenerativeUIRenderer.d.cts +21 -3
  42. package/dist/ai/generative-ui/GenerativeUIRenderer.d.ts +21 -3
  43. package/dist/ai/generative-ui/GenerativeUIRenderer.js.map +1 -1
  44. package/dist/ai/generative-ui/error-boundary.cjs.map +1 -1
  45. package/dist/ai/generative-ui/error-boundary.d.cts +98 -2
  46. package/dist/ai/generative-ui/error-boundary.d.ts +98 -2
  47. package/dist/ai/generative-ui/error-boundary.js.map +1 -1
  48. package/dist/ai/generative-ui/registry.cjs.map +1 -1
  49. package/dist/ai/generative-ui/registry.d.cts +96 -7
  50. package/dist/ai/generative-ui/registry.d.ts +96 -7
  51. package/dist/ai/generative-ui/registry.js.map +1 -1
  52. package/dist/ai/proposal/ProposalFieldReview.cjs.map +1 -1
  53. package/dist/ai/proposal/ProposalFieldReview.d.cts +170 -8
  54. package/dist/ai/proposal/ProposalFieldReview.d.ts +170 -8
  55. package/dist/ai/proposal/ProposalFieldReview.js.map +1 -1
  56. package/dist/ai/proposal/types.d.cts +97 -26
  57. package/dist/ai/proposal/types.d.ts +97 -26
  58. package/dist/ai/proposal/use-proposal-batch-review.cjs.map +1 -1
  59. package/dist/ai/proposal/use-proposal-batch-review.d.cts +133 -7
  60. package/dist/ai/proposal/use-proposal-batch-review.d.ts +133 -7
  61. package/dist/ai/proposal/use-proposal-batch-review.js.map +1 -1
  62. package/dist/ai/proposal/use-proposal-review.cjs.map +1 -1
  63. package/dist/ai/proposal/use-proposal-review.d.cts +47 -5
  64. package/dist/ai/proposal/use-proposal-review.d.ts +47 -5
  65. package/dist/ai/proposal/use-proposal-review.js.map +1 -1
  66. package/dist/avatar.svg +1 -0
  67. package/dist/consumer-ai/SKILL.md +6 -0
  68. package/dist/consumer-ai/api-index.json +103754 -0
  69. package/dist/consumer-ai/package-context.json +5 -3
  70. package/dist/mockServiceWorker.js +361 -0
  71. package/dist/styles.css +1 -1
  72. package/dist/tools/components/auth/AuthForms.cjs.map +1 -1
  73. package/dist/tools/components/auth/AuthForms.d.cts +131 -81
  74. package/dist/tools/components/auth/AuthForms.d.ts +131 -81
  75. package/dist/tools/components/auth/AuthForms.js.map +1 -1
  76. package/dist/tools/components/auth/AuthGuard.cjs.map +1 -1
  77. package/dist/tools/components/auth/AuthGuard.d.cts +31 -4
  78. package/dist/tools/components/auth/AuthGuard.d.ts +31 -4
  79. package/dist/tools/components/auth/AuthGuard.js.map +1 -1
  80. package/dist/tools/components/auth/AuthProvider.cjs.map +1 -1
  81. package/dist/tools/components/auth/AuthProvider.d.cts +39 -42
  82. package/dist/tools/components/auth/AuthProvider.d.ts +39 -42
  83. package/dist/tools/components/auth/AuthProvider.js.map +1 -1
  84. package/dist/tools/components/auth/ProtectedRoute.cjs.map +1 -1
  85. package/dist/tools/components/auth/ProtectedRoute.d.cts +75 -60
  86. package/dist/tools/components/auth/ProtectedRoute.d.ts +75 -60
  87. package/dist/tools/components/auth/ProtectedRoute.js.map +1 -1
  88. package/dist/tools/components/auth/SignInButton.cjs.map +1 -1
  89. package/dist/tools/components/auth/SignInButton.d.cts +26 -18
  90. package/dist/tools/components/auth/SignInButton.d.ts +26 -18
  91. package/dist/tools/components/auth/SignInButton.js.map +1 -1
  92. package/dist/tools/components/auth/UserProfileProvider.cjs.map +1 -1
  93. package/dist/tools/components/auth/UserProfileProvider.d.cts +48 -20
  94. package/dist/tools/components/auth/UserProfileProvider.d.ts +48 -20
  95. package/dist/tools/components/auth/UserProfileProvider.js.map +1 -1
  96. package/dist/tools/components/auth/adapters/better-auth-adapter.cjs.map +1 -1
  97. package/dist/tools/components/auth/adapters/better-auth-adapter.d.cts +371 -51
  98. package/dist/tools/components/auth/adapters/better-auth-adapter.d.ts +371 -51
  99. package/dist/tools/components/auth/adapters/better-auth-adapter.js.map +1 -1
  100. package/dist/tools/components/auth/adapters/mock-adapter.cjs.map +1 -1
  101. package/dist/tools/components/auth/adapters/mock-adapter.d.cts +149 -28
  102. package/dist/tools/components/auth/adapters/mock-adapter.d.ts +149 -28
  103. package/dist/tools/components/auth/adapters/mock-adapter.js.map +1 -1
  104. package/dist/tools/components/auth/auth-session.cjs.map +1 -1
  105. package/dist/tools/components/auth/auth-session.d.cts +147 -1
  106. package/dist/tools/components/auth/auth-session.d.ts +147 -1
  107. package/dist/tools/components/auth/auth-session.js.map +1 -1
  108. package/dist/tools/components/auth/session-cache.cjs.map +1 -1
  109. package/dist/tools/components/auth/session-cache.d.cts +88 -24
  110. package/dist/tools/components/auth/session-cache.d.ts +88 -24
  111. package/dist/tools/components/auth/session-cache.js.map +1 -1
  112. package/dist/tools/components/auth/types.cjs.map +1 -1
  113. package/dist/tools/components/auth/types.d.cts +329 -106
  114. package/dist/tools/components/auth/types.d.ts +329 -106
  115. package/dist/tools/components/auth/types.js.map +1 -1
  116. package/dist/tools/components/auth/useAuth.cjs.map +1 -1
  117. package/dist/tools/components/auth/useAuth.d.cts +110 -17
  118. package/dist/tools/components/auth/useAuth.d.ts +110 -17
  119. package/dist/tools/components/auth/useAuth.js.map +1 -1
  120. package/dist/tools/components/auth/useAuthGuard.cjs.map +1 -1
  121. package/dist/tools/components/auth/useAuthGuard.d.cts +49 -38
  122. package/dist/tools/components/auth/useAuthGuard.d.ts +49 -38
  123. package/dist/tools/components/auth/useAuthGuard.js.map +1 -1
  124. package/dist/tools/components/auth/useRoleCheck.cjs.map +1 -1
  125. package/dist/tools/components/auth/useRoleCheck.d.cts +48 -1
  126. package/dist/tools/components/auth/useRoleCheck.d.ts +48 -1
  127. package/dist/tools/components/auth/useRoleCheck.js.map +1 -1
  128. package/dist/tools/components/auth/useUserProfile.cjs.map +1 -1
  129. package/dist/tools/components/auth/useUserProfile.d.cts +66 -1
  130. package/dist/tools/components/auth/useUserProfile.d.ts +66 -1
  131. package/dist/tools/components/auth/useUserProfile.js.map +1 -1
  132. package/dist/tools/components/barcode/BarcodeGenerator.cjs.map +1 -1
  133. package/dist/tools/components/barcode/BarcodeGenerator.d.cts +32 -18
  134. package/dist/tools/components/barcode/BarcodeGenerator.d.ts +32 -18
  135. package/dist/tools/components/barcode/BarcodeGenerator.js.map +1 -1
  136. package/dist/tools/components/barcode/QRCodeGenerator.cjs +1 -1
  137. package/dist/tools/components/barcode/QRCodeGenerator.cjs.map +1 -1
  138. package/dist/tools/components/barcode/QRCodeGenerator.d.cts +20 -13
  139. package/dist/tools/components/barcode/QRCodeGenerator.d.ts +20 -13
  140. package/dist/tools/components/barcode/QRCodeGenerator.js +1 -1
  141. package/dist/tools/components/barcode/QRCodeGenerator.js.map +1 -1
  142. package/dist/tools/components/barcode/QRCodeScanner.cjs.map +1 -1
  143. package/dist/tools/components/barcode/QRCodeScanner.d.cts +32 -1
  144. package/dist/tools/components/barcode/QRCodeScanner.d.ts +32 -1
  145. package/dist/tools/components/barcode/QRCodeScanner.js.map +1 -1
  146. package/dist/tools/components/calendar/ResourceCalendar.cjs.map +1 -1
  147. package/dist/tools/components/calendar/ResourceCalendar.d.cts +17 -42
  148. package/dist/tools/components/calendar/ResourceCalendar.d.ts +17 -42
  149. package/dist/tools/components/calendar/ResourceCalendar.js.map +1 -1
  150. package/dist/tools/components/calendar/views/ResourceView.cjs +1 -1
  151. package/dist/tools/components/calendar/views/ResourceView.cjs.map +1 -1
  152. package/dist/tools/components/calendar/views/ResourceView.js +2 -2
  153. package/dist/tools/components/calendar/views/ResourceView.js.map +1 -1
  154. package/dist/tools/components/chart/ComposedChart.cjs.map +1 -1
  155. package/dist/tools/components/chart/ComposedChart.d.cts +54 -1
  156. package/dist/tools/components/chart/ComposedChart.d.ts +54 -1
  157. package/dist/tools/components/chart/ComposedChart.js.map +1 -1
  158. package/dist/tools/components/chart/SimpleAreaChart.cjs.map +1 -1
  159. package/dist/tools/components/chart/SimpleAreaChart.d.cts +41 -1
  160. package/dist/tools/components/chart/SimpleAreaChart.d.ts +41 -1
  161. package/dist/tools/components/chart/SimpleAreaChart.js.map +1 -1
  162. package/dist/tools/components/chart/SimpleBarChart.cjs.map +1 -1
  163. package/dist/tools/components/chart/SimpleBarChart.d.cts +34 -24
  164. package/dist/tools/components/chart/SimpleBarChart.d.ts +34 -24
  165. package/dist/tools/components/chart/SimpleBarChart.js.map +1 -1
  166. package/dist/tools/components/chart/SimpleLineChart.cjs.map +1 -1
  167. package/dist/tools/components/chart/SimpleLineChart.d.cts +31 -28
  168. package/dist/tools/components/chart/SimpleLineChart.d.ts +31 -28
  169. package/dist/tools/components/chart/SimpleLineChart.js.map +1 -1
  170. package/dist/tools/components/chart/SimplePieChart.cjs.map +1 -1
  171. package/dist/tools/components/chart/SimplePieChart.d.cts +28 -22
  172. package/dist/tools/components/chart/SimplePieChart.d.ts +28 -22
  173. package/dist/tools/components/chart/SimplePieChart.js.map +1 -1
  174. package/dist/tools/components/chart/SimpleRadarChart.cjs.map +1 -1
  175. package/dist/tools/components/chart/SimpleRadarChart.d.cts +38 -1
  176. package/dist/tools/components/chart/SimpleRadarChart.d.ts +38 -1
  177. package/dist/tools/components/chart/SimpleRadarChart.js.map +1 -1
  178. package/dist/tools/components/chart/SimpleScatterChart.cjs.map +1 -1
  179. package/dist/tools/components/chart/SimpleScatterChart.d.cts +44 -1
  180. package/dist/tools/components/chart/SimpleScatterChart.d.ts +44 -1
  181. package/dist/tools/components/chart/SimpleScatterChart.js.map +1 -1
  182. package/dist/tools/components/chart/StackedBarChart.cjs.map +1 -1
  183. package/dist/tools/components/chart/StackedBarChart.d.cts +38 -1
  184. package/dist/tools/components/chart/StackedBarChart.d.ts +38 -1
  185. package/dist/tools/components/chart/StackedBarChart.js.map +1 -1
  186. package/dist/tools/components/data-table/data-table.cjs +1 -1
  187. package/dist/tools/components/data-table/data-table.cjs.map +1 -1
  188. package/dist/tools/components/data-table/data-table.js +286 -263
  189. package/dist/tools/components/data-table/data-table.js.map +1 -1
  190. package/dist/tools/components/data-table/table-utils.cjs.map +1 -1
  191. package/dist/tools/components/data-table/table-utils.d.cts +45 -35
  192. package/dist/tools/components/data-table/table-utils.d.ts +45 -35
  193. package/dist/tools/components/data-table/table-utils.js.map +1 -1
  194. package/dist/tools/components/editable-table/editable-table.cjs +1 -1
  195. package/dist/tools/components/editable-table/editable-table.cjs.map +1 -1
  196. package/dist/tools/components/editable-table/editable-table.js +15 -2
  197. package/dist/tools/components/editable-table/editable-table.js.map +1 -1
  198. package/dist/tools/components/error/ErrorDialog.cjs +1 -1
  199. package/dist/tools/components/error/ErrorDialog.cjs.map +1 -1
  200. package/dist/tools/components/error/ErrorDialog.js +1 -1
  201. package/dist/tools/components/error/ErrorDialog.js.map +1 -1
  202. package/dist/tools/components/error/ErrorInline.cjs +1 -1
  203. package/dist/tools/components/error/ErrorInline.cjs.map +1 -1
  204. package/dist/tools/components/error/ErrorInline.js +1 -1
  205. package/dist/tools/components/error/ErrorInline.js.map +1 -1
  206. package/dist/tools/components/error/ErrorNotification.cjs +1 -1
  207. package/dist/tools/components/error/ErrorNotification.cjs.map +1 -1
  208. package/dist/tools/components/error/ErrorNotification.js +10 -10
  209. package/dist/tools/components/error/ErrorNotification.js.map +1 -1
  210. package/dist/tools/components/file-browser/FilePreview.cjs +1 -1
  211. package/dist/tools/components/file-browser/FilePreview.cjs.map +1 -1
  212. package/dist/tools/components/file-browser/FilePreview.js +28 -26
  213. package/dist/tools/components/file-browser/FilePreview.js.map +1 -1
  214. package/dist/tools/components/filter/filter.cjs.map +1 -1
  215. package/dist/tools/components/filter/filter.d.cts +23 -34
  216. package/dist/tools/components/filter/filter.d.ts +23 -34
  217. package/dist/tools/components/filter/filter.js.map +1 -1
  218. package/dist/tools/components/form/EnhancedDetailPage.cjs.map +1 -1
  219. package/dist/tools/components/form/EnhancedDetailPage.d.cts +47 -42
  220. package/dist/tools/components/form/EnhancedDetailPage.d.ts +47 -42
  221. package/dist/tools/components/form/EnhancedDetailPage.js.map +1 -1
  222. package/dist/tools/components/form/form-grid.cjs.map +1 -1
  223. package/dist/tools/components/form/form-grid.d.cts +44 -22
  224. package/dist/tools/components/form/form-grid.d.ts +44 -22
  225. package/dist/tools/components/form/form-grid.js.map +1 -1
  226. package/dist/tools/components/gantt/GanttChart.cjs +1 -1
  227. package/dist/tools/components/gantt/GanttChart.cjs.map +1 -1
  228. package/dist/tools/components/gantt/GanttChart.d.cts +20 -1
  229. package/dist/tools/components/gantt/GanttChart.d.ts +20 -1
  230. package/dist/tools/components/gantt/GanttChart.js +3 -0
  231. package/dist/tools/components/gantt/GanttChart.js.map +1 -1
  232. package/dist/tools/components/gantt/components/GanttTaskBar.cjs +1 -1
  233. package/dist/tools/components/gantt/components/GanttTaskBar.cjs.map +1 -1
  234. package/dist/tools/components/gantt/components/GanttTaskBar.js +2 -1
  235. package/dist/tools/components/gantt/components/GanttTaskBar.js.map +1 -1
  236. package/dist/tools/components/header/header.cjs +1 -1
  237. package/dist/tools/components/header/header.cjs.map +1 -1
  238. package/dist/tools/components/header/header.d.cts +103 -40
  239. package/dist/tools/components/header/header.d.ts +103 -40
  240. package/dist/tools/components/header/header.js +1 -1
  241. package/dist/tools/components/header/header.js.map +1 -1
  242. package/dist/tools/components/i18n/LanguageSwitcher.cjs.map +1 -1
  243. package/dist/tools/components/i18n/LanguageSwitcher.d.cts +18 -14
  244. package/dist/tools/components/i18n/LanguageSwitcher.d.ts +18 -14
  245. package/dist/tools/components/i18n/LanguageSwitcher.js.map +1 -1
  246. package/dist/tools/components/kanban/KanbanBoard.cjs +1 -1
  247. package/dist/tools/components/kanban/KanbanBoard.cjs.map +1 -1
  248. package/dist/tools/components/kanban/KanbanBoard.d.cts +16 -34
  249. package/dist/tools/components/kanban/KanbanBoard.d.ts +16 -34
  250. package/dist/tools/components/kanban/KanbanBoard.js +3 -0
  251. package/dist/tools/components/kanban/KanbanBoard.js.map +1 -1
  252. package/dist/tools/components/kanban/KanbanColumn.cjs +1 -1
  253. package/dist/tools/components/kanban/KanbanColumn.cjs.map +1 -1
  254. package/dist/tools/components/kanban/KanbanColumn.js +1 -1
  255. package/dist/tools/components/kanban/KanbanColumn.js.map +1 -1
  256. package/dist/tools/components/kanban/kanban-compound.cjs +1 -1
  257. package/dist/tools/components/kanban/kanban-compound.cjs.map +1 -1
  258. package/dist/tools/components/kanban/kanban-compound.js +4 -1
  259. package/dist/tools/components/kanban/kanban-compound.js.map +1 -1
  260. package/dist/tools/components/kanban/kanban-primitives.cjs +1 -1
  261. package/dist/tools/components/kanban/kanban-primitives.cjs.map +1 -1
  262. package/dist/tools/components/kanban/kanban-primitives.js +0 -1
  263. package/dist/tools/components/kanban/kanban-primitives.js.map +1 -1
  264. package/dist/tools/components/priority-queue/PriorityCard.cjs +1 -1
  265. package/dist/tools/components/priority-queue/PriorityCard.cjs.map +1 -1
  266. package/dist/tools/components/priority-queue/PriorityCard.js +3 -1
  267. package/dist/tools/components/priority-queue/PriorityCard.js.map +1 -1
  268. package/dist/tools/components/sidebar/SmartSidebar.cjs.map +1 -1
  269. package/dist/tools/components/sidebar/SmartSidebar.d.cts +41 -43
  270. package/dist/tools/components/sidebar/SmartSidebar.d.ts +41 -43
  271. package/dist/tools/components/sidebar/SmartSidebar.js.map +1 -1
  272. package/dist/tools/components/splash/SplashScreen.cjs.map +1 -1
  273. package/dist/tools/components/splash/SplashScreen.d.cts +43 -68
  274. package/dist/tools/components/splash/SplashScreen.d.ts +43 -68
  275. package/dist/tools/components/splash/SplashScreen.js.map +1 -1
  276. package/dist/tools/components/workflow/WorkflowStatusPanel.cjs +1 -1
  277. package/dist/tools/components/workflow/WorkflowStatusPanel.cjs.map +1 -1
  278. package/dist/tools/components/workflow/WorkflowStatusPanel.js +2 -2
  279. package/dist/tools/components/workflow/WorkflowStatusPanel.js.map +1 -1
  280. package/dist/tools/lib/data-access/data-access-context.cjs.map +1 -1
  281. package/dist/tools/lib/data-access/data-access-context.d.cts +15 -6
  282. package/dist/tools/lib/data-access/data-access-context.d.ts +15 -6
  283. package/dist/tools/lib/data-access/data-access-context.js.map +1 -1
  284. package/dist/tools/lib/data-access/react-query-provider.cjs.map +1 -1
  285. package/dist/tools/lib/data-access/react-query-provider.d.cts +19 -2
  286. package/dist/tools/lib/data-access/react-query-provider.d.ts +19 -2
  287. package/dist/tools/lib/data-access/react-query-provider.js.map +1 -1
  288. package/dist/tools/lib/data-access/react-query.cjs.map +1 -1
  289. package/dist/tools/lib/data-access/react-query.d.cts +365 -90
  290. package/dist/tools/lib/data-access/react-query.d.ts +365 -90
  291. package/dist/tools/lib/data-access/react-query.js.map +1 -1
  292. package/dist/tools/lib/error/AppError.cjs.map +1 -1
  293. package/dist/tools/lib/error/AppError.d.cts +157 -63
  294. package/dist/tools/lib/error/AppError.d.ts +157 -63
  295. package/dist/tools/lib/error/AppError.js.map +1 -1
  296. package/dist/tools/lib/hooks/useAsyncWithTimeout.cjs.map +1 -1
  297. package/dist/tools/lib/hooks/useAsyncWithTimeout.d.cts +79 -26
  298. package/dist/tools/lib/hooks/useAsyncWithTimeout.d.ts +79 -26
  299. package/dist/tools/lib/hooks/useAsyncWithTimeout.js.map +1 -1
  300. package/dist/tools/lib/hooks/useError.cjs.map +1 -1
  301. package/dist/tools/lib/hooks/useError.d.cts +51 -16
  302. package/dist/tools/lib/hooks/useError.d.ts +51 -16
  303. package/dist/tools/lib/hooks/useError.js.map +1 -1
  304. package/dist/tools/lib/schema/ajv.cjs +1 -1
  305. package/dist/tools/lib/schema/ajv.cjs.map +1 -1
  306. package/dist/tools/lib/schema/ajv.d.cts +19 -8
  307. package/dist/tools/lib/schema/ajv.d.ts +19 -8
  308. package/dist/tools/lib/schema/ajv.js +2 -1
  309. package/dist/tools/lib/schema/ajv.js.map +1 -1
  310. package/dist/tools/lib/state/error-store.cjs.map +1 -1
  311. package/dist/tools/lib/state/error-store.d.cts +61 -10
  312. package/dist/tools/lib/state/error-store.d.ts +61 -10
  313. package/dist/tools/lib/state/error-store.js.map +1 -1
  314. package/dist/tools/lib/state/store-factory.cjs.map +1 -1
  315. package/dist/tools/lib/state/store-factory.d.cts +25 -4
  316. package/dist/tools/lib/state/store-factory.d.ts +25 -4
  317. package/dist/tools/lib/state/store-factory.js.map +1 -1
  318. package/dist/tools/lib/state/ui-store.cjs.map +1 -1
  319. package/dist/tools/lib/state/ui-store.d.cts +39 -0
  320. package/dist/tools/lib/state/ui-store.d.ts +39 -0
  321. package/dist/tools/lib/state/ui-store.js.map +1 -1
  322. package/dist/ui/components/theme/theme-context.cjs.map +1 -1
  323. package/dist/ui/components/theme/theme-context.d.cts +171 -1
  324. package/dist/ui/components/theme/theme-context.d.ts +171 -1
  325. package/dist/ui/components/theme/theme-context.js.map +1 -1
  326. package/dist/ui/components/theme/theme-provider.cjs.map +1 -1
  327. package/dist/ui/components/theme/theme-provider.d.cts +31 -19
  328. package/dist/ui/components/theme/theme-provider.d.ts +31 -19
  329. package/dist/ui/components/theme/theme-provider.js.map +1 -1
  330. package/dist/ui/components/theme/theme-script.cjs.map +1 -1
  331. package/dist/ui/components/theme/theme-script.d.cts +16 -1
  332. package/dist/ui/components/theme/theme-script.d.ts +16 -1
  333. package/dist/ui/components/theme/theme-script.js.map +1 -1
  334. package/dist/ui/components/theme/theme-switcher.cjs +1 -1
  335. package/dist/ui/components/theme/theme-switcher.cjs.map +1 -1
  336. package/dist/ui/components/theme/theme-switcher.d.cts +82 -13
  337. package/dist/ui/components/theme/theme-switcher.d.ts +82 -13
  338. package/dist/ui/components/theme/theme-switcher.js +8 -0
  339. package/dist/ui/components/theme/theme-switcher.js.map +1 -1
  340. package/dist/ui/components/ui/accordion.cjs.map +1 -1
  341. package/dist/ui/components/ui/accordion.d.cts +60 -0
  342. package/dist/ui/components/ui/accordion.d.ts +60 -0
  343. package/dist/ui/components/ui/accordion.js.map +1 -1
  344. package/dist/ui/components/ui/adjustable-pane.cjs.map +1 -1
  345. package/dist/ui/components/ui/adjustable-pane.d.cts +44 -26
  346. package/dist/ui/components/ui/adjustable-pane.d.ts +44 -26
  347. package/dist/ui/components/ui/adjustable-pane.js.map +1 -1
  348. package/dist/ui/components/ui/alert-dialog.cjs.map +1 -1
  349. package/dist/ui/components/ui/alert-dialog.d.cts +179 -2
  350. package/dist/ui/components/ui/alert-dialog.d.ts +179 -2
  351. package/dist/ui/components/ui/alert-dialog.js.map +1 -1
  352. package/dist/ui/components/ui/alert.cjs.map +1 -1
  353. package/dist/ui/components/ui/alert.d.cts +52 -4
  354. package/dist/ui/components/ui/alert.d.ts +52 -4
  355. package/dist/ui/components/ui/alert.js.map +1 -1
  356. package/dist/ui/components/ui/aspect-ratio.cjs.map +1 -1
  357. package/dist/ui/components/ui/aspect-ratio.d.cts +16 -1
  358. package/dist/ui/components/ui/aspect-ratio.d.ts +16 -1
  359. package/dist/ui/components/ui/aspect-ratio.js.map +1 -1
  360. package/dist/ui/components/ui/avatar.cjs.map +1 -1
  361. package/dist/ui/components/ui/avatar.d.cts +87 -3
  362. package/dist/ui/components/ui/avatar.d.ts +87 -3
  363. package/dist/ui/components/ui/avatar.js.map +1 -1
  364. package/dist/ui/components/ui/badge-components.cjs.map +1 -1
  365. package/dist/ui/components/ui/badge-components.d.cts +13 -1
  366. package/dist/ui/components/ui/badge-components.d.ts +13 -1
  367. package/dist/ui/components/ui/badge-components.js.map +1 -1
  368. package/dist/ui/components/ui/badge-variants.cjs.map +1 -1
  369. package/dist/ui/components/ui/badge-variants.d.cts +15 -0
  370. package/dist/ui/components/ui/badge-variants.d.ts +15 -0
  371. package/dist/ui/components/ui/badge-variants.js.map +1 -1
  372. package/dist/ui/components/ui/breadcrumb.cjs.map +1 -1
  373. package/dist/ui/components/ui/breadcrumb.d.cts +91 -7
  374. package/dist/ui/components/ui/breadcrumb.d.ts +91 -7
  375. package/dist/ui/components/ui/breadcrumb.js.map +1 -1
  376. package/dist/ui/components/ui/button-components.cjs.map +1 -1
  377. package/dist/ui/components/ui/button-components.d.cts +18 -6
  378. package/dist/ui/components/ui/button-components.d.ts +18 -6
  379. package/dist/ui/components/ui/button-components.js.map +1 -1
  380. package/dist/ui/components/ui/button-group-components.cjs.map +1 -1
  381. package/dist/ui/components/ui/button-group-components.d.cts +39 -3
  382. package/dist/ui/components/ui/button-group-components.d.ts +39 -3
  383. package/dist/ui/components/ui/button-group-components.js.map +1 -1
  384. package/dist/ui/components/ui/button-group-variants.cjs.map +1 -1
  385. package/dist/ui/components/ui/button-group-variants.d.cts +15 -0
  386. package/dist/ui/components/ui/button-group-variants.d.ts +15 -0
  387. package/dist/ui/components/ui/button-group-variants.js.map +1 -1
  388. package/dist/ui/components/ui/button-variants.cjs.map +1 -1
  389. package/dist/ui/components/ui/button-variants.d.cts +13 -2
  390. package/dist/ui/components/ui/button-variants.d.ts +13 -2
  391. package/dist/ui/components/ui/button-variants.js.map +1 -1
  392. package/dist/ui/components/ui/card.cjs.map +1 -1
  393. package/dist/ui/components/ui/card.d.cts +106 -2
  394. package/dist/ui/components/ui/card.d.ts +106 -2
  395. package/dist/ui/components/ui/card.js.map +1 -1
  396. package/dist/ui/components/ui/checkbox-group.cjs.map +1 -1
  397. package/dist/ui/components/ui/checkbox-group.d.cts +13 -1
  398. package/dist/ui/components/ui/checkbox-group.d.ts +13 -1
  399. package/dist/ui/components/ui/checkbox-group.js.map +1 -1
  400. package/dist/ui/components/ui/checkbox.cjs.map +1 -1
  401. package/dist/ui/components/ui/checkbox.d.cts +17 -6
  402. package/dist/ui/components/ui/checkbox.d.ts +17 -6
  403. package/dist/ui/components/ui/checkbox.js.map +1 -1
  404. package/dist/ui/components/ui/collapsible.cjs.map +1 -1
  405. package/dist/ui/components/ui/collapsible.d.cts +39 -3
  406. package/dist/ui/components/ui/collapsible.d.ts +39 -3
  407. package/dist/ui/components/ui/collapsible.js.map +1 -1
  408. package/dist/ui/components/ui/combobox-components.cjs.map +1 -1
  409. package/dist/ui/components/ui/combobox-components.d.cts +209 -14
  410. package/dist/ui/components/ui/combobox-components.d.ts +209 -14
  411. package/dist/ui/components/ui/combobox-components.js.map +1 -1
  412. package/dist/ui/components/ui/combobox-hooks.cjs.map +1 -1
  413. package/dist/ui/components/ui/combobox-hooks.d.cts +13 -1
  414. package/dist/ui/components/ui/combobox-hooks.d.ts +13 -1
  415. package/dist/ui/components/ui/combobox-hooks.js.map +1 -1
  416. package/dist/ui/components/ui/command.cjs.map +1 -1
  417. package/dist/ui/components/ui/command.d.cts +132 -9
  418. package/dist/ui/components/ui/command.d.ts +132 -9
  419. package/dist/ui/components/ui/command.js.map +1 -1
  420. package/dist/ui/components/ui/context-menu.cjs.map +1 -1
  421. package/dist/ui/components/ui/context-menu.d.cts +233 -2
  422. package/dist/ui/components/ui/context-menu.d.ts +233 -2
  423. package/dist/ui/components/ui/context-menu.js.map +1 -1
  424. package/dist/ui/components/ui/dialog.cjs.map +1 -1
  425. package/dist/ui/components/ui/dialog.d.cts +157 -5
  426. package/dist/ui/components/ui/dialog.d.ts +157 -5
  427. package/dist/ui/components/ui/dialog.js.map +1 -1
  428. package/dist/ui/components/ui/drawer.cjs.map +1 -1
  429. package/dist/ui/components/ui/drawer.d.cts +130 -10
  430. package/dist/ui/components/ui/drawer.d.ts +130 -10
  431. package/dist/ui/components/ui/drawer.js.map +1 -1
  432. package/dist/ui/components/ui/dropdown-menu.cjs.map +1 -1
  433. package/dist/ui/components/ui/dropdown-menu.d.cts +225 -6
  434. package/dist/ui/components/ui/dropdown-menu.d.ts +225 -6
  435. package/dist/ui/components/ui/dropdown-menu.js.map +1 -1
  436. package/dist/ui/components/ui/empty.cjs.map +1 -1
  437. package/dist/ui/components/ui/empty.d.cts +78 -6
  438. package/dist/ui/components/ui/empty.d.ts +78 -6
  439. package/dist/ui/components/ui/empty.js.map +1 -1
  440. package/dist/ui/components/ui/field.cjs.map +1 -1
  441. package/dist/ui/components/ui/field.d.cts +180 -6
  442. package/dist/ui/components/ui/field.d.ts +180 -6
  443. package/dist/ui/components/ui/field.js.map +1 -1
  444. package/dist/ui/components/ui/file-icon.cjs.map +1 -1
  445. package/dist/ui/components/ui/file-icon.d.cts +32 -4
  446. package/dist/ui/components/ui/file-icon.d.ts +32 -4
  447. package/dist/ui/components/ui/file-icon.js.map +1 -1
  448. package/dist/ui/components/ui/hover-card.cjs.map +1 -1
  449. package/dist/ui/components/ui/hover-card.d.cts +39 -3
  450. package/dist/ui/components/ui/hover-card.d.ts +39 -3
  451. package/dist/ui/components/ui/hover-card.js.map +1 -1
  452. package/dist/ui/components/ui/input-group.cjs.map +1 -1
  453. package/dist/ui/components/ui/input-group.d.cts +84 -6
  454. package/dist/ui/components/ui/input-group.d.ts +84 -6
  455. package/dist/ui/components/ui/input-group.js.map +1 -1
  456. package/dist/ui/components/ui/input-otp.cjs.map +1 -1
  457. package/dist/ui/components/ui/input-otp.d.cts +58 -4
  458. package/dist/ui/components/ui/input-otp.d.ts +58 -4
  459. package/dist/ui/components/ui/input-otp.js.map +1 -1
  460. package/dist/ui/components/ui/input.cjs.map +1 -1
  461. package/dist/ui/components/ui/input.d.cts +18 -10
  462. package/dist/ui/components/ui/input.d.ts +18 -10
  463. package/dist/ui/components/ui/input.js.map +1 -1
  464. package/dist/ui/components/ui/item.cjs.map +1 -1
  465. package/dist/ui/components/ui/item.d.cts +130 -10
  466. package/dist/ui/components/ui/item.d.ts +130 -10
  467. package/dist/ui/components/ui/item.js.map +1 -1
  468. package/dist/ui/components/ui/kbd.cjs.map +1 -1
  469. package/dist/ui/components/ui/kbd.d.cts +26 -2
  470. package/dist/ui/components/ui/kbd.d.ts +26 -2
  471. package/dist/ui/components/ui/kbd.js.map +1 -1
  472. package/dist/ui/components/ui/label.cjs.map +1 -1
  473. package/dist/ui/components/ui/label.d.cts +15 -0
  474. package/dist/ui/components/ui/label.d.ts +15 -0
  475. package/dist/ui/components/ui/label.js.map +1 -1
  476. package/dist/ui/components/ui/layout.cjs +1 -1
  477. package/dist/ui/components/ui/layout.cjs.map +1 -1
  478. package/dist/ui/components/ui/layout.d.cts +45 -11
  479. package/dist/ui/components/ui/layout.d.ts +45 -11
  480. package/dist/ui/components/ui/layout.js +22 -20
  481. package/dist/ui/components/ui/layout.js.map +1 -1
  482. package/dist/ui/components/ui/menubar.cjs.map +1 -1
  483. package/dist/ui/components/ui/menubar.d.cts +220 -16
  484. package/dist/ui/components/ui/menubar.d.ts +220 -16
  485. package/dist/ui/components/ui/menubar.js.map +1 -1
  486. package/dist/ui/components/ui/meter.cjs.map +1 -1
  487. package/dist/ui/components/ui/meter.d.cts +52 -4
  488. package/dist/ui/components/ui/meter.d.ts +52 -4
  489. package/dist/ui/components/ui/meter.js.map +1 -1
  490. package/dist/ui/components/ui/mobile-form-variants.cjs.map +1 -1
  491. package/dist/ui/components/ui/mobile-form-variants.d.cts +30 -0
  492. package/dist/ui/components/ui/mobile-form-variants.d.ts +30 -0
  493. package/dist/ui/components/ui/mobile-form-variants.js.map +1 -1
  494. package/dist/ui/components/ui/mobile-form.cjs.map +1 -1
  495. package/dist/ui/components/ui/mobile-form.d.cts +186 -9
  496. package/dist/ui/components/ui/mobile-form.d.ts +186 -9
  497. package/dist/ui/components/ui/mobile-form.js.map +1 -1
  498. package/dist/ui/components/ui/navigation-menu-components.cjs.map +1 -1
  499. package/dist/ui/components/ui/navigation-menu-components.d.cts +104 -8
  500. package/dist/ui/components/ui/navigation-menu-components.d.ts +104 -8
  501. package/dist/ui/components/ui/navigation-menu-components.js.map +1 -1
  502. package/dist/ui/components/ui/navigation-menu-variants.cjs.map +1 -1
  503. package/dist/ui/components/ui/navigation-menu-variants.d.cts +15 -0
  504. package/dist/ui/components/ui/navigation-menu-variants.d.ts +15 -0
  505. package/dist/ui/components/ui/navigation-menu-variants.js.map +1 -1
  506. package/dist/ui/components/ui/number-field.cjs.map +1 -1
  507. package/dist/ui/components/ui/number-field.d.cts +78 -6
  508. package/dist/ui/components/ui/number-field.d.ts +78 -6
  509. package/dist/ui/components/ui/number-field.js.map +1 -1
  510. package/dist/ui/components/ui/pagination.cjs.map +1 -1
  511. package/dist/ui/components/ui/pagination.d.cts +99 -7
  512. package/dist/ui/components/ui/pagination.d.ts +99 -7
  513. package/dist/ui/components/ui/pagination.js.map +1 -1
  514. package/dist/ui/components/ui/password-input.cjs.map +1 -1
  515. package/dist/ui/components/ui/password-input.d.cts +10 -7
  516. package/dist/ui/components/ui/password-input.d.ts +10 -7
  517. package/dist/ui/components/ui/password-input.js.map +1 -1
  518. package/dist/ui/components/ui/popover.cjs.map +1 -1
  519. package/dist/ui/components/ui/popover.d.cts +86 -2
  520. package/dist/ui/components/ui/popover.d.ts +86 -2
  521. package/dist/ui/components/ui/popover.js.map +1 -1
  522. package/dist/ui/components/ui/progress.cjs.map +1 -1
  523. package/dist/ui/components/ui/progress.d.cts +72 -2
  524. package/dist/ui/components/ui/progress.d.ts +72 -2
  525. package/dist/ui/components/ui/progress.js.map +1 -1
  526. package/dist/ui/components/ui/radio-card.cjs.map +1 -1
  527. package/dist/ui/components/ui/radio-card.d.cts +32 -4
  528. package/dist/ui/components/ui/radio-card.d.ts +32 -4
  529. package/dist/ui/components/ui/radio-card.js.map +1 -1
  530. package/dist/ui/components/ui/radio-group.cjs.map +1 -1
  531. package/dist/ui/components/ui/radio-group.d.cts +28 -2
  532. package/dist/ui/components/ui/radio-group.d.ts +28 -2
  533. package/dist/ui/components/ui/radio-group.js.map +1 -1
  534. package/dist/ui/components/ui/resizable.cjs.map +1 -1
  535. package/dist/ui/components/ui/resizable.d.cts +42 -3
  536. package/dist/ui/components/ui/resizable.d.ts +42 -3
  537. package/dist/ui/components/ui/resizable.js.map +1 -1
  538. package/dist/ui/components/ui/responsive-list.cjs.map +1 -1
  539. package/dist/ui/components/ui/responsive-list.d.cts +176 -13
  540. package/dist/ui/components/ui/responsive-list.d.ts +176 -13
  541. package/dist/ui/components/ui/responsive-list.js.map +1 -1
  542. package/dist/ui/components/ui/scroll-area.cjs.map +1 -1
  543. package/dist/ui/components/ui/scroll-area.d.cts +28 -1
  544. package/dist/ui/components/ui/scroll-area.d.ts +28 -1
  545. package/dist/ui/components/ui/scroll-area.js.map +1 -1
  546. package/dist/ui/components/ui/searchable-select-input.cjs.map +1 -1
  547. package/dist/ui/components/ui/searchable-select-input.d.cts +199 -49
  548. package/dist/ui/components/ui/searchable-select-input.d.ts +199 -49
  549. package/dist/ui/components/ui/searchable-select-input.js.map +1 -1
  550. package/dist/ui/components/ui/select.cjs.map +1 -1
  551. package/dist/ui/components/ui/select.d.cts +205 -40
  552. package/dist/ui/components/ui/select.d.ts +205 -40
  553. package/dist/ui/components/ui/select.js.map +1 -1
  554. package/dist/ui/components/ui/separator.cjs.map +1 -1
  555. package/dist/ui/components/ui/separator.d.cts +13 -2
  556. package/dist/ui/components/ui/separator.d.ts +13 -2
  557. package/dist/ui/components/ui/separator.js.map +1 -1
  558. package/dist/ui/components/ui/sheet.cjs.map +1 -1
  559. package/dist/ui/components/ui/sheet.d.cts +128 -3
  560. package/dist/ui/components/ui/sheet.d.ts +128 -3
  561. package/dist/ui/components/ui/sheet.js.map +1 -1
  562. package/dist/ui/components/ui/skeleton.cjs.map +1 -1
  563. package/dist/ui/components/ui/skeleton.d.cts +13 -1
  564. package/dist/ui/components/ui/skeleton.d.ts +13 -1
  565. package/dist/ui/components/ui/skeleton.js.map +1 -1
  566. package/dist/ui/components/ui/slider.cjs.map +1 -1
  567. package/dist/ui/components/ui/slider.d.cts +13 -7
  568. package/dist/ui/components/ui/slider.d.ts +13 -7
  569. package/dist/ui/components/ui/slider.js.map +1 -1
  570. package/dist/ui/components/ui/spinner.cjs.map +1 -1
  571. package/dist/ui/components/ui/spinner.d.cts +13 -1
  572. package/dist/ui/components/ui/spinner.d.ts +13 -1
  573. package/dist/ui/components/ui/spinner.js.map +1 -1
  574. package/dist/ui/components/ui/switch.cjs.map +1 -1
  575. package/dist/ui/components/ui/switch.d.cts +26 -0
  576. package/dist/ui/components/ui/switch.d.ts +26 -0
  577. package/dist/ui/components/ui/switch.js.map +1 -1
  578. package/dist/ui/components/ui/table.cjs.map +1 -1
  579. package/dist/ui/components/ui/table.d.cts +118 -2
  580. package/dist/ui/components/ui/table.d.ts +118 -2
  581. package/dist/ui/components/ui/table.js.map +1 -1
  582. package/dist/ui/components/ui/tabs-components.cjs.map +1 -1
  583. package/dist/ui/components/ui/tabs-components.d.cts +52 -5
  584. package/dist/ui/components/ui/tabs-components.d.ts +52 -5
  585. package/dist/ui/components/ui/tabs-components.js.map +1 -1
  586. package/dist/ui/components/ui/tabs-variants.cjs.map +1 -1
  587. package/dist/ui/components/ui/tabs-variants.d.cts +15 -0
  588. package/dist/ui/components/ui/tabs-variants.d.ts +15 -0
  589. package/dist/ui/components/ui/tabs-variants.js.map +1 -1
  590. package/dist/ui/components/ui/textarea.cjs.map +1 -1
  591. package/dist/ui/components/ui/textarea.d.cts +23 -0
  592. package/dist/ui/components/ui/textarea.d.ts +23 -0
  593. package/dist/ui/components/ui/textarea.js.map +1 -1
  594. package/dist/ui/components/ui/toast.cjs.map +1 -1
  595. package/dist/ui/components/ui/toast.d.cts +136 -0
  596. package/dist/ui/components/ui/toast.d.ts +136 -0
  597. package/dist/ui/components/ui/toast.js.map +1 -1
  598. package/dist/ui/components/ui/toaster.cjs.map +1 -1
  599. package/dist/ui/components/ui/toaster.d.cts +12 -3
  600. package/dist/ui/components/ui/toaster.d.ts +12 -3
  601. package/dist/ui/components/ui/toaster.js.map +1 -1
  602. package/dist/ui/components/ui/toggle-components.cjs.map +1 -1
  603. package/dist/ui/components/ui/toggle-components.d.cts +15 -0
  604. package/dist/ui/components/ui/toggle-components.d.ts +15 -0
  605. package/dist/ui/components/ui/toggle-components.js.map +1 -1
  606. package/dist/ui/components/ui/toggle-group.cjs.map +1 -1
  607. package/dist/ui/components/ui/toggle-group.d.cts +33 -0
  608. package/dist/ui/components/ui/toggle-group.d.ts +33 -0
  609. package/dist/ui/components/ui/toggle-group.js.map +1 -1
  610. package/dist/ui/components/ui/toggle-variants.cjs.map +1 -1
  611. package/dist/ui/components/ui/toggle-variants.d.cts +15 -0
  612. package/dist/ui/components/ui/toggle-variants.d.ts +15 -0
  613. package/dist/ui/components/ui/toggle-variants.js.map +1 -1
  614. package/dist/ui/components/ui/toolbar.cjs.map +1 -1
  615. package/dist/ui/components/ui/toolbar.d.cts +94 -7
  616. package/dist/ui/components/ui/toolbar.d.ts +94 -7
  617. package/dist/ui/components/ui/toolbar.js.map +1 -1
  618. package/dist/ui/components/ui/tooltip.cjs.map +1 -1
  619. package/dist/ui/components/ui/tooltip.d.cts +54 -3
  620. package/dist/ui/components/ui/tooltip.d.ts +54 -3
  621. package/dist/ui/components/ui/tooltip.js.map +1 -1
  622. package/dist/ui/lib/hooks/use-gps.cjs.map +1 -1
  623. package/dist/ui/lib/hooks/use-gps.d.cts +29 -4
  624. package/dist/ui/lib/hooks/use-gps.d.ts +29 -4
  625. package/dist/ui/lib/hooks/use-gps.js.map +1 -1
  626. package/dist/ui/lib/hooks/use-is-client.cjs.map +1 -1
  627. package/dist/ui/lib/hooks/use-is-client.d.cts +11 -2
  628. package/dist/ui/lib/hooks/use-is-client.d.ts +11 -2
  629. package/dist/ui/lib/hooks/use-is-client.js.map +1 -1
  630. package/dist/ui/lib/hooks/use-keyboard-shortcut.cjs.map +1 -1
  631. package/dist/ui/lib/hooks/use-keyboard-shortcut.d.cts +48 -18
  632. package/dist/ui/lib/hooks/use-keyboard-shortcut.d.ts +48 -18
  633. package/dist/ui/lib/hooks/use-keyboard-shortcut.js.map +1 -1
  634. package/dist/ui/lib/hooks/use-mobile.cjs.map +1 -1
  635. package/dist/ui/lib/hooks/use-mobile.d.cts +11 -3
  636. package/dist/ui/lib/hooks/use-mobile.d.ts +11 -3
  637. package/dist/ui/lib/hooks/use-mobile.js.map +1 -1
  638. package/dist/ui/lib/hooks/use-toast.cjs.map +1 -1
  639. package/dist/ui/lib/hooks/use-toast.d.cts +184 -15
  640. package/dist/ui/lib/hooks/use-toast.d.ts +184 -15
  641. package/dist/ui/lib/hooks/use-toast.js.map +1 -1
  642. package/dist/ui/lib/ime-utils.cjs.map +1 -1
  643. package/dist/ui/lib/ime-utils.d.cts +40 -13
  644. package/dist/ui/lib/ime-utils.d.ts +40 -13
  645. package/dist/ui/lib/ime-utils.js.map +1 -1
  646. package/dist/ui/lib/utils.cjs.map +1 -1
  647. package/dist/ui/lib/utils.d.cts +9 -6
  648. package/dist/ui/lib/utils.d.ts +9 -6
  649. package/dist/ui/lib/utils.js.map +1 -1
  650. package/docs/ai.md +34 -1
  651. package/docs/exports.md +5 -1
  652. package/docs/index.md +89 -16
  653. package/docs/migration.md +268 -0
  654. package/docs/request-form.md +4 -1
  655. package/docs/tools.md +4 -1
  656. package/docs/ui.md +4 -1
  657. package/llms-full.txt +499 -36
  658. package/llms.txt +4 -0
  659. package/package.json +35 -5
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-compound.js","names":["React","React$1","KanbanCompoundContext","useKanbanCompoundContext","context","KanbanRoot","props","drag","useKanbanDrag","contextValue","activeTask","onTaskClick","statusField","readOnly","KanbanDragSurface","cn","className","KanbanColumnSlot","KanbanColumnFrame","KanbanColumnHeaderSlot","isOverLimit","limit","count","color","title","children","Badge","action","KanbanColumnBodySlot","SortableContext","tasks","t","verticalListSortingStrategy","KanbanCardSlot","task","emptyMessage","KanbanDraggableCard","KanbanCardView","Kanban"],"sources":["../../../../src/tools/components/kanban/kanban-compound.tsx"],"sourcesContent":["/**\n * @fileoverview Kanban Compound Components (Kanban)\n *\n * 合成可能なカンバンボードUIコンポーネント群。\n * プリセットの `<KanbanBoard>` では対応しきれないカラムヘッダーへのカスタムボタン配置や\n * カード内の独自スロット挿入を可能にします。\n *\n * @module kanban/kanban-compound\n */\n\n/* eslint-disable react-refresh/only-export-components */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from '../ui/badge';\nimport { KanbanCardView } from './KanbanCardView';\nimport { KanbanColumnFrame, KanbanDraggableCard, KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanTask, KanbanColumn as KanbanColumnType } from './types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport interface KanbanCompoundContextValue {\n /** 読み取り専用 */\n readOnly?: boolean;\n activeTask: KanbanTask | null;\n onTaskClick?: (task: KanbanTask) => void;\n statusField: string;\n}\n\nconst KanbanCompoundContext = React.createContext<KanbanCompoundContextValue | null>(null);\n\n/**\n * KanbanCompound のコンテキストを取得するフック\n */\nexport function useKanbanCompoundContext() {\n const context = React.useContext(KanbanCompoundContext);\n if (!context) {\n throw new Error('Kanban compound components must be used within <Kanban.Root>');\n }\n return context;\n}\n\n// =============================================================================\n// Kanban Root\n// =============================================================================\n\nexport interface KanbanRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 読み取り専用。ドラッグを開始しません。 */\n readOnly?: boolean;\n tasks: KanbanTask[];\n onStatusChange?: (taskId: string, newStatus: string) => void;\n onTaskClick?: (task: KanbanTask) => void;\n statusField?: string;\n children: React.ReactNode;\n}\n\n/**\n * プリセット版とD&D処理を共有するルート。tasksと列への振り分けは親が更新します(楽観的更新なし)。\n */\nexport function KanbanRoot({\n tasks,\n onStatusChange,\n onTaskClick,\n statusField = 'status',\n readOnly = false,\n children,\n className,\n ...props\n}: KanbanRootProps) {\n const drag = useKanbanDrag({ tasks, onStatusChange, statusField, readOnly });\n const { activeTask } = drag;\n\n const contextValue = React.useMemo<KanbanCompoundContextValue>(\n () => ({ activeTask, onTaskClick, statusField, readOnly }),\n [activeTask, onTaskClick, statusField, readOnly],\n );\n\n return (\n <KanbanDragSurface\n controller={drag}\n overlayClassName='rotate-2 scale-105 opacity-90 shadow-2xl'\n >\n <KanbanCompoundContext.Provider value={contextValue}>\n <div className={cn('flex h-full w-full gap-4 overflow-x-auto pb-4', className)} {...props}>\n {children}\n </div>\n </KanbanCompoundContext.Provider>\n </KanbanDragSurface>\n );\n}\n\n// =============================================================================\n// Kanban Column\n// =============================================================================\n\nexport interface KanbanColumnProps extends React.HTMLAttributes<HTMLDivElement> {\n column: KanbanColumnType;\n children: React.ReactNode;\n}\n\n/**\n * カンバンボードのカラムコンテナ\n */\nexport function KanbanColumnSlot({ column, children, className, ...props }: KanbanColumnProps) {\n return (\n <KanbanColumnFrame column={column} className={className} {...props}>\n {children}\n </KanbanColumnFrame>\n );\n}\n\n// =============================================================================\n// Kanban Column Header\n// =============================================================================\n\nexport interface KanbanColumnHeaderProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n title?: React.ReactNode;\n count?: number;\n limit?: number;\n color?: string;\n action?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのヘッダー\n */\nexport function KanbanColumnHeaderSlot({\n title,\n count,\n limit,\n color,\n action,\n className,\n children,\n ...props\n}: KanbanColumnHeaderProps) {\n const isOverLimit = limit && count !== undefined ? count >= limit : false;\n\n return (\n <div className={cn('flex items-center justify-between mb-3 px-1', className)} {...props}>\n <div className='flex items-center gap-2'>\n {color && <div className='w-2.5 h-2.5 rounded-full' style={{ backgroundColor: color }} />}\n {title && <h3 className='font-semibold text-sm text-foreground'>{title}</h3>}\n {children}\n </div>\n <div className='flex items-center gap-2'>\n {count !== undefined && (\n <Badge\n variant={isOverLimit ? 'destructive' : 'secondary'}\n className='text-xs px-2 py-0.5'\n >\n {count}\n {limit && ` / ${limit}`}\n </Badge>\n )}\n {action}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Column Body\n// =============================================================================\n\nexport interface KanbanColumnBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n tasks: KanbanTask[];\n emptyMessage?: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのタスク一覧領域\n */\nexport function KanbanColumnBodySlot({\n tasks,\n emptyMessage = 'No tasks',\n className,\n children,\n ...props\n}: KanbanColumnBodyProps) {\n return (\n <div\n data-slot='kanban-column-content'\n className={cn('flex flex-1 flex-col gap-2 overflow-y-auto', className)}\n {...props}\n >\n <SortableContext items={tasks.map((t) => t.id)} strategy={verticalListSortingStrategy}>\n {children ? (\n children\n ) : tasks.length > 0 ? (\n tasks.map((task) => <KanbanCardSlot key={task.id} task={task} />)\n ) : (\n <div className='flex-1 flex items-center justify-center text-muted-foreground text-xs py-8'>\n {emptyMessage}\n </div>\n )}\n </SortableContext>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Card Slot\n// =============================================================================\n\nexport interface KanbanCardSlotProps extends React.HTMLAttributes<HTMLDivElement> {\n task: KanbanTask;\n children?: React.ReactNode;\n}\n\n/**\n * ドラッグ&ドロップ対応のカンバンカード\n */\nexport function KanbanCardSlot({ task, children, className, ...props }: KanbanCardSlotProps) {\n const { onTaskClick, readOnly } = useKanbanCompoundContext();\n return (\n <KanbanDraggableCard\n task={task}\n disabled={readOnly}\n onClick={() => onTaskClick?.(task)}\n {...props}\n className={cn(\n children &&\n 'rounded-lg border border-border bg-card p-3 shadow-sm hover:shadow transition-shadow',\n className,\n )}\n >\n {children || <KanbanCardView task={task} />}\n </KanbanDraggableCard>\n );\n}\n\n// =============================================================================\n// Export Object\n// =============================================================================\n\nexport const Kanban = {\n Root: KanbanRoot,\n Column: KanbanColumnSlot,\n ColumnHeader: KanbanColumnHeaderSlot,\n ColumnBody: KanbanColumnBodySlot,\n Card: KanbanCardSlot,\n};\n"],"mappings":";;;;;;;;;;AAiCA,IAAME,IAAwBF,EAAM,cAAiD,IAAI;AAKzF,SAAgBG,IAA2B;CACzC,IAAMC,IAAUJ,EAAM,WAAWE,CAAqB;CACtD,IAAI,CAACE,GACH,MAAU,MAAM,8DAA8D;CAEhF,OAAOA;AACT;AAmBA,SAAgBC,EAAW,EACzB,UACA,mBACA,gBACA,iBAAc,UACd,cAAW,IACX,aACA,cACA,GAAGC,KACe;CAClB,IAAMC,IAAOC,EAAc;EAAE;EAAO;EAAgB;EAAa;CAAS,CAAC,GACrE,EAAE,kBAAeD,GAEjBE,IAAeT,EAAM,eAClB;EAAE;EAAY;EAAa;EAAa;CAAS,IACxD;EAACU;EAAYC;EAAaC;EAAaC;CAAQ,CACjD;CAEA,OACE,kBAACC,GAAD;EACE,YAAYP;EACZ,kBAAiB;EAEjB,UAAA,kBAACL,EAAsB,UAAvB;GAAgC,OAAOO;GACrC,UAAA,kBAAC,OAAD;IAAK,WAAWM,EAAG,iDAAiDC,CAAS;IAAG,GAAIV;IACjF;GACE,CAAA;EACyB,CAAA;CACf,CAAA;AAEvB;AAcA,SAAgBW,EAAiB,EAAE,WAAQ,aAAU,cAAW,GAAGX,KAA4B;CAC7F,OACE,kBAACY,GAAD;EAA2B;EAAmB;EAAW,GAAIZ;EAC1D;CACgB,CAAA;AAEvB;AAoBA,SAAgBa,EAAuB,EACrC,UACA,UACA,UACA,UACA,WACA,cACA,aACA,GAAGb,KACuB;CAC1B,IAAMc,IAAcC,KAASC,MAAU,KAAA,IAAYA,KAASD,IAAQ;CAEpE,OACE,kBAAC,OAAD;EAAK,WAAWN,EAAG,+CAA+CC,CAAS;EAAG,GAAIV;EAAlF,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACGiB,KAAS,kBAAC,OAAD;KAAK,WAAU;KAA2B,OAAO,EAAE,iBAAiBA,EAAM;IAAI,CAAA;IACvFC,KAAS,kBAAC,MAAD;KAAI,WAAU;KAAyC,UAAAA;IAAU,CAAA;IAC1EC;GACE;EACL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACGH,MAAU,KAAA,KACT,kBAACI,GAAD;IACE,SAASN,IAAc,gBAAgB;IACvC,WAAU;IAFZ,UAAA,CAIGE,GACAD,KAAS,MAAMA,GACX;GAER,CAAA,GAAAM,CACE;EACF,CAAA,CAAA;;AAET;AAeA,SAAgBC,EAAqB,EACnC,UACA,kBAAe,YACf,cACA,aACA,GAAGtB,KACqB;CACxB,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAWS,EAAG,8CAA8CC,CAAS;EACrE,GAAIV;EAEJ,UAAA,kBAACuB,GAAD;GAAiB,OAAOC,EAAM,KAAK,MAAMC,EAAE,EAAE;GAAG,UAAUC;GACvD,UAAAP,MAEGK,EAAM,SAAS,IACjBA,EAAM,KAAK,MAAS,kBAACG,GAAD,EAAoC,QAAO,GAAtBC,EAAK,EAAiB,CAAC,IAEhE,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAAC;GACE,CAAA;EAEQ,CAAA;CACd,CAAA;AAET;AAcA,SAAgBF,EAAe,EAAE,SAAM,aAAU,cAAW,GAAG3B,KAA8B;CAC3F,IAAM,EAAE,gBAAa,gBAAaH,EAAyB;CAC3D,OACE,kBAACiC,GAAD;EACQ;EACN,UAAUvB;EACV,eAAeF,IAAcuB,CAAI;EACjC,GAAI5B;EACJ,WAAWS,EACTU,KACE,wFACFT,CACF;EAEC,UAAAS,KAAY,kBAACY,GAAD,EAAsB,QAAO,CAAA;CACvB,CAAA;AAEzB;AAMA,IAAaC,IAAS;CACpB,MAAMjC;CACN,QAAQY;CACR,cAAcE;CACd,YAAYS;CACZ,MAAMK;AACR"}
1
+ {"version":3,"file":"kanban-compound.js","names":["React","React$1","KanbanCompoundContext","useKanbanCompoundContext","context","KanbanRoot","props","drag","useKanbanDrag","contextValue","activeTask","onTaskClick","statusField","readOnly","KanbanDragSurface","cn","className","KanbanColumnSlot","KanbanColumnFrame","KanbanColumnHeaderSlot","isOverLimit","limit","count","color","title","children","Badge","action","KanbanColumnBodySlot","SortableContext","tasks","t","verticalListSortingStrategy","KanbanCardSlot","task","emptyMessage","KanbanDraggableCard","KanbanCardView","Kanban"],"sources":["../../../../src/tools/components/kanban/kanban-compound.tsx"],"sourcesContent":["/**\n * @fileoverview Kanban Compound Components (Kanban)\n *\n * 合成可能なカンバンボードUIコンポーネント群。\n * プリセットの `<KanbanBoard>` では対応しきれないカラムヘッダーへのカスタムボタン配置や\n * カード内の独自スロット挿入を可能にします。\n *\n * @module kanban/kanban-compound\n */\n\n/* eslint-disable react-refresh/only-export-components */\n\nimport * as React from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from '../ui/badge';\nimport { KanbanCardView } from './KanbanCardView';\nimport { KanbanColumnFrame, KanbanDraggableCard, KanbanDragSurface } from './kanban-primitives';\nimport { useKanbanDrag } from './use-kanban-drag';\nimport type { KanbanTask, KanbanColumn as KanbanColumnType } from './types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport interface KanbanCompoundContextValue {\n /** 読み取り専用 */\n readOnly?: boolean;\n activeTask: KanbanTask | null;\n onTaskClick?: (task: KanbanTask) => void;\n statusField: string;\n}\n\nconst KanbanCompoundContext = React.createContext<KanbanCompoundContextValue | null>(null);\n\n/**\n * KanbanCompound のコンテキストを取得するフック\n */\nexport function useKanbanCompoundContext() {\n const context = React.useContext(KanbanCompoundContext);\n if (!context) {\n throw new Error('Kanban compound components must be used within <Kanban.Root>');\n }\n return context;\n}\n\n// =============================================================================\n// Kanban Root\n// =============================================================================\n\nexport interface KanbanRootProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 読み取り専用。ドラッグを開始しません。 */\n readOnly?: boolean;\n tasks: KanbanTask[];\n onStatusChange?: (taskId: string, newStatus: string) => void;\n onTaskClick?: (task: KanbanTask) => void;\n statusField?: string;\n children: React.ReactNode;\n}\n\n/**\n * プリセット版とD&D処理を共有するルート。tasksと列への振り分けは親が更新します(楽観的更新なし)。\n */\nexport function KanbanRoot({\n tasks,\n onStatusChange,\n onTaskClick,\n statusField = 'status',\n readOnly = false,\n children,\n className,\n ...props\n}: KanbanRootProps) {\n const drag = useKanbanDrag({ tasks, onStatusChange, statusField, readOnly });\n const { activeTask } = drag;\n\n const contextValue = React.useMemo<KanbanCompoundContextValue>(\n () => ({ activeTask, onTaskClick, statusField, readOnly }),\n [activeTask, onTaskClick, statusField, readOnly],\n );\n\n return (\n <KanbanDragSurface\n controller={drag}\n overlayClassName='rotate-2 scale-105 opacity-90 shadow-2xl'\n >\n <KanbanCompoundContext.Provider value={contextValue}>\n <div role='region' aria-label='Kanban columns' tabIndex={0} className={cn('flex h-full w-full gap-4 overflow-x-auto pb-4', className)} {...props}>\n {children}\n </div>\n </KanbanCompoundContext.Provider>\n </KanbanDragSurface>\n );\n}\n\n// =============================================================================\n// Kanban Column\n// =============================================================================\n\nexport interface KanbanColumnProps extends React.HTMLAttributes<HTMLDivElement> {\n column: KanbanColumnType;\n children: React.ReactNode;\n}\n\n/**\n * カンバンボードのカラムコンテナ\n */\nexport function KanbanColumnSlot({ column, children, className, ...props }: KanbanColumnProps) {\n return (\n <KanbanColumnFrame column={column} className={className} {...props}>\n {children}\n </KanbanColumnFrame>\n );\n}\n\n// =============================================================================\n// Kanban Column Header\n// =============================================================================\n\nexport interface KanbanColumnHeaderProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n title?: React.ReactNode;\n count?: number;\n limit?: number;\n color?: string;\n action?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのヘッダー\n */\nexport function KanbanColumnHeaderSlot({\n title,\n count,\n limit,\n color,\n action,\n className,\n children,\n ...props\n}: KanbanColumnHeaderProps) {\n const isOverLimit = limit && count !== undefined ? count >= limit : false;\n\n return (\n <div className={cn('flex items-center justify-between mb-3 px-1', className)} {...props}>\n <div className='flex items-center gap-2'>\n {color && <div className='w-2.5 h-2.5 rounded-full' style={{ backgroundColor: color }} />}\n {title && <h2 className='font-semibold text-sm text-foreground'>{title}</h2>}\n {children}\n </div>\n <div className='flex items-center gap-2'>\n {count !== undefined && (\n <Badge\n variant={isOverLimit ? 'destructive' : 'secondary'}\n className='text-xs px-2 py-0.5'\n >\n {count}\n {limit && ` / ${limit}`}\n </Badge>\n )}\n {action}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Column Body\n// =============================================================================\n\nexport interface KanbanColumnBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n tasks: KanbanTask[];\n emptyMessage?: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * カンバンカラムのタスク一覧領域\n */\nexport function KanbanColumnBodySlot({\n tasks,\n emptyMessage = 'No tasks',\n className,\n children,\n ...props\n}: KanbanColumnBodyProps) {\n return (\n <div\n data-slot='kanban-column-content'\n className={cn('flex flex-1 flex-col gap-2 overflow-y-auto', className)}\n {...props}\n >\n <SortableContext items={tasks.map((t) => t.id)} strategy={verticalListSortingStrategy}>\n {children ? (\n children\n ) : tasks.length > 0 ? (\n tasks.map((task) => <KanbanCardSlot key={task.id} task={task} />)\n ) : (\n <div className='flex-1 flex items-center justify-center text-muted-foreground text-xs py-8'>\n {emptyMessage}\n </div>\n )}\n </SortableContext>\n </div>\n );\n}\n\n// =============================================================================\n// Kanban Card Slot\n// =============================================================================\n\nexport interface KanbanCardSlotProps extends React.HTMLAttributes<HTMLDivElement> {\n task: KanbanTask;\n children?: React.ReactNode;\n}\n\n/**\n * ドラッグ&ドロップ対応のカンバンカード\n */\nexport function KanbanCardSlot({ task, children, className, ...props }: KanbanCardSlotProps) {\n const { onTaskClick, readOnly } = useKanbanCompoundContext();\n return (\n <KanbanDraggableCard\n task={task}\n disabled={readOnly}\n onClick={() => onTaskClick?.(task)}\n {...props}\n className={cn(\n children &&\n 'rounded-lg border border-border bg-card p-3 shadow-sm hover:shadow transition-shadow',\n className,\n )}\n >\n {children || <KanbanCardView task={task} />}\n </KanbanDraggableCard>\n );\n}\n\n// =============================================================================\n// Export Object\n// =============================================================================\n\nexport const Kanban = {\n Root: KanbanRoot,\n Column: KanbanColumnSlot,\n ColumnHeader: KanbanColumnHeaderSlot,\n ColumnBody: KanbanColumnBodySlot,\n Card: KanbanCardSlot,\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("./KanbanCardView.cjs");let r=require("react/jsx-runtime"),i=require("react");i=e.__toESM(i,1);let a=require("@dnd-kit/core"),o=require("@dnd-kit/sortable"),s=require("@dnd-kit/utilities"),c=require("react-dom");function l({controller:e,overlayClassName:t,children:i}){let o=e.activeTask&&(0,r.jsx)(n.KanbanCardView,{task:e.activeTask});return(0,r.jsxs)(a.DndContext,{...e.contextProps,children:[i,typeof document<`u`&&(0,c.createPortal)((0,r.jsx)(a.DragOverlay,{children:o&&(t?(0,r.jsx)(`div`,{className:t,children:o}):o)}),document.body)]})}function u({task:e,disabled:n,className:i,children:a,...c}){let{setNodeRef:l,attributes:u,listeners:d,transform:f,transition:p,isDragging:m}=(0,o.useSortable)({id:e.id,data:{type:`Task`,task:e},disabled:n});return(0,r.jsx)(`div`,{ref:l,style:{transition:p,transform:s.CSS.Transform.toString(f)},...n?{}:u,...n?{}:d,"aria-label":n?void 0:e.title,"data-task-id":e.id,...c,className:t.cn(`cursor-grab active:cursor-grabbing`,n&&`cursor-default`,m&&`opacity-30`,i),children:a})}var d=i.forwardRef(({column:e,isOverLimit:n,className:o,children:s,...c},l)=>{let{setNodeRef:u,isOver:d}=(0,a.useDroppable)({id:e.id,data:{type:`Column`,column:e}}),f=i.useCallback(e=>{if(u(e),typeof l==`function`){let t=l(e);if(typeof t==`function`)return()=>{u(null),t()}}else l&&(l.current=e)},[u,l]);return(0,r.jsx)(`div`,{ref:f,"data-slot":`kanban-column`,"data-column-id":e.id,"data-over":d||void 0,"data-over-limit":n||void 0,...c,className:t.cn(`flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200`,d&&`bg-primary/5 ring-2 ring-primary/20`,n&&`bg-destructive/5`,o),children:s})});d.displayName=`KanbanColumnFrame`,exports.KanbanColumnFrame=d,exports.KanbanDragSurface=l,exports.KanbanDraggableCard=u;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("./KanbanCardView.cjs");let r=require("react/jsx-runtime"),i=require("react");i=e.__toESM(i,1);let a=require("@dnd-kit/core"),o=require("@dnd-kit/sortable"),s=require("@dnd-kit/utilities"),c=require("react-dom");function l({controller:e,overlayClassName:t,children:i}){let o=e.activeTask&&(0,r.jsx)(n.KanbanCardView,{task:e.activeTask});return(0,r.jsxs)(a.DndContext,{...e.contextProps,children:[i,typeof document<`u`&&(0,c.createPortal)((0,r.jsx)(a.DragOverlay,{children:o&&(t?(0,r.jsx)(`div`,{className:t,children:o}):o)}),document.body)]})}function u({task:e,disabled:n,className:i,children:a,...c}){let{setNodeRef:l,attributes:u,listeners:d,transform:f,transition:p,isDragging:m}=(0,o.useSortable)({id:e.id,data:{type:`Task`,task:e},disabled:n});return(0,r.jsx)(`div`,{ref:l,style:{transition:p,transform:s.CSS.Transform.toString(f)},...n?{}:u,...n?{}:d,"data-task-id":e.id,...c,className:t.cn(`cursor-grab active:cursor-grabbing`,n&&`cursor-default`,m&&`opacity-30`,i),children:a})}var d=i.forwardRef(({column:e,isOverLimit:n,className:o,children:s,...c},l)=>{let{setNodeRef:u,isOver:d}=(0,a.useDroppable)({id:e.id,data:{type:`Column`,column:e}}),f=i.useCallback(e=>{if(u(e),typeof l==`function`){let t=l(e);if(typeof t==`function`)return()=>{u(null),t()}}else l&&(l.current=e)},[u,l]);return(0,r.jsx)(`div`,{ref:f,"data-slot":`kanban-column`,"data-column-id":e.id,"data-over":d||void 0,"data-over-limit":n||void 0,...c,className:t.cn(`flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200`,d&&`bg-primary/5 ring-2 ring-primary/20`,n&&`bg-destructive/5`,o),children:s})});d.displayName=`KanbanColumnFrame`,exports.KanbanColumnFrame=d,exports.KanbanDragSurface=l,exports.KanbanDraggableCard=u;
2
2
  //# sourceMappingURL=kanban-primitives.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-primitives.cjs","names":["KanbanCardView","DndContext","createPortal","DragOverlay","useSortable","CSS","cn","React","useDroppable","require_runtime","require_ui_lib_utils","require_tools_components_kanban_KanbanCardView","react_jsx_runtime","react","_dnd_kit_core","_dnd_kit_sortable","_dnd_kit_utilities","react_dom","KanbanDragSurface","card","controller","children","overlayClassName","KanbanDraggableCard","props","task","setNodeRef","transform","disabled","attributes","listeners","isDragging","className","KanbanColumnFrame","column","composedRef","node","ref","cleanup","isOver","isOverLimit"],"sources":["../../../../src/tools/components/kanban/kanban-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DndContext, DragOverlay, useDroppable } from '@dnd-kit/core';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { cn } from '../../lib/utils';\nimport { KanbanCardView } from './KanbanCardView';\nimport type { KanbanColumn, KanbanTask } from './types';\nimport type { useKanbanDrag } from './use-kanban-drag';\n\n/** Internal shared D&D boundary; the overlay never registers a second draggable. */\nexport function KanbanDragSurface({\n controller,\n overlayClassName,\n children,\n}: {\n controller: ReturnType<typeof useKanbanDrag>;\n overlayClassName?: string;\n children: React.ReactNode;\n}) {\n const card = controller.activeTask && <KanbanCardView task={controller.activeTask} />;\n return (\n <DndContext {...controller.contextProps}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <DragOverlay>\n {card && (overlayClassName ? <div className={overlayClassName}>{card}</div> : card)}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n );\n}\n\n/** Single sortable registration shared by preset cards and Compound cards with custom children. */\nexport function KanbanDraggableCard({\n task,\n disabled,\n className,\n children,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { task: KanbanTask; disabled?: boolean }) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: task.id,\n data: { type: 'Task', task },\n disabled,\n });\n return (\n <div\n ref={setNodeRef}\n style={{ transition, transform: CSS.Transform.toString(transform) }}\n {...(!disabled ? attributes : {})}\n {...(!disabled ? listeners : {})}\n aria-label={disabled ? undefined : task.title}\n data-task-id={task.id}\n {...props}\n className={cn(\n 'cursor-grab active:cursor-grabbing',\n disabled && 'cursor-default',\n isDragging && 'opacity-30',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/** Shared column registration and drag-over presentation; headers and contents remain composable. */\nexport const KanbanColumnFrame = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { column: KanbanColumn; isOverLimit?: boolean }\n>(({ column, isOverLimit, className, children, ...props }, ref) => {\n const { setNodeRef, isOver } = useDroppable({\n id: column.id,\n data: { type: 'Column', column },\n });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof ref === 'function') {\n // ForwardedRef also supports React 18's void return type; React 19 may return cleanup.\n const cleanup: unknown = ref(node);\n if (typeof cleanup === 'function')\n return () => {\n setNodeRef(null);\n cleanup();\n };\n } else if (ref) ref.current = node;\n },\n [setNodeRef, ref],\n );\n return (\n <div\n ref={composedRef}\n data-slot='kanban-column'\n data-column-id={column.id}\n data-over={isOver || undefined}\n data-over-limit={isOverLimit || undefined}\n {...props}\n className={cn(\n 'flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/20',\n isOverLimit && 'bg-destructive/5',\n className,\n )}\n >\n {children}\n </div>\n );\n});\nKanbanColumnFrame.displayName = 'KanbanColumnFrame';\n"],"mappings":"A,gZAWA,SAAgBkB,EAAkB,CAChC,aACA,mBACA,YAKC,CACD,IAAMC,EAAOC,EAAW,aAAc,EAAAR,EAAA,IAAA,CAACZ,EAAAA,eAAD,CAAgB,KAAMoB,EAAW,UAAa,CAAA,EACpF,OACE,EAAAR,EAAA,KAAA,CAACX,EAAAA,WAAD,CAAY,GAAImB,EAAW,aAA3B,SAAA,CACGC,EACA,OAAO,SAAa,MAAA,EACnBnB,EAAAA,aAAAA,EACE,EAAAU,EAAA,IAAA,CAACT,EAAAA,YAAD,CAAA,SACGgB,IAASG,GAAmB,EAAAV,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWU,EAAmB,SAAAH,CAAU,CAAA,EAAIA,EACnE,CAAA,EACb,SAAS,IACX,CACQ,C,EAEhB,CAGA,SAAgBI,EAAoB,CAClC,OACA,WACA,YACA,WACA,GAAGC,GAC+E,CAClF,GAAM,CAAE,aAAY,aAAY,YAAW,YAAW,aAAY,eAAA,EAAepB,EAAAA,YAAAA,CAAY,CAC3F,GAAIqB,EAAK,GACT,KAAM,CAAE,KAAM,OAAQ,MAAK,EAC3B,UACF,CAAC,EACD,OACE,EAAAb,EAAA,IAAA,CAAC,MAAD,CACE,IAAKc,EACL,MAAO,CAAE,aAAY,UAAWrB,EAAAA,IAAI,UAAU,SAASsB,CAAS,CAAE,EAClE,GAAMC,EAAwB,CAAC,EAAdC,EACjB,GAAMD,EAAuB,CAAC,EAAbE,EACjB,aAAYF,EAAW,IAAA,GAAYH,EAAK,MACxC,eAAcA,EAAK,GACnB,GAAID,EACJ,UAAWlB,EAAAA,GACT,qCACAsB,GAAY,iBACZG,GAAc,aACdC,CACF,EAEC,UACE,CAAA,CAET,CAGA,IAAaC,EAAoB1B,EAAM,YAGpC,CAAE,SAAQ,cAAa,YAAW,WAAU,GAAGiB,GAAS,IAAQ,CACjE,GAAM,CAAE,aAAY,WAAA,EAAWhB,EAAAA,aAAAA,CAAa,CAC1C,GAAI0B,EAAO,GACX,KAAM,CAAE,KAAM,SAAU,QAAO,CACjC,CAAC,EACKC,EAAc5B,EAAM,YACvB,GAAgC,CAE/B,GADAmB,EAAWU,CAAI,EACX,OAAOC,GAAQ,WAAY,CAE7B,IAAMC,EAAmBD,EAAID,CAAI,EACjC,GAAI,OAAOE,GAAY,WACrB,UAAa,CACXZ,EAAW,IAAI,EACfY,EAAQ,CACV,CACJ,MAAWD,IAAK,EAAI,QAAUD,EAChC,EACA,CAACV,EAAYW,CAAG,CAClB,EACA,OACE,EAAAzB,EAAA,IAAA,CAAC,MAAD,CACE,IAAKuB,EACL,YAAU,gBACV,iBAAgBD,EAAO,GACvB,YAAWK,GAAU,IAAA,GACrB,kBAAiBC,GAAe,IAAA,GAChC,GAAIhB,EACJ,UAAWlB,EAAAA,GACT,0HACAiC,GAAU,sCACVC,GAAe,mBACfR,CACF,EAEC,UACE,CAAA,CAET,CAAC,EACD,EAAkB,YAAc,oB"}
1
+ {"version":3,"file":"kanban-primitives.cjs","names":["KanbanCardView","DndContext","createPortal","DragOverlay","useSortable","CSS","cn","React","useDroppable","require_runtime","require_ui_lib_utils","require_tools_components_kanban_KanbanCardView","react_jsx_runtime","react","_dnd_kit_core","_dnd_kit_sortable","_dnd_kit_utilities","react_dom","KanbanDragSurface","card","controller","children","overlayClassName","KanbanDraggableCard","props","task","setNodeRef","transform","disabled","attributes","listeners","isDragging","className","KanbanColumnFrame","column","composedRef","node","ref","cleanup","isOver","isOverLimit"],"sources":["../../../../src/tools/components/kanban/kanban-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DndContext, DragOverlay, useDroppable } from '@dnd-kit/core';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { cn } from '../../lib/utils';\nimport { KanbanCardView } from './KanbanCardView';\nimport type { KanbanColumn, KanbanTask } from './types';\nimport type { useKanbanDrag } from './use-kanban-drag';\n\n/** Internal shared D&D boundary; the overlay never registers a second draggable. */\nexport function KanbanDragSurface({\n controller,\n overlayClassName,\n children,\n}: {\n controller: ReturnType<typeof useKanbanDrag>;\n overlayClassName?: string;\n children: React.ReactNode;\n}) {\n const card = controller.activeTask && <KanbanCardView task={controller.activeTask} />;\n return (\n <DndContext {...controller.contextProps}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <DragOverlay>\n {card && (overlayClassName ? <div className={overlayClassName}>{card}</div> : card)}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n );\n}\n\n/** Single sortable registration shared by preset cards and Compound cards with custom children. */\nexport function KanbanDraggableCard({\n task,\n disabled,\n className,\n children,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { task: KanbanTask; disabled?: boolean }) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: task.id,\n data: { type: 'Task', task },\n disabled,\n });\n return (\n <div\n ref={setNodeRef}\n style={{ transition, transform: CSS.Transform.toString(transform) }}\n {...(!disabled ? attributes : {})}\n {...(!disabled ? listeners : {})}\n data-task-id={task.id}\n {...props}\n className={cn(\n 'cursor-grab active:cursor-grabbing',\n disabled && 'cursor-default',\n isDragging && 'opacity-30',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/** Shared column registration and drag-over presentation; headers and contents remain composable. */\nexport const KanbanColumnFrame = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { column: KanbanColumn; isOverLimit?: boolean }\n>(({ column, isOverLimit, className, children, ...props }, ref) => {\n const { setNodeRef, isOver } = useDroppable({\n id: column.id,\n data: { type: 'Column', column },\n });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof ref === 'function') {\n // ForwardedRef also supports React 18's void return type; React 19 may return cleanup.\n const cleanup: unknown = ref(node);\n if (typeof cleanup === 'function')\n return () => {\n setNodeRef(null);\n cleanup();\n };\n } else if (ref) ref.current = node;\n },\n [setNodeRef, ref],\n );\n return (\n <div\n ref={composedRef}\n data-slot='kanban-column'\n data-column-id={column.id}\n data-over={isOver || undefined}\n data-over-limit={isOverLimit || undefined}\n {...props}\n className={cn(\n 'flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/20',\n isOverLimit && 'bg-destructive/5',\n className,\n )}\n >\n {children}\n </div>\n );\n});\nKanbanColumnFrame.displayName = 'KanbanColumnFrame';\n"],"mappings":"A,gZAWA,SAAgBkB,EAAkB,CAChC,aACA,mBACA,YAKC,CACD,IAAMC,EAAOC,EAAW,aAAc,EAAAR,EAAA,IAAA,CAACZ,EAAAA,eAAD,CAAgB,KAAMoB,EAAW,UAAa,CAAA,EACpF,OACE,EAAAR,EAAA,KAAA,CAACX,EAAAA,WAAD,CAAY,GAAImB,EAAW,aAA3B,SAAA,CACGC,EACA,OAAO,SAAa,MAAA,EACnBnB,EAAAA,aAAAA,EACE,EAAAU,EAAA,IAAA,CAACT,EAAAA,YAAD,CAAA,SACGgB,IAASG,GAAmB,EAAAV,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWU,EAAmB,SAAAH,CAAU,CAAA,EAAIA,EACnE,CAAA,EACb,SAAS,IACX,CACQ,C,EAEhB,CAGA,SAAgBI,EAAoB,CAClC,OACA,WACA,YACA,WACA,GAAGC,GAC+E,CAClF,GAAM,CAAE,aAAY,aAAY,YAAW,YAAW,aAAY,eAAA,EAAepB,EAAAA,YAAAA,CAAY,CAC3F,GAAIqB,EAAK,GACT,KAAM,CAAE,KAAM,OAAQ,MAAK,EAC3B,UACF,CAAC,EACD,OACE,EAAAb,EAAA,IAAA,CAAC,MAAD,CACE,IAAKc,EACL,MAAO,CAAE,aAAY,UAAWrB,EAAAA,IAAI,UAAU,SAASsB,CAAS,CAAE,EAClE,GAAMC,EAAwB,CAAC,EAAdC,EACjB,GAAMD,EAAuB,CAAC,EAAbE,EACjB,eAAcL,EAAK,GACnB,GAAID,EACJ,UAAWlB,EAAAA,GACT,qCACAsB,GAAY,iBACZG,GAAc,aACdC,CACF,EAEC,UACE,CAAA,CAET,CAGA,IAAaC,EAAoB1B,EAAM,YAGpC,CAAE,SAAQ,cAAa,YAAW,WAAU,GAAGiB,GAAS,IAAQ,CACjE,GAAM,CAAE,aAAY,WAAA,EAAWhB,EAAAA,aAAAA,CAAa,CAC1C,GAAI0B,EAAO,GACX,KAAM,CAAE,KAAM,SAAU,QAAO,CACjC,CAAC,EACKC,EAAc5B,EAAM,YACvB,GAAgC,CAE/B,GADAmB,EAAWU,CAAI,EACX,OAAOC,GAAQ,WAAY,CAE7B,IAAMC,EAAmBD,EAAID,CAAI,EACjC,GAAI,OAAOE,GAAY,WACrB,UAAa,CACXZ,EAAW,IAAI,EACfY,EAAQ,CACV,CACJ,MAAWD,IAAK,EAAI,QAAUD,EAChC,EACA,CAACV,EAAYW,CAAG,CAClB,EACA,OACE,EAAAzB,EAAA,IAAA,CAAC,MAAD,CACE,IAAKuB,EACL,YAAU,gBACV,iBAAgBD,EAAO,GACvB,YAAWK,GAAU,IAAA,GACrB,kBAAiBC,GAAe,IAAA,GAChC,GAAIhB,EACJ,UAAWlB,EAAAA,GACT,0HACAiC,GAAU,sCACVC,GAAe,mBACfR,CACF,EAEC,UACE,CAAA,CAET,CAAC,EACD,EAAkB,YAAc,oB"}
@@ -35,7 +35,6 @@ function f({ task: t, disabled: r, className: i, children: a, ...o }) {
35
35
  },
36
36
  ...r ? {} : u,
37
37
  ...r ? {} : d,
38
- "aria-label": r ? void 0 : t.title,
39
38
  "data-task-id": t.id,
40
39
  ...o,
41
40
  className: e("cursor-grab active:cursor-grabbing", r && "cursor-default", m && "opacity-30", i),
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-primitives.js","names":["React","React$1","KanbanDragSurface","card","controller","KanbanCardView","DndContext","children","createPortal","DragOverlay","overlayClassName","KanbanDraggableCard","props","useSortable","task","setNodeRef","CSS","transform","disabled","attributes","listeners","cn","isDragging","className","KanbanColumnFrame","useDroppable","column","composedRef","node","ref","cleanup","isOver","isOverLimit"],"sources":["../../../../src/tools/components/kanban/kanban-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DndContext, DragOverlay, useDroppable } from '@dnd-kit/core';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { cn } from '../../lib/utils';\nimport { KanbanCardView } from './KanbanCardView';\nimport type { KanbanColumn, KanbanTask } from './types';\nimport type { useKanbanDrag } from './use-kanban-drag';\n\n/** Internal shared D&D boundary; the overlay never registers a second draggable. */\nexport function KanbanDragSurface({\n controller,\n overlayClassName,\n children,\n}: {\n controller: ReturnType<typeof useKanbanDrag>;\n overlayClassName?: string;\n children: React.ReactNode;\n}) {\n const card = controller.activeTask && <KanbanCardView task={controller.activeTask} />;\n return (\n <DndContext {...controller.contextProps}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <DragOverlay>\n {card && (overlayClassName ? <div className={overlayClassName}>{card}</div> : card)}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n );\n}\n\n/** Single sortable registration shared by preset cards and Compound cards with custom children. */\nexport function KanbanDraggableCard({\n task,\n disabled,\n className,\n children,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { task: KanbanTask; disabled?: boolean }) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: task.id,\n data: { type: 'Task', task },\n disabled,\n });\n return (\n <div\n ref={setNodeRef}\n style={{ transition, transform: CSS.Transform.toString(transform) }}\n {...(!disabled ? attributes : {})}\n {...(!disabled ? listeners : {})}\n aria-label={disabled ? undefined : task.title}\n data-task-id={task.id}\n {...props}\n className={cn(\n 'cursor-grab active:cursor-grabbing',\n disabled && 'cursor-default',\n isDragging && 'opacity-30',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/** Shared column registration and drag-over presentation; headers and contents remain composable. */\nexport const KanbanColumnFrame = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { column: KanbanColumn; isOverLimit?: boolean }\n>(({ column, isOverLimit, className, children, ...props }, ref) => {\n const { setNodeRef, isOver } = useDroppable({\n id: column.id,\n data: { type: 'Column', column },\n });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof ref === 'function') {\n // ForwardedRef also supports React 18's void return type; React 19 may return cleanup.\n const cleanup: unknown = ref(node);\n if (typeof cleanup === 'function')\n return () => {\n setNodeRef(null);\n cleanup();\n };\n } else if (ref) ref.current = node;\n },\n [setNodeRef, ref],\n );\n return (\n <div\n ref={composedRef}\n data-slot='kanban-column'\n data-column-id={column.id}\n data-over={isOver || undefined}\n data-over-limit={isOverLimit || undefined}\n {...props}\n className={cn(\n 'flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/20',\n isOverLimit && 'bg-destructive/5',\n className,\n )}\n >\n {children}\n </div>\n );\n});\nKanbanColumnFrame.displayName = 'KanbanColumnFrame';\n"],"mappings":";;;;;;;;;;AAWA,SAAgBE,EAAkB,EAChC,eACA,qBACA,eAKC;CACD,IAAMC,IAAOC,EAAW,cAAc,kBAACC,GAAD,EAAgB,MAAMD,EAAW,WAAa,CAAA;CACpF,OACE,kBAACE,GAAD;EAAY,GAAIF,EAAW;EAA3B,UAAA,CACGG,GACA,OAAO,WAAa,OACnBC,EACE,kBAACC,GAAD,EAAA,UACGN,MAASO,IAAmB,kBAAC,OAAD;GAAK,WAAWA;GAAmB,UAAAP;EAAU,CAAA,IAAIA,GACnE,CAAA,GACb,SAAS,IACX,CACQ;;AAEhB;AAGA,SAAgBQ,EAAoB,EAClC,SACA,aACA,cACA,aACA,GAAGC,KAC+E;CAClF,IAAM,EAAE,eAAY,eAAY,cAAW,cAAW,eAAY,kBAAeC,EAAY;EAC3F,IAAIC,EAAK;EACT,MAAM;GAAE,MAAM;GAAQ;EAAK;EAC3B;CACF,CAAC;CACD,OACE,kBAAC,OAAD;EACE,KAAKC;EACL,OAAO;GAAE;GAAY,WAAWC,EAAI,UAAU,SAASC,CAAS;EAAE;EAClE,GAAMC,IAAwB,CAAC,IAAdC;EACjB,GAAMD,IAAuB,CAAC,IAAbE;EACjB,cAAYF,IAAW,KAAA,IAAYJ,EAAK;EACxC,gBAAcA,EAAK;EACnB,GAAIF;EACJ,WAAWS,EACT,sCACAH,KAAY,kBACZI,KAAc,cACdC,CACF;EAEC;CACE,CAAA;AAET;AAGA,IAAaC,IAAoBxB,EAAM,YAGpC,EAAE,WAAQ,gBAAa,cAAW,aAAU,GAAGY,KAAS,MAAQ;CACjE,IAAM,EAAE,eAAY,cAAWa,EAAa;EAC1C,IAAIC,EAAO;EACX,MAAM;GAAE,MAAM;GAAU;EAAO;CACjC,CAAC,GACKC,IAAc3B,EAAM,aACvB,MAAgC;EAE/B,IADAe,EAAWa,CAAI,GACX,OAAOC,KAAQ,YAAY;GAE7B,IAAMC,IAAmBD,EAAID,CAAI;GACjC,IAAI,OAAOE,KAAY,YACrB,aAAa;IAEX,AADAf,EAAW,IAAI,GACfe,EAAQ;GACV;EACJ,OAAO,AAAID,MAAK,EAAI,UAAUD;CAChC,GACA,CAACb,GAAYc,CAAG,CAClB;CACA,OACE,kBAAC,OAAD;EACE,KAAKF;EACL,aAAU;EACV,kBAAgBD,EAAO;EACvB,aAAWK,KAAU,KAAA;EACrB,mBAAiBC,KAAe,KAAA;EAChC,GAAIpB;EACJ,WAAWS,EACT,2HACAU,KAAU,uCACVC,KAAe,oBACfT,CACF;EAEC;CACE,CAAA;AAET,CAAC;AACD,EAAkB,cAAc"}
1
+ {"version":3,"file":"kanban-primitives.js","names":["React","React$1","KanbanDragSurface","card","controller","KanbanCardView","DndContext","children","createPortal","DragOverlay","overlayClassName","KanbanDraggableCard","props","useSortable","task","setNodeRef","CSS","transform","disabled","attributes","listeners","cn","isDragging","className","KanbanColumnFrame","useDroppable","column","composedRef","node","ref","cleanup","isOver","isOverLimit"],"sources":["../../../../src/tools/components/kanban/kanban-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DndContext, DragOverlay, useDroppable } from '@dnd-kit/core';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { cn } from '../../lib/utils';\nimport { KanbanCardView } from './KanbanCardView';\nimport type { KanbanColumn, KanbanTask } from './types';\nimport type { useKanbanDrag } from './use-kanban-drag';\n\n/** Internal shared D&D boundary; the overlay never registers a second draggable. */\nexport function KanbanDragSurface({\n controller,\n overlayClassName,\n children,\n}: {\n controller: ReturnType<typeof useKanbanDrag>;\n overlayClassName?: string;\n children: React.ReactNode;\n}) {\n const card = controller.activeTask && <KanbanCardView task={controller.activeTask} />;\n return (\n <DndContext {...controller.contextProps}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <DragOverlay>\n {card && (overlayClassName ? <div className={overlayClassName}>{card}</div> : card)}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n );\n}\n\n/** Single sortable registration shared by preset cards and Compound cards with custom children. */\nexport function KanbanDraggableCard({\n task,\n disabled,\n className,\n children,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { task: KanbanTask; disabled?: boolean }) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: task.id,\n data: { type: 'Task', task },\n disabled,\n });\n return (\n <div\n ref={setNodeRef}\n style={{ transition, transform: CSS.Transform.toString(transform) }}\n {...(!disabled ? attributes : {})}\n {...(!disabled ? listeners : {})}\n data-task-id={task.id}\n {...props}\n className={cn(\n 'cursor-grab active:cursor-grabbing',\n disabled && 'cursor-default',\n isDragging && 'opacity-30',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/** Shared column registration and drag-over presentation; headers and contents remain composable. */\nexport const KanbanColumnFrame = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { column: KanbanColumn; isOverLimit?: boolean }\n>(({ column, isOverLimit, className, children, ...props }, ref) => {\n const { setNodeRef, isOver } = useDroppable({\n id: column.id,\n data: { type: 'Column', column },\n });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof ref === 'function') {\n // ForwardedRef also supports React 18's void return type; React 19 may return cleanup.\n const cleanup: unknown = ref(node);\n if (typeof cleanup === 'function')\n return () => {\n setNodeRef(null);\n cleanup();\n };\n } else if (ref) ref.current = node;\n },\n [setNodeRef, ref],\n );\n return (\n <div\n ref={composedRef}\n data-slot='kanban-column'\n data-column-id={column.id}\n data-over={isOver || undefined}\n data-over-limit={isOverLimit || undefined}\n {...props}\n className={cn(\n 'flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/20',\n isOverLimit && 'bg-destructive/5',\n className,\n )}\n >\n {children}\n </div>\n );\n});\nKanbanColumnFrame.displayName = 'KanbanColumnFrame';\n"],"mappings":";;;;;;;;;;AAWA,SAAgBE,EAAkB,EAChC,eACA,qBACA,eAKC;CACD,IAAMC,IAAOC,EAAW,cAAc,kBAACC,GAAD,EAAgB,MAAMD,EAAW,WAAa,CAAA;CACpF,OACE,kBAACE,GAAD;EAAY,GAAIF,EAAW;EAA3B,UAAA,CACGG,GACA,OAAO,WAAa,OACnBC,EACE,kBAACC,GAAD,EAAA,UACGN,MAASO,IAAmB,kBAAC,OAAD;GAAK,WAAWA;GAAmB,UAAAP;EAAU,CAAA,IAAIA,GACnE,CAAA,GACb,SAAS,IACX,CACQ;;AAEhB;AAGA,SAAgBQ,EAAoB,EAClC,SACA,aACA,cACA,aACA,GAAGC,KAC+E;CAClF,IAAM,EAAE,eAAY,eAAY,cAAW,cAAW,eAAY,kBAAeC,EAAY;EAC3F,IAAIC,EAAK;EACT,MAAM;GAAE,MAAM;GAAQ;EAAK;EAC3B;CACF,CAAC;CACD,OACE,kBAAC,OAAD;EACE,KAAKC;EACL,OAAO;GAAE;GAAY,WAAWC,EAAI,UAAU,SAASC,CAAS;EAAE;EAClE,GAAMC,IAAwB,CAAC,IAAdC;EACjB,GAAMD,IAAuB,CAAC,IAAbE;EACjB,gBAAcN,EAAK;EACnB,GAAIF;EACJ,WAAWS,EACT,sCACAH,KAAY,kBACZI,KAAc,cACdC,CACF;EAEC;CACE,CAAA;AAET;AAGA,IAAaC,IAAoBxB,EAAM,YAGpC,EAAE,WAAQ,gBAAa,cAAW,aAAU,GAAGY,KAAS,MAAQ;CACjE,IAAM,EAAE,eAAY,cAAWa,EAAa;EAC1C,IAAIC,EAAO;EACX,MAAM;GAAE,MAAM;GAAU;EAAO;CACjC,CAAC,GACKC,IAAc3B,EAAM,aACvB,MAAgC;EAE/B,IADAe,EAAWa,CAAI,GACX,OAAOC,KAAQ,YAAY;GAE7B,IAAMC,IAAmBD,EAAID,CAAI;GACjC,IAAI,OAAOE,KAAY,YACrB,aAAa;IAEX,AADAf,EAAW,IAAI,GACfe,EAAQ;GACV;EACJ,OAAO,AAAID,MAAK,EAAI,UAAUD;CAChC,GACA,CAACb,GAAYc,CAAG,CAClB;CACA,OACE,kBAAC,OAAD;EACE,KAAKF;EACL,aAAU;EACV,kBAAgBD,EAAO;EACvB,aAAWK,KAAU,KAAA;EACrB,mBAAiBC,KAAe,KAAA;EAChC,GAAIpB;EACJ,WAAWS,EACT,2HACAU,KAAU,uCACVC,KAAe,oBACfT,CACF;EAEC;CACE,CAAA;AAET,CAAC;AACD,EAAkB,cAAc"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../../ui/components/ui/button-components.cjs"),r=require("../../../ui/components/ui/avatar.cjs"),i=require("../../../ui/components/ui/badge-components.cjs"),a=require("../../../ui/components/ui/card.cjs"),o=require("../../../ui/components/ui/collapsible.cjs"),s=require("../../../ui/components/ui/dropdown-menu.cjs"),c=require("../../../ui/components/ui/slider.cjs"),l=require("./types.cjs");let u=require("react/jsx-runtime"),d=require("react");d=e.__toESM(d,1);let f=require("lucide-react"),p=require("date-fns");function m(e){return e>=15?`text-destructive`:e>=10?`text-orange-600 dark:text-orange-400`:e>=5?`text-yellow-600 dark:text-yellow-400`:`text-muted-foreground`}function h(e){return e>=15?`bg-destructive/5`:e>=10?`bg-orange-50/50 dark:bg-orange-950/10`:``}var g=d.forwardRef(({task:e,rank:g,onClick:_,onComplete:v,onSnooze:y,onFactorsUpdate:b,snoozeOptions:x=l.DEFAULT_SNOOZE_OPTIONS,testId:S,readOnly:C=!1,expanded:w,onExpandedChange:T},E)=>{let[D,O]=d.useState(!1),k=w??D,A=T??O,[j,M]=d.useState({impact:e.impact||5,effort:e.effort||5,risk:e.risk||0}),N=e.score??0,P=e.due_date&&new Date(e.due_date)<new Date,F=(e,t)=>{let n={...j,[e]:t};M(n),b?.(n)};return(0,u.jsxs)(a.Card,{ref:E,"data-slot":`priority-card`,"data-testid":S,"data-rank":g,"data-score":N,className:t.cn(`transition-all duration-200`,h(N),g===1&&`ring-2 ring-primary shadow-md bg-gradient-to-r from-primary/5 to-transparent`,_&&`cursor-pointer hover:shadow-md`),onClick:_,children:[(0,u.jsx)(a.CardHeader,{className:`p-3 pb-2`,children:(0,u.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,u.jsx)(`div`,{"data-slot":`priority-rank`,className:t.cn(`flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold`,g===1?`bg-primary text-primary-foreground`:g<=3?`bg-muted text-foreground`:`bg-muted/50 text-muted-foreground`),children:g}),(0,u.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,u.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[e.project?.name&&(0,u.jsx)(i.Badge,{variant:`outline`,className:`text-[10px] px-1.5 py-0 font-normal shrink-0`,style:{borderColor:e.project.color,color:e.project.color},children:e.project.name}),(0,u.jsxs)(`div`,{"data-slot":`priority-score`,className:t.cn(`flex items-center gap-1 text-sm font-bold`,m(N)),children:[(0,u.jsx)(f.Zap,{className:`w-3 h-3`}),N.toFixed(1)]})]}),(0,u.jsx)(a.CardTitle,{className:`text-sm font-medium leading-snug line-clamp-2`,children:e.title}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 mt-2 text-xs text-muted-foreground`,children:[e.due_date&&(0,u.jsxs)(`span`,{className:t.cn(`flex items-center gap-0.5`,P&&`text-destructive font-medium`),children:[(0,u.jsx)(f.Clock,{className:`w-3 h-3`}),(0,p.formatDistanceToNow)(new Date(e.due_date),{addSuffix:!0})]}),e.assignee&&(0,u.jsxs)(r.Avatar,{className:`h-4 w-4`,children:[e.assignee.avatar&&(0,u.jsx)(r.AvatarImage,{src:e.assignee.avatar}),(0,u.jsx)(r.AvatarFallback,{className:`text-[8px]`,children:e.assignee.name?.[0]})]})]})]}),!C&&(0,u.jsxs)(`div`,{"data-slot":`priority-actions`,className:`flex gap-1`,onClick:e=>e.stopPropagation(),children:[(0,u.jsx)(n.Button,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,onClick:v,testId:S?`${S}-complete`:void 0,children:(0,u.jsx)(f.Check,{className:`h-4 w-4 text-green-600`})}),(0,u.jsxs)(s.DropdownMenu,{children:[(0,u.jsx)(s.DropdownMenuTrigger,{className:`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7`,"data-testid":S?`${S}-snooze`:void 0,children:(0,u.jsx)(f.Pause,{className:`h-4 w-4 text-muted-foreground`})}),(0,u.jsx)(s.DropdownMenuContent,{align:`end`,children:x.map(e=>(0,u.jsx)(s.DropdownMenuItem,{onClick:()=>y?.(e.minutes),children:e.label},e.minutes))})]})]})]})}),!C&&b&&(0,u.jsxs)(o.Collapsible,{open:k,onOpenChange:A,children:[(0,u.jsxs)(o.CollapsibleTrigger,{className:`w-full h-6 flex items-center justify-center text-xs text-muted-foreground hover:bg-muted/50 transition-colors`,"data-testid":S?`${S}-expand`:void 0,onClick:e=>e.stopPropagation(),children:[(0,u.jsx)(f.Sparkles,{className:`w-3 h-3 mr-1`}),`Adjust Factors`,k?(0,u.jsx)(f.ChevronUp,{className:`w-3 h-3 ml-1`}):(0,u.jsx)(f.ChevronDown,{className:`w-3 h-3 ml-1`})]}),(0,u.jsx)(o.CollapsibleContent,{children:(0,u.jsxs)(a.CardContent,{"data-slot":`priority-factors`,className:`p-3 pt-2 space-y-3 border-t`,onClick:e=>e.stopPropagation(),children:[(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-xs`,children:[(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`Impact`}),(0,u.jsx)(`span`,{className:`font-medium`,children:j.impact})]}),(0,u.jsx)(c.Slider,{value:[j.impact],min:1,max:10,step:1,onValueChange:e=>{let t=Array.isArray(e)?e[0]:e;F(`impact`,t)}})]}),(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-xs`,children:[(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`Effort`}),(0,u.jsx)(`span`,{className:`font-medium`,children:j.effort})]}),(0,u.jsx)(c.Slider,{value:[j.effort],min:1,max:10,step:1,onValueChange:e=>{let t=Array.isArray(e)?e[0]:e;F(`effort`,t)}})]}),(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-xs`,children:[(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`Risk`}),(0,u.jsx)(`span`,{className:`font-medium`,children:j.risk})]}),(0,u.jsx)(c.Slider,{value:[j.risk],min:0,max:10,step:1,onValueChange:e=>{let t=Array.isArray(e)?e[0]:e;F(`risk`,t)}})]})]})})]})]})});g.displayName=`PriorityCard`,exports.PriorityCard=g;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../../../ui/components/ui/button-components.cjs"),r=require("../../../ui/components/ui/avatar.cjs"),i=require("../../../ui/components/ui/badge-components.cjs"),a=require("../../../ui/components/ui/card.cjs"),o=require("../../../ui/components/ui/collapsible.cjs"),s=require("../../../ui/components/ui/dropdown-menu.cjs"),c=require("../../../ui/components/ui/slider.cjs"),l=require("./types.cjs");let u=require("react/jsx-runtime"),d=require("react");d=e.__toESM(d,1);let f=require("lucide-react"),p=require("date-fns");function m(e){return e>=15?`text-destructive`:e>=10?`text-orange-700 dark:text-orange-400`:e>=5?`text-yellow-800 dark:text-yellow-400`:`text-muted-foreground`}function h(e){return e>=15?`bg-destructive/5`:e>=10?`bg-orange-50/50 dark:bg-orange-950/10`:``}var g=d.forwardRef(({task:e,rank:g,onClick:_,onComplete:v,onSnooze:y,onFactorsUpdate:b,snoozeOptions:x=l.DEFAULT_SNOOZE_OPTIONS,testId:S,readOnly:C=!1,expanded:w,onExpandedChange:T},E)=>{let[D,O]=d.useState(!1),k=w??D,A=T??O,[j,M]=d.useState({impact:e.impact||5,effort:e.effort||5,risk:e.risk||0}),N=e.score??0,P=e.due_date&&new Date(e.due_date)<new Date,F=(e,t)=>{let n={...j,[e]:t};M(n),b?.(n)};return(0,u.jsxs)(a.Card,{ref:E,"data-slot":`priority-card`,"data-testid":S,"data-rank":g,"data-score":N,className:t.cn(`transition-all duration-200`,h(N),g===1&&`ring-2 ring-primary shadow-md bg-gradient-to-r from-primary/5 to-transparent`,_&&`cursor-pointer hover:shadow-md`),onClick:_,children:[(0,u.jsx)(a.CardHeader,{className:`p-3 pb-2`,children:(0,u.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,u.jsx)(`div`,{"data-slot":`priority-rank`,className:t.cn(`flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold`,g===1?`bg-primary text-primary-foreground`:g<=3?`bg-muted text-foreground`:`bg-muted/50 text-muted-foreground`),children:g}),(0,u.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,u.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[e.project?.name&&(0,u.jsx)(i.Badge,{variant:`outline`,className:`text-[10px] px-1.5 py-0 font-normal shrink-0`,style:{borderColor:e.project.color,color:e.project.color},children:e.project.name}),(0,u.jsxs)(`div`,{"data-slot":`priority-score`,className:t.cn(`flex items-center gap-1 text-sm font-bold`,m(N)),children:[(0,u.jsx)(f.Zap,{className:`w-3 h-3`}),N.toFixed(1)]})]}),(0,u.jsx)(a.CardTitle,{className:`text-sm font-medium leading-snug line-clamp-2`,children:e.title}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 mt-2 text-xs text-muted-foreground`,children:[e.due_date&&(0,u.jsxs)(`span`,{className:t.cn(`flex items-center gap-0.5`,P&&`text-destructive font-medium`),children:[(0,u.jsx)(f.Clock,{className:`w-3 h-3`}),(0,p.formatDistanceToNow)(new Date(e.due_date),{addSuffix:!0})]}),e.assignee&&(0,u.jsxs)(r.Avatar,{className:`h-4 w-4`,children:[e.assignee.avatar&&(0,u.jsx)(r.AvatarImage,{src:e.assignee.avatar}),(0,u.jsx)(r.AvatarFallback,{className:`text-[8px]`,children:e.assignee.name?.[0]})]})]})]}),!C&&(0,u.jsxs)(`div`,{"data-slot":`priority-actions`,className:`flex gap-1`,onClick:e=>e.stopPropagation(),children:[(0,u.jsx)(n.Button,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,"aria-label":`Complete ${e.title}`,onClick:v,testId:S?`${S}-complete`:void 0,children:(0,u.jsx)(f.Check,{className:`h-4 w-4 text-green-600`})}),(0,u.jsxs)(s.DropdownMenu,{children:[(0,u.jsx)(s.DropdownMenuTrigger,{"aria-label":`Snooze ${e.title}`,className:`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7`,"data-testid":S?`${S}-snooze`:void 0,children:(0,u.jsx)(f.Pause,{className:`h-4 w-4 text-muted-foreground`})}),(0,u.jsx)(s.DropdownMenuContent,{align:`end`,children:x.map(e=>(0,u.jsx)(s.DropdownMenuItem,{onClick:()=>y?.(e.minutes),children:e.label},e.minutes))})]})]})]})}),!C&&b&&(0,u.jsxs)(o.Collapsible,{open:k,onOpenChange:A,children:[(0,u.jsxs)(o.CollapsibleTrigger,{className:`w-full h-6 flex items-center justify-center text-xs text-muted-foreground hover:bg-muted/50 transition-colors`,"data-testid":S?`${S}-expand`:void 0,onClick:e=>e.stopPropagation(),children:[(0,u.jsx)(f.Sparkles,{className:`w-3 h-3 mr-1`}),`Adjust Factors`,k?(0,u.jsx)(f.ChevronUp,{className:`w-3 h-3 ml-1`}):(0,u.jsx)(f.ChevronDown,{className:`w-3 h-3 ml-1`})]}),(0,u.jsx)(o.CollapsibleContent,{children:(0,u.jsxs)(a.CardContent,{"data-slot":`priority-factors`,className:`p-3 pt-2 space-y-3 border-t`,onClick:e=>e.stopPropagation(),children:[(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-xs`,children:[(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`Impact`}),(0,u.jsx)(`span`,{className:`font-medium`,children:j.impact})]}),(0,u.jsx)(c.Slider,{value:[j.impact],min:1,max:10,step:1,onValueChange:e=>{let t=Array.isArray(e)?e[0]:e;F(`impact`,t)}})]}),(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-xs`,children:[(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`Effort`}),(0,u.jsx)(`span`,{className:`font-medium`,children:j.effort})]}),(0,u.jsx)(c.Slider,{value:[j.effort],min:1,max:10,step:1,onValueChange:e=>{let t=Array.isArray(e)?e[0]:e;F(`effort`,t)}})]}),(0,u.jsxs)(`div`,{className:`space-y-1`,children:[(0,u.jsxs)(`div`,{className:`flex justify-between text-xs`,children:[(0,u.jsx)(`span`,{className:`text-muted-foreground`,children:`Risk`}),(0,u.jsx)(`span`,{className:`font-medium`,children:j.risk})]}),(0,u.jsx)(c.Slider,{value:[j.risk],min:0,max:10,step:1,onValueChange:e=>{let t=Array.isArray(e)?e[0]:e;F(`risk`,t)}})]})]})})]})]})});g.displayName=`PriorityCard`,exports.PriorityCard=g;
2
2
  //# sourceMappingURL=PriorityCard.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PriorityCard.cjs","names":["React","DEFAULT_SNOOZE_OPTIONS","Card","cn","CardHeader","Badge","Zap","CardTitle","Clock","formatDistanceToNow","Avatar","AvatarImage","AvatarFallback","Button","Check","DropdownMenu","DropdownMenuTrigger","Pause","DropdownMenuContent","DropdownMenuItem","Collapsible","CollapsibleTrigger","Sparkles","ChevronUp","ChevronDown","CollapsibleContent","CardContent","Slider","require_runtime","require_ui_lib_utils","require_ui_components_ui_button_components","require_ui_components_ui_avatar","require_ui_components_ui_badge_components","require_ui_components_ui_card","require_ui_components_ui_collapsible","require_ui_components_ui_dropdown_menu","require_ui_components_ui_slider","require_tools_components_priority_queue_types","react_jsx_runtime","react","lucide_react","date_fns","getScoreColor","score","getScoreBg","PriorityCard","controlledExpanded","localExpanded","setLocalExpanded","expanded","setExpanded","onExpandedChange","factors","setFactors","task","isOverdue","handleFactorChange","newFactors","field","value","onFactorsUpdate","testId","rank","onClick","readOnly","onComplete","snoozeOptions","onSnooze","opt","v","val"],"sources":["../../../../src/tools/components/priority-queue/PriorityCard.tsx"],"sourcesContent":["/**\n * Priority Card Component\n *\n * Focus Mode 用の優先度タスクカード\n */\n\nimport * as React from 'react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { Check, ChevronDown, ChevronUp, Clock, Pause, Sparkles, Zap } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { Button } from '../ui/button';\nimport { Slider } from '../ui/slider';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';\nimport type { PriorityCardProps } from './types';\nimport { DEFAULT_SNOOZE_OPTIONS } from './types';\n\n/**\n * スコアに応じた色クラス\n */\nfunction getScoreColor(score: number): string {\n if (score >= 15) return 'text-destructive';\n if (score >= 10) return 'text-orange-600 dark:text-orange-400';\n if (score >= 5) return 'text-yellow-600 dark:text-yellow-400';\n return 'text-muted-foreground';\n}\n\n/**\n * スコアに応じた背景\n */\nfunction getScoreBg(score: number): string {\n if (score >= 15) return 'bg-destructive/5';\n if (score >= 10) return 'bg-orange-50/50 dark:bg-orange-950/10';\n return '';\n}\n\n/**\n * 優先度カード\n */\nexport const PriorityCard = React.forwardRef<HTMLDivElement, PriorityCardProps>(\n (\n {\n task,\n rank,\n onClick,\n onComplete,\n onSnooze,\n onFactorsUpdate,\n snoozeOptions = DEFAULT_SNOOZE_OPTIONS,\n testId,\n readOnly = false,\n expanded: controlledExpanded,\n onExpandedChange,\n },\n ref,\n ) => {\n const [localExpanded, setLocalExpanded] = React.useState(false);\n const expanded = controlledExpanded ?? localExpanded;\n const setExpanded = onExpandedChange ?? setLocalExpanded;\n\n const [factors, setFactors] = React.useState({\n impact: task.impact || 5,\n effort: task.effort || 5,\n risk: task.risk || 0,\n });\n\n const score = task.score ?? 0;\n const isOverdue = task.due_date && new Date(task.due_date) < new Date();\n\n const handleFactorChange = (field: 'impact' | 'effort' | 'risk', value: number) => {\n const newFactors = { ...factors, [field]: value };\n setFactors(newFactors);\n onFactorsUpdate?.(newFactors);\n };\n\n return (\n <Card\n ref={ref}\n data-slot='priority-card'\n data-testid={testId}\n data-rank={rank}\n data-score={score}\n className={cn(\n 'transition-all duration-200',\n getScoreBg(score),\n rank === 1 &&\n 'ring-2 ring-primary shadow-md bg-gradient-to-r from-primary/5 to-transparent',\n onClick && 'cursor-pointer hover:shadow-md',\n )}\n onClick={onClick}\n >\n <CardHeader className='p-3 pb-2'>\n <div className='flex items-start gap-3'>\n {/* ランク */}\n <div\n data-slot='priority-rank'\n className={cn(\n 'flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold',\n rank === 1\n ? 'bg-primary text-primary-foreground'\n : rank <= 3\n ? 'bg-muted text-foreground'\n : 'bg-muted/50 text-muted-foreground',\n )}\n >\n {rank}\n </div>\n\n {/* コンテンツ */}\n <div className='flex-1 min-w-0'>\n <div className='flex items-center justify-between gap-2 mb-1'>\n {/* プロジェクト */}\n {task.project?.name && (\n <Badge\n variant='outline'\n className='text-[10px] px-1.5 py-0 font-normal shrink-0'\n style={{\n borderColor: task.project.color,\n color: task.project.color,\n }}\n >\n {task.project.name}\n </Badge>\n )}\n\n {/* スコア */}\n <div\n data-slot='priority-score'\n className={cn('flex items-center gap-1 text-sm font-bold', getScoreColor(score))}\n >\n <Zap className='w-3 h-3' />\n {score.toFixed(1)}\n </div>\n </div>\n\n <CardTitle className='text-sm font-medium leading-snug line-clamp-2'>\n {task.title}\n </CardTitle>\n\n {/* メタ情報 */}\n <div className='flex items-center gap-2 mt-2 text-xs text-muted-foreground'>\n {task.due_date && (\n <span\n className={cn(\n 'flex items-center gap-0.5',\n isOverdue && 'text-destructive font-medium',\n )}\n >\n <Clock className='w-3 h-3' />\n {formatDistanceToNow(new Date(task.due_date), {\n addSuffix: true,\n })}\n </span>\n )}\n {task.assignee && (\n <Avatar className='h-4 w-4'>\n {task.assignee.avatar && <AvatarImage src={task.assignee.avatar} />}\n <AvatarFallback className='text-[8px]'>\n {task.assignee.name?.[0]}\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n </div>\n\n {/* アクション */}\n {!readOnly && (\n <div\n data-slot='priority-actions'\n className='flex gap-1'\n onClick={(e) => e.stopPropagation()}\n >\n <Button\n size='icon'\n variant='ghost'\n className='h-7 w-7'\n onClick={onComplete}\n testId={testId ? `${testId}-complete` : undefined}\n >\n <Check className='h-4 w-4 text-green-600' />\n </Button>\n\n <DropdownMenu>\n <DropdownMenuTrigger\n className='inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7'\n data-testid={testId ? `${testId}-snooze` : undefined}\n >\n <Pause className='h-4 w-4 text-muted-foreground' />\n </DropdownMenuTrigger>\n <DropdownMenuContent align='end'>\n {snoozeOptions.map((opt) => (\n <DropdownMenuItem key={opt.minutes} onClick={() => onSnooze?.(opt.minutes)}>\n {opt.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </div>\n </CardHeader>\n\n {/* ファクターエディター */}\n {!readOnly && onFactorsUpdate && (\n <Collapsible open={expanded} onOpenChange={setExpanded}>\n <CollapsibleTrigger\n className='w-full h-6 flex items-center justify-center text-xs text-muted-foreground hover:bg-muted/50 transition-colors'\n data-testid={testId ? `${testId}-expand` : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n <Sparkles className='w-3 h-3 mr-1' />\n Adjust Factors\n {expanded ? (\n <ChevronUp className='w-3 h-3 ml-1' />\n ) : (\n <ChevronDown className='w-3 h-3 ml-1' />\n )}\n </CollapsibleTrigger>\n <CollapsibleContent>\n <CardContent\n data-slot='priority-factors'\n className='p-3 pt-2 space-y-3 border-t'\n onClick={(e) => e.stopPropagation()}\n >\n {/* Impact */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Impact</span>\n <span className='font-medium'>{factors.impact}</span>\n </div>\n <Slider\n value={[factors.impact]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('impact', v as number);\n }}\n />\n </div>\n\n {/* Effort */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Effort</span>\n <span className='font-medium'>{factors.effort}</span>\n </div>\n <Slider\n value={[factors.effort]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('effort', v as number);\n }}\n />\n </div>\n\n {/* Risk */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Risk</span>\n <span className='font-medium'>{factors.risk}</span>\n </div>\n <Slider\n value={[factors.risk]}\n min={0}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('risk', v as number);\n }}\n />\n </div>\n </CardContent>\n </CollapsibleContent>\n </Collapsible>\n )}\n </Card>\n );\n },\n);\n\nPriorityCard.displayName = 'PriorityCard';\n"],"mappings":"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"}
1
+ {"version":3,"file":"PriorityCard.cjs","names":["React","DEFAULT_SNOOZE_OPTIONS","Card","cn","CardHeader","Badge","Zap","CardTitle","Clock","formatDistanceToNow","Avatar","AvatarImage","AvatarFallback","Button","Check","DropdownMenu","DropdownMenuTrigger","Pause","DropdownMenuContent","DropdownMenuItem","Collapsible","CollapsibleTrigger","Sparkles","ChevronUp","ChevronDown","CollapsibleContent","CardContent","Slider","require_runtime","require_ui_lib_utils","require_ui_components_ui_button_components","require_ui_components_ui_avatar","require_ui_components_ui_badge_components","require_ui_components_ui_card","require_ui_components_ui_collapsible","require_ui_components_ui_dropdown_menu","require_ui_components_ui_slider","require_tools_components_priority_queue_types","react_jsx_runtime","react","lucide_react","date_fns","getScoreColor","score","getScoreBg","PriorityCard","controlledExpanded","localExpanded","setLocalExpanded","expanded","setExpanded","onExpandedChange","factors","setFactors","task","isOverdue","handleFactorChange","newFactors","field","value","onFactorsUpdate","testId","rank","onClick","readOnly","onComplete","snoozeOptions","onSnooze","opt","v","val"],"sources":["../../../../src/tools/components/priority-queue/PriorityCard.tsx"],"sourcesContent":["/**\n * Priority Card Component\n *\n * Focus Mode 用の優先度タスクカード\n */\n\nimport * as React from 'react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { Check, ChevronDown, ChevronUp, Clock, Pause, Sparkles, Zap } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { Button } from '../ui/button';\nimport { Slider } from '../ui/slider';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';\nimport type { PriorityCardProps } from './types';\nimport { DEFAULT_SNOOZE_OPTIONS } from './types';\n\n/**\n * スコアに応じた色クラス\n */\nfunction getScoreColor(score: number): string {\n if (score >= 15) return 'text-destructive';\n if (score >= 10) return 'text-orange-700 dark:text-orange-400';\n if (score >= 5) return 'text-yellow-800 dark:text-yellow-400';\n return 'text-muted-foreground';\n}\n\n/**\n * スコアに応じた背景\n */\nfunction getScoreBg(score: number): string {\n if (score >= 15) return 'bg-destructive/5';\n if (score >= 10) return 'bg-orange-50/50 dark:bg-orange-950/10';\n return '';\n}\n\n/**\n * 優先度カード\n */\nexport const PriorityCard = React.forwardRef<HTMLDivElement, PriorityCardProps>(\n (\n {\n task,\n rank,\n onClick,\n onComplete,\n onSnooze,\n onFactorsUpdate,\n snoozeOptions = DEFAULT_SNOOZE_OPTIONS,\n testId,\n readOnly = false,\n expanded: controlledExpanded,\n onExpandedChange,\n },\n ref,\n ) => {\n const [localExpanded, setLocalExpanded] = React.useState(false);\n const expanded = controlledExpanded ?? localExpanded;\n const setExpanded = onExpandedChange ?? setLocalExpanded;\n\n const [factors, setFactors] = React.useState({\n impact: task.impact || 5,\n effort: task.effort || 5,\n risk: task.risk || 0,\n });\n\n const score = task.score ?? 0;\n const isOverdue = task.due_date && new Date(task.due_date) < new Date();\n\n const handleFactorChange = (field: 'impact' | 'effort' | 'risk', value: number) => {\n const newFactors = { ...factors, [field]: value };\n setFactors(newFactors);\n onFactorsUpdate?.(newFactors);\n };\n\n return (\n <Card\n ref={ref}\n data-slot='priority-card'\n data-testid={testId}\n data-rank={rank}\n data-score={score}\n className={cn(\n 'transition-all duration-200',\n getScoreBg(score),\n rank === 1 &&\n 'ring-2 ring-primary shadow-md bg-gradient-to-r from-primary/5 to-transparent',\n onClick && 'cursor-pointer hover:shadow-md',\n )}\n onClick={onClick}\n >\n <CardHeader className='p-3 pb-2'>\n <div className='flex items-start gap-3'>\n {/* ランク */}\n <div\n data-slot='priority-rank'\n className={cn(\n 'flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold',\n rank === 1\n ? 'bg-primary text-primary-foreground'\n : rank <= 3\n ? 'bg-muted text-foreground'\n : 'bg-muted/50 text-muted-foreground',\n )}\n >\n {rank}\n </div>\n\n {/* コンテンツ */}\n <div className='flex-1 min-w-0'>\n <div className='flex items-center justify-between gap-2 mb-1'>\n {/* プロジェクト */}\n {task.project?.name && (\n <Badge\n variant='outline'\n className='text-[10px] px-1.5 py-0 font-normal shrink-0'\n style={{\n borderColor: task.project.color,\n color: task.project.color,\n }}\n >\n {task.project.name}\n </Badge>\n )}\n\n {/* スコア */}\n <div\n data-slot='priority-score'\n className={cn('flex items-center gap-1 text-sm font-bold', getScoreColor(score))}\n >\n <Zap className='w-3 h-3' />\n {score.toFixed(1)}\n </div>\n </div>\n\n <CardTitle className='text-sm font-medium leading-snug line-clamp-2'>\n {task.title}\n </CardTitle>\n\n {/* メタ情報 */}\n <div className='flex items-center gap-2 mt-2 text-xs text-muted-foreground'>\n {task.due_date && (\n <span\n className={cn(\n 'flex items-center gap-0.5',\n isOverdue && 'text-destructive font-medium',\n )}\n >\n <Clock className='w-3 h-3' />\n {formatDistanceToNow(new Date(task.due_date), {\n addSuffix: true,\n })}\n </span>\n )}\n {task.assignee && (\n <Avatar className='h-4 w-4'>\n {task.assignee.avatar && <AvatarImage src={task.assignee.avatar} />}\n <AvatarFallback className='text-[8px]'>\n {task.assignee.name?.[0]}\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n </div>\n\n {/* アクション */}\n {!readOnly && (\n <div\n data-slot='priority-actions'\n className='flex gap-1'\n onClick={(e) => e.stopPropagation()}\n >\n <Button\n size='icon'\n variant='ghost'\n className='h-7 w-7'\n aria-label={`Complete ${task.title}`}\n onClick={onComplete}\n testId={testId ? `${testId}-complete` : undefined}\n >\n <Check className='h-4 w-4 text-green-600' />\n </Button>\n\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`Snooze ${task.title}`}\n className='inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7'\n data-testid={testId ? `${testId}-snooze` : undefined}\n >\n <Pause className='h-4 w-4 text-muted-foreground' />\n </DropdownMenuTrigger>\n <DropdownMenuContent align='end'>\n {snoozeOptions.map((opt) => (\n <DropdownMenuItem key={opt.minutes} onClick={() => onSnooze?.(opt.minutes)}>\n {opt.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </div>\n </CardHeader>\n\n {/* ファクターエディター */}\n {!readOnly && onFactorsUpdate && (\n <Collapsible open={expanded} onOpenChange={setExpanded}>\n <CollapsibleTrigger\n className='w-full h-6 flex items-center justify-center text-xs text-muted-foreground hover:bg-muted/50 transition-colors'\n data-testid={testId ? `${testId}-expand` : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n <Sparkles className='w-3 h-3 mr-1' />\n Adjust Factors\n {expanded ? (\n <ChevronUp className='w-3 h-3 ml-1' />\n ) : (\n <ChevronDown className='w-3 h-3 ml-1' />\n )}\n </CollapsibleTrigger>\n <CollapsibleContent>\n <CardContent\n data-slot='priority-factors'\n className='p-3 pt-2 space-y-3 border-t'\n onClick={(e) => e.stopPropagation()}\n >\n {/* Impact */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Impact</span>\n <span className='font-medium'>{factors.impact}</span>\n </div>\n <Slider\n value={[factors.impact]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('impact', v as number);\n }}\n />\n </div>\n\n {/* Effort */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Effort</span>\n <span className='font-medium'>{factors.effort}</span>\n </div>\n <Slider\n value={[factors.effort]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('effort', v as number);\n }}\n />\n </div>\n\n {/* Risk */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Risk</span>\n <span className='font-medium'>{factors.risk}</span>\n </div>\n <Slider\n value={[factors.risk]}\n min={0}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('risk', v as number);\n }}\n />\n </div>\n </CardContent>\n </CollapsibleContent>\n </Collapsible>\n )}\n </Card>\n );\n },\n);\n\nPriorityCard.displayName = 'PriorityCard';\n"],"mappings":"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"}
@@ -14,7 +14,7 @@ import { Check as S, ChevronDown as C, ChevronUp as w, Clock as T, Pause as E, S
14
14
  import { formatDistanceToNow as k } from "date-fns";
15
15
  //#region src/tools/components/priority-queue/PriorityCard.tsx
16
16
  function A(e) {
17
- return e >= 15 ? "text-destructive" : e >= 10 ? "text-orange-600 dark:text-orange-400" : e >= 5 ? "text-yellow-600 dark:text-yellow-400" : "text-muted-foreground";
17
+ return e >= 15 ? "text-destructive" : e >= 10 ? "text-orange-700 dark:text-orange-400" : e >= 5 ? "text-yellow-800 dark:text-yellow-400" : "text-muted-foreground";
18
18
  }
19
19
  function j(e) {
20
20
  return e >= 15 ? "bg-destructive/5" : e >= 10 ? "bg-orange-50/50 dark:bg-orange-950/10" : "";
@@ -95,10 +95,12 @@ var M = x.forwardRef(({ task: M, rank: N, onClick: P, onComplete: F, onSnooze: I
95
95
  size: "icon",
96
96
  variant: "ghost",
97
97
  className: "h-7 w-7",
98
+ "aria-label": `Complete ${M.title}`,
98
99
  onClick: F,
99
100
  testId: z ? `${z}-complete` : void 0,
100
101
  children: /* @__PURE__ */ y(S, { className: "h-4 w-4 text-green-600" })
101
102
  }), /* @__PURE__ */ b(p, { children: [/* @__PURE__ */ y(g, {
103
+ "aria-label": `Snooze ${M.title}`,
102
104
  className: "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7",
103
105
  "data-testid": z ? `${z}-snooze` : void 0,
104
106
  children: /* @__PURE__ */ y(E, { className: "h-4 w-4 text-muted-foreground" })
@@ -1 +1 @@
1
- {"version":3,"file":"PriorityCard.js","names":["React","React$1","getScoreColor","score","getScoreBg","PriorityCard","DEFAULT_SNOOZE_OPTIONS","controlledExpanded","localExpanded","setLocalExpanded","expanded","setExpanded","onExpandedChange","factors","setFactors","task","isOverdue","handleFactorChange","newFactors","field","value","onFactorsUpdate","Card","testId","rank","cn","onClick","CardHeader","Badge","Zap","CardTitle","Clock","formatDistanceToNow","Avatar","AvatarImage","AvatarFallback","readOnly","Button","onComplete","Check","DropdownMenu","DropdownMenuTrigger","Pause","DropdownMenuContent","snoozeOptions","DropdownMenuItem","onSnooze","opt","Collapsible","CollapsibleTrigger","Sparkles","jsx","ChevronUp","ChevronDown","CollapsibleContent","CardContent","Slider","v","val"],"sources":["../../../../src/tools/components/priority-queue/PriorityCard.tsx"],"sourcesContent":["/**\n * Priority Card Component\n *\n * Focus Mode 用の優先度タスクカード\n */\n\nimport * as React from 'react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { Check, ChevronDown, ChevronUp, Clock, Pause, Sparkles, Zap } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { Button } from '../ui/button';\nimport { Slider } from '../ui/slider';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';\nimport type { PriorityCardProps } from './types';\nimport { DEFAULT_SNOOZE_OPTIONS } from './types';\n\n/**\n * スコアに応じた色クラス\n */\nfunction getScoreColor(score: number): string {\n if (score >= 15) return 'text-destructive';\n if (score >= 10) return 'text-orange-600 dark:text-orange-400';\n if (score >= 5) return 'text-yellow-600 dark:text-yellow-400';\n return 'text-muted-foreground';\n}\n\n/**\n * スコアに応じた背景\n */\nfunction getScoreBg(score: number): string {\n if (score >= 15) return 'bg-destructive/5';\n if (score >= 10) return 'bg-orange-50/50 dark:bg-orange-950/10';\n return '';\n}\n\n/**\n * 優先度カード\n */\nexport const PriorityCard = React.forwardRef<HTMLDivElement, PriorityCardProps>(\n (\n {\n task,\n rank,\n onClick,\n onComplete,\n onSnooze,\n onFactorsUpdate,\n snoozeOptions = DEFAULT_SNOOZE_OPTIONS,\n testId,\n readOnly = false,\n expanded: controlledExpanded,\n onExpandedChange,\n },\n ref,\n ) => {\n const [localExpanded, setLocalExpanded] = React.useState(false);\n const expanded = controlledExpanded ?? localExpanded;\n const setExpanded = onExpandedChange ?? setLocalExpanded;\n\n const [factors, setFactors] = React.useState({\n impact: task.impact || 5,\n effort: task.effort || 5,\n risk: task.risk || 0,\n });\n\n const score = task.score ?? 0;\n const isOverdue = task.due_date && new Date(task.due_date) < new Date();\n\n const handleFactorChange = (field: 'impact' | 'effort' | 'risk', value: number) => {\n const newFactors = { ...factors, [field]: value };\n setFactors(newFactors);\n onFactorsUpdate?.(newFactors);\n };\n\n return (\n <Card\n ref={ref}\n data-slot='priority-card'\n data-testid={testId}\n data-rank={rank}\n data-score={score}\n className={cn(\n 'transition-all duration-200',\n getScoreBg(score),\n rank === 1 &&\n 'ring-2 ring-primary shadow-md bg-gradient-to-r from-primary/5 to-transparent',\n onClick && 'cursor-pointer hover:shadow-md',\n )}\n onClick={onClick}\n >\n <CardHeader className='p-3 pb-2'>\n <div className='flex items-start gap-3'>\n {/* ランク */}\n <div\n data-slot='priority-rank'\n className={cn(\n 'flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold',\n rank === 1\n ? 'bg-primary text-primary-foreground'\n : rank <= 3\n ? 'bg-muted text-foreground'\n : 'bg-muted/50 text-muted-foreground',\n )}\n >\n {rank}\n </div>\n\n {/* コンテンツ */}\n <div className='flex-1 min-w-0'>\n <div className='flex items-center justify-between gap-2 mb-1'>\n {/* プロジェクト */}\n {task.project?.name && (\n <Badge\n variant='outline'\n className='text-[10px] px-1.5 py-0 font-normal shrink-0'\n style={{\n borderColor: task.project.color,\n color: task.project.color,\n }}\n >\n {task.project.name}\n </Badge>\n )}\n\n {/* スコア */}\n <div\n data-slot='priority-score'\n className={cn('flex items-center gap-1 text-sm font-bold', getScoreColor(score))}\n >\n <Zap className='w-3 h-3' />\n {score.toFixed(1)}\n </div>\n </div>\n\n <CardTitle className='text-sm font-medium leading-snug line-clamp-2'>\n {task.title}\n </CardTitle>\n\n {/* メタ情報 */}\n <div className='flex items-center gap-2 mt-2 text-xs text-muted-foreground'>\n {task.due_date && (\n <span\n className={cn(\n 'flex items-center gap-0.5',\n isOverdue && 'text-destructive font-medium',\n )}\n >\n <Clock className='w-3 h-3' />\n {formatDistanceToNow(new Date(task.due_date), {\n addSuffix: true,\n })}\n </span>\n )}\n {task.assignee && (\n <Avatar className='h-4 w-4'>\n {task.assignee.avatar && <AvatarImage src={task.assignee.avatar} />}\n <AvatarFallback className='text-[8px]'>\n {task.assignee.name?.[0]}\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n </div>\n\n {/* アクション */}\n {!readOnly && (\n <div\n data-slot='priority-actions'\n className='flex gap-1'\n onClick={(e) => e.stopPropagation()}\n >\n <Button\n size='icon'\n variant='ghost'\n className='h-7 w-7'\n onClick={onComplete}\n testId={testId ? `${testId}-complete` : undefined}\n >\n <Check className='h-4 w-4 text-green-600' />\n </Button>\n\n <DropdownMenu>\n <DropdownMenuTrigger\n className='inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7'\n data-testid={testId ? `${testId}-snooze` : undefined}\n >\n <Pause className='h-4 w-4 text-muted-foreground' />\n </DropdownMenuTrigger>\n <DropdownMenuContent align='end'>\n {snoozeOptions.map((opt) => (\n <DropdownMenuItem key={opt.minutes} onClick={() => onSnooze?.(opt.minutes)}>\n {opt.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </div>\n </CardHeader>\n\n {/* ファクターエディター */}\n {!readOnly && onFactorsUpdate && (\n <Collapsible open={expanded} onOpenChange={setExpanded}>\n <CollapsibleTrigger\n className='w-full h-6 flex items-center justify-center text-xs text-muted-foreground hover:bg-muted/50 transition-colors'\n data-testid={testId ? `${testId}-expand` : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n <Sparkles className='w-3 h-3 mr-1' />\n Adjust Factors\n {expanded ? (\n <ChevronUp className='w-3 h-3 ml-1' />\n ) : (\n <ChevronDown className='w-3 h-3 ml-1' />\n )}\n </CollapsibleTrigger>\n <CollapsibleContent>\n <CardContent\n data-slot='priority-factors'\n className='p-3 pt-2 space-y-3 border-t'\n onClick={(e) => e.stopPropagation()}\n >\n {/* Impact */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Impact</span>\n <span className='font-medium'>{factors.impact}</span>\n </div>\n <Slider\n value={[factors.impact]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('impact', v as number);\n }}\n />\n </div>\n\n {/* Effort */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Effort</span>\n <span className='font-medium'>{factors.effort}</span>\n </div>\n <Slider\n value={[factors.effort]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('effort', v as number);\n }}\n />\n </div>\n\n {/* Risk */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Risk</span>\n <span className='font-medium'>{factors.risk}</span>\n </div>\n <Slider\n value={[factors.risk]}\n min={0}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('risk', v as number);\n }}\n />\n </div>\n </CardContent>\n </CollapsibleContent>\n </Collapsible>\n )}\n </Card>\n );\n },\n);\n\nPriorityCard.displayName = 'PriorityCard';\n"],"mappings":"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"}
1
+ {"version":3,"file":"PriorityCard.js","names":["React","React$1","getScoreColor","score","getScoreBg","PriorityCard","DEFAULT_SNOOZE_OPTIONS","controlledExpanded","localExpanded","setLocalExpanded","expanded","setExpanded","onExpandedChange","factors","setFactors","task","isOverdue","handleFactorChange","newFactors","field","value","onFactorsUpdate","Card","testId","rank","cn","onClick","CardHeader","Badge","Zap","CardTitle","Clock","formatDistanceToNow","Avatar","AvatarImage","AvatarFallback","readOnly","Button","onComplete","Check","DropdownMenu","DropdownMenuTrigger","Pause","DropdownMenuContent","snoozeOptions","DropdownMenuItem","onSnooze","opt","Collapsible","CollapsibleTrigger","Sparkles","jsx","ChevronUp","ChevronDown","CollapsibleContent","CardContent","Slider","v","val"],"sources":["../../../../src/tools/components/priority-queue/PriorityCard.tsx"],"sourcesContent":["/**\n * Priority Card Component\n *\n * Focus Mode 用の優先度タスクカード\n */\n\nimport * as React from 'react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { Check, ChevronDown, ChevronUp, Clock, Pause, Sparkles, Zap } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\nimport { Badge } from '../ui/badge';\nimport { Button } from '../ui/button';\nimport { Slider } from '../ui/slider';\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';\nimport type { PriorityCardProps } from './types';\nimport { DEFAULT_SNOOZE_OPTIONS } from './types';\n\n/**\n * スコアに応じた色クラス\n */\nfunction getScoreColor(score: number): string {\n if (score >= 15) return 'text-destructive';\n if (score >= 10) return 'text-orange-700 dark:text-orange-400';\n if (score >= 5) return 'text-yellow-800 dark:text-yellow-400';\n return 'text-muted-foreground';\n}\n\n/**\n * スコアに応じた背景\n */\nfunction getScoreBg(score: number): string {\n if (score >= 15) return 'bg-destructive/5';\n if (score >= 10) return 'bg-orange-50/50 dark:bg-orange-950/10';\n return '';\n}\n\n/**\n * 優先度カード\n */\nexport const PriorityCard = React.forwardRef<HTMLDivElement, PriorityCardProps>(\n (\n {\n task,\n rank,\n onClick,\n onComplete,\n onSnooze,\n onFactorsUpdate,\n snoozeOptions = DEFAULT_SNOOZE_OPTIONS,\n testId,\n readOnly = false,\n expanded: controlledExpanded,\n onExpandedChange,\n },\n ref,\n ) => {\n const [localExpanded, setLocalExpanded] = React.useState(false);\n const expanded = controlledExpanded ?? localExpanded;\n const setExpanded = onExpandedChange ?? setLocalExpanded;\n\n const [factors, setFactors] = React.useState({\n impact: task.impact || 5,\n effort: task.effort || 5,\n risk: task.risk || 0,\n });\n\n const score = task.score ?? 0;\n const isOverdue = task.due_date && new Date(task.due_date) < new Date();\n\n const handleFactorChange = (field: 'impact' | 'effort' | 'risk', value: number) => {\n const newFactors = { ...factors, [field]: value };\n setFactors(newFactors);\n onFactorsUpdate?.(newFactors);\n };\n\n return (\n <Card\n ref={ref}\n data-slot='priority-card'\n data-testid={testId}\n data-rank={rank}\n data-score={score}\n className={cn(\n 'transition-all duration-200',\n getScoreBg(score),\n rank === 1 &&\n 'ring-2 ring-primary shadow-md bg-gradient-to-r from-primary/5 to-transparent',\n onClick && 'cursor-pointer hover:shadow-md',\n )}\n onClick={onClick}\n >\n <CardHeader className='p-3 pb-2'>\n <div className='flex items-start gap-3'>\n {/* ランク */}\n <div\n data-slot='priority-rank'\n className={cn(\n 'flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold',\n rank === 1\n ? 'bg-primary text-primary-foreground'\n : rank <= 3\n ? 'bg-muted text-foreground'\n : 'bg-muted/50 text-muted-foreground',\n )}\n >\n {rank}\n </div>\n\n {/* コンテンツ */}\n <div className='flex-1 min-w-0'>\n <div className='flex items-center justify-between gap-2 mb-1'>\n {/* プロジェクト */}\n {task.project?.name && (\n <Badge\n variant='outline'\n className='text-[10px] px-1.5 py-0 font-normal shrink-0'\n style={{\n borderColor: task.project.color,\n color: task.project.color,\n }}\n >\n {task.project.name}\n </Badge>\n )}\n\n {/* スコア */}\n <div\n data-slot='priority-score'\n className={cn('flex items-center gap-1 text-sm font-bold', getScoreColor(score))}\n >\n <Zap className='w-3 h-3' />\n {score.toFixed(1)}\n </div>\n </div>\n\n <CardTitle className='text-sm font-medium leading-snug line-clamp-2'>\n {task.title}\n </CardTitle>\n\n {/* メタ情報 */}\n <div className='flex items-center gap-2 mt-2 text-xs text-muted-foreground'>\n {task.due_date && (\n <span\n className={cn(\n 'flex items-center gap-0.5',\n isOverdue && 'text-destructive font-medium',\n )}\n >\n <Clock className='w-3 h-3' />\n {formatDistanceToNow(new Date(task.due_date), {\n addSuffix: true,\n })}\n </span>\n )}\n {task.assignee && (\n <Avatar className='h-4 w-4'>\n {task.assignee.avatar && <AvatarImage src={task.assignee.avatar} />}\n <AvatarFallback className='text-[8px]'>\n {task.assignee.name?.[0]}\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n </div>\n\n {/* アクション */}\n {!readOnly && (\n <div\n data-slot='priority-actions'\n className='flex gap-1'\n onClick={(e) => e.stopPropagation()}\n >\n <Button\n size='icon'\n variant='ghost'\n className='h-7 w-7'\n aria-label={`Complete ${task.title}`}\n onClick={onComplete}\n testId={testId ? `${testId}-complete` : undefined}\n >\n <Check className='h-4 w-4 text-green-600' />\n </Button>\n\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`Snooze ${task.title}`}\n className='inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-7 w-7'\n data-testid={testId ? `${testId}-snooze` : undefined}\n >\n <Pause className='h-4 w-4 text-muted-foreground' />\n </DropdownMenuTrigger>\n <DropdownMenuContent align='end'>\n {snoozeOptions.map((opt) => (\n <DropdownMenuItem key={opt.minutes} onClick={() => onSnooze?.(opt.minutes)}>\n {opt.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </div>\n </CardHeader>\n\n {/* ファクターエディター */}\n {!readOnly && onFactorsUpdate && (\n <Collapsible open={expanded} onOpenChange={setExpanded}>\n <CollapsibleTrigger\n className='w-full h-6 flex items-center justify-center text-xs text-muted-foreground hover:bg-muted/50 transition-colors'\n data-testid={testId ? `${testId}-expand` : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n <Sparkles className='w-3 h-3 mr-1' />\n Adjust Factors\n {expanded ? (\n <ChevronUp className='w-3 h-3 ml-1' />\n ) : (\n <ChevronDown className='w-3 h-3 ml-1' />\n )}\n </CollapsibleTrigger>\n <CollapsibleContent>\n <CardContent\n data-slot='priority-factors'\n className='p-3 pt-2 space-y-3 border-t'\n onClick={(e) => e.stopPropagation()}\n >\n {/* Impact */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Impact</span>\n <span className='font-medium'>{factors.impact}</span>\n </div>\n <Slider\n value={[factors.impact]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('impact', v as number);\n }}\n />\n </div>\n\n {/* Effort */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Effort</span>\n <span className='font-medium'>{factors.effort}</span>\n </div>\n <Slider\n value={[factors.effort]}\n min={1}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('effort', v as number);\n }}\n />\n </div>\n\n {/* Risk */}\n <div className='space-y-1'>\n <div className='flex justify-between text-xs'>\n <span className='text-muted-foreground'>Risk</span>\n <span className='font-medium'>{factors.risk}</span>\n </div>\n <Slider\n value={[factors.risk]}\n min={0}\n max={10}\n step={1}\n onValueChange={(val) => {\n const v = Array.isArray(val) ? val[0] : val;\n handleFactorChange('risk', v as number);\n }}\n />\n </div>\n </CardContent>\n </CollapsibleContent>\n </Collapsible>\n )}\n </Card>\n );\n },\n);\n\nPriorityCard.displayName = 'PriorityCard';\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SmartSidebar.cjs","names":["useTheme","TooltipProvider","cn","Button","PanelLeft","ScrollArea","React","Separator","Tooltip","TooltipTrigger","buttonVariants","TooltipContent","require_runtime","require_ui_lib_utils","require_ui_components_ui_button_variants","require_ui_components_ui_button_components","require_ui_components_ui_separator","require_ui_components_ui_scroll_area","require_ui_components_ui_tooltip","require_ui_components_theme_theme_context","react_jsx_runtime","react","lucide_react","sidebarDensity","SmartSidebar","density","spacingTheme","handleNavigate","onNavigate","path","collapsed","className","header","onToggleCollapse","groups","SidebarGroupSection","index","footerItems","SidebarItemRow","activePath","item","sidebarFooter","groupCollapsed","setGroupCollapsed","group","isGroupCollapsible","toggleGroup","prev","visibleItems","isActive","itemHeight"],"sources":["../../../../src/tools/components/sidebar/SmartSidebar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from \"../../lib/utils\";\nimport { Button, buttonVariants } from '../ui/button';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Separator } from '../ui/separator';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport { PanelLeft } from 'lucide-react';\nimport { useTheme, type SpacingTheme } from '../theme/theme-context';\n\nconst sidebarDensity: Record<SpacingTheme, {\n groupGap: string;\n itemGap: string;\n itemHeight: string;\n}> = {\n compact: { groupGap: 'gap-1', itemGap: 'gap-0', itemHeight: 'h-8' },\n normal: { groupGap: 'gap-2', itemGap: 'gap-1', itemHeight: 'h-9' },\n comfortable: { groupGap: 'gap-4', itemGap: 'gap-2', itemHeight: 'h-11' },\n};\n\n/**\n * サイドバーのアイテム\n */\nexport interface SmartSidebarItem {\n /** ラベル */\n label: string;\n /** アイコン */\n icon: React.ReactNode;\n /** パス */\n path: string;\n /** 無効化 */\n disabled?: boolean;\n /** バッジ等の追加コンテンツ */\n extra?: React.ReactNode;\n}\n\n/**\n * サイドバーのグループ\n */\nexport interface SmartSidebarGroup {\n /** グループタイトル */\n title?: string;\n /** アイテム */\n items: SmartSidebarItem[];\n /** 折りたたみ可能か */\n collapsible?: boolean;\n /** 初期状態で折りたたまれているか */\n defaultCollapsed?: boolean;\n}\n\n/**\n * サイドバーのプロップス\n */\nexport interface SidebarProps {\n /** 追加CSS */\n className?: string;\n /** ナビゲーショングループ */\n groups: SmartSidebarGroup[];\n /** フッターアイテム */\n footerItems?: SmartSidebarItem[];\n /** 現在のパス */\n activePath?: string;\n /** ナビゲーション発火 */\n onNavigate?: (path: string) => void;\n /** 折りたたみ状態 */\n collapsed?: boolean;\n /** 折りたたみトグル */\n onToggleCollapse?: () => void;\n /** カスタムヘッダー */\n header?: (collapsed: boolean) => React.ReactNode;\n /** カスタムフッター */\n sidebarFooter?: (collapsed: boolean) => React.ReactNode;\n}\n\n/**\n * サイドバーコンポーネント\n *\n * 折りたたみ可能なナビゲーションサイドバー。\n * グループ化されたアイテム、アイコン、ツールチップに対応。\n *\n * @example\n * ```tsx\n * import { Sidebar } from '@alneas/appkit-react/tools/sidebar';\n * import { Home, Settings } from 'lucide-react';\n *\n * const groups = [\n * {\n * title: 'メイン',\n * items: [\n * { label: 'ホーム', icon: <Home />, path: '/' },\n * { label: '設定', icon: <Settings />, path: '/settings' },\n * ],\n * },\n * ];\n *\n * <Sidebar\n * groups={groups}\n * activePath={location.pathname}\n * onNavigate={(path) => navigate(path)}\n * collapsed={isCollapsed}\n * onToggleCollapse={() => setIsCollapsed(!isCollapsed)}\n * />\n * ```\n */\nexport function SmartSidebar({\n className,\n groups,\n footerItems,\n activePath,\n onNavigate,\n collapsed = false,\n onToggleCollapse,\n header,\n sidebarFooter,\n}: SidebarProps) {\n const { spacingTheme } = useTheme();\n const density = sidebarDensity[spacingTheme];\n const handleNavigate = (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n }\n };\n\n // Determine width based on collapsed state\n // w-64 (16rem) -> expanded\n // w-16 (4rem) -> collapsed\n // You can adjust these values or make them configurable if needed\n const widthClass = collapsed\n ? 'w-[var(--sidebar-collapsed-width,4rem)]'\n : 'w-[var(--sidebar-width,16rem)]';\n\n return (\n <TooltipProvider>\n <div\n className={cn(\n 'flex flex-col h-full bg-muted/20 border-r border-border transition-all duration-300 ease-in-out',\n widthClass,\n className,\n )}\n >\n {/* Combined Header and Toggle Section */}\n <div\n className={cn(\n 'flex-none flex items-center h-14 px-3 gap-2',\n collapsed ? 'justify-center' : 'justify-between',\n )}\n >\n {/* Custom Header Content */}\n {header && (\n <div\n className={cn(\n 'overflow-hidden whitespace-nowrap transition-all duration-300 ease-in-out',\n collapsed && onToggleCollapse\n ? 'max-w-0 opacity-0 flex-none'\n : 'max-w-full flex-1 opacity-100',\n )}\n >\n {header(collapsed)}\n </div>\n )}\n\n {/* Toggle Button */}\n {onToggleCollapse && (\n <Button\n variant='ghost'\n size='icon'\n className='h-8 w-8 shrink-0'\n onClick={onToggleCollapse}\n >\n <PanelLeft size={16} />\n </Button>\n )}\n </div>\n\n <ScrollArea className='flex-1 py-2 min-h-0'>\n <nav className={cn('flex flex-col px-2', density.groupGap)}>\n {groups.map((group, index) => (\n <SidebarGroupSection\n key={index}\n group={group}\n collapsed={collapsed}\n activePath={activePath}\n onNavigate={handleNavigate}\n density={density}\n />\n ))}\n </nav>\n </ScrollArea>\n\n {/* Footer Items Section (Sticky Bottom) */}\n {footerItems && footerItems.length > 0 && (\n <div className='flex-none mt-auto p-2 border-t border-border bg-background/50 backdrop-blur-sm'>\n <ul className={cn('flex flex-col', density.itemGap)}>\n {footerItems.map((item, index) => (\n <SidebarItemRow\n key={index}\n item={item}\n collapsed={collapsed}\n isActive={activePath === item.path}\n onNavigate={handleNavigate}\n itemHeight={density.itemHeight}\n />\n ))}\n </ul>\n </div>\n )}\n\n {/* Custom Footer Section */}\n {sidebarFooter && (\n <div\n className={cn(\n 'flex-none p-4 border-t border-border bg-background/50 backdrop-blur-sm',\n collapsed ? 'flex justify-center' : '',\n )}\n >\n {sidebarFooter(collapsed)}\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n}\n\nfunction SidebarGroupSection({\n group,\n collapsed,\n activePath,\n onNavigate,\n density,\n}: {\n group: SmartSidebarGroup;\n collapsed: boolean;\n activePath?: string;\n onNavigate: (path: string) => void;\n density: (typeof sidebarDensity)[SpacingTheme];\n}) {\n const [groupCollapsed, setGroupCollapsed] = React.useState(\n group.defaultCollapsed ?? false\n );\n\n const isGroupCollapsible = group.collapsible && !collapsed;\n\n const toggleGroup = React.useCallback(() => {\n if (isGroupCollapsible) setGroupCollapsed(prev => !prev);\n }, [isGroupCollapsible]);\n\n // If no items, don't render group\n if (!group.items?.length) return null;\n\n const visibleItems = isGroupCollapsible && groupCollapsed\n ? group.items.slice(0, 2)\n : group.items;\n\n return (\n <div className={cn('flex flex-col', density.itemGap)}>\n {/* Group Title Area - Fixed Height for smooth transition */}\n {group.title && (\n <div\n className={cn(\n 'h-7 flex items-center relative px-2',\n isGroupCollapsible && 'cursor-pointer hover:text-primary transition-colors',\n )}\n onClick={toggleGroup}\n >\n {/* Title Text */}\n <h4\n className={cn(\n 'text-sm font-semibold text-primary/80 uppercase tracking-wider overflow-hidden text-ellipsis whitespace-nowrap absolute left-2 right-2 transition-all duration-300 ease-in-out',\n collapsed ? 'opacity-0 translate-x-[-10px]' : 'opacity-100 translate-x-0',\n )}\n >\n {group.title}\n {isGroupCollapsible && (\n <span className='ml-1.5 text-xs opacity-60'>\n {groupCollapsed ? '▸' : '▾'}\n </span>\n )}\n </h4>\n\n {/* Collapsed Separator */}\n <div\n className={cn(\n 'absolute left-0 right-0 top-1/2 -translate-y-1/2 flex justify-center transition-all duration-300',\n collapsed ? 'opacity-100' : 'opacity-0',\n )}\n >\n <Separator className='w-8 opacity-50' />\n </div>\n </div>\n )}\n\n <ul className={cn('flex flex-col', density.itemGap)}>\n {visibleItems.map((item, index) => (\n <SidebarItemRow\n key={index}\n item={item}\n collapsed={collapsed}\n isActive={activePath === item.path}\n onNavigate={onNavigate}\n itemHeight={density.itemHeight}\n />\n ))}\n {isGroupCollapsible && groupCollapsed && group.items.length > 2 && (\n <li>\n <button\n onClick={(e) => { e.stopPropagation(); setGroupCollapsed(false); }}\n className='flex w-full items-center justify-center h-8 text-xs text-muted-foreground hover:text-primary transition-colors'\n >\n +{group.items.length - 2} more\n </button>\n </li>\n )}\n </ul>\n </div>\n );\n}\n\nfunction SidebarItemRow({\n item,\n collapsed,\n isActive,\n onNavigate,\n itemHeight,\n}: {\n item: SmartSidebarItem;\n collapsed: boolean;\n isActive: boolean;\n onNavigate: (path: string) => void;\n itemHeight: string;\n}) {\n return (\n <li>\n <Tooltip>\n <TooltipTrigger\n className={cn(\n buttonVariants({ variant: isActive ? 'secondary' : 'ghost' }),\n 'flex w-full items-center transition-all duration-300',\n itemHeight,\n collapsed ? 'justify-center px-1' : 'justify-start px-3',\n isActive && 'bg-primary/10 text-primary font-medium hover:bg-primary/20',\n !isActive && 'text-muted-foreground hover:text-foreground font-normal',\n )}\n onClick={() => onNavigate(item.path)}\n disabled={item.disabled}\n >\n {/* Icon Wrapper */}\n <span\n className={cn(\n 'flex items-center justify-center shrink-0 transition-all duration-300',\n isActive ? 'text-primary' : 'opacity-70',\n )}\n >\n {React.isValidElement(item.icon)\n ? // @ts-expect-error - cloning strictly for size prop if supported\n React.cloneElement(item.icon, { size: 18 })\n : item.icon}\n </span>\n\n {/* Label & Extra Wrapper for smooth transition */}\n <span\n className={cn(\n 'flex flex-1 items-center overflow-hidden transition-all duration-300 ease-in-out',\n collapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100 ml-3',\n )}\n >\n <span className='truncate flex-1 text-left text-sm'>{item.label}</span>\n {item.extra && (\n <span className='shrink-0 text-xs text-muted-foreground ml-2'>{item.extra}</span>\n )}\n </span>\n </TooltipTrigger>\n {collapsed && (\n <TooltipContent side='right' className='flex items-center gap-2'>\n {item.label}\n {item.extra && <span className='opacity-70'>{item.extra}</span>}\n </TooltipContent>\n )}\n </Tooltip>\n </li>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SmartSidebar.cjs","names":["useTheme","TooltipProvider","cn","Button","PanelLeft","ScrollArea","React","Separator","Tooltip","TooltipTrigger","buttonVariants","TooltipContent","require_runtime","require_ui_lib_utils","require_ui_components_ui_button_variants","require_ui_components_ui_button_components","require_ui_components_ui_separator","require_ui_components_ui_scroll_area","require_ui_components_ui_tooltip","require_ui_components_theme_theme_context","react_jsx_runtime","react","lucide_react","sidebarDensity","SmartSidebar","density","spacingTheme","handleNavigate","onNavigate","path","collapsed","className","header","onToggleCollapse","groups","SidebarGroupSection","index","footerItems","SidebarItemRow","activePath","item","sidebarFooter","groupCollapsed","setGroupCollapsed","group","isGroupCollapsible","toggleGroup","prev","visibleItems","isActive","itemHeight"],"sources":["../../../../src/tools/components/sidebar/SmartSidebar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from \"../../lib/utils\";\nimport { Button, buttonVariants } from '../ui/button';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Separator } from '../ui/separator';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport { PanelLeft } from 'lucide-react';\nimport { useTheme, type SpacingTheme } from '../theme/theme-context';\n\nconst sidebarDensity: Record<SpacingTheme, {\n groupGap: string;\n itemGap: string;\n itemHeight: string;\n}> = {\n compact: { groupGap: 'gap-1', itemGap: 'gap-0', itemHeight: 'h-8' },\n normal: { groupGap: 'gap-2', itemGap: 'gap-1', itemHeight: 'h-9' },\n comfortable: { groupGap: 'gap-4', itemGap: 'gap-2', itemHeight: 'h-11' },\n};\n\n/**\n * A navigation item rendered by {@link SmartSidebar}.\n * @see SmartSidebar\n */\nexport interface SmartSidebarItem {\n /** Visible item label; also used in collapsed tooltips. */\n label: string;\n /** Icon rendered in expanded and collapsed layouts. */\n icon: React.ReactNode;\n /** Opaque destination passed to onNavigate; compared exactly with activePath. */\n path: string;\n /** Disables item activation when true; omitted means enabled. */\n disabled?: boolean;\n /** Additional content shown beside the expanded item label. */\n extra?: React.ReactNode;\n}\n\n/**\n * サイドバーのグループ\n */\nexport interface SmartSidebarGroup {\n /** Optional heading; omitted headings render no group title. */\n title?: string;\n /** Items in display order. */\n items: SmartSidebarItem[];\n /** Allows the expanded sidebar heading to toggle between all items and a two-item preview. */\n collapsible?: boolean;\n /** Initial two-item group preview state; defaults to false. Later prop changes do not reset local state. */\n defaultCollapsed?: boolean;\n}\n\n/**\n * サイドバーのプロップス\n */\nexport interface SidebarProps {\n /** Additional classes for the sidebar root. */\n className?: string;\n /** Groups in display order. */\n groups: SmartSidebarGroup[];\n /** Optional navigation items pinned below the scrollable groups. */\n footerItems?: SmartSidebarItem[];\n /** Exact path used to highlight active items; no item is active when omitted. */\n activePath?: string;\n /** Called with the activated item path; the host performs routing. */\n onNavigate?: (path: string) => void;\n /** Controlled whole-sidebar collapse state; defaults to false. */\n collapsed?: boolean;\n /** Called by the toggle button; the host must update collapsed. Omitted hides the button. */\n onToggleCollapse?: () => void;\n /** Renders header content with the current collapsed state. */\n header?: (collapsed: boolean) => React.ReactNode;\n /** Renders footer content with the current collapsed state. */\n sidebarFooter?: (collapsed: boolean) => React.ReactNode;\n}\n\n/**\n * Renders grouped navigation with controlled sidebar collapse and local group collapse.\n * @param props - Navigation items, controlled selection/collapse and render callbacks; see {@link SidebarProps}.\n * @returns The sidebar element, including its own tooltip provider.\n * @remarks Import Appkit CSS. ThemeProvider enables reactive spacing density; without one,\n * the theme context uses normal spacing. The host owns routing\n * and updates activePath/collapsed. Sidebar from the same entry is a compound namespace;\n * use SmartSidebar for this groups-based API. CSS variables --sidebar-width and\n * --sidebar-collapsed-width fall back to 16rem and 4rem respectively.\n * @example\n * ```tsx\n * import { useState } from 'react';\n * import { SmartSidebar } from '@alneas/appkit-react/tools/sidebar';\n * import { ThemeProvider } from '@alneas/appkit-react/ui/theme';\n * import '@alneas/appkit-react/styles';\n *\n * export function Navigation() {\n * const [path, setPath] = useState('/');\n * const [collapsed, setCollapsed] = useState(false);\n * return <ThemeProvider><SmartSidebar\n * groups={[{ title: 'Main', items: [{ label: 'Home', icon: <span>H</span>, path: '/' }] }]}\n * activePath={path} onNavigate={setPath} collapsed={collapsed}\n * onToggleCollapse={() => setCollapsed(value => !value)}\n * /></ThemeProvider>;\n * }\n * ```\n */\nexport function SmartSidebar({\n className,\n groups,\n footerItems,\n activePath,\n onNavigate,\n collapsed = false,\n onToggleCollapse,\n header,\n sidebarFooter,\n}: SidebarProps) {\n const { spacingTheme } = useTheme();\n const density = sidebarDensity[spacingTheme];\n const handleNavigate = (path: string) => {\n if (onNavigate) {\n onNavigate(path);\n }\n };\n\n // Determine width based on collapsed state\n // w-64 (16rem) -> expanded\n // w-16 (4rem) -> collapsed\n // You can adjust these values or make them configurable if needed\n const widthClass = collapsed\n ? 'w-[var(--sidebar-collapsed-width,4rem)]'\n : 'w-[var(--sidebar-width,16rem)]';\n\n return (\n <TooltipProvider>\n <div\n className={cn(\n 'flex flex-col h-full bg-muted/20 border-r border-border transition-all duration-300 ease-in-out',\n widthClass,\n className,\n )}\n >\n {/* Combined Header and Toggle Section */}\n <div\n className={cn(\n 'flex-none flex items-center h-14 px-3 gap-2',\n collapsed ? 'justify-center' : 'justify-between',\n )}\n >\n {/* Custom Header Content */}\n {header && (\n <div\n className={cn(\n 'overflow-hidden whitespace-nowrap transition-all duration-300 ease-in-out',\n collapsed && onToggleCollapse\n ? 'max-w-0 opacity-0 flex-none'\n : 'max-w-full flex-1 opacity-100',\n )}\n >\n {header(collapsed)}\n </div>\n )}\n\n {/* Toggle Button */}\n {onToggleCollapse && (\n <Button\n variant='ghost'\n size='icon'\n className='h-8 w-8 shrink-0'\n onClick={onToggleCollapse}\n >\n <PanelLeft size={16} />\n </Button>\n )}\n </div>\n\n <ScrollArea className='flex-1 py-2 min-h-0'>\n <nav className={cn('flex flex-col px-2', density.groupGap)}>\n {groups.map((group, index) => (\n <SidebarGroupSection\n key={index}\n group={group}\n collapsed={collapsed}\n activePath={activePath}\n onNavigate={handleNavigate}\n density={density}\n />\n ))}\n </nav>\n </ScrollArea>\n\n {/* Footer Items Section (Sticky Bottom) */}\n {footerItems && footerItems.length > 0 && (\n <div className='flex-none mt-auto p-2 border-t border-border bg-background/50 backdrop-blur-sm'>\n <ul className={cn('flex flex-col', density.itemGap)}>\n {footerItems.map((item, index) => (\n <SidebarItemRow\n key={index}\n item={item}\n collapsed={collapsed}\n isActive={activePath === item.path}\n onNavigate={handleNavigate}\n itemHeight={density.itemHeight}\n />\n ))}\n </ul>\n </div>\n )}\n\n {/* Custom Footer Section */}\n {sidebarFooter && (\n <div\n className={cn(\n 'flex-none p-4 border-t border-border bg-background/50 backdrop-blur-sm',\n collapsed ? 'flex justify-center' : '',\n )}\n >\n {sidebarFooter(collapsed)}\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n}\n\nfunction SidebarGroupSection({\n group,\n collapsed,\n activePath,\n onNavigate,\n density,\n}: {\n group: SmartSidebarGroup;\n collapsed: boolean;\n activePath?: string;\n onNavigate: (path: string) => void;\n density: (typeof sidebarDensity)[SpacingTheme];\n}) {\n const [groupCollapsed, setGroupCollapsed] = React.useState(\n group.defaultCollapsed ?? false\n );\n\n const isGroupCollapsible = group.collapsible && !collapsed;\n\n const toggleGroup = React.useCallback(() => {\n if (isGroupCollapsible) setGroupCollapsed(prev => !prev);\n }, [isGroupCollapsible]);\n\n // If no items, don't render group\n if (!group.items?.length) return null;\n\n const visibleItems = isGroupCollapsible && groupCollapsed\n ? group.items.slice(0, 2)\n : group.items;\n\n return (\n <div className={cn('flex flex-col', density.itemGap)}>\n {/* Group Title Area - Fixed Height for smooth transition */}\n {group.title && (\n <div\n className={cn(\n 'h-7 flex items-center relative px-2',\n isGroupCollapsible && 'cursor-pointer hover:text-primary transition-colors',\n )}\n onClick={toggleGroup}\n >\n {/* Title Text */}\n <h4\n className={cn(\n 'text-sm font-semibold text-primary/80 uppercase tracking-wider overflow-hidden text-ellipsis whitespace-nowrap absolute left-2 right-2 transition-all duration-300 ease-in-out',\n collapsed ? 'opacity-0 translate-x-[-10px]' : 'opacity-100 translate-x-0',\n )}\n >\n {group.title}\n {isGroupCollapsible && (\n <span className='ml-1.5 text-xs opacity-60'>\n {groupCollapsed ? '▸' : '▾'}\n </span>\n )}\n </h4>\n\n {/* Collapsed Separator */}\n <div\n className={cn(\n 'absolute left-0 right-0 top-1/2 -translate-y-1/2 flex justify-center transition-all duration-300',\n collapsed ? 'opacity-100' : 'opacity-0',\n )}\n >\n <Separator className='w-8 opacity-50' />\n </div>\n </div>\n )}\n\n <ul className={cn('flex flex-col', density.itemGap)}>\n {visibleItems.map((item, index) => (\n <SidebarItemRow\n key={index}\n item={item}\n collapsed={collapsed}\n isActive={activePath === item.path}\n onNavigate={onNavigate}\n itemHeight={density.itemHeight}\n />\n ))}\n {isGroupCollapsible && groupCollapsed && group.items.length > 2 && (\n <li>\n <button\n onClick={(e) => { e.stopPropagation(); setGroupCollapsed(false); }}\n className='flex w-full items-center justify-center h-8 text-xs text-muted-foreground hover:text-primary transition-colors'\n >\n +{group.items.length - 2} more\n </button>\n </li>\n )}\n </ul>\n </div>\n );\n}\n\nfunction SidebarItemRow({\n item,\n collapsed,\n isActive,\n onNavigate,\n itemHeight,\n}: {\n item: SmartSidebarItem;\n collapsed: boolean;\n isActive: boolean;\n onNavigate: (path: string) => void;\n itemHeight: string;\n}) {\n return (\n <li>\n <Tooltip>\n <TooltipTrigger\n className={cn(\n buttonVariants({ variant: isActive ? 'secondary' : 'ghost' }),\n 'flex w-full items-center transition-all duration-300',\n itemHeight,\n collapsed ? 'justify-center px-1' : 'justify-start px-3',\n isActive && 'bg-primary/10 text-primary font-medium hover:bg-primary/20',\n !isActive && 'text-muted-foreground hover:text-foreground font-normal',\n )}\n onClick={() => onNavigate(item.path)}\n disabled={item.disabled}\n >\n {/* Icon Wrapper */}\n <span\n className={cn(\n 'flex items-center justify-center shrink-0 transition-all duration-300',\n isActive ? 'text-primary' : 'opacity-70',\n )}\n >\n {React.isValidElement(item.icon)\n ? // @ts-expect-error - cloning strictly for size prop if supported\n React.cloneElement(item.icon, { size: 18 })\n : item.icon}\n </span>\n\n {/* Label & Extra Wrapper for smooth transition */}\n <span\n className={cn(\n 'flex flex-1 items-center overflow-hidden transition-all duration-300 ease-in-out',\n collapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100 ml-3',\n )}\n >\n <span className='truncate flex-1 text-left text-sm'>{item.label}</span>\n {item.extra && (\n <span className='shrink-0 text-xs text-muted-foreground ml-2'>{item.extra}</span>\n )}\n </span>\n </TooltipTrigger>\n {collapsed && (\n <TooltipContent side='right' className='flex items-center gap-2'>\n {item.label}\n {item.extra && <span className='opacity-70'>{item.extra}</span>}\n </TooltipContent>\n )}\n </Tooltip>\n </li>\n );\n}\n"],"mappings":"A,0mBASA,IAAMuB,EAID,CACH,QAAS,CAAE,SAAU,QAAS,QAAS,QAAS,WAAY,KAAM,EAClE,OAAQ,CAAE,SAAU,QAAS,QAAS,QAAS,WAAY,KAAM,EACjE,YAAa,CAAE,SAAU,QAAS,QAAS,QAAS,WAAY,MAAO,CACzE,EAoFA,SAAgBC,EAAa,CAC3B,YACA,SACA,cACA,aACA,aACA,YAAY,GACZ,mBACA,SACA,iBACe,CACf,GAAM,CAAE,gBAAiBxB,EAAAA,SAAS,EAC5ByB,EAAUF,EAAeG,GACzBC,EAAkB,GAAiB,CACnCC,GACFA,EAAWC,CAAI,CAEnB,EAUA,OACE,EAAAT,EAAA,IAAA,CAACnB,EAAAA,gBAAD,CAAA,UACE,EAAAmB,EAAA,KAAA,CAAC,MAAD,CACE,UAAWlB,EAAAA,GACT,kGARW4B,EACf,0CACA,iCAQIC,CACF,EALF,SAAA,EAQE,EAAAX,EAAA,KAAA,CAAC,MAAD,CACE,UAAWlB,EAAAA,GACT,8CACA4B,EAAY,iBAAmB,iBACjC,EAJF,SAAA,CAOGE,IACC,EAAAZ,EAAA,IAAA,CAAC,MAAD,CACE,UAAWlB,EAAAA,GACT,4EACA4B,GAAaG,EACT,8BACA,+BACN,EAEC,SAAAD,EAAOF,CAAS,CACd,CAAA,EAING,IACC,EAAAb,EAAA,IAAA,CAACjB,EAAAA,OAAD,CACE,QAAQ,QACR,KAAK,OACL,UAAU,mBACV,QAAS8B,EAET,UAAA,EAAAb,EAAA,IAAA,CAAChB,EAAAA,UAAD,CAAW,KAAM,EAAK,CAAA,CAChB,CAAA,CAEP,C,IAEL,EAAAgB,EAAA,IAAA,CAACf,EAAAA,WAAD,CAAY,UAAU,sBACpB,UAAA,EAAAe,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWlB,EAAAA,GAAG,qBAAsBuB,EAAQ,QAAQ,EACtD,SAAAS,EAAO,KAAK,EAAO,KAClB,EAAAd,EAAA,IAAA,CAACe,EAAD,CAES,QACI,YACC,aACZ,WAAYR,EACH,SACV,EANMS,CAMN,CACF,CACE,CAAA,CACK,CAAA,EAGXC,GAAeA,EAAY,OAAS,IACnC,EAAAjB,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iFACb,UAAA,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWlB,EAAAA,GAAG,gBAAiBuB,EAAQ,OAAO,EAC/C,SAAAY,EAAY,KAAK,EAAM,KACtB,EAAAjB,EAAA,IAAA,CAACkB,EAAD,CAEQ,OACK,YACX,SAAUC,IAAeC,EAAK,KAC9B,WAAYb,EACZ,WAAYF,EAAQ,UACrB,EANMW,CAMN,CACF,CACC,CAAA,CACD,CAAA,EAINK,IACC,EAAArB,EAAA,IAAA,CAAC,MAAD,CACE,UAAWlB,EAAAA,GACT,yEACA4B,EAAY,sBAAwB,EACtC,EAEC,SAAAW,EAAcX,CAAS,CACrB,CAAA,CAEJ,CACU,CAAA,CAAA,CAAA,CAErB,CAEA,SAASK,EAAoB,CAC3B,QACA,YACA,aACA,aACA,WAOC,CACD,GAAM,CAACO,EAAgBC,GAAqBrC,EAAM,SAChDsC,EAAM,kBAAoB,EAC5B,EAEMC,EAAqBD,EAAM,aAAe,CAACd,EAE3CgB,EAAcxC,EAAM,gBAAkB,CACtCuC,GAAoBF,EAAkB,GAAQ,CAACI,CAAI,CACzD,EAAG,CAACF,CAAkB,CAAC,EAGvB,GAAI,CAACD,EAAM,OAAO,OAAQ,OAAO,KAEjC,IAAMI,EAAeH,GAAsBH,EACvCE,EAAM,MAAM,MAAM,EAAG,CAAC,EACtBA,EAAM,MAEV,OACE,EAAAxB,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWlB,EAAAA,GAAG,gBAAiBuB,EAAQ,OAAO,EAAnD,SAAA,CAEGmB,EAAM,QACL,EAAAxB,EAAA,KAAA,CAAC,MAAD,CACE,UAAWlB,EAAAA,GACT,sCACA2C,GAAsB,qDACxB,EACA,QAASC,EALX,SAAA,EAQE,EAAA1B,EAAA,KAAA,CAAC,KAAD,CACE,UAAWlB,EAAAA,GACT,iLACA4B,EAAY,gCAAkC,2BAChD,EAJF,SAAA,CAMGc,EAAM,MACNC,IACC,EAAAzB,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,4BACb,SAAAsB,EAAiB,IAAM,GACpB,CAAA,CAEN,CAGJ,CAAA,GAAA,EAAAtB,EAAA,IAAA,CAAC,MAAD,CACE,UAAWlB,EAAAA,GACT,mGACA4B,EAAY,cAAgB,WAC9B,EAEA,UAAA,EAAAV,EAAA,IAAA,CAACb,EAAAA,UAAD,CAAW,UAAU,gBAAkB,CAAA,CACpC,CAAA,CACF,CAGP,CAAA,GAAA,EAAAa,EAAA,KAAA,CAAC,KAAD,CAAI,UAAWlB,EAAAA,GAAG,gBAAiBuB,EAAQ,OAAO,EAAlD,SAAA,CACGuB,EAAa,KAAK,EAAM,KACvB,EAAA5B,EAAA,IAAA,CAACkB,EAAD,CAEQ,OACK,YACX,SAAUC,IAAeC,EAAK,KAClB,aACZ,WAAYf,EAAQ,UACrB,EANMW,CAMN,CACF,EACAS,GAAsBH,GAAkBE,EAAM,MAAM,OAAS,IAC5D,EAAAxB,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAAA,EAAA,KAAA,CAAC,SAAD,CACE,QAAU,GAAM,CAAE,EAAE,gBAAgB,EAAGuB,EAAkB,EAAK,CAAG,EACjE,UAAU,iHAFZ,SAAA,CAGC,IACGC,EAAM,MAAM,OAAS,EAAE,OACnB,CACN,CAAA,CAAA,CAAA,CAEJ,CACD,CAAA,CAAA,C,EAET,CAEA,SAASN,EAAe,CACtB,OACA,YACA,WACA,aACA,cAOC,CACD,OACE,EAAAlB,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAAA,EAAA,KAAA,CAACZ,EAAAA,QAAD,CAAA,SAAA,EACE,EAAAY,EAAA,KAAA,CAACX,EAAAA,eAAD,CACE,UAAWP,EAAAA,GACTQ,EAAAA,eAAe,CAAE,QAASuC,EAAW,YAAc,OAAQ,CAAC,EAC5D,uDACAC,EACApB,EAAY,sBAAwB,qBACpCmB,GAAY,6DACZ,CAACA,GAAY,yDACf,EACA,YAAerB,EAAWY,EAAK,IAAI,EACnC,SAAUA,EAAK,SAVjB,SAAA,EAaE,EAAApB,EAAA,IAAA,CAAC,OAAD,CACE,UAAWlB,EAAAA,GACT,wEACA+C,EAAW,eAAiB,YAC9B,EAEC,SAAA3C,EAAM,eAAekC,EAAK,IAAI,EAE3BlC,EAAM,aAAakC,EAAK,KAAM,CAAE,KAAM,EAAG,CAAC,EAC1CA,EAAK,IACL,CAAA,GAGN,EAAApB,EAAA,KAAA,CAAC,OAAD,CACE,UAAWlB,EAAAA,GACT,mFACA4B,EAAY,oBAAsB,gCACpC,EAJF,SAAA,EAME,EAAAV,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,oCAAqC,SAAAoB,EAAK,KAAY,CAAA,EACrEA,EAAK,QACJ,EAAApB,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,8CAA+C,SAAAoB,EAAK,KAAY,CAAA,CAE9E,CACQ,CAAA,CAAA,CACf,CAAA,EAAAV,IACC,EAAAV,EAAA,KAAA,CAACT,EAAAA,eAAD,CAAgB,KAAK,QAAQ,UAAU,0BAAvC,SAAA,CACG6B,EAAK,MACLA,EAAK,QAAS,EAAApB,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,aAAc,SAAAoB,EAAK,KAAY,CAAA,CAChD,CAEX,CAAA,CAAA,CAAA,CAAA,CACP,CAAA,CAER,C"}