@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,5 +1,24 @@
1
1
  import { GanttChartProps } from './types.cjs';
2
2
  /**
3
- * タスクとマイルストーンを階層構造およびタイムライン形式で表示する、高機能なガントチャートコンポーネント。
3
+ * Renders hierarchical tasks, milestones and dependency planning on an editable timeline.
4
+ * @param props - Task data, display/planning settings and host callbacks; see {@link GanttChartProps}.
5
+ * @returns The chart with its toolbar, task list, timeline and optional edit dialog.
6
+ * @remarks Import Appkit CSS. initialViewMode defaults to Week, editMode to dialog and
7
+ * optimistic updates are enabled unless disableOptimisticUpdates is true. The host owns
8
+ * persistence and must replace tasks after updates; optimistic state resets when tasks changes.
9
+ * Date dragging/resizing and auto-scheduling require their explicit options. Calendar formatting
10
+ * uses enUS. The root exposes data-task-count for the filtered visible task count and
11
+ * data-virtualized="true" while virtualized; no data-testid prop/attribute is implemented.
12
+ * @example
13
+ * ```tsx
14
+ * import { GanttChart, type GanttTask } from '@alneas/appkit-react/tools/gantt';
15
+ * import '@alneas/appkit-react/styles';
16
+ *
17
+ * const tasks: GanttTask[] = [{ id: 'phase-1', title: 'Phase 1', status: 'doing',
18
+ * start_date: '2026-01-01', due_date: '2026-01-31', progress: 50, created_at: '2026-01-01' }];
19
+ * export function ProjectTimeline() {
20
+ * return <GanttChart tasks={tasks} initialViewMode="Week" editMode="none" />;
21
+ * }
22
+ * ```
4
23
  */
5
24
  export declare function GanttChart({ tasks, milestones, markers, onTaskClick, onTaskUpdate, onTasksChange, dependencies, autoSchedule, schedulingOptions, showCriticalPath, dateEditing, onTaskDelete, onAddTask, onMilestoneClick, className, initialViewMode, taskBarDisplay, displayConfig, scaleConfig, gridConfig, baselineConfig, progressConfig, hierarchyConfig, filterConfig, editMode, editableFields, showAddButton, showRowAddButton, disableOptimisticUpdates, }: GanttChartProps): import('react').JSX.Element;
@@ -1,5 +1,24 @@
1
1
  import { GanttChartProps } from './types.js';
2
2
  /**
3
- * タスクとマイルストーンを階層構造およびタイムライン形式で表示する、高機能なガントチャートコンポーネント。
3
+ * Renders hierarchical tasks, milestones and dependency planning on an editable timeline.
4
+ * @param props - Task data, display/planning settings and host callbacks; see {@link GanttChartProps}.
5
+ * @returns The chart with its toolbar, task list, timeline and optional edit dialog.
6
+ * @remarks Import Appkit CSS. initialViewMode defaults to Week, editMode to dialog and
7
+ * optimistic updates are enabled unless disableOptimisticUpdates is true. The host owns
8
+ * persistence and must replace tasks after updates; optimistic state resets when tasks changes.
9
+ * Date dragging/resizing and auto-scheduling require their explicit options. Calendar formatting
10
+ * uses enUS. The root exposes data-task-count for the filtered visible task count and
11
+ * data-virtualized="true" while virtualized; no data-testid prop/attribute is implemented.
12
+ * @example
13
+ * ```tsx
14
+ * import { GanttChart, type GanttTask } from '@alneas/appkit-react/tools/gantt';
15
+ * import '@alneas/appkit-react/styles';
16
+ *
17
+ * const tasks: GanttTask[] = [{ id: 'phase-1', title: 'Phase 1', status: 'doing',
18
+ * start_date: '2026-01-01', due_date: '2026-01-31', progress: 50, created_at: '2026-01-01' }];
19
+ * export function ProjectTimeline() {
20
+ * return <GanttChart tasks={tasks} initialViewMode="Week" editMode="none" />;
21
+ * }
22
+ * ```
4
23
  */
5
24
  export declare function GanttChart({ tasks, milestones, markers, onTaskClick, onTaskUpdate, onTasksChange, dependencies, autoSchedule, schedulingOptions, showCriticalPath, dateEditing, onTaskDelete, onAddTask, onMilestoneClick, className, initialViewMode, taskBarDisplay, displayConfig, scaleConfig, gridConfig, baselineConfig, progressConfig, hierarchyConfig, filterConfig, editMode, editableFields, showAddButton, showRowAddButton, disableOptimisticUpdates, }: GanttChartProps): import('react').JSX.Element;
@@ -336,6 +336,9 @@ function ye({ tasks: o, milestones: p = [], markers: ye = [], onTaskClick: xe, o
336
336
  ref: Z,
337
337
  ...Ct,
338
338
  "data-gantt-chart-viewport": !0,
339
+ role: "region",
340
+ "aria-label": "Gantt timeline",
341
+ tabIndex: 0,
339
342
  className: "flex-1 min-w-0 overflow-auto bg-muted/5 relative",
340
343
  children: /* @__PURE__ */ f("div", {
341
344
  style: {
@@ -1 +1 @@
1
- {"version":3,"file":"GanttChart.js","names":["MemoTaskBar","memo","GanttTaskBar","EMPTY_DEPENDENCIES","GanttChart","locale","enUS","optimisticTasks","setOptimisticTasks","useState","prevTasks","setPrevTasks","tasks","currentTasks","disableOptimisticUpdates","saving","setSaving","saveError","setSaveError","saveLock","useRef","sourceTasks","requestId","useEffect","graphError","useMemo","dependencies","dependencyError","planningView","schedulingOptions","workingDayPredicate","showCriticalPath","autoSchedule","planGanttTasks","error","criticalTasks","task","schedulingError","onTasksChange","displayTasks","localDate","value","parseISO","useGanttState","state","editDialogOpen","setEditDialogOpen","editingTask","setEditingTask","showTaskList","displayConfig","showChart","taskListWidth","showHorizontalBorders","gridConfig","showVerticalBorders","showWeekendHighlight","showTodayHighlight","rowIds","visibleTasks","virtualized","scrollContainerRef","windowStart","windowEnd","rowIndices","useGanttRowWindow","rowHeight","rowEvents","mountedTasks","index","todayX","getXPosition","containerWidth","viewMode","handleTaskClick","useCallback","selectTask","onTaskClick","editMode","item","publishTask","token","source","previousOptimistic","schedule","next","updatedTask","scheduleGanttTasks","onTaskUpdate","handleTaskSave","datesChanged","saved","handleDateChange","original","taskId","updated","start","end","oldStart","planningDate","oldEnd","addDays","moving","differenceInCalendarDays","getGanttWorkingDuration","handleProgressChange","handleTaskDelete","nextOptimistic","onTaskDelete","handleAddTask","parentId","handleZoomIn","maxWidth","scaleConfig","cellWidth","handleZoomOut","minWidth","t","key","cn","className","delay","GanttToolbar","setViewMode","goToPrevious","goToNext","goToToday","showAddButton","onAddTask","Button","Plus","listRef","bottomInset","selectedTaskId","hierarchyConfig","toggleTaskExpand","ChevronDown","ChevronRight","event","progressConfig","Avatar","AvatarFallback","showRowAddButton","milestones","onMilestoneClick","ms","totalDays","allDays","isMonthStart","day","isFirstMonday","isYearStart","isMonday","showUpperLabel","upperLabelText","showLowerLabel","lowerLabelText","borderClass","format","isWeekend","isToday","isSameDay","startDate","markers","renderMarker","marker","GanttDependencyLayer","left","width","getWidth","baselineLeft","baselineWidth","baselineConfig","date","TaskEditDialog","color"],"sources":["../../../../src/tools/components/gantt/GanttChart.tsx"],"sourcesContent":["/**\n * Enhanced Gantt Chart Component\n *\n * タスクとマイルストーンをタイムライン形式で表示する高機能ガントチャート。\n *\n * ## Features\n * - 階層タスク(サブタスク)表示\n * - 進捗率の可視化\n * - ベースライン比較\n * - ダイアログによるタスク編集\n * - 日単位のバー移動・両端リサイズ(明示的に有効化、キーボード対応)\n * - FS/SS/FF/SF依存線、稼働日・クリティカルパス・容量制約付き前方自動調整\n * - 100件を超えるタスクの行仮想化(全行描画へ切替可能)\n * - フィルタリング機能\n * - カスタムマーカー\n * - 日次/週次/月次ビュー切替\n * - 楽観的UIアップデート\n *\n * ## AI/Automation Attributes\n * - `data-testid`: Container element\n * - `data-task-count`: Number of visible tasks\n *\n * @example\n * ```tsx\n * import { GanttChart } from '@alneas/appkit-react/tools/gantt';\n *\n * const tasks = [\n * {\n * id: '1',\n * title: 'Phase 1',\n * start_date: '2024-01-01',\n * due_date: '2024-01-31',\n * status: 'doing',\n * progress: 50,\n * created_at: '2024-01-01',\n * },\n * ];\n *\n * <GanttChart\n * tasks={tasks}\n * initialViewMode=\"Week\"\n * onTaskClick={(task) => console.log(task)}\n * onTaskUpdate={(task) => updateTask(task)}\n * />\n * ```\n *\n * @param props - {@link GanttChartProps}\n * @returns ガントチャートコンポーネント\n */\n\nimport { useState, useRef, useEffect, useMemo, useCallback, memo } from 'react';\nimport {\n format,\n isSameDay,\n isToday,\n isWeekend,\n differenceInCalendarDays,\n addDays,\n parseISO,\n} from 'date-fns';\nimport { enUS } from 'date-fns/locale';\nimport { ChevronDown, ChevronRight, Plus } from 'lucide-react';\n\nimport { Avatar, AvatarFallback } from '../ui/avatar';\nimport { Button } from '../ui/button';\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n GanttChartProps,\n GanttTask,\n ComputedTask,\n GanttMarker,\n GanttDependency,\n} from './types';\nimport { useGanttState } from './hooks/useGanttState';\nimport { GanttToolbar } from './components/GanttToolbar';\nimport { GanttTaskBar } from './components/GanttTaskBar';\nimport { TaskEditDialog } from './dialogs/TaskEditDialog';\nimport { dependencyError, scheduleGanttTasks } from './hooks/gantt-scheduling';\nimport { GanttDependencyLayer } from './components/GanttDependencyLayer';\nimport { planGanttTasks } from './hooks/gantt-planning';\nimport { useGanttRowWindow } from './hooks/use-gantt-row-window';\nimport {\n getGanttWorkingDuration,\n planningDate,\n workingDayPredicate,\n} from './hooks/gantt-working-calendar';\n\nconst MemoTaskBar = memo(GanttTaskBar);\nconst EMPTY_DEPENDENCIES: GanttDependency[] = [];\n\n/**\n * タスクとマイルストーンを階層構造およびタイムライン形式で表示する、高機能なガントチャートコンポーネント。\n */\nexport function GanttChart({\n tasks,\n milestones = [],\n markers = [],\n onTaskClick,\n onTaskUpdate,\n onTasksChange,\n dependencies = EMPTY_DEPENDENCIES,\n autoSchedule = false,\n schedulingOptions,\n showCriticalPath = false,\n dateEditing,\n onTaskDelete,\n onAddTask,\n onMilestoneClick,\n className,\n initialViewMode = 'Week',\n taskBarDisplay = 'none',\n displayConfig,\n scaleConfig,\n gridConfig,\n baselineConfig,\n progressConfig,\n hierarchyConfig,\n filterConfig,\n editMode = 'dialog',\n editableFields,\n showAddButton,\n showRowAddButton,\n disableOptimisticUpdates = false,\n}: GanttChartProps) {\n const locale = enUS;\n\n // -------------------------------------------------------------------------\n // State Management\n // -------------------------------------------------------------------------\n\n const [optimisticTasks, setOptimisticTasks] = useState<GanttTask[] | null>(null);\n\n // Reset optimistic state during render when original tasks prop changes\n const [prevTasks, setPrevTasks] = useState<GanttTask[]>(tasks);\n if (tasks !== prevTasks) {\n setPrevTasks(tasks);\n setOptimisticTasks(null);\n }\n\n const currentTasks = disableOptimisticUpdates || !optimisticTasks ? tasks : optimisticTasks;\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | null>(null);\n const saveLock = useRef(false);\n const sourceTasks = useRef(tasks);\n const requestId = useRef(0);\n useEffect(() => {\n sourceTasks.current = tasks;\n }, [tasks]);\n useEffect(\n () => () => {\n requestId.current++;\n },\n [],\n );\n const graphError = useMemo(\n () => (dependencies.length ? dependencyError(currentTasks, dependencies) : null),\n [currentTasks, dependencies],\n );\n const planningView = useMemo(() => {\n try {\n const isWorking = schedulingOptions?.calendar\n ? workingDayPredicate(schedulingOptions.calendar)\n : undefined;\n const plan =\n showCriticalPath || (autoSchedule && schedulingOptions)\n ? planGanttTasks(currentTasks, dependencies, {\n ...schedulingOptions,\n resourceLeveling: autoSchedule ? schedulingOptions?.resourceLeveling : undefined,\n })\n : undefined;\n return { isWorking, plan, error: null };\n } catch (error) {\n return { error: error instanceof Error ? error.message : 'Invalid schedule.' };\n }\n }, [currentTasks, dependencies, schedulingOptions, showCriticalPath, autoSchedule]);\n const criticalTasks = useMemo(\n () =>\n new Map(\n showCriticalPath\n ? planningView.plan?.criticalPath.tasks.map((task) => [task.taskId, task])\n : [],\n ),\n [showCriticalPath, planningView.plan],\n );\n const schedulingError =\n autoSchedule && !onTasksChange\n ? 'Automatic scheduling requires onTasksChange for atomic updates.'\n : (graphError ?? planningView.error);\n const displayTasks = useMemo(() => {\n if (!schedulingOptions && !showCriticalPath) return currentTasks;\n const localDate = (value: GanttTask['start_date']) =>\n typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value) ? parseISO(value) : value;\n // Match day-planner date-only parsing without applying the computed schedule during render.\n return currentTasks.map((task) => ({\n ...task,\n start_date: localDate(task.start_date),\n due_date: localDate(task.due_date),\n created_at: localDate(task.created_at)!,\n }));\n }, [currentTasks, schedulingOptions, showCriticalPath]);\n\n const {\n state,\n visibleTasks,\n allDays,\n startDate,\n totalDays,\n setViewMode,\n selectTask,\n toggleTaskExpand,\n setCellWidth,\n goToToday,\n goToPrevious,\n goToNext,\n getXPosition,\n getWidth,\n } = useGanttState({\n tasks: displayTasks,\n initialViewMode,\n hierarchyConfig,\n scaleConfig,\n });\n\n const { viewMode, currentDate, cellWidth, rowHeight, selectedTaskId } = state;\n\n // Dialog state\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<GanttTask | null>(null);\n\n // -------------------------------------------------------------------------\n // Display Config Defaults\n // -------------------------------------------------------------------------\n\n const showTaskList = displayConfig?.showTaskList ?? true;\n const showChart = displayConfig?.showChart ?? true;\n const taskListWidth = displayConfig?.taskListWidth ?? 256;\n const showHorizontalBorders = gridConfig?.showHorizontalBorders ?? true;\n const showVerticalBorders = gridConfig?.showVerticalBorders ?? true;\n const showWeekendHighlight = gridConfig?.showWeekendHighlight ?? true;\n const showTodayHighlight = gridConfig?.showTodayHighlight ?? true;\n\n // -------------------------------------------------------------------------\n // Scroll Management\n // -------------------------------------------------------------------------\n\n const rowIds = useMemo(() => visibleTasks.map((task) => task.id), [visibleTasks]);\n const virtualized = displayConfig?.virtualizeRows !== false && visibleTasks.length > 100;\n const {\n chartRef: scrollContainerRef,\n listRef,\n start: windowStart,\n end: windowEnd,\n indices: rowIndices,\n bottomInset,\n onScroll,\n onFocusCapture,\n onBlurCapture,\n onKeyDownCapture,\n onPointerDownCapture,\n onPointerUpCapture,\n onPointerCancelCapture,\n onLostPointerCapture,\n } = useGanttRowWindow(\n rowIds,\n rowHeight,\n virtualized,\n editDialogOpen ? editingTask?.id : undefined,\n `${showTaskList}:${showChart}`,\n );\n const rowEvents = {\n onScroll,\n onFocusCapture,\n onBlurCapture,\n onKeyDownCapture,\n onPointerDownCapture,\n onPointerUpCapture,\n onPointerCancelCapture,\n onLostPointerCapture,\n };\n const mountedTasks = rowIndices.map((index) => ({ task: visibleTasks[index], index }));\n\n useEffect(() => {\n if (scrollContainerRef.current) {\n const todayX = getXPosition(new Date());\n const containerWidth = scrollContainerRef.current.clientWidth;\n scrollContainerRef.current.scrollLeft = todayX - containerWidth / 2;\n }\n }, [viewMode, getXPosition, scrollContainerRef]);\n\n // -------------------------------------------------------------------------\n // Handlers\n // -------------------------------------------------------------------------\n\n const handleTaskClick = useCallback(\n (task: ComputedTask) => {\n if (saveLock.current) return;\n selectTask(task.id);\n onTaskClick?.(task);\n\n if (editMode === 'dialog') {\n setEditingTask(currentTasks.find((item) => item.id === task.id) ?? task);\n setEditDialogOpen(true);\n }\n },\n [selectTask, onTaskClick, editMode, currentTasks],\n );\n\n const publishTask = useCallback(\n async (updatedTask: GanttTask, schedule: boolean) => {\n if (saveLock.current) return false;\n const token = ++requestId.current;\n const source = tasks;\n const previousOptimistic = optimisticTasks;\n saveLock.current = true;\n setSaving(true);\n setSaveError(null);\n try {\n // Validate the proposed schedule, so a dialog can repair invalid input dates.\n if (schedule && autoSchedule && !onTasksChange)\n throw new Error('Automatic scheduling requires onTasksChange for atomic updates.');\n let next = currentTasks.map((task) => (task.id === updatedTask.id ? updatedTask : task));\n if (schedule && autoSchedule)\n next = scheduleGanttTasks(next, dependencies, schedulingOptions);\n if (!disableOptimisticUpdates) setOptimisticTasks(next);\n if (onTasksChange) await onTasksChange(next);\n else await onTaskUpdate?.(updatedTask);\n return token === requestId.current;\n } catch (error) {\n if (token === requestId.current) {\n if (sourceTasks.current === source) setOptimisticTasks(previousOptimistic);\n setSaveError(error instanceof Error ? error.message : 'Unable to save task changes.');\n }\n return false;\n } finally {\n if (token === requestId.current) {\n saveLock.current = false;\n setSaving(false);\n }\n }\n },\n [\n tasks,\n optimisticTasks,\n autoSchedule,\n onTasksChange,\n currentTasks,\n dependencies,\n schedulingOptions,\n disableOptimisticUpdates,\n onTaskUpdate,\n ],\n );\n const handleTaskSave = async (updatedTask: GanttTask) => {\n // The date fields in the dialog edit duration; do not retain an earlier drag's override.\n const datesChanged =\n editingTask &&\n (String(updatedTask.start_date) !== String(editingTask.start_date) ||\n String(updatedTask.due_date) !== String(editingTask.due_date));\n const saved = await publishTask(\n autoSchedule && schedulingOptions && datesChanged\n ? { ...updatedTask, durationDays: undefined }\n : updatedTask,\n true,\n );\n if (saved) {\n setEditDialogOpen(false);\n setEditingTask(null);\n }\n return saved;\n };\n const handleDateChange = useCallback(\n (taskId: string, start: Date, end: Date) => {\n const original = currentTasks.find((task) => task.id === taskId);\n if (!original) return;\n let updated = { ...original, start_date: start, due_date: end };\n if (autoSchedule && schedulingOptions) {\n try {\n const oldStart = planningDate(original.start_date ?? original.created_at);\n const oldEnd =\n original.due_date == null ? addDays(oldStart, 1) : planningDate(original.due_date);\n const moving =\n differenceInCalendarDays(start, oldStart) === differenceInCalendarDays(end, oldEnd);\n // Moving preserves effort across weekends; resizing deliberately recalculates effort.\n updated = {\n ...updated,\n durationDays: getGanttWorkingDuration(\n moving ? original : { ...updated, durationDays: undefined },\n schedulingOptions.calendar,\n ),\n };\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : 'Invalid task dates.');\n return;\n }\n }\n void publishTask(updated, true);\n },\n [currentTasks, autoSchedule, schedulingOptions, publishTask],\n );\n const handleProgressChange = useCallback(\n (taskId: string, progress: number) => {\n const original = currentTasks.find((item) => item.id === taskId);\n if (original) void publishTask({ ...original, progress }, false);\n },\n [currentTasks, publishTask],\n );\n\n const handleTaskDelete = (taskId: string) => {\n if (saveLock.current) return;\n if (!disableOptimisticUpdates) {\n const nextOptimistic = currentTasks.filter((t) => t.id !== taskId);\n setOptimisticTasks(nextOptimistic);\n }\n\n onTaskDelete?.(taskId);\n setEditDialogOpen(false);\n setEditingTask(null);\n };\n\n const handleAddTask = (parentId?: string) => {\n onAddTask?.(parentId);\n };\n\n const handleZoomIn = () => {\n const maxWidth = scaleConfig?.maxCellWidth ?? 100;\n setCellWidth(Math.min(cellWidth * 1.5, maxWidth));\n };\n\n const handleZoomOut = () => {\n const minWidth = scaleConfig?.minCellWidth ?? 5;\n setCellWidth(Math.max(cellWidth / 1.5, minWidth));\n };\n\n // -------------------------------------------------------------------------\n // Helper for translation\n // -------------------------------------------------------------------------\n\n const t = (key: string) => {\n const map: Record<string, string> = {\n today: 'Today',\n day: 'Day',\n week: 'Week',\n month: 'Month',\n tasks: 'Tasks',\n milestones: 'Milestones',\n };\n return map[key.toLowerCase()] || key;\n };\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n return (\n <div\n aria-busy={saving}\n data-task-count={visibleTasks.length}\n data-virtualized={virtualized || undefined}\n className={cn(\n 'flex flex-col h-full bg-background border overflow-hidden [border-radius:var(--radius-lg)] [box-shadow:var(--shadow-sm)]',\n className,\n )}\n >\n {/* Toolbar */}\n {showCriticalPath && planningView.plan && (\n <div className='px-2 py-1 text-xs text-muted-foreground' role='status'>\n Critical path (dependencies only): {planningView.plan.criticalPath.taskIds.length} tasks;\n resource contention is excluded from float.\n </div>\n )}\n {autoSchedule && schedulingOptions?.resourceLeveling?.enabled && planningView.plan && (\n <details className='px-2 py-1 text-xs text-muted-foreground' data-resource-leveling>\n <summary>\n Resource leveling preview: {planningView.plan.resourceDelays.length} delayed tasks (not\n applied until save)\n </summary>\n <ul>\n {planningView.plan.resourceDelays.map((delay) => (\n <li key={delay.taskId}>\n {currentTasks.find((task) => task.id === delay.taskId)?.title ?? delay.taskId}:\n capacity +{delay.directDays}d, predecessors +{delay.propagatedDays}d\n </li>\n ))}\n </ul>\n </details>\n )}\n {(saveError || schedulingError) && (\n <div role='alert' className='p-2 text-sm text-destructive'>\n {saveError || schedulingError}\n </div>\n )}\n <GanttToolbar\n currentDate={currentDate}\n viewMode={viewMode}\n scaleConfig={scaleConfig}\n filterConfig={filterConfig}\n onViewModeChange={setViewMode}\n onPrevious={goToPrevious}\n onNext={goToNext}\n onToday={goToToday}\n onZoomIn={scaleConfig?.zoomControls ? handleZoomIn : undefined}\n onZoomOut={scaleConfig?.zoomControls ? handleZoomOut : undefined}\n />\n\n <div className='flex flex-1 min-h-0 overflow-hidden'>\n {/* Sidebar (Task Names) */}\n {showTaskList && (\n <div\n className='flex-shrink-0 border-r bg-background flex flex-col z-20 [box-shadow:var(--shadow-sm)]'\n style={{ width: taskListWidth }}\n >\n <div\n className='border-b bg-muted/10 flex items-center justify-between text-muted-foreground [padding-left:var(--spacing-4)] [padding-right:var(--spacing-4)] [font-weight:var(--font-weight-semibold)] [font-size:var(--text-sm)]'\n style={{ height: rowHeight, flexShrink: 0 }}\n >\n <span>{t('tasks')}</span>\n {showAddButton && onAddTask && (\n <Button\n variant='ghost'\n size='icon'\n className='h-6 w-6'\n onClick={() => handleAddTask()}\n >\n <Plus className='h-4 w-4' />\n </Button>\n )}\n </div>\n <div\n ref={listRef}\n {...rowEvents}\n data-gantt-list-viewport\n className='flex-1 min-h-0 overflow-auto'\n >\n <div style={{ paddingBottom: bottomInset }}>\n <div style={{ height: visibleTasks.length * rowHeight, position: 'relative' }}>\n {mountedTasks.map(({ task, index }) => (\n <div\n key={task.id}\n data-gantt-row-id={task.id}\n className={cn(\n 'border-b flex items-center px-2 text-sm font-medium hover:bg-muted/50 cursor-pointer transition-colors group',\n selectedTaskId === task.id && 'bg-muted',\n )}\n style={{\n height: rowHeight,\n position: 'absolute',\n top: index * rowHeight,\n left: 0,\n right: 0,\n paddingLeft: task.computedLevel * (hierarchyConfig?.indentWidth ?? 16) + 8,\n }}\n onClick={() => handleTaskClick(task)}\n >\n {/* Expand/Collapse */}\n {task.hasChildren ? (\n <Button\n aria-label={`${task.title}: expand/collapse`}\n aria-expanded={state.expandedTaskIds.has(task.id)}\n variant='ghost'\n size='icon'\n className='h-4 w-4 p-0 mr-1 hover:bg-muted rounded-sm'\n onClick={(e) => {\n e.stopPropagation();\n toggleTaskExpand(task.id);\n }}\n >\n {state.expandedTaskIds.has(task.id) ? (\n <ChevronDown className='h-3 w-3' />\n ) : (\n <ChevronRight className='h-3 w-3' />\n )}\n </Button>\n ) : (\n <div className='w-4' />\n )}\n\n {/* Status dot */}\n <div\n className={cn(\n 'w-2 h-2 rounded-full mr-2 flex-shrink-0',\n task.status === 'done'\n ? 'bg-green-500'\n : task.status === 'review'\n ? 'bg-primary'\n : task.status === 'doing'\n ? 'bg-blue-500'\n : task.status === 'blocked'\n ? 'bg-red-500'\n : 'bg-muted',\n )}\n />\n\n {/* Title */}\n <button\n type='button'\n className='truncate flex-1 text-left'\n onClick={(event) => {\n event.stopPropagation();\n handleTaskClick(task);\n }}\n >\n {task.title}\n </button>\n\n {/* Progress */}\n {progressConfig?.showProgress && task.computedProgress > 0 && (\n <span className='text-xs text-muted-foreground mr-2'>\n {Math.round(task.computedProgress)}%\n </span>\n )}\n\n {/* Assignee */}\n {task.assignee_id && (\n <Avatar className='h-5 w-5 ml-1 border opacity-70 group-hover:opacity-100'>\n <AvatarFallback className='text-[9px]'>\n {task.assignee_name?.[0]?.toUpperCase() ??\n task.priority?.[0]?.toUpperCase() ??\n '?'}\n </AvatarFallback>\n </Avatar>\n )}\n\n {/* Add child button */}\n {showRowAddButton && onAddTask && (\n <Button\n variant='ghost'\n size='icon'\n className='h-5 w-5 opacity-0 group-hover:opacity-100'\n onClick={(e) => {\n e.stopPropagation();\n handleAddTask(task.id);\n }}\n >\n <Plus className='h-3 w-3' />\n </Button>\n )}\n </div>\n ))}\n </div>\n\n {/* Milestones header */}\n {milestones.length > 0 && (\n <div\n className='border-b bg-muted/5 flex items-center px-4 text-xs font-semibold text-muted-foreground uppercase'\n style={{ height: rowHeight }}\n >\n {t('milestones')}\n </div>\n )}\n\n {/* Milestones */}\n {milestones.map((ms) => (\n <div\n key={ms.id}\n className='border-b flex items-center px-4 text-sm hover:bg-muted/50 cursor-pointer'\n style={{ height: rowHeight }}\n onClick={() => onMilestoneClick?.(ms)}\n >\n <div className='w-2 h-2 rotate-45 bg-amber-500 mr-2 flex-shrink-0' />\n <span className='truncate'>{ms.name}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Main Chart Area */}\n {showChart && (\n <div\n ref={scrollContainerRef}\n {...rowEvents}\n data-gantt-chart-viewport\n className='flex-1 min-w-0 overflow-auto bg-muted/5 relative'\n >\n <div style={{ width: `${totalDays * cellWidth}px`, minWidth: '100%' }}>\n {/* Timeline Header */}\n <div\n className='sticky top-0 z-10 bg-background border-b flex relative'\n style={{ height: rowHeight }}\n >\n {allDays.map((day) => {\n const isMonthStart = day.getDate() === 1;\n const isFirstMonday = day.getDate() <= 7 && day.getDay() === 1;\n const isYearStart = day.getMonth() === 0 && day.getDate() === 1;\n const isMonday = day.getDay() === 1;\n\n let showUpperLabel = false;\n let upperLabelText = '';\n let showLowerLabel = false;\n let lowerLabelText = '';\n let borderClass = showVerticalBorders ? 'border-r' : '';\n\n if (viewMode === 'Day') {\n showUpperLabel = isMonthStart;\n upperLabelText = format(day, 'yyyy MMMM', { locale });\n showLowerLabel = true;\n lowerLabelText = format(day, 'd', { locale });\n } else if (viewMode === 'Week') {\n showUpperLabel = isFirstMonday || (isMonthStart && day.getDay() === 1);\n upperLabelText = format(day, 'yyyy MMM', { locale });\n showLowerLabel = isMonday;\n lowerLabelText = format(day, 'd', { locale });\n borderClass = isMonday && showVerticalBorders ? 'border-l border-border' : '';\n } else if (viewMode === 'Month') {\n showUpperLabel = isYearStart;\n upperLabelText = format(day, 'yyyy', { locale });\n showLowerLabel = isMonthStart;\n borderClass =\n isMonthStart && showVerticalBorders ? 'border-l border-border' : '';\n if (showLowerLabel) lowerLabelText = format(day, 'MMM', { locale });\n }\n\n return (\n <div\n key={day.toISOString()}\n className={cn(\n 'flex-shrink-0 flex flex-col justify-end pb-1 text-[10px] text-muted-foreground select-none text-center relative',\n borderClass,\n (planningView.isWorking\n ? !planningView.isWorking(day)\n : showWeekendHighlight && isWeekend(day)) &&\n viewMode === 'Day' &&\n 'bg-muted/10',\n showTodayHighlight &&\n isToday(day) &&\n 'bg-primary/10 font-semibold text-primary',\n )}\n style={{ width: cellWidth }}\n >\n {showUpperLabel && (\n <span className='absolute top-1 left-1 text-xs font-bold text-foreground pl-1 whitespace-nowrap z-10'>\n {upperLabelText}\n </span>\n )}\n {showLowerLabel && (\n <span\n className={cn(\n viewMode !== 'Day' && 'absolute bottom-1 left-1',\n 'whitespace-nowrap tracking-tighter',\n )}\n >\n {lowerLabelText}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Grid & Task Bars */}\n <div className='relative'>\n {/* Background Grid */}\n <div className='absolute inset-0 flex pointer-events-none'>\n {allDays.map((day) => {\n let borderClass = '';\n if (showVerticalBorders) {\n if (viewMode === 'Day') {\n borderClass = 'border-r';\n } else if (viewMode === 'Week' && day.getDay() === 1) {\n borderClass = 'border-l';\n } else if (viewMode === 'Month' && day.getDate() === 1) {\n borderClass = 'border-l';\n }\n }\n\n return (\n <div\n key={`grid-${day.toISOString()}`}\n className={cn(\n 'flex-shrink-0 h-full',\n borderClass,\n (planningView.isWorking\n ? !planningView.isWorking(day)\n : showWeekendHighlight && isWeekend(day)) && viewMode === 'Day'\n ? 'bg-muted/20'\n : 'bg-transparent',\n showTodayHighlight && isToday(day) && 'bg-primary/5',\n )}\n style={{ width: cellWidth }}\n />\n );\n })}\n\n {/* Current Time Indicator */}\n {(isSameDay(new Date(), startDate) || new Date() > startDate) &&\n viewMode !== 'Month' && (\n <div\n className='absolute top-0 bottom-0 border-l-2 border-red-500/50 z-30 pointer-events-none'\n style={{ left: getXPosition(new Date()) + cellWidth / 2 }}\n >\n <div className='w-2 h-2 bg-red-500 rounded-full -ml-[5px] mt-[-4px]' />\n </div>\n )}\n\n {/* Custom Markers */}\n {markers.map((marker) => renderMarker(marker, getXPosition))}\n </div>\n\n {/* Task Rows */}\n {!graphError && dependencies.length > 0 && (\n <GanttDependencyLayer\n tasks={visibleTasks}\n dependencies={dependencies}\n criticalDependencyIds={\n showCriticalPath\n ? new Set(planningView.plan?.criticalPath.dependencyIds)\n : undefined\n }\n rowHeight={rowHeight}\n width={totalDays * cellWidth}\n getXPosition={getXPosition}\n getWidth={getWidth}\n rowWindow={virtualized ? { start: windowStart, end: windowEnd } : undefined}\n />\n )}\n <div>\n <div style={{ height: visibleTasks.length * rowHeight, position: 'relative' }}>\n {mountedTasks.map(({ task, index }) => {\n const left = getXPosition(task.computedStart);\n const width = getWidth(task.computedStart, task.computedEnd);\n\n // Baseline positions\n let baselineLeft: number | undefined;\n let baselineWidth: number | undefined;\n if (\n baselineConfig?.showBaseline &&\n task.baseline_start &&\n task.baseline_end\n ) {\n baselineLeft = getXPosition(new Date(task.baseline_start));\n baselineWidth = getWidth(\n new Date(task.baseline_start),\n new Date(task.baseline_end),\n );\n }\n\n return (\n <div\n key={task.id}\n data-gantt-row-id={task.id}\n className={cn('relative', showHorizontalBorders && 'border-b')}\n style={{\n height: rowHeight,\n position: 'absolute',\n top: index * rowHeight,\n left: 0,\n right: 0,\n }}\n >\n <MemoTaskBar\n task={task}\n critical={criticalTasks.get(task.id)?.critical}\n totalFloatDays={criticalTasks.get(task.id)?.totalFloatDays}\n left={left}\n width={width}\n rowHeight={rowHeight}\n taskBarDisplay={taskBarDisplay}\n progressConfig={progressConfig}\n baselineConfig={baselineConfig}\n baselineLeft={baselineLeft}\n baselineWidth={baselineWidth}\n onClick={handleTaskClick}\n dateEditing={dateEditing}\n cellWidth={cellWidth}\n editingDisabled={saving}\n onDateChange={\n editMode !== 'none' &&\n (onTasksChange || onTaskUpdate) &&\n !task.hasChildren &&\n !(autoSchedule && schedulingError)\n ? handleDateChange\n : undefined\n }\n onProgressChange={\n editMode !== 'none' &&\n (onTasksChange || onTaskUpdate) &&\n !(task.hasChildren && hierarchyConfig?.autoRollupProgress)\n ? handleProgressChange\n : undefined\n }\n />\n </div>\n );\n })}\n </div>\n {milestones.length > 0 && <div aria-hidden style={{ height: rowHeight }} />}\n\n {/* Milestone Rows */}\n {milestones.map((ms) => {\n const date = ms.due_date ? new Date(ms.due_date) : new Date();\n const left = getXPosition(date);\n\n return (\n <div\n key={ms.id}\n className={cn('relative', showHorizontalBorders && 'border-b')}\n style={{ height: rowHeight }}\n >\n <div\n className='absolute top-3 w-6 h-6 rotate-45 bg-amber-400 border-2 border-background shadow-md hover:scale-110 transition-transform cursor-help z-10'\n style={{ left: left - 10 }}\n title={`${ms.name} - ${format(date, 'MMM d')}`}\n />\n <span\n className='absolute top-3 text-xs text-muted-foreground whitespace-nowrap ml-2 pointer-events-none font-medium'\n style={{ left: left + 14 }}\n >\n {ms.name}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Edit Dialog */}\n {editMode === 'dialog' && (\n <TaskEditDialog\n task={editingTask}\n open={editDialogOpen}\n onOpenChange={setEditDialogOpen}\n onSave={handleTaskSave}\n error={saveError}\n onDelete={onTaskDelete ? handleTaskDelete : undefined}\n editableFields={editableFields}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Helper: Render Marker\n// ============================================================================\n\nfunction renderMarker(marker: GanttMarker, getXPosition: (date: Date) => number) {\n const date = new Date(marker.date);\n const left = getXPosition(date);\n const color = marker.color || 'var(--primary)';\n\n if (marker.type === 'range' && marker.endDate) {\n const endDate = new Date(marker.endDate);\n const endLeft = getXPosition(endDate);\n const width = endLeft - left;\n\n return (\n <div\n key={marker.id}\n className='absolute top-0 bottom-0 opacity-20 pointer-events-none z-5'\n style={{\n left,\n width,\n backgroundColor: color,\n }}\n title={marker.label}\n />\n );\n }\n\n return (\n <div\n key={marker.id}\n className='absolute top-0 bottom-0 border-l-2 border-dashed z-20 pointer-events-none'\n style={{\n left,\n borderColor: color,\n }}\n title={marker.label}\n >\n {marker.label && (\n <span\n className='absolute top-0 left-1 text-[10px] font-semibold whitespace-nowrap px-1 rounded'\n style={{ color, backgroundColor: `color-mix(in srgb, ${color} 20%, transparent)` }}\n >\n {marker.label}\n </span>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"GanttChart.js","names":["MemoTaskBar","memo","GanttTaskBar","EMPTY_DEPENDENCIES","GanttChart","locale","enUS","optimisticTasks","setOptimisticTasks","useState","prevTasks","setPrevTasks","tasks","currentTasks","disableOptimisticUpdates","saving","setSaving","saveError","setSaveError","saveLock","useRef","sourceTasks","requestId","useEffect","graphError","useMemo","dependencies","dependencyError","planningView","schedulingOptions","workingDayPredicate","showCriticalPath","autoSchedule","planGanttTasks","error","criticalTasks","task","schedulingError","onTasksChange","displayTasks","localDate","value","parseISO","useGanttState","state","editDialogOpen","setEditDialogOpen","editingTask","setEditingTask","showTaskList","displayConfig","showChart","taskListWidth","showHorizontalBorders","gridConfig","showVerticalBorders","showWeekendHighlight","showTodayHighlight","rowIds","visibleTasks","virtualized","scrollContainerRef","windowStart","windowEnd","rowIndices","useGanttRowWindow","rowHeight","rowEvents","mountedTasks","index","todayX","getXPosition","containerWidth","viewMode","handleTaskClick","useCallback","selectTask","onTaskClick","editMode","item","publishTask","token","source","previousOptimistic","schedule","next","updatedTask","scheduleGanttTasks","onTaskUpdate","handleTaskSave","datesChanged","saved","handleDateChange","original","taskId","updated","start","end","oldStart","planningDate","oldEnd","addDays","moving","differenceInCalendarDays","getGanttWorkingDuration","handleProgressChange","handleTaskDelete","nextOptimistic","onTaskDelete","handleAddTask","parentId","handleZoomIn","maxWidth","scaleConfig","cellWidth","handleZoomOut","minWidth","t","key","cn","className","delay","GanttToolbar","setViewMode","goToPrevious","goToNext","goToToday","showAddButton","onAddTask","Button","Plus","listRef","bottomInset","selectedTaskId","hierarchyConfig","toggleTaskExpand","ChevronDown","ChevronRight","event","progressConfig","Avatar","AvatarFallback","showRowAddButton","milestones","onMilestoneClick","ms","totalDays","allDays","isMonthStart","day","isFirstMonday","isYearStart","isMonday","showUpperLabel","upperLabelText","showLowerLabel","lowerLabelText","borderClass","format","isWeekend","isToday","isSameDay","startDate","markers","renderMarker","marker","GanttDependencyLayer","left","width","getWidth","baselineLeft","baselineWidth","baselineConfig","date","TaskEditDialog","color"],"sources":["../../../../src/tools/components/gantt/GanttChart.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback, memo } from 'react';\nimport {\n format,\n isSameDay,\n isToday,\n isWeekend,\n differenceInCalendarDays,\n addDays,\n parseISO,\n} from 'date-fns';\nimport { enUS } from 'date-fns/locale';\nimport { ChevronDown, ChevronRight, Plus } from 'lucide-react';\n\nimport { Avatar, AvatarFallback } from '../ui/avatar';\nimport { Button } from '../ui/button';\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n GanttChartProps,\n GanttTask,\n ComputedTask,\n GanttMarker,\n GanttDependency,\n} from './types';\nimport { useGanttState } from './hooks/useGanttState';\nimport { GanttToolbar } from './components/GanttToolbar';\nimport { GanttTaskBar } from './components/GanttTaskBar';\nimport { TaskEditDialog } from './dialogs/TaskEditDialog';\nimport { dependencyError, scheduleGanttTasks } from './hooks/gantt-scheduling';\nimport { GanttDependencyLayer } from './components/GanttDependencyLayer';\nimport { planGanttTasks } from './hooks/gantt-planning';\nimport { useGanttRowWindow } from './hooks/use-gantt-row-window';\nimport {\n getGanttWorkingDuration,\n planningDate,\n workingDayPredicate,\n} from './hooks/gantt-working-calendar';\n\nconst MemoTaskBar = memo(GanttTaskBar);\nconst EMPTY_DEPENDENCIES: GanttDependency[] = [];\n\n/**\n * Renders hierarchical tasks, milestones and dependency planning on an editable timeline.\n * @param props - Task data, display/planning settings and host callbacks; see {@link GanttChartProps}.\n * @returns The chart with its toolbar, task list, timeline and optional edit dialog.\n * @remarks Import Appkit CSS. initialViewMode defaults to Week, editMode to dialog and\n * optimistic updates are enabled unless disableOptimisticUpdates is true. The host owns\n * persistence and must replace tasks after updates; optimistic state resets when tasks changes.\n * Date dragging/resizing and auto-scheduling require their explicit options. Calendar formatting\n * uses enUS. The root exposes data-task-count for the filtered visible task count and\n * data-virtualized=\"true\" while virtualized; no data-testid prop/attribute is implemented.\n * @example\n * ```tsx\n * import { GanttChart, type GanttTask } from '@alneas/appkit-react/tools/gantt';\n * import '@alneas/appkit-react/styles';\n *\n * const tasks: GanttTask[] = [{ id: 'phase-1', title: 'Phase 1', status: 'doing',\n * start_date: '2026-01-01', due_date: '2026-01-31', progress: 50, created_at: '2026-01-01' }];\n * export function ProjectTimeline() {\n * return <GanttChart tasks={tasks} initialViewMode=\"Week\" editMode=\"none\" />;\n * }\n * ```\n */\nexport function GanttChart({\n tasks,\n milestones = [],\n markers = [],\n onTaskClick,\n onTaskUpdate,\n onTasksChange,\n dependencies = EMPTY_DEPENDENCIES,\n autoSchedule = false,\n schedulingOptions,\n showCriticalPath = false,\n dateEditing,\n onTaskDelete,\n onAddTask,\n onMilestoneClick,\n className,\n initialViewMode = 'Week',\n taskBarDisplay = 'none',\n displayConfig,\n scaleConfig,\n gridConfig,\n baselineConfig,\n progressConfig,\n hierarchyConfig,\n filterConfig,\n editMode = 'dialog',\n editableFields,\n showAddButton,\n showRowAddButton,\n disableOptimisticUpdates = false,\n}: GanttChartProps) {\n const locale = enUS;\n\n // -------------------------------------------------------------------------\n // State Management\n // -------------------------------------------------------------------------\n\n const [optimisticTasks, setOptimisticTasks] = useState<GanttTask[] | null>(null);\n\n // Reset optimistic state during render when original tasks prop changes\n const [prevTasks, setPrevTasks] = useState<GanttTask[]>(tasks);\n if (tasks !== prevTasks) {\n setPrevTasks(tasks);\n setOptimisticTasks(null);\n }\n\n const currentTasks = disableOptimisticUpdates || !optimisticTasks ? tasks : optimisticTasks;\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | null>(null);\n const saveLock = useRef(false);\n const sourceTasks = useRef(tasks);\n const requestId = useRef(0);\n useEffect(() => {\n sourceTasks.current = tasks;\n }, [tasks]);\n useEffect(\n () => () => {\n requestId.current++;\n },\n [],\n );\n const graphError = useMemo(\n () => (dependencies.length ? dependencyError(currentTasks, dependencies) : null),\n [currentTasks, dependencies],\n );\n const planningView = useMemo(() => {\n try {\n const isWorking = schedulingOptions?.calendar\n ? workingDayPredicate(schedulingOptions.calendar)\n : undefined;\n const plan =\n showCriticalPath || (autoSchedule && schedulingOptions)\n ? planGanttTasks(currentTasks, dependencies, {\n ...schedulingOptions,\n resourceLeveling: autoSchedule ? schedulingOptions?.resourceLeveling : undefined,\n })\n : undefined;\n return { isWorking, plan, error: null };\n } catch (error) {\n return { error: error instanceof Error ? error.message : 'Invalid schedule.' };\n }\n }, [currentTasks, dependencies, schedulingOptions, showCriticalPath, autoSchedule]);\n const criticalTasks = useMemo(\n () =>\n new Map(\n showCriticalPath\n ? planningView.plan?.criticalPath.tasks.map((task) => [task.taskId, task])\n : [],\n ),\n [showCriticalPath, planningView.plan],\n );\n const schedulingError =\n autoSchedule && !onTasksChange\n ? 'Automatic scheduling requires onTasksChange for atomic updates.'\n : (graphError ?? planningView.error);\n const displayTasks = useMemo(() => {\n if (!schedulingOptions && !showCriticalPath) return currentTasks;\n const localDate = (value: GanttTask['start_date']) =>\n typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value) ? parseISO(value) : value;\n // Match day-planner date-only parsing without applying the computed schedule during render.\n return currentTasks.map((task) => ({\n ...task,\n start_date: localDate(task.start_date),\n due_date: localDate(task.due_date),\n created_at: localDate(task.created_at)!,\n }));\n }, [currentTasks, schedulingOptions, showCriticalPath]);\n\n const {\n state,\n visibleTasks,\n allDays,\n startDate,\n totalDays,\n setViewMode,\n selectTask,\n toggleTaskExpand,\n setCellWidth,\n goToToday,\n goToPrevious,\n goToNext,\n getXPosition,\n getWidth,\n } = useGanttState({\n tasks: displayTasks,\n initialViewMode,\n hierarchyConfig,\n scaleConfig,\n });\n\n const { viewMode, currentDate, cellWidth, rowHeight, selectedTaskId } = state;\n\n // Dialog state\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<GanttTask | null>(null);\n\n // -------------------------------------------------------------------------\n // Display Config Defaults\n // -------------------------------------------------------------------------\n\n const showTaskList = displayConfig?.showTaskList ?? true;\n const showChart = displayConfig?.showChart ?? true;\n const taskListWidth = displayConfig?.taskListWidth ?? 256;\n const showHorizontalBorders = gridConfig?.showHorizontalBorders ?? true;\n const showVerticalBorders = gridConfig?.showVerticalBorders ?? true;\n const showWeekendHighlight = gridConfig?.showWeekendHighlight ?? true;\n const showTodayHighlight = gridConfig?.showTodayHighlight ?? true;\n\n // -------------------------------------------------------------------------\n // Scroll Management\n // -------------------------------------------------------------------------\n\n const rowIds = useMemo(() => visibleTasks.map((task) => task.id), [visibleTasks]);\n const virtualized = displayConfig?.virtualizeRows !== false && visibleTasks.length > 100;\n const {\n chartRef: scrollContainerRef,\n listRef,\n start: windowStart,\n end: windowEnd,\n indices: rowIndices,\n bottomInset,\n onScroll,\n onFocusCapture,\n onBlurCapture,\n onKeyDownCapture,\n onPointerDownCapture,\n onPointerUpCapture,\n onPointerCancelCapture,\n onLostPointerCapture,\n } = useGanttRowWindow(\n rowIds,\n rowHeight,\n virtualized,\n editDialogOpen ? editingTask?.id : undefined,\n `${showTaskList}:${showChart}`,\n );\n const rowEvents = {\n onScroll,\n onFocusCapture,\n onBlurCapture,\n onKeyDownCapture,\n onPointerDownCapture,\n onPointerUpCapture,\n onPointerCancelCapture,\n onLostPointerCapture,\n };\n const mountedTasks = rowIndices.map((index) => ({ task: visibleTasks[index], index }));\n\n useEffect(() => {\n if (scrollContainerRef.current) {\n const todayX = getXPosition(new Date());\n const containerWidth = scrollContainerRef.current.clientWidth;\n scrollContainerRef.current.scrollLeft = todayX - containerWidth / 2;\n }\n }, [viewMode, getXPosition, scrollContainerRef]);\n\n // -------------------------------------------------------------------------\n // Handlers\n // -------------------------------------------------------------------------\n\n const handleTaskClick = useCallback(\n (task: ComputedTask) => {\n if (saveLock.current) return;\n selectTask(task.id);\n onTaskClick?.(task);\n\n if (editMode === 'dialog') {\n setEditingTask(currentTasks.find((item) => item.id === task.id) ?? task);\n setEditDialogOpen(true);\n }\n },\n [selectTask, onTaskClick, editMode, currentTasks],\n );\n\n const publishTask = useCallback(\n async (updatedTask: GanttTask, schedule: boolean) => {\n if (saveLock.current) return false;\n const token = ++requestId.current;\n const source = tasks;\n const previousOptimistic = optimisticTasks;\n saveLock.current = true;\n setSaving(true);\n setSaveError(null);\n try {\n // Validate the proposed schedule, so a dialog can repair invalid input dates.\n if (schedule && autoSchedule && !onTasksChange)\n throw new Error('Automatic scheduling requires onTasksChange for atomic updates.');\n let next = currentTasks.map((task) => (task.id === updatedTask.id ? updatedTask : task));\n if (schedule && autoSchedule)\n next = scheduleGanttTasks(next, dependencies, schedulingOptions);\n if (!disableOptimisticUpdates) setOptimisticTasks(next);\n if (onTasksChange) await onTasksChange(next);\n else await onTaskUpdate?.(updatedTask);\n return token === requestId.current;\n } catch (error) {\n if (token === requestId.current) {\n if (sourceTasks.current === source) setOptimisticTasks(previousOptimistic);\n setSaveError(error instanceof Error ? error.message : 'Unable to save task changes.');\n }\n return false;\n } finally {\n if (token === requestId.current) {\n saveLock.current = false;\n setSaving(false);\n }\n }\n },\n [\n tasks,\n optimisticTasks,\n autoSchedule,\n onTasksChange,\n currentTasks,\n dependencies,\n schedulingOptions,\n disableOptimisticUpdates,\n onTaskUpdate,\n ],\n );\n const handleTaskSave = async (updatedTask: GanttTask) => {\n // The date fields in the dialog edit duration; do not retain an earlier drag's override.\n const datesChanged =\n editingTask &&\n (String(updatedTask.start_date) !== String(editingTask.start_date) ||\n String(updatedTask.due_date) !== String(editingTask.due_date));\n const saved = await publishTask(\n autoSchedule && schedulingOptions && datesChanged\n ? { ...updatedTask, durationDays: undefined }\n : updatedTask,\n true,\n );\n if (saved) {\n setEditDialogOpen(false);\n setEditingTask(null);\n }\n return saved;\n };\n const handleDateChange = useCallback(\n (taskId: string, start: Date, end: Date) => {\n const original = currentTasks.find((task) => task.id === taskId);\n if (!original) return;\n let updated = { ...original, start_date: start, due_date: end };\n if (autoSchedule && schedulingOptions) {\n try {\n const oldStart = planningDate(original.start_date ?? original.created_at);\n const oldEnd =\n original.due_date == null ? addDays(oldStart, 1) : planningDate(original.due_date);\n const moving =\n differenceInCalendarDays(start, oldStart) === differenceInCalendarDays(end, oldEnd);\n // Moving preserves effort across weekends; resizing deliberately recalculates effort.\n updated = {\n ...updated,\n durationDays: getGanttWorkingDuration(\n moving ? original : { ...updated, durationDays: undefined },\n schedulingOptions.calendar,\n ),\n };\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : 'Invalid task dates.');\n return;\n }\n }\n void publishTask(updated, true);\n },\n [currentTasks, autoSchedule, schedulingOptions, publishTask],\n );\n const handleProgressChange = useCallback(\n (taskId: string, progress: number) => {\n const original = currentTasks.find((item) => item.id === taskId);\n if (original) void publishTask({ ...original, progress }, false);\n },\n [currentTasks, publishTask],\n );\n\n const handleTaskDelete = (taskId: string) => {\n if (saveLock.current) return;\n if (!disableOptimisticUpdates) {\n const nextOptimistic = currentTasks.filter((t) => t.id !== taskId);\n setOptimisticTasks(nextOptimistic);\n }\n\n onTaskDelete?.(taskId);\n setEditDialogOpen(false);\n setEditingTask(null);\n };\n\n const handleAddTask = (parentId?: string) => {\n onAddTask?.(parentId);\n };\n\n const handleZoomIn = () => {\n const maxWidth = scaleConfig?.maxCellWidth ?? 100;\n setCellWidth(Math.min(cellWidth * 1.5, maxWidth));\n };\n\n const handleZoomOut = () => {\n const minWidth = scaleConfig?.minCellWidth ?? 5;\n setCellWidth(Math.max(cellWidth / 1.5, minWidth));\n };\n\n // -------------------------------------------------------------------------\n // Helper for translation\n // -------------------------------------------------------------------------\n\n const t = (key: string) => {\n const map: Record<string, string> = {\n today: 'Today',\n day: 'Day',\n week: 'Week',\n month: 'Month',\n tasks: 'Tasks',\n milestones: 'Milestones',\n };\n return map[key.toLowerCase()] || key;\n };\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n return (\n <div\n aria-busy={saving}\n data-task-count={visibleTasks.length}\n data-virtualized={virtualized || undefined}\n className={cn(\n 'flex flex-col h-full bg-background border overflow-hidden [border-radius:var(--radius-lg)] [box-shadow:var(--shadow-sm)]',\n className,\n )}\n >\n {/* Toolbar */}\n {showCriticalPath && planningView.plan && (\n <div className='px-2 py-1 text-xs text-muted-foreground' role='status'>\n Critical path (dependencies only): {planningView.plan.criticalPath.taskIds.length} tasks;\n resource contention is excluded from float.\n </div>\n )}\n {autoSchedule && schedulingOptions?.resourceLeveling?.enabled && planningView.plan && (\n <details className='px-2 py-1 text-xs text-muted-foreground' data-resource-leveling>\n <summary>\n Resource leveling preview: {planningView.plan.resourceDelays.length} delayed tasks (not\n applied until save)\n </summary>\n <ul>\n {planningView.plan.resourceDelays.map((delay) => (\n <li key={delay.taskId}>\n {currentTasks.find((task) => task.id === delay.taskId)?.title ?? delay.taskId}:\n capacity +{delay.directDays}d, predecessors +{delay.propagatedDays}d\n </li>\n ))}\n </ul>\n </details>\n )}\n {(saveError || schedulingError) && (\n <div role='alert' className='p-2 text-sm text-destructive'>\n {saveError || schedulingError}\n </div>\n )}\n <GanttToolbar\n currentDate={currentDate}\n viewMode={viewMode}\n scaleConfig={scaleConfig}\n filterConfig={filterConfig}\n onViewModeChange={setViewMode}\n onPrevious={goToPrevious}\n onNext={goToNext}\n onToday={goToToday}\n onZoomIn={scaleConfig?.zoomControls ? handleZoomIn : undefined}\n onZoomOut={scaleConfig?.zoomControls ? handleZoomOut : undefined}\n />\n\n <div className='flex flex-1 min-h-0 overflow-hidden'>\n {/* Sidebar (Task Names) */}\n {showTaskList && (\n <div\n className='flex-shrink-0 border-r bg-background flex flex-col z-20 [box-shadow:var(--shadow-sm)]'\n style={{ width: taskListWidth }}\n >\n <div\n className='border-b bg-muted/10 flex items-center justify-between text-muted-foreground [padding-left:var(--spacing-4)] [padding-right:var(--spacing-4)] [font-weight:var(--font-weight-semibold)] [font-size:var(--text-sm)]'\n style={{ height: rowHeight, flexShrink: 0 }}\n >\n <span>{t('tasks')}</span>\n {showAddButton && onAddTask && (\n <Button\n variant='ghost'\n size='icon'\n className='h-6 w-6'\n onClick={() => handleAddTask()}\n >\n <Plus className='h-4 w-4' />\n </Button>\n )}\n </div>\n <div\n ref={listRef}\n {...rowEvents}\n data-gantt-list-viewport\n className='flex-1 min-h-0 overflow-auto'\n >\n <div style={{ paddingBottom: bottomInset }}>\n <div style={{ height: visibleTasks.length * rowHeight, position: 'relative' }}>\n {mountedTasks.map(({ task, index }) => (\n <div\n key={task.id}\n data-gantt-row-id={task.id}\n className={cn(\n 'border-b flex items-center px-2 text-sm font-medium hover:bg-muted/50 cursor-pointer transition-colors group',\n selectedTaskId === task.id && 'bg-muted',\n )}\n style={{\n height: rowHeight,\n position: 'absolute',\n top: index * rowHeight,\n left: 0,\n right: 0,\n paddingLeft: task.computedLevel * (hierarchyConfig?.indentWidth ?? 16) + 8,\n }}\n onClick={() => handleTaskClick(task)}\n >\n {/* Expand/Collapse */}\n {task.hasChildren ? (\n <Button\n aria-label={`${task.title}: expand/collapse`}\n aria-expanded={state.expandedTaskIds.has(task.id)}\n variant='ghost'\n size='icon'\n className='h-4 w-4 p-0 mr-1 hover:bg-muted rounded-sm'\n onClick={(e) => {\n e.stopPropagation();\n toggleTaskExpand(task.id);\n }}\n >\n {state.expandedTaskIds.has(task.id) ? (\n <ChevronDown className='h-3 w-3' />\n ) : (\n <ChevronRight className='h-3 w-3' />\n )}\n </Button>\n ) : (\n <div className='w-4' />\n )}\n\n {/* Status dot */}\n <div\n className={cn(\n 'w-2 h-2 rounded-full mr-2 flex-shrink-0',\n task.status === 'done'\n ? 'bg-green-500'\n : task.status === 'review'\n ? 'bg-primary'\n : task.status === 'doing'\n ? 'bg-blue-500'\n : task.status === 'blocked'\n ? 'bg-red-500'\n : 'bg-muted',\n )}\n />\n\n {/* Title */}\n <button\n type='button'\n className='truncate flex-1 text-left'\n onClick={(event) => {\n event.stopPropagation();\n handleTaskClick(task);\n }}\n >\n {task.title}\n </button>\n\n {/* Progress */}\n {progressConfig?.showProgress && task.computedProgress > 0 && (\n <span className='text-xs text-muted-foreground mr-2'>\n {Math.round(task.computedProgress)}%\n </span>\n )}\n\n {/* Assignee */}\n {task.assignee_id && (\n <Avatar className='h-5 w-5 ml-1 border opacity-70 group-hover:opacity-100'>\n <AvatarFallback className='text-[9px]'>\n {task.assignee_name?.[0]?.toUpperCase() ??\n task.priority?.[0]?.toUpperCase() ??\n '?'}\n </AvatarFallback>\n </Avatar>\n )}\n\n {/* Add child button */}\n {showRowAddButton && onAddTask && (\n <Button\n variant='ghost'\n size='icon'\n className='h-5 w-5 opacity-0 group-hover:opacity-100'\n onClick={(e) => {\n e.stopPropagation();\n handleAddTask(task.id);\n }}\n >\n <Plus className='h-3 w-3' />\n </Button>\n )}\n </div>\n ))}\n </div>\n\n {/* Milestones header */}\n {milestones.length > 0 && (\n <div\n className='border-b bg-muted/5 flex items-center px-4 text-xs font-semibold text-muted-foreground uppercase'\n style={{ height: rowHeight }}\n >\n {t('milestones')}\n </div>\n )}\n\n {/* Milestones */}\n {milestones.map((ms) => (\n <div\n key={ms.id}\n className='border-b flex items-center px-4 text-sm hover:bg-muted/50 cursor-pointer'\n style={{ height: rowHeight }}\n onClick={() => onMilestoneClick?.(ms)}\n >\n <div className='w-2 h-2 rotate-45 bg-amber-500 mr-2 flex-shrink-0' />\n <span className='truncate'>{ms.name}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Main Chart Area */}\n {showChart && (\n <div\n ref={scrollContainerRef}\n {...rowEvents}\n data-gantt-chart-viewport\n role='region'\n aria-label='Gantt timeline'\n tabIndex={0}\n className='flex-1 min-w-0 overflow-auto bg-muted/5 relative'\n >\n <div style={{ width: `${totalDays * cellWidth}px`, minWidth: '100%' }}>\n {/* Timeline Header */}\n <div\n className='sticky top-0 z-10 bg-background border-b flex relative'\n style={{ height: rowHeight }}\n >\n {allDays.map((day) => {\n const isMonthStart = day.getDate() === 1;\n const isFirstMonday = day.getDate() <= 7 && day.getDay() === 1;\n const isYearStart = day.getMonth() === 0 && day.getDate() === 1;\n const isMonday = day.getDay() === 1;\n\n let showUpperLabel = false;\n let upperLabelText = '';\n let showLowerLabel = false;\n let lowerLabelText = '';\n let borderClass = showVerticalBorders ? 'border-r' : '';\n\n if (viewMode === 'Day') {\n showUpperLabel = isMonthStart;\n upperLabelText = format(day, 'yyyy MMMM', { locale });\n showLowerLabel = true;\n lowerLabelText = format(day, 'd', { locale });\n } else if (viewMode === 'Week') {\n showUpperLabel = isFirstMonday || (isMonthStart && day.getDay() === 1);\n upperLabelText = format(day, 'yyyy MMM', { locale });\n showLowerLabel = isMonday;\n lowerLabelText = format(day, 'd', { locale });\n borderClass = isMonday && showVerticalBorders ? 'border-l border-border' : '';\n } else if (viewMode === 'Month') {\n showUpperLabel = isYearStart;\n upperLabelText = format(day, 'yyyy', { locale });\n showLowerLabel = isMonthStart;\n borderClass =\n isMonthStart && showVerticalBorders ? 'border-l border-border' : '';\n if (showLowerLabel) lowerLabelText = format(day, 'MMM', { locale });\n }\n\n return (\n <div\n key={day.toISOString()}\n className={cn(\n 'flex-shrink-0 flex flex-col justify-end pb-1 text-[10px] text-muted-foreground select-none text-center relative',\n borderClass,\n (planningView.isWorking\n ? !planningView.isWorking(day)\n : showWeekendHighlight && isWeekend(day)) &&\n viewMode === 'Day' &&\n 'bg-muted/10',\n showTodayHighlight &&\n isToday(day) &&\n 'bg-primary/10 font-semibold text-primary',\n )}\n style={{ width: cellWidth }}\n >\n {showUpperLabel && (\n <span className='absolute top-1 left-1 text-xs font-bold text-foreground pl-1 whitespace-nowrap z-10'>\n {upperLabelText}\n </span>\n )}\n {showLowerLabel && (\n <span\n className={cn(\n viewMode !== 'Day' && 'absolute bottom-1 left-1',\n 'whitespace-nowrap tracking-tighter',\n )}\n >\n {lowerLabelText}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Grid & Task Bars */}\n <div className='relative'>\n {/* Background Grid */}\n <div className='absolute inset-0 flex pointer-events-none'>\n {allDays.map((day) => {\n let borderClass = '';\n if (showVerticalBorders) {\n if (viewMode === 'Day') {\n borderClass = 'border-r';\n } else if (viewMode === 'Week' && day.getDay() === 1) {\n borderClass = 'border-l';\n } else if (viewMode === 'Month' && day.getDate() === 1) {\n borderClass = 'border-l';\n }\n }\n\n return (\n <div\n key={`grid-${day.toISOString()}`}\n className={cn(\n 'flex-shrink-0 h-full',\n borderClass,\n (planningView.isWorking\n ? !planningView.isWorking(day)\n : showWeekendHighlight && isWeekend(day)) && viewMode === 'Day'\n ? 'bg-muted/20'\n : 'bg-transparent',\n showTodayHighlight && isToday(day) && 'bg-primary/5',\n )}\n style={{ width: cellWidth }}\n />\n );\n })}\n\n {/* Current Time Indicator */}\n {(isSameDay(new Date(), startDate) || new Date() > startDate) &&\n viewMode !== 'Month' && (\n <div\n className='absolute top-0 bottom-0 border-l-2 border-red-500/50 z-30 pointer-events-none'\n style={{ left: getXPosition(new Date()) + cellWidth / 2 }}\n >\n <div className='w-2 h-2 bg-red-500 rounded-full -ml-[5px] mt-[-4px]' />\n </div>\n )}\n\n {/* Custom Markers */}\n {markers.map((marker) => renderMarker(marker, getXPosition))}\n </div>\n\n {/* Task Rows */}\n {!graphError && dependencies.length > 0 && (\n <GanttDependencyLayer\n tasks={visibleTasks}\n dependencies={dependencies}\n criticalDependencyIds={\n showCriticalPath\n ? new Set(planningView.plan?.criticalPath.dependencyIds)\n : undefined\n }\n rowHeight={rowHeight}\n width={totalDays * cellWidth}\n getXPosition={getXPosition}\n getWidth={getWidth}\n rowWindow={virtualized ? { start: windowStart, end: windowEnd } : undefined}\n />\n )}\n <div>\n <div style={{ height: visibleTasks.length * rowHeight, position: 'relative' }}>\n {mountedTasks.map(({ task, index }) => {\n const left = getXPosition(task.computedStart);\n const width = getWidth(task.computedStart, task.computedEnd);\n\n // Baseline positions\n let baselineLeft: number | undefined;\n let baselineWidth: number | undefined;\n if (\n baselineConfig?.showBaseline &&\n task.baseline_start &&\n task.baseline_end\n ) {\n baselineLeft = getXPosition(new Date(task.baseline_start));\n baselineWidth = getWidth(\n new Date(task.baseline_start),\n new Date(task.baseline_end),\n );\n }\n\n return (\n <div\n key={task.id}\n data-gantt-row-id={task.id}\n className={cn('relative', showHorizontalBorders && 'border-b')}\n style={{\n height: rowHeight,\n position: 'absolute',\n top: index * rowHeight,\n left: 0,\n right: 0,\n }}\n >\n <MemoTaskBar\n task={task}\n critical={criticalTasks.get(task.id)?.critical}\n totalFloatDays={criticalTasks.get(task.id)?.totalFloatDays}\n left={left}\n width={width}\n rowHeight={rowHeight}\n taskBarDisplay={taskBarDisplay}\n progressConfig={progressConfig}\n baselineConfig={baselineConfig}\n baselineLeft={baselineLeft}\n baselineWidth={baselineWidth}\n onClick={handleTaskClick}\n dateEditing={dateEditing}\n cellWidth={cellWidth}\n editingDisabled={saving}\n onDateChange={\n editMode !== 'none' &&\n (onTasksChange || onTaskUpdate) &&\n !task.hasChildren &&\n !(autoSchedule && schedulingError)\n ? handleDateChange\n : undefined\n }\n onProgressChange={\n editMode !== 'none' &&\n (onTasksChange || onTaskUpdate) &&\n !(task.hasChildren && hierarchyConfig?.autoRollupProgress)\n ? handleProgressChange\n : undefined\n }\n />\n </div>\n );\n })}\n </div>\n {milestones.length > 0 && <div aria-hidden style={{ height: rowHeight }} />}\n\n {/* Milestone Rows */}\n {milestones.map((ms) => {\n const date = ms.due_date ? new Date(ms.due_date) : new Date();\n const left = getXPosition(date);\n\n return (\n <div\n key={ms.id}\n className={cn('relative', showHorizontalBorders && 'border-b')}\n style={{ height: rowHeight }}\n >\n <div\n className='absolute top-3 w-6 h-6 rotate-45 bg-amber-400 border-2 border-background shadow-md hover:scale-110 transition-transform cursor-help z-10'\n style={{ left: left - 10 }}\n title={`${ms.name} - ${format(date, 'MMM d')}`}\n />\n <span\n className='absolute top-3 text-xs text-muted-foreground whitespace-nowrap ml-2 pointer-events-none font-medium'\n style={{ left: left + 14 }}\n >\n {ms.name}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Edit Dialog */}\n {editMode === 'dialog' && (\n <TaskEditDialog\n task={editingTask}\n open={editDialogOpen}\n onOpenChange={setEditDialogOpen}\n onSave={handleTaskSave}\n error={saveError}\n onDelete={onTaskDelete ? handleTaskDelete : undefined}\n editableFields={editableFields}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Helper: Render Marker\n// ============================================================================\n\nfunction renderMarker(marker: GanttMarker, getXPosition: (date: Date) => number) {\n const date = new Date(marker.date);\n const left = getXPosition(date);\n const color = marker.color || 'var(--primary)';\n\n if (marker.type === 'range' && marker.endDate) {\n const endDate = new Date(marker.endDate);\n const endLeft = getXPosition(endDate);\n const width = endLeft - left;\n\n return (\n <div\n key={marker.id}\n className='absolute top-0 bottom-0 opacity-20 pointer-events-none z-5'\n style={{\n left,\n width,\n backgroundColor: color,\n }}\n title={marker.label}\n />\n );\n }\n\n return (\n <div\n key={marker.id}\n className='absolute top-0 bottom-0 border-l-2 border-dashed z-20 pointer-events-none'\n style={{\n left,\n borderColor: color,\n }}\n title={marker.label}\n >\n {marker.label && (\n <span\n className='absolute top-0 left-1 text-[10px] font-semibold whitespace-nowrap px-1 rounded'\n style={{ color, backgroundColor: `color-mix(in srgb, ${color} 20%, transparent)` }}\n >\n {marker.label}\n </span>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../ui/lib/utils.cjs"),t=require("../hooks/gantt-hierarchy.cjs"),n=require("../hooks/use-gantt-date-editing.cjs");let r=require("react/jsx-runtime"),i=require("date-fns");function a({task:a,left:o,width:s,rowHeight:c,taskBarDisplay:l=`none`,progressConfig:u,baselineConfig:d,baselineLeft:f,baselineWidth:p,onClick:m,onProgressChange:h,dateEditing:g,cellWidth:_=0,onDateChange:v,editingDisabled:y=!1,critical:b,totalFloatDays:x}){let S=n.useGanttDateEditing(a,_,g,v,y),C=S.bind(`move`),w=o+S.leftDelta,T=s+S.widthDelta,E={done:`bg-green-500 hover:bg-green-600`,review:`bg-primary hover:bg-primary/90`,doing:`bg-blue-500 hover:bg-blue-600`,todo:`bg-muted-foreground/70 hover:bg-muted-foreground`,blocked:`bg-red-500 hover:bg-red-600`},D=E[a.status]||E.todo,O=a.due_date&&new Date(a.due_date)<new Date&&a.status!==`done`,k=u?.showProgress&&a.computedProgress>0,A=d?.showBaseline&&f!==void 0&&p!==void 0,j=(()=>{if(l===`none`)return``;let e=`${(0,i.differenceInDays)(a.computedEnd,a.computedStart)}d`,t=(0,i.format)(a.computedEnd,`M/d`);switch(l){case`duration`:return e;case`end-date`:return t;case`both`:return`${e} (${t})`;default:return``}})(),M=c-16;return(0,r.jsxs)(`div`,{className:`h-full relative group`,children:[A&&(0,r.jsx)(`div`,{className:e.cn(`absolute rounded-sm opacity-40`,d.baselineColor||`bg-muted-foreground`),style:{left:f,width:p,height:M-8,top:d?.baselinePosition===`above`?4:d?.baselinePosition===`below`?8+M-8:12}}),(0,r.jsxs)(`div`,{...C,"data-task-bar":a.id,"data-critical":b||void 0,title:x===void 0?void 0:`${a.title}: total float ${x} working days (dependencies only)`,role:m||S.available(`move`)?`button`:void 0,tabIndex:m||S.available(`move`)?0:void 0,"aria-disabled":y||void 0,"aria-label":S.allowed(`move`)?`${a.title}: move with Left/Right, Enter to edit, Escape to cancel drag`:a.title,onKeyDown:e=>{C.onKeyDown(e),e.target===e.currentTarget&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),e.stopPropagation(),m?.(a))},className:e.cn(`absolute rounded-md shadow-sm cursor-pointer transition-all border border-white/20 select-none flex items-center overflow-hidden`,D,O&&`ring-2 ring-destructive ring-offset-1`,b&&`outline outline-2 outline-offset-2 outline-fuchsia-600`),style:{left:w,width:T,touchAction:S.allowed(`move`)?`none`:void 0,height:M,top:8},onClick:e=>{e.stopPropagation(),!S.consumeClick()&&m?.(a)},children:[k&&(0,r.jsx)(`div`,{className:e.cn(`absolute inset-0 opacity-30`,u.progressColor||`bg-white`),style:{width:`${a.computedProgress}%`,borderRadius:`inherit`}}),(0,r.jsxs)(`div`,{className:`relative z-10 flex items-center justify-between w-full px-2`,children:[s>50&&(0,r.jsx)(`span`,{className:`text-[10px] sm:text-xs font-semibold text-white truncate drop-shadow-md`,children:a.title}),k&&s>80&&(0,r.jsxs)(`span`,{className:`text-[9px] text-white/80 ml-1 flex-shrink-0`,children:[Math.round(a.computedProgress),`%`]}),j&&s>100&&(0,r.jsx)(`span`,{className:`text-[9px] text-white/70 ml-auto flex-shrink-0`,children:j})]})]}),S.available(`start`)&&[`start`,`end`].map(e=>(0,r.jsx)(`button`,{type:`button`,...S.bind(e),disabled:y,"data-resize-edge":e,"aria-label":`${a.title}: resize ${e} with Left/Right`,className:`absolute z-30 cursor-ew-resize rounded bg-foreground/30 focus-visible:ring-2 focus-visible:ring-primary`,style:{left:e===`start`?w:w+T-8,top:8,width:8,height:M,touchAction:`none`},onClick:e=>e.stopPropagation()},e)),u?.editableProgress&&h&&(0,r.jsx)(`input`,{type:`range`,disabled:y,min:0,max:100,step:1,value:t.boundedProgress(a.computedProgress),"aria-label":`${a.title}: progress`,"aria-valuetext":`${Math.round(t.boundedProgress(a.computedProgress))}%`,className:`absolute z-20 accent-primary`,style:{left:o,width:Math.max(s,40),top:c-14,height:12},onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),onChange:e=>h(a.id,Number(e.currentTarget.value))}),s<=50&&(0,r.jsx)(`div`,{className:`absolute flex items-center text-xs text-foreground/70 whitespace-nowrap pl-2 pointer-events-none`,style:{left:o+s,top:8,height:M},children:a.title})]})}exports.GanttTaskBar=a;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../ui/lib/utils.cjs"),t=require("../hooks/gantt-hierarchy.cjs"),n=require("../hooks/use-gantt-date-editing.cjs");let r=require("react/jsx-runtime"),i=require("date-fns");function a({task:a,left:o,width:s,rowHeight:c,taskBarDisplay:l=`none`,progressConfig:u,baselineConfig:d,baselineLeft:f,baselineWidth:p,onClick:m,onProgressChange:h,dateEditing:g,cellWidth:_=0,onDateChange:v,editingDisabled:y=!1,critical:b,totalFloatDays:x}){let S=n.useGanttDateEditing(a,_,g,v,y),C=S.bind(`move`),w=o+S.leftDelta,T=s+S.widthDelta,E={done:`bg-green-500 hover:bg-green-600`,review:`bg-primary hover:bg-primary/90`,doing:`bg-blue-500 hover:bg-blue-600`,todo:`bg-muted-foreground/70 hover:bg-muted-foreground`,blocked:`bg-red-500 hover:bg-red-600`},D=E[a.status]||E.todo,O=a.due_date&&new Date(a.due_date)<new Date&&a.status!==`done`,k=u?.showProgress&&a.computedProgress>0,A=d?.showBaseline&&f!==void 0&&p!==void 0,j=(()=>{if(l===`none`)return``;let e=`${(0,i.differenceInDays)(a.computedEnd,a.computedStart)}d`,t=(0,i.format)(a.computedEnd,`M/d`);switch(l){case`duration`:return e;case`end-date`:return t;case`both`:return`${e} (${t})`;default:return``}})(),M=c-16;return(0,r.jsxs)(`div`,{className:`h-full relative group`,children:[A&&(0,r.jsx)(`div`,{className:e.cn(`absolute rounded-sm opacity-40`,d.baselineColor||`bg-muted-foreground`),style:{left:f,width:p,height:M-8,top:d?.baselinePosition===`above`?4:d?.baselinePosition===`below`?8+M-8:12}}),(0,r.jsxs)(`div`,{...C,"data-task-bar":a.id,"data-critical":b||void 0,title:x===void 0?void 0:`${a.title}: total float ${x} working days (dependencies only)`,role:m||S.available(`move`)?`button`:void 0,tabIndex:m||S.available(`move`)?0:void 0,"aria-label":s<=50?a.title:void 0,"aria-disabled":y||void 0,"aria-description":S.allowed(`move`)?`Move with Left/Right, Enter to edit, Escape to cancel drag`:void 0,onKeyDown:e=>{C.onKeyDown(e),e.target===e.currentTarget&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),e.stopPropagation(),m?.(a))},className:e.cn(`absolute rounded-md shadow-sm cursor-pointer transition-all border border-white/20 select-none flex items-center overflow-hidden`,D,O&&`ring-2 ring-destructive ring-offset-1`,b&&`outline outline-2 outline-offset-2 outline-fuchsia-600`),style:{left:w,width:T,touchAction:S.allowed(`move`)?`none`:void 0,height:M,top:8},onClick:e=>{e.stopPropagation(),!S.consumeClick()&&m?.(a)},children:[k&&(0,r.jsx)(`div`,{className:e.cn(`absolute inset-0 opacity-30`,u.progressColor||`bg-white`),style:{width:`${a.computedProgress}%`,borderRadius:`inherit`}}),(0,r.jsxs)(`div`,{className:`relative z-10 flex items-center justify-between w-full px-2`,children:[s>50&&(0,r.jsx)(`span`,{className:`text-[10px] sm:text-xs font-semibold text-white truncate drop-shadow-md`,children:a.title}),k&&s>80&&(0,r.jsxs)(`span`,{className:`text-[9px] text-white/80 ml-1 flex-shrink-0`,children:[Math.round(a.computedProgress),`%`]}),j&&s>100&&(0,r.jsx)(`span`,{className:`text-[9px] text-white/70 ml-auto flex-shrink-0`,children:j})]})]}),S.available(`start`)&&[`start`,`end`].map(e=>(0,r.jsx)(`button`,{type:`button`,...S.bind(e),disabled:y,"data-resize-edge":e,"aria-label":`${a.title}: resize ${e} with Left/Right`,className:`absolute z-30 cursor-ew-resize rounded bg-foreground/30 focus-visible:ring-2 focus-visible:ring-primary`,style:{left:e===`start`?w:w+T-8,top:8,width:8,height:M,touchAction:`none`},onClick:e=>e.stopPropagation()},e)),u?.editableProgress&&h&&(0,r.jsx)(`input`,{type:`range`,disabled:y,min:0,max:100,step:1,value:t.boundedProgress(a.computedProgress),"aria-label":`${a.title}: progress`,"aria-valuetext":`${Math.round(t.boundedProgress(a.computedProgress))}%`,className:`absolute z-20 accent-primary`,style:{left:o,width:Math.max(s,40),top:c-14,height:12},onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),onChange:e=>h(a.id,Number(e.currentTarget.value))}),s<=50&&(0,r.jsx)(`div`,{className:`absolute flex items-center text-xs text-foreground/70 whitespace-nowrap pl-2 pointer-events-none`,style:{left:o+s,top:8,height:M},children:a.title})]})}exports.GanttTaskBar=a;
2
2
  //# sourceMappingURL=GanttTaskBar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"GanttTaskBar.cjs","names":["useGanttDateEditing","differenceInDays","format","cn","boundedProgress","require_ui_lib_utils","require_tools_components_gantt_hooks_gantt_hierarchy","require_tools_components_gantt_hooks_use_gantt_date_editing","react_jsx_runtime","date_fns","GanttTaskBar","editing","task","cellWidth","dateEditing","onDateChange","editingDisabled","move","displayLeft","left","displayWidth","width","statusColors","statusColor","isLate","showProgress","progressConfig","showBaseline","baselineConfig","baselineLeft","baselineWidth","displayText","taskBarDisplay","durationText","endText","barHeight","rowHeight","critical","totalFloatDays","onClick","event","edge","onProgressChange"],"sources":["../../../../../src/tools/components/gantt/components/GanttTaskBar.tsx"],"sourcesContent":["/**\n * Gantt Task Bar Component\n *\n * Renders an individual task bar with progress, status color, and interactions.\n */\n\nimport { cn } from \"../../../lib/utils\";\nimport type {\n ComputedTask,\n GanttProgressConfig,\n GanttBaselineConfig,\n TaskBarDisplay,\n GanttDateEditingConfig,\n} from '../types';\nimport { differenceInDays, format } from 'date-fns';\nimport { boundedProgress } from '../hooks/gantt-hierarchy';\nimport { useGanttDateEditing } from '../hooks/use-gantt-date-editing';\n\nexport interface GanttTaskBarProps {\n task: ComputedTask;\n left: number;\n width: number;\n rowHeight: number;\n taskBarDisplay?: TaskBarDisplay;\n progressConfig?: GanttProgressConfig;\n baselineConfig?: GanttBaselineConfig;\n baselineLeft?: number;\n baselineWidth?: number;\n onClick?: (task: ComputedTask) => void;\n onProgressChange?: (taskId: string, progress: number) => void;\n /** Opt-in pointer/keyboard date editing. */\n dateEditing?: GanttDateEditingConfig;\n /** Pixels per calendar day; required for pointer date editing. */\n cellWidth?: number;\n /** Committed date edit, excluding pointer previews. */\n onDateChange?: (taskId: string, start: Date, end: Date) => void;\n /** Temporarily disable controls during persistence without unmounting them. */\n editingDisabled?: boolean;\n /** Dependency-only critical-path emphasis. */\n critical?: boolean;\n /** Total float in working days, displayed in the tooltip. */\n totalFloatDays?: number;\n}\n\n/**\n * 個々のタスクの期間、進捗率、ステータスに応じた色、基準計画(ベースライン)をタイムライン上にバーとして描画するコンポーネント。\n */\nexport function GanttTaskBar({\n task,\n left,\n width,\n rowHeight,\n taskBarDisplay = 'none',\n progressConfig,\n baselineConfig,\n baselineLeft,\n baselineWidth,\n onClick,\n onProgressChange,\n dateEditing,\n cellWidth = 0,\n onDateChange,\n editingDisabled = false,\n critical,\n totalFloatDays,\n}: GanttTaskBarProps) {\n const editing = useGanttDateEditing(task, cellWidth, dateEditing, onDateChange, editingDisabled);\n const move = editing.bind('move');\n const displayLeft = left + editing.leftDelta;\n const displayWidth = width + editing.widthDelta;\n // Status colors\n const statusColors: Record<string, string> = {\n done: 'bg-green-500 hover:bg-green-600',\n review: 'bg-primary hover:bg-primary/90',\n doing: 'bg-blue-500 hover:bg-blue-600',\n todo: 'bg-muted-foreground/70 hover:bg-muted-foreground',\n blocked: 'bg-red-500 hover:bg-red-600',\n };\n\n const statusColor = statusColors[task.status] || statusColors.todo;\n const isLate = task.due_date && new Date(task.due_date) < new Date() && task.status !== 'done';\n const showProgress = progressConfig?.showProgress && task.computedProgress > 0;\n const showBaseline =\n baselineConfig?.showBaseline && baselineLeft !== undefined && baselineWidth !== undefined;\n\n // Calculate display text\n const getDisplayText = (): string => {\n if (taskBarDisplay === 'none') return '';\n\n const duration = differenceInDays(task.computedEnd, task.computedStart);\n const durationText = `${duration}d`;\n const endText = format(task.computedEnd, 'M/d');\n\n switch (taskBarDisplay) {\n case 'duration':\n return durationText;\n case 'end-date':\n return endText;\n case 'both':\n return `${durationText} (${endText})`;\n default:\n return '';\n }\n };\n\n const displayText = getDisplayText();\n const barHeight = rowHeight - 16; // 8px padding top/bottom\n const barTop = 8;\n\n return (\n <div className='h-full relative group'>\n {/* Baseline bar (if enabled) */}\n {showBaseline && (\n <div\n className={cn(\n 'absolute rounded-sm opacity-40',\n baselineConfig.baselineColor || 'bg-muted-foreground',\n )}\n style={{\n left: baselineLeft,\n width: baselineWidth,\n height: barHeight - 8,\n top:\n baselineConfig?.baselinePosition === 'above'\n ? barTop - 4\n : baselineConfig?.baselinePosition === 'below'\n ? barTop + barHeight - 8\n : barTop + 4,\n }}\n />\n )}\n\n {/* Main task bar */}\n <div\n {...move}\n data-task-bar={task.id}\n data-critical={critical || undefined}\n title={\n totalFloatDays === undefined\n ? undefined\n : `${task.title}: total float ${totalFloatDays} working days (dependencies only)`\n }\n role={onClick || editing.available('move') ? 'button' : undefined}\n tabIndex={onClick || editing.available('move') ? 0 : undefined}\n aria-disabled={editingDisabled || undefined}\n aria-label={\n editing.allowed('move')\n ? `${task.title}: move with Left/Right, Enter to edit, Escape to cancel drag`\n : task.title\n }\n onKeyDown={(event) => {\n move.onKeyDown(event);\n if (\n event.target === event.currentTarget &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n event.stopPropagation();\n onClick?.(task);\n }\n }}\n className={cn(\n 'absolute rounded-md shadow-sm cursor-pointer transition-all border border-white/20 select-none flex items-center overflow-hidden',\n statusColor,\n isLate && 'ring-2 ring-destructive ring-offset-1',\n critical && 'outline outline-2 outline-offset-2 outline-fuchsia-600',\n )}\n style={{\n left: displayLeft,\n width: displayWidth,\n touchAction: editing.allowed('move') ? 'none' : undefined,\n height: barHeight,\n top: barTop,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (editing.consumeClick()) return;\n onClick?.(task);\n }}\n >\n {/* Progress fill */}\n {showProgress && (\n <div\n className={cn(\n 'absolute inset-0 opacity-30',\n progressConfig.progressColor || 'bg-white',\n )}\n style={{\n width: `${task.computedProgress}%`,\n borderRadius: 'inherit',\n }}\n />\n )}\n\n {/* Content */}\n <div className='relative z-10 flex items-center justify-between w-full px-2'>\n {/* Title (only if wide enough) */}\n {width > 50 && (\n <span className='text-[10px] sm:text-xs font-semibold text-white truncate drop-shadow-md'>\n {task.title}\n </span>\n )}\n\n {/* Progress percentage */}\n {showProgress && width > 80 && (\n <span className='text-[9px] text-white/80 ml-1 flex-shrink-0'>\n {Math.round(task.computedProgress)}%\n </span>\n )}\n\n {/* Duration/End display */}\n {displayText && width > 100 && (\n <span className='text-[9px] text-white/70 ml-auto flex-shrink-0'>{displayText}</span>\n )}\n </div>\n </div>\n\n {editing.available('start') &&\n (['start', 'end'] as const).map((edge) => (\n <button\n key={edge}\n type='button'\n {...editing.bind(edge)}\n disabled={editingDisabled}\n data-resize-edge={edge}\n aria-label={`${task.title}: resize ${edge} with Left/Right`}\n className='absolute z-30 cursor-ew-resize rounded bg-foreground/30 focus-visible:ring-2 focus-visible:ring-primary'\n style={{\n left: edge === 'start' ? displayLeft : displayLeft + displayWidth - 8,\n top: barTop,\n width: 8,\n height: barHeight,\n touchAction: 'none',\n }}\n onClick={(event) => event.stopPropagation()}\n />\n ))}\n\n {progressConfig?.editableProgress && onProgressChange && (\n <input\n type='range'\n disabled={editingDisabled}\n min={0}\n max={100}\n step={1}\n value={boundedProgress(task.computedProgress)}\n aria-label={`${task.title}: progress`}\n aria-valuetext={`${Math.round(boundedProgress(task.computedProgress))}%`}\n className='absolute z-20 accent-primary'\n style={{ left, width: Math.max(width, 40), top: rowHeight - 14, height: 12 }}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n onChange={(event) => onProgressChange(task.id, Number(event.currentTarget.value))}\n />\n )}\n\n {/* External title (if bar too narrow) */}\n {width <= 50 && (\n <div\n className='absolute flex items-center text-xs text-foreground/70 whitespace-nowrap pl-2 pointer-events-none'\n style={{\n left: left + width,\n top: barTop,\n height: barHeight,\n }}\n >\n {task.title}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"GanttTaskBar.cjs","names":["useGanttDateEditing","differenceInDays","format","cn","boundedProgress","require_ui_lib_utils","require_tools_components_gantt_hooks_gantt_hierarchy","require_tools_components_gantt_hooks_use_gantt_date_editing","react_jsx_runtime","date_fns","GanttTaskBar","editing","task","cellWidth","dateEditing","onDateChange","editingDisabled","move","displayLeft","left","displayWidth","width","statusColors","statusColor","isLate","showProgress","progressConfig","showBaseline","baselineConfig","baselineLeft","baselineWidth","displayText","taskBarDisplay","durationText","endText","barHeight","rowHeight","critical","totalFloatDays","onClick","event","edge","onProgressChange"],"sources":["../../../../../src/tools/components/gantt/components/GanttTaskBar.tsx"],"sourcesContent":["/**\n * Gantt Task Bar Component\n *\n * Renders an individual task bar with progress, status color, and interactions.\n */\n\nimport { cn } from \"../../../lib/utils\";\nimport type {\n ComputedTask,\n GanttProgressConfig,\n GanttBaselineConfig,\n TaskBarDisplay,\n GanttDateEditingConfig,\n} from '../types';\nimport { differenceInDays, format } from 'date-fns';\nimport { boundedProgress } from '../hooks/gantt-hierarchy';\nimport { useGanttDateEditing } from '../hooks/use-gantt-date-editing';\n\nexport interface GanttTaskBarProps {\n task: ComputedTask;\n left: number;\n width: number;\n rowHeight: number;\n taskBarDisplay?: TaskBarDisplay;\n progressConfig?: GanttProgressConfig;\n baselineConfig?: GanttBaselineConfig;\n baselineLeft?: number;\n baselineWidth?: number;\n onClick?: (task: ComputedTask) => void;\n onProgressChange?: (taskId: string, progress: number) => void;\n /** Opt-in pointer/keyboard date editing. */\n dateEditing?: GanttDateEditingConfig;\n /** Pixels per calendar day; required for pointer date editing. */\n cellWidth?: number;\n /** Committed date edit, excluding pointer previews. */\n onDateChange?: (taskId: string, start: Date, end: Date) => void;\n /** Temporarily disable controls during persistence without unmounting them. */\n editingDisabled?: boolean;\n /** Dependency-only critical-path emphasis. */\n critical?: boolean;\n /** Total float in working days, displayed in the tooltip. */\n totalFloatDays?: number;\n}\n\n/**\n * 個々のタスクの期間、進捗率、ステータスに応じた色、基準計画(ベースライン)をタイムライン上にバーとして描画するコンポーネント。\n */\nexport function GanttTaskBar({\n task,\n left,\n width,\n rowHeight,\n taskBarDisplay = 'none',\n progressConfig,\n baselineConfig,\n baselineLeft,\n baselineWidth,\n onClick,\n onProgressChange,\n dateEditing,\n cellWidth = 0,\n onDateChange,\n editingDisabled = false,\n critical,\n totalFloatDays,\n}: GanttTaskBarProps) {\n const editing = useGanttDateEditing(task, cellWidth, dateEditing, onDateChange, editingDisabled);\n const move = editing.bind('move');\n const displayLeft = left + editing.leftDelta;\n const displayWidth = width + editing.widthDelta;\n // Status colors\n const statusColors: Record<string, string> = {\n done: 'bg-green-500 hover:bg-green-600',\n review: 'bg-primary hover:bg-primary/90',\n doing: 'bg-blue-500 hover:bg-blue-600',\n todo: 'bg-muted-foreground/70 hover:bg-muted-foreground',\n blocked: 'bg-red-500 hover:bg-red-600',\n };\n\n const statusColor = statusColors[task.status] || statusColors.todo;\n const isLate = task.due_date && new Date(task.due_date) < new Date() && task.status !== 'done';\n const showProgress = progressConfig?.showProgress && task.computedProgress > 0;\n const showBaseline =\n baselineConfig?.showBaseline && baselineLeft !== undefined && baselineWidth !== undefined;\n\n // Calculate display text\n const getDisplayText = (): string => {\n if (taskBarDisplay === 'none') return '';\n\n const duration = differenceInDays(task.computedEnd, task.computedStart);\n const durationText = `${duration}d`;\n const endText = format(task.computedEnd, 'M/d');\n\n switch (taskBarDisplay) {\n case 'duration':\n return durationText;\n case 'end-date':\n return endText;\n case 'both':\n return `${durationText} (${endText})`;\n default:\n return '';\n }\n };\n\n const displayText = getDisplayText();\n const barHeight = rowHeight - 16; // 8px padding top/bottom\n const barTop = 8;\n\n return (\n <div className='h-full relative group'>\n {/* Baseline bar (if enabled) */}\n {showBaseline && (\n <div\n className={cn(\n 'absolute rounded-sm opacity-40',\n baselineConfig.baselineColor || 'bg-muted-foreground',\n )}\n style={{\n left: baselineLeft,\n width: baselineWidth,\n height: barHeight - 8,\n top:\n baselineConfig?.baselinePosition === 'above'\n ? barTop - 4\n : baselineConfig?.baselinePosition === 'below'\n ? barTop + barHeight - 8\n : barTop + 4,\n }}\n />\n )}\n\n {/* Main task bar */}\n <div\n {...move}\n data-task-bar={task.id}\n data-critical={critical || undefined}\n title={\n totalFloatDays === undefined\n ? undefined\n : `${task.title}: total float ${totalFloatDays} working days (dependencies only)`\n }\n role={onClick || editing.available('move') ? 'button' : undefined}\n tabIndex={onClick || editing.available('move') ? 0 : undefined}\n aria-label={width <= 50 ? task.title : undefined}\n aria-disabled={editingDisabled || undefined}\n aria-description={editing.allowed('move') ? 'Move with Left/Right, Enter to edit, Escape to cancel drag' : undefined}\n onKeyDown={(event) => {\n move.onKeyDown(event);\n if (\n event.target === event.currentTarget &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n event.stopPropagation();\n onClick?.(task);\n }\n }}\n className={cn(\n 'absolute rounded-md shadow-sm cursor-pointer transition-all border border-white/20 select-none flex items-center overflow-hidden',\n statusColor,\n isLate && 'ring-2 ring-destructive ring-offset-1',\n critical && 'outline outline-2 outline-offset-2 outline-fuchsia-600',\n )}\n style={{\n left: displayLeft,\n width: displayWidth,\n touchAction: editing.allowed('move') ? 'none' : undefined,\n height: barHeight,\n top: barTop,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (editing.consumeClick()) return;\n onClick?.(task);\n }}\n >\n {/* Progress fill */}\n {showProgress && (\n <div\n className={cn(\n 'absolute inset-0 opacity-30',\n progressConfig.progressColor || 'bg-white',\n )}\n style={{\n width: `${task.computedProgress}%`,\n borderRadius: 'inherit',\n }}\n />\n )}\n\n {/* Content */}\n <div className='relative z-10 flex items-center justify-between w-full px-2'>\n {/* Title (only if wide enough) */}\n {width > 50 && (\n <span className='text-[10px] sm:text-xs font-semibold text-white truncate drop-shadow-md'>\n {task.title}\n </span>\n )}\n\n {/* Progress percentage */}\n {showProgress && width > 80 && (\n <span className='text-[9px] text-white/80 ml-1 flex-shrink-0'>\n {Math.round(task.computedProgress)}%\n </span>\n )}\n\n {/* Duration/End display */}\n {displayText && width > 100 && (\n <span className='text-[9px] text-white/70 ml-auto flex-shrink-0'>{displayText}</span>\n )}\n </div>\n </div>\n\n {editing.available('start') &&\n (['start', 'end'] as const).map((edge) => (\n <button\n key={edge}\n type='button'\n {...editing.bind(edge)}\n disabled={editingDisabled}\n data-resize-edge={edge}\n aria-label={`${task.title}: resize ${edge} with Left/Right`}\n className='absolute z-30 cursor-ew-resize rounded bg-foreground/30 focus-visible:ring-2 focus-visible:ring-primary'\n style={{\n left: edge === 'start' ? displayLeft : displayLeft + displayWidth - 8,\n top: barTop,\n width: 8,\n height: barHeight,\n touchAction: 'none',\n }}\n onClick={(event) => event.stopPropagation()}\n />\n ))}\n\n {progressConfig?.editableProgress && onProgressChange && (\n <input\n type='range'\n disabled={editingDisabled}\n min={0}\n max={100}\n step={1}\n value={boundedProgress(task.computedProgress)}\n aria-label={`${task.title}: progress`}\n aria-valuetext={`${Math.round(boundedProgress(task.computedProgress))}%`}\n className='absolute z-20 accent-primary'\n style={{ left, width: Math.max(width, 40), top: rowHeight - 14, height: 12 }}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n onChange={(event) => onProgressChange(task.id, Number(event.currentTarget.value))}\n />\n )}\n\n {/* External title (if bar too narrow) */}\n {width <= 50 && (\n <div\n className='absolute flex items-center text-xs text-foreground/70 whitespace-nowrap pl-2 pointer-events-none'\n style={{\n left: left + width,\n top: barTop,\n height: barHeight,\n }}\n >\n {task.title}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -41,8 +41,9 @@ function s({ task: s, left: c, width: l, rowHeight: u, taskBarDisplay: d = "none
41
41
  title: C === void 0 ? void 0 : `${s.title}: total float ${C} working days (dependencies only)`,
42
42
  role: g || w.available("move") ? "button" : void 0,
43
43
  tabIndex: g || w.available("move") ? 0 : void 0,
44
+ "aria-label": l <= 50 ? s.title : void 0,
44
45
  "aria-disabled": x || void 0,
45
- "aria-label": w.allowed("move") ? `${s.title}: move with Left/Right, Enter to edit, Escape to cancel drag` : s.title,
46
+ "aria-description": w.allowed("move") ? "Move with Left/Right, Enter to edit, Escape to cancel drag" : void 0,
46
47
  onKeyDown: (e) => {
47
48
  T.onKeyDown(e), e.target === e.currentTarget && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), e.stopPropagation(), g?.(s));
48
49
  },
@@ -1 +1 @@
1
- {"version":3,"file":"GanttTaskBar.js","names":["GanttTaskBar","editing","useGanttDateEditing","task","cellWidth","dateEditing","onDateChange","editingDisabled","move","displayLeft","left","displayWidth","width","statusColors","statusColor","isLate","showProgress","progressConfig","showBaseline","baselineConfig","baselineLeft","baselineWidth","displayText","taskBarDisplay","durationText","differenceInDays","endText","format","barHeight","rowHeight","cn","critical","totalFloatDays","onClick","event","edge","onProgressChange","boundedProgress"],"sources":["../../../../../src/tools/components/gantt/components/GanttTaskBar.tsx"],"sourcesContent":["/**\n * Gantt Task Bar Component\n *\n * Renders an individual task bar with progress, status color, and interactions.\n */\n\nimport { cn } from \"../../../lib/utils\";\nimport type {\n ComputedTask,\n GanttProgressConfig,\n GanttBaselineConfig,\n TaskBarDisplay,\n GanttDateEditingConfig,\n} from '../types';\nimport { differenceInDays, format } from 'date-fns';\nimport { boundedProgress } from '../hooks/gantt-hierarchy';\nimport { useGanttDateEditing } from '../hooks/use-gantt-date-editing';\n\nexport interface GanttTaskBarProps {\n task: ComputedTask;\n left: number;\n width: number;\n rowHeight: number;\n taskBarDisplay?: TaskBarDisplay;\n progressConfig?: GanttProgressConfig;\n baselineConfig?: GanttBaselineConfig;\n baselineLeft?: number;\n baselineWidth?: number;\n onClick?: (task: ComputedTask) => void;\n onProgressChange?: (taskId: string, progress: number) => void;\n /** Opt-in pointer/keyboard date editing. */\n dateEditing?: GanttDateEditingConfig;\n /** Pixels per calendar day; required for pointer date editing. */\n cellWidth?: number;\n /** Committed date edit, excluding pointer previews. */\n onDateChange?: (taskId: string, start: Date, end: Date) => void;\n /** Temporarily disable controls during persistence without unmounting them. */\n editingDisabled?: boolean;\n /** Dependency-only critical-path emphasis. */\n critical?: boolean;\n /** Total float in working days, displayed in the tooltip. */\n totalFloatDays?: number;\n}\n\n/**\n * 個々のタスクの期間、進捗率、ステータスに応じた色、基準計画(ベースライン)をタイムライン上にバーとして描画するコンポーネント。\n */\nexport function GanttTaskBar({\n task,\n left,\n width,\n rowHeight,\n taskBarDisplay = 'none',\n progressConfig,\n baselineConfig,\n baselineLeft,\n baselineWidth,\n onClick,\n onProgressChange,\n dateEditing,\n cellWidth = 0,\n onDateChange,\n editingDisabled = false,\n critical,\n totalFloatDays,\n}: GanttTaskBarProps) {\n const editing = useGanttDateEditing(task, cellWidth, dateEditing, onDateChange, editingDisabled);\n const move = editing.bind('move');\n const displayLeft = left + editing.leftDelta;\n const displayWidth = width + editing.widthDelta;\n // Status colors\n const statusColors: Record<string, string> = {\n done: 'bg-green-500 hover:bg-green-600',\n review: 'bg-primary hover:bg-primary/90',\n doing: 'bg-blue-500 hover:bg-blue-600',\n todo: 'bg-muted-foreground/70 hover:bg-muted-foreground',\n blocked: 'bg-red-500 hover:bg-red-600',\n };\n\n const statusColor = statusColors[task.status] || statusColors.todo;\n const isLate = task.due_date && new Date(task.due_date) < new Date() && task.status !== 'done';\n const showProgress = progressConfig?.showProgress && task.computedProgress > 0;\n const showBaseline =\n baselineConfig?.showBaseline && baselineLeft !== undefined && baselineWidth !== undefined;\n\n // Calculate display text\n const getDisplayText = (): string => {\n if (taskBarDisplay === 'none') return '';\n\n const duration = differenceInDays(task.computedEnd, task.computedStart);\n const durationText = `${duration}d`;\n const endText = format(task.computedEnd, 'M/d');\n\n switch (taskBarDisplay) {\n case 'duration':\n return durationText;\n case 'end-date':\n return endText;\n case 'both':\n return `${durationText} (${endText})`;\n default:\n return '';\n }\n };\n\n const displayText = getDisplayText();\n const barHeight = rowHeight - 16; // 8px padding top/bottom\n const barTop = 8;\n\n return (\n <div className='h-full relative group'>\n {/* Baseline bar (if enabled) */}\n {showBaseline && (\n <div\n className={cn(\n 'absolute rounded-sm opacity-40',\n baselineConfig.baselineColor || 'bg-muted-foreground',\n )}\n style={{\n left: baselineLeft,\n width: baselineWidth,\n height: barHeight - 8,\n top:\n baselineConfig?.baselinePosition === 'above'\n ? barTop - 4\n : baselineConfig?.baselinePosition === 'below'\n ? barTop + barHeight - 8\n : barTop + 4,\n }}\n />\n )}\n\n {/* Main task bar */}\n <div\n {...move}\n data-task-bar={task.id}\n data-critical={critical || undefined}\n title={\n totalFloatDays === undefined\n ? undefined\n : `${task.title}: total float ${totalFloatDays} working days (dependencies only)`\n }\n role={onClick || editing.available('move') ? 'button' : undefined}\n tabIndex={onClick || editing.available('move') ? 0 : undefined}\n aria-disabled={editingDisabled || undefined}\n aria-label={\n editing.allowed('move')\n ? `${task.title}: move with Left/Right, Enter to edit, Escape to cancel drag`\n : task.title\n }\n onKeyDown={(event) => {\n move.onKeyDown(event);\n if (\n event.target === event.currentTarget &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n event.stopPropagation();\n onClick?.(task);\n }\n }}\n className={cn(\n 'absolute rounded-md shadow-sm cursor-pointer transition-all border border-white/20 select-none flex items-center overflow-hidden',\n statusColor,\n isLate && 'ring-2 ring-destructive ring-offset-1',\n critical && 'outline outline-2 outline-offset-2 outline-fuchsia-600',\n )}\n style={{\n left: displayLeft,\n width: displayWidth,\n touchAction: editing.allowed('move') ? 'none' : undefined,\n height: barHeight,\n top: barTop,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (editing.consumeClick()) return;\n onClick?.(task);\n }}\n >\n {/* Progress fill */}\n {showProgress && (\n <div\n className={cn(\n 'absolute inset-0 opacity-30',\n progressConfig.progressColor || 'bg-white',\n )}\n style={{\n width: `${task.computedProgress}%`,\n borderRadius: 'inherit',\n }}\n />\n )}\n\n {/* Content */}\n <div className='relative z-10 flex items-center justify-between w-full px-2'>\n {/* Title (only if wide enough) */}\n {width > 50 && (\n <span className='text-[10px] sm:text-xs font-semibold text-white truncate drop-shadow-md'>\n {task.title}\n </span>\n )}\n\n {/* Progress percentage */}\n {showProgress && width > 80 && (\n <span className='text-[9px] text-white/80 ml-1 flex-shrink-0'>\n {Math.round(task.computedProgress)}%\n </span>\n )}\n\n {/* Duration/End display */}\n {displayText && width > 100 && (\n <span className='text-[9px] text-white/70 ml-auto flex-shrink-0'>{displayText}</span>\n )}\n </div>\n </div>\n\n {editing.available('start') &&\n (['start', 'end'] as const).map((edge) => (\n <button\n key={edge}\n type='button'\n {...editing.bind(edge)}\n disabled={editingDisabled}\n data-resize-edge={edge}\n aria-label={`${task.title}: resize ${edge} with Left/Right`}\n className='absolute z-30 cursor-ew-resize rounded bg-foreground/30 focus-visible:ring-2 focus-visible:ring-primary'\n style={{\n left: edge === 'start' ? displayLeft : displayLeft + displayWidth - 8,\n top: barTop,\n width: 8,\n height: barHeight,\n touchAction: 'none',\n }}\n onClick={(event) => event.stopPropagation()}\n />\n ))}\n\n {progressConfig?.editableProgress && onProgressChange && (\n <input\n type='range'\n disabled={editingDisabled}\n min={0}\n max={100}\n step={1}\n value={boundedProgress(task.computedProgress)}\n aria-label={`${task.title}: progress`}\n aria-valuetext={`${Math.round(boundedProgress(task.computedProgress))}%`}\n className='absolute z-20 accent-primary'\n style={{ left, width: Math.max(width, 40), top: rowHeight - 14, height: 12 }}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n onChange={(event) => onProgressChange(task.id, Number(event.currentTarget.value))}\n />\n )}\n\n {/* External title (if bar too narrow) */}\n {width <= 50 && (\n <div\n className='absolute flex items-center text-xs text-foreground/70 whitespace-nowrap pl-2 pointer-events-none'\n style={{\n left: left + width,\n top: barTop,\n height: barHeight,\n }}\n >\n {task.title}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"GanttTaskBar.js","names":["GanttTaskBar","editing","useGanttDateEditing","task","cellWidth","dateEditing","onDateChange","editingDisabled","move","displayLeft","left","displayWidth","width","statusColors","statusColor","isLate","showProgress","progressConfig","showBaseline","baselineConfig","baselineLeft","baselineWidth","displayText","taskBarDisplay","durationText","differenceInDays","endText","format","barHeight","rowHeight","cn","critical","totalFloatDays","onClick","event","edge","onProgressChange","boundedProgress"],"sources":["../../../../../src/tools/components/gantt/components/GanttTaskBar.tsx"],"sourcesContent":["/**\n * Gantt Task Bar Component\n *\n * Renders an individual task bar with progress, status color, and interactions.\n */\n\nimport { cn } from \"../../../lib/utils\";\nimport type {\n ComputedTask,\n GanttProgressConfig,\n GanttBaselineConfig,\n TaskBarDisplay,\n GanttDateEditingConfig,\n} from '../types';\nimport { differenceInDays, format } from 'date-fns';\nimport { boundedProgress } from '../hooks/gantt-hierarchy';\nimport { useGanttDateEditing } from '../hooks/use-gantt-date-editing';\n\nexport interface GanttTaskBarProps {\n task: ComputedTask;\n left: number;\n width: number;\n rowHeight: number;\n taskBarDisplay?: TaskBarDisplay;\n progressConfig?: GanttProgressConfig;\n baselineConfig?: GanttBaselineConfig;\n baselineLeft?: number;\n baselineWidth?: number;\n onClick?: (task: ComputedTask) => void;\n onProgressChange?: (taskId: string, progress: number) => void;\n /** Opt-in pointer/keyboard date editing. */\n dateEditing?: GanttDateEditingConfig;\n /** Pixels per calendar day; required for pointer date editing. */\n cellWidth?: number;\n /** Committed date edit, excluding pointer previews. */\n onDateChange?: (taskId: string, start: Date, end: Date) => void;\n /** Temporarily disable controls during persistence without unmounting them. */\n editingDisabled?: boolean;\n /** Dependency-only critical-path emphasis. */\n critical?: boolean;\n /** Total float in working days, displayed in the tooltip. */\n totalFloatDays?: number;\n}\n\n/**\n * 個々のタスクの期間、進捗率、ステータスに応じた色、基準計画(ベースライン)をタイムライン上にバーとして描画するコンポーネント。\n */\nexport function GanttTaskBar({\n task,\n left,\n width,\n rowHeight,\n taskBarDisplay = 'none',\n progressConfig,\n baselineConfig,\n baselineLeft,\n baselineWidth,\n onClick,\n onProgressChange,\n dateEditing,\n cellWidth = 0,\n onDateChange,\n editingDisabled = false,\n critical,\n totalFloatDays,\n}: GanttTaskBarProps) {\n const editing = useGanttDateEditing(task, cellWidth, dateEditing, onDateChange, editingDisabled);\n const move = editing.bind('move');\n const displayLeft = left + editing.leftDelta;\n const displayWidth = width + editing.widthDelta;\n // Status colors\n const statusColors: Record<string, string> = {\n done: 'bg-green-500 hover:bg-green-600',\n review: 'bg-primary hover:bg-primary/90',\n doing: 'bg-blue-500 hover:bg-blue-600',\n todo: 'bg-muted-foreground/70 hover:bg-muted-foreground',\n blocked: 'bg-red-500 hover:bg-red-600',\n };\n\n const statusColor = statusColors[task.status] || statusColors.todo;\n const isLate = task.due_date && new Date(task.due_date) < new Date() && task.status !== 'done';\n const showProgress = progressConfig?.showProgress && task.computedProgress > 0;\n const showBaseline =\n baselineConfig?.showBaseline && baselineLeft !== undefined && baselineWidth !== undefined;\n\n // Calculate display text\n const getDisplayText = (): string => {\n if (taskBarDisplay === 'none') return '';\n\n const duration = differenceInDays(task.computedEnd, task.computedStart);\n const durationText = `${duration}d`;\n const endText = format(task.computedEnd, 'M/d');\n\n switch (taskBarDisplay) {\n case 'duration':\n return durationText;\n case 'end-date':\n return endText;\n case 'both':\n return `${durationText} (${endText})`;\n default:\n return '';\n }\n };\n\n const displayText = getDisplayText();\n const barHeight = rowHeight - 16; // 8px padding top/bottom\n const barTop = 8;\n\n return (\n <div className='h-full relative group'>\n {/* Baseline bar (if enabled) */}\n {showBaseline && (\n <div\n className={cn(\n 'absolute rounded-sm opacity-40',\n baselineConfig.baselineColor || 'bg-muted-foreground',\n )}\n style={{\n left: baselineLeft,\n width: baselineWidth,\n height: barHeight - 8,\n top:\n baselineConfig?.baselinePosition === 'above'\n ? barTop - 4\n : baselineConfig?.baselinePosition === 'below'\n ? barTop + barHeight - 8\n : barTop + 4,\n }}\n />\n )}\n\n {/* Main task bar */}\n <div\n {...move}\n data-task-bar={task.id}\n data-critical={critical || undefined}\n title={\n totalFloatDays === undefined\n ? undefined\n : `${task.title}: total float ${totalFloatDays} working days (dependencies only)`\n }\n role={onClick || editing.available('move') ? 'button' : undefined}\n tabIndex={onClick || editing.available('move') ? 0 : undefined}\n aria-label={width <= 50 ? task.title : undefined}\n aria-disabled={editingDisabled || undefined}\n aria-description={editing.allowed('move') ? 'Move with Left/Right, Enter to edit, Escape to cancel drag' : undefined}\n onKeyDown={(event) => {\n move.onKeyDown(event);\n if (\n event.target === event.currentTarget &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n event.preventDefault();\n event.stopPropagation();\n onClick?.(task);\n }\n }}\n className={cn(\n 'absolute rounded-md shadow-sm cursor-pointer transition-all border border-white/20 select-none flex items-center overflow-hidden',\n statusColor,\n isLate && 'ring-2 ring-destructive ring-offset-1',\n critical && 'outline outline-2 outline-offset-2 outline-fuchsia-600',\n )}\n style={{\n left: displayLeft,\n width: displayWidth,\n touchAction: editing.allowed('move') ? 'none' : undefined,\n height: barHeight,\n top: barTop,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (editing.consumeClick()) return;\n onClick?.(task);\n }}\n >\n {/* Progress fill */}\n {showProgress && (\n <div\n className={cn(\n 'absolute inset-0 opacity-30',\n progressConfig.progressColor || 'bg-white',\n )}\n style={{\n width: `${task.computedProgress}%`,\n borderRadius: 'inherit',\n }}\n />\n )}\n\n {/* Content */}\n <div className='relative z-10 flex items-center justify-between w-full px-2'>\n {/* Title (only if wide enough) */}\n {width > 50 && (\n <span className='text-[10px] sm:text-xs font-semibold text-white truncate drop-shadow-md'>\n {task.title}\n </span>\n )}\n\n {/* Progress percentage */}\n {showProgress && width > 80 && (\n <span className='text-[9px] text-white/80 ml-1 flex-shrink-0'>\n {Math.round(task.computedProgress)}%\n </span>\n )}\n\n {/* Duration/End display */}\n {displayText && width > 100 && (\n <span className='text-[9px] text-white/70 ml-auto flex-shrink-0'>{displayText}</span>\n )}\n </div>\n </div>\n\n {editing.available('start') &&\n (['start', 'end'] as const).map((edge) => (\n <button\n key={edge}\n type='button'\n {...editing.bind(edge)}\n disabled={editingDisabled}\n data-resize-edge={edge}\n aria-label={`${task.title}: resize ${edge} with Left/Right`}\n className='absolute z-30 cursor-ew-resize rounded bg-foreground/30 focus-visible:ring-2 focus-visible:ring-primary'\n style={{\n left: edge === 'start' ? displayLeft : displayLeft + displayWidth - 8,\n top: barTop,\n width: 8,\n height: barHeight,\n touchAction: 'none',\n }}\n onClick={(event) => event.stopPropagation()}\n />\n ))}\n\n {progressConfig?.editableProgress && onProgressChange && (\n <input\n type='range'\n disabled={editingDisabled}\n min={0}\n max={100}\n step={1}\n value={boundedProgress(task.computedProgress)}\n aria-label={`${task.title}: progress`}\n aria-valuetext={`${Math.round(boundedProgress(task.computedProgress))}%`}\n className='absolute z-20 accent-primary'\n style={{ left, width: Math.max(width, 40), top: rowHeight - 14, height: 12 }}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n onChange={(event) => onProgressChange(task.id, Number(event.currentTarget.value))}\n />\n )}\n\n {/* External title (if bar too narrow) */}\n {width <= 50 && (\n <div\n className='absolute flex items-center text-xs text-foreground/70 whitespace-nowrap pl-2 pointer-events-none'\n style={{\n left: left + width,\n top: barTop,\n height: barHeight,\n }}\n >\n {task.title}\n </div>\n )}\n </div>\n );\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("../../../ui/components/ui/button-variants.cjs"),r=require("../../../ui/components/ui/button-components.cjs"),i=require("../../../ui/components/ui/avatar.cjs"),a=require("../../../ui/components/ui/dropdown-menu.cjs"),o=require("../../../ui/components/ui/sheet.cjs"),s=require("../../../ui/components/theme/theme-switcher.cjs"),c=require("../i18n/LanguageSwitcher.cjs"),l=require("../sidebar/sidebar.cjs");let u=require("react/jsx-runtime"),d=require("react");d=e.__toESM(d,1);let f=require("lucide-react");var p=({menuItems:e,isMenuLeft:i,showThemeToggle:a,showColorToggle:l,showSpaceToggle:p,showLanguageToggle:m})=>(0,u.jsxs)(o.Sheet,{children:[(0,u.jsxs)(o.SheetTrigger,{className:t.cn(n.buttonVariants({variant:`ghost`,size:`icon`}),`shrink-0`),children:[(0,u.jsx)(f.Menu,{className:`h-5 w-5`}),(0,u.jsx)(`span`,{className:`sr-only`,children:`Toggle menu`})]}),(0,u.jsxs)(o.SheetContent,{side:i?`left`:`right`,children:[(0,u.jsx)(o.SheetHeader,{children:(0,u.jsx)(o.SheetTitle,{children:`Menu`})}),(0,u.jsxs)(`div`,{className:`grid gap-4 py-4`,children:[e.map((e,i)=>(0,u.jsx)(d.Fragment,{children:e.href?(0,u.jsxs)(`a`,{href:e.href,className:t.cn(n.buttonVariants({variant:`ghost`}),`justify-start`),onClick:e.onClick,children:[e.icon&&(0,u.jsx)(`span`,{className:`mr-2`,children:e.icon}),e.label]}):(0,u.jsxs)(r.Button,{variant:`ghost`,className:`justify-start`,onClick:e.onClick,children:[e.icon&&(0,u.jsx)(`span`,{className:`mr-2`,children:e.icon}),e.label]})},i)),(a||l||p)&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`h-px bg-border my-2`}),(0,u.jsx)(`div`,{className:`px-2`,children:(0,u.jsx)(s.ThemeSwitcherGroup,{showThemeMode:a,showColorTheme:l,showSpacingTheme:p,modeVariant:`icon-group`,colorVariant:`icon-group`,spacingVariant:`icon-group`})})]}),m&&(0,u.jsx)(`div`,{className:`px-2`,children:(0,u.jsx)(c.LanguageSwitcher,{})})]})]})]});function m({className:e,logo:r,title:o,menuPosition:d=`right`,menuItems:f=[],navItems:m=[],user:h,userMenuItems:g=[],onLogout:_,showThemeToggle:v=!0,showColorToggle:y=!0,showSpaceToggle:b=!0,showLanguageToggle:x=!0,onLanguageChange:S,currentLanguage:C,actions:w,...T}){let E=d===`left`;return(0,u.jsx)(`header`,{className:t.cn(`sticky top-0 z-40 w-full border-b bg-primary text-primary-foreground shadow-sm`,e),...T,children:(0,u.jsxs)(`div`,{className:`flex h-16 items-center justify-between px-4 gap-4 overflow-hidden`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-4 min-w-0 flex-shrink-0 relative z-10 bg-primary pr-4`,children:[E&&f.length>0&&(0,u.jsx)(`div`,{className:`flex-shrink-0`,children:(0,u.jsx)(p,{menuItems:f,isMenuLeft:E,showThemeToggle:v,showColorToggle:y,showSpaceToggle:b,showLanguageToggle:x})}),r&&(0,u.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[r,o&&(0,u.jsx)(`span`,{className:`text-lg font-bold hidden md:inline-block truncate`,children:o})]}),!r&&o&&(0,u.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,u.jsx)(`span`,{className:`text-lg font-bold truncate`,children:o})}),(0,u.jsx)(`nav`,{className:`flex items-center gap-6 text-sm font-medium hidden md:flex`,children:m.map((e,n)=>(0,u.jsx)(`a`,{href:e.href,onClick:e.onClick,className:t.cn(`transition-colors hover:text-primary-foreground/80`,e.active?`text-primary-foreground font-bold underline underline-offset-4`:`text-primary-foreground/60`),children:e.label},n))})]}),(0,u.jsxs)(`div`,{className:`ml-auto flex items-center justify-end gap-2 min-w-0 flex-shrink`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-shrink overflow-hidden justify-end`,children:[b&&(0,u.jsx)(s.SpacingThemeSwitcher,{variant:`toggle`,withBackground:!0}),y&&(0,u.jsx)(s.ColorThemeSwitcher,{variant:`toggle`,withBackground:!0}),v&&(0,u.jsx)(s.ThemeModeSwitcher,{variant:`toggle`,withBackground:!0}),x&&(0,u.jsx)(c.LanguageSwitcher,{onLanguageChange:S,currentLanguage:C})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 flex-none relative z-20 bg-primary pl-2`,children:[h&&(0,u.jsxs)(a.DropdownMenu,{children:[(0,u.jsx)(a.DropdownMenuTrigger,{"aria-label":`ユーザーメニュー`,className:t.cn(n.buttonVariants({variant:`ghost`}),`relative h-8 w-8 rounded-full p-0 flex items-center justify-center`),children:(0,u.jsxs)(i.Avatar,{className:`h-8 w-8`,children:[(0,u.jsx)(i.AvatarImage,{src:h.image,alt:h.name}),(0,u.jsx)(i.AvatarFallback,{children:h.initials||h.name.slice(0,2).toUpperCase()})]})}),(0,u.jsx)(a.DropdownMenuContent,{className:`w-56`,align:`end`,children:(0,u.jsxs)(a.DropdownMenuGroup,{children:[(0,u.jsx)(a.DropdownMenuLabel,{className:`font-normal`,children:(0,u.jsxs)(`div`,{className:`flex flex-col space-y-1`,children:[(0,u.jsx)(`p`,{className:`text-sm font-medium leading-none`,children:h.name}),(0,u.jsx)(`p`,{className:`text-xs leading-none text-muted-foreground`,children:h.email})]})}),(0,u.jsx)(a.DropdownMenuSeparator,{}),g.map((e,t)=>(0,u.jsx)(a.DropdownMenuItem,{onClick:e.onClick,children:e.href?(0,u.jsx)(`a`,{href:e.href,className:`w-full h-full flex items-center`,children:e.label}):e.label},t)),_&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a.DropdownMenuSeparator,{}),(0,u.jsx)(a.DropdownMenuItem,{onClick:_,children:`Log out`})]})]})})]}),w,!E&&f.length>0&&(0,u.jsx)(p,{menuItems:f,isMenuLeft:E,showThemeToggle:v,showColorToggle:y,showSpaceToggle:b,showLanguageToggle:x}),(0,u.jsx)(l.SidebarTrigger,{className:`md:hidden`})]})]})]})})}exports.Header=m;
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-variants.cjs"),r=require("../../../ui/components/ui/button-components.cjs"),i=require("../../../ui/components/ui/avatar.cjs"),a=require("../../../ui/components/ui/dropdown-menu.cjs"),o=require("../../../ui/components/ui/sheet.cjs"),s=require("../../../ui/components/theme/theme-switcher.cjs"),c=require("../i18n/LanguageSwitcher.cjs"),l=require("../sidebar/sidebar.cjs");let u=require("react/jsx-runtime"),d=require("react");d=e.__toESM(d,1);let f=require("lucide-react");var p=({menuItems:e,isMenuLeft:i,showThemeToggle:a,showColorToggle:l,showSpaceToggle:p,showLanguageToggle:m})=>(0,u.jsxs)(o.Sheet,{children:[(0,u.jsxs)(o.SheetTrigger,{className:t.cn(n.buttonVariants({variant:`ghost`,size:`icon`}),`shrink-0`),children:[(0,u.jsx)(f.Menu,{className:`h-5 w-5`}),(0,u.jsx)(`span`,{className:`sr-only`,children:`Toggle menu`})]}),(0,u.jsxs)(o.SheetContent,{side:i?`left`:`right`,children:[(0,u.jsx)(o.SheetHeader,{children:(0,u.jsx)(o.SheetTitle,{children:`Menu`})}),(0,u.jsxs)(`div`,{className:`grid gap-4 py-4`,children:[e.map((e,i)=>(0,u.jsx)(d.Fragment,{children:e.href?(0,u.jsxs)(`a`,{href:e.href,className:t.cn(n.buttonVariants({variant:`ghost`}),`justify-start`),onClick:e.onClick,children:[e.icon&&(0,u.jsx)(`span`,{className:`mr-2`,children:e.icon}),e.label]}):(0,u.jsxs)(r.Button,{variant:`ghost`,className:`justify-start`,onClick:e.onClick,children:[e.icon&&(0,u.jsx)(`span`,{className:`mr-2`,children:e.icon}),e.label]})},i)),(a||l||p)&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`h-px bg-border my-2`}),(0,u.jsx)(`div`,{className:`px-2`,children:(0,u.jsx)(s.ThemeSwitcherGroup,{showThemeMode:a,showColorTheme:l,showSpacingTheme:p,modeVariant:`icon-group`,colorVariant:`icon-group`,spacingVariant:`icon-group`})})]}),m&&(0,u.jsx)(`div`,{className:`px-2`,children:(0,u.jsx)(c.LanguageSwitcher,{})})]})]})]});function m({className:e,logo:r,title:o,menuPosition:d=`right`,menuItems:f=[],navItems:m=[],user:h,userMenuItems:g=[],onLogout:_,showThemeToggle:v=!0,showColorToggle:y=!0,showSpaceToggle:b=!0,showLanguageToggle:x=!0,onLanguageChange:S,currentLanguage:C,actions:w,...T}){let E=d===`left`;return(0,u.jsx)(`header`,{className:t.cn(`sticky top-0 z-40 w-full border-b bg-primary text-primary-foreground shadow-sm`,e),...T,children:(0,u.jsxs)(`div`,{className:`flex h-16 items-center justify-between px-4 gap-4 overflow-hidden`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-4 min-w-0 flex-shrink-0 relative z-10 bg-primary pr-4`,children:[E&&f.length>0&&(0,u.jsx)(`div`,{className:`flex-shrink-0`,children:(0,u.jsx)(p,{menuItems:f,isMenuLeft:E,showThemeToggle:v,showColorToggle:y,showSpaceToggle:b,showLanguageToggle:x})}),r&&(0,u.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[r,o&&(0,u.jsx)(`span`,{className:`text-lg font-bold hidden md:inline-block truncate`,children:o})]}),!r&&o&&(0,u.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,u.jsx)(`span`,{className:`text-lg font-bold truncate`,children:o})}),(0,u.jsx)(`nav`,{className:`flex items-center gap-6 text-sm font-medium hidden md:flex`,children:m.map((e,n)=>(0,u.jsx)(`a`,{href:e.href,onClick:e.onClick,className:t.cn(`transition-colors hover:text-primary-foreground/80`,e.active?`text-primary-foreground font-bold underline underline-offset-4`:`text-primary-foreground/60`),children:e.label},n))})]}),(0,u.jsxs)(`div`,{className:`ml-auto flex items-center justify-end gap-2 min-w-0 flex-shrink`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-shrink overflow-hidden justify-end`,children:[b&&(0,u.jsx)(s.SpacingThemeSwitcher,{variant:`toggle`,withBackground:!0}),y&&(0,u.jsx)(s.ColorThemeSwitcher,{variant:`toggle`,withBackground:!0}),v&&(0,u.jsx)(s.ThemeModeSwitcher,{variant:`toggle`,withBackground:!0}),x&&(0,u.jsx)(c.LanguageSwitcher,{onLanguageChange:S,currentLanguage:C})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 flex-none relative z-20 bg-primary pl-2`,children:[h&&(0,u.jsxs)(a.DropdownMenu,{children:[(0,u.jsx)(a.DropdownMenuTrigger,{"aria-label":`${h.initials||h.name.slice(0,2).toUpperCase()} ${h.name} ユーザーメニュー`,className:t.cn(n.buttonVariants({variant:`ghost`}),`relative h-8 w-8 rounded-full p-0 flex items-center justify-center`),children:(0,u.jsxs)(i.Avatar,{className:`h-8 w-8`,children:[(0,u.jsx)(i.AvatarImage,{src:h.image,alt:h.name}),(0,u.jsx)(i.AvatarFallback,{children:h.initials||h.name.slice(0,2).toUpperCase()})]})}),(0,u.jsx)(a.DropdownMenuContent,{className:`w-56`,align:`end`,children:(0,u.jsxs)(a.DropdownMenuGroup,{children:[(0,u.jsx)(a.DropdownMenuLabel,{className:`font-normal`,children:(0,u.jsxs)(`div`,{className:`flex flex-col space-y-1`,children:[(0,u.jsx)(`p`,{className:`text-sm font-medium leading-none`,children:h.name}),(0,u.jsx)(`p`,{className:`text-xs leading-none text-muted-foreground`,children:h.email})]})}),(0,u.jsx)(a.DropdownMenuSeparator,{}),g.map((e,t)=>(0,u.jsx)(a.DropdownMenuItem,{onClick:e.onClick,children:e.href?(0,u.jsx)(`a`,{href:e.href,className:`w-full h-full flex items-center`,children:e.label}):e.label},t)),_&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a.DropdownMenuSeparator,{}),(0,u.jsx)(a.DropdownMenuItem,{onClick:_,children:`Log out`})]})]})})]}),w,!E&&f.length>0&&(0,u.jsx)(p,{menuItems:f,isMenuLeft:E,showThemeToggle:v,showColorToggle:y,showSpaceToggle:b,showLanguageToggle:x}),(0,u.jsx)(l.SidebarTrigger,{className:`md:hidden`})]})]})]})})}exports.Header=m;
2
2
  //# sourceMappingURL=header.cjs.map